<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>H3RALD - Tag 'website' (RSS Feed)</title>
    <language>en-us</language>
    <lastBuildDate>Tue, 15 Sep 2009 11:32:51 -0000</lastBuildDate>
    <ttl>40</ttl>
    <link>http://www.h3rald.com</link>
    <description/>
    <item>
      <title>Take back your site, with nanoc!</title>
      <description>&lt;p&gt;Back in 2004, when I bought the h3rald.com domain, this site was static. At the time I hardly knew &lt;span class="caps"&gt;HTML&lt;/span&gt; and &lt;span class="caps"&gt;CSS&lt;/span&gt;, nevermind server-side languages, so I remember creating a &lt;em&gt;pseudo-template&lt;/em&gt; for the web site layout and using it whenever I wanted to create a new page, to preserve the overall look-and-feel. This was a crude and inefficient strategy, of course: whenever I changed the layout I had to replicate the change in all the pages of the site &amp;ndash; the whole eight of them.&lt;/p&gt;
&lt;p&gt;Five years later, after rebuilding this web site &lt;a href="/h3rald/"&gt;seven times&lt;/a&gt; using different backends (&lt;span class="caps"&gt;PHP&lt;/span&gt; + CakePHP, Ruby + Rails + Typo, etc.), I decided to make it static again, this time with a twist. It all started when I read a &lt;a href="http://tom.preston-werner.com/2008/11/17/blogging-like-a-hacker.html"&gt;post&lt;/a&gt; by Tom Preston-Warner (&lt;a href="http://www.github.com"&gt;GitHub&lt;/a&gt; co-founder) that I finally decided to give it a try. Today, the 8th release of this web site is 100% static: if you load any page, there&amp;#8217;s no server-side interpretation going on, you&amp;#8217;re just browsing a plain &lt;span class="caps"&gt;HTML&lt;/span&gt; page, at most with a few &lt;span class="caps"&gt;AJAX&lt;/span&gt; calls. But let&amp;#8217;s start from the beginning&amp;#8230;&lt;/p&gt;
&lt;h3&gt;Why I don&amp;#8217;t need a blog platform&lt;/h3&gt;
&lt;p&gt;There&amp;#8217;s nothing inherently wrong with blog platforms like Wordpress: they allow &lt;em&gt;anyone&lt;/em&gt; to publish content on the web using a user-friendly administration area. They were built with one thing in mind: make publishing content on the web something as simple as possible, even for people who don&amp;#8217;t know anything about &lt;span class="caps"&gt;HTML&lt;/span&gt;, let alone server-side scripting.&lt;/p&gt;
&lt;p&gt;What about people who &lt;em&gt;do&lt;/em&gt; know about web development though? Do they still need a blog platform? Depends. If you are comfortable with editing files using a text editor, if you enjoy using the command-line on a daily basis, if you like programming and &lt;em&gt;hacking&lt;/em&gt; a little bit, if you don&amp;#8217;t really care about fancy and user-friendly administration backends&amp;#8230; &lt;em&gt;then you probably don&amp;#8217;t&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;All you need is a system to transform a bunch of source files into a web site. The good news is that such system exists &amp;ndash; and you&amp;#8217;re also spoiled for choices!&lt;/p&gt;
&lt;h3&gt;Introducing site compilers&lt;/h3&gt;
&lt;p&gt;The first &lt;em&gt;site compiler&lt;/em&gt; I discovered was &lt;a href="http://webby.rubyforge.org/"&gt;Webby&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[&amp;#8230;] Webby works by combining the contents of a page with a layout to produce &lt;span class="caps"&gt;HTML&lt;/span&gt;. The layout contains everything common to all the pages &amp;mdash; &lt;span class="caps"&gt;HTML&lt;/span&gt; headers, navigation menu, footer, etc. &amp;mdash; and the page contains just the information for that page. You can use your favorite markup language to write your pages; Webby supports quite a few.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There are quite a few applications like Webby, such as:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://nanoc.stoneship.org/"&gt;nanoc&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://snk.tuxfamily.org/lib/rassmalog/doc/guide.html"&gt;Rassmalog&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.jekyllrb.com/"&gt;Jeckyll&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://webgen.rubyforge.org/"&gt;WebGen&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://rog.rubyforge.org/"&gt;Rog&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://rote.rubyforge.org/"&gt;Rote&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://hobix.com/"&gt;Hobix&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://rakeweb.rubyforge.org/wiki/wiki.pl"&gt;RakeWeb&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.apeth.com/RubyFrontierDocs/default.html"&gt;RubyFrontier&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://staticmatic.rubyforge.org/"&gt;StaticMatic&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://staticweb.rubyforge.org/"&gt;StaticWeb&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.zenspider.com/ZSS/Products/ZenWeb/"&gt;ZenWeb&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://yurtcms.roberthahn.ca/"&gt;YurtCMS&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://nanoblogger.sourceforge.net/"&gt;NanoBlogger&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are probably even more, with different features, but they all try to solve the same problem: provide a way to generate static web sites in an automated way.&lt;/p&gt;
&lt;p&gt;I spent some time reading about each one of them, &lt;a href="http://github.com/h3rald/h3rald/issues/closed#issue/1"&gt;evaluating the pros and cons&lt;/a&gt; and in the end I decided to go for &lt;a href="http://nanoc.stoneship.org/"&gt;nanoc&lt;/a&gt;, simply because it was the only one that seemed to fit all my needs.&lt;/p&gt;
&lt;h3&gt;A quick overview of nanoc&lt;/h3&gt;
&lt;p&gt;nanoc is a nifty tool written in Ruby suitable for &lt;em&gt;[&amp;#8230;] building small to medium-sized websites&lt;/em&gt;. In other words, anything which doesn&amp;#8217;t involve some fancy user interaction. For what concerns blogs, the only user interaction is &lt;em&gt;comments&lt;/em&gt; &amp;ndash; but that&amp;#8217;s fine, because there&amp;#8217;s more than one web service for that, such as &lt;a href="http://disqus.com/"&gt;Disqus&lt;/a&gt; or &lt;a href="http://intensedebate.com/"&gt;IntenseDebate&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Some details on the project&lt;/h4&gt;
&lt;p&gt;Compared to the alternatives, nanoc is one of the most mature and most maintained, having hit just a few weeks ago its 3.0 release. Its creator, Denis Defreyne, uses it for his own &lt;a href="http://stoneship.org/"&gt;web site&lt;/a&gt; and is involved with the project on a daily basis, both coding and offering support to nanoc users like myself who regularly ask questions on the &lt;a href="http://groups.google.com/group/nanoc"&gt;nanoc user group&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Denis also seems very concerned about keeping documentation up-to-date &amp;ndash; something that really impressed me from a technical writer&amp;#8217;s point of view. The &lt;a href="http://nanoc.stoneship.org/tutorial/"&gt;tutorial&lt;/a&gt; he put together will get you started in no time, and the &lt;a href="http://nanoc.stoneship.org/manual/"&gt;manual&lt;/a&gt; will explain everything else you may possibly want to know. When release 3.0 came out he even put together a &lt;a href="http://nanoc.stoneship.org/migrating/"&gt;migration guide&lt;/a&gt;. If this is still not enough and you don&amp;#8217;t mind spending some time extending the system, nanoc&amp;#8217;s &lt;a href="http://nanoc.stoneship.org/doc/3.0.0/"&gt;RDoc documentation&lt;/a&gt; is very comprehensive compared to other Ruby projects.&lt;/p&gt;
&lt;h4&gt;Sites, Items and data sources&lt;/h4&gt;
&lt;p style="float:right;"&gt;&lt;img src="/img/pictures/nanoc-structure.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;nanoc ships with a really neat command line tool that can do most of the work for you. &lt;code&gt;Nanoc3 create_site h3rald&lt;/code&gt; will create a new web site in a folder called h3rald. The contents of this folder are laid out according to a particular logic (&lt;em&gt;convention over configuration&lt;/em&gt;, remember?) So:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;content&lt;/strong&gt; &amp;ndash; your articles, pages, stylesheets, images, &amp;#8230;all the site content and assets.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;layouts&lt;/strong&gt; &amp;ndash; the site layouts (and partial layouts)&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;lib&lt;/strong&gt; &amp;ndash; place your custom ruby code and vendor libraries here&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;output&lt;/strong&gt; &amp;ndash; your &amp;#8220;compiled&amp;#8221; site, ready to be deployed&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;config.yaml&lt;/strong&gt; &amp;ndash; your site&amp;#8217;s configuration file. The only one (and it&amp;#8217;s just a few lines)&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Rakefile&lt;/strong&gt; &amp;ndash; place any custom Rake task here&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Rules&lt;/strong&gt; &amp;ndash; defines the rules for compilation, layout and routing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;#8217;s the default &lt;code&gt;config.yaml&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="l-Scalar-Plain"&gt;data_sources&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; 
&lt;span class="p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;items_root&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;/&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;layouts_root&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;/&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;type&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;filesystem_compact&lt;/span&gt;
  &lt;span class="l-Scalar-Plain"&gt;output_dir&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l-Scalar-Plain"&gt;output&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;A &lt;em&gt;data source&lt;/em&gt; in nanoc defines where data is retrieved from to create the web site. By default, the &lt;a href="http://nanoc.stoneship.org/doc/3.0.0/Nanoc3/DataSources/FilesystemCompact.html"&gt;filesystem_compact&lt;/a&gt; data source requires that you create two files in the /content folder for each article or page of your web page:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;One containing the actual content of the page&lt;/li&gt;
	&lt;li&gt;Another for the page&amp;#8217;s arbitrary metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By personal preference, I chose the &lt;a href="http://nanoc.stoneship.org/doc/3.0/Nanoc3/DataSources/FilesystemCombined.html"&gt;filesystem_combined&lt;/a&gt; data source, which allows you to combine the content and the metadata of a page in a single file.&lt;/p&gt;
&lt;p&gt;The source code for this very article, for example, starts like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;-----
type: article
tags:
- website
- ruby
- programming
- writing
date: 2009-09-15 13:32:51.049000 +02:00
permalink: take-back-your-site-with-nanoc
title: &amp;quot;Take back your site, with nanoc!&amp;quot;
toc: true
-----
Back in 2004, when I bought the h3rald.com domain, this site was static. At the time I hardly 
knew HTML and CSS, nevermind server-side languages, so I remember creating a _pseudo-template_ for
 the web site layout and using it whenever I wanted to create a new page, to preserve the overall look-and-feel. 
This was a crude and inefficient strategy, of course: whenever I changed the layout I had to replicate the change
 in all the pages of the site &amp;amp;ndash; the whole eight of them.
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;At run time, the content goes through a Textile filter and the metadata is used in layouts, to generate tag links automatically, for example.&lt;/p&gt;
&lt;h4&gt;Layouts, filters, and helpers&lt;/h4&gt;
&lt;p&gt;Layouts in nanoc are similar to layouts and views in Rails, but much simpler. The same applies to helpers. Here&amp;#8217;s a snippet from my &lt;a href="http://github.com/h3rald/h3rald/tree/master/layouts/default.erb"&gt;default layout&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;        &amp;lt;div id=&amp;quot;container&amp;quot;&amp;gt;
          &amp;lt;!-- CONTENT START --&amp;gt;
          &amp;lt;div id=&amp;quot;content&amp;quot; class=&amp;quot;clearfix&amp;lt;%= (@item[:permalink] == &amp;#39;home&amp;#39;) ? &amp;#39; home&amp;#39; : &amp;#39; standard&amp;#39; %&amp;gt;&amp;quot;&amp;gt;
            &amp;lt;h2&amp;gt;&amp;lt;%= @item[:title] %&amp;gt;&amp;lt;/h2&amp;gt;
            &amp;lt;%   case @item[:type]
                when &amp;#39;article&amp;#39; then%&amp;gt;
                &amp;lt;div id=&amp;quot;content-header&amp;quot;&amp;gt;
                  &amp;lt;%= render &amp;#39;article_meta&amp;#39;, :article =&amp;gt; @item %&amp;gt;
                &amp;lt;/div&amp;gt;
              &amp;lt;% end %&amp;gt;
              &amp;lt;hr /&amp;gt;
              &amp;lt;div id=&amp;quot;content-body&amp;quot;&amp;gt;
                &amp;lt;%= yield %&amp;gt;
              &amp;lt;/div&amp;gt;
              &amp;lt;div id=&amp;quot;content-footer&amp;quot;&amp;gt;
                &amp;lt;div class=&amp;quot;share&amp;quot;&amp;gt;
                  &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://w.sharethis.com/button/sharethis.js#publisher=6e34d60c-b14e-4c19-9b2f-7c35a9f0ab09&amp;amp;amp;type=website&amp;amp;amp;linkfg=%23a4282d&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
                  &amp;lt;% if @item[:feed] then %&amp;gt;
                  &amp;lt;a href=&amp;quot;&amp;lt;% @item[:feed_url] || @item[:feed]+&amp;quot;rss/&amp;quot; %&amp;gt;&amp;quot; type=&amp;quot;application/rss+xml&amp;quot; rel=&amp;quot;alternate&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/images/theme/feed-icon-14x14.png&amp;quot; alt=&amp;quot;#&amp;quot;/&amp;gt;H3RALD - &amp;lt;%= @item[:feed_title]%&amp;gt;&amp;lt;/a&amp;gt;
                  &amp;lt;% end %&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;%= render &amp;#39;article_buttons&amp;#39; if @item[:type] == &amp;#39;article&amp;#39; %&amp;gt;
              &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;This source code snippet shows quite a few features of nanoc&amp;#8217;s layouts:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;You can access the metadata of the page which is being rendered using the &lt;code&gt;@item&lt;/code&gt;, so &lt;code&gt;@item[:title]&lt;/code&gt; returns the page&amp;#8217;s title, for example.&lt;/li&gt;
	&lt;li&gt;Layouts can be nested, and behave like Rails&amp;#8217;s partials. The &lt;code&gt;render&lt;/code&gt; takes a string parameter (the name of the layout to render) and an optional hash parameter to pass variables to the layout.&lt;/li&gt;
	&lt;li&gt;The &lt;code&gt;yield&lt;/code&gt; method is used to include the content of a page.&lt;/li&gt;
	&lt;li&gt;Layouts support any kind of filter, like &lt;span class="caps"&gt;ERB&lt;/span&gt; for example. Go crazy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Helpers can be used in layouts to perform common tasks, like creating links, feeds, navigation elements and so on. Check the &lt;a href="http://nanoc.stoneship.org/doc/3.0.0/"&gt;source code docs&lt;/a&gt; for more info, and of course feel free to create your own as you see fit.&lt;/p&gt;
&lt;p&gt;Finally, filters are used to filter content markup. nanoc ships with &lt;a href="http://nanoc.stoneship.org/manual/#list-of-built-in-filters"&gt;almost everything you need&lt;/a&gt;, from Textile to Haml to RDoc, but nobody forbids you to create your own, and it&amp;#8217;s dead easy.&lt;/p&gt;
&lt;h4&gt;Rules and tasks&lt;/h4&gt;
&lt;p&gt;While tasks (as in Rake tasks) do not constitute a huge part of nanoc (but as usual, you may need to create your own to perform custom operations), Rules became, as of version 3, one of the key concepts to grasp in order to make everything work. Rules are stored in the &lt;code&gt;Rules&lt;/code&gt; file of your nanoc site, they can be used to:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Define routes, i.e. where pages are deployed in the output folder.&lt;/li&gt;
	&lt;li&gt;Define how pages are compiled, which filters to apply to a particular set of pages, which layouts to use, etc.&lt;/li&gt;
	&lt;li&gt;Define how layout are handled, which filters to apply to a particular layout, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can find more information in the &lt;a href="http://nanoc.stoneship.org/manual/#rules"&gt;manual&lt;/a&gt;, along with other important information, but for now, let&amp;#8217;s say you should be familiar with &lt;em&gt;most&lt;/em&gt; of nanoc&amp;#8217;s jargon and how it works. Let&amp;#8217;s see what you can do with it, in practice.&lt;/p&gt;
&lt;h3&gt;Migrating from your blog platform&lt;/h3&gt;
&lt;p&gt;As of version 7, h3rald.com has been powered by the &lt;a href="http://www.typosphere.org"&gt;Typo&lt;/a&gt; blog platform. If you are not familiar with it, let&amp;#8217;s just say it&amp;#8217;s a sort of Wordpress built on top of Rails: database backend, pretty admin front-end, tags, comments, and all sort of things a blog may need. While Typo is pleasant enough to use, it has all the inherent disadvantages of any other similar platform:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;It relies on a database&lt;/li&gt;
	&lt;li&gt;It relies on server-side scripting to render pages&lt;/li&gt;
	&lt;li&gt;It uses a complex caching mechanism to produce, ultimately, semi-static pages&lt;/li&gt;
	&lt;li&gt;It may be subject to exploits, attacks, high server loads, and similar&lt;/li&gt;
	&lt;li&gt;You can&amp;#8217;t really customize it beyond a certain point&lt;/li&gt;
	&lt;li&gt;You have to upgrade your backend frequently, and often is not as painless as you may expect&lt;/li&gt;
	&lt;li&gt;You can&amp;#8217;t use versioning tools like git for your content, as it&amp;#8217;s stored in a database&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;#8217;m not claiming that nanoc is blogging&amp;#8217;s silver bullet (it was not created for that), but for sure:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;It &lt;em&gt;does not&lt;/em&gt; rely on a database&lt;/li&gt;
	&lt;li&gt;It &lt;em&gt;does not&lt;/em&gt; rely on server-side scripting to render pages (not in real-time, anyway)&lt;/li&gt;
	&lt;li&gt;It &lt;em&gt;does not&lt;/em&gt; need a complex caching mechanism simply because it produces static pages&lt;/li&gt;
	&lt;li&gt;It is definitely less prone to nasty things&lt;/li&gt;
	&lt;li&gt;It&amp;#8217;s extremely flexible and hackable with very little effort&lt;/li&gt;
	&lt;li&gt;You don&amp;#8217;t have to upgrade all the time, but it is &lt;em&gt;really&lt;/em&gt; painless if you decide to&lt;/li&gt;
	&lt;li&gt;You can use git and similar: your content is in plain old text files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rants are beside the point, suffice to say I recently convinced myself that switching from Typo to nanoc was a &lt;em&gt;good thing&lt;/em&gt;, so let&amp;#8217;s see how it worked out.&lt;/p&gt;
&lt;h4&gt;Posts, pages and comments&lt;/h4&gt;
&lt;p&gt;Out of Typo&amp;#8217;s MySQL database, I just wanted to get the following data:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Pages and posts&lt;/li&gt;
	&lt;li&gt;Tags&lt;/li&gt;
	&lt;li&gt;Comments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Following the approach used by &lt;a href="http://github.com/mojombo/jekyll"&gt;Jekyll&lt;/a&gt;, I decided to use the simple and powerful &lt;a href="http://sequel.rubyforge.org/"&gt;Sequel&lt;/a&gt; gem. I&amp;#8217;m sorry to disappoint you, but the whole migration process can be summarize with the following Rake task:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:migrate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:usr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:pwd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:host&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="no"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Please provide :db, :usr, :pass&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:db&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:usr&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:pwd&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Sequel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:db&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:usr&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:password&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:pwd&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:host&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:host&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;
    &lt;span class="c1"&gt;# Remove all existing pages!&lt;/span&gt;
    &lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Pathname&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pwd&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;content&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rmtree&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exist?&lt;/span&gt;
    &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mkpath&lt;/span&gt;
    &lt;span class="c1"&gt;# Prepare page data&lt;/span&gt;
    &lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:contents&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;state = &amp;#39;published&amp;#39; || type = &amp;#39;Page&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; 
    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;total_tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Migrating [&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;]: &amp;#39;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;...&amp;quot;&lt;/span&gt;
      &lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
      &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;tags&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_tags&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:keywords&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;comments&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_comments&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;permalink&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:permalink&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:type&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;downcase&lt;/span&gt;
      &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:published_at&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;toc&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
      &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;filters_pre&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_filter&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:text_filter_id&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;convert_code_blocks&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:body&lt;/span&gt;&lt;span class="o"&gt;]+&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:extended&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt;
      &lt;span class="n"&gt;write_page&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt;
      &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;That&amp;#8217;s it. Well, almost: you can find the &lt;code&gt;get_comments&lt;/code&gt;, &lt;code&gt;get_tags&lt;/code&gt; and &lt;code&gt;get_filter&lt;/code&gt; methods in a separate &lt;a href="http://github.com/h3rald/h3rald/tree/master/lib/utils.rb"&gt;utility file&lt;/a&gt;. Nothing special really, just a few convenience methods wrapping queries or simply processing data. Note how all information, including tags and legacy comments, is saved in each page&amp;#8217;s metadata. The &lt;code&gt;write_page&lt;/code&gt; method simply creates a file in the &lt;code&gt;/contents&lt;/code&gt; folder.&lt;/p&gt;
&lt;h4&gt;Filters and highlighters&lt;/h4&gt;
&lt;p&gt;On my old site, I used mainly Textile and Markdown to write posts. However, some of my really old articles used BBCode, whose corresponding filter is not available in nanoc. No worries, I soon found out that creating a new nanoc filter came down to this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rubygems&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bb-ruby&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BbcodeFilter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Nanoc3&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Filter&lt;/span&gt;
  &lt;span class="n"&gt;identifier&lt;/span&gt; &lt;span class="ss"&gt;:bbcode&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bbcode_to_html&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Yes, that&amp;#8217;s it. Granted, the &lt;code&gt;bb-ruby&lt;/code&gt; gem does all the work, but notice how easy it is to just plug in new Ruby code into nanoc&amp;#8217;s architecture!&lt;/p&gt;
&lt;p&gt;The next big challange was code highlighting. After a quick research, I found at least a half dozen of possible solutions to highlight source code. Some were javascript based, others were based on a server-side language like &lt;span class="caps"&gt;PHP&lt;/span&gt;, Ruby or Python. Again, I looked at Jekyll for inspiration and discovered they integrated the &lt;a href="http://www.pygments.org"&gt;Pygments&lt;/a&gt; &lt;em&gt;Python&lt;/em&gt; library. Why use a Python library for code highlighting in a Ruby-based project? Because there&amp;#8217;s nothing to stop you (if you can run Python on your server, that is), because it looks very neat and because it supports a lot of different programming languages.&lt;/p&gt;
&lt;p&gt;Lazy as I am, I more or less dropped &lt;a href="http://github.com/h3rald/h3rald/blob/master/lib/albino.rb"&gt;Chris Wanstrath&amp;#8217;s Ruby wrapper&lt;/a&gt; into my &lt;code&gt;/lib&lt;/code&gt; folder (I just used Open3 instead of Open4 for Windows compatibility), and monkey-patched nanoc&amp;#8217;s filtering helper as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Nanoc3::Helpers::Filtering&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;highlight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;syntax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Seamlessly ripped off from the filter method...&lt;/span&gt;
    &lt;span class="c1"&gt;# Capture block&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Reconvert &lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsub!&lt;/span&gt; &lt;span class="sr"&gt;/&amp;lt;%/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
    &lt;span class="c1"&gt;# Filter captured data&lt;/span&gt;
    &lt;span class="n"&gt;filtered_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;notextile&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="no"&gt;Albino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;colorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;syntax&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;/notextile&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;rescue&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; 
    &lt;span class="c1"&gt;# Append filtered data to buffer&lt;/span&gt;
    &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;_erbout&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;filtered_data&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Nanoc3&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Helpers&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Filtering&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;There you go, another thing sorted.&lt;/p&gt;
&lt;h4&gt;Tags and Feeds&lt;/h4&gt;
&lt;p&gt;Adding tagging support was a tiny bit more tricky. nanoc supports content tagging out-of-the-box though metadata and a simple helper, but I wanted to create tag pages (with feeds). Nothing too difficult though, it all came down to a simple Rake task:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:tags&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;site&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Nanoc3&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_data&lt;/span&gt;
    &lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Pathname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pwd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;content/tags&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rmtree&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exist?&lt;/span&gt;
    &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mkpath&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="c1"&gt;# Collect tag and page data&lt;/span&gt;
    &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:tags&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      &lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:tags&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
          &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;]+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
          &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; 
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="c1"&gt;# Write pages&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each_pair&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;write_tag_page&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;
      &lt;span class="n"&gt;write_tag_feed_page&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;RSS&amp;#39;&lt;/span&gt;
      &lt;span class="n"&gt;write_tag_feed_page&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Atom&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Again, you can find all the other simple utility methods in my &lt;a href="http://github.com/h3rald/h3rald/tree/master/lib/utils.rb"&gt;utility file&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When it came to feeds, I decided to create a new method for the Blogging helper to create &lt;span class="caps"&gt;RSS&lt;/span&gt; feeds, although nanoc does come with an Atom feed generator:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;rss_feed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;builder&amp;#39;&lt;/span&gt;
    &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;prepare_feed&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;
    &lt;span class="c1"&gt;# Create builder&lt;/span&gt;
    &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;xml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;XmlMarkup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:target&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:indent&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Build feed&lt;/span&gt;
    &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instruct!&lt;/span&gt;
    &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:version&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2.0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="vi"&gt;@item&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;en-us&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lastBuildDate&lt;/span&gt; &lt;span class="vi"&gt;@item&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:last&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:date&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;rfc822&lt;/span&gt;
        &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ttl&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;40&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="vi"&gt;@site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:base_url&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;
        &lt;span class="vi"&gt;@item&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:articles&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
          &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
            &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="vi"&gt;@item&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:content_proc&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pubDate&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:date&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;rfc822&lt;/span&gt;
            &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guid&lt;/span&gt; &lt;span class="n"&gt;url_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="n"&gt;url_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="vi"&gt;@site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:author_email&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt; &lt;span class="n"&gt;url_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#comments&amp;#39;&lt;/span&gt;
            &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:tags&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
              &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
            &lt;span class="k"&gt;end&lt;/span&gt;
          &lt;span class="k"&gt;end&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="n"&gt;buffer&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Nothing too daunting, once you get used to Ruby&amp;#8217;s &lt;span class="caps"&gt;XML&lt;/span&gt; builder. I followed a similar approach for my &lt;a href="/archives"&gt;monthly archives&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3rd-party services&lt;/h4&gt;
&lt;p&gt;Finally, the interactive bits. I basically turned to third-party services and a bit of jQuery for everything which required user-interaction or pulling data from other web sites. Here&amp;#8217;s a list of services and APIs I currently use:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://intensedebate.com/"&gt;IntenseDebate&lt;/a&gt;, for comments.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://code.google.com/apis/ajaxsearch/web.html"&gt;Google &lt;span class="caps"&gt;AJAX&lt;/span&gt; Search &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; for internal site-wide search.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://apiwiki.twitter.com/"&gt;Twitter &lt;span class="caps"&gt;JSON&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; to fetch tweets.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://delicious.com/help/json"&gt;Delicious &lt;span class="caps"&gt;JSON&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; to fetch delicious bookmarks.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.backtype.com/developers"&gt;BackType &lt;span class="caps"&gt;JSON&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; to fetch comments from other sites.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://develop.github.com/"&gt;GitHub &lt;span class="caps"&gt;JSON&lt;/span&gt; &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; to fetch GitHub commits for most of my &lt;a href="/projects"&gt;projects&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to know how I integrated them, check out my &lt;a href="http://github.com/h3rald/h3rald/tree/master/content/js"&gt;/js folder&lt;/a&gt;, it was very simple, really.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I was very happy of switching to nanoc. It didn&amp;#8217;t take me long, and I spent most of the time with non-nanoc issues (brushing up jQuery, &lt;span class="caps"&gt;CSS&lt;/span&gt;, graphics, etc.). Of course knowing the Ruby programming language helps, and if you&amp;#8217;re not comfortable with hacking your way a little bit, then maybe it&amp;#8217;s not for you.&lt;/p&gt;
&lt;p style="float:left;"&gt;&lt;img src="/img/pictures/nanoc-compile.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Personally, I&amp;#8217;ve been waiting for something like nanoc for a long time: its simple and yet powerful architecture makes you able to do virtually anything with it. For the first time in a long time, I feel like I&amp;#8217;m in complete control of my web site, I know every bits of it and if I want to change the way it works or looks I only have to touch a few files.&lt;/p&gt;
&lt;p&gt;nanoc&amp;#8217;s metadata is mindblowing for its simplicity and power: although you&amp;#8217;re not dealing with a database, you can query your content in the easiest ways possible. Whenever I needed a way to easily access pages, filter them, add extra logic to them, I just added metadata. If you forget something, you don&amp;#8217;t have to change your database tables, create new relationships or anything of the sort, you simply add metadata to pages.&lt;/p&gt;
&lt;p&gt;Be warned that tweaking nanoc gets addictive very quickly: you soon end up creating silly little tasks for making things just the way you want. For me, adding a new article to my blog now just means this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;$ rake site:article name=take-back-your-site-with-nanoc
$ vim content/articles/take-back-your-site-with-nanoc
... write &amp;amp; close the file ...
$ Nanoc3 compile 
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;&amp;#8230;Exactly what I need. Nothing more, nothing less.&lt;/p&gt;</description>
      <pubDate>Tue, 15 Sep 2009 11:32:51 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/take-back-your-site-with-nanoc/</guid>
      <link>http://www.h3rald.com/articles/take-back-your-site-with-nanoc/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/take-back-your-site-with-nanoc/#comments</comments>
      <category>website</category>
      <category>ruby</category>
      <category>programming</category>
      <category>writing</category>
    </item>
    <item>
      <title>Introducing H3RALD.com v7.1</title>
      <description>&lt;p&gt;I finally decided to redesign my web site. About 2 years passed since last time and I think this was long overdue: a lot of people liked the black &lt;em&gt;Nitefall&lt;/em&gt; theme, but a lot of people found a bit too dark for their liking.&lt;/p&gt;
&lt;p&gt;I decided to go for something more &lt;del&gt;boring&lt;/del&gt; traditional this time: white background and only black header and footer. I think the new design improves the overall readability of the site, also because this time I kept thing simple:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;No more sidebars &amp;ndash; Who needs them anyway? Who wants to see my &lt;a href="http://www.delicious.com/h3rald"&gt;delicious bookmarks&lt;/a&gt; on &lt;em&gt;every single page&lt;/em&gt;? Who wants to see that annoying Web 2.0-ish tag cloud listing all the tags I&amp;#8217;ve ever used from 2006 onwards? I suddently realized that the right column was nothing more than wasted space, so I removed it altogether.&lt;/li&gt;
	&lt;li&gt;No more differentiation between &lt;em&gt;articles&lt;/em&gt; and &lt;em&gt;blog posts&lt;/em&gt; &amp;ndash; As a matter of fact, I&amp;#8217;m not posting little pointless tidbits everyday, it&amp;#8217;s more likely just once a week or even once a month. When I post though, I tend to make it worthwhile both for me and the readers by writing about something which may interest people, for a change. In short: this may not be a &amp;#8220;traditional blog&amp;#8221; anymore, just a publishing platform for my articles.&lt;/li&gt;
	&lt;li&gt;No more &amp;#8220;previews&amp;#8221; &amp;ndash; From now on, only the title of each articles is displayed in the home page, in the archives and even when searching. If you want to read an article, all you have to do is click on its title. No more &amp;#8220;Read More&amp;#8221; links.&lt;/li&gt;
	&lt;li&gt;Just three main pages: &lt;a href=""&gt;Home&lt;/a&gt;, &lt;a href="/archives"&gt;Archives&lt;/a&gt;, and &lt;a href="/about"&gt;About&lt;/a&gt;. Although there may be some more for special projects, at some point.&lt;/li&gt;
	&lt;li&gt;Use the &lt;a href="/archives"&gt;Archives&lt;/a&gt; to find my articles. There you&amp;#8217;ll find a list of the 20 most used tags, a search form, and a timeline listing &lt;em&gt;all&lt;/em&gt; my articles from 2006 onwards.&lt;/li&gt;
	&lt;li&gt;Use the tiny palette on the left side of each page to perform common actions like bookmarking, scroll up and down, etc. You can read more about it on the &lt;a href="/about"&gt;About&lt;/a&gt; page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope you like the new design, or at least I hope it makes my articles more readable. However, I&amp;#8217;m open to suggestions, as usual.&lt;/p&gt;
&lt;p&gt;P.S.: I dropped with Internet Explorer 6 compatibility According to my stats, less than 5% of my visitors use it, so it&amp;#8217;s not worth the extra hassle.&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 04:29:00 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/h3rald-71/</guid>
      <link>http://www.h3rald.com/articles/h3rald-71/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/h3rald-71/#comments</comments>
      <category>website</category>
      <category>rails</category>
    </item>
    <item>
      <title>Beware of sudden upgrades!</title>
      <description>&lt;p&gt;Yesterday I got a rather annoying early Christmas present: when visiting my site, I noticed that the raw source code of my dispatch.fcgi file (yes, I&amp;#8217;m on shared hosting with FastCGI, for now) was displayed &amp;#8220;as it is&amp;#8221; instead of being interpreted.&lt;/p&gt;
&lt;p&gt;After the initial moment of anger and stress (I immediately realized it was BlueHost&amp;#8217;s fault, not mine), I opened two tickets and went to bed, hoping to see everything solved in the morning.&lt;/p&gt;
&lt;p&gt;Unluckily it wasn&amp;#8217;t the case, so I posted on BlueHost forum trying to be as polite as possible complaining because the issue wasn&amp;#8217;t being dealt with. It turns out that for such issues you&amp;#8217;re supposed to use the &amp;#8220;Live Chat&amp;#8221; feature instead of the tickets, so that&amp;#8217;s what I did.&lt;/p&gt;
&lt;p&gt;After a quick chat with &amp;#8220;Christian&amp;#8221;, it turns out that BlueHost decided to perform a server upgrade &amp;#8220;silently&amp;#8221; upgrading to Apache2, PHP5, MySQL4.1, etc. etc.&lt;br /&gt;
Cool, pity that nobody told me that!&lt;/p&gt;
&lt;p&gt;I was expecting some sort of &lt;span class="caps"&gt;PHP&lt;/span&gt; upgrade (not that I care like that), which was supposed to happen according to the last BlueHost newsletter:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;#8220;To alleviate any issues in the future with certain scripts that only run on one&lt;br /&gt;
version of &lt;span class="caps"&gt;PHP&lt;/span&gt; we have developed the ability to run PHP4 and PHP5 on the same server&lt;br /&gt;
simultaneously. This will be rolled out to all users in the next couple of weeks. Some&lt;br /&gt;
servers already have this ability while most will see it in the next two weeks.&amp;#8221;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But&amp;#8230; hang on? Does it say anything about migrating to Apache2? I don&amp;#8217;t think so! What&amp;#8217;s worse, is that quite a few things changed with Apache2, in particular the way FastCGI handlers are declared:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;# Apache 1.3:
AddHandler fastcgi-script .fcgi

# Apache 2:
AddHandler fcgid-script .fcgi
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;See? Different. This is due to the fact that &lt;a href="http://wiki.rubyonrails.org/rails/pages/Debian+mod_fastcgi+Notes"&gt;&lt;code&gt;mod_fcgid&lt;/code&gt; is used instead of &lt;code&gt;mod_fastcgi&lt;/code&gt; on Apache 2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The fix was easy, of course, and now my site is up and running again (and actually running faster)&amp;#8230; but, I wonder, why the hell wasn&amp;#8217;t I informed? Is it acceptable? It sounds like I might end up on a &lt;span class="caps"&gt;VPS&lt;/span&gt; sooner than expected, unless BlueHost doesn&amp;#8217;t roll out some new exciting feature soon, as I think it might&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Thu, 20 Dec 2007 06:41:00 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/apache2-upgrade/</guid>
      <link>http://www.h3rald.com/articles/apache2-upgrade/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/apache2-upgrade/#comments</comments>
      <category>website</category>
      <category>rails</category>
    </item>
    <item>
      <title>Review Services</title>
      <description>&lt;p&gt;When it comes to software, I definitely like to try out new things. My collegues takes the piss out of me because every &lt;del&gt;week&lt;/del&gt; day I come up with &amp;#8220;some new tool they &lt;em&gt;have&lt;/em&gt; to start using&amp;#8221; and so on.&lt;br /&gt;
As a matter of fact, I like reviewing software as well. I enjoy writing and analyzing new things, evaluating all the new possibilities they may offer, and I also tend to have a rather critical eye for what doesn&amp;#8217;t &lt;em&gt;feel&lt;/em&gt; right. I&amp;#8217;ll use a tool for months but still try out new ones which claim to do the same thing &#8212; but better &#8212; as they come out.&lt;br /&gt;
Unfortunately &#8212; or fortunately, depends how you look at it &#8212; when it comes to software, there are very few &lt;em&gt;silver bullets&lt;/em&gt;, and things keep changing: that&amp;#8217;s the way it is and the way it will be.&lt;/p&gt;
&lt;p&gt;I must try to write up a page (and ideally update it regularly, that&amp;#8217;s the hard part) listing all the tools I use, at some point&amp;#8230; but at any rate, if you coded some new app you think kicks ass or you found a hidden jewel in the labyrinth of freeware, just let me know: I&amp;#8217;ll definitely try it out, and if it&amp;#8217;s worth a post I&amp;#8217;ll blog about it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The same applies to books&lt;/strong&gt;, actually, as I like reading, especially those which are related to Ruby or programming, nowadays.&lt;/p&gt;
&lt;p&gt;The cost of such reviews and articles? Depends! Certainly I wouldn&amp;#8217;t mind donations or some compensation of some form, especially from publishers or software companies. It may be money, books, software or even nothing: it really depends on what I have to review.&lt;br /&gt;
Please be aware that I am &lt;strong&gt;not&lt;/strong&gt; doing this full time, and I already have a job and a fianc&#233;e to look after, but I&amp;#8217;ll do my best to publish as much as I can on my site or even elsewhere elsewhere [Note: on e-zines, magazines &amp;amp; similar, not on your brother&amp;#8217;s friend&amp;#8217;s mother-in-law&amp;#8217;s crappy blog!].&lt;/p&gt;
&lt;p&gt;For any inquiries, contact me (&lt;strong&gt;h3rald [&#8212;at&#8212;] h3rald.com&lt;/strong&gt;).&lt;/p&gt;</description>
      <pubDate>Fri, 14 Dec 2007 11:24:00 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/review-services/</guid>
      <link>http://www.h3rald.com/articles/review-services/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/review-services/#comments</comments>
      <category>review</category>
      <category>website</category>
      <category>personal</category>
      <category>tools</category>
      <category>books</category>
    </item>
    <item>
      <title>Back from holiday</title>
      <description>&lt;p&gt;I&amp;#8217;m back. I was so eager to go on holiday that I didn&amp;#8217;t even bother writing a post about it, too bad. I actually when on holiday for a week but I thought I&amp;#8217;d take three weeks off from my blog duties in favor of laziness and relax, but unfortunately my laptop decided to go wrong as well, so I didn&amp;#8217;t actually manage to relax that much.&lt;/p&gt;
&lt;p&gt;Now everything is fine. I still have to send in my laptop for assistance but it&amp;#8217;s usable at least, and I finally found the time (and the money) to buy a desktop PC. I always wanted to build my own, actually, but in the end I decided to opt for a pre-made Fujitsu Siemens, mainly for economic reasons and time constraints. I won&amp;#8217;t publish the specs, but it&amp;#8217;s alright for me and my fianc&amp;eacute;e.&lt;/p&gt;
&lt;p&gt;So what now? Well&amp;#8230; the usual: more posts will soon be added to the &lt;a href="/tags/simplyonrails"&gt;Simply On Rails&lt;/a&gt; series, a Ruby-related article is on the way (it will be edited by the excellent &lt;a href="http://www.cyberarmy.net"&gt;CyberArmy&lt;/a&gt; Publication Editing Staff this time), I may venture in a site upgrade whenever they decide to release version 4.2 of Typo which is supposed to be imminent and I&amp;#8217;ll eventually complete another pet project of mine, but that will take more time&amp;#8230;&lt;/p&gt;
&lt;p&gt;Stay tuned.&lt;/p&gt;</description>
      <pubDate>Thu, 30 Aug 2007 02:59:00 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/back-from-holiday/</guid>
      <link>http://www.h3rald.com/articles/back-from-holiday/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/back-from-holiday/#comments</comments>
      <category>personal</category>
      <category>website</category>
      <category>writing</category>
    </item>
    <item>
      <title>Simply on Rails - Part 1: Concepts and Bubbles</title>
      <description>&lt;p&gt;The first thing I do when I start developing a new application is write down some ideas.&lt;/p&gt;
&lt;p&gt;Pen and paper normally do the job, but nowadays there are some valid online and offline applications which work as good if not (probably) better.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve never been a fan of &lt;a href="http://en.wikipedia.org/wiki/Mind_Mapping"&gt;Mind Mapping&lt;/a&gt;. I&amp;#8217;ve been to a seminar on problem solving and creativity and they were showing how mind mapping can unleash your creativity, but it didn&amp;#8217;t really work for me. I found the concept-idea-concept-idea sequences a bit too restrictive for my liking.&lt;/p&gt;
&lt;p&gt;So I decided to try something different: bubbles! &lt;a href="http://www.bubbl.us/"&gt;Bubbl.us&lt;/a&gt; is an interesting online flash application which lets you create bubbles. You can create bubbles and relationships between them, change their color, their dimensions etc. And above all it&amp;#8217;s absolutely fun to use. I created two bubble sheets, the first one to define how content will be organized in the next version of ItalySimply:&lt;/p&gt;
&lt;p&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="450" height="340" id="bblviewer"&gt;&lt;br /&gt;
&lt;param name="movie" value="http://bubbl.us/sys/view.swf?sid=26306&amp;pw=yaeyI.megNtZcMTh3azVsVjhwVEt0TQ" /&gt;&lt;br /&gt;
&lt;param name="quality" value="high" /&gt;&lt;br /&gt;
&lt;param name="SeamlessTabbing" value="false" /&gt;&lt;br /&gt;
&lt;param name="AllowScriptAccess" value="always" /&gt;&lt;br /&gt;
&lt;param name="FlashVars" value="_sid=26306&amp;_title=ItalySimply%20v3%20-%20Content&amp;_z=75&amp;_pw=yaeyI.megNtZcMTh3azVsVjhwVEt0TQ" /&gt;&lt;br /&gt;
&lt;embed src="http://bubbl.us/sys/view.swf?sid=26306&amp;pw=yaeyI.megNtZcMTh3azVsVjhwVEt0TQ" FlashVars="_sid=26306&amp;_title=ItalySimply%20v3%20-%20Content&amp;_z=75&amp;_pw=yaeyI.megNtZcMTh3azVsVjhwVEt0TQ" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="450" height="340" allowscriptaccess="always" SeamlessTabbing="false" name="bblviewer"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;The diagram identifies three main types of content:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Houses &amp;#8211; basically what the site is about: house listing with information and pictures about houses for sale or rent.&lt;/li&gt;
	&lt;li&gt;Links &amp;#8211; Either swapped with partners or suggested by users.&lt;/li&gt;
	&lt;li&gt;Pages &amp;#8211; Static content.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;which will be organized in three different ways:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Tags&lt;/li&gt;
	&lt;li&gt;Categories&lt;/li&gt;
	&lt;li&gt;An internal search engine, allowing people to filter houses according to some criteria.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The other sheet focuses on relationships between content and users.&lt;/p&gt;
&lt;p&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="450" height="340" id="bblviewer"&gt;&lt;br /&gt;
&lt;param name="movie" value="http://bubbl.us/sys/view.swf?sid=26307&amp;pw=yaeyI.megNtZcMTgxeUw0S0FSNzhFNg" /&gt;&lt;br /&gt;
&lt;param name="quality" value="high" /&gt;&lt;br /&gt;
&lt;param name="SeamlessTabbing" value="false" /&gt;&lt;br /&gt;
&lt;param name="AllowScriptAccess" value="always" /&gt;&lt;br /&gt;
&lt;param name="FlashVars" value="_sid=26307&amp;_title=ItalySimply%20v3%20-%20Communication&amp;_z=75&amp;_pw=yaeyI.megNtZcMTgxeUw0S0FSNzhFNg" /&gt;&lt;br /&gt;
&lt;embed src="http://bubbl.us/sys/view.swf?sid=26307&amp;pw=yaeyI.megNtZcMTgxeUw0S0FSNzhFNg" FlashVars="_sid=26307&amp;_title=ItalySimply%20v3%20-%20Communication&amp;_z=75&amp;_pw=yaeyI.megNtZcMTgxeUw0S0FSNzhFNg" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="450" height="340" allowscriptaccess="always" SeamlessTabbing="false" name="bblviewer"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;At the far sides we have users and administrators, and in the middle how they interact between themselves or with content, in particular:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Users will be able to access house feeds and be notified automatically of new additions&lt;/li&gt;
	&lt;li&gt;Users will be able to ask questions or comments to each house (they&amp;#8217;ll be moderated, of course).&lt;/li&gt;
	&lt;li&gt;Users will be able to suggest links, or contact administrators using a &amp;#8220;House Preferences&amp;#8221; form or a more generic contact form.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bubbles are fun, but while I was creating these two diagrams, I felt I absolutely needed to name the relationships between each entity or concept, so I spend some time trying to find a tool who would let me do so in an easy and fast way.&lt;/p&gt;
&lt;p&gt;Yep, I needed to create a &lt;a href="http://en.wikipedia.org/wiki/Domain_model"&gt;domain model&lt;/a&gt; to move a bit closer to create the database architecture of the site.&lt;br /&gt;
It turns out that this magic tool exists, and it&amp;#8217;s free for non-commercial use: &lt;a href="http://cmap.ihmc.us/download/"&gt;CmapTools&lt;/a&gt;.&lt;br /&gt;
It&amp;#8217;s not web based, and it&amp;#8217;s a 59MB Java desktop application which can be used to create &lt;a href="http://en.wikipedia.org/wiki/Concept_map"&gt;Concept Maps&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Within minutes I was able to create a simple but pretty and functional enough domain model for my site:&lt;/p&gt;
&lt;p&gt;&lt;img src="/files/ItalySimply-v3_domain-model.jpg" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Basically all the concepts I used are going to become models, and all the named relationships will become model associations in Rails.&lt;/p&gt;
&lt;p&gt;Next step: database architecture.&lt;/p&gt;</description>
      <pubDate>Sat, 07 Jul 2007 05:43:00 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/simply-on-rails-1-concepts-map/</guid>
      <link>http://www.h3rald.com/articles/simply-on-rails-1-concepts-map/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/simply-on-rails-1-concepts-map/#comments</comments>
      <category>rails</category>
      <category>website</category>
      <category>web20</category>
    </item>
    <item>
      <title>Back on Track...</title>
      <description>&lt;p&gt;&amp;#8230;or better, on &lt;a href="http://www.rubyonrails.org"&gt;Rails&lt;/a&gt;_. &lt;br /&gt;
Yep, this 7th (!) version of the H3RALD website is powered by the overly-popular Ruby web framework &lt;em&gt;and&lt;/em&gt; by the &lt;a href="http://www.typosphere.org"&gt;Typo&lt;/a&gt; blogging platform.&lt;/p&gt;
&lt;p&gt;Nope, I decided not to re-develop my website entirely from scratch this time, although I was tempted to, for three simple reasons:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;My &amp;#8220;coding time&amp;#8221; is close to non-existent nowadays, and even with a framework like Rails re-developing a site from scratch would have taken at least &lt;em&gt;some&lt;/em&gt; time, which at the moment I don&amp;#8217;t have.&lt;/li&gt;
	&lt;li&gt;Typo is a fairly robust and feature-rich blogging platform, and after learning a little bit of Rails I could customize it to my needs straight away. URLs didn&amp;#8217;t break thanks to Rails&amp;#8217; routing system, migration was easy enough, and developing the missing bits (like a rudimentary BBCode parser and a TextLinkAds sidebar) wasn&amp;#8217;t hard at all.&lt;/li&gt;
	&lt;li&gt;I wanted to take a break from my site, not code it again.&lt;br /&gt;
&lt;em&gt;Fair enough, but why the new site anyway?&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Again, there&amp;#8217;s more than one answer:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Lately I didn&amp;#8217;t feel comfortable sporting a Cake-powered website \- that makes sense, to an extent, right? Good.&lt;/li&gt;
	&lt;li&gt;I got fed up with spam. I wanted to re-open comments but I didn&amp;#8217;t want to implement spam protection for the old site.&lt;/li&gt;
	&lt;li&gt;To be totally honest, I got fed up with &lt;span class="caps"&gt;PHP&lt;/span&gt; itself as well, after trying out Ruby for a few days and ordering  and reading the 2nd edition of the &lt;a href="http://www.pragmaticprogrammer.com/titles/ruby/"&gt;PickAxe&lt;/a&gt;, which I &lt;em&gt;highly&lt;/em&gt; recommend.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#8230;But let&amp;#8217;s say something about what&amp;#8217;s new in this new release, shall we?&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;A new, black (and red) theme. Something completely different. Probably not that good, but quite useful: Every day I check my site from my laptop at work, and if it looks like a big black blob I know that I have to regulate my monitor. I showed it to my parents on their old monitor, and they realized that perhaps it&amp;#8217;s time to buy an &lt;span class="caps"&gt;LCD&lt;/span&gt; one&amp;#8230;&lt;/li&gt;
	&lt;li&gt;Comments, trackbacks, desktop client support, theme support, a cool admin area and everything else Typo offers.&lt;/li&gt;
	&lt;li&gt;Full &lt;span class="caps"&gt;RSS&lt;/span&gt; feeds. With no ads. So you don&amp;#8217;t need to see this black blob anymore, if you really don&amp;#8217;t like it.&lt;/li&gt;
	&lt;li&gt;No projects or bookmarks, just my blog and my articles. Let&amp;#8217;s keep it simple.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More to come&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Fri, 22 Jun 2007 12:38:00 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/h3rald-v7-overview/</guid>
      <link>http://www.h3rald.com/articles/h3rald-v7-overview/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/h3rald-v7-overview/#comments</comments>
      <category>website</category>
      <category>rails</category>
    </item>
    <item>
      <title>Comments temporarily disabled</title>
      <description>&lt;p&gt;As a few of you might have noticed, I decided to disable comments on all the sections of this site, as a temporary measure against spam.&lt;/p&gt;
&lt;p&gt;Hopefully I&amp;#8217;ll try implementing something more effective and less drastic soon, but meanwhile this seems the quickest way to get rid of approx 600-800 spam comments per week.&lt;/p&gt;</description>
      <pubDate>Sun, 07 Jan 2007 05:53:00 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/41/</guid>
      <link>http://www.h3rald.com/articles/41/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/41/#comments</comments>
      <category>website</category>
    </item>
    <item>
      <title>Some updates</title>
      <description>&lt;p&gt;Quite a bit of time passed since the last blog post, and I&amp;#8217;m actually sorry about that, but as I thought, I don&amp;#8217;t have as much free time as I used to be. Work is work, after all!&lt;br /&gt;
This post will be multipurpose as actually I bluid up a few things to write about in the last few days&amp;#8230; erhm, ok, &lt;em&gt;weeks&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;New Website Design&lt;/h3&gt;
&lt;p&gt;Something different eh? Yep, definitely! Some time ago I started a small project called &lt;a href="http://base--/projects/view/h3rald-redesign"&gt;h3raLd.com Re-design&lt;/a&gt; hoping that some &lt;span class="caps"&gt;GFX&lt;/span&gt; guru could provide a new template for this website, and actually in the end I decided to accept the work of &lt;em&gt;&lt;strong&gt;Bartus F. Teipel&lt;/strong&gt;&lt;/em&gt; a Brazilian CakePHP enthusiast.&lt;br /&gt;
Bartus is obviously (&lt;span class="caps"&gt;MUCH&lt;/span&gt;) more talented than me when it comes to design, and I was amazed at the quality of the template he provided, in a really short time. &lt;br /&gt;
Unfortunately he didn&amp;#8217;t yet provide a link to his main website/portfolio, but for now all I can show you is his website for party pics, &lt;a href="http://www.circuscircus.com.br/"&gt;CircusCircus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The new template sports a more contemporary Web2.0-ish look which I like a lot, and Bartus used libraries like &lt;a href="http://prototype.conio.net/"&gt;prototype&lt;/a&gt;, &lt;a href="http://moofx.mad4milk.net/"&gt;moo.fx&lt;/a&gt; and &lt;a href="http://www.html.it/articoli/niftycube/index.html"&gt;Nifty Corners Cube&lt;/a&gt; for the &lt;span class="caps"&gt;AJAX&lt;/span&gt; effects and functionalities. &lt;br /&gt;
A really outstanding work, thanks Bartus!&lt;/p&gt;
&lt;h3&gt;The CakePHP Herald project has been completed&lt;/h3&gt;
&lt;p&gt;With my &lt;a href="http://www.h3rald.com/articles/view/cakephp-first-bite/"&gt;latest article&lt;/a&gt; about CakePHP published on SitePoint, the &lt;a href="http://base--/projects/view/cakephp-herald/"&gt;CakePHP Herald&lt;/a&gt; project was completed.&lt;br /&gt;
I must say that I really enjoyed writing all those articles about CakePHP, and the only thing I regret is not to have written anything (yet) about some more advanced topic about CakePHP. This was mostly due to &amp;#8211; again &amp;#8211; lack of time to focus on advanced topic and produce some quality examples.&lt;/p&gt;
&lt;p&gt;However, judging by the positive feedback I received about the articles, I am really happy of the final result: even more people discovered the power of CakePHP and became &lt;em&gt;bakers&lt;/em&gt;. Happy baking to all of you!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;So&amp;#8230; no more articles about Cake?&lt;/em&gt; Maybe not for a while, I think I&amp;#8217;ll be rather busy in the following months. Curious? Read on :-)&lt;/p&gt;
&lt;h3&gt;My biggest and most important project&lt;/h3&gt;
&lt;p&gt;I actually got really pissed off with Larry, Garret &amp;amp; the other Master Bakers because of what they wrote on the &lt;a href="http://cakeforge.org/forum/forum.php?forum_id=244"&gt;announcement&lt;/a&gt; for the latest CakePHP release:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;[&amp;#8230;]In other news, some new articles were published on Sitepoint &lt;sup class="footnote" id="fnr3"&gt;&lt;a href="#fn3"&gt;3&lt;/a&gt;&lt;/sup&gt; and in the International &lt;span class="caps"&gt;PHP&lt;/span&gt; magazine &lt;sup class="footnote" id="fnr4"&gt;&lt;a href="#fn4"&gt;4&lt;/a&gt;&lt;/sup&gt;. Fabio Cevasco &lt;sup class="footnote" id="fnr5"&gt;&lt;a href="#fn5"&gt;5&lt;/a&gt;&lt;/sup&gt; is the man behind these articles. Together with Fabio, we will be writing a book that will be published [&amp;#8230;]&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After all this time I spent &lt;em&gt;trying desperately not to say a word about it&lt;/em&gt; they came out and heralded it out of nowhere. Sigh&amp;#8230; they ruined the surprise effect! Oh well, it&amp;#8217;s too late now, isn&amp;#8217;t it?&lt;/p&gt;
&lt;p&gt;So yes, when I say that I&amp;#8217;m spending at least 60% of my time (at work and at home) writing I really mean it. The rest? Well, I do have a lovely girlfriend after all!!!&lt;/p&gt;</description>
      <pubDate>Tue, 25 Jul 2006 01:07:00 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/37/</guid>
      <link>http://www.h3rald.com/articles/37/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/37/#comments</comments>
      <category>website</category>
      <category>cakephp</category>
    </item>
    <item>
      <title>Writing more articles...</title>
      <description>&lt;p&gt;Yes, I know, I&amp;#8217;ve been slaking a little bit, and haven&amp;#8217;t posted on my blog in a while. Well, I actually &lt;em&gt;didn&amp;#8217;t&lt;/em&gt; slack at all in these days getting ready to start my job, looking for a damn fitted kitchen for my house and&amp;#8230; writing more articles.&lt;/p&gt;
&lt;p&gt;Nothing special, and nothing too technical, to be honest, but equally interesting. First of all I updated my &lt;a href="http://base--/articles/view/ie-lovers-guide-to-firefox/"&gt;An IE Lover&amp;#8217;s Guide to Firefox&lt;/a&gt; a little bit and people at SpreadFirefox.com and &lt;a href="http://www.firefoxfacts.com/"&gt;FirefoxFacts&lt;/a&gt; liked it. Glad to hear that, unfortunately some guy who wrote about &lt;a href="http://mywebpages.comcast.net/SupportCD/FirefoxMyths.html"&gt;Firefox Myths&lt;/a&gt; wasn&amp;#8217;t too impressed, but at any rate he read it anyway.&lt;/p&gt;
&lt;p&gt;OK, this wasn&amp;#8217;t a new article at all, but &lt;a href="http://base--/articles/view/the-internet-philosopher/"&gt;this one&lt;/a&gt; is fresh, at least. It&amp;#8217;s about a Swedish guy who decided to emigrate to India pursuing an ideal: writing for his own opinions and ideas. And he gets paid for that too! After reading more about him on his &lt;a href="http://base--/bookmarks/view/ropix"&gt;website&lt;/a&gt; I decided to write something about him. An interesting and rather unusual read. Pity that some sections of his homepage are in Swedish only.&lt;/p&gt;
&lt;p&gt;Finally, yesterday I felt inspired and decided to write &lt;a href="http://base--/articles/view/social-bookmarking-services"&gt;another roundup&lt;/a&gt; featuring ten popular social bookmarking websites. Trying all those services was fun, with a few exceptions of course. The bad news is that there are already various reviews about social bookmarking sites and thus the Digg folk doesn&amp;#8217;t seem to be particularly interested in &lt;a href="http://digg.com/software/Ten_popular_social_bookmarking_services_reviewed"&gt;reading another one&lt;/a&gt;, but hey! After all I can&amp;#8217;t expect of getting dugg for every roundup I write, can&amp;#8217;t I?&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s about it. And what about the CakePHP article I promised &lt;a href="http://base--/blog/view/13/"&gt;long ago&lt;/a&gt; to CakePHP beginners? It&amp;#8217;s done, written and ready to be published! Unfortunately the magazine I submitted it to is taking quite a bit to review it and &amp;#8211; most important &amp;#8211; to tell me whether they&amp;#8217;ll publish it or not. Let&amp;#8217;s hope for the best.&lt;/p&gt;</description>
      <pubDate>Sun, 14 May 2006 04:26:00 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/29/</guid>
      <link>http://www.h3rald.com/articles/29/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/29/#comments</comments>
      <category>website</category>
      <category>writing</category>
    </item>
    <item>
      <title>Birthday present? Web space, please...</title>
      <description>&lt;p&gt;Today is my birthday! &lt;a href="http://base--/blog/view/20/"&gt;Not too happy&lt;/a&gt;, but still my birthday after all. What presents did I get from my relatives and friends? Well, various things, but I told my parents and uncles I actually needed some web space&amp;#8230; &lt;em&gt;&amp;#8220;What? Didn&amp;#8217;t you have the hosting sorted out?&amp;#8221;&lt;/em&gt;&lt;br /&gt;
Well, I had, up to a few days ago when my friends and hosting provider, DeWayne Lehman, decided to close down his &lt;a href="http://www.block-house.com"&gt;company&lt;/a&gt;. The reason being, to cut a long story short, that he can&amp;#8217;t keep up with competition: he doesn&amp;#8217;t have enough customers, and he can&amp;#8217;t afford server upgrades, while other companies are literally giving space away.&lt;br /&gt;
That was a pity, not only because Block House used to host various non-profit orgs and initiatives, but also because the guy who run it was an excellent admin, always offering excellent support.&lt;/p&gt;
&lt;p&gt;Anyhow, in the end I&amp;#8217;ll have to transfer all five of my sites to a new host, so here we go again: &lt;em&gt;what&amp;#8217;s the best hosting company?&lt;/em&gt;&lt;br /&gt;
Obviously it depends a lot on what you&amp;#8217;re looking for, and here&amp;#8217;s what I need:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;At least 4GB of space&lt;/li&gt;
	&lt;li&gt;At least 30GB/month bandwidth&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt; of course, but also other languages like Perl, Python and Ruby (+ Rails support)&lt;/li&gt;
	&lt;li&gt;MySQL databases&amp;#8230; at least 10-20&lt;/li&gt;
	&lt;li&gt;Be able to host 5-6 sites minimum&lt;/li&gt;
	&lt;li&gt;Subdomains allowed (10 in total?)&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;FTP&lt;/span&gt; &lt;em&gt;and &lt;span class="caps"&gt;SSH&lt;/span&gt;&lt;/em&gt; access&lt;/li&gt;
	&lt;li&gt;Subversion, if possible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All this for less than 10$/month, ideally 5$, on shared hosting. I already made my choice and if you&amp;#8217;re reading this post it means everything worked fine, but anyway, let&amp;#8217;s have a look at what the market can offer for my needs. I only went for US-based hosts: Italian hosts are terrible and US hosts are normally more reliable and cheaper.&lt;/p&gt;
&lt;p style="float:left;"&gt;&lt;img src="http://base--/img/pictures/dreamhost.gif" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;The first hosting company I was tempted by was &lt;a href="http://www.dreamhost.com"&gt;DreamHost&lt;/a&gt;. They can literally sell you anything but their mother, at stupidly cheap rates for what you get (apparently):&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;20GB of space&lt;/li&gt;
	&lt;li&gt;1TB (!) bandwidth&lt;/li&gt;
	&lt;li&gt;PHP4, PHP5 Perl, Python and Ruby + RoR support&lt;/li&gt;
	&lt;li&gt;Unlimited databases&lt;/li&gt;
	&lt;li&gt;Unlimited hosted domains&lt;/li&gt;
	&lt;li&gt;Unlimited hosted subdomains&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;FTP&lt;/span&gt; and &lt;span class="caps"&gt;SSH&lt;/span&gt; access&lt;/li&gt;
	&lt;li&gt;Subversion and &lt;span class="caps"&gt;CVS&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&amp;#8230;and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For 7.95 if you pay two years in advance. And the first time you can get up to 97$ off by using one of the thousands referrer&amp;#8217;s coupons available on the net. OK, where&amp;#8217;s the catch? Well, there&amp;#8217;s a &lt;a href="http://futurosity.com/231/why-dreamhost-sucks"&gt;bad review&lt;/a&gt; about them which points out that their reliability is not too great, for example, and that the seem to be rather dodgy in general. &amp;#8220;They are overselling, they&amp;#8217;ll soon enforce &lt;span class="caps"&gt;CPU&lt;/span&gt; restrictions&amp;#8221; etc. etc. &lt;br /&gt;
&lt;em&gt;&amp;#8230;let&amp;#8217;s move along&lt;/em&gt;&lt;/p&gt;
&lt;p style="float:right;"&gt;&lt;img src="http://base--/img/pictures/rails.gif" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;I might try out Ruby on Rails someday, so perhaps I thought it would be wise to choose a host supporting it, for a change. The first Rails friendly I thought about was &lt;a href="http://www.railsplayground.org"&gt;RailsPlayground&lt;/a&gt;, which started off as &lt;span class="caps"&gt;FREE&lt;/span&gt; Rails host and then ended up offering interesting commercial hosting plans. They are not bad, and I&amp;#8217;d have probably gone with them if I had only one site to manage: for 60$ a year you get:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;3GB of space&lt;/li&gt;
	&lt;li&gt;30GB bandwidth&lt;/li&gt;
	&lt;li&gt;PHP4, PHP5 Perl, Python and Ruby + RoR support&lt;/li&gt;
	&lt;li&gt;Unlimited databases&lt;/li&gt;
	&lt;li&gt;Unlimited add-on domains&lt;/li&gt;
	&lt;li&gt;Unlimited hosted subdomains&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;FTP&lt;/span&gt; and &lt;span class="caps"&gt;SSH&lt;/span&gt; access&lt;/li&gt;
	&lt;li&gt;Subversion and &lt;span class="caps"&gt;CVS&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&amp;#8230;and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, the only reason why I didn&amp;#8217;t go with them was that I did slightly more space, only that. The plan for 5GB of space costs 11$/month, which was too expensive for my liking.&lt;/p&gt;
&lt;p style="float:left;"&gt;&lt;img src="http://base--/img/pictures/textdrive.gif" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Since we&amp;#8217;re talking about Rails, why not &lt;a href="http://www.textdrive.com"&gt;Textdrive&lt;/a&gt;? Founded by 200 IT professional, hosts high quality sites, it&amp;#8217;s the official Rails host&amp;#8230; An &amp;#8220;elite&amp;#8221; solution, here&amp;#8217;s what you get:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Use Apache and Lighttpd web servers side-by-side&lt;/li&gt;
	&lt;li&gt;Host PHP4 and PHP5 web pages and applications&lt;/li&gt;
	&lt;li&gt;Host a weblog using Textpattern, Wordpress, MovableType, Typo, etc&lt;/li&gt;
	&lt;li&gt;Host Ruby and Ruby on Rails applications (including &lt;span class="caps"&gt;FCGI&lt;/span&gt; and hundreds of gems)&lt;/li&gt;
	&lt;li&gt;Host Perl applications (including 100&amp;#8217;s of Perl modules)&lt;/li&gt;
	&lt;li&gt;Host Python applications like Django&lt;/li&gt;
	&lt;li&gt;Manage your code base with version control (Subversion, &lt;span class="caps"&gt;SVK&lt;/span&gt;, Darcs, Monotone &amp;amp; Arch)&lt;/li&gt;
	&lt;li&gt;Share iCal files over WebDAV&lt;/li&gt;
	&lt;li&gt;Mount a WebDAV drive on your desktop (like iDisk)&lt;/li&gt;
	&lt;li&gt;Easily create free subdomains with wildcard &lt;span class="caps"&gt;DNS&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;Store your Basecamp file uploads over &lt;span class="caps"&gt;SFTP&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;Access your account via &lt;span class="caps"&gt;SFTP&lt;/span&gt; and &lt;span class="caps"&gt;SSH&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;Add domains, unlimited &lt;span class="caps"&gt;IMAP&lt;/span&gt; and &lt;span class="caps"&gt;POP&lt;/span&gt; mail boxes and mail aliases through a control panel&lt;/li&gt;
	&lt;li&gt;Check your email through Webmail&lt;/li&gt;
	&lt;li&gt;Host Mailman mailing lists complete with archives&lt;/li&gt;
	&lt;li&gt;Use MySQL (default), PostgreSQL, SQLite and Berkeley databases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Plans start at 12$/month for 1GB of space and one website&amp;#8230; The 3GB one is 40$/month, for 20 sites in total. Too bad it&amp;#8217;s too expensive for me as they are truly the top for shared hosting &amp;#8211; I think.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.hostgator.com/"&gt;Host Gator&lt;/a&gt;, which seems to be one of the most frequently recommended at SitePoint.com forums, is not bad either. They have a &amp;#8220;hatchling&amp;#8221; plan for 3,5GB at 6.95, which wasn&amp;#8217;t bad, but it only allows one domain to be hosted. The &amp;#8220;Baby&amp;#8221; plan allows unlimited domains and is 9.95$/month, which is kinda dear. You get:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;5GB of space&lt;/li&gt;
	&lt;li&gt;75GB bandwidth&lt;/li&gt;
	&lt;li&gt;PHP4, PHP5 Perl and Python&lt;/li&gt;
	&lt;li&gt;Unlimited databases&lt;/li&gt;
	&lt;li&gt;Unlimited add-on domains&lt;/li&gt;
	&lt;li&gt;Unlimited hosted subdomains&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;FTP&lt;/span&gt; access&lt;/li&gt;
	&lt;li&gt;&amp;#8230;and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No &lt;span class="caps"&gt;SSH&lt;/span&gt;, no &lt;span class="caps"&gt;SVN&lt;/span&gt; and no Rails: out.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.site5.com/"&gt;Site5&lt;/a&gt; is also one of SitePoint&amp;#8217;s favourite, but still has limitations on the number of sites. I would have got the SuperHosting &lt;span class="caps"&gt;XTREME&lt;/span&gt;, for 7,77$/month:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;11GB of space&lt;/li&gt;
	&lt;li&gt;400GB bandwidth&lt;/li&gt;
	&lt;li&gt;PHP4, PHP5 Perl, Python, Ruby + RoR support&lt;/li&gt;
	&lt;li&gt;Unlimited databases&lt;/li&gt;
	&lt;li&gt;5 domains hosted&lt;/li&gt;
	&lt;li&gt;Unlimited hosted subdomains&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;FTP&lt;/span&gt; and &lt;span class="caps"&gt;SSH&lt;/span&gt; access&lt;/li&gt;
	&lt;li&gt;&amp;#8230;and more&lt;/li&gt;
&lt;/ul&gt;
Not bad, a little bit too much for only 5 sites&amp;#8230; I needed 6, too bad :/
&lt;div style="float:right; padding:3px;"&gt;&lt;script src="http://www.bluehost.com/src/js/h3rald/CODE2/488x160/1.jpg"&gt;&lt;/script&gt; &lt;/div&gt; &lt;p&gt;This site is currently hosted on &lt;a href="http://www.bluehost.com"&gt;BlueHost&lt;/a&gt;, a hosting company established in 1996, which seems to be reliable enough (not many complaints on the net) and seems serious enough. They don&amp;#8217;t offer subversion and WebDAV for &amp;#8220;security reasons&amp;#8221; and in order to get a shell account you have to send them a copy of an ID card. Annoying? Well, perhaps for some: this made me understand that they don&amp;#8217;t allow just anybody to get &lt;span class="caps"&gt;SSH&lt;/span&gt; access unconditionally, and I didn&amp;#8217;t mind. I sent them a scansion of my ID card and I got a friendly support email after a few minutes, confirming that it was activated. Here&amp;#8217;s what I got:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;15GB of space&lt;/li&gt;
	&lt;li&gt;400GB bandwidth&lt;/li&gt;
	&lt;li&gt;PHP4, PHP5 Perl, Python, Ruby + RoR support&lt;/li&gt;
	&lt;li&gt;20 MySQL databases + 10 PostgreSQL databases&lt;/li&gt;
	&lt;li&gt;6 domains hosted in one account (easier for me!)&lt;/li&gt;
	&lt;li&gt;20 subdomains + 20 parked domains&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;FTP&lt;/span&gt; and &lt;span class="caps"&gt;SSH&lt;/span&gt; access&lt;/li&gt;
	&lt;li&gt;&amp;#8230;and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For 6,65$/month, 2 years pre-payment. One of the good things is that they are not fussy about giving the money back if you cancel. Anyhow&amp;#8230; let&amp;#8217;s hope for the best, so far, so good.&lt;/p&gt;</description>
      <pubDate>Thu, 27 Apr 2006 12:47:00 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/21/</guid>
      <link>http://www.h3rald.com/articles/21/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/21/#comments</comments>
      <category>website</category>
      <category>review</category>
    </item>
    <item>
      <title>New site operative</title>
      <description>&lt;p&gt;Yes, it works. Perhaps it&amp;#8217;s a tiny bit slower than expected but the new h3raLd.com seems to work.&lt;br /&gt;
I&amp;#8217;ll probably find some new exciting bugs to fix in the next few hours, as usual &amp;#8211; that will be annoying but perfectly normal.&lt;/p&gt;
&lt;p&gt;&lt;del&gt;The good thing is that the new template seems to load faster, mostly due to the fact that I hardly used images&lt;/del&gt; &amp;lt;- [not true, te new site appears to be slower, maybe not due to the images], at any rate, let&amp;#8217;s see how it goes. I can imagine I&amp;#8217;ll have to implement some sort of caching system for the tagging system in particular, but fortunately &lt;a href="http://www.cakephp.org/"&gt;CakePHP&lt;/a&gt; apparently comes with a built-in caching mechanism for views, models etc. etc. although the documentation available seems to be &lt;a href="http://groups.google.com/group/cake-php/browse_thread/thread/f0f96751bb61bc7b/bcb43c97e91923c7?q=caching&amp;amp;rnum=1#bcb43c97e91923c7"&gt;scarce&lt;/a&gt; at the moment, and I&amp;#8217;ve been to lazy to investigate any further.&lt;/p&gt;</description>
      <pubDate>Thu, 06 Apr 2006 14:57:00 -0000</pubDate>
      <guid>http://www.h3rald.com/articles/8/</guid>
      <link>http://www.h3rald.com/articles/8/</link>
      <author>h3rald@h3rald.com</author>
      <comments>http://www.h3rald.com/articles/8/#comments</comments>
      <category>website</category>
      <category>webdevelopment</category>
      <category>cakephp</category>
    </item>
  </channel>
</rss>
