<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet Open Ghana</title>
	<link>http://planet.openghana.org/</link>
	<language>en</language>
	<description>Planet Open Ghana - http://planet.openghana.org/</description>

<item>
	<title>Joachim Breitner: Talking at CeBIT tomorrow</title>
	<guid>https://www.joachim-breitner.de/blog/archives/384-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/384-Talking-at-CeBIT-tomorrow.html</link>
	<description>&lt;p&gt;Today, I arrived at the &lt;a href=&quot;http://www.cebit.de/&quot;&gt;CeBIT&lt;/a&gt; conference in Hannover, and had a first look around. I find trade fairs like that quickly boring, and I was glad to meet some some other Debian folk and listen to some of the talks at the CeBIT Open Source Forum in hall 2, including &lt;a href=&quot;http://blog.schmehl.info/2010/03/02&quot;&gt;tolimar’s talk about Debian GNU/kFreeBSD&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Tomorrow (Wednesday), I will talk at the same place at 13:45, explaining some basic stuff about patches and bug tracker. The target audience are users of Free Software who modify it for their private or company-wide use and would like to see their changes included in the official project. There will be a &lt;a href=&quot;http://www.techcast.com/events/cebit10/&quot;&gt;live stream&lt;/a&gt; of the talk, which I am officially holding as an employee of the &lt;a href=&quot;http://www.itomig.de/&quot;&gt;ITOMIG GmbH&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 02 Mar 2010 20:02:29 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Teeth fashion</title>
	<guid>https://www.joachim-breitner.de/blog/archives/382-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/382-Teeth-fashion.html</link>
	<description>&lt;p&gt;Has anyone ever considered wearing his teeth consistent with the rest of ones cloths?&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://www.joachim-breitner.de/various/teeth-fashion.jpg&quot; width=&quot;700&quot; height=&quot;942&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 01 Mar 2010 11:49:11 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Exploiting sharing in arbtt</title>
	<guid>https://www.joachim-breitner.de/blog/archives/381-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/381-Exploiting-sharing-in-arbtt.html</link>
	<description>&lt;p&gt;My &lt;a href=&quot;http://www.joachim-breitner.de/projects#arbtt&quot;&gt;automatic rule-based time tracker&lt;/a&gt; (arbtt), which is written in Haskell, collects every minute a data sample consisting mainly of the list of currently open windows (window title and program name). Naturally, this log grows rather large. Since October of last year, I collected 70,000 samples. I already went &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/341-arbtt-goes-Binary.html&quot;&gt;from a text-based file format to a binary format&lt;/a&gt; using Data.Binary, which gave a big performance boost.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;But by now, I was afraid that this is not enough. My log file is now 30MB large. Looking at the memory graph of gnome-panel, it is taking up more than half of my memory. When running arbtt-stats, the Haskell run time system reports 569 MB total memory in use and the command finishes after 28.5 seconds.&lt;/p&gt; 
&lt;p&gt;Naturally, the log file is highly redundant: Compressing it with bzip2 shrinks it to 1.6MB. But as I would like to preserve the ability to just append samples at the end, without having to read the file, I chose not just to add bzip2 or gzip compression. Rather, I am now exploiting a very obvious redundancy: Two adjacent samples usually list exactly the same windows, and a focus change only changes a flag. So now, when storing a string that is part of a sample, it will check if this string was already present in the previous sample and, in this case, just store the number of that string (one byte). Only if the string was not present it will write a zero byte and then the string. When reading the sample, the process is reversed.&lt;/p&gt; 
&lt;p&gt;This greatly reduces the file size: It is down to 6.2MB. It also improves the memory consumption, due to Haskell’s abilities with regard to sharing: When a reference to a string in a previous sample is read, then only one instance of this string is in memory, even if it occurs several times in the log. This brings the memory consumption down to 264 MB and the runtime to 17 seconds.&lt;/p&gt; 
&lt;p&gt;I released the changes as version 0.4.5.1 to &lt;a href=&quot;http://hackage.haskell.org/package/arbtt&quot;&gt;Hackage&lt;/a&gt;, &lt;a href=&quot;http://packages.debian.org/sid/arbtt&quot;&gt;Debian&lt;/a&gt; and as a &lt;a href=&quot;http://www.joachim-breitner.de/archive/arbtt/arbtt-setup-0.4.5.1.exe&quot;&gt;Windows installer&lt;/a&gt;. The log file is not automatically converted, but new samples will be written in the compressed format. If you want to convert your whole file, you have to stop arbtt-capture, run arbtt-recover, and then move the hopefully noticeable smaller &lt;a href=&quot;http://capture.log.recovered&quot;&gt;~/.arbtt/capture.log.recovered&lt;/a&gt;&amp;#160; to ~/.arbtt/capture.log.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;The &lt;a href=&quot;http://darcs.nomeata.de/cgi-bin/darcsweb.cgi?r=arbtt;a=commitdiff;h=20100228205945-23c07-136eaf3cc7bd5c4e6f7b67f4d0cee1ac4433133e.gz&quot;&gt;required code changes&lt;/a&gt; were not too big. I somewhat isolated the relevant code in the &lt;a href=&quot;http://darcs.nomeata.de/arbtt/src/Data/Binary/StringRef.hs&quot;&gt;Data.Binary.StringRef&lt;/a&gt; module. Unfortunately, I have to use OverlappingInstances to be able to provide the special instance for String – is there a cleaner way (besides the trick used for the Show class)?&lt;br /&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 28 Feb 2010 22:04:48 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Odzangba Dake: Optimize Your Internet Speed With Namebench DNS Benchmarking Tool</title>
	<guid>http://odzangba.wordpress.com/?p=357</guid>
	<link>http://odzangba.wordpress.com/2010/02/21/optimize-your-internet-speed-with-namebench-dns-benchmarking-tool/</link>
	<description>&lt;br /&gt;&lt;p&gt;&lt;!-- p, li { white-space: pre-wrap; } --&gt;&lt;!--StartFragment--&gt;&lt;strong&gt;DNS Crash Course&lt;/strong&gt;&lt;br /&gt;
The Domain Name System (DNS) resolves domain names like&lt;strong&gt; www.wordpress.com&lt;/strong&gt; into a series of digits (&lt;strong&gt;74.200.247.60&lt;/strong&gt;) that computers can understand. Your browser typically hands over website names to a DNS server and receives &lt;strong&gt;IP Addresses&lt;/strong&gt; in return. Most Internet Service Providers provide a DNS server for their customers to help speed up browsing and downloads.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In Comes Namebench&lt;/strong&gt;&lt;br /&gt;
Namebench is a DNS benchmarking application available for the Linux, Windows and Mac OS X. It uses either your web browser’s history or a standardized test data set to find out which DNS service returns the fastest results for your location.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Installing Namebench&lt;/strong&gt;&lt;br /&gt;
Download and run Namebench from the Google Code repository &lt;a title=&quot;Download namebench&quot; href=&quot;http://code.google.com/p/namebench/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ubuntu Users&lt;/strong&gt;&lt;br /&gt;
The people at &lt;a href=&quot;http://www.getdeb.net&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;GetDeb&lt;/strong&gt;&lt;/a&gt; have packaged a deb for Namebench. You can add their repository &lt;a title=&quot;GetDeb Repository&quot; href=&quot;http://www.getdeb.net/updates/Ubuntu/all#how_to_install&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Using Namebench&lt;/strong&gt;&lt;br /&gt;
Close all internet-aware applications before you start Namebench. We don&amp;#8217;t want those applications competing with Namebench for your bandwidth and distorting the results. Launch Namebench (Internet &amp;#8211;&amp;gt; namebench for Ubuntu users.) You&amp;#8217;ll see an interface like this:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://odzangba.files.wordpress.com/2010/02/screenshot-namebench.png&quot;&gt;&lt;img class=&quot;size-full wp-image-350 aligncenter&quot; title=&quot;Namebench Application Window&quot; src=&quot;http://odzangba.files.wordpress.com/2010/02/screenshot-namebench.png?w=500&amp;h=265&quot; alt=&quot;Namebench Application Window&quot; width=&quot;500&quot; height=&quot;265&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Nameservers&lt;/strong&gt; are the DNS servers you are currently using. You can add other nameservers to this list (separate them with a comma or space.) The default settings are usually okay for most people so just click &lt;strong&gt;Start Benchmark.&lt;/strong&gt; Google has a more detailed explanation of the settings &lt;a href=&quot;http://code.google.com/p/namebench/wiki/UsingNameBench&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. The test takes &lt;strong&gt;10 &amp;#8211; 20 minutes&lt;/strong&gt; so you can take a sandwich break or something. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nambench Results&lt;/strong&gt;&lt;br /&gt;
After the test completes, your web browser starts up to show you the results.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://odzangba.files.wordpress.com/2010/02/nb1.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-351&quot; title=&quot;Namebench Results&quot; src=&quot;http://odzangba.files.wordpress.com/2010/02/nb1.png?w=500&amp;h=119&quot; alt=&quot;Namebench Results&quot; width=&quot;500&quot; height=&quot;119&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
As you can see, my primary DNS server&amp;#8217;s performance is pretty sweet. That&amp;#8217;s to be expected though&amp;#8230; it&amp;#8217;s a local server so some cached queries must have been involved. On the right, Namebench recommends the optimum nameserver setup for my machine. It seems I&amp;#8217;ll have to switch my fall-back namservers from OpenDNS to one in the Netherlands and another in Kenya.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://odzangba.files.wordpress.com/2010/02/nb2.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-353&quot; title=&quot;Response Times&quot; src=&quot;http://odzangba.files.wordpress.com/2010/02/nb2.png?w=500&amp;h=382&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;382&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This table shows the DNS servers that were used in the test, resonse times, notes and errors if any. I&amp;#8217;ve got some tweaking to do, it seems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Moving on&amp;#8230;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://odzangba.files.wordpress.com/2010/02/nb3.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-354&quot; title=&quot;Average and Fastest Responses&quot; src=&quot;http://odzangba.files.wordpress.com/2010/02/nb3.png?w=500&amp;h=339&quot; alt=&quot;Average and Fastest Responses&quot; width=&quot;500&quot; height=&quot;339&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This graph shows the &lt;strong&gt;average&lt;/strong&gt; and &lt;strong&gt;fastest&lt;/strong&gt; response times for the top 10 nameservers.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://odzangba.files.wordpress.com/2010/02/nb4.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-355&quot; title=&quot;Response Distribution Chart (First 200ms)&quot; src=&quot;http://odzangba.files.wordpress.com/2010/02/nb4.png?w=500&amp;h=289&quot; alt=&quot;Response Distribution Chart (First 200ms)&quot; width=&quot;500&quot; height=&quot;289&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This one shows the percentage of times a response was received from a server within the first 200 milliseconds.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://odzangba.files.wordpress.com/2010/02/nb5.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-356&quot; title=&quot;Response Distribution Chart (Full)&quot; src=&quot;http://odzangba.files.wordpress.com/2010/02/nb5.png?w=500&amp;h=289&quot; alt=&quot;Response Distribution Chart (Full)&quot; width=&quot;500&quot; height=&quot;289&quot; /&gt;&lt;br /&gt;
&lt;/a&gt;This last graph shows the percentage of times a response was received from a server for the entire test duration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Making Changes&lt;/strong&gt;&lt;br /&gt;
There&amp;#8217;s a great article &lt;a title=&quot;How to configure your DNS servers&quot; href=&quot;http://shibuvarkala.blogspot.com/2009/12/how-to-setup-google-public-dns-in.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; on how to change your DNS servers in Ubuntu. Use the fastest servers from your Namebench test. Windows and Mac users can take a look &lt;a href=&quot;http://code.google.com/speed/public-dns/docs/using.html#testing&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; to learn how to change DNS settings. Have fun. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;!--EndFragment--&gt;&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/357/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/357/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/357/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/357/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/357/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/357/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=357&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Sun, 21 Feb 2010 19:29:36 +0000</pubDate>
</item>
<item>
	<title>Odzangba Dake: How To Free Reserved Space On EXT4 Partitions</title>
	<guid>http://odzangba.wordpress.com/?p=344</guid>
	<link>http://odzangba.wordpress.com/2010/02/20/how-to-free-reserved-space-on-ext4-partitions/</link>
	<description>&lt;br /&gt;&lt;p&gt;&lt;!-- p, li { white-space: pre-wrap; } --&gt;&lt;!--StartFragment--&gt;This one came in handy when I bought a 1TB hard drive last week. Most linux distributions reserve 5% of new partitions for the root user and system services. The idea here is even when you run out of disk space, the root user should still be able to log in and system services should still run&amp;#8230; this won&amp;#8217;t happen if there is no space on the partition. This policy may have been appropriate in the 90s when hard disk capacities were relatively low but this is 2010 and one can get a 1TB hard drive for a couple of hundred Ghana Cedis. 5% of that is about 14GB and those system services need only a couple of hundred megabytes.&lt;/p&gt;
&lt;p&gt;So I decided to reclaim all that disk real estate with this command:&lt;/p&gt;
&lt;p&gt;sudo tune2fs -m 0 /dev/sdb1&lt;/p&gt;
&lt;p&gt;This sets the reserved blocks to 0%. This is an additional storage drive, I have no need to reserve disk space for system services. You can verify that this actually worked with:&lt;/p&gt;
&lt;p&gt;sudo tune2fs -l /dev/sdb1 | grep Reserved&lt;/p&gt;
&lt;p&gt;As usual, modify /dev/sdb1 to suit your partition setup. Have fun. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;!--EndFragment--&gt;&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/344/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/344/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/344/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/344/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/344/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/344/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/344/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/344/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/344/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/344/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=344&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Sat, 20 Feb 2010 20:46:56 +0000</pubDate>
</item>
<item>
	<title>Joachim Breitner: Diploma Thesis Finished</title>
	<guid>https://www.joachim-breitner.de/blog/archives/376-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/376-Diploma-Thesis-Finished.html</link>
	<description>&lt;p&gt;Earlier today, I went to a local copy shop and had my diploma thesis printed. This afternoon, I will hand it in. The title is “&lt;a href=&quot;http://www.joachim-breitner.de/various/DA/LoopSubgroupDiplomaThesis.pdf&quot;&gt;Loop subgroups of F&lt;sub&gt;r&lt;/sub&gt; and the images of their stabilizer subgroups in GL&lt;sub&gt;r&lt;/sub&gt;(ℤ)&lt;/a&gt;” and discusses a group-theoretical result. I assume that very few readers care about the content of the thesis, but maybe some are interested in a few assorted LaTeX hints. I’m also publishing the &lt;a href=&quot;http://www.joachim-breitner.de/various/DA/LoopSubgroupDiplomaThesis.tex&quot;&gt;full TeX source code&lt;/a&gt;, maybe someone can make use of it.&lt;/p&gt; 
&lt;h3&gt;Less chatty varioref&lt;/h3&gt; 
&lt;p&gt;I’m using the &lt;a href=&quot;http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=varioref&quot;&gt;&lt;tt&gt;varioref&lt;/tt&gt;&lt;/a&gt; package, in conjunction with the &lt;a href=&quot;http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=cleveref&quot;&gt;&lt;tt&gt;cleveref&lt;/tt&gt;&lt;/a&gt; package. This provides a command &lt;tt&gt;\vref{fig:S3S4l}&lt;/tt&gt; which will expand to, for example, to “Figure 1 on page 11”. But if the referenced figure is actually on the current page, the next page, the previous page or the facing page (in two-side layouts), it will say so: “Figure 1 on this page.” &lt;/p&gt; 
&lt;p&gt;This is very nice, but I assume that the reader of my thesis is able to find Figure 1 when it is visible, i.e. on the current or facing page. One can remove the referencing texts with the commands &lt;tt&gt;\def\reftextfaceafter{}&lt;/tt&gt;, &lt;tt&gt;\def\reftextfacebefore{}&lt;/tt&gt; and &lt;tt&gt;\def\reftextcurrent{}&lt;/tt&gt;. But because &lt;tt&gt;varioref&lt;/tt&gt; puts a space between “Figure 1” and this text, we will get a superfluous space – even before punctuation.&lt;/p&gt; 
&lt;p&gt;The remedy is the command &lt;tt&gt;\unskip&lt;/tt&gt;, which removes this space again. So I use in my preamble:&lt;/p&gt; 
&lt;pre&gt;\def\reftextfaceafter {\unskip}%
\def\reftextfacebefore{\unskip}%
\def\reftextcurrent   {\unskip}%&lt;/pre&gt; 
&lt;h3&gt;Palatino and extra leading&lt;/h3&gt; 
&lt;p&gt;I chose the Palatino font for my thesis, using the &lt;a href=&quot;http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=mathpazo&quot;&gt;&lt;tt&gt;mathpazo&lt;/tt&gt;&lt;/a&gt; package. Various sources (such as the &lt;a href=&quot;http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=koma-script&quot;&gt;KOMA-Script&lt;/a&gt; manual) suggest to use 5% extra leading:&lt;/p&gt; 
&lt;pre&gt;\linespread{1.05}&lt;/pre&gt; 
&lt;h3&gt;Counting figures independently from chapters&lt;/h3&gt; 
&lt;p&gt;I don’t have too many figures and tables in my thesis, and I want them to be numbered simple 1, 2, ... By default, LaTeX would say 1.1, 1.2, 2.1, ... This can be fixed using the &lt;a href=&quot;http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=remreset&quot;&gt;&lt;tt&gt;remreset&lt;/tt&gt;&lt;/a&gt; package and these commands:&lt;/p&gt; 
&lt;pre&gt;\makeatletter
\@removefromreset{figure}{chapter}
\renewcommand{\thefigure}{\arabic{figure}}
\@removefromreset{table}{chapter}
\renewcommand{\thetable}{\arabic{table}}
\makeatother&lt;/pre&gt; 
&lt;h3&gt;No widows and club lines&lt;/h3&gt; 
&lt;p&gt;LaTeX already avoids these, but I wanted to get rid of them completely. This can be done with:&lt;/p&gt; 
&lt;pre&gt;% Disable single lines at the start of a paragraph (Schusterjungen)
\clubpenalty = 10000
% Disable single lines at the end of a paragraph (Hurenkinder)
\widowpenalty = 10000 \displaywidowpenalty = 1000&lt;/pre&gt; 
&lt;h3&gt;Struck table lines&lt;/h3&gt; 
&lt;p&gt; I had to typeset tables with some lines struck, and I could not find a ready command for that. I used the following definition, based on the code for &lt;tt&gt;\hline&lt;/tt&gt;. Note that it probably does not adjust well to other font sizes and needs to be adjusted manually:&lt;/p&gt; 
&lt;pre&gt;\makeatletter
\def\stline{%
&amp;#160; \noalign{\vskip-.7em\vskip-\arrayrulewidth\hrule \@height \arrayrulewidth\vskip.7em}}
\makeatother&lt;/pre&gt; 
&lt;h3&gt;Title page in one-sided layout&lt;/h3&gt; 
&lt;p&gt;According to the KOMA manual, the title page as set by LaTeX is not meant to be the cover of a publication, and therefore has to be set with the margins of a right page – i.e. a larger right margin and a smaller left margin. But when printing cheaply, one often just put a transparent sheet on top of the print, so the title page &lt;em&gt;is&lt;/em&gt; the cover. You can convince KOMA that you are right by using&lt;/p&gt; 
&lt;pre&gt;\KOMAoptions{twoside=false}
\begin{titlepage}
...
\end{titlepage}
\KOMAoptions{twoside=true}&lt;/pre&gt; 
&lt;h3&gt;Not flushing the page for chapter heads&lt;/h3&gt; 
&lt;p&gt;LaTeX would put the list of algorithms on a new right page. I found this a waste of paper for my few algorithms, and preferred to put the list right after the table of contents. You can override the LaTeX behavior using:&lt;/p&gt; 
&lt;pre&gt;\tableofcontents
{
\let\cleardoublepage\relax&amp;#160; % book
\let\clearpage\relax&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; % report
\let\chapter\section
\listofalgorithms
}&lt;/pre&gt; 
&lt;p&gt;This code also reduces the size of the heading to that of a section. The same trick also works with &lt;tt&gt;\chapter&lt;/tt&gt;.&lt;/p&gt; 
&lt;h3&gt;Math in headings vs. PDF bookmarks&lt;/h3&gt; 
&lt;p&gt;LaTeX with the &lt;a href=&quot;http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=hyperref&quot;&gt;&lt;tt&gt;hyperref&lt;/tt&gt;&lt;/a&gt; package creates nice PDF bookmarks from your chapter and section titles. Unfortunately, PDF bookmark names can only be plain strings, while the titles in the document might contain some math symbols. You can make both happy with &lt;tt&gt;\texorpdfstring&lt;/tt&gt;:&lt;/p&gt; 
&lt;pre&gt;\section{Stabilizer subgroups in \texorpdfstring{$\GL_r(\Z/2\Z)$}{GL\_r(Z/2Z)}}&lt;/pre&gt; 
&lt;h3&gt;Setting lines for the signature&lt;/h3&gt; 
&lt;p&gt;The diploma thesis contains a small note which I have to sign, saying that I created it on my own etc. Below that, I put two labeled lines for date and signature, using the tabbing environment:&lt;/p&gt; 
&lt;pre&gt;\begin{tabbing}
\rule{4cm}{.4pt}\hspace{1cm} \= \rule{7cm}{.4pt} \\
Ort, Datum \&amp;gt; Unterschrift
\end{tabbing}&lt;/pre&gt;</description>
	<pubDate>Thu, 11 Feb 2010 13:11:19 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: If I were a caricaturist</title>
	<guid>https://www.joachim-breitner.de/blog/archives/374-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/374-If-I-were-a-caricaturist.html</link>
	<description>&lt;p&gt;I’d draw a caricature involving a Toyota car, representing capitalism, with a stuck gas petal and Barack Obama trying to fix it. But as I cannot draw very well, especially recognizable people, I created this collage:&lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt;&lt;img width=&quot;682&quot; height=&quot;549&quot; src=&quot;http://www.joachim-breitner.de/various/obama-toyota-callback.jpg&quot; /&gt;&lt;/div&gt; 
&lt;p&gt;The photo of Obama was created by &lt;a href=&quot;http://www.flickr.com/photos/bethcanphoto/2287026145/&quot;&gt;Beth Rankin&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Sun, 07 Feb 2010 20:33:45 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: FontForge-Article in the German Linux-Magazin</title>
	<guid>https://www.joachim-breitner.de/blog/archives/371-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/371-FontForge-Article-in-the-German-Linux-Magazin.html</link>
	<description>&lt;p&gt;Yesterday, I found the 3/10-issue of the German “&lt;a href=&quot;http://www.linux-magazin.de/Heft-Abo/Ausgaben/2010/03&quot;&gt;Linux-Magazin&lt;/a&gt;” in my mailbox. (I don’t dare to call it the March issue – they are a bit off schedule...) On page 62, you can find my 3½ page article about creating a symbol font with &lt;a href=&quot;http://fontforge.sourceforge.net/&quot;&gt;FontForge&lt;/a&gt;. I &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/310-My-very-first-font.html&quot;&gt;briefly covered the topic&lt;/a&gt; on my blog and later thought that it would made a nice article, even though I’m not an expert on this area. The article will be freely available in about three years.This is already my third publication, after my article on the &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/56-Like-XSS,-just-simpler-and-harder-to-prevent-The-Cross-Site-Auth-XSA-Attack.html&quot;&gt;Cross-Site-Authentication attack&lt;/a&gt; that was published &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/84-Erste-Schritte-im-Journalismus.html&quot;&gt;in the same magazine&lt;/a&gt; (circulation ~63.000) and in &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/108-International-Journalism-and-me.html&quot;&gt;its international counterpart&lt;/a&gt; in 2005 and my recent &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/354-Second-Post!.html&quot;&gt;article in the “freeX” magazine&lt;/a&gt; (circulation ~15.000). Looks like I’ll have to add a&amp;#160; “Publications” section to my website soon...&lt;/p&gt;</description>
	<pubDate>Thu, 04 Feb 2010 21:50:11 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: pidgin-blinklight goes subliminal</title>
	<guid>https://www.joachim-breitner.de/blog/archives/369-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/369-pidgin-blinklight-goes-subliminal.html</link>
	<description>&lt;p&gt;A long while ago I wrote a plugin for gaim called gaim-thinklight that blinks ones ThinkPad ThinkLight when a new message arrives. By now it is called pidgin-blinklight and supports some other hardware as well, but has not changed since over a year. Today, I implemented a new feature, and I’m curious if it will actually work:&lt;/p&gt; 
&lt;p&gt;Until now, the blink pattern was hardcoded: ON, wait 150ms, OFF, wait 125ms, ON, wait 150ms, OFF. Since version 0.11, pidgin-blinklight will calculate these three delay times based on the contacts login name. So different contacts will have very slightly different blinking patterns. The idea is that, after a while, you start to recognize your frequent buddies already by the blinking. The wait times are from the range from 50ms to 250ms, I hope that range works well.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;Users of &lt;a href=&quot;http://packages.debian.org/sid/pidgin-blinklight&quot;&gt;Debian unstable&lt;/a&gt; will get the new version automatically. If you want to compile pidgin-blinklight from source, you will have to grab it &lt;a href=&quot;http://ftp.de.debian.org/debian/pool/main/p/pidgin-blinklight/&quot;&gt;from the debian ftp server&lt;/a&gt;. The source is in the &lt;a href=&quot;http://darcs.nomeata.de/pidgin-blinklight.upstream/&quot;&gt;pidgin-blinklight Darcs repository&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 30 Jan 2010 22:08:25 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Serna XML editor uploaded to Debian</title>
	<guid>https://www.joachim-breitner.de/blog/archives/366-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/366-Serna-XML-editor-uploaded-to-Debian.html</link>
	<description>&lt;p&gt;The &lt;a href=&quot;http://www.syntext.com/products/serna-free/&quot;&gt;XML-Editor Serna&lt;/a&gt; by &lt;a href=&quot;http://www.syntext.com/&quot;&gt;Syntext&lt;/a&gt; has been published as Free Software a few months ago. This was very good news, because there was a lack of a good free XML editors with a good graphical view on DocBook documents, which I needed to recommend to users of &lt;a href=&quot;http://www.zpub.de/&quot;&gt;zpub&lt;/a&gt;. Therefore, I investigated packaging Serna for Debian. I had to &lt;a href=&quot;http://git.nomeata.de/?p=serna.git;a=tree;f=debian/patches;hb=refs/heads/master&quot;&gt;patch a few things&lt;/a&gt; to make it compile on and64 and to use components shipped by Debian where possible. Today, I could finally close the &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=535828&quot;&gt;RFP bug&lt;/a&gt; filed by W. Martin Borgert, as the &lt;a href=&quot;http://packages.debian.org/sid/serna&quot;&gt;serna package&lt;/a&gt; was accepted by the ftp-masters. The &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=566823&quot;&gt;first bug&lt;/a&gt; (SEGFAULT on startup on lenny) is already filed. I hope this is a good sign, as it shows that there is interest in the package.&lt;/p&gt; 
&lt;p&gt;For my packaging workflow, I used git-svn to import the upstream SVN branch into &lt;a href=&quot;http://git.nomeata.de/?p=serna.git&quot;&gt;a git repository&lt;/a&gt;. I then use &lt;a href=&quot;http://git-dpm.alioth.debian.org/&quot;&gt;git-dpm&lt;/a&gt; by Bernhard R. Link to manage my changes as patches in the new 3.0 (quilt) debian source package. I must say that I prefer this approach to git-buildpackage, as there is only one git branch to publish. I hope that Bernhard uploads git-dpm to Debian soon.&lt;/p&gt; 
&lt;p&gt;Serna is quite a big software project and uses stuff that I know little about (Qt, C++ with python interaction etc.). Also, the package currently bundles the &lt;a href=&quot;http://dita-ot.sourceforge.net/&quot;&gt;DITA-OT&lt;/a&gt; package, which should rather be packaged separately. Therefore, I’d be glad if co-maintainers would join the effort.&lt;br /&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 25 Jan 2010 11:28:33 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: DebConf mugshots view statistics</title>
	<guid>https://www.joachim-breitner.de/blog/archives/363-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/363-DebConf-mugshots-view-statistics.html</link>
	<description>&lt;p&gt;In a comment to &lt;a href=&quot;https://www.joachim-breitner.de/blog/archives/360-screen-message-ported-to-Windows.html&quot;&gt;my previous blog post&lt;/a&gt;, I linked to the DebConf photo gallery page with the &lt;a href=&quot;https://gallery.debconf.org/v/debconf8/Mugshots/&quot;&gt;DebConf8 mugshots&lt;/a&gt;. &lt;a href=&quot;http://www.felixbrandt.de/blog/index.php?/archives/93-Unconventional-Image-Classification.html&quot;&gt;Felix Brandt&lt;/a&gt;, a friend of mine, noticed the per-picture view statistics there and plotted them, differentiating between male and female. He finds that the number of views on an image gives a fairly good indication of the sex (or gender?) of the person in question:&lt;/p&gt; 
&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://www.felixbrandt.de/blog/index.php?/archives/93-Unconventional-Image-Classification.html&quot;&gt;&lt;img border=&quot;0&quot; align=&quot;middle&quot; src=&quot;http://www.felixbrandt.de/~felix/blog/debconf8_mugshots_views.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt; 
&lt;p&gt;The most notable exception is the &lt;a href=&quot;https://gallery.debconf.org/v/debconf8/Mugshots/mugshots-dc8068.jpg.html&quot;&gt;image of bubulle&lt;/a&gt;. He does not even look feminine. Maybe it’s because he’s like a mother to us Debianers, always kind and always helpful? :-)&lt;/p&gt; 
&lt;p&gt;This observation fits my experience when I created a top-100-statistic of individual picture page views of &lt;a href=&quot;http://www.joachim-breitner.de/bilder/&quot;&gt;my personal gallery&lt;/a&gt;: I got a collection of pretty much all pictures of girls in bikinis, lying at some beach, across the various pages and years, and hardly any other picture. I won’t post these top-100 here, as I don’t want to additionally increase the effect...&lt;/p&gt;</description>
	<pubDate>Sat, 09 Jan 2010 14:02:29 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: screen-message ported to Windows</title>
	<guid>https://www.joachim-breitner.de/blog/archives/360-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/360-screen-message-ported-to-Windows.html</link>
	<description>&lt;p&gt;Over the holidays I investigated how to cross-compile GTK applications for Windows, and managed to port screen-message. I also created an Inno Setup based installer for it that includes the necessary GTK DLLs. You can grab it from the &lt;a href=&quot;http://www.joachim-breitner.de/projects#screen-message&quot;&gt;screen-message homepage&lt;/a&gt;. The installer optionally binds screen-messages to the key combination Alt-Ctrl-S.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;I would have published the binary much earlier if starting the application had not always given the error message
&lt;/p&gt; 
&lt;blockquote&gt;
The application failed to initialize properly (0xc000007b).  Click on OK to terminate the application.
&lt;/blockquote&gt;
&lt;p&gt;
on Windows, while it worked fine under WINE. It took me a while to find the cause, as there seems to be only &lt;a href=&quot;http://www.mail-archive.com/gtkmm-list@gnome.org/msg10153.html&quot;&gt;one mention&lt;/a&gt; of it in the internet: One must not use MinGW’s strip.exe utility on DLLs not created with MinGW, it seems.
&lt;/p&gt;

&lt;p&gt; &lt;/p&gt; 
&lt;p&gt;I added a “make installer” target to the Makefile to create the installer. If you are curious about how that works, have a look at &lt;a href=&quot;http://darcs.nomeata.de/screen-message.upstream&quot;&gt;the source&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 07 Jan 2010 12:35:31 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Building arbtt for Windows</title>
	<guid>https://www.joachim-breitner.de/blog/archives/358-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/358-Building-arbtt-for-Windows.html</link>
	<description>&lt;p&gt;A friend of mine is interested in trying out the &lt;a href=&quot;http://www.joachim-breitner.de/projects#arbtt&quot;&gt;Automatic Rule Based Time-Tracker&lt;/a&gt; arbtt which I programmed. Unfortunately, he is using Windows and up to now, arbtt only worked on Linux. But as I wanted to check out Haskell’s cross-platform abilities for a while, this was a good opportunity to do so. I don’t have Windows installed myself (and did not plan to do so), so I did all this under &lt;a href=&quot;http://www.winehq.org/&quot;&gt;WINE&lt;/a&gt;, the Windows compatibility layer, which works very well: It takes only a few minutes to install the &lt;a href=&quot;http://hackage.haskell.org/platform/&quot;&gt;Haskell Platform&lt;/a&gt; for Windows and then I was able to run &lt;tt&gt;wine ghc --make&lt;/tt&gt; and &lt;tt&gt;cabal install&lt;/tt&gt;.&lt;/p&gt; 
&lt;p&gt;I played around with some simple programs and was surprised by these timings:&lt;/p&gt; 
&lt;pre&gt;$ rm *.o *.hi; ghc --make fourfours.hs ; time ./fourfours &amp;gt; /dev/null
[1 of 1] Compiling Main             ( fourfours.hs, fourfours.o )
Linking fourfours ...

real	0m1.909s
user	0m1.692s
sys	0m0.208s
$ rm *.o *.hi; wine ghc --make fourfours.hs ; time wine ./fourfours.exe &amp;gt; /dev/null
[1 of 1] Compiling Main             ( fourfours.hs, fourfours.o )
Linking fourfours.exe ...

real	0m1.631s
user	0m1.376s
sys	0m0.092s
&lt;/pre&gt; 
&lt;p&gt;So it is faster to run a compiled Haskell program on top of a compatibility layer than directly on Linux! The world is in order again, though, if optimization is enabled:&lt;/p&gt; 
&lt;pre&gt;$ rm *.o *.hi; ghc -O --make fourfours.hs ; time ./fourfours &amp;gt; /dev/null
[1 of 1] Compiling Main             ( fourfours.hs, fourfours.o )
Linking fourfours ...

real	0m0.981s
user	0m0.876s
sys	0m0.108s
$ rm *.o *.hi; wine ghc -O --make fourfours.hs ; time wine ./fourfours.exe &amp;gt; /dev/null
[1 of 1] Compiling Main             ( fourfours.hs, fourfours.o )
Linking fourfours.exe ...

real	0m1.270s
user	0m1.036s
sys	0m0.072s
&lt;/pre&gt; 
&lt;p&gt;Funny. Anyways, I wanted to port arbtt. The only platform-dependent part is the capture module that gathers the list of open Windows. The &lt;a href=&quot;http://hackage.haskell.org/package/Win32&quot;&gt;Win32&lt;/a&gt; package that comes with the Haskell Platform did not cover all the functions needed to do so, but creating additional function bindings is really easy with Haskell, as can be seen in the &lt;a href=&quot;http://darcs.nomeata.de/arbtt/src/Graphics/Win32/Window/Extra.hsc&quot;&gt;Graphics.Win32.Window.Extra&lt;/a&gt; module. I also replaced the locking code that prevents two instances of &lt;tt&gt;arbtt-capture&lt;/tt&gt; to run at the same time by equivalent code using Windows mutexes (module &lt;a href=&quot;http://darcs.nomeata.de/arbtt/src/System/Win32/Mutex.hsc&quot;&gt;System.Win32.Mutex&lt;/a&gt;). With these small changes and some CPP conditionals to make the code compile for either platform, the porting was done! Even accessing the files in &lt;tt&gt;~/.arbtt&lt;/tt&gt; works correctly on Windows, where it will look in the Application Data folder,  without changing the code, thanks to &lt;a href=&quot;http://hackage.haskell.org/packages/archive/directory/latest/doc/html/System-Directory.html#v%3AgetAppUserDataDirectory&quot;&gt;System.Directory.getAppUserDataDirectory&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;But Windows users won’t like compiling software on their own. They won’t even like installing software by copying various files to certain directories. Therefore, I also had to create a Windows Installer. I picked &lt;a href=&quot;http://www.jrsoftware.org/isinfo.php&quot;&gt;Inno Setup&lt;/a&gt;, because it’s Free Software and seems to be simpler than NSIS. The installer puts the compiled &lt;tt&gt;.exe&lt;/tt&gt; files, the example &lt;tt&gt;categorize.cfg&lt;/tt&gt; and the HTML documentation in the right spot, adds icons to the Start Menu (“Edit categorize.cfg”, which fires up wordpad, a link to the documentation and the uninstaller), puts &lt;tt&gt;arbtt-capture&lt;/tt&gt; in the Autorun folder, puts the path to &lt;tt&gt;arbtt-stats&lt;/tt&gt; in the &lt;tt&gt;PATH&lt;/tt&gt; variable and starts &lt;tt&gt;arbtt-capture&lt;/tt&gt; at the end (the last three points being optional). Of course it undoes all this when removing the program again. I integrated the call to the Inno Setup installer into the usual ./&lt;a href=&quot;http://darcs.nomeata.de/arbtt/Setup.hs&quot;&gt;Setup&lt;/a&gt; build process of Haskell packages. Some more details of how to create the Windows installer are mentioned in the &lt;a href=&quot;http://darcs.nomeata.de/arbtt/README&quot;&gt;README&lt;/a&gt; file.&lt;/p&gt; 
&lt;p&gt;Now all this does not magically add a graphical user interface to arbtt, so users will still have to work with &lt;tt&gt;arbtt-stats&lt;/tt&gt; on the command line – even on Windows. If this is not a problem for you then you can fetch the latest installer from &lt;a href=&quot;http://www.joachim-breitner.de/projects#arbtt&quot;&gt;the arbtt homepage&lt;/a&gt;. And if you happen to become a serious user of arbtt on Windows and want to help maintaining the Windows port, I’ll gladly share some responsibilities.&lt;/p&gt; 
&lt;p&gt;I’m very satisfied with the process and the result and I’m happy to
know that I can offer some of my programs also to Windows users in the
future.It is also a big plus for Haskell – with Python, shipping a program for Windows users is likely more difficult. The next step will be providing gtk-based graphical Haskell applications for Windows, including a nice installer that ideally includes all dependencies (gtk etc.).&lt;br /&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 25 Dec 2009 18:48:00 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Packaged unicode-screensaver properly</title>
	<guid>https://www.joachim-breitner.de/blog/archives/355-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/355-Packaged-unicode-screensaver-properly.html</link>
	<description>&lt;p&gt;Three years ago, while I was in Ghana, I &lt;a href=&quot;https://www.joachim-breitner.de/blog/archives/204-Unicode-Hack.html&quot;&gt;wrote a small screensaver&lt;/a&gt; that displays a randomly picked unicode character full-screen. I like it because there is a huge bunch of very weird characters and signs in the unicode standard. It also prints the unicode codepoint and character name.&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;&lt;img width=&quot;651&quot; src=&quot;http://www.joachim-breitner.de/various/unicode-screensaver.png&quot; /&gt;&lt;/div&gt;&lt;p&gt;Now I finally got around to properly package it: Created a &lt;a href=&quot;http://www.joachim-breitner.de/projects#unicode-screensaver&quot;&gt;small homepage&lt;/a&gt;, a &lt;a href=&quot;http://www.joachim-breitner.de/archive/unicode-screensaver/&quot;&gt;source tarball&lt;/a&gt; with (hopefully) proper autotool files, all managed in a &lt;a href=&quot;http://git.nomeata.de/?p=unicode-screensaver.git&quot;&gt;git repository&lt;/a&gt; (also &lt;a href=&quot;http://gitorious.org/unicode-screensaver&quot;&gt;on gitorious&lt;/a&gt;), complete with manpage, README and other additional files. I’m also going to upload the package to Debian, so you can just do apt-get install &lt;a href=&quot;http://packages.debian.org/sid/unicode-screensaver&quot;&gt;unicode-screensaver&lt;/a&gt; as soon as it gets accepted.&lt;/p&gt;&lt;p&gt;It can probably not enter the official &lt;a href=&quot;http://www.jwz.org/xscreensaver/&quot;&gt;xscreensaver&lt;/a&gt; distribution as it adds dependencies on the fontconfig and freetype libraries.&lt;/p&gt;</description>
	<pubDate>Wed, 09 Dec 2009 13:54:20 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Second Post!</title>
	<guid>https://www.joachim-breitner.de/blog/archives/354-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/354-Second-Post!.html</link>
	<description>&lt;p&gt;Yesterday, the German magazine &lt;a href=&quot;http://www.cul.de/freex.html&quot;&gt;freeX&lt;/a&gt; published its December issue. It includes an three-page article about  &lt;a href=&quot;http://gitorious.org/vbox-sync&quot;&gt;vbox-sync&lt;/a&gt;, written by me, that is even mentioned on the cover page. After my article on the &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/56-Like-XSS,-just-simpler-and-harder-to-prevent-The-Cross-Site-Auth-XSA-Attack.html&quot;&gt;Cross-Site-Authentication attack&lt;/a&gt; that was published &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/84-Erste-Schritte-im-Journalismus.html&quot;&gt;in the German Linux-Magazin&lt;/a&gt; and the &lt;a href=&quot;http://www.joachim-breitner.de/blog/archives/108-International-Journalism-and-me.html&quot;&gt;international Linux Magazine&lt;/a&gt; in 2005, this is my second publication.&lt;/p&gt;&lt;p&gt;Vbox-sync is a tool to distribute VirtualBox images via apt-get that Phil Kern and I wrote as part of our work for &lt;a href=&quot;http://itomig.de/&quot;&gt;itomig.de&lt;/a&gt;, a German Free Software consulting company, and the &lt;a href=&quot;http://www.muenchen.de/limux&quot;&gt;LiMux&lt;/a&gt; project. I also held a &lt;a href=&quot;https://penta.debconf.org/dc9_schedule/events/476.en.html&quot;&gt;talk about it&lt;/a&gt; at the Debian Conference in Extremadura, Spain, in 2009.&lt;/p&gt;</description>
	<pubDate>Thu, 03 Dec 2009 22:28:59 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: screen-message now in an online version</title>
	<guid>https://www.joachim-breitner.de/blog/archives/353-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/353-screen-message-now-in-an-online-version.html</link>
	<description>&lt;p&gt;Folllowing an idea by &lt;a href=&quot;http://twitter.com/kaihendry/statuses/5920995902&quot;&gt;Kai Hendry&lt;/a&gt;, I re-implemented my Linux application screen-message, which does nothing but display a piece of text that you enter as large as possible, in HTML. So whenever you are in need of screen-message, but don’t have it installed at the moment, put your browser into fullscreen mode, go to&lt;/p&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://sm.nomeata.de&quot;&gt;http://sm.nomeata.de/&lt;/a&gt;&lt;/div&gt;&lt;p&gt;and type away.&lt;/p&gt;&lt;p&gt;I only tested it with the web browser &lt;a href=&quot;http://galeon.sourceforge.net/&quot;&gt;galeon&lt;/a&gt;, so I expect it to work with Firefox and related browsers. If it does not work with Internet Explorer, I can’t help it – but patches are welcome. The file is stored in the screen-message &lt;a href=&quot;http://darcs.net/&quot;&gt;Darcs&lt;/a&gt; repository at &lt;a href=&quot;http://darcs.nomeata.de/screen-message.upstream/&quot;&gt;http://darcs.nomeata.de/screen-message.upstream&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;PS: If anyone wants to donate a shorter domain for this, you are welcome. But I guess all good domains with “sm” in them are taken...&lt;/p&gt;</description>
	<pubDate>Fri, 27 Nov 2009 16:52:06 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: arbtt now in Debian</title>
	<guid>https://www.joachim-breitner.de/blog/archives/352-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/352-arbtt-now-in-Debian.html</link>
	<description>&lt;p&gt;The &lt;a href=&quot;http://www.joachim-breitner.de/projects#arbtt&quot;&gt;Automatic Rule Based Time Tracker&lt;/a&gt; that I have created some weeks ago is now available in Debian unstable, so if if you were reluctant to use it because you did not want to figure out how to compile the Haskell code, you can just do apt-get install &lt;a href=&quot;http://packages.debian.org/sid/arbtt&quot;&gt;arbtt&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Although it’s such a young project, it already has a fork: Andreas Klöckner was very impatient with a feature request (sensible merging of logs from different hosts), so we went ahead and re-implemented arbtt in python, named &lt;a href=&quot;http://git.tiker.net/whatup.git&quot;&gt;whatup&lt;/a&gt;. Although I prefer contributions to arbtt, it shows that the principle of arbtt is useful. And I won’t be shy to copy nice ideas from him, as well :-)&lt;/p&gt;</description>
	<pubDate>Mon, 23 Nov 2009 15:18:58 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Parody Song: „College teacher“</title>
	<guid>https://www.joachim-breitner.de/blog/archives/351-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/351-Parody-Song-College-teacher.html</link>
	<description>&lt;p&gt;Although it does not reflect my experiences at the university, I wrote a &lt;a href=&quot;http://www.joachim-breitner.de/content/parodie/College_Teacher&quot;&gt;song text about teachers that do not care about their students&lt;/a&gt;, to the melody of „Private Dancer“ of Tina Turner. My &lt;a href=&quot;http://www.joachim-breitner.de/content#parodie&quot;&gt;list of parody songs&lt;/a&gt; now contains 22 entries!&lt;/p&gt;</description>
	<pubDate>Fri, 20 Nov 2009 10:56:09 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>George Gyau: Is been a long time</title>
	<guid>http://egoleo.wordpress.com/2009/11/16/is-been-a-long-time/</guid>
	<link>http://egoleo.wordpress.com/2009/11/16/is-been-a-long-time/</link>
	<description>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Is been like ages since i blogged. Is been crazy for me since i got back to Ghana, land of my birth. but i am finally in control and want to start blogging seriously. expect more now.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/egoleo.wordpress.com/42/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/egoleo.wordpress.com/42/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/egoleo.wordpress.com/42/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/egoleo.wordpress.com/42/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/egoleo.wordpress.com/42/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/egoleo.wordpress.com/42/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/egoleo.wordpress.com/42/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/egoleo.wordpress.com/42/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/egoleo.wordpress.com/42/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/egoleo.wordpress.com/42/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=egoleo.wordpress.com&amp;blog=480684&amp;post=42&amp;subd=egoleo&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 16 Nov 2009 10:58:11 +0000</pubDate>
</item>
<item>
	<title>Joachim Breitner: Darcs Hacking Sprint: Mission Complete</title>
	<guid>https://www.joachim-breitner.de/blog/archives/350-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/350-Darcs-Hacking-Sprint-Mission-Complete.html</link>
	<description>&lt;p&gt;The &lt;a href=&quot;http://wiki.darcs.net/Sprints/2009-11&quot;&gt;darcs hacking sprint&lt;/a&gt; is slowly nearing its end. As planned, I have worked on integrating &lt;a href=&quot;http://darcswatch.nomeata.de/&quot;&gt;DarcsWatch&lt;/a&gt; and &lt;a href=&quot;http://bugs.darcs.net/&quot;&gt;bugs.darcs.net&lt;/a&gt;, and I am satisfied so far. From now on, if someone submits a Darcs patch to patches@darcs.net, the patch will also be tracked by DarcsWatch. DarcsWatch will display a link to the entry on bugs.darcs.net, and also add a comment to the bugtracker with a link to the patch on DarcsWatch. And eventually, if the patch is included in the darcs.net repository, DarcsWatch will change the state of the ticket to accepted, removing one step of work for the Darcs maintainers. Currently, it checks the state of the repository three times per hour, so expect a delay after you applied the patch to the repository before the state is updated.&lt;/p&gt;</description>
	<pubDate>Sun, 15 Nov 2009 16:15:30 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Arrived at the Darcs hacking sprint</title>
	<guid>https://www.joachim-breitner.de/blog/archives/349-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/349-Arrived-at-the-Darcs-hacking-sprint.html</link>
	<description>&lt;p&gt;Today, my alarm clock was set to 4:30, as I was going to Vienna, to attend the &lt;a href=&quot;http://wiki.darcs.net/Sprints/2009-11&quot;&gt;Darcs hacking sprint&lt;/a&gt;. I’ll be working on &lt;a href=&quot;http://darcswatch.nomeata.de/&quot;&gt;DarcsWatch&lt;/a&gt;, making it a bit more modular and hopefully integegrate it better into bug tracking systems (especially &lt;a href=&quot;http://roundup.sourceforge.net/&quot;&gt;roundup&lt;/a&gt;, as that’s &lt;a href=&quot;http://bugs.darcs.net/&quot;&gt;used by the Darcs team&lt;/a&gt;). On Monday, I’ll be a tourist until I leave in the evening. If any Debianers or Haskellers want to meet for keysigning or sightseeing, just drop me a mail!&lt;/p&gt;</description>
	<pubDate>Sat, 14 Nov 2009 08:32:05 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Maxi-Max-Algorithm</title>
	<guid>https://www.joachim-breitner.de/blog/archives/348-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/348-Maxi-Max-Algorithm.html</link>
	<description>&lt;div align=&quot;center&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;500&quot; title=&quot;You are a regular xkcd.com reader, are you?&quot; src=&quot;http://www.joachim-breitner.de/various/schaeferschach.png&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 12 Nov 2009 08:45:59 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Parody song „Another year at university“</title>
	<guid>https://www.joachim-breitner.de/blog/archives/347-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/347-Parody-song-Another-year-at-university.html</link>
	<description>&lt;p&gt;
The &lt;a href=&quot;http://www.joachim-breitner.de/content#parodie&quot;&gt;list of parody songs&lt;/a&gt; on my web site just got a bit longer: I changed the text of Phil Collins’ „Another day in paradise“ to „&lt;a href=&quot;http://www.joachim-breitner.de/content/parodie/Another_year_at_university&quot;&gt;Another year at university&lt;/a&gt;“, about a girl failing a math test. It’s not really funny, but the original wasn’t either.&lt;/p&gt;</description>
	<pubDate>Sun, 08 Nov 2009 11:23:00 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Releasing zpub as Free Software</title>
	<guid>https://www.joachim-breitner.de/blog/archives/346-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/346-Releasing-zpub-as-Free-Software.html</link>
	<description>&lt;p&gt;Earlier this year, &lt;a href=&quot;http://www.breitnerundbreitner.de/&quot;&gt;my brother&lt;/a&gt; and I developed a “documentation management server” for a small software developing company. They were sick of creating their documentation by sending around Word documents, having to manually merge them, losing changes and not getting a clean, consistent layout.&lt;/p&gt;&lt;p&gt;So we created &lt;a href=&quot;http://www.zpub.de/&quot;&gt;zpub&lt;/a&gt; for them: It is based on &lt;a href=&quot;http://en.wikipedia.org/wiki/DocBook&quot;&gt;DocBook&lt;/a&gt; and &lt;a href=&quot;http://subversion.tigris.org/&quot;&gt;Subversion&lt;/a&gt;, and adds a fairly nice web interface to it. Now their work flow is &lt;/p&gt;&lt;ol&gt;&lt;li&gt;The editor checks out the DocBook source document via Subversion. With a client like &lt;a href=&quot;http://tortoisesvn.tigris.org/&quot;&gt;TortoiseSVN&lt;/a&gt;, this is possible even for the less tech-savvy editor.&lt;/li&gt;&lt;li&gt;He works on the document using the editor of his choice. We recommended an editor with a proper DocBook mode such as the &lt;a href=&quot;http://www.xmlmind.com/xmleditor/&quot;&gt;XMLMind XML Editor&lt;/a&gt; or &lt;a href=&quot;http://www.syntext.com/products/serna-free/&quot;&gt;Serna Free&lt;/a&gt;, which was recently published as Free Software, to our customer.&lt;/li&gt;&lt;li&gt;When satisfied, he commits his changes via  Subversion, adding a comment describing his modifications.&lt;/li&gt;&lt;li&gt;On the server, zpub renders the document in the various output formats (.html, .pdf, .chm), and makes the result available via the web interface. The commit messages are put there, and all previous revisions of the document can still be accessed.&lt;/li&gt;&lt;li&gt;Optionally, an e-mail about the change is sent out to a per-document configurable list of recipients.&lt;/li&gt;&lt;li&gt;Optionally, the documents are rendered with a “DRAFT”-Watermark on the pages, to avoid leaking wrong revisions to the outside. Only users with extended rights are allowed to release a document, thus causing a version without that watermark to be rendered.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;For more details on the feature and usage of zpub, check out the documentation that you can find on &lt;a href=&quot;http://www.zpub.de/de/demo.html&quot;&gt;the demo instance&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;We are actually quite satisfied by zpub, and it would be a petty if that was just it. Of course, there are quite a view programs out that that can provide these features – plus many more, much more than a company the size of our customer would want to have (or even to worry about). So there is a niche between „sending Word documents by mail“ and „buying a very expensive, complicated product“ where zpub fits in.&lt;/p&gt;&lt;p&gt;Being a fan of Free Software myself, and since zpub is based on Free Software, we decided that we want to release zpub itself under a Free License. We chose the &lt;a href=&quot;http://ec.europa.eu/idabc/eupl&quot;&gt;EUPL&lt;/a&gt;, which is a GPL compatible license created by the European Commission, since our customer comes from a municipal environment. The &lt;a href=&quot;http://gitorious.org/zpub&quot;&gt;code is hosted on gitorious&lt;/a&gt; now, so if you have a need for zpub, just give it a try.&lt;/p&gt;&lt;p&gt;Also, if you run a Free Software project, manage your documentation in DocBook (or want to start to do so) and think that zpub might be a neat idea to allow more documentation writers to contribute, talk to me. I might well offer free hosting in that case. If you are a commercial user, I’m still offering hosting (and support or feature development), just not for free any more. Note that the zpub user interface and documentation is currently only available in German.&lt;/p&gt;</description>
	<pubDate>Fri, 06 Nov 2009 16:37:28 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Mimesweeper</title>
	<guid>https://www.joachim-breitner.de/blog/archives/345-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/345-Mimesweeper.html</link>
	<description>&lt;div align=&quot;center&quot;&gt;
&lt;img src=&quot;http://www.joachim-breitner.de/various/mimesweeper.jpg&quot; alt=&quot;Just the pun on the Windows game, no other deeper insights to be found here.&quot; /&gt;
&lt;/div&gt;</description>
	<pubDate>Tue, 03 Nov 2009 09:00:28 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: About the Freedoms of Web Services</title>
	<guid>https://www.joachim-breitner.de/blog/archives/344-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/344-About-the-Freedoms-of-Web-Services.html</link>
	<description>&lt;p&gt;For software, the question whether some software can be considered “free“ is relatively easy to decide: Check the license of the code against the list of free licenses of your trust (&lt;a href=&quot;http://opensource.org/licenses/alphabetical&quot;&gt;the OSI list&lt;/a&gt;, &lt;a href=&quot;http://www.gnu.org/philosophy/license-list.html&quot;&gt;the FSF list&lt;/a&gt; or the &lt;a href=&quot;http://wiki.debian.org/DFSGLicenses&quot;&gt;judgement applied by debian-legal&lt;/a&gt;) and that’s (mostly) it. When it comes to web services in the broader sense, including hosters, communication providers, social networks etc., this are not so clear. In this blog entry, I’ll try to list the various requirements that a service should fulfill and which I usually consider before deciding to use a service.&lt;/p&gt;&lt;h3&gt;The Requirements&lt;/h3&gt;&lt;h4&gt;A) Availability of source code&lt;/h4&gt;&lt;p&gt;Coming from the Free Software movement, this is the first requirement that comes to mind. If a web service claims to be free, then I want to be able to inspect how it is working, suggest and implement improvements and set up my own instance. For example, &lt;i&gt;&lt;a href=&quot;http://www.canonical.com/&quot;&gt;Canonical&lt;/a&gt;&lt;/i&gt;’s software housing setup &lt;i&gt;&lt;a href=&quot;https://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt;&lt;/i&gt; was itself not Free Software until very recently. Having access to the source code is also the reason why I prefer &lt;a href=&quot;http://gitorious.org/&quot;&gt;&lt;i&gt;gitorious&lt;/i&gt;&lt;/a&gt; over &lt;a href=&quot;http://github.com/&quot;&gt;&lt;i&gt;github&lt;/i&gt;&lt;/a&gt; for git hosting.&lt;/p&gt;&lt;h4&gt;B) Access to my data&lt;/h4&gt;&lt;p&gt;Depending on the kind of service, it might hold data from me or about me that are important, such as my emails on a webmail service. If I won’t have a way to easily retrieve my data to back it up or to move to a competitor, I’ll think twice before trusting my data to this service.&lt;/p&gt;&lt;h4&gt;C) Free data formats&lt;/h4&gt;&lt;p&gt;If there is accessible data, it should be in a format that I can easily get and use with a choice of (Free) software. Not sure if such a service exists, but an online office suite only supporting its own proprietary file format (possibly with its own proprietary offline office suit) would be no option for me.&lt;/p&gt;&lt;h4&gt;D) An  API&lt;/h4&gt;&lt;p&gt;For an extensively used service, I will want to have the possibility to optimize my user experience by automation. This requires that I can use the service not only in person, but also from tools I write. A very good example for this is &lt;a href=&quot;http://twitter.com/&quot;&gt;&lt;i&gt;Twitter&lt;/i&gt;&lt;/a&gt;: Besides registration, there is no need to use their web site at all and still use all the features, using the tools I find most fit for a task.&lt;/p&gt;&lt;h4&gt;E) Choice of providers&lt;/h4&gt;&lt;p&gt;Competition is good. If a service is only provided by a single company, and I become dependent on the service, I become dependent on the company. A few years ago, &lt;a href=&quot;http://sourceforge.net/&quot;&gt;&lt;i&gt;SourceForge&lt;/i&gt;&lt;/a&gt; was mostly the only provider of gratis, comprehensive software project hosting. By now, there are a few alternatives, such as &lt;i&gt;&lt;a href=&quot;http://alioth.debian.org/&quot;&gt;alioth&lt;/a&gt;&lt;/i&gt;, &lt;a href=&quot;http://savannah.gnu.org/&quot;&gt;&lt;i&gt;savannah&lt;/i&gt;&lt;/a&gt; or &lt;i&gt;&lt;a href=&quot;http://code.google.com/hosting/&quot;&gt;google code&lt;/a&gt;&lt;/i&gt;, which is appreciated. Note that when it comes to the proprietary instant messaging services (&lt;a href=&quot;http://www.icq.com/&quot;&gt;&lt;i&gt;ICQ&lt;/i&gt;&lt;/a&gt;, &lt;a href=&quot;http://messenger.yahoo.com/&quot;&gt;&lt;i&gt;yahoo messenger&lt;/i&gt;&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Windows_Live_Messenger&quot;&gt;&lt;i&gt;MSN messenger&lt;/i&gt;&lt;/a&gt;), there is no choice of providers: To talk to my buddies on a certain network, I am bound to that provider. The same applies to social networks (&lt;a href=&quot;http://www.facebook.com/&quot;&gt;&lt;i&gt;Facebook&lt;/i&gt;&lt;/a&gt;, &lt;a href=&quot;http://www.studivz.net/&quot;&gt;&lt;i&gt;StudiVZ&lt;/i&gt;&lt;/a&gt;, &lt;a href=&quot;http://www.xing.com/&quot;&gt;&lt;i&gt;XING&lt;/i&gt;&lt;/a&gt;), and is one of the reasons why I shun these yet. &lt;/p&gt;&lt;h4&gt;F) Federation between providers&lt;/h4&gt;&lt;p&gt;If there is  a choice of providers, and the service in question provides some kind of communication, it is very desirable if I can interact with users of the service on other providers. A very good example for this is e-mail: People @&lt;a href=&quot;http://www.gmx.net/&quot;&gt;gmx.net&lt;/a&gt; can send mails to people @&lt;a href=&quot;http://www.aol.com/&quot;&gt;aol.com&lt;/a&gt;, and I can have @&lt;a href=&quot;http://www.joachim-breitner.de/&quot;&gt;joachim-breitner.de&lt;/a&gt; and still communicate with everyone. This was not always the matter of course: Before Internet e-mail was common, people on &lt;i&gt;AOL&lt;/i&gt; could not get in touch with people at &lt;a href=&quot;http://en.wikipedia.org/wiki/CompuServe&quot;&gt;CompuServe&lt;/a&gt;. These days, the problem persists with instant messaging (&lt;a href=&quot;http://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol&quot;&gt;&lt;i&gt;Jabber&lt;/i&gt;&lt;/a&gt; a.k.a. &lt;i&gt;XMPP&lt;/i&gt; being the notable exception) and social networks. Also sites like &lt;i&gt;gitorious&lt;/i&gt; or &lt;i&gt;github&lt;/i&gt; could support federation if they would allow to create branches of repositories that are hosted elsewhere, allowing their users to use the familiar interface with all repositories they work with.&lt;/p&gt;&lt;h3&gt;Analysis of a few services&lt;/h3&gt;&lt;p&gt;So far the theory. Let’s see how various services fare.&lt;/p&gt;&lt;h4&gt;e-mail&lt;/h4&gt;&lt;p&gt;Being from the old times of the Internet, when everything was better, it does not surprise that this passes all requirements: There is a large amount of Free e-mail servers and clients to choose from, my data is easily moved via well-known protocols such as POP or IMAP and save in standardized format. There is an abundance of service providers, and they all talk to each other. One could argue that the openness of email causes problems like spam, but I’d say that this might be a design issue, but not inherent to the above criteria.&lt;/p&gt;&lt;p&gt;Pretty much the same analysis applies to &lt;b&gt;Jabber/XMPP&lt;/b&gt;.&lt;/p&gt;&lt;h4&gt;ICQ&lt;/h4&gt;&lt;p&gt;I joined when I was young and unwise. Now I am stuck to &lt;i&gt;AOL&lt;/i&gt; to keep in touch with a relevent part of my online correspondence. To use it on the operating system of my choice, other people had to reverse engineer the protocol and any time, &lt;i&gt;AOL&lt;/i&gt; could change how its servers work and I’ll be locked out. I can not get in touch with people on other networks, my buddy roster is not easily backed up and restored, and no, we can not see the source of the &lt;i&gt;ICQ&lt;/i&gt; servers. I’d wish I could switch over to &lt;i&gt;Jabber&lt;/i&gt; completely, but there are always a few important people who do not use that yet.&lt;/p&gt;&lt;h4&gt;Github/Gitorious&lt;/h4&gt;&lt;p&gt;Although &lt;i&gt;gitorious&lt;/i&gt; is slightly older, &lt;i&gt;github&lt;/i&gt; managed to become more famous. These web sites allow developers to publish their source code and other contributors to easily branch, work on their changes, and propose them for merging in the main code. They are based on git, so I can get my data. There is a choice of providers. I am not sure how well I can access their functionality (merge requests etc.) programmatically. As said before, they do not interact well, and only &lt;i&gt;gitorious&lt;/i&gt; has published its code.&lt;/p&gt;&lt;h4&gt;Facebook/StudiVZ&lt;/h4&gt;&lt;p&gt;Very disappointing. I have heard that &lt;i&gt;Facebook&lt;/i&gt; offers you a rich API, but otherwise, they fail every category. This is one of the reasons why I am not to be found on these networks yet.&lt;/p&gt;&lt;h4&gt;Twitter/identi.ca&lt;/h4&gt;&lt;p&gt;&lt;i&gt;Twitter&lt;/i&gt;, similar to &lt;i&gt;Facebook&lt;/i&gt;, excels in the category “API”, but fails in the others. A better alternative is &lt;a href=&quot;http://identi.ca/&quot;&gt;&lt;i&gt;identi.ca&lt;/i&gt;&lt;/a&gt;: The software behind it is free, I can download contact data etc. It even supports federation via &lt;a href=&quot;http://en.wikipedia.org/wiki/OpenMicroBlogging&quot;&gt;&lt;i&gt;OpenMicroBlogging&lt;/i&gt;&lt;/a&gt;, although  that did not break through yet it, it seems.&lt;/p&gt;&lt;h4&gt;OpenID&lt;/h4&gt;&lt;p&gt;Another very good example for what I want is &lt;a href=&quot;http://en.wikipedia.org/wiki/OpenID&quot;&gt;&lt;i&gt;OpenID&lt;/i&gt;&lt;/a&gt;, a service that allows websites to accept a user’s credentials from another site. This saves the user from having to create accounts everywhere. There are free implementations, multiple providers, I can easily switch between them. A great feature of &lt;i&gt;OpenID&lt;/i&gt; that goes a bit beyond federation is delegation: On the start page of my homepage http://www.joachim-breitner.de/, I saved who my OpenID provider is. Now I can use  http://www.joachim-breitner.de/ as my &lt;i&gt;OpenID&lt;/i&gt;, and even if I change my provider, this stays valid! This is a feature that not even &lt;i&gt;XMPP&lt;/i&gt; easily provides.&lt;/p&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;p&gt;Whether a web service is really free is a complicated question and has a graded answer. One has to balance the benefits of using a web service against the freedoms it is missing. I hope that in the long run, services fulfilling most or all of these requirements will prevail, so that I’ll be networking socially and blogging microly with a good conscience.&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;</description>
	<pubDate>Sun, 25 Oct 2009 20:37:00 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Odzangba Dake: How to Fix “subprocess pre-removal script returned error exit status 2″ Error</title>
	<guid>http://odzangba.wordpress.com/?p=319</guid>
	<link>http://odzangba.wordpress.com/2009/10/14/how-to-fix-%e2%80%9csubprocess-pre-removal-script-returned-error-exit-status-2%e2%80%b3-error/</link>
	<description>&lt;br /&gt;&lt;p&gt;UPDATE: Thanks to &lt;cite&gt;Msz Junk &lt;/cite&gt;for pointing out the typos in the file paths.&lt;/p&gt;
&lt;p&gt;What I really should have done was to link to &lt;a href=&quot;http://www.khattam.info/2009/08/04/solved-subprocess-pre-removal-script-returned-error-exit-status-2-error/comment-page-1/#comment-834&quot; target=&quot;_blank&quot;&gt;khattam&amp;#8217;s article&lt;/a&gt; because he did a pretty good job of describing the solution to this error but for my own archives, here goes&amp;#8230;. I upgraded my box to Karmic Koala this evening and for some reason, &lt;strong&gt;ubiquity-frontend-kde&lt;/strong&gt; flipped and borked the package management system. When I tried to open Synaptic, I got this:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;size-full wp-image-321 aligncenter&quot; title=&quot;Synaptic Error&quot; src=&quot;http://odzangba.files.wordpress.com/2009/10/screenshot-untitled-window.png?w=500&amp;h=300&quot; alt=&quot;Click to view a screenshot of Synaptic's error message&quot; width=&quot;500&quot; height=&quot;300&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So I tried&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo aptitude &amp;#8211;configure -a&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;and&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo apt-get install -f&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;and even tried messing with these:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;/var/lib/dpkg/info/dbconfig-common.postinst&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;/var/lib/dpkg/info/dbconfig-common.postrm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;but the system wouldn&amp;#8217;t budge. Then I found &lt;a href=&quot;http://www.khattam.info/2009/08/04/solved-subprocess-pre-removal-script-returned-error-exit-status-2-error/comment-page-1/#comment-834&quot; target=&quot;_blank&quot;&gt;khattam&amp;#8217;s article&lt;/a&gt; and realized I was looking in the wrong files. To solve this error, close all package management software, and back up and edit the &lt;strong&gt;/var/lib/dpkg/status&lt;/strong&gt; file with the following commands:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo cp /var/lib/dpkg/status /var/log/dpkg/status.old&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gksudo gedit /var/lib/dpkg/status&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here comes the dicey part. Search for the package causing all this brouhaha and delete its entry. Please be very careful here and make sure you leave a blank line between the package entries below or above the deleted package entry. Here are screenshots of my file before and after selecting the appropriate package description entry.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a href=&quot;http://odzangba.files.wordpress.com/2009/10/screenshot-status-b4.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-325&quot; title=&quot;Before&quot; src=&quot;http://odzangba.files.wordpress.com/2009/10/screenshot-status-b4.png?w=500&amp;h=375&quot; alt=&quot;Before&quot; width=&quot;500&quot; height=&quot;375&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://odzangba.files.wordpress.com/2009/10/screenshot-status-after.png&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-326&quot; title=&quot;After&quot; src=&quot;http://odzangba.files.wordpress.com/2009/10/screenshot-status-after.png?w=500&amp;h=375&quot; alt=&quot;After&quot; width=&quot;500&quot; height=&quot;375&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you did this right you should be able to open Synaptic and remove the offending package (if you don&amp;#8217;t want it any more) or re-install it.I don&amp;#8217;t understand why the developers couldn&amp;#8217;t cook up a more graceful way for dpkg to show its displeasure.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/319/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/319/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/319/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/319/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/319/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/319/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/319/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/319/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/319/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/319/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=319&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Wed, 14 Oct 2009 01:05:05 +0000</pubDate>
</item>
<item>
	<title>Odzangba Dake: How To Disable Compcache (and Fix Swap Errors) in Ubuntu 9.04</title>
	<guid>http://odzangba.wordpress.com/?p=302</guid>
	<link>http://odzangba.wordpress.com/2009/10/12/how-to-disable-compcache-and-fix-swap-errors-in-ubuntu-9-04/</link>
	<description>&lt;br /&gt;&lt;p&gt;For weeks now my Jaunty box would lock up unexpectedly and only a hard reset could bring it back to life. Since it did not happen often, I just brushed it off&amp;#8230; to be completely honest, I was too lazy to track down the problem. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt;  But my box locked up again a few minutes ago as I was waiting on a very important download and after I&amp;#8217;d exhausted my vocabulary of swear words (and seriously contemplated throwing my monitor through the window), I decided I&amp;#8217;d had enough. I examined my logs and noticed these errors around the time the lock-up kicked in:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;compcache: Error allocating memory for compressed page: 37691, size=28&lt;br /&gt;
compcache: Error allocating memory for compressed page: 126848, size=233&lt;br /&gt;
compcache: Error allocating memory for compressed page: 106315, size=40&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So I googled compcache and found out that it &lt;a title=&quot;Click to read explanation on the ubuntu-users mailing list&quot; href=&quot;https://lists.ubuntu.com/archives/ubuntu-users/2009-February/174405.html&quot; target=&quot;_blank&quot;&gt;wasn&amp;#8217;t supposed to be active on permanent installations like mine&lt;/a&gt;. Basically, it helps computers with low RAM to comfortably load a livecd session through a fairly boring use of &amp;#8220;virtual RAM.&amp;#8221; The important thing is, it should only kick in during a livecd session. It&amp;#8217;s also quite unstable.  Read more about compcache &lt;a title=&quot;Ubuntu Compcache Specification&quot; href=&quot;https://wiki.ubuntu.com/Compcache&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To find out if compcache is active on your system, do:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; sudo swapon -s&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; &lt;/strong&gt;If you see &lt;strong&gt;/dev/ramzswap&lt;/strong&gt;, compcache is plotting to lock up your box when you least expect it. To permanently disable compcache, do:&lt;/p&gt;
&lt;p&gt;s&lt;strong&gt;udo rm -f /usr/share/initramfs-tools/conf.d/compcache &amp;amp;&amp;amp; sudo update-initramfs -u&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then either reboot or do a&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo swapoff /dev/ramzswap{insert the device number here}&lt;/strong&gt;&amp;#8230; so for example:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo swapoff /dev/ramzswap1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The morale of the story is, don&amp;#8217;t be lazy&amp;#8230; it took me about three minutes to track down the problem, fix it and get on with my life. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;  Now I have to restart this 700MB download. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif&quot; alt=&quot;:(&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/302/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/302/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/302/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/302/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/302/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/302/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/302/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/302/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/302/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/302/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=302&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Mon, 12 Oct 2009 03:13:49 +0000</pubDate>
</item>
<item>
	<title>Joachim Breitner: arbtt: Now with Documentation</title>
	<guid>https://www.joachim-breitner.de/blog/archives/342-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/342-arbtt-Now-with-Documentation.html</link>
	<description>&lt;p&gt;Yesterday I did what Free Software authors supposedly don’t do. I wrote documentation. In fact, I had a relatively detailed README already, but I thought this would be a good opportunity to create a more elaborate documentation, using the ubiquitous  DocBook. You can read the &lt;a href=&quot;http://darcs.nomeata.de/arbtt/doc/users_guide/&quot;&gt;HTML documentation for arbtt&lt;/a&gt; online, where it’s automatically updated when I push to the &lt;a href=&quot;http://darcs.nomeata.de/arbtt&quot;&gt;darcs repository&lt;/a&gt;. You can see, I use the same CSS file that most Haskell-related DocBook documentation seems to use.&lt;/p&gt;&lt;p&gt;One motivation to use &lt;a href=&quot;http://www.docbook.org/&quot;&gt;DocBook&lt;/a&gt; was that I can extract manpages from it, which should be present if I package arbtt for Debian. I was about to complain that references from the manpages to other part of the documentation can not work sensibly, but using the &lt;a href=&quot;http://www.sagehill.net/docbookxsl/Profiling.html&quot;&gt;“profiling” feature&lt;/a&gt; of docbook-xsl, I can replace them by a textual reference to the user’s manual if the file is processed for manpage output. Have a look at &lt;a href=&quot;http://darcs.nomeata.de/cgi-bin/darcsweb.cgi?r=arbtt;a=commitdiff;h=20091011095133-23c07-07121a9d8fc2fa653342b367227a6d464e0dc437.gz&quot;&gt;my changes for that&lt;/a&gt; if you want to know how it works.&lt;/p&gt;&lt;p&gt;For some reason, the &amp;lt;refentry&amp;gt;-tags that make up the manpages are split to separate files when generating chunked HTML output, but they do not appear in the table of contents. You have to find a spot in the text where they are linked, as they are now in the section “&lt;a href=&quot;http://darcs.nomeata.de/arbtt/doc/users_guide/references.html&quot;&gt;Program references&lt;/a&gt;”, to find them. This is unfortunate, I expect that a few readers might miss this important part of the documentation. Am I doing something wrong?&lt;/p&gt;&lt;p&gt;For the configuration file, I put an &lt;a href=&quot;http://darcs.nomeata.de/arbtt/doc/users_guide/configuration.html#grammar&quot;&gt;EBNF-style grammar description&lt;/a&gt; in the documentation. There is a special &lt;a href=&quot;http://www.docbook.org/schemas/ebnf.html&quot;&gt;DocBook module&lt;/a&gt; for that, but I’m not satisfied with it. On the right hand side of production rules, it has only special support for nonterminals, but no tags to semantically mark up choice, repetition etc. I followed the lead found at the &lt;a href=&quot;http://yaml.org/spec/1.2/spec.dbk&quot;&gt;YAML specification&lt;/a&gt; and put &amp;lt;quote&amp;gt;-Tags around literal parts of the grammar, but this is not valid according to the DocBook DTD. Speaking of the DTD: I guess since the EBNF-stuff is just a module, the tag &amp;lt;productionset&amp;gt; is not a valid content of &amp;lt;figure&amp;gt;. So, if I choose to use the EBNF module in a sensible way, I will not have a valid DocBook file.&lt;/p&gt;&lt;p&gt;All in all, I am satisified with the result. Especially that nobody can say any more “I like your program, but I can’t contribute, because I don’t know Haskell”. Just improve the docs! :-)&lt;/p&gt;</description>
	<pubDate>Sun, 11 Oct 2009 10:01:00 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Kofi Boakye: The Global Village</title>
	<guid>http://kdex.wordpress.com/2009/10/06/the-global-village/</guid>
	<link>http://kdex.wordpress.com/2009/10/06/the-global-village/</link>
	<description>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;If the world is now a global village, then I guess Aunt Araba can go and spy on what Mrs Obama is cooking for supper nd we the village elders sit and drink some pito with Osama and Gordon Brown while the German chancellor  plays ampe with Sirleaf Johnson.Now where r the power chaskele boys , Mugabe and Wen Jiabao??&lt;/p&gt;
&lt;p&gt;ah these boy paa !!&lt;/p&gt;
&lt;p&gt;(Memoirs of a global village elder)&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/kdex.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/kdex.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/kdex.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/kdex.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/kdex.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/kdex.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/kdex.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/kdex.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/kdex.wordpress.com/32/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/kdex.wordpress.com/32/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=kdex.wordpress.com&amp;blog=1707633&amp;post=32&amp;subd=kdex&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 06 Oct 2009 14:19:42 +0000</pubDate>
</item>
<item>
	<title>Kofi Boakye: Karmic Kaola Goodness !!</title>
	<guid>http://kdex.wordpress.com/?p=27</guid>
	<link>http://kdex.wordpress.com/2009/10/06/karmic-kaola-goodness/</link>
	<description>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Wow!!&lt;/p&gt;
&lt;p&gt;Just spent over three hours downloading the Karmic Kaola beta  over a crappy wireless connection.&lt;/p&gt;
&lt;p&gt;And I just got to shout &amp;#8220;Wow!!&amp;#8221;. Beta saf be this. Man, they really put some good work into this stuff.Little touches here and there . And I think my screen display just increased or something cuz there seems to be more space on the desktop. No kidding !! It is really worth the long wait , short fevered naps and the ever present angelically annoying mosquitoes buzzing and taking painful dives at my body&amp;#8230;Karmic Kaola rocks , though there&amp;#8217;s still more work to be done..And this time I hope to be part of it contributing my quota to it!!&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;attachment wp-att-28&quot; href=&quot;http://kdex.wordpress.com/2009/10/06/karmic-kaola-goodness/screenshot/&quot;&gt;&lt;img class=&quot;aligncenter size-medium wp-image-28&quot; title=&quot;Screenshot&quot; src=&quot;http://kdex.files.wordpress.com/2009/10/screenshot.png?w=300&amp;h=225&quot; alt=&quot;Screenshot&quot; width=&quot;300&quot; height=&quot;225&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/kdex.wordpress.com/27/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/kdex.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/kdex.wordpress.com/27/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/kdex.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/kdex.wordpress.com/27/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/kdex.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/kdex.wordpress.com/27/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/kdex.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/kdex.wordpress.com/27/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/kdex.wordpress.com/27/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=kdex.wordpress.com&amp;blog=1707633&amp;post=27&amp;subd=kdex&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 06 Oct 2009 06:50:08 +0000</pubDate>
</item>
<item>
	<title>Joachim Breitner: arbtt goes Binary</title>
	<guid>https://www.joachim-breitner.de/blog/archives/341-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/341-arbtt-goes-Binary.html</link>
	<description>&lt;p&gt;Three weeks ago, I announced the &lt;a href=&quot;https://www.joachim-breitner.de/blog/archives/336-The-Automatic-Rule-Based-Time-Tracker.html&quot;&gt;automatic rule-based time tracker&lt;/a&gt; here, and it seems that there are actually users out there :-). Since then, it has recorded more than 240 hours of my computer’s uptime in about 15000 samples. Until now, this data was stored in a simple text file, one line per entry, and relying on Haskell’s Show/Read instances to do the serialization. Although not quite unexpected, this turned out to be a severe bottleneck: Already, it takes more than 25 seconds to parse the log file on my computer.&lt;/p&gt;&lt;p&gt;Following an advice given to me on the #haskell IRC channel, I switched to a binary representation of the data, using the very nice &lt;a href=&quot;http://code.haskell.org/binary/&quot;&gt;Data.Binary&lt;/a&gt; module. The capture program will automatically detect if the log file is in the old format, move it away and convert the entries to binary data. And voilà, the statistics program evalutes my data in about two seconds! This should be fast enough for quite a while, I hope.&lt;/p&gt;&lt;p&gt;In my binary instances, which you can find in &lt;a href=&quot;http://darcs.nomeata.de/arbtt/src/Data.hs&quot;&gt;Data.hs&lt;/a&gt;, I prepended a version tag to each entry. This hopefully allows me to add more fields to the log file later, while still being able to parse the old data directly and without conversion. To still be able to manually inspect the recorded data, the program arbtt-dump was added to the package. The new version is uploaded to &lt;a href=&quot;http://hackage.haskell.org/package/arbtt&quot;&gt;hackage&lt;/a&gt; as 0.3.0.&lt;/p&gt;&lt;p&gt;One thing still worries me: With the old format, I could easily throw away unparseable lines in the log file (e.g. from a partial write) and still read the rest of it. With the new code, there is no such robustness: If the file breaks somewhere, it will be unreadable in its whole, or at least to the broken point. I’m not sure what to do about that problem, but given the very low number of bytes written each time, I hope that it will just not happen.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 04 Oct 2009 11:09:00 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Kofi Boakye: From Gnome to KDE and back again</title>
	<guid>http://kdex.wordpress.com/?p=24</guid>
	<link>http://kdex.wordpress.com/2009/09/19/from-gnome-to-kde-and-back-again/</link>
	<description>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;First cut is the deepest as they say and its really&lt;/p&gt;
&lt;p&gt;I tried KDE 4.3 over the week and I must admit they got some bling,bling. Wow!! Great work, guys and ladies.. The panel looked more spacious and the various effects and widgets/ plasmoids were just amazing !! And the preview effects in Dolphin were just over the top. (Top that if u can, Windows 7)&lt;/p&gt;
&lt;p&gt;But then ,bam, without any warning stuff just started to mess up .First it was my Intel graphics cards not agreeing with compiz.(though KDE still looked good and handled ok without the bling,bling) Then KPackage Kit just made me boil with its interface. I mean, if I want to go through the list of available and installed software I d**n well want to see it all without typing keywords to get a list. sheesh!! Of course it just made me love Synaptic all the more)&lt;/p&gt;
&lt;p&gt;Finally I just gave up and guiltily run back to Gnome. So simple!&lt;/p&gt;
&lt;p&gt;Of course I&amp;#8217;m waiting with huge anticipation for the final version of Karmic Kaola. Even the Alpha releases do show some serious improvements that  make me swell extra extra with pride at being a linux user. Go Karmic Kaola team!! All the best !!&lt;/p&gt;
&lt;p&gt;After Karmic , I&amp;#8217;m definitely gonna become a full time evangelist for Linux Usage in Ghana&amp;#8230;.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/kdex.wordpress.com/24/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/kdex.wordpress.com/24/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/kdex.wordpress.com/24/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/kdex.wordpress.com/24/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/kdex.wordpress.com/24/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/kdex.wordpress.com/24/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/kdex.wordpress.com/24/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/kdex.wordpress.com/24/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/kdex.wordpress.com/24/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/kdex.wordpress.com/24/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=kdex.wordpress.com&amp;blog=1707633&amp;post=24&amp;subd=kdex&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Sat, 19 Sep 2009 22:05:36 +0000</pubDate>
</item>
<item>
	<title>Joachim Breitner: Freaking out with LaTeX</title>
	<guid>https://www.joachim-breitner.de/blog/archives/337-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/337-Freaking-out-with-LaTeX.html</link>
	<description>&lt;p&gt;If you want to play a trick on a colleague who is writing a LaTeX document: Open the file, copy the entire contents of the file and paste it at the very end. LaTeX will happily process the file and render the first part. But your colleague will likely try to edit the end of the file and soon feel haunted because his changes to the file have no effect – no matter how often he deletes the resulting PDF file or any intermediate file, how often he renames the original file or moves it somewhere else...&lt;/p&gt;&lt;p&gt;(Just happened to me, but not due to a mean colleague, but due to some accidential vim commands.)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Mon, 14 Sep 2009 08:33:11 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: The Automatic Rule-Based Time Tracker</title>
	<guid>https://www.joachim-breitner.de/blog/archives/336-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/336-The-Automatic-Rule-Based-Time-Tracker.html</link>
	<description>&lt;p&gt;A while ago, I thought: „I seem to be less productive than I used to be. Why might that be? Do I spend more and more time with e-Mails? Or is it something else?“ I couldn’t tell, so I needed a time tracking tool. There are a few of those for Linux that allow you, while working, specify what you are doing and then generate statistics about it. This approach has a few disadvantages:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It is distracting (and I want to &lt;i&gt;increase&lt;/i&gt; productivity).&lt;/li&gt;&lt;li&gt;You can only record one kind of information. So either, you record &lt;i&gt;what&lt;/i&gt; you are doing (writing e-Mails, surfing the web, programming), or &lt;i&gt;why&lt;/i&gt; you are doing it (work, study, leisure). You can not easily record both.&lt;/li&gt;&lt;li&gt;If you are lazy and don’t keep updating it, the statistics will be useless.&lt;/li&gt;&lt;li&gt;You won’t be able to catch a little thing like quickly answering an e-Mail or looking for the weather report.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So I created &lt;b&gt;arbtt, the Automatic Rule-Based Time Tracker&lt;/b&gt;. It comes with a background program that is started with your desktop session and will, each minute, record what windows are open, which one is active, what their titles and corresponding programs are. It also checks how long the user has been idle. No interaction required, no distraction possible. This information is stored in a log file. A separate tool allows the user to investigate this data. It is called rule-based because the mapping from the raw data to sensible “tags” that give information about the time sample is specified by a simple, but hopefully sufficiently powerful language.&lt;/p&gt;&lt;p&gt;A simple example for a rule that indicates the currently used program would be:&lt;/p&gt;&lt;pre&gt;tag Program:$current.program,&lt;/pre&gt;&lt;p&gt;The prefix “Program:” is a category. Arbtt will ensure that for each time sample and category, at most one tag is specified. A more complex rule is&lt;/p&gt;&lt;pre&gt;current window $title =~ m!(?:~|home/jojo)/projekte/(?:programming/(?:haskell/)?)?([^/)]*)!&lt;br /&gt;  ==&amp;gt; tag Project:$1,&lt;/pre&gt;&lt;p&gt;which makes use of the fact that both GVim and gnome-terminal display the full path to the currently edited file resp. to the working directory in the window title. This rule will track all my projects separately, and even automatically pick up new projects when they appear! You can see more rules in the &lt;a href=&quot;http://darcs.nomeata.de/arbtt/categorize.cfg&quot;&gt;example file&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The statistics program then allows you to query the tags with some options:&lt;/p&gt;&lt;pre&gt;Usage: arbtt-stats [OPTIONS...]&lt;br /&gt;  -h, -?       --help                 show this help&lt;br /&gt;  -V           --version              show the version number&lt;br /&gt;  -x TAG       --exclude=TAG          ignore samples containing this tag&lt;br /&gt;  -o TAG       --only=TAG             only consider samples containing this tag&lt;br /&gt;               --also-inactive        include samples with the tag &amp;quot;inactive&amp;quot;&lt;br /&gt;  -m PERC      --min-percentage=PERC  do not show tags with a percentage lower than PERC% (default: 1)&lt;br /&gt;  -i           --information          show general statistics about the data&lt;br /&gt;  -t           --total-time           show total time for each tag&lt;br /&gt;  -c CATEGORY  --category=CATEGORY    show statistics about category CATEGORY&lt;/pre&gt;&lt;p&gt;For example, if I want to know what folders I have open while using evolution, I can run &lt;tt&gt;arbtt-stats -o Program:evolution -c Evo-Folder -m 3&lt;/tt&gt; to see this:&lt;/p&gt;&lt;pre&gt;Statistics for category Evo-Folder&lt;br /&gt;==================================&lt;br /&gt;                         ||       Time Percentage&lt;br /&gt;=========================++======================&lt;br /&gt;      Evo-Folder:Eingang ||  22h20m00s      17.0%&lt;br /&gt;     Evo-Folder:Bekannte ||  16h40m00s      12.7%&lt;br /&gt;    Evo-Folder:d-haskell ||   9h40m00s       7.4%&lt;br /&gt;       Evo-Folder:Itomig ||   8h20m00s       6.4%&lt;br /&gt;   Evo-Folder:Verschickt ||   7h40m00s       5.8%&lt;br /&gt;Evo-Folder:pkg-fso-maint ||   7h00m00s       5.3%&lt;br /&gt;         Evo-Folder:Bugs ||   6h00m00s       4.6%&lt;br /&gt;Evo-Folder:planet debian ||   4h00m00s       3.0%&lt;br /&gt;    (60 entries omitted) ||   4h49m00s      36.7%&lt;br /&gt;        (unmatched time) ||      8m00s       1.0%&lt;/pre&gt;&lt;p&gt;One big advantage of this approach is that you do not need to know in advance what queries you are interested in. Since the rules are applied when you are evaluating your data, and not when recording it, you can add more tags and forgotten special cases later.&lt;/p&gt;&lt;p&gt;At this point, a big &lt;b&gt;warning&lt;/b&gt; is due: This program will record a lot of very sensitive information about you. Be aware of this before you start using arbtt, and make sure you protect your data. You can get rid of all logs by deleting ~/.arbtt/capture.log.&lt;/p&gt;&lt;p&gt;I have published &lt;a href=&quot;http://hackage.haskell.org/package/arbtt&quot;&gt;arbtt on hackage&lt;/a&gt;. If you have &lt;a href=&quot;http://haskell.org/cabal/download.html&quot;&gt;cabal-install&lt;/a&gt; installed, you can install it with cabal install arbtt. See the &lt;a href=&quot;http://darcs.nomeata.de/arbtt/README&quot;&gt;README file&lt;/a&gt; for more information about setting it up. Depending on the feedback I get I will also consider packaging it for Debian.&lt;/p&gt;&lt;p&gt;If you want to contribute, you are very welcome. The code is available at the darcs repository &lt;a href=&quot;http://darcs.nomeata.de/arbtt/&quot;&gt;http://darcs.nomeata.de/arbtt/&lt;/a&gt; (&lt;a href=&quot;http://darcs.nomeata.de/cgi-bin/darcsweb.cgi?r=arbtt;a=summary&quot;&gt;DarcsWeb&lt;/a&gt;). See the README for some ideas what to implement and feel free to come up with new ideas.&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 13 Sep 2009 10:01:00 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Odzangba Dake: Fix Dolphin Thumbnail Previews</title>
	<guid>http://odzangba.wordpress.com/?p=295</guid>
	<link>http://odzangba.wordpress.com/2009/09/12/fix-dolphin-thumbnail-previews/</link>
	<description>&lt;br /&gt;&lt;p&gt;Dolphin, the KDE 4 file manager, needs a little help in order to display thumbnails of videos. It uses &lt;strong&gt;mplayerthumbs&lt;/strong&gt; to generate the thumbnails. Unfortunately, mplayerthumbs is not pulled in as a dependency when installing dolphin. I don&amp;#8217;t know what the developers were thinking. Video thumbnails are integral to any modern desktop. It doesn&amp;#8217;t make sense to ask users to manually install an extra package in order to enjoy this feature. Anyway, do a quick&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;sudo aptitude install mplayerthumbs&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;on the terminal or search for and install &lt;strong&gt;mplayerthumbs&lt;/strong&gt; in the Synaptic package manager, and dolphin will be able to generate thumbnails for your video collection.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/295/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/295/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/295/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/295/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/295/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/295/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/295/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/295/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/295/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/295/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=295&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Sat, 12 Sep 2009 16:59:44 +0000</pubDate>
</item>
<item>
	<title>Odzangba Dake: Using Google Talk With Kopete</title>
	<guid>http://odzangba.wordpress.com/?p=279</guid>
	<link>http://odzangba.wordpress.com/2009/09/01/using-google-talk-with-kopete/</link>
	<description>&lt;br /&gt;&lt;p&gt;I got bored over the weekend and did a fresh install of Jaunty. In part I wanted to try out backing up and restoring application settings and other data. It worked out pretty well. I last used Kopete in 2006 and I was a little curious so I installed and fired it up. Adding a &lt;strong&gt;Yahoo&lt;/strong&gt; messenger account worked flawlessly but &lt;strong&gt;Google Talk&lt;/strong&gt; choked on some weird ssl error. As it turned out after some googling, one needs a package called &lt;strong&gt;qca-tls&lt;/strong&gt; (ubuntu) to be able to get Kopete to play nice with Google Talk. Other distributions have slightly different names for this package:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Gentoo                 app-crypt/qca-tls&lt;br /&gt;
Mandriva              libqca1-tls&lt;br /&gt;
OpenSuSE            qca&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;On Ubuntu, a quick&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;sudo aptitude install qca-tls&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;on the terminal will do the trick. Or you can search for &lt;strong&gt;qca-tls &lt;/strong&gt;in Synaptic.&lt;/p&gt;
&lt;p&gt;To add a google talk account:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Settings &amp;#8211;&amp;gt; Configure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accounts&lt;/strong&gt; &amp;#8211;&amp;gt; &lt;strong&gt;Add Account&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Jabber&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Next&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;On the &lt;strong&gt;Basic Setup&lt;/strong&gt; tab, your account information should look like this:&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;blockquote&gt;&lt;p&gt;Jabber ID:     &lt;strong&gt;xxxx@gmail.com&lt;/strong&gt; (your gmail address)&lt;br /&gt;
[ ] Remember password     (Ticking this makes it easier to login later)&lt;br /&gt;
Password:     &lt;strong&gt;xxxxx&lt;/strong&gt; (Enter your password)&lt;/p&gt;&lt;/blockquote&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;The Connection tab should look like this:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;[X]&lt;/strong&gt; Use protocol encryption (SSL)&lt;br /&gt;
&lt;strong&gt;[X]&lt;/strong&gt; Allow plain-text password authentication&lt;br /&gt;
&lt;strong&gt;[X]&lt;/strong&gt; Override default server information&lt;br /&gt;
Server:  &lt;strong&gt;[talk.google.com]&lt;/strong&gt; Port:  &lt;strong&gt;[5223]&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;You&amp;#8217;re done. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/279/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/279/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/279/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/279/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/279/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/279/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/279/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/279/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/279/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/279/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=279&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Tue, 01 Sep 2009 01:06:11 +0000</pubDate>
</item>
<item>
	<title>Joachim Breitner: Already dead</title>
	<guid>https://www.joachim-breitner.de/blog/archives/335-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/335-Already-dead.html</link>
	<description>&lt;p&gt;
This year’s game of &lt;a href=&quot;http://wiki.debconf.org/wiki/DebConf9/Assassins&quot;&gt;Assassins&lt;/a&gt; at DebConf 9 was quick. I did not even had a chance to check who my target would have been, and already I got touched by a sock...&lt;/p&gt;</description>
	<pubDate>Sat, 25 Jul 2009 20:47:30 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Ctrl-Alt-F1 in VirtualBox</title>
	<guid>https://www.joachim-breitner.de/blog/archives/334-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/334-Ctrl-Alt-F1-in-VirtualBox.html</link>
	<description>&lt;p&gt;If you have a Linux VirtualBox guest accessed from a Linux machine, e.g. via rdesktop, then you cannot just press Ctrl-Alt-F1 to switch to the first virtual console, as your real computer will act on it. Instead, you can use&lt;/p&gt;
&lt;pre&gt;VBoxManage controlvm VBoxMachineName keyboardputscancode 1D 38 3B 9D B8 CB 
&lt;/pre&gt;
&lt;p&gt;to simulate a Ctrl-Alt-F1 keypress. For the other F-keys, you need to increase the third and last number, e.g. &lt;/p&gt;
&lt;pre&gt;VBoxManage controlvm VBoxMachineName keyboardputscancode 1D 38 3D 9D B8 CD&lt;/pre&gt;&lt;p&gt;for Ctrl-Alt-F2.&lt;/p&gt;</description>
	<pubDate>Mon, 13 Jul 2009 11:09:21 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Stronger GPG key generated</title>
	<guid>https://www.joachim-breitner.de/blog/archives/333-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/333-Stronger-GPG-key-generated.html</link>
	<description>&lt;p&gt;In time for the upcoming &lt;a href=&quot;http://people.debian.org/~anibal/ksp-dc9/ksp-dc9.html&quot;&gt;DebConf keysigning party&lt;/a&gt; I &lt;a href=&quot;http://www.die-welt.net/index.php/blog/253/Yes%2C_new_GPG_key&quot;&gt;followed&lt;/a&gt; &lt;a href=&quot;http://blog.aurel32.net/?p=48&quot;&gt;the&lt;/a&gt; &lt;a href=&quot;http://ekaia.org/blog/2009/05/10/creating-new-gpgkey/&quot;&gt;crowd&lt;/a&gt; and generated a new 4096-bit RSA GPG key, which  you can find on the keyserver near you.  But I plan to use my old key for a while, until the new one is properly integrated in the Web of Trust. I still have a batch of cards with the old key on it as well, so I won’t revoke that too soon.&lt;/p&gt;&lt;pre&gt;pub   4096R/F0FBF51F 2009-07-10&lt;br /&gt;      Key fingerprint = 1A46 087F 955D 93C5 7C60  571B 3D90 8AB3 F0FB F51F&lt;br /&gt;uid                  Joachim Breitner &amp;lt;mail@joachim-breitner.de&amp;gt;&lt;br /&gt;uid                  Joachim Breitner &amp;lt;joachim.breitner@itomig.de&amp;gt;&lt;br /&gt;uid                  Joachim Breitner (Jabber-ID) &amp;lt;nomeata@joachim-breitner.de&amp;gt;&lt;br /&gt;uid                  Joachim Breitner &amp;lt;nomeata@debian.org&amp;gt;&lt;br /&gt;sub   4096R/6F927969 2009-07-10&lt;/pre&gt;&lt;p&gt;I’m also considering to play the keysigning game a bit less intense. I reached a &lt;a href=&quot;http://pgp.cs.uu.nl/graph.php?KEY=4743206C&amp;TYP=rank&amp;STY=BIG&quot;&gt;rank of about 20&lt;/a&gt; two months ago with my old key and had my fun.&lt;/p&gt;</description>
	<pubDate>Fri, 10 Jul 2009 09:07:49 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Kofi Boakye: Back Again !!</title>
	<guid>http://kdex.wordpress.com/2009/07/01/back-again/</guid>
	<link>http://kdex.wordpress.com/2009/07/01/back-again/</link>
	<description>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Hello World&lt;/p&gt;
&lt;p&gt;Its sure been a while since i last posted on this blog.&lt;/p&gt;
&lt;p&gt;However i&amp;#8217;m back and this time i hope to put up new stuff everyday about what i&amp;#8217;m currently doing .Hoping to start releasing some serious apps for the linux world soon.&lt;/p&gt;
&lt;p&gt;Adios amigos&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/kdex.wordpress.com/16/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/kdex.wordpress.com/16/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/kdex.wordpress.com/16/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/kdex.wordpress.com/16/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/kdex.wordpress.com/16/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/kdex.wordpress.com/16/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/kdex.wordpress.com/16/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/kdex.wordpress.com/16/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/kdex.wordpress.com/16/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/kdex.wordpress.com/16/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=kdex.wordpress.com&amp;blog=1707633&amp;post=16&amp;subd=kdex&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 01 Jul 2009 17:47:39 +0000</pubDate>
</item>
<item>
	<title>Joachim Breitner: Introducing L-seed</title>
	<guid>https://www.joachim-breitner.de/blog/archives/330-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/330-Introducing-L-seed.html</link>
	<description>&lt;p&gt;In two weeks, the eighth „&lt;a href=&quot;http://entropia.de/wiki/GPN8&quot;&gt;Gulasch-Programmier-Nacht&lt;/a&gt;“ will be held in Karlsruhe, a yearly geek event  by the &lt;a href=&quot;http://entropia.de/&quot;&gt;Entropia e.V&lt;/a&gt;, which is the local &lt;a href=&quot;http://ccc.de/&quot;&gt;CCC&lt;/a&gt; club. It will, as usually, offer a lot of interesting talks and events. One of my personal highlights have always been the programming games: Games, where you write your own code to compete against others, while the playing field is projected in the hacking area. The last few years, dividuum has done a great job providing these (as regular readers of my blog might &lt;a href=&quot;https://www.joachim-breitner.de/blog/archives/295-GPN-7-Resume.html&quot;&gt;remember&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;This year, I’m trying to follow in his footsteps and will provide the programming game, called „&lt;a href=&quot;http://entropia.de/wiki/L-seed&quot;&gt;L-seed&lt;/a&gt;“. This blog post is an introduction (and a call for contribution, at the bottom of the post :-))&lt;/p&gt;&lt;h3&gt;The idea&lt;/h3&gt;&lt;p&gt;The participants will write code (the „genome“) that describes how plants (the biological type, not the industrial) will grow. The plants will grow simultaneously on the screen (the „garden“), will compete for light and will multiply. The players can not change the code of a growing plant, but they do have the chance to update their code for the next generation – when a plant drops a seed, it will run the newest code. All in all, the game aims to be slowly paced and relaxing, something to just watch for a while and something that does not need constant attention by the players. The score is based on the total amount of biomass produced, but I expect (and hope) that some players will aim for the most beautiful or weirdest shapes.&lt;/p&gt;&lt;h3&gt;The plant code&lt;/h3&gt;&lt;p&gt;In contrast to the previous years, this year’s game will not allow player to use a full-fledged Turing-complete programming language, but a rather minimalistic rule based language to describe the plant’s growth. Especially, it will be hard to coordinate different branches of the same plant: Information mostly flows from the leaves to the root, and not the other direction.&lt;/p&gt;&lt;p&gt;The simplest plant is based on this code:&lt;/p&gt;&lt;pre&gt;// This is the trivial plant, which just grows and grows&lt;br /&gt;RULE &amp;quot;Very simple Rule&amp;quot;&lt;br /&gt;GROW BY 1&lt;/pre&gt;&lt;p&gt;You can see that each rule has a name (which is purely informational), and an action which tells the current branch to, well, grow by one. The syntax allows for Java-style comments, whitespace and newlines are insignificant and the reserved words are case-insensitive. The result will be a plant that just grows straight up, for ever and ever. A more complex rule might be this:&lt;/p&gt;&lt;pre&gt;&lt;img vspace=&quot;2&quot; hspace=&quot;2&quot; border=&quot;0&quot; src=&quot;http://www.joachim-breitner.de/various/L-seed-christmas-tree.png&quot; /&gt;RULE &amp;quot;Start&amp;quot;&lt;br /&gt;WHEN Length &amp;lt;= 0&lt;br /&gt;GROW BY 1&lt;br /&gt;SET TAG = &amp;quot;Root1&amp;quot;&lt;br /&gt;&lt;br /&gt;RULE &amp;quot;Story 1&amp;quot;&lt;br /&gt;WHEN TAG = &amp;quot;Root1&amp;quot;&lt;br /&gt;// No Percentage means 100%&lt;br /&gt;BRANCH ANGLE = 70°, LENGTH = 2, Tag = &amp;quot;&amp;quot;&lt;br /&gt;       ANGLE = -70°, LENGTH = 2, Tag = &amp;quot;&amp;quot;&lt;br /&gt;       ANGLE = 0°, LENGTH = 1, TAG = &amp;quot;Root2&amp;quot;&lt;br /&gt;SET TAG = &amp;quot;&amp;quot;&lt;br /&gt;&lt;br /&gt;RULE &amp;quot;Story 2&amp;quot;&lt;br /&gt;WHEN TAG = &amp;quot;Root2&amp;quot;&lt;br /&gt;BRANCH AT 100% ANGLE = 70°, LENGTH = 1.5, Tag = &amp;quot;&amp;quot;&lt;br /&gt;               ANGLE = -70°, LENGTH = 1.5, Tag = &amp;quot;&amp;quot;&lt;br /&gt;               ANGLE = 0°, LENGTH = 1, TAG = &amp;quot;Root3&amp;quot;&lt;br /&gt;SET TAG = &amp;quot;&amp;quot;&lt;br /&gt;&lt;br /&gt;RULE &amp;quot;Story 3&amp;quot;&lt;br /&gt;WHEN TAG = &amp;quot;Root3&amp;quot;&lt;br /&gt;BRANCH AT 100% ANGLE = 70°, LENGTH = 1, Tag = &amp;quot;&amp;quot;&lt;br /&gt;               ANGLE = -70°, LENGTH = 1, Tag = &amp;quot;&amp;quot;&lt;br /&gt;               ANGLE = 0°, LENGTH = 1, TAG = &amp;quot;Root4&amp;quot;&lt;br /&gt;SET TAG = &amp;quot;&amp;quot;&lt;br /&gt;&lt;br /&gt;RULE &amp;quot;Story 4&amp;quot;&lt;br /&gt;WHEN TAG = &amp;quot;Root4&amp;quot;&lt;br /&gt;BRANCH AT 100% ANGLE = 70°, LENGTH = 0.5, Tag = &amp;quot;&amp;quot;&lt;br /&gt;               ANGLE = -70°, LENGTH = 0.5, Tag = &amp;quot;&amp;quot;&lt;br /&gt;               ANGLE = 0°, LENGTH = 0.5, Tag = &amp;quot;Tip&amp;quot;&lt;br /&gt;SET TAG = &amp;quot;&amp;quot;&lt;br /&gt;&lt;br /&gt;RULE &amp;quot;Star&amp;quot;&lt;br /&gt;WHEN TAG = &amp;quot;Tip&amp;quot;&lt;br /&gt;Blossom&lt;/pre&gt;&lt;p&gt;I added a picture with the resulting tree. The yellow blob at the top is a not-yet-polished rendering of a blossom. At the right, there is already the first offspring of the plant. One thing to keep in mind while writing a genome is that rules are applied to single branches, and not the whole plant. The program will, for each branch individually, check which rules apply and choose one.  I’ll skip a detailed description of the syntax here, eventually you will find proper documentation on the entropia wiki page. You can find &lt;a href=&quot;http://git.nomeata.de/?p=L-seed.git;a=tree;f=examples&quot;&gt;more examples&lt;/a&gt; in the source repository.&lt;/p&gt;&lt;h3&gt;The gameplay&lt;/h3&gt;&lt;p&gt;The players will register at a website providing the usual CRUD functionality for their code, with integrated syntax checking. They can have more than one code at the same time, but only one can be marked as „active.“ The program actually serving the projector will regularly fetch the active code and run a around (called „season“) of the game. Whenever a new seed grows, the program will get the possibly updated active code of that user and use that. A season will probably last for a fixed amount of time, and at the end the total biomass accumulated by each player is added up and written back to the database.&lt;/p&gt;&lt;h3&gt;The game code&lt;/h3&gt;&lt;p&gt;You can fetch the source code from my &lt;a href=&quot;http://git.nomeata.de/?p=L-seed.git;a=summary&quot;&gt;git repository&lt;/a&gt; and browse the &lt;a href=&quot;http://entropia.de/~nomeata/L-seed-doc/&quot;&gt;haddock documentation&lt;/a&gt;. Unsurprisingly, it is written in Haskell. To compile it yourself, you will need the GHC Haskell compiler, parsec version 3 and for the visualization the gtk2hs package, all of which are packaged in Debian unstable. The main.hs is the interesting program. You pass it one or more plants as an argument, and it will start the simulation. If it’s too slow for test runs, then reduce the &lt;a href=&quot;http://entropia.de/~nomeata/L-seed-doc/Lseed-Constants.html#v%3AdayLength&quot;&gt;dayLength&lt;/a&gt; variable in Lseed/Constants.hs. If you have trouble getting it to run, just talk to me.&lt;/p&gt;&lt;h3&gt;The call for help&lt;/h3&gt;&lt;p&gt;As you can see in the picture above, the graphical output is not very aesthetic. I am no artist, and I don’t pretend to be one. So, if you think you have the right touch, maybe know OpenGL and a bit of Haskell, I’d be very grateful if you make it look better. The UI interface is quite simple: You need to have a module that returns an &lt;a href=&quot;http://entropia.de/~nomeata/L-seed-doc/Lseed-Data.html#t%3AObserver&quot;&gt;Observer&lt;/a&gt; value, which contains a few callbacks for various situations. The code in &lt;a href=&quot;http://git.nomeata.de/?p=L-seed.git;a=blob;f=src/Lseed/Renderer/Cairo.hs;hb=HEAD&quot;&gt;Lseed/Renderer/Cairo.hs&lt;/a&gt; can of course be used as a guideline. I’m suggesting OpenGL because my code is not only ugly, it is also too slow very quickly. If you need any help, just contact me by mail or jabber.&lt;/p&gt;&lt;p&gt;I’m also interested in comments about the game balance, and the expressiveness of the programming language. If you play around with the code and discover that there are missing features in the language, or that your plants grow too fast or too slow, or when you discover bugs, please also tell me.&lt;/p&gt;&lt;h3&gt;Thanks&lt;/h3&gt;&lt;p&gt;L-seed is based on an &lt;a href=&quot;https://www.joachim-breitner.de/blog/archives/129-Fixe-Idee-Warfeu.html&quot;&gt;old idea of mine&lt;/a&gt;, advanced together with Cupe, Sven Hecht is programming the web interface, and Lay is testing the game and bugs me about it to keep the motivation going.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Update&lt;/b&gt;: I uploaded the package to &lt;a href=&quot;http://hackage.haskell.org/package/L-seed&quot;&gt;hackage&lt;/a&gt;, to encourage contributions.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Sat, 13 Jun 2009 10:27:00 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Third place in AI programming contest</title>
	<guid>https://www.joachim-breitner.de/blog/archives/328-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/328-Third-place-in-AI-programming-contest.html</link>
	<description>&lt;p&gt;
&lt;a href=&quot;https://www.joachim-breitner.de/blog/archives/324-Bejeweled-AI-in-Haskell.html&quot;&gt;My contribution&lt;/a&gt; to the programming contest held by the German „&lt;a href=&quot;http://www.freiesmagazin.de/&quot;&gt;FreiesMagazin&lt;/a&gt;“ got a &lt;a href=&quot;http://www.freiesmagazin.de/20090605-gewinner-des-programmierwettbewerbs-steht-fest&quot;&gt;third place&lt;/a&gt; out of 13 submissions. This is quite good, considering that I only wrote a small wrapper around the generic &lt;a href=&quot;http://hackage.haskell.org/cgi-bin/hackage-scripts/package/game-tree&quot;&gt;game-tree&lt;/a&gt; Haskell library by Colin Adams, and hardly gave any serious thought into the problem.&lt;/p&gt;&lt;p&gt;All entires are &lt;a href=&quot;ftp://ftp.freiesmagazin.de/2009/2009-04-wettbewerb/&quot;&gt;available for download&lt;/a&gt;. I have annotated the table containing the results with the line count as given by &lt;a href=&quot;http://labs.ohloh.net/ohcount&quot;&gt;ohcount&lt;/a&gt;:&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;table cellpadding=&quot;3&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;    &lt;/td&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; &lt;strong&gt;W&lt;/strong&gt; &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; &lt;strong&gt;D&lt;/strong&gt; &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; &lt;strong&gt;L&lt;/strong&gt; &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; &lt;strong&gt;Points&lt;/strong&gt; &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; &lt;strong&gt;Language&lt;/strong&gt; &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; &lt;strong&gt;Code lines&lt;/strong&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;1.  &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Kroschinsky     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 904 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 242 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 54      &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 2954 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; Python &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 589 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;2.  &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Schulz          &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 858 &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 263 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 79      &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 2837 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; Python &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 544 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;3.  &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Breitner        &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 837 &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 281 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 82      &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 2792 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; Haskell &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 264 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;4.  &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Jackermeier     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 754 &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 306 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 140     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 2568 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; Perl &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 183 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;5.  &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Roth            &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 574	&lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 338 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 288     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 2060 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; C++ &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 1731 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;6.  &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Eitel           &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 567 &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 355 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 278     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 2056 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; Ruby &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 352 &lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;7.  &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Reichel         &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 342 &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 328 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 530     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 1354 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; Python &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 266 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;8.  &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Zimmermann      &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 303 &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 400 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 497     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 1309 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; Java &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 1070 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;9.  &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Apensiv         &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 190 &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 353 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 657     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 923 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; Perl &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 410 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;10. &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Maraun          &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 150 &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 300 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 750     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 750 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; C++ &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 690 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;11. &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Golemo          &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 131 &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 319 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 750     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 712 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; Python &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 104 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;12. &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Ziegelwanger    &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 120 &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 337 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 743     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 697 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; C++ &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 868 &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;right&quot;&gt;13. &lt;/td&gt;
&lt;td align=&quot;left&quot;&gt; Fuest           &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 32  &lt;/td&gt;

&lt;td align=&quot;center&quot;&gt; 254 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 914     &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 350 &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; Python &lt;/td&gt;
&lt;td align=&quot;center&quot;&gt; 645 &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Note that the line count for my haskell program includes the game-tree library, which I bundled in my submission. Without it, it’s 156 lines of code I had to write, which is second best in the code golf category.&lt;/p&gt;&lt;p&gt;If you look at the &lt;a href=&quot;http://www.freiesmagazin.de/20090605-gewinner-des-programmierwettbewerbs-steht-fest&quot;&gt;timing statistics&lt;/a&gt;, you will see that my program took the longest. When the contest was started, the timelimit was one minute per round – which I of course tried to use as much as possibly, by increasing the search tree depth. Later into the contest, the rules were changed to limit it to one minute for a whole game, and that long-running programs will get points deducted. I did some &lt;a href=&quot;http://darcs.nomeata.de/cgi-bin/darcsweb.cgi?r=hbejeweler;a=commitdiff;h=20090422213648-23c07-50878471ef59da871bb8744bae4d65bfac022faf.gz&quot;&gt;minor&lt;/a&gt; &lt;a href=&quot;http://darcs.nomeata.de/cgi-bin/darcsweb.cgi?r=hbejeweler;a=commitdiff;h=20090422213659-23c07-9d8129cced9a4d5e29dc59ccac1081e206dd89df.gz&quot;&gt;changes&lt;/a&gt; based on a profiling run, but did otherwise not care too much about performance. I would have tried to improve the runtime by using Haskell’s good ability for parallelization. But when I asked on what kind of machine the code will be run, but they would not tell me. They said that this is a hobby programmer’s contest where allowing for parallelization were not fair, so I did not work in that direction.&lt;/p&gt;&lt;p&gt;All in all it was a positive experience, showing of Haskell’s qualities as a language that you can quickly get good results with.&lt;/p&gt;</description>
	<pubDate>Fri, 05 Jun 2009 18:49:50 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Points of View</title>
	<guid>https://www.joachim-breitner.de/blog/archives/327-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/327-Points-of-View.html</link>
	<description>&lt;p&gt;Thanks &lt;a href=&quot;http://mces.blogspot.com/2009/06/your-point-of-view.html&quot;&gt;Behdad&lt;/a&gt; for pointing out this &lt;a href=&quot;http://www.yourpointofview.com/page03.html&quot;&gt;interesting advertisement campaign&lt;/a&gt; by HSBC. I’m very surprised how a word, printed on top of an image, can completely reverse the impression that the image makes on you.&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;&lt;img alt=&quot;HSBC ad&quot; src=&quot;http://www.yourpointofview.com/img/old_preview/madness.jpg&quot; /&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The links seem to be dead by now.&lt;/p&gt;</description>
	<pubDate>Tue, 02 Jun 2009 14:37:58 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Odzangba Dake: Greetings from Ho</title>
	<guid>http://odzangba.wordpress.com/?p=277</guid>
	<link>http://odzangba.wordpress.com/2009/05/25/greetings-from-ho/</link>
	<description>&lt;br /&gt;&lt;p&gt;It&amp;#8217;s a long weekend (thanks to African Unity Day) and I&amp;#8217;m relaxing in sleepy Ho&amp;#8230; it&amp;#8217;s nice to get away from the constant hustle and bustle of Accra. Anyway, I&amp;#8217;ve had a lot of hard disk trouble lately. First I &lt;a href=&quot;http://odzangba.wordpress.com/2009/03/25/gzip-vs-bzip2-vs-lzma/&quot; target=&quot;_blank&quot;&gt;ran out of space&lt;/a&gt;, then my system hard disk died. As if that wasn&amp;#8217;t enough, the next day, my spare hard disk died too&amp;#8230; making my life doubly miserable. You see, I hadn&amp;#8217;t backed up my data&amp;#8230; I was out of space after all and the dvd shop is out of my way &amp;#8211; I kept putting it off. So I had to raid my younger brother&amp;#8217;s piggy bank for a new hard disk. I&amp;#8217;d like to think that &amp;#8220;I was not attached to those hard disks&amp;#8221; but it really grinds my gears the way they both failed in rapid succession. Now if I had my way, somebody at Seagate would be in a lot of pain right now. How is it that the world&amp;#8217;s largest hard disk manufacturer has so many defective products on shelves? For what it&amp;#8217;s worth, I&amp;#8217;m never buying a Seagate hard drive again&amp;#8230; even though Barracuda is such a cool name. Western Digital hard drives are &amp;#8211; in my experience &amp;#8211; much more reliable. But they really should do something about the name &amp;#8220;Caviar.&amp;#8221; &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;I now have a lot more hard disk space and a fresh install of Ubuntu 9.04. Morale of the story&amp;#8230; back up your data and don&amp;#8217;t buy Seagate !&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/277/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/277/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/277/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/277/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/277/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/277/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/277/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/277/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/277/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/277/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=277&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Mon, 25 May 2009 05:59:42 +0000</pubDate>
</item>
<item>
	<title>Joachim Breitner: Buzz free</title>
	<guid>https://www.joachim-breitner.de/blog/archives/325-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/325-Buzz-free.html</link>
	<description>&lt;p&gt;
My Openmoko &lt;a href=&quot;http://wiki.openmoko.org/wiki/Neo_FreeRunner&quot;&gt;FreeRunner&lt;/a&gt; suffered from the infamous hardware bug that causes bad buzzing for my dialog partner, making it relatively useless for me. Last week, though, a collegue of my brother fixed it for me (by applying some &lt;a href=&quot;http://people.openmoko.org/joerg/GSM_EMI_noise/big-C_rework_SOP_rc2.pdf&quot;&gt;soldering-skills&lt;/a&gt;), and indeed, the audio quality is above bearable now! I plan to get &lt;a href=&quot;http://wiki.debian.org/DebianOnFreeRunner&quot;&gt;Debian on the FreeRunner&lt;/a&gt; up to date again with the other developments in the community now. Or at least soon, depending on how much time I’ll be able to spare.&lt;/p&gt;</description>
	<pubDate>Wed, 22 Apr 2009 22:06:49 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Bejeweled AI in Haskell</title>
	<guid>https://www.joachim-breitner.de/blog/archives/324-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/324-Bejeweled-AI-in-Haskell.html</link>
	<description>&lt;p&gt;The German online magazine „&lt;a href=&quot;http://www.freiesmagazin.de/&quot;&gt;FreiesMagazin&lt;/a&gt;“ has started a &lt;a href=&quot;http://www.freiesmagazin.de/programmierwettbewerb&quot;&gt;programming contest&lt;/a&gt; yesterday. The task is to write an AI for a two-player bejeweled-like game, where the stones that you can match cause your opponent to lose live points.&lt;/p&gt;&lt;p&gt;This evening I thought that this would be a nice finger exercise in Haskell programming, and indeed it was. Most time was spent writing the code that communicates with the game supervisor (via text files) and that re-implements the &lt;a href=&quot;http://darcs.nomeata.de/hbejeweler/Data.hs&quot;&gt;game logic&lt;/a&gt; to simulate the next steps. The example code is in C++, so I had to do it again, but it’s rather short: 123 lines, consisting of 8 lines for the module header, 26 lines for the data definitions, 16 lines for in- and output and 73 lines for the actual rules of the game.&lt;/p&gt;&lt;p&gt;Writing the rest was really easy. 15 lines use a &lt;a href=&quot;http://hackage.haskell.org/cgi-bin/hackage-scripts/package/game-tree&quot;&gt;generic Haskell module&lt;/a&gt; to implement alpha-beta-search in &lt;a href=&quot;http://darcs.nomeata.de/hbejeweler/Strategy.hs&quot;&gt;Strategy.hs&lt;/a&gt;, and 6 lines of &lt;a href=&quot;http://darcs.nomeata.de/hbejeweler/Main.hs&quot;&gt;code to glue&lt;/a&gt; it all together. And I’m sure one can do better...&lt;/p&gt;&lt;p&gt;The program wins against the demo AI. By choosing other algorithms provided by game-tree might even improve that. Feel free to try it out!&lt;/p&gt;&lt;p&gt;My code is available in a &lt;a href=&quot;http://darcs.nomeata.de/hbejeweler&quot;&gt;darcs repository&lt;/a&gt; (&lt;a href=&quot;http://darcs.nomeata.de/cgi-bin/darcsweb.cgi?r=hbejeweler;a=summary&quot;&gt;browse&lt;/a&gt;) under the GPL2 or later and I invite everyone to use it as a base for contest entries. If you want to use Haskell, you can just replace the Strategy.hs and do not have to re-implement the game logic. If you submit such a program, just make sure you credit me appropriately. Also, as always, patches are welcome. If the code is too slow for your taste, you can decrease the depth parameter in Strategy.hs.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 03 Apr 2009 00:50:00 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Odzangba Dake: GZIP vs. BZIP2 vs. LZMA</title>
	<guid>http://odzangba.wordpress.com/?p=273</guid>
	<link>http://odzangba.wordpress.com/2009/03/25/gzip-vs-bzip2-vs-lzma/</link>
	<description>&lt;br /&gt;&lt;p&gt;There&amp;#8217;s no nicer way to say it&amp;#8230; I&amp;#8217;m running out of disk space. I have three options: buy a larger hard drive, delete some files to free up space, or compress some of the data. Buying a larger hard drive is the best option in the long term but &amp;#8220;in the long term, we&amp;#8217;re all dead&amp;#8221; &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt;  and deleting files is painful for me&amp;#8230; I&amp;#8217;m a serial pack rat. So I decided to explore compression as a way out of my disk space headaches. First, I had to find the most efficient compression algorithm, a task I soon found out is not easy. I read several blogs and websites and everybody had something good to say about their favorite algorithm. But one thing was clear, the &lt;strong&gt;GZIP, BZIP2&lt;/strong&gt; and &lt;strong&gt;LZMA&lt;/strong&gt; compression algorithms were leading the pack. To satisfy my own curiosity and determine for myself which was the most efficient, I decided to run some benchmarks. To be honest, I&amp;#8217;ve been hearing some good things about the LZMA compression algorithm so I was hoping it would live up to the hype.&lt;/p&gt;
&lt;p&gt;These benchmarks were conducted on a&lt;strong&gt; 2.53 GHz&lt;/strong&gt; processor with&lt;strong&gt; 2GB RAM&lt;/strong&gt; and a &lt;strong&gt;5400 RPM&lt;/strong&gt; Seagate Barracuda IDE hard disk. I also throttled the algorithms for maximum compression.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Version information:&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;gzip 1.3.12&lt;br /&gt;
bzip2 1.0.5&lt;br /&gt;
LZMA 4.32.0beta3&lt;br /&gt;
LZMA SDK 4.43&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For starters, I threw an empty &lt;strong&gt;1GiB&lt;/strong&gt; file with nothing in it but binary zeros at them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ dd if=/dev/zero of=test.zero -bs=1024M -count=1&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;1+0 records in&lt;br /&gt;
1+0 records out&lt;br /&gt;
1073741824 bytes (1.1 GB) copied, 187.978 s, 5.7 MB/s&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now the fun starts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GZIP&lt;/strong&gt;&lt;br /&gt;
$ /usr/bin/time -f &amp;#8220;%U seconds CPU %P&amp;#8221; gzip -c9 test.zero &amp;gt; test.gz&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;12.36 seconds&lt;/strong&gt; CPU 99%&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BZIP2&lt;/strong&gt;&lt;br /&gt;
$ /usr/bin/time -f &amp;#8220;%U seconds CPU %P&amp;#8221; bzip2 -c9 test.zero &amp;gt; test.bz2&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;32.07 seconds&lt;/strong&gt; CPU 98%&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;&lt;br /&gt;
LZMA&lt;br /&gt;
&lt;/strong&gt;$ /usr/bin/time -f &amp;#8220;%U seconds CPU %P&amp;#8221; lzma -c9 test.zero &amp;gt; test.lzma&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;873.79 seconds&lt;/strong&gt; CPU 96%&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So what kind of compression ratios are we talking about here?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ ls -lh test.zero*&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;-rw-r&amp;#8211;r&amp;#8211; 1 kafui kafui  &lt;strong&gt;1.0G&lt;/strong&gt; 2009-03-25 12:01 test.zero&lt;br /&gt;
-rw-r&amp;#8211;r&amp;#8211; 1 kafui kafui &lt;strong&gt;1018K&lt;/strong&gt; 2009-03-25 12:51 test.gz&lt;br /&gt;
-rw-r&amp;#8211;r&amp;#8211; 1 kafui kafui  &lt;strong&gt;148K&lt;/strong&gt; 2009-03-25 13:10 test.lzma&lt;br /&gt;
-rw-r&amp;#8211;r&amp;#8211; 1 kafui kafui   &lt;strong&gt;785&lt;/strong&gt; 2009-03-25 12:52 test.bz2&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;GZIP squeezed 1 gigabyte into about 1 megabyte in about 12 seconds&amp;#8230; nice. LZMA&amp;#8217;s compression ratio was very impressive; it squeezed 1 gigabyte into 148 kilobytes BUT in 873.79 seconds&amp;#8230; that&amp;#8217;s almost 15 minutes. BZIP2 was absolutely cool&amp;#8230; 1Gib down to 785 bytes in 32 seconds! The clear winner here however is BZIP2. It has the highest compression ratio with acceptable time requirements. Now on to tests with real data.&lt;/p&gt;
&lt;p&gt;For the next test, I decided to compress the contents of my  &lt;strong&gt;/opt&lt;/strong&gt; folder. To simplify things, I created a tar archive of the folder first.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ sudo tar -cf opt.tar /opt&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;[sudo] password for kafui:&lt;br /&gt;
tar: Removing leading `/&amp;#8217; from member names&lt;br /&gt;
tar: Removing leading `/&amp;#8217; from hard link targets&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ ls -lh opt.tar &lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;-rw-r&amp;#8211;r&amp;#8211; 1 root root &lt;strong&gt;120M&lt;/strong&gt; 2009-03-25 15:48 opt.tar&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So we&amp;#8217;re working with &lt;strong&gt;120MB&lt;/strong&gt; of data. On to the tests:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GZIP&lt;/strong&gt;&lt;br /&gt;
$ /usr/bin/time -f &amp;#8220;%U seconds CPU %P&amp;#8221; gzip -c9 opt.tar &amp;gt; opt.tar.gz&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;19.42 seconds&lt;/strong&gt; CPU 89%&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BZIP2&lt;/strong&gt;&lt;br /&gt;
$ /usr/bin/time -f &amp;#8220;%U seconds CPU %P&amp;#8221; bzip2 -c9 opt.tar &amp;gt; opt.tar.bz2&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;30.76 seconds&lt;/strong&gt; CPU 93%&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LZMA&lt;/strong&gt;&lt;br /&gt;
/usr/bin/time -f &amp;#8220;%U seconds CPU %P&amp;#8221; lzma -c9 opt.tar &amp;gt; opt.tar.lzma&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;132.21 seconds&lt;/strong&gt; CPU 92%&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ ls -lh opt.tar*&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;-rw-r&amp;#8211;r&amp;#8211; 1 &lt;/em&gt;&lt;em&gt;kafui kafui&lt;/em&gt;&lt;em&gt; &lt;strong&gt;120M&lt;/strong&gt; 2009-03-25 15:48 opt.tar&lt;br /&gt;
-rw-r&amp;#8211;r&amp;#8211; 1 &lt;/em&gt;&lt;em&gt;kafui kafui&lt;/em&gt;&lt;em&gt; &lt;strong&gt;39M&lt;/strong&gt; 2009-03-25 15:56 opt.tar.gz&lt;br /&gt;
-rw-r&amp;#8211;r&amp;#8211; 1 &lt;/em&gt;&lt;em&gt;kafui kafui&lt;/em&gt;&lt;em&gt; &lt;strong&gt;36M&lt;/strong&gt; 2009-03-25 16:09 opt.tar.bz2&lt;br /&gt;
-rw-r&amp;#8211;r&amp;#8211; 1 &lt;/em&gt;&lt;em&gt;kafui kafui&lt;/em&gt;&lt;em&gt; &lt;strong&gt;25M&lt;/strong&gt; 2009-03-25 16:16 opt.tar.lzma&lt;br /&gt;
&lt;/em&gt;&lt;br /&gt;
Once again, GZIP was the fastest and got 120MB down to 39MB in 19.42 seconds. BZIP2 reduced 120MB to 36MB but took 11.34 seconds longer than GZIP. LZMA delivered the best compression with 25MB but took 132.21 seconds. It appears there are trade-offs with each compression method. GZIP is fast but its compression ratio is the lowest of the three. LZMA (depending on the data) delivers the most efficient compression ratio but takes too much time to do so. BZIP2 strikes a balance between efficient compression and speed&amp;#8230; it&amp;#8217;s way faster than LZMA and can actually deliver better compression. LZMA just does not live up to the hype.&lt;/p&gt;
&lt;p&gt;Unfortunately, these benchmarks were of no use to me because about &lt;strong&gt;140GiB&lt;/strong&gt; of my data is made up of &lt;strong&gt;AVIs&lt;/strong&gt;, &lt;strong&gt;PNGs&lt;/strong&gt; and &lt;strong&gt;JPEGs&lt;/strong&gt;. These formats are already compressed so there isn&amp;#8217;t much room for further compression. But for what it&amp;#8217;s worth, I gave the algorithms a spin anyway.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ ls -lh The.Big.Bang.Theory.S01E10.avi &lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;-rwxrwxrwx 1 &lt;/em&gt;&lt;em&gt;kafui kafui&lt;/em&gt;&lt;em&gt; &lt;strong&gt;175M&lt;/strong&gt; 2008-04-18 20:14 The.Big.Bang.Theory.S01E10.avi&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GZIP&lt;/strong&gt;&lt;br /&gt;
$ /usr/bin/time -f &amp;#8220;%U seconds CPU %P&amp;#8221; gzip -c9 The.Big.Bang.Theory.S01E10.avi &amp;gt; The.Big.Bang.Theory.S01E10.avi.gz&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;10.94 seconds&lt;/strong&gt; CPU 78%&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BZIP2&lt;/strong&gt;&lt;br /&gt;
$ /usr/bin/time -f &amp;#8220;%U seconds CPU %P&amp;#8221; bzip2 -c9 The.Big.Bang.Theory.S01E10.avi &amp;gt; The.Big.Bang.Theory.S01E10.avi.bz2&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;55.15 seconds&lt;/strong&gt; CPU 94%&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LZMA&lt;/strong&gt;&lt;br /&gt;
$ /usr/bin/time -f &amp;#8220;%U seconds CPU %P&amp;#8221; lzma -c9 The.Big.Bang.Theory.S01E10.avi &amp;gt; The.Big.Bang.Theory.S01E10.avi.lzma&lt;br /&gt;
&lt;em&gt;&lt;strong&gt;138.74 seconds&lt;/strong&gt; CPU 93%&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$ ls -lh The.Big.Bang.Theory.S01E10.avi*&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;-rwxr-xr-x 1 &lt;/em&gt;&lt;em&gt;kafui kafui&lt;/em&gt;&lt;em&gt; 175M 2009-03-25 16:34 The.Big.Bang.Theory.S01E10.avi&lt;br /&gt;
-rw-r&amp;#8211;r&amp;#8211; 1 &lt;/em&gt;&lt;em&gt;kafui kafui&lt;/em&gt;&lt;em&gt; 173M 2009-03-25 16:35 The.Big.Bang.Theory.S01E10.avi.gz&lt;br /&gt;
-rw-r&amp;#8211;r&amp;#8211; 1 &lt;/em&gt;&lt;em&gt;kafui kafui&lt;/em&gt;&lt;em&gt; 173M 2009-03-25 16:39 The.Big.Bang.Theory.S01E10.avi.bz2&lt;br /&gt;
-rw-r&amp;#8211;r&amp;#8211; 1 &lt;/em&gt;&lt;em&gt;kafui kafui&lt;/em&gt;&lt;em&gt; 174M 2009-03-25 16:43 The.Big.Bang.Theory.S01E10.avi.lzma&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;GZIP and BZIP both got the 175MB episode of The Big Bang Theory down to 173MB; BZIP2 of course took 44.12 seconds longer. And LZMA got it down by only 1MB but in 138.74 seconds. As you can see, it doesn&amp;#8217;t make much sense for me to compress my videos and pictures&amp;#8230; not with those compression ratios. So it seems I&amp;#8217;ll just have to cough up the cedis for a new hard drive. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif&quot; alt=&quot;:(&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/273/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/273/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/273/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/273/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/273/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/273/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/273/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/273/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/273/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/273/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=273&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Wed, 25 Mar 2009 18:04:24 +0000</pubDate>
</item>
<item>
	<title>Joachim Breitner: Server updated to Lenny</title>
	<guid>https://www.joachim-breitner.de/blog/archives/322-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/322-Server-updated-to-Lenny.html</link>
	<description>&lt;p&gt;Just updated my server from etch to &lt;a href=&quot;http://www.debian.org/releases/lenny/&quot;&gt;lenny&lt;/a&gt;. It was a mostly painless procedure, only &lt;a href=&quot;http://www.nagios.org/&quot;&gt;nagios&lt;/a&gt; needed some manual interaction, as it was upgraded from nagios2 to nagios3. &lt;/p&gt;&lt;p&gt;My only bigger problem was an old web application (running &lt;a href=&quot;http://04.abi-sgh.de/&quot;&gt;my highschool’s grad class&lt;/a&gt;’ and my &lt;a href=&quot;http://www.netz-zwerge.de/&quot;&gt;old counter-strike clan&lt;/a&gt;’s websites) written in mod_perl, which is not easily upgradeable, plus I did not want to use mod_perl again – I’ve had too much trouble with it eating up my memory or taking down the webserver.&lt;/p&gt;&lt;p&gt;So I bit the bullet and replaced all mod_perl-related code with CGI-stuff.  It actually went quite well, at least when accepting some hacks. Speed does not matter here, as the sites are there mostly for nostalgic reasons anyways.&lt;/p&gt;&lt;p&gt;The other small thing that’s lost with apache1 is the &lt;a href=&quot;http://people.debian.org/~nomeata/xsa-sample.html&quot;&gt;demonstration page&lt;/a&gt; for the &lt;a href=&quot;http://de.wikipedia.org/wiki/Cross-Site_Authentication&quot;&gt;Cross-Site-Authentication&lt;/a&gt; attack. Also not a great loss, and it can easily be re-implemented using a few lines of python and inetd.&lt;/p&gt;&lt;p&gt;I wonder what to do with all the memory that was freed by not having apache1 (with mod_perl) and apache2 running at the same time :-)&lt;/p&gt;</description>
	<pubDate>Tue, 17 Mar 2009 01:29:21 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: In a Letter to Ghana’s President</title>
	<guid>https://www.joachim-breitner.de/blog/archives/321-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/321-In-a-Letter-to-Ghanas-President.html</link>
	<description>&lt;p&gt;Thanks to &lt;a href=&quot;http://www.google.de/alerts&quot;&gt;Google’s watchful eyes&lt;/a&gt; I found out that I was mentioned in a &lt;a href=&quot;http://www.ghanaweb.com/GhanaHomePage/NewsArchive/artikel.php?ID=158626&quot;&gt;„Letter to the President“ of Ghana&lt;/a&gt;, published pseudonymously on ghanaweb.com, that advocates Free Software to the new President of Ghana, John Atta-Mills. So, to all new presidents out there, if you need advice, just ask me :-)&lt;/p&gt;</description>
	<pubDate>Wed, 11 Mar 2009 19:49:37 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Kwasi Kwakwa: What else I’ve been watching</title>
	<guid>http://ghanageek.wordpress.com/?p=181</guid>
	<link>http://ghanageek.wordpress.com/2009/03/05/what-else-ive-been-watching/</link>
	<description>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;I started this post when I was talking about The Wire, I figured I&amp;#8217;d put out a list of what else has been keeping my attention TV wise these days. Its late, but I already wrote most of it so I figured why not. I&amp;#8217;m not really a huge TV person, never have been. I tend to time-shift my shows and then watch them when I&amp;#8217;m not doing anything else, which usually ends up being late at night.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Battlestar Galactica&lt;/strong&gt;: This has been one of my favourite television shows of the last few years and is now heading towards an ending. If you haven&amp;#8217;t seen any of it, you should have. Its really, really good. Basically its a rimagining of on old science fiction show in which the human race is wiped out my a race of machines we&amp;#8217;ve created and the survivors are forced to run for their lives while being hunted by the same machines. Along the way thugh it becomes a great meditation on the nature of humanity, morality, religion etc. Its science fiction at its upper end. I recommend highly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Big Bang Theory&lt;/strong&gt;: This I was determined not to like. Its a sitcom about a pair of socially awkward physicists and their friends. I pretty much expected that the writers would settle for the dumbest possible nerd stereotypes, add no real depth and screw the story up. Instead, they kept the stereotypes but managed to add enough depth and authenticity to make them real people. Interestingly enough, there are quire a few scientists I know who are followers of the show because of how well its written and the inside jokes it throws our way. Also recommended&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Unit&lt;/strong&gt;: &lt;a href=&quot;http://www.imdb.com/name/nm0371660/&quot; target=&quot;_blank&quot;&gt;Dennis Haysbert&lt;/a&gt; shooting people and looking cool in the process. Need I say more? Its a bit on heavy handed in its stance at times,but its great pulp action and good acting. All things I&amp;#8217;m partial to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other stuff I&amp;#8217;m watching but not so keen on writing a short paragraph about, Mobile Suit Gundam 00 and  the new season of Hajime No Ippo (yes, I like anime. It doesn&amp;#8217;t say geek up there because I couldn&amp;#8217;t come up with another name)&lt;/p&gt;
&lt;p&gt;I was also watching Dr. Who and Torchwood until both seasons ended. I&amp;#8217;m really, really waiting for them to start back up again, even though they shall no longer be servicing my &lt;a href=&quot;http://en.wikipedia.org/wiki/Freema_Agyeman&quot; target=&quot;_blank&quot;&gt;Freema Agyeman&lt;/a&gt; crush. Again, if you are a science fiction fan and not watching these, your loss. Majorly.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/ghanageek.wordpress.com/181/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/ghanageek.wordpress.com/181/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/ghanageek.wordpress.com/181/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/ghanageek.wordpress.com/181/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/ghanageek.wordpress.com/181/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/ghanageek.wordpress.com/181/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/ghanageek.wordpress.com/181/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/ghanageek.wordpress.com/181/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/ghanageek.wordpress.com/181/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/ghanageek.wordpress.com/181/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=ghanageek.wordpress.com&amp;blog=474047&amp;post=181&amp;subd=ghanageek&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 05 Mar 2009 23:00:23 +0000</pubDate>
</item>
<item>
	<title>Kwasi Kwakwa: In which the absentee host returns. Again</title>
	<guid>http://ghanageek.wordpress.com/?p=203</guid>
	<link>http://ghanageek.wordpress.com/2009/03/04/in-which-the-absentee-host-returns-again/</link>
	<description>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;A very belated happy new year to you people. Apologies for the long absences. Again. At this point I&amp;#8217;m pretty sure I&amp;#8217;m down to just the people who forgot to remove me from their feed readers.&lt;/p&gt;
&lt;p&gt;Quick Updates on what I&amp;#8217;ve been up to:&lt;/p&gt;
&lt;p&gt;I was officially awarded my Masters by Research in Physics. My parents and big sister were in town for my graduation and that will easily pass for my best day this year. Since then I&amp;#8217;ve gotten accepted into a physics PhD program with the same advisor at the same university. 3 more years of this and I get to walk across a stage again in a gown with a hood on it and put &amp;#8216;Doctor&amp;#8217; on my business cards.&lt;/p&gt;
&lt;p&gt;On the Physical side. I persist with my judo and have now logged hundreds of hours of being thrown around, pinned, choked and armlocked. On good days I get to do the same to other people. In a little under 2 weeks I get to compete in the BUCS(British Universities and Colleges Sport) kyu grade competition. Hopefully all that work will end up in me getting a few good throws. Either way there will be pictures and maybe even video. At some point before I get the PhD I want to get my first dan(black belt)&lt;/p&gt;
&lt;p&gt;Otherwise, I live in London, I study, I train, I hang out with friends, I still read too much, I watch the odd movie and life continues.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a bit of a backlog of topics I was planning to write about but never got around to. Some will make it out in the coming weeks, some won&amp;#8217;t. Either way, keep me in your readers people. If nothing else I need the touch typing practice&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/ghanageek.wordpress.com/203/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/ghanageek.wordpress.com/203/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/ghanageek.wordpress.com/203/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/ghanageek.wordpress.com/203/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/ghanageek.wordpress.com/203/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/ghanageek.wordpress.com/203/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/ghanageek.wordpress.com/203/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/ghanageek.wordpress.com/203/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/ghanageek.wordpress.com/203/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/ghanageek.wordpress.com/203/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=ghanageek.wordpress.com&amp;blog=474047&amp;post=203&amp;subd=ghanageek&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 04 Mar 2009 23:43:46 +0000</pubDate>
</item>
<item>
	<title>Odzangba Dake: Graphical Hardware Information Tools</title>
	<guid>http://odzangba.wordpress.com/?p=248</guid>
	<link>http://odzangba.wordpress.com/2009/02/28/graphical-hardware-information-tools/</link>
	<description>&lt;br /&gt;&lt;p&gt;Just a few months ago, I was not even using a graphical environment; videos, music, surfing the internet, instant messaging&amp;#8230; all from the terminal. But my philosophy on software has been undergoing subtle changes ever since the I got a faster computer. The thing is, I now default to graphical applications for most tasks. Where aptitude, mplayer, mpd, ncmpc, rtorrent, finch and elinks ruled supreme, synaptic, amarok, smplayer, deluge, pidgin and firefox have the upper hand. So this morning, I decided to find a GUI hardware information program to replace &lt;strong&gt;lspci, lshw and dmidecode&lt;/strong&gt;&amp;#8230; not really, I just needed a graphical frontend to these tools.  It took me about 15 minutes to go through the top three: &lt;strong&gt;Hardinfo, Sysinfo and Lshw-gtk&lt;/strong&gt;. Hardinfo was the most impressive of the lot. In addition to hardware information, it can perform benchmark tests and let you compare the results with that of others. My lean, mean and ridiculously affordable box did quite well in the comparison tests. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt;  Sysinfo was a little stingy on information but it&amp;#8217;s quite capable. Lshw-gtk, as the name implies, is really just a graphical frontend to lshw and threw up some detailed information about my motherboard and CPU but very little else. I&amp;#8217;m keeping only hardinfo for the long term however, the others don&amp;#8217;t quite live up to expectations. Anyways, that is only my opinion&amp;#8230; I&amp;#8217;ll let the screenshots do the rest of the talking:&lt;/p&gt;

&lt;a href=&quot;http://odzangba.wordpress.com/2009/02/28/graphical-hardware-information-tools/screenshot-cpu-zlib-system-information/&quot; title=&quot;screenshot-cpu-zlib-system-information&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;110&quot; src=&quot;http://odzangba.files.wordpress.com/2009/01/screenshot-cpu-zlib-system-information.png?w=150&amp;h=110&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;CPU-Z Benchmark&quot; title=&quot;screenshot-cpu-zlib-system-information&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://odzangba.wordpress.com/2009/02/28/graphical-hardware-information-tools/screenshot-cpu-blowfish-system-information/&quot; title=&quot;screenshot-cpu-blowfish-system-information&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;110&quot; src=&quot;http://odzangba.files.wordpress.com/2009/01/screenshot-cpu-blowfish-system-information.png?w=150&amp;h=110&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;Blowfish Benchmark&quot; title=&quot;screenshot-cpu-blowfish-system-information&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://odzangba.wordpress.com/2009/02/28/graphical-hardware-information-tools/screenshot-cpu-fibonacci-system-information/&quot; title=&quot;screenshot-cpu-fibonacci-system-information&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;110&quot; src=&quot;http://odzangba.files.wordpress.com/2009/01/screenshot-cpu-fibonacci-system-information.png?w=150&amp;h=110&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;Fibinacci Benchmark&quot; title=&quot;screenshot-cpu-fibonacci-system-information&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://odzangba.wordpress.com/2009/02/28/graphical-hardware-information-tools/screenshot-cpu-md5-system-information/&quot; title=&quot;screenshot-cpu-md5-system-information&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;110&quot; src=&quot;http://odzangba.files.wordpress.com/2009/01/screenshot-cpu-md5-system-information.png?w=150&amp;h=110&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;MD5 Benchmark&quot; title=&quot;screenshot-cpu-md5-system-information&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://odzangba.wordpress.com/2009/02/28/graphical-hardware-information-tools/screenshot-fpu-raytracing-system-information/&quot; title=&quot;screenshot-fpu-raytracing-system-information&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;110&quot; src=&quot;http://odzangba.files.wordpress.com/2009/01/screenshot-fpu-raytracing-system-information.png?w=150&amp;h=110&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;Ray Tracing Benchmark&quot; title=&quot;screenshot-fpu-raytracing-system-information&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://odzangba.wordpress.com/2009/02/28/graphical-hardware-information-tools/screenshot-cpu-sha1-system-information/&quot; title=&quot;screenshot-cpu-sha1-system-information&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;110&quot; src=&quot;http://odzangba.files.wordpress.com/2009/01/screenshot-cpu-sha1-system-information.png?w=150&amp;h=110&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;screenshot-cpu-sha1-system-information&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://odzangba.wordpress.com/2009/02/28/graphical-hardware-information-tools/screenshot-processor-system-information/&quot; title=&quot;screenshot-processor-system-information&quot;&gt;&lt;img width=&quot;150&quot; height=&quot;110&quot; src=&quot;http://odzangba.files.wordpress.com/2009/02/screenshot-processor-system-information.png?w=150&amp;h=110&quot; class=&quot;attachment-thumbnail&quot; alt=&quot;&quot; title=&quot;screenshot-processor-system-information&quot; /&gt;&lt;/a&gt;

  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/248/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/248/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/248/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/248/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/248/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/248/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/248/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/248/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/248/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/248/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=248&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Sat, 28 Feb 2009 19:48:57 +0000</pubDate>
</item>
<item>
	<title>Odzangba Dake: How To Fix Partition Table Order</title>
	<guid>http://odzangba.wordpress.com/?p=257</guid>
	<link>http://odzangba.wordpress.com/2009/02/28/how-to-fix-partition-table-order/</link>
	<description>&lt;br /&gt;&lt;p&gt;Last week, I resized one of my partitions to create some swap space. It&amp;#8217;s a long painful story that I will not bore you with but essentially, I got cocky with my 2GB RAM and refused to allocate swap space&amp;#8230; ubuntu punished me by activating compcache which then caused random lockups of the system. Anyway, I was coming up to the end of an install cycle anyway so I backed up the system with remastersys (that is one story, I&amp;#8217;ll have to blog about later), resized one of my partitions to create swap space and out of habit, did a &lt;strong&gt;sudo fdisk -l&lt;/strong&gt;&amp;#8230; it told me my partition entries were not in the proper order (a side effect of the resizing). It wasn&amp;#8217;t a big problem, just an irritation really but an irritation nevertheless. I decided to fix it before the install:&lt;/p&gt;
&lt;p&gt;sudo fdisk /dev/sda&lt;br /&gt;
press &lt;strong&gt;x&lt;/strong&gt; to enter expert mode&lt;br /&gt;
press &lt;strong&gt;f&lt;/strong&gt; to fix partition order&lt;br /&gt;
press &lt;strong&gt;w&lt;/strong&gt; to write the partition table changes to disk&lt;/p&gt;
&lt;p&gt;Yes, I&amp;#8217;l take a Heineken. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/257/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/257/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/257/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/257/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/257/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/257/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/257/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/257/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/257/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/257/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=257&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Sat, 28 Feb 2009 19:27:33 +0000</pubDate>
</item>
<item>
	<title>Joachim Breitner: Reliability testing for python-dbus applications</title>
	<guid>https://www.joachim-breitner.de/blog/archives/320-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/320-Reliability-testing-for-python-dbus-applications.html</link>
	<description>&lt;p&gt;In the Openmoko community, a lot of programs are written in python and use services provided over D-Bus. But I’m under the impression that not enough programmers consider that D-Bus is a remote protocol, and the other side might fail to respond any time. The code then works find if nothing goes wrong, but does not handle problems well. Understandably, it is hard to get this error checking right if you can’t really test it, as usually the D-Bus services do not fail. This is particularly annoying on a phone, because it might just be the program responsible for popping up the on screen keyboard that just failed.&lt;/p&gt;&lt;p&gt;Therefore I started to write a little &lt;a href=&quot;http://www.joachim-breitner.de/various/dbus_test.py&quot;&gt;python module called python_test.py&lt;/a&gt; that replaces some D-Bus functions in the python bindings (SystemBus.get_object and Connection.call_blocking at the moment) and makes them fail with a certain probability. You can add &amp;quot;import dbus_test&amp;quot; to your program (and adjust $PYTHON_PATH) and run it a few times, to see which error conditions are caught and which cause your problem to fail. If you come across failures that the script does not yet generate, they can easily be added.&lt;/p&gt;&lt;p&gt;Not sure yet if I am going to extend and maintain this, but I’m open to suggestions and additions. Maybe this (or something similar) should be provided by python-dbus directly.&lt;/p&gt;</description>
	<pubDate>Thu, 12 Feb 2009 13:55:37 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: Openmoko User Meeting in Karlsruhe</title>
	<guid>https://www.joachim-breitner.de/blog/archives/318-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/318-Openmoko-User-Meeting-in-Karlsruhe.html</link>
	<description>&lt;p&gt;About one hour ago we have finished the first &lt;a href=&quot;https://entropia.de/wiki/OpenMoko_User_Meet&quot;&gt;Openmoko user meeting&lt;/a&gt; in Karlsruhe. Twelve &lt;a href=&quot;http://wiki.openmoko.org/wiki/Neo_FreeRunner&quot;&gt;FreeRunner&lt;/a&gt; (and Neo1973) owners have gatherd in the rooms of &lt;a href=&quot;https://entropia.de/&quot;&gt;Entropia&lt;/a&gt; (the local &lt;a href=&quot;http://ccc.de/&quot;&gt;CCC&lt;/a&gt; club), and discussed the various distributions, learned aboutt the &lt;a href=&quot;http://www.freesmartphone.org/&quot;&gt;FSO&lt;/a&gt;-alternative &lt;a href=&quot;http://pyneo.org/&quot;&gt;PyNeo&lt;/a&gt;, which was advocated by Josh, compared GPS applications and talked about various other projects and issues.&lt;/p&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;https://entropia.de/wiki/Bild:Gta01_Freerunner_Massen.jpg&quot;&gt;&lt;img height=&quot;120&quot; border=&quot;0&quot; width=&quot;180&quot; src=&quot;https://entropia.de/wiki/images/thumb/a/a8/Gta01_Freerunner_Massen.jpg/180px-Gta01_Freerunner_Massen.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;I collected some statistics about Distribution usage. Most common was &lt;a href=&quot;http://shr-project.org/&quot;&gt;SHR&lt;/a&gt;, with five users, followed by &lt;a href=&quot;http://wiki.openmoko.org/wiki/Om_2008.12&quot;&gt;OM 2008.12 with&lt;/a&gt; three users. Single users had &lt;a href=&quot;http://wiki.debian.org/DebianOnFreeRunner&quot;&gt;Debian&lt;/a&gt;, OM testing from pre 2008.12, PyNeo, &lt;a href=&quot;http://www.emdebian.org/&quot;&gt;EmDebian&lt;/a&gt; and &lt;a href=&quot;http://wiki.openmoko.org/wiki/Om_2008.9&quot;&gt;OM 2008.9&lt;/a&gt; installed. Only counting those who use their FreeRunner as their day-to-day phone, three are using SHR, one OM 2008.12 and one OM testing. I conclude that SHR seems to be a good choice if you want to have a working phone.&lt;/p&gt;&lt;p&gt;Asked about their primary use case for the FreeRunner, almost all mentioned telephony and GPS. Half of the participants want to use it to browse the web, a little less think that games are important. Two people, who came from Stuttgart, see &lt;a href=&quot;http://wiki.openmoko.org/wiki/CellHunter&quot;&gt;CellHunter&lt;/a&gt; as an important use case&lt;/p&gt;&lt;p&gt;Considering that we filled three hours without running out of topics and the good feedback, we will likely have a sequel to this. A date has not been fixed yet, but will be discussed on the &lt;a href=&quot;http://lists.openmoko.org/mailman/listinfo/community&quot;&gt;openmoko-community&lt;/a&gt; mailing list.&lt;/p&gt;&lt;p&gt;BTW: I’m still planning to package the SHR applications for Debian as soon as possible. Only one dependency (libetk) is missing, but according to Lutin from the pkg-e team, it’s almost ready.&lt;/p&gt;</description>
	<pubDate>Wed, 11 Feb 2009 23:12:58 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Joachim Breitner: darcswatch uploaded to hackage</title>
	<guid>https://www.joachim-breitner.de/blog/archives/317-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/317-darcswatch-uploaded-to-hackage.html</link>
	<description>&lt;p&gt;I just made my &lt;a href=&quot;http://hackage.haskell.org/cgi-bin/hackage-scripts/package/darcswatch&quot;&gt;first upload to hackage&lt;/a&gt; (not counting uploads I did during my work in Dresden). Don Steward repeatedly told me to package and upload &lt;a href=&quot;https://www.joachim-breitner.de/blog/archives/290-Announcing-DarcsWatch.html&quot;&gt;darcswatch&lt;/a&gt;, so I just did that. Thanks to Gwern Branwen to contribute the first cabal file.&lt;/p&gt;&lt;p&gt;There is little documentation on how to set up darcswatch yourself, so if you actually want to try it out, you most likely will have to get in touch with me. Note that you can just use the installation on &lt;a href=&quot;http://darcswatch.nomeata.de/&quot;&gt;http://darcswatch.nomeata.de/&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you, for some reason, feel like hacking on darcswatch, I’d be interested in memory reduction. I currently process 916 mails containing 1867 patches and 47MB, as well as 13 repositories, some of which are rather large, and the numbers are increasing.&lt;/p&gt;</description>
	<pubDate>Wed, 21 Jan 2009 22:17:32 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>
<item>
	<title>Odzangba Dake: Recover Deleted Files Using Linux</title>
	<guid>http://odzangba.wordpress.com/?p=194</guid>
	<link>http://odzangba.wordpress.com/2009/01/20/recover-deleted-files-using-linux/</link>
	<description>&lt;br /&gt;&lt;p&gt;One of my neighbours came to me a couple of days ago with a problem&amp;#8230; he&amp;#8217;d lost his CV to a windows virus and had no backup. So I said I&amp;#8217;d try to recover the file for him. A quick google led me to &lt;a href=&quot;http://linux.die.net/man/1/foremost&quot; target=&quot;_blank&quot;&gt;Foremost&lt;/a&gt;. I chose foremost because it&amp;#8217;s small, fast and easy to use. Since this was a file recovery operation, I decided to minimize the risk of the deleted file being overwritten by creating a disk image of the pen drive. A quick&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;dd if=/dev/sdb of=recover.iso&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;did the trick.&lt;/p&gt;
&lt;p&gt;Then it was a simple matter of&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;sudo apt-get install foremost&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;to install foremost and then&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;foremost -t doc recover.iso&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &amp;#8216;-t doc&amp;#8217;  parameter tells foremost to look for only Microsoft Word files. About a minute later, the thing was done and the files were back. For what it&amp;#8217;s worth, if you accidentally delete a file, it&amp;#8217;s a very bad idea to continue using the computer. Shut down the pc or disconnect the drive immediately and look for a linux rescue cd. &lt;img src=&quot;http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/194/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/194/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/194/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/194/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/194/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/194/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/194/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/194/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/194/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/194/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=194&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;</description>
	<pubDate>Tue, 20 Jan 2009 20:23:59 +0000</pubDate>
</item>
<item>
	<title>Odzangba Dake: openSUSE 11.1… sigh Pt.1</title>
	<guid>http://odzangba.wordpress.com/?p=185</guid>
	<link>http://odzangba.wordpress.com/2009/01/01/opensuse-111-sigh-pt1/</link>
	<description>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;I chose to stay up and install openSUSE rather than crash the crazy new year parties in Accra (or go to church as all of my neighbours did). It could have been such a great distro. Later in the day, the good and the bad about openSUSE.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/odzangba.wordpress.com/185/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/odzangba.wordpress.com/185/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/odzangba.wordpress.com/185/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/odzangba.wordpress.com/185/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/odzangba.wordpress.com/185/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/odzangba.wordpress.com/185/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/odzangba.wordpress.com/185/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/odzangba.wordpress.com/185/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/odzangba.wordpress.com/185/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/odzangba.wordpress.com/185/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=odzangba.wordpress.com&amp;blog=438445&amp;post=185&amp;subd=odzangba&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 01 Jan 2009 10:55:33 +0000</pubDate>
</item>
<item>
	<title>Joachim Breitner: Handling explicit and implicit recusion in Haskell data</title>
	<guid>https://www.joachim-breitner.de/blog/archives/316-guid.html</guid>
	<link>https://www.joachim-breitner.de/blog/archives/316-Handling-explicit-and-implicit-recusion-in-Haskell-data.html</link>
	<description>&lt;p&gt;
For a while I have been pondering over a problem that arises when your functionally written program has some state with cross references – for example a list of users, each of which uses a number of computers, and a list of computers, each having an owner.
&lt;/p&gt;

&lt;h3&gt;Implicit referencing&lt;/h3&gt;
&lt;p&gt;
For doing queries on such data, it would be convenient if every reference is just the referenced object itself. Although we would visualize this as a graph, semantically, it is more like an infinite tree. This is possible in Haskell, due to laziness, and if you create the data structure cleverly, it even uses constant memory, no matter how “deep” you enter this infinite tree (&lt;a href=&quot;https://www.joachim-breitner.de/blog/archives/308-Infinite-loops-in-Haskell.html&quot;&gt;a recent post of mine talks about this&lt;/a&gt;). A possible data definition would be:
&lt;/p&gt;
&lt;pre&gt;data User = User {&lt;br /&gt;	userName :: String,&lt;br /&gt;	uses :: [Computer]&lt;br /&gt;	}&lt;br /&gt;data Computer = Computer {&lt;br /&gt;	computerName :: String,&lt;br /&gt;	owner :: User -- references the Users&lt;br /&gt;	}&lt;br /&gt;data State = State [User] [Computer]&lt;br /&gt;&lt;br /&gt;testState = let user = User &amp;quot;Conrad&amp;quot; [computer]&lt;br /&gt;                computer = Computer &amp;quot;Z3&amp;quot; user &lt;br /&gt;            in State [user] [computer]&lt;/pre&gt;

&lt;h3&gt;Explicit referencing&lt;/h3&gt;
&lt;p&gt;
But such a representation is very unsuitable for updates (at least I can’t think if a nice way of updating such a graph without breaking the internal cross-references) and serialization, which is a must for a &lt;a href=&quot;http://happs.org&quot;&gt;HAppS&lt;/a&gt; based application. So what one would probably start with is this data structure:
&lt;/p&gt;

&lt;pre&gt;data User = User {&lt;br /&gt;	userId :: Int,&lt;br /&gt;	userName :: String,&lt;br /&gt;	uses :: [Int] -- references the Computers&lt;br /&gt;	}&lt;br /&gt;data Computer = Computer {&lt;br /&gt;	computerId :: Int,&lt;br /&gt;	computerName :: String,&lt;br /&gt;	owner :: Int -- references the Users&lt;br /&gt;	}&lt;br /&gt;data State = State [User] [Computer]&lt;br /&gt;&lt;br /&gt;testState = State&lt;br /&gt;		[User 0 &amp;quot;Conrad&amp;quot; [1]]&lt;br /&gt;		[Computer 1 &amp;quot;Z3&amp;quot; 0]&lt;/pre&gt;

&lt;p&gt;I think the semantics of this are clear. Note that the referencing is currently not type-safe, but this can be provided by phantom types. Maybe I’ll write more about that later.
&lt;/p&gt;

&lt;p&gt;
Now imaging you want to display the information about the first computer with your web application. You extract the information with 
&lt;tt&gt;let State _ cs = testState in head cs&lt;/tt&gt; and pass that to your templating engine. But what if your template wants to display the name of the owner? It only has access to his &lt;tt&gt;userId&lt;/tt&gt;. You would either need to know what information the template will ever need, extract that from the state beforehand and pass it along, or give the template access to the whole state. In that case, though, there has to be lookup-logic in your output code, which is also not nice. 
&lt;/p&gt;

&lt;p&gt;Woudln’t it be nice if you could, in your application logic, work with the explicit references, which are easy to modify and store, but somehow turn that into the implicit referencing?&lt;/p&gt;

&lt;h3&gt;Duplicated representation&lt;/h3&gt;
&lt;p&gt;One way would be to have two unrelated sets of data structures, &lt;tt&gt;ExplicitState&lt;/tt&gt;, &lt;tt&gt;ExplicitUser&lt;/tt&gt;, &lt;tt&gt;ExplicitComputer&lt;/tt&gt;, which use explicit identifiers to reference each other, and &lt;tt&gt;ImplicitState&lt;/tt&gt;,... which are defined as the first representation of our state. It is then mostly trivial to write a function that converts &lt;tt&gt;ExplicitState&lt;/tt&gt; to &lt;tt&gt;ImplicitState&lt;/tt&gt;.
&lt;/p&gt;

&lt;p&gt;
The big disadvantage of this is that you have to maintain these two different hierarchies. It also means that every function on the state has to be defined twice, which often almost identical code. Clearly, this is not desirable.
&lt;/p&gt;

&lt;h3&gt;Annotated representation&lt;/h3&gt;
&lt;p&gt;
It would be more elegant if the state is stored in one data type that, controlled by a type parameter, comes in the one or the other representation. To do that, we need two types: One that contains a value, and one that contains just a reference:
&lt;/p&gt;
&lt;pre&gt;newtype Id v = Id v deriving (Show, Typeable, Data)&lt;br /&gt;newtype Ref v = Ref Int deriving (Show, Typeable, Data)&lt;/pre&gt;
&lt;p&gt;
Then we need to adjust our data definitions, to make use of these. (I’ll leave out the names, to keep the code smaller)&lt;/p&gt;
&lt;pre&gt;data User ref = User {&lt;br /&gt;	userId :: Int,&lt;br /&gt;	uses :: [ref (Computer ref)]&lt;br /&gt;	}&lt;br /&gt;data Computer ref = Computer {&lt;br /&gt;	computerId :: Int,&lt;br /&gt;	owner :: ref (User ref)&lt;br /&gt;	}&lt;br /&gt;data State ref = State [User ref] [Computer ref]&lt;/pre&gt;
&lt;p&gt;
Here we introduce a type parameter “ref”, which will later be either &lt;tt&gt;Id&lt;/tt&gt; or &lt;tt&gt;Ref&lt;/tt&gt;. Note that now a reference also states the object it is a reference for, which greatly increases type safety. Functions on these data types that don’t work with the references will be polymorphic in the “ref” type parameter, so only need to be written once. A &lt;tt&gt;User Id&lt;/tt&gt; is a complete user with all related data, while &lt;tt&gt;User Ref&lt;/tt&gt; is a user with only references. And a &lt;tt&gt;Ref (User Ref)&lt;/tt&gt; is reference to a user, which contains references...&lt;/p&gt;

&lt;h3&gt;Not so kind kinds&lt;/h3&gt;
&lt;p&gt;
Did you notice the lack of a deriving clause? Our data structures have the relatively peculiar kind (&lt;tt&gt;(* -&amp;gt; *) -&amp;gt; *&lt;/tt&gt;), which makes it hard for the compiler to derive instances for things like &lt;tt&gt;Show&lt;/tt&gt;. But we already know that we will only use &lt;tt&gt;Id&lt;/tt&gt; or &lt;tt&gt;Ref&lt;/tt&gt; for the type variable, so we can use ghc’s &lt;tt&gt;StandaloneDeriving&lt;/tt&gt; language extension and have these instances created:
&lt;/p&gt;
&lt;pre&gt;deriving instance Show (User Id)&lt;br /&gt;deriving instance Show (User Ref)&lt;br /&gt;deriving instance Show (Computer Id)&lt;br /&gt;deriving instance Show (Computer Ref)&lt;br /&gt;deriving instance Show (State Id)&lt;br /&gt;deriving instance Show (State Ref)&lt;/pre&gt;

&lt;h3&gt;Toggling a type parameter&lt;/h3&gt;
&lt;p&gt;
The next step is to write the conversion function. It will have type
&lt;/p&gt;&lt;pre&gt;unrefState :: State Ref -&amp;gt; State Id&lt;/pre&gt;
&lt;p&gt; For that, and for later, we need lookup functions:&lt;/p&gt;
&lt;pre&gt;unrefUserRef :: State Id -&amp;gt; Ref (User Ref) -&amp;gt; Id (User Id)&lt;br /&gt;unrefUserRef (State l _) (Ref i) = Id $ fromJust $&lt;br /&gt;	find (\u@(User i' _) -&amp;gt; i == i') l &lt;br /&gt;unrefComputerRef :: State Id -&amp;gt; Ref (Computer Ref) -&amp;gt; Id (Computer Id)&lt;br /&gt;unrefComputerRef (State _ l) (Ref i) = Id $ fromJust $&lt;br /&gt;	find (\u@(Computer i' _) -&amp;gt; i == i') l &lt;/pre&gt;
&lt;p&gt;
These expect a State (with implicit referencing) and a reference, and look up this reference. The function &lt;tt&gt;unrefState&lt;/tt&gt; then looks like this:
&lt;/p&gt;
&lt;pre&gt;unrefState :: State Ref -&amp;gt; State Id&lt;br /&gt;unrefState (State us cs) =&lt;br /&gt;	let unrefState = State (map (unrefUser unrefState) us)&lt;br /&gt;	                       (map (unrefComp unrefState) cs)&lt;br /&gt;	in unrefState&lt;br /&gt;  where unrefUser :: State Id -&amp;gt; User Ref -&amp;gt; User Id&lt;br /&gt;        unrefUser s (User i refs) = User i (map (unrefComputerRef s) refs)&lt;br /&gt;&lt;br /&gt;	unrefComp :: State Id -&amp;gt; Computer Ref -&amp;gt; Computer Id&lt;br /&gt;	unrefComp s (Computer i ref) = Computer i (unrefUserRef s ref)&lt;/pre&gt;
&lt;p&gt;
Note how we “tie the knot” in the &lt;tt&gt;let&lt;/tt&gt; expression. This is the trick that ensures constant memory consumption, because every reference points back to the same place in memory.
&lt;/p&gt;

&lt;h3&gt;Satisfied already?&lt;/h3&gt;
&lt;p&gt;
So what do we have? We have no duplication of data types, we can write general functions, and we can resolve the explicit referencing. We can also easily write functions like &lt;tt&gt;unrefUser :: State Ref -&amp;gt; User Ref -&amp;gt; User Id&lt;/tt&gt;, which transform just a part of the state.&lt;/p&gt;

&lt;p&gt;
But writing &lt;tt&gt;unrefState&lt;/tt&gt; is very tedious when the State becomes more complex. Each of the other &lt;tt&gt;unrefSomething&lt;/tt&gt; functions are very similar, but need to be written anyways. This is unsatisfactory. What we want, is a generic function, something like
&lt;/p&gt;
&lt;pre&gt;gunref :: State Ref -&amp;gt; a Ref -&amp;gt; a Id&lt;/pre&gt;
&lt;p&gt;
which, given a state with explicit references, replaces all explicit references in the first argument (which could be &lt;tt&gt;State Ref&lt;/tt&gt; or &lt;tt&gt;User Ref&lt;/tt&gt; or anything like that) with implicit ones. This function can not exist, because we would not know anything about &lt;tt&gt;a&lt;/tt&gt; and &lt;tt&gt;b&lt;/tt&gt;. But maybe we can do this:
&lt;/p&gt;
&lt;pre&gt;gunref :: (Data (a Id), Data (a Ref)) =&amp;gt;  State Ref -&amp;gt; a Ref -&amp;gt; a Id&lt;/pre&gt;

&lt;h3&gt;Typeable and Data&lt;/h3&gt;
&lt;p&gt;
Before being able to do so, we need to derive &lt;tt&gt;&lt;a href=&quot;http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Data.html#t%3AData&quot;&gt;Data&lt;/a&gt;&lt;/tt&gt; for our types. We can start with
&lt;/p&gt;
&lt;pre&gt;deriving instance Data (User Id)&lt;br /&gt;deriving instance Data (User Ref)&lt;br /&gt;deriving instance Data (Computer Id)&lt;br /&gt;deriving instance Data (Computer Ref)&lt;br /&gt;deriving instance Data (State Id)&lt;br /&gt;deriving instance Data (State Ref&lt;/pre&gt;
&lt;p&gt;
but that will complain about missing &lt;tt&gt;&lt;a href=&quot;http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Typeable.html#t%3ATypeable&quot;&gt;Typeable&lt;/a&gt;&lt;/tt&gt; instances. Unfortunately, ghc’s deriver for &lt;tt&gt;Typeable&lt;/tt&gt; (even the stand-alone-one), does not handle our peculiar kind, so we need to do it by hand. With some help from quicksilver on #haskell, I got it to work:
&lt;/p&gt;
&lt;pre&gt;instance Typeable1 ref =&amp;gt; Typeable (User ref) where&lt;br /&gt;	typeOf _ = mkTyConApp (mkTyCon &amp;quot;User&amp;quot;)     [typeOf1 (undefined :: ref ())]&lt;br /&gt;instance Typeable1 ref =&amp;gt; Typeable (Computer ref) where &lt;br /&gt;	typeOf _ = mkTyConApp (mkTyCon &amp;quot;Computer&amp;quot;) [typeOf1 (undefined :: ref ())]&lt;br /&gt;instance Typeable1 ref =&amp;gt; Typeable (State ref) where &lt;br /&gt;	typeOf _ = mkTyConApp (mkTyCon &amp;quot;State&amp;quot;)    [typeOf1 (undefined :: ref ())]&lt;/pre&gt;

&lt;h3&gt;&lt;tt&gt;everywhere&lt;/tt&gt; is not enough&lt;/h3&gt;
&lt;p&gt;Turning to the documentation of &lt;tt&gt;&lt;a href=&quot;http://haskell.org/ghc/docs/latest/html/libraries/syb/Data-Generics.html&quot;&gt;Data.Generics&lt;/a&gt;&lt;/tt&gt;, I notice with some disappointment that there is no function that is able to &lt;em&gt;change&lt;/em&gt; a type – they all seem to replace a value by another value of the same type. But the functions &lt;tt&gt;&lt;a href=&quot;http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Data.html#v%3Agfoldl&quot;&gt;gfoldl&lt;/a&gt;&lt;/tt&gt; and &lt;tt&gt;&lt;a href=&quot;http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Data.html#v%3Agunfold&quot;&gt;gunfold&lt;/a&gt;&lt;/tt&gt; sounded like they could be used for this.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; What comes now is a very non-haskellish hack that subverts the type system, just to get the job done. Please read it with a healthy portion of distrust. If you know of a cleaner way of doing that, please tell me!&lt;/p&gt;

&lt;h3&gt;Wrapped Data&lt;/h3&gt;
&lt;p&gt;I want to do some heavy type hackery, so I need to disable haskell’s type system. There is &lt;tt&gt;&lt;a href=&quot;http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Dynamic.html&quot;&gt;Data.Dynamic&lt;/a&gt;&lt;/tt&gt;, but not even that is enough, as we need to carry a type’s &lt;tt&gt;Data&lt;/tt&gt; instance around as well. So let’s wrap that up:
&lt;/p&gt;
&lt;pre&gt;data AData where AData :: Data a =&amp;gt; a -&amp;gt; AData&lt;br /&gt;instance Show AData where show (AData a) = &amp;quot;&amp;lt;&amp;quot; ++ show (typeOf a) ++ &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;&lt;br /&gt;fromADataE :: forall b. Data b =&amp;gt; AData -&amp;gt; b&lt;br /&gt;fromADataE (AData d) = case cast d of&lt;br /&gt;	Just v -&amp;gt; v&lt;br /&gt;	Nothing -&amp;gt; error $ &amp;quot;Type error, trying to convert &amp;quot; ++&lt;br /&gt;			   show (typeOf d) ++ &amp;quot; to  &amp;quot; ++&lt;br /&gt;			   show (typeOf (undefined :: b)) ++ &amp;quot;.&amp;quot;&lt;/pre&gt;
&lt;p&gt;There is also a function that converts an &lt;tt&gt;AData&lt;/tt&gt; back to a normal type, if possible. If it’s not possible, then there is a bug in our code, so we give an informative error message.
&lt;/p&gt;

&lt;h3&gt;AData transformers&lt;/h3&gt;
&lt;p&gt;
Similar to &lt;tt&gt;&lt;a href=&quot;http://haskell.org/ghc/docs/latest/html/libraries/syb/Data-Generics-Schemes.html#v%3Aeverywhere&quot;&gt;everywhere&lt;/a&gt;&lt;/tt&gt;, we want to have transformers that combinable. They need to have the change to convert an arbitrary value, but also signal that they could not convert something (and this something has to be recursed into). I came up with this:
&lt;/p&gt;
&lt;pre&gt;type ADataT = AData -&amp;gt; Maybe AData&lt;br /&gt;&lt;br /&gt;extADT :: forall a b. (Data a, Data b) =&amp;gt; ADataT -&amp;gt; (a -&amp;gt; b) -&amp;gt; ADataT&lt;br /&gt;extADT at t a@(AData v) = case cast v of &lt;br /&gt;		Just x -&amp;gt;  Just (AData (t x))&lt;br /&gt;		Nothing -&amp;gt; at a&lt;br /&gt;&lt;br /&gt;doNothing :: ADataT&lt;br /&gt;doNothing = const Nothing&lt;/pre&gt;
&lt;p&gt;
&lt;tt&gt;ADataT&lt;/tt&gt; is the type for such a transformer. &lt;tt&gt;doNothing&lt;/tt&gt; will not transform anything, and &lt;tt&gt;extADT&lt;/tt&gt; can be used to add any function to the list of tried transformers, in the spirit of &lt;tt&gt;&lt;a href=&quot;http://haskell.org/ghc/docs/latest/html/libraries/syb/Data-Generics-Aliases.html#v%3AextT&quot;&gt;extT&lt;/a&gt;&lt;/tt&gt;.
&lt;/p&gt;

&lt;h3&gt;The ugly part&lt;/h3&gt;
&lt;p&gt;
To apply such a transformer, I want to use this function, which I’ll describe in the code comments:
&lt;/p&gt;
&lt;pre&gt;everywhereADT :: forall a b. (Data a, Data b) =&amp;gt; ADataT -&amp;gt; a -&amp;gt; b&lt;br /&gt;&lt;br /&gt;-- first check if we can transform this value already&lt;br /&gt;everywhereADT f v = case f (AData v) of&lt;br /&gt;        -- if so, coerce it to the users’ requested type, which hopefully goes well&lt;br /&gt;	Just r -&amp;gt;  fromADataE r &lt;br /&gt;	-- if not, we need to recurse into the data structure&lt;br /&gt;	Nothing -&amp;gt; recursed&lt;br /&gt;&lt;br /&gt;	-- for that, we first need to figure out the arguments to the &lt;br /&gt;        -- constructor. We store them in the untyped list&lt;br /&gt;  where args :: [AData]&lt;br /&gt;        (Const args) = gfoldl k z v&lt;br /&gt;	-- gfoldl lets us have a look at each argument. We wrap it in AData&lt;br /&gt;        -- and append it to the list&lt;br /&gt;	k (Const args) arg = Const (AData arg : args)&lt;br /&gt;	z start = Const []&lt;br /&gt;&lt;br /&gt;	-- We need the data constructor of the input data type. If the user did not want&lt;br /&gt;        -- it to be transformed, it will be the same&lt;br /&gt;	c = toConstr v&lt;br /&gt;&lt;br /&gt;	-- To give better error messages, we make sure that the outmost type constructor&lt;br /&gt;        -- of the requested type actually has the data constructor we were given. Otherwise&lt;br /&gt;        -- gunfold will complain in a non-helpful way&lt;br /&gt;	input_type = dataTypeRep (constrType c)&lt;br /&gt;	output_type = dataTypeRep (dataTypeOf (undefined :: b))&lt;br /&gt;&lt;br /&gt;	recursed = if input_type /= output_type&lt;br /&gt;                   then error $ &amp;quot;Can not convert &amp;lt;&amp;quot; ++ show input_type ++ &amp;quot;&amp;gt;&amp;quot;++&lt;br /&gt;                                            &amp;quot; to &amp;lt;&amp;quot; ++ show output_type ++ &amp;quot;&amp;gt;.&amp;quot;&lt;br /&gt;	-- the types match, so we assemble the output type, using gunfold&lt;br /&gt;                   else snd (gunfold k' z' c)&lt;br /&gt;	k' :: forall b r . Data b =&amp;gt; ([AData], b -&amp;gt; r) -&amp;gt; ([AData],r)&lt;br /&gt;&lt;br /&gt;	-- we start by reversing the input list&lt;br /&gt;	z' start = (reverse args,start)&lt;br /&gt;	&lt;br /&gt;	-- then we call us recursively on the argument and feed the result&lt;br /&gt;        -- to the output constructor&lt;br /&gt;	k' ((AData a) : args, append) = (args, append (everywhereADT f a))&lt;br /&gt;&lt;br /&gt;-- Used for folding (we don’t need to retain the original constructor)&lt;br /&gt;data Const a b = Const a &lt;/pre&gt;
&lt;p&gt;
What a beast! But surprisingly, it works. Here are some examples. Note that I always have to specify the requested output type:
&lt;/p&gt;
&lt;pre&gt;bool2Int :: Bool -&amp;gt; Int&lt;br /&gt;bool2Int False = 0&lt;br /&gt;bool2Int True = 1&lt;br /&gt;&lt;br /&gt;*Main&amp;gt; everywhereADT (doNothing `extADT` bool2Int) True :: Int&lt;br /&gt;1&lt;br /&gt;*Main&amp;gt; everywhereADT (doNothing `extADT` bool2Int) True :: ()&lt;br /&gt;*** Exception: Type error, trying to convert Int to  ().&lt;br /&gt;*Main&amp;gt; everywhereADT (doNothing `extADT` bool2Int) (True,False) :: (Int,Int)&lt;br /&gt;(1,0)&lt;br /&gt;*Main&amp;gt; everywhereADT (doNothing `extADT` bool2Int) ([True,False],True,()) :: ([Int],Int,())&lt;br /&gt;([1,0],1,())&lt;br /&gt;*Main&amp;gt; everywhereADT (doNothing `extADT` bool2Int) ([True,False],True,()) :: [()]&lt;br /&gt;*** Exception: Can not convert  to .&lt;br /&gt;*Main&amp;gt; everywhereADT (doNothing `extADT` bool2Int) [True] :: [Bool]&lt;br /&gt;[*** Exception: Type error, trying to convert Int to  Bool.&lt;/pre&gt;
&lt;p&gt;
I hope this code does not inflict too much pain on any Haskell-loving reader. I know I violated the language, but I didn’t know how to do it better (at least not without using Template Haskell). I also know that this is not very good performance wide: Every single value in the input will be deconstructed, type-compared several times and re-assembled. If that is an issue, then this function should only be used for prototyping.
&lt;/p&gt;

&lt;h3&gt;Almost done&lt;/h3&gt;
&lt;p&gt;
To apply this to our state, we only need to glue it to our lookup functions from above:
&lt;/p&gt;
&lt;pre&gt;gunref :: (Data (a Id), Data (a Ref)) =&amp;gt;  State Ref -&amp;gt; a Ref -&amp;gt; a Id&lt;br /&gt;gunref s w = let unrefState = gunref' unrefState s&lt;br /&gt;             in gunref' unrefState w&lt;br /&gt;&lt;br /&gt;gunref' :: (Data (a Id), Data (a Ref)) =&amp;gt;  State Id -&amp;gt; a Ref -&amp;gt; a Id&lt;br /&gt;gunref' unrefState = everywhereADT unref'&lt;br /&gt;  where unref' = doNothing `extADT`&lt;br /&gt;		 unrefUserRef unrefState `extADT`&lt;br /&gt;		 unrefComputerRef unrefState&lt;/pre&gt;
&lt;p&gt;Now we have a generic unreferencer. I set the type a bit more specific than necessary, to make it safe to use (under the assumption that the list of lookup functions is complete and will not leave any &lt;tt&gt;Ref&lt;/tt&gt; in the output).
&lt;/p&gt;
&lt;pre&gt;*Main&amp;gt; testState &lt;br /&gt;State [User {userId = 0, uses = [Ref 1]}] [Computer {computerId = 1, owner = Ref 0}]&lt;br /&gt;*Main&amp;gt; gunref testState testState &lt;br /&gt;State [User {userId = 0, uses = [Id (Computer {computerId = 1, owner = Id (User {userId = 0,&lt;br /&gt;uses = [Id (Computer {computerId = 1, owner = Id (User {userId = 0, uses = ..&lt;/pre&gt;
&lt;p&gt;
Oh, and by the way, if you want to test this code, you’ll need at least:
&lt;/p&gt;
&lt;pre&gt;{-# LANGUAGE DeriveDataTypeable, FlexibleInstances, GADTs,&lt;br /&gt;             FlexibleContexts, StandaloneDeriving, ScopedTypeVariables #-}&lt;/pre&gt;</description>
	<pubDate>Wed, 31 Dec 2008 15:21:28 +0000</pubDate>
	<author>mail@joachim-breitner.de (nomeata)</author>
</item>

</channel>
</rss>
