<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>root&#039;ing the net</title>
	<atom:link href="http://blogs.igalia.com/aperez/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.igalia.com/aperez</link>
	<description>Ramblings from a a coding sysadmin</description>
	<lastBuildDate>Sun, 07 Mar 2010 12:02:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Spanish and Galician dictionaries for Vim 7</title>
		<link>http://blogs.igalia.com/aperez/2010/01/spanish-and-galician-dictionaries-for-vim-7/</link>
		<comments>http://blogs.igalia.com/aperez/2010/01/spanish-and-galician-dictionaries-for-vim-7/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 16:05:04 +0000</pubDate>
		<dc:creator>aperez</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Toolchain]]></category>

		<guid isPermaLink="false">http://blogs.igalia.com/aperez/?p=120</guid>
		<description><![CDATA[If you write long, literary text (like end-user documentation) in Spanish and/or Galician, and Vim 7 is your editor of choice, you may want to download the spell checker dictionaries for those languages. To use them, drop the files under ~/.vim/spell. (By the way, you may need to create the directory if needed).
To use the dictionaries, just type [...]]]></description>
			<content:encoded><![CDATA[<p>If you write long, literary text (like end-user documentation) in Spanish and/or Galician, and <a href="http://www.vim.org">Vim</a> 7 is your editor of choice, you may want to download the <a href="http://people.igalia.com/aperez/vim.html">spell checker dictionaries for those languages</a>. To use them, drop the files under <tt>~/.vim/spell</tt>. (By the way, you may need to create the directory if needed).</p>
<p>To use the dictionaries, just type in the needed Ex command, e.g. for Galician that would be:</p>
<pre>  :set spell spelllang=gl</pre>
<p>If you use modelines in your text files, you may want to add those settings there as well. That makes an easy way to choose a different language for each file. Also, do not forget to take a look at the <a href="http://vimdoc.sourceforge.net/htmldoc/spell.html">spell checker documentation</a> to learn more about it (tip: some keybindings are really useful).</p>
<p>Note that you will only be able of editing UTF-8 texts. I have not crafted ISO-8859-1 versions of the dictionary tables because no single person should be using an encoding different from UTF-8 nowadays (for a <a href="http://developers.sun.com/dev/gadc/technicalpublications/articles/utf8.html">number</a> of <a href="http://www.tbray.org/ongoing/When/200x/2003/04/06/Unicode">good reasons</a>). If someone has a strong need for ISO-encoded tables, please let me know.</p>
<p>Last but not least, let me stress that the dictionaries were converted from the ones used by <a href="http://www.openoffice.org">OpenOffice.org</a> plus some small patches I took from the Vim SVN repository. Big thanks go to the all the people working in both projects. I am not an expert with legal stuff, but as the source files are under the <a href="http://www.gnu.org/copyleft/lesser.html">LGPL</a> I think it is safe to assume that the Spanish and Galician dictionaries generated from them are LGPL&#8217;d, too.</p>
<p>Remember: it is always good to deliver well-written documents. Happy 2010 <img src='http://blogs.igalia.com/aperez/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.igalia.com/aperez/2010/01/spanish-and-galician-dictionaries-for-vim-7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Python recipe: Functional config file parsing</title>
		<link>http://blogs.igalia.com/aperez/2009/12/python-recipe-functional-config-file-parsing/</link>
		<comments>http://blogs.igalia.com/aperez/2009/12/python-recipe-functional-config-file-parsing/#comments</comments>
		<pubDate>Sat, 12 Dec 2009 02:17:54 +0000</pubDate>
		<dc:creator>aperez</dc:creator>
				<category><![CDATA[Recipes]]></category>

		<guid isPermaLink="false">http://blogs.igalia.com/aperez/?p=103</guid>
		<description><![CDATA[Update: Use file directly for iteration instead of readlines() method.
Update: Added a note regarding how to do simple error handling.
Sometimes one has to parse programmatically some file containing key=value pairs. In the world of systems administration this means configuration files most of the time. Also, one thing I like is functional programming, but in the [...]]]></description>
			<content:encoded><![CDATA[<p><em><strong>Update:</strong> Use file directly for iteration instead of <tt>readlines()</tt> method.</em></p>
<p><em><strong>Update:</strong> Added a note regarding how to do simple error handling.</em></p>
<p>Sometimes one has to parse programmatically some file containing <tt>key=value</tt> pairs. In the world of systems administration this means configuration files most of the time. Also, one thing I like is <a href="http://en.wikipedia.org/wiki/Functional_programming">functional programming</a>, but in the real world one ends up making almost all of the code in <a href="http://en.wikipedia.org/wiki/Imperative_programming">imperative</a> style. Python allows some functional constructs, and sometimes I like to use them to make code most concise, because it express better what the code is trying to do or just because I wanted to melt my mind doing some functional tricks.</p>
<p>First, let me introduce the code:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">itertools</span> <span style="color: #ff7700;font-weight:bold;">import</span> imap, ifilter
&nbsp;
config_items = <span style="color: #ff7700;font-weight:bold;">lambda</span> iterable: \
    imap<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: black;">&#40;</span>k, v<span style="color: black;">&#41;</span>: <span style="color: black;">&#40;</span>k.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, v.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
        imap<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> s: s.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;=&quot;</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>,
            ifilter<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> s: s <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> s.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;#&quot;</span><span style="color: black;">&#41;</span>,
                imap<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> s: s.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, iterable<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Neat, huh? As promised in the title, this is functional. And yes, I am aware of <a href="http://docs.python.org/library/configparser.html">ConfigParser</a>, but I do not need its full power, and also I have found some problems with files containing <a href="http://en.wikipedia.org/wiki/Unicode">Unicode</a> strings.</p>
<p>I think this is one of the most beautiful snippets of code I have ever written in Python: it makes just one thing well, and it is terse and concise. Moreover, it is quite easy to explain.</p>
<h4>How does it work</h4>
<p>I have just written that it is easy to explain how this works. Okay, I will dissect this beast one line at a time, starting at the innermost. But first, a quick introduction to <tt>imap()</tt> and <tt>ifilter</tt>:</p>
<ul>
<li><strong><tt>imap()</tt></strong>: Works like <tt>map()</tt>, which returns a list whose contents are the results of applying a function (first argument) to each of the elements of another list (the second argument). The difference is that <tt>imap()</tt> uses <a href="http://www.python.org/dev/peps/pep-0289/">generators</a> instead.</li>
<li><strong><tt>ifilter()</tt></strong>: This one works like <tt>filter()</tt> and will also return a list, whose contents are the items of another list (second argument) for which the result of calling the given function (first argument) is <tt>True</tt>. This one also works with generators.</li>
</ul>
<p>Now, let us start with the first one:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">imap<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> s: s.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, iterable<span style="color: black;">&#41;</span></pre></div></div>

<p>This picks each line, and removes whitespace sitting at the left and and the right of the string.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">ifilter<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> s: s <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #ff7700;font-weight:bold;">not</span> s.<span style="color: black;">startswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;#&quot;</span><span style="color: black;">&#41;</span>,</pre></div></div>

<p>We want to keep <em>interesting</em> lines: empty lines and comment-lines starting with a hash mark (<tt>#</tt>) must be thrashed away. We check for lines which <em>both</em> are not empty and that do not start with a hash-mark.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">imap<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> s: s.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;=&quot;</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>,</pre></div></div>

<p>That one picks each string and splits it at the first <tt>=</tt> character, thus separating the key from the value. This is what converts each string into a <tt>(key, value)</tt> tuple.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">imap<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: black;">&#40;</span>k, v<span style="color: black;">&#41;</span>: <span style="color: black;">&#40;</span>k.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, v.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,</pre></div></div>

<p>This is the last remaining detail: Removes extra leading and trailing whitespace from the keys and values of the generated tuples. This is needed for removing the spaces around the <tt>=</tt> character.</p>
<h4>How to use it</h4>
<p>Fire in the interpreter, type in (or copy-and-paste) the above code and guess by yourself:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> text = <span style="color: #483d8b;">&quot;&quot;&quot;a = 1
... b = this is b&quot;&quot;&quot;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">tuple</span><span style="color: black;">&#40;</span>config_items<span style="color: black;">&#40;</span>text.<span style="color: black;">splitlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'a'</span>, <span style="color: #483d8b;">'1'</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">'b'</span>, <span style="color: #483d8b;">'this is b'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>config_items<span style="color: black;">&#40;</span>text.<span style="color: black;">splitlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span><span style="color: #483d8b;">'a'</span>: <span style="color: #483d8b;">'1'</span>, <span style="color: #483d8b;">'b'</span>: <span style="color: #483d8b;">'this is b'</span><span style="color: black;">&#125;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span></pre></div></div>

<p>So you pass it <strike>a list</strike> an iterable which yields lines, and it will return another iterable, which yields <tt>(key, value)</tt> tuples. Thanks to how <tt>dict()</tt> is defined, we can directly pass the result to it and get a dictionary.</p>
<p>But it would be useful as well to use it on files, so here we go:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">file</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;test.conf&quot;</span>, <span style="color: #483d8b;">&quot;w&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span>text<span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>config_items<span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;test.conf&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span><span style="color: #483d8b;">'a'</span>: <span style="color: #483d8b;">'1'</span>, <span style="color: #483d8b;">'b'</span>: <span style="color: #483d8b;">'this is B'</span><span style="color: black;">&#125;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span></pre></div></div>

<p>For your convenience, you may want to define a helper function if it makes you feel more comfortable:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">def</span> config_file_items<span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>:
...    <span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">file</span><span style="color: black;">&#40;</span>path, <span style="color: #483d8b;">&quot;rU&quot;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> f:
...        <span style="color: #ff7700;font-weight:bold;">return</span> config_items<span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span>
...
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>config_file_items<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;test.conf&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span><span style="color: #483d8b;">'a'</span>: <span style="color: #483d8b;">'1'</span>, <span style="color: #483d8b;">'b'</span>: <span style="color: #483d8b;">'this is B'</span><span style="color: black;">&#125;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span></pre></div></div>

<h4>Extra niceties</h4>
<p>I have already mentioned that this code uses <a href="http://www.python.org/dev/peps/pep-0289/">generators</a> in its entirety. What is passed from one function to another in the chain of <tt>imap()</tt> and <tt>ifilter()</tt> calls are <em>always</em> generators. This means that if <tt>config_items()</tt> is used to read a big file (e.g. some hundreds of megabytes) <em>only one line is in memory at a given time</em>. This is why I did not use <tt>map()</tt> and <tt>filter()</tt> but their “incremental” counterparts from the <tt>itertools</tt> module. So the bottom line is that this may not be the most efficient implementation out there, but it is good and is capable of working over arbitrarily long sequences of data while the function remains small and understandable.</p>
<h4>Error Handling</h4>
<p>Whenever the input is not well formed, then this function will raise <tt>ValueError</tt> when a <tt>=</tt> character is not found in some line. This means that you can do something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">try</span>:
    items = <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span>config_items<span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">stdin</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">ValueError</span>:
    <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">SystemExit</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Malformed 'key=value' input in standard input&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Of course more elaborate error checking could be done i.e. to be able of showing to the user the exact offending line number, but the goal is to keep things as simple as possible. Also the syntax of those simple configuration files is so simple that it should be fairy simple for the user to spot typos.</p>
<h4>Final words and advice</h4>
<p>My advice is that if you have the possibility, make your Python code in such a way that it uses generators, unless you are sure that it will <em>always</em> handle reasonably small amounts of data.</p>
<p>I hope that things are explained well enough, and (who knows!) maybe this can help someone to better understand why generators are a good idea. I will also be happy if you came here looking for some code to parse simple configuration files and this did the trick for you <img src='http://blogs.igalia.com/aperez/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.igalia.com/aperez/2009/12/python-recipe-functional-config-file-parsing/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Branching, merging, rebasing&#8230;</title>
		<link>http://blogs.igalia.com/aperez/2009/11/branching-merging-rebasing/</link>
		<comments>http://blogs.igalia.com/aperez/2009/11/branching-merging-rebasing/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 18:25:46 +0000</pubDate>
		<dc:creator>aperez</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://blogs.igalia.com/aperez/?p=98</guid>
		<description><![CDATA[
The image at the left is exactly what Giggle shows in this very precise moment for one of my coding projects. I think this is the most complex commit graph I have seen during my occassional coding tasks&#8230; This is how Git is supposed to be used: a branch per feature, and small atomic commits. Definitely [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-97" style="border: 1px solid black;" title="Giggle Graph" src="http://blogs.igalia.com/aperez/wp-content/uploads/2009/11/graph.png" alt="Giggle Graph" width="125" height="652" /></p>
<p>The image at the left is exactly what <a href="http://live.gnome.org/giggle">Giggle</a> shows in this very precise moment for one of my coding projects. I think this is the most complex commit graph I have seen during my occassional coding tasks&#8230; <span style="background-color: #ffffff;">This is how <a href="http://git.or.cz">Git</a> is supposed to be used: a branch per feature, and small atomic commits. Definitely I like this way of working <img src='http://blogs.igalia.com/aperez/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </span></p>
<p><span style="background-color: #ffffff;">(This post is no more a small coding break&#8230; just to leave some neurons rest before reclaiming them back <img src='http://blogs.igalia.com/aperez/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> )</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.igalia.com/aperez/2009/11/branching-merging-rebasing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Running older (pre-etch) Debian releases</title>
		<link>http://blogs.igalia.com/aperez/2009/11/running-older-pre-etch-debian-releases/</link>
		<comments>http://blogs.igalia.com/aperez/2009/11/running-older-pre-etch-debian-releases/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 11:16:46 +0000</pubDate>
		<dc:creator>aperez</dc:creator>
				<category><![CDATA[Recipes]]></category>
		<category><![CDATA[Systems]]></category>

		<guid isPermaLink="false">http://blogs.igalia.com/aperez/?p=93</guid>
		<description><![CDATA[This post is quick public information service for everyone using, or having to deal with old Debian releases. This includes all releases prior to Etch: Woody, Sarge, Potato&#8230;
You have probably noticed that you cannot longer use APT to install packages in your system.
The package repositories have been moved over to archive.debian.org, so you will need [...]]]></description>
			<content:encoded><![CDATA[<p>This post is quick public information service for everyone using, or having to deal with old Debian releases. This includes <em>all</em> releases prior to Etch: Woody, Sarge, Potato&#8230;</p>
<p>You have probably noticed that you cannot longer use APT to install packages in your system.<br />
The package repositories have been moved over to <a href="http://archive.debian.org/">archive.debian.org</a>, so you will need to change your <tt>/etc/apt/sources.list</tt> accordingly. For Sarge, you would use:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">deb http:<span style="color: #000000; font-weight: bold;">//</span>archive.debian.org<span style="color: #000000; font-weight: bold;">/</span>debian sarge main contrib non-free
deb http:<span style="color: #000000; font-weight: bold;">//</span>archive.debian.org<span style="color: #000000; font-weight: bold;">/</span>debian-security sarge<span style="color: #000000; font-weight: bold;">/</span>updates main contrib non-free</pre></div></div>

<p>You may even use archived repository of <a href="http://backports.org">backports.org</a> of Sarge, adding a line like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">deb http:<span style="color: #000000; font-weight: bold;">//</span>archive.debian.org<span style="color: #000000; font-weight: bold;">/</span>backports.org sarge-backports main contrib non-free</pre></div></div>

<p>This way one can inject some fresh air into an existing Debian setup if making a full system upgrading is not an option for you.</p>
<p>Have a lot of fun&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.igalia.com/aperez/2009/11/running-older-pre-etch-debian-releases/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Factor out your Apache-fu with mod_macro</title>
		<link>http://blogs.igalia.com/aperez/2009/10/factor-out-your-apache-fu-with-mod_macro/</link>
		<comments>http://blogs.igalia.com/aperez/2009/10/factor-out-your-apache-fu-with-mod_macro/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 11:23:43 +0000</pubDate>
		<dc:creator>aperez</dc:creator>
				<category><![CDATA[Recipes]]></category>
		<category><![CDATA[Systems]]></category>

		<guid isPermaLink="false">http://blogs.igalia.com/aperez/?p=89</guid>
		<description><![CDATA[For nearly all HTTP-serving related work, our software of choice is the Apache web server. Lately, we have been moving some old setups which were still running Apache 1.3 to the latest version in the 2.x series. This may be a lot of work when the number of virtual hosts you are serving is far [...]]]></description>
			<content:encoded><![CDATA[<p>For nearly all HTTP-serving related work, our software of choice is the <a href="http://httpd.apache.org/">Apache</a> web server. Lately, we have been moving some old setups which were still running Apache 1.3 to the latest version in the 2.x series. This may be a lot of work when the number of virtual hosts you are serving is far from low, or if you have some lengthy, repetitive configuration blocks which must be modified everytime you want introduce some change. One may be tempted to auto-generate configuration snippets from something else using some quick Bash/Perl/Python/Whatever script, but there is a more elegant solution: meet <a href="http://www.cri.ensmp.fr/~coelho/mod_macro/">mod_macro</a>.</p>
<p>As the name suggests, it is an Apache 2.x module which allows for defining snippets with customizable optional parameters. Take this real-world example from <tt>/etc/apache2/mods-available/macro.conf</tt>:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Macro</span> AuthLDAPSetup $group<span style="color: #000000; font-weight: bold;">&gt;</span></span>
  AuthType basic
  AuthBasicProvider ldap
  AuthLDAPUrl ldap://ldap.local/dc=yoursite,dc=com?uid
  AuthLDAPGroupAttribute uniqueMember
  AuthLDAPGroupAttributeIsDN On
  Require ldap-group cn=$group,ou=Group,dc=yoursite,dc=com
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Macro<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>This is a common setup in most of our services, so now everytime one wants to add autentication against the LDAP server, it is only a matter of adding an <tt>Use</tt> clause in the proper place:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;VirtualHost</span> *:443<span style="color: #000000; font-weight: bold;">&gt;</span></span>
  # Virtual host configuration cruft skipped from example!
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Location</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    Use AuthLDAPSetup wwwusers
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Location<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/VirtualHost<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Ta-da! This is 5 lines shorter, and less error-prone. Also, if some day some extra configuration is needed to authenticate using LDAP, it is enough to change the macro definition, and changes will be automatically propagated to all places where it is used.</p>
<p>Wrapping up, you may consider installing <a href="http://www.cri.ensmp.fr/~coelho/mod_macro/">mod_macro</a> in your Apache installs for the following reasons:</p>
<ul>
<li><span style="background-color: #ffffff;">Greatly simplifies repeated code snippets in configuration files.</span></li>
<li><span style="background-color: #ffffff;">It is integrated with the web server: no external tools are needed.</span></li>
<li><span style="background-color: #ffffff;">Is especially useful to make changes to big sites in a single shot.</span></li>
<li><span style="background-color: #ffffff;">Does not add overhead to request processing, only to initial configuration file parsing at server startup.</span></li>
<li><span style="background-color: #ffffff;">It is simple enough to learn and use in a couple of minutes.</span></li>
</ul>
<p> <img src='http://blogs.igalia.com/aperez/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.igalia.com/aperez/2009/10/factor-out-your-apache-fu-with-mod_macro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Two months after&#8230;</title>
		<link>http://blogs.igalia.com/aperez/2009/09/two-months-after/</link>
		<comments>http://blogs.igalia.com/aperez/2009/09/two-months-after/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 10:10:29 +0000</pubDate>
		<dc:creator>aperez</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Systems]]></category>
		<category><![CDATA[Toolchain]]></category>

		<guid isPermaLink="false">http://blogs.igalia.com/aperez/?p=85</guid>
		<description><![CDATA[Two months have passed after my last post, and things here have been quieter than usual in this blog, but the world kept moving in the meanwhile so there are some things to tell, and some other that have already been told. Probably the most exciting thing for me and my work mates was the [...]]]></description>
			<content:encoded><![CDATA[<p>Two months have passed after my last post, and things here have been quieter than usual <em>in this blog</em>, but the world kept moving in the meanwhile so there are some things to tell, and some other that have already been told. Probably the most exciting thing for me and my <a href="http://planet.igalia.com">work mates</a> was the announcement of the shiny <a href="http://maemo.nokia.com/n900/">Nokia N900</a>. I have resisted the temptation then, because <a href="http://www.joaquimrocha.com/2009/08/27/the-first-maemo-powered-phone/">a lot</a> <a href="http://blogs.igalia.com/berto/2009/08/27/n900-a-great-milestone-for-the-free-software-community/">of things</a> <a href="http://blogs.igalia.com/jasuarez/2009/08/27/nokia-n900-released/">have already</a> <a href="http://www.gnome.org/~csaavedra/news-2009-08.html#D27">been said</a> about it. We systems administrators are usually in the shadows, but even so it is a delight working as backing support for people who does big things.</p>
<p>There were a couple of releases this week what are a great example of why Igalia reached its eighth year, and we are still <a href="http://www.youtube.com/watch?v=3WZ0UmfGvUA">rockin&#8217; in the free world</a>:</p>
<ul>
<li><a href="http://gitorious.org/hildon/hildon/commit/1c7a2f76f9d348388210ab0c880de5624eff52cd">Hildon 2.2.0</a>, the user interface toolkit used in Maemo. No words are needed to explain <a href="http://www.youtube.com/watch?v=IHa3AoNdglY">how awesome</a> is this!</li>
<li>Also, some of my work mates are fine-tuning <a href="https://garage.maemo.org/projects/mafw/">MAFW</a> after bringing it to life in order to provide multimedia coolness to Maemo, and (who knows!) maybe the desktop as well. Of course all built on top of the lovely <a href="http://gstreamer.freedesktop.org/">GStreamer</a> libraries.</li>
<li><a href="http://library.gnome.org/misc/release-notes/2.28/">GNOME 2.28</a>, which includes the hard work from a lot of work in form all around the world, and a revamped Epiphany web browser which uses <a href="http://webkitgtk.org">WebKitGTK+</a> as the rendering engine. This means that some of my colleguaes have been <a href="http://static.squidoo.com/resize/squidoo_images/-1/draft_lens2278160module12474251photo_1226015948domo-kitten.jpg">killing kitties</a> and their <a href="http://blogs.gnome.org/xan/2009/09/08/the-show-so-far/">hard work</a> will be deployed in every GNOME install!</li>
<li><a href="http://blogs.igalia.com/mario/2009/06/05/frogr-flickr-remote-organizer-for-gnome/">Frogr 0.1</a>, a tool which carries out out the simple (but important) task of uploading pictures to Flickr, and it is doing a fine task for me right now.</li>
<li>In the operating systems ground, <a href="http://www.haiku-os.org">Haiku</a> <a href="http://www.haiku-os.org/news/2009-09-13_haiku_project_announces_availability_haiku_r1alpha_1">R1 Alpha 1 has been released</a>. This may sound like “some other hobbyist operating system”, but it is a lot more than that: it is a new life for the mighty <a href="http://en.wikipedia.org/wiki/BeOS">BeOS</a> R5, which  took eight years to to bring from the dead. I have played a bit with the live CD: the experience is great, although somw rough edges still exist, but I would say that Haiku contains lots of superb work and I am eager to install it in some real hardware.</li>
</ul>
<p>But more changes apart from software releases happened: in a more personal note, I am now using <a href="http://fedoraproject.org/">Fedora 11</a> in a daily basis at my laptop. Initially I wanted to try out <a href="http://www.foresightlinux.org/">Foresight</a>, because the <a href="http://wiki.rpath.com/wiki/Conary">Conary</a> package manager looks like an interesting piece of software, but unfortunately the installer does not have support for LUKS-encrypted volumes in the installer, and I did not want to bootstrap it manually. Interestingly enough, Fedora <em>does</em> have such support using the same Anaconda installer. I did not like Fedora back in version 6, but I must admit that the community did an impressive improvement (at least comparing version 6 to version 11!) and I am very happy with my current setup. I am even considering Fedora 11 for installing it on my brand new PlayStation 3: I bought one of the old “fat” models, because the new “slim” ones do not officially support installing third-party operating systems.</p>
<p>Finally, a quick note to finish this “I am alive” post: I am glad that we have decided to push <a href="http://linux-vserver.org">Linux-vServer</a> in our servers, because we are getting some interesting benefits thanks to it, being the main one the ability to easily clone a running machine and use the clone for testing purposes before applying changes in the production environment. Also, we are now able of easily provide sandboxed environments in which users have almost-full administrative privileges without having to worry about other services being affected in case something goes wrong. And we are getting those niceties with a minimal overhead (~1.5%) in terms of kernel CPU usage. As we are moving services which were previously run on physical machines into virtual machines, we are saving power and contributing to the environment while providing a better service and support to our staff <img src='http://blogs.igalia.com/aperez/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.igalia.com/aperez/2009/09/two-months-after/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>More DebConf9 adventures</title>
		<link>http://blogs.igalia.com/aperez/2009/08/more-debconf9-adventures/</link>
		<comments>http://blogs.igalia.com/aperez/2009/08/more-debconf9-adventures/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 23:40:14 +0000</pubDate>
		<dc:creator>aperez</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://blogs.igalia.com/aperez/?p=71</guid>
		<description><![CDATA[Now it looks like it is time to complete my previous post about DebConf9, after a tiresome journey back from Cáceres to Coruña the 30th, an Igalia assembly the 31st (the first one ever for me  ), and sleeping for more than 14 hours today.
Fortunately I did not need to travel alone, as Diego [...]]]></description>
			<content:encoded><![CDATA[<p>Now it looks like it is time to complete my <a href="/aperez/2009/07/1st-day-at-debconf9/">previous post about DebConf9</a>, after a tiresome journey back from Cáceres to Coruña the 30th, an <a href="http://blogs.igalia.com/agomez/2008/10/22/igalia-is-yours/">Igalia assembly</a> the 31st (the first one ever for me <img src='http://blogs.igalia.com/aperez/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> ), and sleeping for more than 14 hours today.</p>
<p>Fortunately I did not need to travel alone, as <a href="http://blogs.gnome.org/diegoe/">Diego</a> came with me to visit Coruña and the journey was more enjoyable than the other way around. To make the most out of the occasion, we followed an alternative route via  <a href="http://en.wikipedia.org/wiki/Ciudad_Rodrigo">Ciudad Rodrigo</a> (where we had lunch and bought some red wine, olive oil, and <a href="http://en.wikipedia.org/wiki/Embutido">Iberian “embutido”</a>: chorizo, salchichón and cured loin), then <a href="http://en.wikipedia.org/wiki/Porto">Porto</a> (where we saw the bridges by Gustave Eiffel and his disciples), <a href="http://en.wikipedia.org/wiki/Valen%C3%A7a,_Portugal">Valença do Minho</a> (where we bought some goods which are sold in Portugal: salted butter, cheese, coffee, <a href="http://en.wikipedia.org/wiki/Guava">guava</a> jelly&#8230;) and finally we made a longer stop at <a href="http://en.wikipedia.org/wiki/Santiago_de_compostela">Santiago de Compostela</a> in order to see the cathedral and the old town area while eating a sandwich. It took some time to complete the trip, but was far funnier that going alone to Cáceres.</p>
<p>But going back on to DebConf9, here is the rest of my batch of lectures and events, including summaries of them:</p>
<ul>
<li><a href="https://penta.debconf.org/dc9_schedule/events/374.en.html">Free travel instead of free beer</a>: Very nice presentation of photographs from <em>all</em> past DebConf and FLOSS related events, by Andreas Tille who has attended loads of them! This was a quite relaxing event, and the people there made the thing more enjoyable by telling the others about anecdotes and funny things about the places and the things which happened all along the world in past conferences.</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/409.en.html">Stable/Volatile/Backports ecosystem</a>: This was a nice chat trying to define how the different Debian repositories should interact between each other. I think that the nicer part was including the not-so-official <a href="http://backports.org/">backports.org repositories</a>, but nothing has been said about including <a href="http://debian-multimedia.org/">debian-multimedia</a>. It is a good thing to be coherent with the <a href="http://www.debian.org/social_contract#guidelines">DFSG</a> and being picky with which packages are actually in the main repository, but in my opinion something should be done to support <em>the packages the users want</em> in some way, including debian-multimedia as well.</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/382.en.html">Qemu for Debian developers</a>: Not something which could be considered astonishing, but I have learned a couple of nice Qemu tricks with this. This was an interesting introduction for people wanting to make packages for architectures different than the one they are running.</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/409.en.html">Drowning in bugs</a>: This was an extremely interesting chat about how it would be possible to actually get people to do <a href="http://nedbatchelder.com/text/triaging.html">bug triaging</a> in Debian. Some solutions were outlined, like having some kind of teams for people to belong to, so they get at least some social recognition (e.g. “look, I am part of the Debian Foo-Bar Bugsquad” and the like), adding a score meter to the BTS like in the <a href="http://bugs.gnome.org">Gnome Bugzilla</a> and so on. I think that <a href="http://wiki.debian.org/SummerOfCode2007/DebbugsWebUI">something</a> which <span style="text-decoration: line-through;">should</span> is being cooked right now will help a lot with this.</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/444.en.html">Libvirt, hypervisor independent virtual machine management</a>: I heard before about <a href="http://libvirt.org/">libvirt</a>, but have always thought that it looked like an unneccessary layer of indirection about <a href="http://linux-vserver.org/">THE virtualization technology</a> you want to use. The facts are that it does not have Linux-vServer support (well, it <a href="http://www.redhat.com/archives/libvir-list/2008-January/msg00097.html">might</a>) and that one gets an interesting feature: remote management of virtual machines. Does that feature that pose much differences from using SSH to open a remote session? Probably if you use <a href="http://www.qemu.org/">Qemu</a> and/or <a href="http://www.xen.org/">Xen</a>, but I do not see the point of having the additional hassle of another software layer.</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/459.en.html">Debian Redesign</a>: Agnieszka aka “pixelgirl” proposed a new design for some stuff related to Debian, logo, colours, fonts and website. Some minor work for boot splash screens and is also there in the pack. It was funny to see how people asked questions about the openness of the license of the new font used for the logo, when the <a href="http://wiki.debian.org/DebianLogo">old one</a> has a commercial one&#8230; I hope that she does not get annoyed too much by the rest of the community, because I also think there is a <em>real</em> and <em>urgent</em> need to give some love to how things look in Debian. And having people which has the neccessary knowledge to properly design nice things is great, so the community should support her.</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/434.en.html">State of the Bug Tracking System</a>: Don Armstrong was making some improvements and cleanups to the old <tt>debbugs</tt> big code clean-up, and presented to the public one new feature which allows to mirror the state of the BTS and run a local copy. This made all the audience clap hands like crazy, as this allows for speedier operations, especially for searching and filtering in reports.</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/429.en.html">Introducing DebConf10</a>: New York will held the next DebConf, which will be also the 10th anniversary of the event. The main venue will be at the <a href="http://www.columbia.edu/">Columbia University</a> which looks great for such a thing. The main issue could be problems for people living in certain countries to get a visa so they can travel there the next year, so the organizers will be even providing legal advice and support. I just hope that this will not make the next edition be a “DebConf light” and that people from all around the world is represented the next year.</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/412.en.html">Debian on Network Attached Storage (NAS) devices</a>: First of all, as most igalians have a NSLU2, I would want to say that Martin has already found the perfect and improved replacement for them: the <a href="http://www.engadget.com/2009/02/24/marvells-sheevaplug-linux-pc-fits-in-its-power-adapter/">Marvell SheevaPlug</a>. It is great to see how well GNU/Linux is spreading over to all kinds of devices and architectures. And it is even nicer to see how the developers have designed a way for seamlessly installing Debian in this kind of devices in such a way that an average user could do it without requiring ninja skills.</li>
</ul>
<p>That&#8217;s a good selection of the lectures and events I attended to. Of course there were some more interesting things, like the conference dinner, the <a href="http://www.flickr.com/photos/aigarius/3769719319/">massive group photo</a>, giving a <a href="https://penta.debconf.org/dc9_schedule/events/450.en.html">talk</a> (<a href="https://penta.debconf.org/dc9_schedule/attachments/114_slides.pdf">slides here</a>), the odyssey all along Cáceres to find a proper Irish tavern&#8230; The pint of Guinness with <a href="http://gwolf.org/">Gunnar</a>, <a href="http://blog.kov.eti.br/">Gustavo</a> and <a href="http://blogs.gnome.org/diegoe/">Diego</a> was one of the best moments of the conference <img src='http://blogs.igalia.com/aperez/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Quick summary: going to DebConf9 was a rewarding experience, even when I ended up extremely tired after it. Let&#8217;s try to attend some more conferences anytime soon&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.igalia.com/aperez/2009/08/more-debconf9-adventures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First day at the DebConf9</title>
		<link>http://blogs.igalia.com/aperez/2009/07/1st-day-at-debconf9/</link>
		<comments>http://blogs.igalia.com/aperez/2009/07/1st-day-at-debconf9/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 00:19:24 +0000</pubDate>
		<dc:creator>aperez</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://blogs.igalia.com/aperez/?p=63</guid>
		<description><![CDATA[I arrived yesterday at the main venue after a the long trip by car: ~700km in a car without air conditioning. I was very tired so I headed up for my room (which is in an ancient building at the old town area of Cáceres), had a shower and decided to take a nap&#8230; with [...]]]></description>
			<content:encoded><![CDATA[<p>I arrived yesterday at the main venue after a the long trip by car: ~700km in a car <em>without</em> air conditioning. I was very tired so I headed up for my room (which is in an ancient building at the <a href="http://whc.unesco.org/en/list/384">old town area of Cáceres</a>), had a shower and decided to take a nap&#8230; with so much success that I slept for two hours and a miracle made me wake up just in time for the <a href="https://penta.debconf.org/dc9_schedule/events/367.en.html">Cheese &amp; wine party</a>. It was great to taste an uncountable amount of kinds of cheese, wine and liquors from places all around the world. Among a lot of tasty stuff, it was really enlightening to try out some <em>real</em> japanese <a href="http://en.wikipedia.org/wiki/Sake">sake</a> and <a href="http://www.hubspeanuts.com/">the best peanuts I ever tried</a>.</p>
<p>After a quick breakfast today in the morning, my personal schedule included attending the following:</p>
<ul>
<li><a href="https://penta.debconf.org/dc9_schedule/events/413.en.html">Using FOSSology for license analysis in Debian</a>: a <a href="http://fossology.org/">tool</a> which determines which license a package has by examining its sources and looking for license disclaimers and similar texts contained in source code was presented. This way even cases where each source file may have a different license can be easily identified. For packagers this makes easier to check whether a software component complies with the packaging policy.</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/418.en.html">Not your grandpa&#8217;s debhelper</a>: This one really catched my attention, as I do some packaging from time to time it is very interesting to know about new incarnations of tools which suppose an aid to this task. The new <tt>dh</tt> thing is able of <a href="http://kitenet.net/~joey/blog/entry/debhelper_dh_overrides/">greatly simplifying</a> build rules. I wanna try it!</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/416.en.html">Debian System Administraors BoF</a>: I thought that it could be interesting to know how systems used for running the Debian infrastructure are configured. Three of the members of the team asked lots of questions from the audience, most of them being about e-mail services and whether it would be possible to improve spam handling.</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/388.en.html">Scratchbox2 for cross-compiling Debian</a>: It was a shame that there was no projector nor something similar for Riku to give an introduction to <a href="http://www.freedesktop.org/wiki/Software/sbox2">Scratchbox 2</a>, which looks like a good step forward. For example now it is possible to use it without <tt>root</tt> privileges at all.</li>
<li><a href="https://penta.debconf.org/dc9_schedule/events/408.en.html">Point releases &#8211; How to update stable more efficiently</a>: I have missed some bits of this lecture because I was sitting near the end of the room, but if I understood correctly there is a plan for rolling updates sooner into the Debian stable package set by using a repository in the fashion of the Ubuntu “proposed-updates” one, so users can get theirs hands on sooner on the packages in order to provide the needed feedback for stabilization.</li>
</ul>
<p>After having a light dinner I went along with <a href="http://blogs.gnome.org/diegoe/">Diego</a> for a walk along the old town area, to see how does it look at night. The perfect accompaniment was a glass of beer and a magnificent ice cream. And that is enough for today&#8230; <img src='http://blogs.igalia.com/aperez/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.igalia.com/aperez/2009/07/1st-day-at-debconf9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>See you at DebConf9</title>
		<link>http://blogs.igalia.com/aperez/2009/07/see-you-at-debconf9/</link>
		<comments>http://blogs.igalia.com/aperez/2009/07/see-you-at-debconf9/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 16:01:07 +0000</pubDate>
		<dc:creator>aperez</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://blogs.igalia.com/aperez/?p=60</guid>
		<description><![CDATA[I will pick up my car and embark myself into a 8-hour trip to reach Cáceres tomorrow in the evening, after 699 km of road trip. The goal: attending (and enjoying!) the ninth edition of the Debian Conference, which has already started. As I do not know exactly the arrival time, I will skip the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://debconf9.debconf.org/"><img class="aligncenter size-full wp-image-59" title="DebConf9 Logo" src="http://blogs.igalia.com/aperez/wp-content/uploads/2009/07/dc9logo.png" alt="DebConf9 Logo" width="400" height="92" /></a>I will pick up my car and embark myself into a 8-hour trip to reach Cáceres tomorrow in the evening, after 699 km of road trip. The goal: attending (and enjoying!) the <a href="http://debconf9.debconf.org">ninth edition of the Debian Conference</a>, which has already started. As I do not know exactly the arrival time, I will skip the dinner tomorrow, but I will do my best to be at the <a href="https://penta.debconf.org/dc9_schedule/events/367.en.html">Cheese &amp; wine party</a> and bringing some “tetilla” (small breast) cheese from Galicia, which has a funny shape as you can imagine:</p>
<p><a href="http://en.wikipedia.org/wiki/Tetilla_cheese"><img class="aligncenter" title="Some “tetilla” cheese" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Queso_tetilla_entre_otros.jpg/290px-Queso_tetilla_entre_otros.jpg" alt="" width="290" height="218" /></a></p>
<p>I am looking forward to be there tomorrow, as this will be my first time at a big community event and it really looks like <a href="http://blogs.igalia.com/jmunhoz/2009/07/23/gran-canaria-desktop-summit09/">this</a> <a href="http://blogs.igalia.com/berto/2009/07/14/back-from-gran-canaria/">kind</a> <a href="http://blogs.igalia.com/mario/2009/07/07/gnome-party-at-gcds-09/">of</a> <a href="http://blogs.igalia.com/apinheiro/2009/07/08/my-last-day-in-gcds/">things</a> are really interesting and a great opportunity to get in touch with latest developments, learning lots of new stuff, and meeting people from all around the world&#8230; The latter is a <em>must</em> for me, as I will not know anyone there because there will be no more <a href="http://planet.igalia.com/">Igalians</a> attending the conference. So if you will be there from 25th to 30th feel free to approach me and have some chat <img src='http://blogs.igalia.com/aperez/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>Last, but not least, shell scripters (and anyone interested) may want to know that have a <a href="https://penta.debconf.org/dc9_schedule/events/450.en.html">slot in the unofficial</a> track for a  lecture on Shaft, a tool which we have been using lately to do declarative unit testing of shell scripts. I am just now polishing the slides, preparing a couple of examples and preparing the code for release.</p>
<p>See you there!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.igalia.com/aperez/2009/07/see-you-at-debconf9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My own Gtk+ theme</title>
		<link>http://blogs.igalia.com/aperez/2009/07/my-own-gtk-theme/</link>
		<comments>http://blogs.igalia.com/aperez/2009/07/my-own-gtk-theme/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 18:35:59 +0000</pubDate>
		<dc:creator>aperez</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://blogs.igalia.com/aperez/?p=56</guid>
		<description><![CDATA[I have never been completely happy with how the widgets of Gtk+ applications looked like. Undoubtedly the “Clearlooks” theme was an impressive improvement, but it has some glitches with some applications (for example Claws-Mail has to be tamed to look good with some themes) and I always had the curiosity of knowing how a theme [...]]]></description>
			<content:encoded><![CDATA[<p>I have never been completely happy with how the widgets of Gtk+ applications looked like. Undoubtedly the “Clearlooks” theme was an impressive improvement, but it has some glitches with some applications (for example <a href="http://www.claws-mail.org//">Claws-Mail</a> <a href="http://blogs.igalia.com/aperez/2009/07/making-claws-mail-look-better/">has to be tamed</a> to look good with some themes) and I always had the curiosity of knowing how a theme is made. So I picked up the <a class="reference external" href="http://www.cimitan.com/blog/2008/09/04/three-new-smooth-themes-for-murrine-chrome-cream-candido/">Chrome</a> theme which uses the <a class="reference external" href="http://www.cimitan.com/murrine/">Murrine</a> engine, and modified it to have warm gray colors, and the Gnome panel with the same shades as the rest of the widgets. After some tweaking I came up with this:</p>
<p><a href="http://people.igalia.com/aperez/assets/gtk-creamware-shot.png"><img class="aligncenter" title="Creamware theme screenshot" src="http://people.igalia.com/aperez/assets/gtk-creamware-shot-small.png" alt="" width="374" height="296" /></a></p>
<p>It makes a smooth, clean environment without too much distractions, apart from the blue shades of the selected items, so it is a good option for everyday use. Especially if you spend loads of hours in front of a computer. It matches nicely with the “Clearlooks” theme included in the latest versions of the <a href="http://icculus.org/openbox/">OpenBox</a> window manager (which I use).</p>
<p>I think this is nice enough to share, so you may want to <a href="http://people.igalia.com/aperez/files/Creamware-20090716.tar.gz">get the theme conveniently packaged as a tarball</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.igalia.com/aperez/2009/07/my-own-gtk-theme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
