<?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>Thu, 29 Jul 2010 22:54:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Cambiar separador de routing en Symfony</title>
		<link>http://www.berriart.com/2010/07/30/cambiar-separador-de-routing-en-symfony/</link>
		<comments>http://www.berriart.com/2010/07/30/cambiar-separador-de-routing-en-symfony/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 22:54:37 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[routing yaml framework]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=588</guid>
		<description><![CDATA[En alguna ocasión me he encontrado con que quería cambiar lo que Symfony entiende por un separador en la URL y nunca me acuerdo dónde se hace, así que lo escribo aquí por si a vosotros os ha pasado también alguna vez o no lo sabíais, y así la próxima vez también sé yo donde [...]]]></description>
			<content:encoded><![CDATA[<p>En alguna ocasión me he encontrado con que quería cambiar lo que <a href="http://www.berriart.com/category/symfony/">Symfony</a> entiende por un separador en la URL y nunca me acuerdo dónde se hace, así que lo escribo aquí por si a vosotros os ha pasado también alguna vez o no lo sabíais, y así la próxima vez también sé yo donde mirar. Explico lo que me pasaba con un ejemplo real de hace unos minutos mientras migraba <a href="http://efemerides20.com/">Efemerides 2.0</a>, proyecto al que me gustaría hacer unos cambios y ya de paso he pensado que no estaría mal pasarlo primero al framework Symfony.</p>
<p>Resulta que el proyecto tiene URLs como esta: <em>http://efemerides20.com/4-de-diciembre</em>. Dónde realmente estoy pasando dos variables por la URL: el 4 indicando el día, y &#8216;diciembre&#8217; indicando el mes. Así que en el archivo routing.yml de Symfony he creado la ruta así:</p>
<pre>day:
  url:   /:day-de-:month
  param: { module: efemeride, action: day }
  requirements: { month: \w+, day: \d+ }</pre>
<p>Cuando he accedido, me ha saltado error 404 diciéndome que no había niguna ruta que coincidiera con esa URL. EL problema es que por defecto Symfony no entiende los guiones como separadores en la URL, y solo interpreta como tales el punto &#8216;.&#8217; y la barra &#8216;/&#8217;. Si queremos cambiar esto y que la ruta definida funcione correctamente tenemos que añadir el punto a lo que Symfony entiende como separadores de segmentos en la URL. Para ello hay que modificar el fichero <em>factories.yml</em> de la aplicación en cuestión (en este caso frontend).</p>
<p>En ese fichero (<em>apps/modules/frontend/config/factories.yml</em>) hay un pequeño apartado dedicado al enrutamiento que seguramente y si no lo habéis cambiado pondrá lo siguiente:</p>
<pre>  routing:
    class: sfPatternRouting
    param:
      generate_shortest_url:            true
      extra_parameters_as_query_string: true</pre>
<p>Pues para hacer que nuestra ruta funcione solo hay que añadir un nuevo parámetro a esa configuración de la siguiente manera en mi caso:</p>
<pre>  routing:
    class: sfPatternRouting
    param:
      generate_shortest_url:            true
      extra_parameters_as_query_string: true
      <strong>segment_separators: ['/', '.', '-']</strong></pre>
<p>Es decir, añadir en el parámetro <em>segment_separators</em> todos los caracteres que querráis permitir como separadores.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2010/07/30/cambiar-separador-de-routing-en-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalar Trac en Ubuntu</title>
		<link>http://www.berriart.com/2010/07/24/instalar-trac-ubuntu/</link>
		<comments>http://www.berriart.com/2010/07/24/instalar-trac-ubuntu/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 12:15:50 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[trac]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=582</guid>
		<description><![CDATA[Trac es un wiki mejorado y un sistema de &#8216;tickets&#8217; para la gestión de proyectos de software basado en web. Creo que es una de las mejores maneras de mantener un proyecto de software libre, aunque es perfectamente útil para un proyecto &#8216;privado&#8217;. Se integra perfectamente con el sistema de control de versiones Subversion, y [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://trac.edgewall.org/">Trac</a> es un wiki mejorado y un sistema de &#8216;tickets&#8217; para la gestión de proyectos de software basado en web. Creo que es una de las mejores maneras de mantener un proyecto de software libre, aunque es perfectamente útil para un proyecto &#8216;privado&#8217;. Se integra perfectamente con el sistema de control de versiones <a href="http://subversion.tigris.org/">Subversion</a>, y es una manera de tener centralizada toda la documentación de un proyecto teniendo incluso la posibilidad de poder relacionar incidencias con sus respectivos arreglos en el código. Si no lo conoces y quieres ver un ejemplo, puedes acceder al <a href="http://trac.symfony-project.org/">Trac de Symfony</a>, ya que los desarrolladores de este Framework utilizan esta herramienta.</p>
<p>Si tienes un servidor Ubuntu con Apache y quieres instalarlo a continuación te describo los pasos que he seguido yo para hacerlo (recuerda que si no estás como usuario &#8216;root&#8217; tendrás que hacer <em>sudo</em>):</p>
<p>Instalar suvbersion:<br />
<code>apt-get install subversion libapache2-svn</code></p>
<p>Instalar Trac y el módulo de Python para Apache:<br />
<code>apt-get install libapache2-mod-python libapache2-mod-python-doc trac </code></p>
<p>Crear la carpeta que hará de &#8216;Document Root&#8217; para poder acceder al trac via web, por ejemplo:<br />
<code>mkdir /var/www/trac</code></p>
<p>Si lo quieres proteger, como es mi caso, crea un fichero .htpasswd:<br />
<code>htpasswd -c /var/www/trac/.htpasswd admin</code></p>
<p>Preparar el Virtual Host:<br />
<code>vi /etc/apache2/sites-available/trac</code></p>
<p>Y escribir:</p>
<pre>&lt;VirtualHost *&gt;
ServerAdmin mymail@domain.com
ServerName trac.domain.com

&lt;Location /projects&gt; #set up Trac handling
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /var/www/trac
PythonOption TracUriRoot /projects

#authentication scheme
AuthType Basic
AuthName "My Tracker"
AuthUserFile /var/www/trac/.htpasswd
Require valid-user

&lt;/Location&gt;

ErrorLog /var/log/apache2/trac_error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/trac_access.log combined

&lt;/VirtualHost&gt;</pre>
<p>Vamos a crear un repositorio SVN para el código:<br />
<code>mkdir /var/lib/svn<br />
mkdir /var/lib/svn/myproject<br />
svnadmin create /var/lib/svn/myproject</code></p>
<p>Yo lo he preparado para poder tener diferentes <em>tracs</em>, así que estos pasos se pueden repetir:<br />
<code>mkdir /var/www/trac/myproject<br />
trac-admin /var/www/trac/myproject initenv<br />
sudo chown -R www-data:www-data /var/www/trac/myproject</code></p>
<p>Finalmente reiniciamos Apache:<br />
<code>/etc/init.d/apache2 restart</code></p>
<p>Y ya podríamos acceder a nuestro trac en este ejemplo en: http://trac.domain.com/projects</p>
<p>Espero que os sirva de ayuda.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2010/07/24/instalar-trac-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Añadir javascripts al final del código con Symfony</title>
		<link>http://www.berriart.com/2010/07/13/anadir-javascript-final-symfony/</link>
		<comments>http://www.berriart.com/2010/07/13/anadir-javascript-final-symfony/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 08:45:19 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[carga]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[mejora]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rapidez]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=546</guid>
		<description><![CDATA[Uno de los consejos que se suelen dar para mejorar el tiempo de carga de una web es añadir el Javascript al final de un documento web, justo antes de la etiqueta &#60;/body&#62;. Últimamente trabajo bastante con Symfony y por defecto los Javascript que se incluyen en los ficheros view.yml se cargan en la cabecera [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los consejos que se suelen dar para <a href="http://www.berriart.com/2010/07/08/mejora-el-tiempo-de-carga-de-tu-web-ii/">mejorar el tiempo de carga de una web</a> es añadir el Javascript al final de un documento web, justo antes de la etiqueta <em>&lt;/body&gt;</em>. Últimamente trabajo bastante con <a href="http://www.berriart.com/category/symfony/">Symfony</a> y por defecto los Javascript que se incluyen en los ficheros view.yml se cargan en la cabecera del documento (justo antes de la etiqueta  <em>&lt;/head&gt;</em>). Por eso generalmente hago algunas modificaciones para cambiar esto y ponerlos al final.</p>
<p>Esa inclusión se realiza en el filtro <a href="http://trac.symfony-project.org/browser/branches/1.4/lib/filter/sfCommonFilter.class.php">sfCommonFilter</a>, por lo tanto lo primero es crear un filtro que sustituirá a ese y que colocará los javascripts donde nosotros queremos, al final. Lo incluiremos en la carpeta <em>libs/filters</em> y en este caso se llamara <em>myProjectCommonFilter</em>:</p>
<pre name="code" class="php">
&lt;?php
/**
* myProjectCommonFilter Helper
*
* myProjectCommonFilter automatically adds javascripts to the bottom of the page and stylesheets to the top in the sfResponse content.
* This class is based in the sfCommonFilter helper of the symfony package.
*
* @package    symfony
* @subpackage filter
* @author     Alberto Varela &lt;alberto@berriart.com&gt;
* @version    2010-07-07
*/
class myProjectCommonFilter extends sfFilter
{
  /**
  * Executes this filter.
  *
  * @param sfFilterChain $filterChain A sfFilterChain instance
  */
  public function execute($filterChain)
  {
    // execute next filter
    $filterChain-&gt;execute();

    // execute this filter only once
    $response = $this-&gt;context-&gt;getResponse();

    // include stylesheets
    $content = $response-&gt;getContent();
    if (false !== ($pos = strpos($content, '&lt;/head&gt;')))
    {
      $this-&gt;context-&gt;getConfiguration()-&gt;loadHelpers(array('Tag', 'Asset'));

      if (!sfConfig::get('symfony.asset.stylesheets_included', false))
      {
        $html .= get_stylesheets($response);
      }

      if ($html)
      {
        $response-&gt;setContent(substr($content, 0, $pos).$html.substr($content, $pos));
      }
    }

    // include javascripts
    $content = $response-&gt;getContent();
    if (false !== ($pos = strpos($content, '&lt;/body&gt;')))
    {
      $this-&gt;context-&gt;getConfiguration()-&gt;loadHelpers(array('Tag', 'Asset'));
      $html = '';
      if (!sfConfig::get('symfony.asset.javascripts_included', false))
      {
        $html .= get_javascripts($response);
      }

      if ($html)
      {
        $response-&gt;setContent(substr($content, 0, $pos).$html.substr($content, $pos));
      }
    }

    sfConfig::set('symfony.asset.javascripts_included', false);
    sfConfig::set('symfony.asset.stylesheets_included', false);
  }
}
</pre>
<p>Ahora solo tenemos que decirle a Symfony que queremos utilizar este nuevo filtro en vez del sfCommonFilter y para eso tenemos que modificar el fichero <em>config/filters.yml</em> de nuestra aplicación y cambiar el filtro <em>common</em>:</p>
<pre>common:
  class: myProjectCommonFilter</pre>
<p>En un principio eso es todo, pero debéis tener cuidado si también escribís código Javascript directamente en la página sin usar ficheros externos. Tened en cuenta que siempre que ese código &#8216;inline&#8217; necesite utilizar alguna de las librerías externas deberá estar escrito por debajo de las llamadas a éstas y por lo tanto tendréis que modificar el filtro que os he puesto más arriba.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2010/07/13/anadir-javascript-final-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10 Addons de Firefox para un desarrollador web</title>
		<link>http://www.berriart.com/2010/07/10/addons-firefox-desarrollador-web/</link>
		<comments>http://www.berriart.com/2010/07/10/addons-firefox-desarrollador-web/#comments</comments>
		<pubDate>Sat, 10 Jul 2010 10:56:03 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[addons]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[gadget]]></category>
		<category><![CDATA[navegador]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=518</guid>
		<description><![CDATA[Os voy a recomendar 10 plugins para Firefox que utilizo como desarrollador web. La verdad es que es increible lo que estas herramientas que se pueden agregar al navegador pueden ofrecernos. Por supuesto, si vosotros utilizáis otras o tenéis alguna buena recomendación solo tenéis que decirlo dejando un comentario. Firebug: Para mi es hoy en [...]]]></description>
			<content:encoded><![CDATA[<p>Os voy a recomendar 10 <em>plugins</em> para Firefox que utilizo como desarrollador web. La verdad es que es increible lo que estas herramientas que se pueden agregar al navegador pueden ofrecernos. Por supuesto, si vosotros utilizáis otras o tenéis alguna buena recomendación solo tenéis que decirlo dejando un comentario.</p>
<ul>
<li><a href="https://addons.mozilla.org/es-ES/firefox/addon/1843">Firebug</a>: Para mi es hoy en día una herramienta indispensable que me ayuda a depurar mi código Javascript  y a solicionar problemas con el CSS entre otras cosas.</li>
<li><a href="https://addons.mozilla.org/es-ES/firefox/addon/5369">YSlow</a> y <a href="http://code.google.com/speed/page-speed/">Google Page Speed</a> son dos Addons que necesitan del Firebug para funcionar y que te ayudarán a <a href="http://www.berriart.com/2010/07/08/mejora-el-tiempo-de-carga-de-tu-web-ii/">mejorar la velocidad de carga de tu web</a>.</li>
<li><a href="https://addons.mozilla.org/es-ES/firefox/addon/60">Web Developer</a>: Una barra de herramientas que tiene multiples utilidades. Desde una regla para medir píxeles sobre el navegador hasta validadores o la posibilidad de desactivar el Javascript o las hojas de estilo.</li>
<li><a href="https://addons.mozilla.org/es-ES/firefox/addon/321">Search Status</a>: Herramienta que ofrece información <a href="http://www.berriart.com/category/seo/">SEO</a> sobre tu web y que prácticamente la uso para poder ver de forma clara los enlaces con &#8216;nofollow&#8217;.</li>
<li><a href="https://addons.mozilla.org/es-ES/firefox/addon/271">ColorZilla</a>: Es solo un <em>color picker</em>, un cuenta gotas para poder conocer el valor en código CSS de cualquier color que estés viendo en una web.</li>
<li><a href="https://addons.mozilla.org/es-ES/firefox/addon/1146">Screengrab</a>: Es una herramienta para hacer capturas de páginas web, ya sean completas o selecciones. Muy útil para hacer documentación o reportar bugs.</li>
<li><a href="https://addons.mozilla.org/es-ES/firefox/addon/2064">Dummy Lipsum</a>: El nombre lo dice todo, simplemente un generador de &#8216;Lorem Ipsum&#8217; para cuando necesitemos unos textos de prueba.</li>
<li><a href="https://addons.mozilla.org/es-ES/firefox/addon/6455">IE NetRenderer</a>: Una manera sencilla de poder ver lo que estamos haciendo en diferentes versiones del <em>Fucking Internet Explorer</em>. Sí, ya sé que hay más maneras de hacer eso incluso usando linux, pero ésta es rápida y en algunos casos no necesito más.</li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/57795/">HostAdmin</a>: Creo que ha sido mi último descubrimiento y ahora no paro de usarlo. Me sirve para cambiar mi fichero /etc/hosts dónde fuerzo los dominios desde el propio Firefox, útil para cambiar entre <em>dev</em>, <em>testing</em> y producción.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2010/07/10/addons-firefox-desarrollador-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mejora el tiempo de carga de tu web (II)</title>
		<link>http://www.berriart.com/2010/07/08/mejora-el-tiempo-de-carga-de-tu-web-ii/</link>
		<comments>http://www.berriart.com/2010/07/08/mejora-el-tiempo-de-carga-de-tu-web-ii/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 23:28:31 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[carga]]></category>
		<category><![CDATA[herramientas]]></category>
		<category><![CDATA[Page Speed]]></category>
		<category><![CDATA[velocidad]]></category>
		<category><![CDATA[YSLOW]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=550</guid>
		<description><![CDATA[El tiempo de carga es un factor muy importante para diferentes aspectos de una web. Por ejemplo, desde un punto de vista SEO está confirmado que es un algo que hay que tener en cuenta, también es importante ser rápidos para una mejor experiencia del usuario y hasta para la carga de tu servidor. Por [...]]]></description>
			<content:encoded><![CDATA[<p>El tiempo de carga es un factor muy importante para diferentes aspectos de una web. Por ejemplo, desde un punto de vista <a href="http://www.berriart.com/category/seo/">SEO</a> <a href="http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html">está confirmado</a> que es un algo que hay que tener en cuenta, también es importante ser rápidos para una mejor experiencia del usuario y hasta para la carga de tu servidor. Por eso es necesario revisar de vez en cuando como mejorar esa carga, y aunque el problema puede estar dentro de las tripas de tu software, es posible que además estés obviando algunos sencillos pasos que pueden ahorrarte varios segundos y hay utilidades que te pueden ayudar a descubrirlos.</p>
<p>Una de las mejores y más conocidas herramientas para diagnosticar problemas y encontrar soluciones al excesivo tiempo de carga de una web es <a href="http://developer.yahoo.com/yslow/">YSLOW</a>. Se trata de una herramienta adicional que se añade al <a href="https://addons.mozilla.org/es-ES/firefox/addon/1843/">Firebug</a> de Firefox (creada por Yahoo) y que te advierte sobre incumplimientos de sus &#8216;<a href="http://developer.yahoo.com/performance/rules.html">Buenas prácticas para acelerar la carga de una web</a>&#8216;. Google enseguida recomendó utilizar esa herramienta a los webmasters, pero como tampoco quería ser menos y aunque también <a href="http://www.google.com/support/webmasters/bin/answer.py?hl=es&#038;answer=35769">sigue recomendando YSLOW</a>, decidió que tenían que hacer la suya propia (<a href="http://code.google.com/intl/es-ES/speed/page-speed/">Page Speed</a>) y redactar sus propias <a href="http://code.google.com/intl/es-ES/speed/page-speed/docs/rules_intro.html">prácticas recomendadas</a>.</p>
<p>Así que ahora tenemos dos buenas herramientas y dos buenas guías (coinciden en muchos puntos) a utilizar para mejorar la carga de nuestra web. Aquí os pongo algunos de esos consejos que creo que son bastante fáciles de aplicar, pero lo mejor es que leáis las guías con detenimiento:</p>
<ul>
<li>Hacer las menos peticiones HTTP posibles. Para ellos se puede por ejemplo unificar diferentes javascripts u hojas de estilo en una sola, o también <a href="http://alistapart.com/articles/sprites">unificar las imágenes utilizadas en el CSS</a> en una y mostrar la que necesites utilizando la propiedad &#8216;background&#8217;.</li>
<li>Minimizar los Javascript y CSS. Si utilizas alguna librería externa seguro que tiene su versión minimizada, y si no lo puedes hacer tu mismo usando herramientas como <a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a> (también de Yahoo por cierto)</li>
<li><a href="http://www.berriart.com/2008/05/13/mejora-tiempo-carga-web/">Añadir una cabecera de control de caché desde tu .htaccess</a>, para que los navegadores de los usuarios nos echen una mano.</li>
<li>Comprimir con Gzip. Algunos navegadores aceptan el contenido comprimido y los que usamos Apache2 solo tenemos que habilitar el módulo &#8216;deflate&#8217; y añadir lo siguiente a nuestro .htaccess para conseguirlo.
<pre># Hacer GZIP de los JS CSS textos
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/x-javascript</pre>
</li>
<li>Poner todo el CSS lo más comprimido posible y a poder ser en un solo fichero en la parte superior de la página, en el <em>head</em>. En cambio el Javascript es mejor ponerlo en el fondo, justo antes de cerrar la etiqueta &lt;/body&gt;</li>
<li>Reducir el número de <em>DNS Lookups</em>. Es decir, el número de dominios que se tienen que resolver al cargar una página. Aunque a veces cuando hay por ejemplo muchas imágenes se recomienda que se carguen desde diferentes dominios para poder descargarlas en paralelo.</li>
<li>Usar dominios libres de cookies, y servidores ligeros y a ser posible <a href="http://en.wikipedia.org/wiki/Content_delivery_network"><acronym title="Content delivery network">CDN</acronym>s</a> para servir el contenido estático.</li>
<li>&#8230;</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2010/07/08/mejora-el-tiempo-de-carga-de-tu-web-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Revisión de &#8216;Meet Your Commenters&#8217;</title>
		<link>http://www.berriart.com/2010/06/28/revision-de-meet-your-commenters/</link>
		<comments>http://www.berriart.com/2010/06/28/revision-de-meet-your-commenters/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 17:06:25 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[comentarios]]></category>
		<category><![CDATA[dashboard]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=542</guid>
		<description><![CDATA[Una de las tareas que me propuesto después de reabrir el blog es recuperar y actualizar esos proyectillos que tengo abiertos por ahí. Por ejemplo, y como en este caso, los plugins de wordpress que he hecho. Como primer candidato me ha parecido una buena opción el plugin hecho por mí que mejor valoración y [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las tareas que me propuesto después de reabrir el blog es recuperar y actualizar esos proyectillos que tengo abiertos por ahí. Por ejemplo, y como en este caso, los <a href="http://www.berriart.com/recursos/">plugins de wordpress</a> que he hecho. Como primer candidato me ha parecido una buena opción el plugin hecho por mí que mejor valoración y más descargas tiene: <a href="http://www.berriart.com/meet-your-commenters/">Meet Your Commenters</a>.</p>
<p>Para los que no conozcan, este plugin de wordpress muestra en el <em>dashboard</em> los perfiles en redes sociales de la gente que comenta en  tu blog, y también muestra sus blogs o webs; para lograrlo hace uso de la Social Graph API de Google. Creo que el plugin es una buena manera de poder acercarte más a tus lectores y la verdad es que todavía me siguen llegando <em>trackbacks</em> de gente que lo recomienda como uno de los mejores plugins sociales para WordPress.</p>
<p>Los cambios que he realizado:</p>
<ul>
<li>Comprobar compatibilidad con WP 3.0</li>
<li>Cambiar licencia de GPL a GPL2</li>
<li>Empezar a usar la clase SimplePie_File del core de WordPress para acceder a la API y así evitar las limitaciones de acceso a webs externas de ciertos hostings</li>
<li>Permitir internacionalización y añadir castellano como idioma adicional</li>
<li>Eliminar algunos <em>warnings</em></li>
<li>Arreglarlo para permitir la instalación automática desde el administrador de WP por FTP como el resto de plugins</li>
</ul>
<p>Si nunca lo habéis probado, este es un buen momento <img src='http://www.berriart.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>El plugin en el directorio oficial de WordPress:<br />
<a href="http://wordpress.org/extend/plugins/meet-your-commenters/">http://wordpress.org/extend/plugins/meet-your-commenters/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2010/06/28/revision-de-meet-your-commenters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8216;Tunear&#8217; Gedit y convertirlo en un IDE</title>
		<link>http://www.berriart.com/2009/08/28/tunear-gedit-y-convertirlo-en-un-ide/</link>
		<comments>http://www.berriart.com/2009/08/28/tunear-gedit-y-convertirlo-en-un-ide/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 15:02:48 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[Tutoriales]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[gedit]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[programar]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=503</guid>
		<description><![CDATA[No sé si os lo he comentado alguna vez, pero Gedit es mi editor preferido y la herramienta que más utilizo para programar. He probado, e incluso alguna vez utilizo, algun IDE auténtico (según para que) Eclipse, Aptana o NetBeans; pero por lo general mi IDE es Gedit. Algunos dirán que lo que digo es [...]]]></description>
			<content:encoded><![CDATA[<p>No sé si os lo he comentado alguna vez, pero <a href="http://projects.gnome.org/gedit/">Gedit</a> es mi editor preferido y la herramienta que más utilizo para programar. He probado, e incluso alguna vez utilizo, algun IDE <em>auténtico</em> (según para que) Eclipse, Aptana o NetBeans; pero por lo general mi IDE es Gedit.</p>
<p>Algunos dirán que lo que digo es una barbaridad, pero me parece una de las mejores herramientas y sobre todo la más ligera. Porque aunque en un principio parezca que es muy <em>light</em>, si sabemos cómo, podemos personalizarla y convertirla en una gran herramienta. Hace tiempo <a href="http://www.viciao2k3.net/blog/linux/haciendo-gedit-mas-sociable-para-el-programador/">Miquel ya nos dió unos consejitos</a>, pero como se nos ha pasado a Mac, ahora me tengo que buscar la vida :p</p>
<p><strong>Os explico mi configuración y ya me diréis que opináis:</strong></p>
<p>Lo primero es ir a las preferencias <em>(Editar->Preferencias)</em>, y adecuaremos unas cuantas cositas:</p>
<p><u>- Pestaña &#8216;Ver&#8217;:</u></p>
<ul>
<li>Mostrar números de línea</li>
<li>Resaltar línea actual</li>
<li>Resaltar pareja del corchete</li>
</ul>
<p><img src="http://www.berriart.com/wp-content/uploads/2009/08/gedit-preferences-1.png" alt="gedit preferences" title="gedit preferences cap" width="450" height="444" class="aligncenter size-full wp-image-505" /></p>
<p><u>- Pestaña &#8216;Editor&#8217;:</u></p>
<ul>
<li>Insertar 4 espacios en lugar de tabulaciones</li>
<li>Activar sangría automática</li>
<li>Desactivar copia de seguridad, ya que crea archivos con el mismo nombre con el caracter &#8216;~&#8217; al final, que hace que linux los trate como ocultos y que si los subimos al servidor nos traeran graves problemas de seguridad</li>
</ul>
<p><img src="http://www.berriart.com/wp-content/uploads/2009/08/gedit-preferences-2.png" alt="gedit preferences " title="gedit preferences " width="450" height="444" class="aligncenter size-full wp-image-506" /></p>
<p><strong>Los colores</strong> que vienen por defecto para resaltar el código, no me gustan. Yo prefiero el fondo negro, ahorro energia y descanso la vista :p Así que nos vamos a la siguiente pestaña &#8216;Tipografías y colores&#8217;. De los esquemas existentes, tampoco me convencen ninguno, así que lo que hice fue descargarme otro. <a href="http://120linux.com/6-estilos-de-colores-para-gedit/">Aquí podéis descargar colores para Gedit</a>, a mi el esquema que más me gusta y el que uso es el Darkwin. Para instalarlo, descargalo y luego en la pestaña pulsa en el botón &#8216;Añadir&#8217; y agregalo.</p>
<p>Ahora llega el turno de instalar <strong>plugins o complementos</strong> para el Gedit. Por defecto trae algunos preinstalados que solo necesitamos activar desde la cuarta pestaña del panel de preferencias. Activaremos los siguientes:</p>
<ul>
<li>Herramientas externas &#8211; Permite ejecutar comandos o programas externos a Gedit para facilitarnos el trabajo. Más adelante explicaré como configurarlo.</li>
<li>Panel de examinador de Archivos &#8211; Pone a nuestra disposición un panel lateral para examinar y acceder a los archivos de nuestro proyecto (Tecla rápida F9).</li>
<li>Recortes &#8211; Permite insertar &#8216;recortes&#8217; de código, o estructuras muy utilizadas (loops, ifs,&#8230;). Escribe la palabra clave y luego pulsa tabulador, el resto se escribirá solo.</li>
<li>Sangrar líneas &#8211; Permite el sangrado de líneas de manera rápida mediante Ctrl+T.</li>
</ul>
<p>Además de estos, creo que es una buena opción instalar otro plugin más, pero este no viene por defecto, se llama <a href="http://sourceforge.net/projects/symbol-browser/">Symbol Browser</a>. Se trata de un panel lateral que permite la exploración de objetos, funciones, <em>defines</em>,&#8230; </p>
<p><img src="http://www.berriart.com/wp-content/uploads/2009/08/screenshot.jpg" alt="Symbol Browser" title="Symbol Browser" width="400" height="419" class="aligncenter size-full wp-image-512" /></p>
<p>Yo os explico como le he instalado en Ubuntu 9.04, pero si necesitáis más información <a href="http://www.micahcarrick.com/11-14-2007/gedit-symbol-browser-plugin.html">podéis ver este artículo</a> que fue como lo descubrí. Lo primero que hay que hacer es instalar Exuberant Ctags, que es la herramienta ne la que se basa este plugin, luego descargamos el plugin y lo instalamos. No olvides después de instalarlo activarlo en la pestaña &#8216;Complementos&#8217; como hemos hecho con los anteriores.</p>
<pre>sudo apt-get install ctags
cd ~/.gnome2/gedit/
wget http://sourceforge.net/projects/symbol-browser/files/symbol-browser-bin/gedit-symbol-browser-plugin-bin-ubuntu-i386-0.1/gedit-symbol-browser-plugin-bin-ubuntu-i386-0.1.tar.gz/download #La URL puede cambiar al cambiar de versión
tar -xzf gedit-symbol-browser-plugin-bin-ubuntu-i386-0.1.tar.gz
</pre>
<p>Eso sería todo. Bueno, más bien casi todo. Por último habría que configurar el plugin &#8216;Herramientas externas&#8217; para poder realizar diferentes tareas, como comprobar la syntaxis de nuestro código, consultar la documentación de PHP, &#8216;standarizar&#8217; nuestro código con el programa PHP-Beautifer,&#8230; Para ver como hacerlo creo que lo mejor es que os paséis por la web de la que he recogido la mayor parte de la info que he puesto en este post, ya que mejor que él seguro que no lo explico: <a href="http://www.micahcarrick.com/09-29-2007/gedit-html-editor.html">Micah Carrick</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2009/08/28/tunear-gedit-y-convertirlo-en-un-ide/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Comprobar TLDs válidos en PHP</title>
		<link>http://www.berriart.com/2009/07/21/comprobar-tlds-validos-en-php/</link>
		<comments>http://www.berriart.com/2009/07/21/comprobar-tlds-validos-en-php/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 22:40:05 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[función]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[tld]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=496</guid>
		<description><![CDATA[Estoy de vuelta de vacaciones, y no os voy a contar nada especialmente novedoso, pero es uno de esos apuntes que me hace falta de vez en cuando y que mejor sitio para tenerlo a mano que el blog. La función en sí no es nada del otro mundo, pero a la hora de comprobar [...]]]></description>
			<content:encoded><![CDATA[<p>Estoy de vuelta de vacaciones, y no os voy a contar nada especialmente novedoso, pero es uno de esos apuntes que me hace falta de vez en cuando y que mejor sitio para tenerlo a mano que el blog.  La función en sí no es nada del otro mundo, pero a la hora de comprobar el <a href="http://es.wikipedia.org/wiki/TLD">TLD</a> de un email o de una URL siempre es bueno tener a mano la lista de <a href="http://es.wikipedia.org/wiki/TLD">TLDs</a> válidos, así que los acabo de sacar de <a href="http://www.iana.org/">IANA</a> y he preparado esta pequeña función:</p>
<pre name="code" class="php">&lt;?php

// TLDs válidos sacados de IANA (http://www.iana.org) el 21/07/2009
$validTLDs = array( 'ac', 'ad', 'ae', 'aero', 'af', 'ag', 'ai',
	 'al', 'am', 'an', 'ao', 'aq', 'ar', 'arpa', 'as',
	 'asia', 'at', 'au', 'aw', 'ax', 'az', 'ba', 'bb',
	 'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj',
	 'bl', 'bm', 'bn', 'bo', 'br', 'bs', 'bt', 'bv',
	 'bw', 'by', 'bz', 'ca', 'cat', 'cc', 'cd', 'cf',
	 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co',
	 'com', 'coop', 'cr', 'cu', 'cv', 'cx', 'cy', 'cz',
	 'de', 'dj', 'dk', 'dm', 'do', 'dz', 'ec', 'edu',
	 'ee', 'eg', 'eh', 'er', 'es', 'et', 'eu', 'fi',
	 'fj', 'fk', 'fm', 'fo', 'fr', 'ga', 'gb', 'gd',
	 'ge', 'gf', 'gg', 'gh', 'gi', 'gl', 'gm', 'gn',
	 'gov', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu', 'gw',
	 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id',
	 'ie', 'il', 'im', 'in', 'info', 'int', 'io', 'iq',
	 'ir', 'is', 'it', 'je', 'jm', 'jo', 'jobs', 'jp',
	 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp', 'kr', 'kw',
	  'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr',
	  'ls', 'lt', 'lu', 'lv', 'ly', 'ma', 'mc', 'md',
	  'me', 'mf', 'mg', 'mh', 'mil', 'mk', 'ml', 'mm',
	  'mn', 'mo', 'mobi', 'mp', 'mq', 'mr', 'ms', 'mt',
	  'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na',
	  'name', 'nc', 'ne', 'net', 'nf', 'ng', 'ni', 'nl',
	  'no', 'np', 'nr', 'nu', 'nz', 'om', 'org', 'pa',
	  'pe', 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn',
	  'pr', 'pro', 'ps', 'pt', 'pw', 'py', 'qa', 're',
	  'ro', 'rs', 'ru', 'rw', 'sa', 'sb', 'sc', 'sd',
	  'se', 'sg', 'sh', 'si', 'sj', 'sk', 'sl', 'sm',
	  'sn', 'so', 'sr', 'st', 'su', 'sv', 'sy', 'sz',
	  'tc', 'td', 'tel', 'tf', 'tg', 'th', 'tj', 'tk',
	  'tl', 'tm', 'tn', 'to', 'tp', 'tr', 'travel', 'tt',
	  'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'um', 'us', 'uy',
	  'uz', 'va', 'vc', 've', 'vg', 'vi', 'vn', 'vu', 'wf',
	  'ws', 'ye', 'yt', 'yu', 'za', 'zm', 'zw'
);

/**
 * Función is_valid_tld
 *
 * Función que comprueba si el TLD de una URL o un email es válido o no
 *
 * @param string $urloremail Email o URL a testear
 * @return boolean Devuelve TRUE si la entrada tiene un TLD válido
 */
function is_valid_tld( $urloremail ) {
	global $validTLDs;

	// Check if is an email
	if( strpos($urloremail, '@') &gt; 0 &#038;&#038; strpos($urloremail, '://') === false ) {
		// Is an email, get TLD
		$tld = end( explode('.', $urloremail) );
	}
	else {
		// Is an url, get TLD
		$host = parse_url($urloremail, PHP_URL_HOST);
		$tld = end( explode('.', $host) );
	}

	return in_array($tld, $validTLDs);
}

?&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2009/07/21/comprobar-tlds-validos-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clase PHP para la nueva API de Minube</title>
		<link>http://www.berriart.com/2009/06/17/clase-php-api-minube/</link>
		<comments>http://www.berriart.com/2009/06/17/clase-php-api-minube/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 08:26:54 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Aplicaciones web]]></category>
		<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Recursos]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[clase]]></category>
		<category><![CDATA[minube]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=483</guid>
		<description><![CDATA[Últimamente a las startups españolas les ha dado por crear APIs para que todos podamos utilizar sus datos, crear mashups,&#8230; Ya lo hicieron 11870, nvivo, bitacoras,&#8230; y ahora le ha tocado el turno a Minube. Personalmente me parece estupendo, ya sabemos todos lo que nos enseñaron de pequeñitos, compartir es bueno. Pues aprovechando esta salida, [...]]]></description>
			<content:encoded><![CDATA[<p>Últimamente a las <em>startups</em> españolas les ha dado por crear APIs para que todos podamos utilizar sus datos, crear mashups,&#8230; Ya lo hicieron <a href="http://11870.com">11870</a>, <a href="http://www.nvivo.es/">nvivo</a>, <a href="http://bitacoras.com">bitacoras</a>,&#8230; y ahora le ha tocado el turno a <a href="http://www.minube.com">Minube</a>. Personalmente me parece estupendo, ya sabemos todos lo que nos enseñaron de pequeñitos, compartir es bueno.</p>
<p><a style="float:left; margin:0 5px 5px 0;" href="http://www.minube.com/api/"><img src="http://1.images.minube.com/minube_api_01.png" alt="Powered by Minube" title="Powered by Minube"  style="border:0px;vertical-align:bottom;" /></a>Pues aprovechando esta salida, y teniendo en cuenta que se me ha ocurrido una semi-idea para la que tal vez pueda usar esta API, he creado una clase en PHP para facilitar su manejo, <a href="http://www.berriart.com/minube-php/">Minube PHP</a>. Teniendo en cuenta que la idea puede no llegar  nada o quedarse aparcada como tantas otras cosas, he creido conveniente publicar la clase para que otros que si vayan a llevar a cabo las suyas se ahorren el trabajo.</p>
<p>Minube PHP: <a href="http://www.berriart.com/minube-php/">http://www.berriart.com/minube-php/</a></p>
<p>(Hace más de un mes que no escribía en el blog, soy un poco vago ¿verdad?)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2009/06/17/clase-php-api-minube/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ajustar el centro y el zoom de un listado de puntos con Google Maps</title>
		<link>http://www.berriart.com/2009/05/13/ajustar-el-centro-y-el-zoom-de-un-listado-de-puntos-con-google-maps/</link>
		<comments>http://www.berriart.com/2009/05/13/ajustar-el-centro-y-el-zoom-de-un-listado-de-puntos-con-google-maps/#comments</comments>
		<pubDate>Wed, 13 May 2009 13:25:55 +0000</pubDate>
		<dc:creator>artberri</dc:creator>
				<category><![CDATA[Desarrollo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[centro]]></category>
		<category><![CDATA[google maps]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[zoom]]></category>

		<guid isPermaLink="false">http://www.berriart.com/?p=477</guid>
		<description><![CDATA[Sé que ando tarde, pero son cosas que pasan. Cuando tenía que mostrar un listado de puntos en un mapa usando la API de Google Maps, siempre he tenido ciertos problemas para ajustar en lo posible el mapa a los puntos mostrados. Es decir, encontraba problemas en elegir el centro y el zoom exacto para [...]]]></description>
			<content:encoded><![CDATA[<p>Sé que ando tarde, pero son cosas que pasan. Cuando tenía que mostrar un listado de puntos en un mapa usando la API de Google Maps, siempre he tenido ciertos problemas para ajustar en lo posible el mapa a los puntos mostrados. Es decir, encontraba problemas en elegir el centro y el zoom exacto para que se vieran todos los puntos lo más cerca posible. Para conseguirlo usaba un par de funciones en PHP y realizaba el cálculo <em>server side</em>, aunque no siempre conseguía el resultado perfecto.</p>
<p>Bueno, pues hace poco que me he enterado que la propia API de Google Maps te permite hacerlo sin muchas complicaciones. Así que por si acaso hay por ahí algún despistadillo como yo que se páis que lo podéis hacer de la siguiente manera (más abajo hay un ejemplo completo):</p>
<pre class="javascript">
/* Primero seteamos el centro a cualquier punto */
map.setCenter(new GLatLng(0,0),0);

/* Creamos un objeto vacio GLatLngBounds() */
var bounds = new GLatLngBounds();

/* Por cada uno de los puntos a incluir en el mapa extendemos los límites del objeto */
/* En este caso latlng debería ser un objeto GLatLng */
/* Ejemplo: var latlng = new GLatLng(43, -2); */
bounds.extend(latlng);

/* Cuando hayamos incluido todos los puntos seteamos el centro y el zoom usando el objeto 'bounds' */
map.setZoom(map.getBoundsZoomLevel(bounds));
map.setCenter(bounds.getCenter());
</pre>
<p>Su modo de empleo se puede ver mejor en el siguiente ejemplo. Aprovechando que hoy se jugará la final de Copa, he creado un pequeño mapita con los puntos de Bilbao donde habrá pantallas gigantes para seguir el partido de mi querido Athletic contra el Barça, el zoom y el centro del mapa se calculan usando el método que he explicado más arriba.</p>
<p><a href="http://www.berriart.com/examples/ajustar-centro-y-zoom-google-maps.html">http://www.berriart.com/examples/ajustar-centro-y-zoom-google-maps.html</a></p>
<p>Y ya puestos, os comento a los twitteros del Athletic que podéis conseguir una camiseta oficial gracias a <a href="http://bilbao.bi">Bilbao.bi</a> si estos días comentáis la final por Twitter. Para obtener más información<a href="http://bilbao.bi/copa_athletic"> seguir el siguiente enlace</a>.</p>
<p>Si estos días no me véis por <em>la internete</em> es que hemos ganado la copa <img src='http://www.berriart.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Athletic, beti zurekin!</p>
<p><img src="http://www.berriart.com/wp-content/uploads/2009/05/athletic-campeon.jpg" alt="athletic campeon de copa" width="550" height="389" style="display:block;margin:auto;" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.berriart.com/2009/05/13/ajustar-el-centro-y-el-zoom-de-un-listado-de-puntos-con-google-maps/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
