joe di castrohttp://joedicastro.com2011-12-16T00:00:00+01:00Cambio de diseño2011-12-16T00:00:00+01:00joe di castrohttp://joedicastro.com/cambio-de-diseno.html<p>Después de los ligeros cambios de diseño que introduje en el sitio la semana
pasada he decidido ir un poco más allá y dar un giro completo al mismo,
conservando la estructura (casi no he tocado el HTML), pero con un diseño
más limpio y minimalista.</p>
<p>La idea principal es la de favorecer aún más la lectura del mismo y darle el protagonismo absoluto al contenido (en el diseño anterior ya tenia un gran peso),
eliminando todos aquellos elementos superfluos que pueden entorpecer o distraer
de la lectura del mismo. Por eso he realizado cambios en la tipografía, el fondo,
la división gráfica de las secciones, los cuadros con fragmentos de código y he
eliminado los enlaces e iconos de la parte inferior. Además he transformado la
página de <em>about me</em> en la de entrada al sitio. </p>
<h2 id="motivos_del_cambio">Motivos del cambio</h2>
<p>Realmente los motivos que me han llevado a realizar el cambio son mi propia
tendencia, y cada vez la de más gente, a leer los contenidos web de otra forma.
Normalmente leo los articulos a través de un lector de feeds, como
<strong>Google Reader</strong> o <a href="http://www.rssowl.org/">RSSOwl</a>, donde el contenido está
compuesto únicamente por el texto y las imágenes originales del mismo,
sobre un diseño sencillo que nos elimina cualquier trazo del diseño original.
Esto facilita la lectura y unifica el diseño de sitios muy dispares. Lo que nos
libra además de tener que lidiar con diseños recargados de imágenes, iconos,
enlaces y publicidad<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>, centrándonos únicamente en lo que realmente importa:
<strong>el contenido</strong></p>
<p>Esta tendencia se ha acentuado últimamente con el éxito de servicios como los de
<a href="http://readitlaterlist.com/">Read It Later</a> e <a href="http://www.instapaper.com/">Instapaper</a> que nos permiten postergar para un
momento más idóneo la lectura de aquello que nos interesa leer con calma. Además
nos permite leer el contenido en formato <em>"solo texto"</em> y offline, sin tener que
acceder al sitio original. Tal ha sido el éxito de estos servicios y tan clara la
tendencia a emplear el modo texto de los mismos, que han surgido algunos nuevos
servicios destinados precisamente a facilitar la lectura de cualquier contenido
web. Los más destacados son <a href="http://www.readability.com/">Readability</a> y <a href="http://www.evernote.com/about/download/clearly.php">Evernote Clearly</a>.
Personalmente, cuando visito una pagina que tiene un diseño algo cargado y me
interesa leer su contenido, no me lo pienso dos veces; tecleo <strong> <code>:rea ↹ ↵</code> </strong> en
<a href="http://dactyl.sourceforge.net/pentadactyl/">Pentadactyl</a> y en par de segundos tengo el texto en <strong>Readability</strong> para
leerlo tranquilamente sin distracciones.</p>
<p>Aunque realmente no me acaba de convencer el diseño último de ninguno de estos
sitios, por eso es mi idea el proporcionar la mejor experiencia de lectura
posible de mi sitio, sin tener que recurrir a servicios externos. Porque desde mi
punto de vista "lo simple es bello" y "menos es más", eliminar lo superfluo,
contribuye a mejorar la calidad del diseño.</p>
<h2 id="inspiraci+n">Inspiración</h2>
<p>Para el nuevo diseño, me he inspirado principalmente en los diseños de blogs en
esta línea que más me gustan, como son los de <a href="http://stevelosh.com/about/">Steve Losh</a>,
<a href="http://lucumr.pocoo.org/about/">Armin Ronacher</a>, el tema <a href="http://jimbarraud.com/manifest/">Manifest</a> para Wordpress o algunos
de los temas minimalistas más empleados en <strong>Tumblr</strong>. </p>
<p>Quizá lo más importante haya sido el cambio a una tipografía <a href="http://es.wikipedia.org/wiki/Serif">Serif</a>, por ser más cómoda la lectura empleando la misma.
Y también el haberme decidido a emplear una <a href="http://es.wikipedia.org/wiki/Web_Open_Font_Format">Web Font</a> después de haberlas descartado inicialmente para el sitio,
para las cabeceras. Al haber eliminado los iconos inferiores y depender de una
hoja de estilo alojada externamente en los servidores de Google, apenas se ve
afectada la velocidad de carga y el peso de la página.</p>
<h2 id="css_3_para_los_bloques_de_c+digo">CSS 3 para los bloques de código</h2>
<p>Quizá lo más espectacular del cambio de diseño sea el nuevo aspecto que tienen
ahora los bloques en los que se presentan los fragmentos de código, como el que
sigue. Para poder verlos debidamente es necesario emplear una versión reciente
del navegador web que permita HTML 5 y CSS 3. </p>
<p>Estas son las reglas CSS 3 que empleo para implementarlo:</p>
<div class="codehilite"><pre><span class="nc">.codehilite</span><span class="nd">:before</span><span class="o">,</span> <span class="nc">.codehilite</span><span class="nd">:after</span> <span class="p">{</span>
<span class="k">content</span><span class="o">:</span> <span class="s2">" "</span><span class="p">;</span>
<span class="k">position</span><span class="o">:</span> <span class="k">absolute</span><span class="p">;</span>
<span class="k">z-index</span><span class="o">:</span> <span class="m">-1</span><span class="p">;</span>
<span class="n">transform</span><span class="o">:</span> <span class="n">skew</span><span class="p">(</span><span class="m">-3</span><span class="n">deg</span><span class="o">,-</span><span class="m">2</span><span class="n">deg</span><span class="p">);</span>
<span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="n">transform</span><span class="o">:</span> <span class="n">skew</span><span class="p">(</span><span class="m">-3</span><span class="n">deg</span><span class="o">,-</span><span class="m">2</span><span class="n">deg</span><span class="p">);</span>
<span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">transform</span><span class="o">:</span> <span class="n">skew</span><span class="p">(</span><span class="m">-3</span><span class="n">deg</span><span class="o">,-</span><span class="m">2</span><span class="n">deg</span><span class="p">);</span>
<span class="o">-</span><span class="err">o</span><span class="o">-</span><span class="n">transform</span><span class="o">:</span> <span class="n">skew</span><span class="p">(</span><span class="m">-3</span><span class="n">deg</span><span class="o">,-</span><span class="m">2</span><span class="n">deg</span><span class="p">);</span>
<span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">transform</span><span class="o">:</span> <span class="n">skew</span><span class="p">(</span><span class="m">-3</span><span class="n">deg</span><span class="o">,-</span><span class="m">2</span><span class="n">deg</span><span class="p">);</span>
<span class="k">bottom</span><span class="o">:</span> <span class="m">14px</span><span class="p">;</span>
<span class="k">left</span><span class="o">:</span> <span class="m">1px</span><span class="p">;</span>
<span class="n">box</span><span class="o">-</span><span class="n">shadow</span><span class="o">:</span> <span class="m">0px</span> <span class="m">15px</span> <span class="m">5px</span> <span class="m">#aaa</span><span class="p">;</span>
<span class="k">height</span><span class="o">:</span> <span class="m">50px</span><span class="p">;</span>
<span class="k">max-width</span><span class="o">:</span> <span class="m">50</span><span class="o">%</span><span class="p">;</span>
<span class="k">width</span><span class="o">:</span> <span class="m">50</span><span class="o">%</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.codehilite</span><span class="nd">:after</span> <span class="p">{</span>
<span class="n">transform</span><span class="o">:</span> <span class="n">skew</span><span class="p">(</span><span class="m">3</span><span class="n">deg</span><span class="o">,</span><span class="m">2</span><span class="n">deg</span><span class="p">);</span>
<span class="o">-</span><span class="n">ms</span><span class="o">-</span><span class="n">transform</span><span class="o">:</span> <span class="n">skew</span><span class="p">(</span><span class="m">3</span><span class="n">deg</span><span class="o">,</span><span class="m">2</span><span class="n">deg</span><span class="p">);</span>
<span class="o">-</span><span class="n">webkit</span><span class="o">-</span><span class="n">transform</span><span class="o">:</span> <span class="n">skew</span><span class="p">(</span><span class="m">3</span><span class="n">deg</span><span class="o">,</span><span class="m">2</span><span class="n">deg</span><span class="p">);</span>
<span class="o">-</span><span class="err">o</span><span class="o">-</span><span class="n">transform</span><span class="o">:</span> <span class="n">skew</span><span class="p">(</span><span class="m">3</span><span class="n">deg</span><span class="o">,</span><span class="m">2</span><span class="n">deg</span><span class="p">);</span>
<span class="o">-</span><span class="n">moz</span><span class="o">-</span><span class="n">transform</span><span class="o">:</span> <span class="n">skew</span><span class="p">(</span><span class="m">3</span><span class="n">deg</span><span class="o">,</span><span class="m">2</span><span class="n">deg</span><span class="p">);</span>
<span class="k">left</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span>
<span class="k">right</span><span class="o">:</span> <span class="m">1px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.codehilite</span> <span class="p">{</span>
<span class="k">position</span><span class="o">:</span> <span class="k">relative</span><span class="p">;</span>
<span class="k">padding</span><span class="o">:</span> <span class="m">1px</span><span class="p">;</span>
<span class="k">background</span><span class="o">:</span> <span class="m">#fafafa</span><span class="p">;</span>
<span class="k">margin</span><span class="o">:</span> <span class="m">25px</span><span class="p">;</span>
<span class="n">box</span><span class="o">-</span><span class="n">shadow</span><span class="o">:</span> <span class="m">0px</span> <span class="m">0px</span> <span class="m">1px</span> <span class="m">1px</span> <span class="m">#ccc</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>Aunque desafortunadamente emplear la propiedad <code>transform</code> y sus equivalentes
para cada familia de navegadores, provoca que no se valide por ahora correctamente
como CSS 3 valido, ya que la propiedad aún está en proceso de estandarización.</p>
<h3 id="dise+o_antiguo">Diseño antiguo</h3>
<p>Por supuesto <em>nunca llueve a gusto de todos</em> y habrá quien prefiera el aspecto
anterior de la página, pero sinceramente creo que esto nuevo diseño contribuye en
gran manera a ayudar a "digerir" los "pequeños" artículos con los que suelo
prodigarme. Para que quede como testigo del cambio, está imagen corresponde
con el diseño que tenia anteriormente el blog:</p>
<p style="text-align:center;"><img src="pictures/diseño_2011.png"
alt="diseño anterior del blog" title="diseño anterior del blog" width=700
height=813 /></p>
<div class="footnote">
<hr />
<ol>
<li id="fn:1">
<p>Bueno, nos libra de "casi" toda la publicidad, algunos deberían aprender que incluir publicidad en los feeds es de bastante mal gusto.
 <a href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Pelican - Configuración y personalización2011-06-30T01:21:00+02:00joe di castrohttp://joedicastro.com/pelican-configuracion-y-personalizacion.html<p>Con este articulo cierro la serie que le he dedicado a <a href="http://joedicastro.com/tag/pelican.html">Pelican</a> como
herramienta idónea para crear blogs estáticos con mantenimiento cero. Aquí voy a
tratar de la parte más compleja de Pelican, la que nos permite personalizarlo y
adaptarlo a nuestros gustos y necesidades. El primer nivel de personalización se
obtiene a través del fichero de configuración (aunque no es necesario, es
recomendable emplearlo). El segundo nivel vendría mediante la personalización del
tema empleado, bien creando uno nuevo o bien modificando el que viene por
defecto. El último nivel vendría de modificar el propio Pelican. Todos son
posibles y están a nuestro alcance, gracias a que es Software Libre. </p>
<p>Si bien yo he personalizado mi sitio con respecto al sitio por defecto, y aún
quedan ciertas cosas que aún quiero cambiar, no he necesitado de momento más que
modificar el fichero de configuración y el tema que viene por defecto. En
Pelican no he tocado nada exceptuando el activar por defecto <strong>Markdown Extra</strong>,
algo que Alexis tuvo como gentileza <a href="https://github.com/ametaireau/pelican/pull/138">aceptar como modificación</a> a Pelican. Es
posible que en el futuro algunas de las cosas que tengo en mente me lleven a
modificarlo, y espero poder así contribuir en alguna medida a su desarrollo. </p>
<h2 id="configuraci+n">Configuración</h2>
<p>La configuración se hace a través de un fichero python, que en el ejemplo por
defecto se llama <code>pelican.conf.py</code> y en nuestro ejemplo estaría en
<em>myblog.com/site/pelican.conf.py</em>. Para llamar al fichero de configuración se
utiliza la opción <code>-s</code> y en nuestro ejemplo sería:</p>
<div class="codehilite"><pre><span class="gp">$</span> pelican -s ./site/pelican.conf.py
</pre></div>
<p>Este es un tema que está muy bien resuelto en la <a href="http://docs.notmyidea.org/alexis/pelican/settings.html">documentación</a>. De todos
modos voy a hablar de unos cuantos campos interesantes y alguno no incluido
dentro de la documentación. Entre paréntesis indico los valores por defecto.</p>
<ul>
<li>
<p><strong>OUTPUT_PATH</strong> (<code>'output/'</code>) y <strong>PATH</strong> (<code>None</code>)</p>
<p>Empleando estos dos valores, conseguimos que solo tengamos que especificar el
fichero de configuración en la linea de comandos empleada para llamar a Pelican.
El primero define el directorio de salida donde queremos que se genere nuestro
sitio y el segundo el directorio origen de nuestro contenido. </p>
</li>
<li>
<p><strong>SITESUBTITLE</strong> (<code>u''</code>)</p>
<p>Un subtitulo que se puede poner al blog, e.g. un lema. No aparece documentado.</p>
</li>
<li>
<p><strong>JINJA_EXTENSIONS</strong> (<code>[]</code>)</p>
<p>Puede ser necesario habilitar ciertas extensiones de Jinja2 para personalizar
el tema que vamos a emplear. Por ejemplo, para mostrar la nube de etiquetas
con las etiquetas ordenadas alfabéticamente, he habilitado una extensión que
necesitaba para el proceso de esta manera:</p>
<div class="codehilite"><pre><span class="n">JINJA_EXTENSIONS</span> <span class="o">=</span> <span class="p">[</span><span class="s">'jinja2.ext.do'</span><span class="p">]</span>
</pre></div>
</li>
<li>
<p><strong>STATIC_PATHS</strong> (<code>['images',]</code>)</p>
<p>Te permite especificar los contenidos estáticos que quieres añadir a tu blog
y que acabaran colgando de la carpeta <em>static</em>. Yo por ejemplo lo empleo
para alojar las imágenes en <em>static/pictures</em> y el mapa flash que utilizo en
el articulo <a href="http://joedicastro.com/combatir-el-spam-en-drupal.html">Combatir el spam en Drupal</a> en <em>static/ammap</em> así:</p>
<div class="codehilite"><pre><span class="n">STATIC_PATHS</span> <span class="o">=</span> <span class="p">[</span><span class="s">"pictures"</span><span class="p">,</span> <span class="s">"ammap"</span><span class="p">,</span> <span class="p">]</span>
</pre></div>
</li>
<li>
<p><strong>TAG_FEED</strong> (<code>None</code>) y <strong>TAG_FEED_RSS</strong> (<code>None</code>)</p>
<p>Te permiten establecer fuentes Atom y RSS por etiqueta, que es una opción
muy interesante para quienes solo les interesa un tema de los que trates o
para formar parte de un <a href="http://es.wikipedia.org/wiki/Planeta_%28agregador%29">Planet</a> sin mezclar temas. Eso si, lo lógico es
modificar luego el tema para que aparezcan disponibles. </p>
</li>
<li>
<p><strong>DIRECT_TEMPLATES</strong> (<code>('index', 'tags', 'categories', 'archives')</code>)</p>
<p>Estas son las plantillas del tema que generan una página por si mismas. No
viene documentada, pero yo he cambiado los valores por defecto para añadir
una página personalizada a la que redirijo los errores 404 (Página no
encontrada) de esta manera:</p>
<div class="codehilite"><pre><span class="n">DIRECT_TEMPLATES</span> <span class="o">=</span> <span class="p">(</span><span class="s">'index'</span><span class="p">,</span> <span class="s">'tags'</span><span class="p">,</span> <span class="s">'categories'</span><span class="p">,</span> <span class="s">'archives'</span><span class="p">,</span> <span class="s">'notfound'</span><span class="p">)</span>
</pre></div>
</li>
<li>
<p><strong>PIWIK_URL</strong> y <strong>PIWIK_SITE_ID</strong></p>
<p>Te permiten configurar tu sitio para emplear el magnifico sistema de
analíticas web <a href="http://piwik.org/">Piwik</a>. Yo hace unos dos años que lo empleo en mis sitios,
porque tiene la ventaja de que no dependes de un script de un dominio externo.
Esto te ahorra consultas DNS y que la página se quede esperando a cargar
completamente cuando estos fallan. De esta manera tienes el control total
sobre las estadísticas de tu web sin tener que renunciar a la calidad de
otros servicios externos.</p>
</li>
<li>
<p><strong>FILES_TO_COPY</strong> (<code>()</code>)</p>
<p>Básica si queremos emplear ficheros como <em>.htaccess</em> o <em>robots.txt</em>. No está
documentada tampoco. El uso de la misma consiste en una tupla de tuplas con
los valores de las rutas del fichero origen y su destino. En este sitio por
ejemplo:</p>
<div class="codehilite"><pre><span class="n">FILES_TO_COPY</span> <span class="o">=</span> <span class="p">((</span><span class="s">'extra/robots.txt'</span><span class="p">,</span> <span class="s">'robots.txt'</span><span class="p">),</span>
<span class="p">(</span><span class="s">'extra/favicon.ico'</span><span class="p">,</span> <span class="s">'favicon.ico'</span><span class="p">),</span>
<span class="p">(</span><span class="s">'extra/.htaccess'</span><span class="p">,</span> <span class="s">'.htaccess'</span><span class="p">),)</span>
</pre></div>
</li>
</ul>
<h2 id="personalizaci+n">Personalización</h2>
<p>Pero si realmente queremos personalizar el sitio, tanto en funcionalidad básica
como en su aspecto, nos toca modificar el tema por defecto. Aquí podemos optar por
tres vías: Crear el nuestro propio, empezar un tema casi desde cero,
eligiendo el tema por defecto <code>simple</code> (solo texto) o partir de la base del tema
por defecto <code>notmyidea</code>. Este último es el que hemos estado empleado en nuestro
ejemplo y el que yo modifiqué hasta llegar donde lo tengo ahora. </p>
<p>Para comprender de que consta un tema y como podemos personalizarlo, lo mejor es
analizar el tema <code>notmyidea</code>.</p>
<div class="codehilite"><pre><span class="go">notmyidea/</span>
<span class="go">├── static</span>
<span class="go">│ ├── css</span>
<span class="go">│ │ ├── main.css</span>
<span class="go">│ │ ├── pygment.css</span>
<span class="go">│ │ ├── reset.css</span>
<span class="go">│ │ └── wide.css</span>
<span class="go">│ └── images</span>
<span class="go">│ └── icons</span>
<span class="go">│ ├── delicious.png</span>
<span class="go">│ ├── lastfm.png</span>
<span class="go">│ ├── linkedin.png</span>
<span class="go">│ ├── rss.png</span>
<span class="go">│ └── twitter.png</span>
<span class="go">└── templates</span>
<span class="go"> ├── analytics.html</span>
<span class="go"> ├── archives.html</span>
<span class="go"> ├── article.html</span>
<span class="go"> ├── article_infos.html</span>
<span class="go"> ├── base.html</span>
<span class="go"> ├── categories.html</span>
<span class="go"> ├── category.html</span>
<span class="go"> ├── comments.html</span>
<span class="go"> ├── disqus_script.html</span>
<span class="go"> ├── github.html</span>
<span class="go"> ├── index.html</span>
<span class="go"> ├── page.html</span>
<span class="go"> ├── pagination.html</span>
<span class="go"> ├── piwik.html</span>
<span class="go"> ├── skribit_tab_script.html</span>
<span class="go"> ├── skribit_widget_script.html</span>
<span class="go"> ├── tag.html</span>
<span class="go"> ├── taglist.html</span>
<span class="go"> ├── tags.html</span>
<span class="go"> ├── translations.html</span>
<span class="go"> └── twitter.html</span>
</pre></div>
<ul>
<li>
<p><strong><em>static/css</em></strong></p>
<p>Aquí es donde se guardan las <a href="http://es.wikipedia.org/wiki/CSS">Hojas de estilo en cascada (CSS)</a> que emplea el
tema. Aunque la el fichero <em>wide.css</em> no es empleado por el tema, solo para la
versión wide del mismo. Yo la eliminé como primera medida. Luego tenemos
<em>main.css</em> que es la hoja de estilo principal, <em>pygment.css</em> que es la que emplea
Pygments para el resaltado de sintaxis y <em>reset.css</em> para resetear los navegadores
a unos valores comunes por defecto. </p>
<p>Si lo que queremos es tener un sitio con un buen rendimiento, deberíamos dar
como mínimo dos pasos, consolidar todas la hojas de estilo en una sola y
minimizar el tamaño de esta. Consolidarla en este caso es realmente sencillo,
simplemente debemos insertar el contenido de <em>reset.css</em> al principio del
fichero <em>main.css</em> y <em>pygment.css</em> al final del mismo. Depués hay que
eliminar los imports de estas hojas en <em>main.css</em>*. Luego para minimizar
su tamaño eliminar comentarios y lineas en blanco y poner una regla por línea. </p>
<p>Otro paso que dí para mejorar el rendimiento es no usar las web fonts
externas (ni internas), que aunque le dan un aspecto inmejorable, hay que
reconocerlo, requieren cargar otro recurso externo, desde mi punto de vista
innecesario.</p>
<p>Lo mejor en estos casos es seguir siempre las recomendaciones de estas dos
magnificas herramientas: <a href="http://developer.yahoo.com/yslow/">YSlow</a> de <strong>Yahoo</strong> y <a href="http://code.google.com/speed/page-speed/">Page Speed</a> de
<strong>Google</strong>. Afortunadamente hay sitios web como <a href="http://gtmetrix.com/">GTmetrix</a> o
<a href="http://www.webpagetest.org/">WebPagetest</a> que nos permiten ver los resultados de ambas herramientas
en nuestro sitio web sin necesidad de instalarlas (aunque para el desarrollo
es más que recomendable). Si por ejemplo emplearamos <strong>GTmetrix</strong> los valores
que arroja un sitio con el tema por defecto son:</p>
<table>
<thead>
<tr>
<th>Page Speed (tema por defecto)</th>
<th>YSlow (tema por defecto)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>B (80%)</strong></td>
<td><strong>B (85%)</strong></td>
</tr>
</tbody>
</table>
<p>Valores bastante mejorables. Los valores actuales para este sitio, una vez
personalizado el tema y configurado correctamente el <em>.htaccess</em> son:</p>
<table>
<thead>
<tr>
<th>Page Speed (tema personalizado)</th>
<th>YSlow (tema personalizado)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>A (91%)</strong></td>
<td><strong>A (95%)</strong></td>
</tr>
</tbody>
</table>
<p>Y si nos fijamos en <a href="http://gtmetrix.com/reports/joedicastro.com/BeFSzvAa">los resultados</a>, las penalizaciones de rendimiento
vienen de los scrips externos de Piwik y Disqus, principalmente de este
último. Sin emplear estos scripts los valores suben a:</p>
<table>
<thead>
<tr>
<th>Page Speed (sin scripts)</th>
<th>YSlow (sin scripts)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>A (100%)</strong></td>
<td><strong>A (98%)</strong></td>
</tr>
</tbody>
</table>
<p>En resumen, una optimización más que correcta, solo hay que ver los valores
de las páginas del Top 1000 que ofrecen en GTmetrix. Obtener una optimización
como esta con un CMS no es imposible (había conseguido unos valores solo un
poquito peores con Drupal) pero si bastante más complicado. La experiencia
del usuario depende mucho de estos valores, hay que contar con que no todo
el mundo dispone de buenos accesos a Internet.</p>
<p>Evidentemente, después cada uno retocara el fichero CSS resultante a su
gusto para personalizar el aspecto del sitio. En este caso estoy empleando
CSS 3 y valida correctamente. </p>
</li>
</ul>
<p style="text-align:center;">
<a href="http://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Fjoedicastro.com%2F&profile=css3&usermedium=all&warning=1&vextwarning=&lang=es">
<img style="border:0;width:88px;height:31px"
src="pictures/valid-css3.png"
alt="¡CSS 3 Válido!" title="¡CSS 3 Válido!" />
</a>
</p>
<ul>
<li>
<p><strong>static/images/icons</strong></p>
<p>Son los iconos empleados por la hoja de estilo para los enlaces sociales de
la parte inferior de la página. Yo no los empleo. ¿Entonces como se ven?
Bueno lo primero que hice fue crear un <a href="http://www.w3schools.com/css/css_image_sprites.asp">sprite</a> para cargar una sola
imagen en lugar de 6, es decir menos solicitudes al servidor. Después
incorporé esta imagen <a href="http://www.websiteoptimization.com/speed/tweak/inline-images/">dentro del propio fichero CSS con un Data URL</a>, y
gracias a haberla optimizado hasta ocupar solamente ~3k, me compensaba
hacerlo. Una consulta menos al servidor. Lo mismo hice después con el
logotipo (1K) y al final no se carga ninguna imagen por defecto en el blog,
0 consultas. Los navegadores modernos soportan esto sin problemas, los que
no lo hacen, no muestran la imagen, solo el enlace, que tampoco es un ningún
problema.</p>
<p>Así es como queda en <em>main.css</em> la imagen que da vida a los iconos de los
enlaces a la redes sociales:</p>
<div class="codehilite"><pre><span class="nf">#extras</span> <span class="nt">div</span><span class="o">[</span><span class="nt">class</span><span class="o">=</span><span class="s1">'social'</span><span class="o">]</span> <span class="nt">a</span><span class="p">{</span><span class="k">background-repeat</span><span class="o">:</span><span class="k">no-repeat</span><span class="p">;</span><span class="k">background-image</span><span class="o">:</span><span class="sx">url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAACSCAMAAAB7VbqAAAAAwFBMVEWQBQCWFxU5VpedVy+tUE5LZaBPZZZDabDdYSpke75vfZBkfbJZgc+heztshKvldjBgld91j9+Uj4p5ksZ/lLzthzLqhz+MmrAcvuaDofihpYRzq/D4mDeUp9KetkSirsnQpKWpvV/qqHvHsJjnqY/3qWK1ubbIun2jwLHEu7xm1O+6xoOtv++7wte0yNzxwH563e/3xJjK06ya5vXY3p7U2+3e3tbm6IT63cLn7czr7fbZ9Prz7+r8+O/3+fb9//z6WVfkAAADNElEQVRIx9WV4XqiPBCFoyu4aVjQBrW2ImBX3aJYdQERIbn/u9qTRKzd7/n+b88jxHlnMswEY4hIGYUcLZYKklLbtixqNBymhNl2yG/2lBFqu1LKKjD2dEioxfIKKOfaVgA+HkoptsoGoDxPA8orKZTtEIdyNWE4zXEbUgVokAq4p1JuqQHIX8G9lYK2EdOpkNuhlJxec+TTrcxpJVENAOK3iK9oLkOLEmbqGQZ4dMAtRlJj617QZErQvqpHiVLVvvhL/y6oFx40HhktaqJt9X2mtSDwHg7L1p6NAJZY9eZwB8aHsgF61zaAnr8spXxX9piMR8umxAQQZBp5ZDTSOZYgzXjkKTCbvTeKNPLgKaCTK/dCNldQlu9wL0aNHH9XADnK2UGWXil/GoDJyFx6P69gNlPPWy698cIDWOj68DzvO+Qt0D7MsXcV2v86by55+qSEPP3+pKf/ARfxF5Dy8gH2+/0N7Pc3oCUMSJIWyESBRANxgX4nyQ1cEiMDEkR8BheT4jYl2bdJW5DsdczlA9z09N/2v86bw1Vs4vl8c6xbcI7ncQxkCBFFPM8a0QAfDTjOM70453lc630bx2ezXJt5oUARx40BmQF3EfFroXJs5gaU30inF+G3vombBnuu7JFer9OJ1JQMZcQ/SK8WEekRVRYqjb+RSMq60yHF8VzXRVHAWUsV0TZVIEekctzafEPKTnS/o+qog7z361FHkfhK/5ZV0MrnPAgqEvBWYZoGPCSt6aujLGScuC5j+LAdNkAVALCrUuVndwARvhoJs3C3WSXUFB8HjtW1LFxCvz3WtQC03Bw5fOsDdEPl794BPMW9Ap3DAMuyCc5nJQ2sO2AB+BgYCU1dCkwwhjjnfNUO8ycTl/lf6pxTtzzfQXl1BduXAQ5/7jiDl50CgcMnq6Ku69WEOQHAgD8+Pq5WbysMLle78tdq8jDR4oMc4HzKsuPuBRoMLKHB6+spG2hgrwCydQZpQH0NTmsgB/4BTVe1AphyNCBXoMk2p9MvB7bT1xEitB+eFXCch3WhSl/Z/T6dcMddr581KAD6fdd9fnyoTbdvrN93+v2uXbTt17sQyvV6/AE7UZJYs2UOngAAAABJRU5ErkJggg==")</span><span class="p">;</span><span class="k">padding-left</span><span class="o">:</span><span class="m">25px</span><span class="p">;}</span>
<span class="nc">.social</span> <span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">*=</span><span class="s1">'atom.xml'</span><span class="o">]</span><span class="p">{</span><span class="k">background-position</span><span class="o">:</span><span class="m">3px</span> <span class="m">6px</span><span class="p">;}</span>
<span class="nc">.social</span> <span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">*=</span><span class="s1">'rss.xml'</span><span class="o">]</span><span class="p">{</span><span class="k">background-position</span><span class="o">:</span><span class="m">3px</span> <span class="m">-20px</span><span class="p">;}</span>
<span class="nc">.social</span> <span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">*=</span><span class="s1">'twitter.com'</span><span class="o">]</span><span class="p">{</span><span class="k">background-position</span><span class="o">:</span><span class="m">3px</span> <span class="m">-46px</span><span class="p">;}</span>
<span class="nc">.social</span> <span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">*=</span><span class="s1">'identi.ca'</span><span class="o">]</span><span class="p">{</span><span class="k">background-position</span><span class="o">:</span><span class="m">3px</span> <span class="m">-72px</span><span class="p">;}</span>
<span class="nc">.social</span> <span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">*=</span><span class="s1">'facebook.com'</span><span class="o">]</span><span class="p">{</span><span class="k">background-position</span><span class="o">:</span><span class="m">3px</span> <span class="m">-98px</span><span class="p">;}</span>
<span class="nc">.social</span> <span class="nt">a</span><span class="o">[</span><span class="nt">href</span><span class="o">*=</span><span class="s1">'bitbucket.org'</span><span class="o">]</span><span class="p">{</span><span class="k">background-position</span><span class="o">:</span><span class="m">3px</span> <span class="m">-124px</span><span class="p">;}</span>
</pre></div>
</li>
<li>
<p><strong>static/templates</strong></p>
<p>Estas son las plantillas que dan vida al tema y emplean Jinja2. Los nombres
son bastante descriptivos de la función que realiza cada una de ellas. En mi
caso hay una serie de ellas que no empleo, como son: <em>analytics.html</em>,
<em>article_infos.html</em>, <em>github.html</em>, <em>skribit_tab_script.html</em>,
<em>skribit_widget_script.html</em>, <em>translations.html</em> y <em>twitter.html</em>. He
realizado bastantes modificaciones en las plantillas y me extendería demasiado
explicándolo, además sigo realizando cambios. Aún no lo tengo todo como yo
lo quiero, y aún voy a personalizar y optimizar más cosas. Cuando lo tenga
todo listo, pienso publicar un repositorio con el contenido que genera este
blog, tanto a efectos de copia de seguridad, como de que le pueda servir a
alguien como guía para montar el suyo propio. </p>
<p>De todos modos si puedo decir que he añadido una que no existía,
<em>notfound.html</em> para los errores 404 y pienso crear una nueva para los
errores 403. Además he creado los enlaces para los feeds RSS y Atom de las
etiquetas y eliminado el bloque de información que aparecía en cada articulo.
Además en la plantilla <em>tags.html</em> que por defecto viene vacía, he creado lo
necesario para generar la nube de etiquetas. <em>tags.html</em> queda entonces así:</p>
<div class="codehilite"><pre><span class="cp">{%</span> <span class="k">extends</span> <span class="s2">"base.html"</span> <span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">block</span> <span class="nv">content</span> <span class="cp">%}</span>
<span class="nt"><section</span> <span class="na">id=</span><span class="s">"content"</span> <span class="na">class=</span><span class="s">"body"</span><span class="nt">></span>
<span class="nt"><h1></span>etiquetas<span class="nt"></h1></span>
<span class="nt"><ul</span> <span class="na">id=</span><span class="s">"cloud"</span><span class="nt">></span>
<span class="cp">{%</span>- <span class="k">set</span> <span class="nv">all_tags</span> <span class="o">=</span> <span class="o">{}</span> -<span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">for</span> <span class="nv">ctag</span> <span class="k">in</span> <span class="nv">tag_cloud</span> -<span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">do</span> <span class="nv">all_tags.update</span><span class="o">({</span><span class="nv">ctag.0</span><span class="o">:</span><span class="nv">ctag.1</span><span class="o">})</span> <span class="cp">%}</span>
<span class="cp">{%</span>- <span class="k">endfor</span> <span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">for</span> <span class="nv">tag</span> <span class="k">in</span> <span class="nv">all_tags</span><span class="o">|</span><span class="nf">sort</span> <span class="cp">%}</span>
<span class="nt"><li</span> <span class="na">class=</span><span class="s">"tag-</span><span class="cp">{{</span> <span class="nv">all_tags</span><span class="o">[</span><span class="nv">tag</span><span class="o">]</span> <span class="cp">}}</span><span class="s">"</span><span class="nt">><a</span> <span class="na">href=</span><span class="s">"tag/</span><span class="cp">{{</span> <span class="nv">tag</span><span class="o">|</span><span class="nf">replace</span><span class="o">(</span><span class="s2">" "</span><span class="o">,</span> <span class="s2">"%20"</span><span class="o">)</span> <span class="cp">}}</span><span class="s">.html"</span><span class="nt">></span><span class="cp">{{</span> <span class="nv">tag</span> <span class="cp">}}</span><span class="nt"></a></li></span>
<span class="cp">{%</span> <span class="k">endfor</span> <span class="cp">%}</span>
<span class="nt"></ul></span>
<span class="nt"></section></span>
<span class="cp">{%</span> <span class="k">endblock</span> <span class="cp">%}</span>
</pre></div>
<p>También he realizado las modificaciones pertinentes para que el contenido
validara perfectamente en HTML 5. </p>
</li>
</ul>
<p style="text-align:center;">
<a href="http://validator.w3.org/check?uri=http%3A%2F%2Fjoedicastro.com%2F">
<img style="border:0;width:88px;height:31px"
src="pictures/valid-html5.png"
alt="¡HTML 5 Válido!" title="¡HTML 5 Válido!" />
</a>
</p>
<p>Pero como ya he dicho es un proceso que aún no he finalizado. Cuando lo
termine y publique el repositorio, actualizaré también este articulo.</p>