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

<channel>
	<title>Frederik&#039;s Blog &#187; Work</title>
	<atom:link href="http://artipc10.vub.ac.be/wordpress/tag/work/feed/" rel="self" type="application/rss+xml" />
	<link>http://artipc10.vub.ac.be/wordpress</link>
	<description>Random thoughts of a Linux sysadmin</description>
	<lastBuildDate>Sun, 04 Mar 2012 18:13:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>New AI Lab site based on Drupal</title>
		<link>http://artipc10.vub.ac.be/wordpress/2011/12/17/new-ai-lab-site-based-on-drupal/</link>
		<comments>http://artipc10.vub.ac.be/wordpress/2011/12/17/new-ai-lab-site-based-on-drupal/#comments</comments>
		<pubDate>Sat, 17 Dec 2011 19:05:49 +0000</pubDate>
		<dc:creator>Frederik</dc:creator>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[Artificial Intelligence Lab]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://artipc10.vub.ac.be/wordpress/?p=1200</guid>
		<description><![CDATA[The Artificial Intelligence lab has opened its new website a few days ago. The website is based on Drupal and a PostgreSQL database. Unfortunately, some modules (such as the biblio module) have some bugs when being used with a PostgreSQL datable instead of MySQL, but I hope that the last bugs will be fixed in [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://ai.vub.ac.be">Artificial Intelligence lab</a> has opened its new website a few days ago. The website is based on <a href="http://drupal.org/">Drupal</a> and a <a href="http://www.postgresql.org/">PostgreSQL</a> database. Unfortunately, some modules (such as the <a href="http://drupal.org/project/biblio">biblio</a> module) have some bugs when being used with a PostgreSQL datable instead of MySQL, but I hope that the last bugs will be fixed in the near future.</p>
]]></content:encoded>
			<wfw:commentRss>http://artipc10.vub.ac.be/wordpress/2011/12/17/new-ai-lab-site-based-on-drupal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Improving Mediawiki performance</title>
		<link>http://artipc10.vub.ac.be/wordpress/2011/02/18/improving-mediawiki-performance/</link>
		<comments>http://artipc10.vub.ac.be/wordpress/2011/02/18/improving-mediawiki-performance/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 20:31:39 +0000</pubDate>
		<dc:creator>Frederik</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Mediawiki]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://artipc10.vub.ac.be/wordpress/?p=942</guid>
		<description><![CDATA[Now that I am on the subject of improving performance, I configured some performance improvements for a Mediawiki installation here: Make sure you run the latest Mediawiki version. Mediawiki 1.16 introduced a new localisation caching system which is supposed to improve performance, so you definitely want this to get the best performance. Create a directory [...]]]></description>
			<content:encoded><![CDATA[<p>Now that I am on the subject of improving performance, I configured some performance improvements for a Mediawiki installation here:</p>
<ul>
<li>Make sure you run the latest Mediawiki version. Mediawiki 1.16 introduced a new localisation caching system which is supposed to improve performance, so you definitely want this to get the best performance.</li>
<li>Create a directory where Mediawiki can store the localisation cache (make sure it is writable by your web server). By preference store it on a tmpfs (at least if you are sure it will be big enough to store the cache), and configure it in LocalSettings.php:<br />
<code>$wgCacheDirectory = "/tmp/mediawiki";</code><br />
Iif /tmp is on a tmpfs, you might add creation of this directory with the right permissions to /etc/rc.local, so that it still exists after a reboot.</li>
<li>Enable <a href="http://www.mediawiki.org/wiki/Manual:File_cache">file caching</a> in Mediawiki&#8217;s LocalSettings.php:<br />
<code>$wgFileCacheDirectory = "{$wgCacheDirectory}/html";<br />
$wgUseFileCache = true;<br />
$wgShowIPinHeader = false;<br />
$wgUseGzip = true;</code></li>
<li>Make sure you have installed some <a href="http://www.mediawiki.org/wiki/Manual:Cache">PHP accelerator for caching</a>. I have APC installed and configured it in Mediawiki&#8217;s LocalSettings.php:<br />
<code>$wgMainCacheType = CACHE_ACCEL;</code></li>
</ul>
<p>Here is a benchmark before implementing the above configuration (with CACHE_NONE, but APC still installed):</p>
<p><code>$ ab -kt 30 http://site/wiki/index.php/Page<br />
This is ApacheBench, Version 2.3 &lt; $Revision: 655654 $&gt;<br />
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br />
Licensed to The Apache Software Foundation, http://www.apache.org/</code></p>
<p><code>Benchmarking site (be patient)<br />
Finished 255 requests</code></p>
<p><code> </code></p>
<p><code>Server Software:        Apache/2.2.16<br />
Server Hostname:        site<br />
Server Port:            80</code></p>
<p><code>Document Path: /wiki/index.php/Page<br />
Document Length:        12750 bytes</code></p>
<p><code> </code></p>
<p><code>Concurrency Level:      1<br />
Time taken for tests:   30.084 seconds<br />
Complete requests:      255<br />
Failed requests:        0<br />
Write errors:           0<br />
Keep-Alive requests:    0<br />
Total transferred:      3344070 bytes<br />
HTML transferred:       3251250 bytes<br />
Requests per second:    8.48 [#/sec] (mean)<br />
Time per request:       117.978 [ms] (mean)<br />
Time per request:       117.978 [ms] (mean, across all concurrent requests)<br />
Transfer rate:          108.55 [Kbytes/sec] received</p>
<p>Connection Times (ms)<br />
min  mean[+/-sd] median   max<br />
Connect:        3    6   2.8      7      21<br />
Processing:    88  112  11.1    112     163<br />
Waiting:       66   90   9.1     89     125<br />
Total:         95  118  11.9    118     170</p>
<p></code></p>
<p><code>Percentage of the requests served within a certain time (ms)<br />
50%    118<br />
66%    122<br />
75%    125<br />
80%    127<br />
90%    132<br />
95%    138<br />
98%    145<br />
99%    156<br />
100%    170 (longest request)</code></p>
<p>And here a benchmark after implementing the changes:</p>
<p><code>ab -kt 30 http://site/wiki/index.php/Page<br />
This is ApacheBench, Version 2.3 &lt; $Revision: 655654 $&gt;<br />
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br />
Licensed to The Apache Software Foundation, http://www.apache.org/</code></p>
<p><code>Benchmarking site (be patient)<br />
Finished 649 requests</code></p>
<p><code> </code></p>
<p><code>Server Software:        Apache/2.2.16<br />
Server Hostname:        site<br />
Server Port:            80</code></p>
<p><code>Document Path: /wiki/index.php/Page<br />
Document Length:        12792 bytes</code></p>
<p><code> </code></p>
<p><code>Concurrency Level:      1<br />
Time taken for tests:   30.015 seconds<br />
Complete requests:      649<br />
Failed requests:        0<br />
Write errors:           0<br />
Keep-Alive requests:    0<br />
Total transferred:      8538244 bytes<br />
HTML transferred:       8302008 bytes<br />
Requests per second:    21.62 [#/sec] (mean)<br />
Time per request:       46.248 [ms] (mean)<br />
Time per request:       46.248 [ms] (mean, across all concurrent requests)<br />
Transfer rate:          277.80 [Kbytes/sec] received</p>
<p>Connection Times (ms)<br />
min  mean[+/-sd] median   max<br />
Connect:        3    9   3.7      8      29<br />
Processing:    23   37   6.0     37      62<br />
Waiting:       13   23   4.9     24      41<br />
Total:         28   46   7.8     45      82</p>
<p></code></p>
<p><code>Percentage of the requests served within a certain time (ms)<br />
50%     45<br />
66%     47<br />
75%     49<br />
80%     50<br />
90%     56<br />
95%     62<br />
98%     68<br />
99%     73<br />
100%     82 (longest request)</code></p>
<p>So Mediawiki can deal with more than 2,5 times as much requests now.</p>
<p><a href="http://blogs.testbit.eu/timj/2011/02/09/using-mod_disk_cache-with-mediawiki/">Some people use Apache&#8217;s mod_disk_cache to cache Mediawiki pages</a>, but I prefer Mediawiki&#8217;s own caching system because it is more standard and does not require patching Mediawiki, even if it might not get as much benefit as a real proxy or mod_disk_cache.</p>
]]></content:encoded>
			<wfw:commentRss>http://artipc10.vub.ac.be/wordpress/2011/02/18/improving-mediawiki-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Improving performance by using tmpfs</title>
		<link>http://artipc10.vub.ac.be/wordpress/2011/02/17/improving-performance-by-using-tmpfs/</link>
		<comments>http://artipc10.vub.ac.be/wordpress/2011/02/17/improving-performance-by-using-tmpfs/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 22:25:06 +0000</pubDate>
		<dc:creator>Frederik</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[Amavis]]></category>
		<category><![CDATA[Nagios]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[tmpfs]]></category>

		<guid isPermaLink="false">http://artipc10.vub.ac.be/wordpress/?p=936</guid>
		<description><![CDATA[Today I analyzed disk reads and writes on a server with iotop and strace and found some interesting possible optimizations. With iotop you can check which processes are reading and writing from the disks. I always press the o, p and a keys in iotop so that it only shows me processes doing I/O and [...]]]></description>
			<content:encoded><![CDATA[<p>Today I analyzed disk reads and writes on a server with iotop and strace and found some interesting possible optimizations.</p>
<p>With iotop you can check which processes are reading and writing from the disks. I always press the o, p and a keys in iotop so that it only shows me processes doing I/O and so that it will show accumulated I/O instead of the bandwidth. With the left and right arrows I select on which columns to sort the list.</p>
<p>Once you have identified the processes wich are doing much I/O, you can check what they are reading or writing with strace, for example<code><br />
# ﻿strace  -f -p $PID  -e trace=open,read,write</code></p>
<p>(you can leave out read and/or write if this gives too much noise)</p>
<p>This way I identified some locations where processes do lots of read and write operations on temporary files.</p>
<p>For nagios I placed ﻿/var/lib/nagios3/spool and /var/cache/nagios3 on a tmpfs, for Amavis /var/lib/amavis/tmp and for PostgreSQL /var/lib/postgresql/8.4/main/pg_stat_tm.</p>
<p>Other candidates you might want to consider: /tmp, /var/tmp and /var/lib/php5. There are probably many others, depending on which services you use.</p>
]]></content:encoded>
			<wfw:commentRss>http://artipc10.vub.ac.be/wordpress/2011/02/17/improving-performance-by-using-tmpfs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DHCPd failover</title>
		<link>http://artipc10.vub.ac.be/wordpress/2010/11/28/dhcpd-fail-over/</link>
		<comments>http://artipc10.vub.ac.be/wordpress/2010/11/28/dhcpd-fail-over/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 16:13:40 +0000</pubDate>
		<dc:creator>Frederik</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[DHCP]]></category>
		<category><![CDATA[dhcpd]]></category>
		<category><![CDATA[failover]]></category>
		<category><![CDATA[incron]]></category>
		<category><![CDATA[load balancing]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://artipc10.vub.ac.be/wordpress/?p=839</guid>
		<description><![CDATA[Last week, I set up two dhcpd servers in a fail-over configuration. The goal is that when one DHCP server goes down, the other one takes over so that clients don&#8217;t lose their network connection. I read different tutorials on the web, such as this one of a fellow blogger and this documentation published by [...]]]></description>
			<content:encoded><![CDATA[<p>Last week, I set up two dhcpd servers in a fail-over configuration. The goal is that when one DHCP server goes down, the other one takes over so that clients don&#8217;t lose their network connection. I read different tutorials on the web, such as <a href="http://barryp.org/blog/entries/dhcp-failover//">this one of a fellow blogger</a> and <a href="http://publib.boulder.ibm.com/infocenter/clresctr/vxrx/index.jsp?topic=%2Fcom.ibm.cluster.csm16.admin.doc%2Fam7ad_dhcpfaillnx.html">this documentation published by IBM</a>.</p>
<p><span id="more-839"></span></p>
<p>First of all, you need two machines with exactly the same version of <a href="http://www.isc.org/software/dhcp">ISC dhcpd</a>. Failover is unsupported when the two systems are running a different dhcpd version, as the implementation may have been changed.</p>
<p>On the primary dhcpd, you put this in dhcpd.conf:</p>
<pre>failover peer "dhcp" {
    primary;
    address 123.456.789.001; # address of this server
    port 519;
    peer address 123.456.789.002; # address of the secondary dhcpd
    peer port 519;
   max-response-delay 60;
   max-unacked-updates 10;
   mclt 600;
   split 128;
   load balance max seconds 3;
}

key primaryhost {
    algorithm hmac-md5;
    secret "secret";
};

omapi-key primaryhost;
omapi-port 7911;

include "/etc/dhcp/dhcpd.master";
</pre>
<p>You have to change the address of the primary and the secondary dhcpd in the configuration file. In this example, both the primary and the secondary dhcpd are listening on port 519, so you will have to open this port in the firewall on both systems so that the two dhcp daemons can contact each other.  A split value of 128 means that both the primary and secondary server will manage half of the available IP addresses. By setting a higher number (max 255), the primary server will manage more addresses, by lowering it, the secondary will take care of a bigger part. With this option, you can distribute the load over the two servers. mclt is the duration of leases in seconds that either of the DHCP servers will offer to the peer&#8217;s DHCP clients when the peer is down. max-response-delay defines the number of seconds after which a dhcpd will consider its peer as dead if it does not get any reply; load balance max seconds is the time which a load balancing is disabled: if a dhcpd fails to respond within this time to a DHCPDISCOVER packet, the peer dhcpd will respond in its place.</p>
<p>Now you need to create a key for connecting to OMAPI, which is dhcpd&#8217;s interface which can be used to send it commands at run-time. You will need the dnssec-keygen command, part of the bind9utils package in Debian. To create the key, first cd to the /etc/dhcp/ directory, and run<br />
<code># dnssec-keygen -a HMAC-MD5 -b 512 -n HOST primaryhost</code></p>
<p>&#8220;primaryhost&#8221; should be the name of the key you used in the dhcpd.conf file, you can use use the hostname if you want. This will create two files, one with the extension key and one with the extension private. Open the key file, and copy the last part of the line in that file (i.e. everything after the last space). This is the key&#8217;s secret: you have to to put it in your dhcpd.conf file after the secret keyword.</p>
<p>This is how dhcpd.conf looks like on the secondary dhcpd:</p>
<pre>failover peer "dhcp" {
    secondary;
    address 123.456.789.002;
    port 519;
    peer address 123.456.789.001;
    peer port 519;
    max-response-delay 60;
    max-unacked-updates 10;
    load balance max seconds 3;
}

key secondaryhost {
    algorithm hmac-md5;
    secret "secret";
};

omapi-key secondaryhost;
omapi-port 7911;
include "/etc/dhcp/dhcpd.master";
</pre>
<p>Create an OMAPI key on the secondary dhcpd host, just like you did on the primary host, and copy the key&#8217;s secret in the dhcpd.conf.</p>
<p>Now we have to create the dhcpd.master file. This file should be at all time identical on both hosts! It can look something like this:</p>
<pre>default-lease-time 7200;
max-lease-time 14400;
option domain-name-servers 123.456.789.001, 123.456.789.002;
option domain-name "my.domain";
subnet 123.456.789.0 netmask 255.255.255.0 {
    authoritative;
    option subnet-mask 255.255.255.0;
    option broadcast-address 123.456.789.255;
    option routers 123.456.789.5;
    pool {
        failover peer "dhcp";
        range 123.456.789.50 123.456.789.150;
    }
}</pre>
<p>Basically the only difference with your non-failover dhcpd.conf file, is that you add a line</p>
<pre>failover peer "dhcp"</pre>
<p>in every pool section. If you used another name than dhcp in the failover peer section in dhcpd.conf, replace dhcp by the name you have chosen.</p>
<p>Now we have to find a way to make sure that dhcpd.master on the secondary dhcpd is always in sync with the one on the primary dhcpd. In the future, I might start using something like <a href="http://www.cfengine.org/">cfengine</a> to manage configuration files on my servers, but for now I wanted something simple to set up. <a href="http://incron.aiken.cz">Incron</a> was the perfect solution. On the primary server, I created a /etc/incron.d/dhcpd file with these contents:</p>
<pre>/etc/dhcp IN_CLOSE_WRITE /usr/local/sbin/dhcpd.master.incron.sh $@/$#</pre>
<p>This will execute the given shell script for every time a file is modified and closed in the directory /etc/dhcp. Note that you cannot just put an inotify watch on /etc/dhcp/dhcpd.master itself, as the watch will be lost whenever dhcpd.master is deleted, and this is exactly what happens when you use vim to edit the file: when saving an existing file, vim creates a new temporary file, then deletes the original old file, and renames the temporary file to the original name.</p>
<p>/usr/local/sbin/dhcpd.master.incron looks like this:</p>
<pre>#!/bin/bash
if [ $1"x" == "/etc/dhcp/dhcpd.masterx" ]
then
    scp /etc/dhcp/dhcpd.master dhcp@secondarydhcp.my.domain:/var/lib/dhcpd/dhcpd.master/
fi</pre>
<p>We check whether the saved file is dhcpd.master, and in that case, we scp it to the secondary server.</p>
<p>On the secondary server, I created a user dhcp and I created the directory /var/lib/dhcpd/dhcpd.master/, writable by the dhcp users. I added root&#8217;s ssh certificate of the primary server to ~dhcp/.ssh/authorized_keys on the secondary server.</p>
<p>The install incron on the secondary server and create this incron configuration file:</p>
<pre>/var/lib/dhcpd/dhcpd.master IN_CLOSE_WRITE /usr/local/sbin/dhcpd.master.incron.sh $@/$#</pre>
<p>Then  /usr/local/sbin/dhcpd.master.incron.sh looks like this:</p>
<pre>#!/bin/bash
if [ $1"x" == "/var/lib/dhcpd/dhcpd.master/dhcpd.masterx" ]
then
    cp $1 /etc/dhcp/
    /etc/init.d/dhcpd restart
fi</pre>
<p>Now as soon as you have modified dhcpd.master on the primary dhcp server, the file will be copied to the secondary server and the secondary dhcp daemon will be restarted immediately. You still have to take care of restarting the primary dhcp daemon yourself. I prefer not to do this automatically at every dhcpd.master modification, because otherwise you will have no dhcpd running at all anymore if there is a syntax error in dhcpd.master.</p>
<p>If you plan to do maintenance on one of the dhcp servers, which will take longer than the MCLT time, it can be interesting to let the other dhcpd know that its partner is down, so that it will immediately will claim the complete DHCP pool. You can also use this when you start up one of the dhcp servers while the other one is down. If you do not do this, dhcpd will refuse to offer new IP addresses until MCLT has passed.</p>
<p>For example, if the secondary server is down, run this on the primary server:</p>
<pre>omshell < < EOF
server localhost
port 7911
key primaryhost "secret"
connect
new failover-state
set name = "dhcp"
open
set local-state = 4
update
EOF
</pre>
<p>Keep in mind this note of <a href="http://barryp.org/blog/entries/dhcp-failover/">Barry Pederson's blog</a> however:</p>
<blockquote><p>
When the downed server comes back up, the two servers automatically start communicating and eventually get themselves back into a normal state. But only after the recovering server has spent mclt time in recover-wait state, where it renews existing leases but won't offer up new ones. So you probably wouldn't want to go into a partner-down state if the other server will be down for less than that amount of time.
</p></blockquote>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://artipc10.vub.ac.be/wordpress/2010/11/28/dhcpd-fail-over/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migrating from Microsoft SQL Server to PostgreSQL</title>
		<link>http://artipc10.vub.ac.be/wordpress/2010/09/14/migrating-from-microsoft-sql-server-to-postgresql/</link>
		<comments>http://artipc10.vub.ac.be/wordpress/2010/09/14/migrating-from-microsoft-sql-server-to-postgresql/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 19:49:45 +0000</pubDate>
		<dc:creator>Frederik</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[DBMS]]></category>
		<category><![CDATA[Microsoft SQL Server]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Wise]]></category>

		<guid isPermaLink="false">http://artipc10.vub.ac.be/wordpress/?p=773</guid>
		<description><![CDATA[One of the servers I manage at work is still running Microsoft Windows 2000. This system is hosting a few old forgotten web sites and it runs Microsoft SQL Server containing a few databases still in use. This server was already there when I started working at the university. Fortunately I never had to do [...]]]></description>
			<content:encoded><![CDATA[<p>One of the servers I manage at work is still running Microsoft Windows 2000. This system is hosting a few old forgotten web sites and it runs Microsoft SQL Server containing a few databases still in use. This server was already there when I started working at the university. Fortunately I never had to do much work on it and there never was a serious crash: it would have been a serious headache for me restoring this system because I do not have much knowledge about Windows and SQL Server.</p>
<p>During some spare time at work I decided taking a look at migrating the MS SQL Server databases to PostgreSQL. And all in all it was not very complicated. Fortunately, the databases itself are not very large and have a rather simple structure. The first thing I did, was recreating the structure of the database in PostgreSQL. With a tool like <a href="http://www.pgadmin.org/">pgAdmin3</a> this is pretty straightforward. An alternative is to export the database structure in SQL format and adapt the resulting file so that it contains valid PostgreSQL table creation statements. The latter method is explained on <a href="http://wiki.postgresql.org/wiki/Microsoft_SQL_Server_to_PostgreSQL_Migration_by_Ian_Harding#Tables">the PostgreSQL wiki</a>. </p>
<p>To migrate the data itself, I wrote a little <a href="/wordpress/wp-content/uploads/mssql2pg.pl">Perl script</a>. Actually I do not have much knowledge about Perl but it is a fairly straightforward language, so this did not prove to be too difficult. I connect to the MS SQL Server database using <a href="http://dbi.perl.org/">DBI</a>, the Perl Database Interface, with the ODBC and <a href="http://www.freetds.org/">FreeTDS</a> drivers. The script gets all records from the tables you define, and inserts them in the PostgreSQL database using the PostgreSQL DBI driver.</p>
<p>These are the required packages on a Debian Squeeze system:
</p>
<pre>libdbd-odbc-perl
libdbd-pg-perl
tdsodbc
unixodbc
tdsodbc</pre>
<p>Define the FreeTDS ODBC driver in /etc/odbcinst.ini:
</p>
<pre>[FreeTDS]
Description	= TDS driver (Sybase/MS SQL)
Driver		= /usr/lib/odbc/libtdsodbc.so
Setup		= /usr/lib/odbc/libtdsS.so
UsageCount	= 2
</pre>
<p>Then define the database in odbc.ini:
</p>
<pre>[database]
Driver = FreeTDS
Trace = No
Server = hostname
Port = 1433
Database = databasename
</pre>
<p>The script assumes that all field names in the PostgreSQL database are using lowercase names and that the MS SQL database is using ISO8859-15 encoding and the PostgreSQL database is using UTF-8 encoding. For every table, I make a migrateTable call with 3 arguments: the table name, an array containing all field names and the name of the primary key field for which you created a sequence (named fieldname_seq).</p>
<p>Once the database itself was migrated, the applications using the database had to be modified to use PostgreSQL. This was not too difficult, because the applications were PHP scripts using ODBC. These additional packages were needed:
</p>
<pre>odbc-postgresql
php5-odbc
</pre>
<p>To configure the PostgreSQL ODBC driver, add this in /etc/odbcinst.ini:</p>
<pre>[PostgreSQL Unicode]
Description	= PostgreSQL ODBC driver (Unicode version)
Driver		= /usr/lib/odbc/psqlodbcw.so
Setup		= /usr/lib/odbc/libodbcpsqlS.so
Debug		= 0
CommLog		= 0
UsageCount	= 0
</pre>
<p>Then define the databse in odbc.ini:
</p>
<pre>[database]
Driver              = PostgreSQL Unicode
ServerName          = localhost
Database            = dbname
Username            = username
sslmode             = require
</pre>
<p>Then be sure not to call <a href="http://php.net/manual/en/function.odbc-connect.php">odbc_connect</a> with the SQL_CUR_USE_ODBC option (which was actually needed with FreeTDS to fix some weird errors), because it causes segfaults.</p>
<p>The result? <a href="http://wise.vub.ac.be/researchers/publications.php">WISE&#8217;s publications pages</a> is now using PostgreSQL as a back-end!</p>
]]></content:encoded>
			<wfw:commentRss>http://artipc10.vub.ac.be/wordpress/2010/09/14/migrating-from-microsoft-sql-server-to-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migrating mail from KMail to Evolution</title>
		<link>http://artipc10.vub.ac.be/wordpress/2010/08/26/migrating-mail-from-kmail-to-evolution/</link>
		<comments>http://artipc10.vub.ac.be/wordpress/2010/08/26/migrating-mail-from-kmail-to-evolution/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 17:33:44 +0000</pubDate>
		<dc:creator>Frederik</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[dovecot]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[Evolution]]></category>
		<category><![CDATA[KMail]]></category>
		<category><![CDATA[maildir]]></category>
		<category><![CDATA[mb2md]]></category>
		<category><![CDATA[mbox]]></category>

		<guid isPermaLink="false">http://artipc10.vub.ac.be/wordpress/?p=763</guid>
		<description><![CDATA[At work I am busy migrating some Linux desktop users from an old Slackware 12.0 system with KDE 3.5 to Debian Squeeze with GNOME 2.30. So I had to migrate the e-mails from KMail to Evolution, a task which was not that trivial as you would hope at first. On these systems, the mails were [...]]]></description>
			<content:encoded><![CDATA[<p>At work I am busy migrating some Linux desktop users from an old Slackware 12.0 system with KDE 3.5 to Debian Squeeze with GNOME 2.30. So I had to migrate the e-mails from KMail to Evolution, a task which was not that trivial as you would hope at first.</p>
<p>On these systems, the mails were saved in ~/Mail. This directory did not contain a standard maildir structure or mbox files, but some weird mix of those two. I do not know whether this is typical for KMail or whether this was a peculiarity on these systems because the e-mails have been migrated from even other e-mail clients and versions in the past already.</p>
<p>The first step was to make a standard maildir out of this structure. I created ~/Maildir and searched for all directories called &#8220;cur&#8221;  in ~/Mail. All parents of these directories are standard maildir folders, so I copied these to ~/Maildir. One of them was called inbox. In maildir, the inbox is just the parent directory and not some folder called inbox. So I moved the cur new and tmp subdirectories of ~/Maildir/inbox to ~/Maildir itself. Then I renamed all other subfolders in ~/Maildir so that they contained a dot before the actual folder name, as this is how subfolders are named in maildir.</p>
<p>Now I was still left with a few mbox mail folders. These are single files which contain a whole mailbox. In order to convert them, I used the <a href="http://packages.debian.org/squeeze/mb2md">mb2md</a> script. I ran <code> mb2md  -s ~/Mail -R ~/Maildir/</code> to convert all remaining mbox folders to the maildir structure.</p>
<p>Then I had a nice maildir structure, but Evolution cannot directly import Maildir folders. However it should be possible to create a local Maildir account in Evolution, pointing to the ~/Maildir directory and then copying over all folders. I did not try this. Instead, I installed the <a href="http://packages.debian.org/squeeze/dovecot-imapd">Dovecot IMAP server</a> and edited /etc/dovecot.conf. I set these options:<br />
<code><br />
protocols = imap<br />
mail_location = maildir:~/Maildir</code></p>
<p>and restarted dovecot. Then I configured an IMAP+ account on localhost in Evolution, and dragged and dropped all IMAP folders to the local folders.</p>
<p>KMail&#8217;s address book is stored in ~/.kde/share/apps/kabc. Double clicking on the most recent vcf file there, should be enough to open and import it in Evolution.</p>
]]></content:encoded>
			<wfw:commentRss>http://artipc10.vub.ac.be/wordpress/2010/08/26/migrating-mail-from-kmail-to-evolution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A wise server migration</title>
		<link>http://artipc10.vub.ac.be/wordpress/2010/08/07/a-wise-server-migration/</link>
		<comments>http://artipc10.vub.ac.be/wordpress/2010/08/07/a-wise-server-migration/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 21:48:34 +0000</pubDate>
		<dc:creator>Frederik</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Dell]]></category>
		<category><![CDATA[Dokuwiki]]></category>
		<category><![CDATA[Joomla]]></category>
		<category><![CDATA[KVM]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[power consumption]]></category>
		<category><![CDATA[Poweredge R410]]></category>
		<category><![CDATA[Squeeze]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[Wise]]></category>

		<guid isPermaLink="false">http://artipc10.vub.ac.be/wordpress/?p=662</guid>
		<description><![CDATA[Yesterday I migrated two servers at work to a new machine. The old machines were pretty underpowered: a Pentium III 1 Ghz system (with 384 MB RAM if I remember correctly) and a Pentium 4 system. The new machine is a Dell Poweredge R410 with a Xeon E5504 processor, 12 GB RAM and a PERC [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I migrated two servers at work to a new machine. The old machines were pretty underpowered: a Pentium III 1 Ghz system (with 384 MB RAM if I remember correctly) and a Pentium 4 system. The new machine is a Dell Poweredge R410 with a Xeon E5504 processor, 12 GB RAM and a PERC H700 RAID controller (which is actually a LSI MegaSAS 9260) with 3 750 GB SATA disks in RAID 5. The hardware is pretty nice (although I am not happy at all with the way Dell treats its customers, so I will rather prefer other vendors in the future, but maybe more about that in a later post).</p>
<p>The old servers were running Debian Lenny, while the new server runs Debian Squeeze, which is frozen since yesterday. That was a nice coincidence. The new server actually hosts three virtual machines using the Linux KVM virtualization system. One of them hosts the website <a href="http://wise.vub.ac.be"> http://wise.vub.ac.be</a>, a second VM hosts a file server, and a third VM is the gateway for a small internal network.</p>
<p>The migration went pretty well, except for the smaller problems which you can always expect with such things, for example a Java web application which had hard-coded host names which had changed. The update to PHP 5.3 caused some compatibility problems which I already fixed before the migration itself: Dokuwiki had to be updated to a recent version in order to not show any warnings. There was also a website based on Joomla 1.0,  which is actually not supported anymore. As updating it to a recent version was not really an option, I found some posts on the web on how to fix the errors I was seeing and cooked up a simple <a href="/wordpress/wp-content/uploads/joomla.patch">patch</a>.</p>
<p>The new server is using 140 Watts most of the time. Keeping in mind that in the future it will also replace a third old server, that will probably be a nice reduction of power consumption compared to the old situation.</p>
]]></content:encoded>
			<wfw:commentRss>http://artipc10.vub.ac.be/wordpress/2010/08/07/a-wise-server-migration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Improving battery life time in Linux</title>
		<link>http://artipc10.vub.ac.be/wordpress/2010/05/05/improving-battery-life-time-in-linux/</link>
		<comments>http://artipc10.vub.ac.be/wordpress/2010/05/05/improving-battery-life-time-in-linux/#comments</comments>
		<pubDate>Wed, 05 May 2010 19:38:06 +0000</pubDate>
		<dc:creator>Frederik</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mandriva]]></category>
		<category><![CDATA[battery]]></category>
		<category><![CDATA[Dell Latitude E6400]]></category>
		<category><![CDATA[laptop]]></category>
		<category><![CDATA[power consumption]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://artipc10.vub.ac.be/wordpress/?p=557</guid>
		<description><![CDATA[Today I received a new battery for my Dell Latitude E6400 laptop. The old battery (a 6 cell one) only lasted for about 15 minutes any more, 1,5 year after I acquired this system. The new battery is a 9 cell version. gnome-power-manager estimates I should be able to run 6 hours now without a [...]]]></description>
			<content:encoded><![CDATA[<p>Today I received a new battery for my Dell Latitude E6400 laptop. The old battery (a 6 cell one) only lasted for about 15 minutes any more, 1,5 year after I acquired this system. The new battery is a 9 cell version. gnome-power-manager estimates I should be able to run 6 hours now without a charge, which corresponds with what I expected.</p>
<p>Now that I have a new battery, it is time to take a look again at trying to lower power consumption as much as possible. On my system I am using Mandriva 2010.1 Cooker with GNOME 2.30 and laptop-mode-tools 1.54, but this howto should apply (sometimes with slight modifications) to other distributions too.</p>
<p><span id="more-557"></span></p>
<h1>Setting up ondemand cpufreq governor</h1>
<p>The first thing to check is whether CPU frequency scaling is enabled. This should be supported on most up to date CPUs, including Intel Pentium M and Intel Core series and all AMD Athlon 64 and Turion CPUs.</p>
<p>Install the cpufrequtils package:<br />
<code><br />
# urpmi cpufrequtils<br />
</code>
</p>
<p>Now run the cpufreq-info command to see the current cpufreq settings of your processors. It should show the different clock frequencies supported by your processors and which cpufreq governor and which frequency is currently active. Even when not running on battery power, the &#8220;ondemand&#8221; cpufreq governor should be used so that it will use the lowest frequency when your system is mostly idle and will switch to the fastest frequency when your system gets loaded. To configure the ondemand governor by default, you can install the cpufreq package with urpmi. It will load the governor set in /etc/sysconfig/cpufreq at boot up, which is ondemand by default.</p>
<p>If cpufreq-info complains that no cpufreq driver is loaded, you can try to run<br />
<code><br />
# modprobe acpi-cpufreq<br />
</code><br />
if you have an Intel CPU or<br />
<code><br />
# modprobe powernow-k8<br />
</code><br />
if you have an AMD CPU and retry. These are the most widely used cpufreq drivers. If one of these is successful and it was not loaded automatically, you can add the right driver name to the /etc/modprobe.preload file so that it gets loaded automatically at the next boot.</p>
<h1>Setting up gnome-power-manager</h1>
<p>In GNOME open the menu System and then choose Preferences &#8211; Power Management.</p>
<p>You can already set up some power savings measures in the AC Power tab. Personally I have it set to go to sleep after 1 hour, to blank the screen when the laptop lid is closed and to put the display to sleep after 5 minutes of inactivity. I have set the display brightness to 100% and disabled dimming on idle.</p>
<p>In the Battery Power tab I have configured to go to sleep when inactive for 10 minutes and to blank the screen when the lid is closed. When battery power is critically low I let it hibernate (so that no data is lost when the battery runs out completely) and I let the hard drives spin down. The display goes to sleep after 1 minute of activity and the display is dimmed when idle.</p>
<p>If you have root access on your laptop, I recommend clicking on the Make Default button, so that it will use these settings for all users and also when you are not logged in yet.</p>
<p>Now there are some more advanced settings which are not shown in gnome-power-manager&#8217;s preferences utility. Start up gconf-editor (System &#8211; Preferences &#8211; Configuration Editor) and navigate to /apps/gnome-power-manager in the tree of the left side. Under that folder you will find the subfolder backlight. Select it to see more detailed settings at the right side. There I have set the brightness_dim_battery key to 80 for a still lower brightness when running on battery power. You will see the effects of changing the value immediately when you are running on battery, so you can try out different values to find what suites you best. The idle_brightness key (the brightness to be used when idle) is set to 20  and idle_dim_time (amount of seconds after which the screen backlight will be dimmed) to 15.</p>
<h1>laptop-mode-tools</h1>
<p>Make sure you have the laptop-mode-tools package installed. This tool will automatically implement all kinds of power saving settings when you system switches to battery power.</p>
<p>Open the file /etc/laptop-mode/laptop-mode.conf in a text editor as root. Only a few settings need to be tweaked.</p>
<p>To enable most power saving modules, set<br />
<code><br />
ENABLE_AUTO_MODULES=1<br />
</code>
</p>
<p>When running on battery power, it is recommended to make sure all file systems are mounted with the noatime option, in order not to cause any writes every time a file is read. Set<br />
<code><br />
CONTROL_NOATIME=1<br />
USE_RELATIME=0<br />
</code>
</p>
<p>
Laptop-mode-tools also controls the hard disk idle timeout. I set it to the same values as gnome-power-manager so that they will not override each other:<br />
<code><br />
CONTROL_HD_IDLE_TIMEOUT=1<br />
LM_AC_HD_IDLE_TIMEOUT_SECONDS=60<br />
LM_BATT_HD_IDLE_TIMEOUT_SECONDS=60<br />
NOLM_HD_IDLE_TIMEOUT_SECONDS=7200<br />
</code>
</p>
<p>The various laptop-mode-tools are configured in the files in /etc/laptop-mode-tools/conf.d. Again the defaults are pretty nice. I made these changes:</p>
<ul>
<li>I do not use Bluetooth very often and when I use it, I am always on AC power. So to save battery time I ldisable Bluetooth when running on battery power. In /etc/laptop-mode-tools/conf.d/bluetooth.conf, set<br />
<code><br />
CONTROL_BLUETOOTH=1<br />
BATT_ENABLE_BLUETOOTH=0<br />
AC_ENABLE_BLUETOOTH=1<br />
BLUETOOTH_INTERFACES="hci0"<br />
</code>
</li>
<li>Thanks to the cpufreq package, we already set up the ondemand cpufreq governor. However when running on battery it is even better to run the conservative governor: instead of going to full speed when the machine gets loaded, the conservative governor will more gradually switch to the frequencies between the minimum and maximum frequencies. In /etc/laptop-mode-tools/conf.d/cpufreq.conf set<br />
<code><br />
BATT_CPU_GOVERNOR=conservative<br />
</code>
</li>
<li>In the file /etc/laptop-mode-tools/hal-polling.conf, HAL polling is disabled by default when running on battery. If you do not want this (it might prevent automounting of CD and DVD media when running on battery power, set<br />
<code><br />
CONTROL_HAL_POLLING=0<br />
</code><br />
However, if you want to enable this, check that your CD/DVD drive is mentioned the polling devices configured in that file. By default it will disable polling on all /dev/scd? devices but on my system the DVD drive is called /dev/sr0, so I modified it to /dev/sr?. Unfortunately, laptop-module-tools does not yet support udisks-daemon, a replacement for HAL which also polls the CD/DVD drive.
</li>
</ul>
<p>Laptop-mode-tools can also disable certain services when running on battery power. This is interesting for scheduling daemons like crond and atd.<br />
<code><br />
cd /etc/laptop-mode/batt-stop<br />
ln -s /etc/init.d/atd .<br />
ln -s /etc/init.d/crond .<br />
</code></p>
<p>After changing the laptop-mode-tools configuration, restart the service:<br />
<code><br />
# /etc/init.d/laptop-mode-tools restart<br />
</code></p>
<h1>Enabling caching in rsyslog</h1>
</p>
<p>In order to prevent too much disk wake-ups because of logging it is recommended to enable caching for all log files in rsyslog. Edit /etc/syslog.conf and make sure there is a &#8211; before every /var/log file name. Then restart rsyslog:<br />
<code><br />
# /etc/init.d/rsyslog restart<br />
</code></p>
<h1>Run powertop to identify applications causing too many wake-ups</h1>
</p>
<p>Install the powertop package and run powertop as root. After it has collected enough data it will show the processes causing the most CPU wake-ups. Stop any unneeded applications causing lots of wake-ups. Powertop will also give you power saving recommendations but you can actually ignore them: if you have set up laptop-mode-tools as explained above, all of them are implemented already.</p>
<h1>Disable WiFi if you do not use it</h1>
<p>And last but not least: switch off your wireless network card with the wifi kill switch on your laptop if you do not use it. This simple trick can easily give you more than 10% more battery life time. You can also disable it when you temporarily do not need the network connection, for example while reading long web pages or while writing e-mails.</p>
<p>With all these measures in place and with a bit of conservative wifi usage, it seems my battery will last more than 7 hours. That is a nice improvement!</p>
]]></content:encoded>
			<wfw:commentRss>http://artipc10.vub.ac.be/wordpress/2010/05/05/improving-battery-life-time-in-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Server migration</title>
		<link>http://artipc10.vub.ac.be/wordpress/2009/07/01/server-migration/</link>
		<comments>http://artipc10.vub.ac.be/wordpress/2009/07/01/server-migration/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 21:34:58 +0000</pubDate>
		<dc:creator>Frederik</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[KVM]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[virtualization]]></category>

		<guid isPermaLink="false">http://artipc10.vub.ac.be/wordpress/?p=221</guid>
		<description><![CDATA[Since two days, I have merged the main servers used by two research laboratories at work. One server was an old Linux server which really needed a hardware upgrade, and the other one was a Mac Pro machine running a flaky OS X Leopard. The new server is of course running Linux: Debian Lenny. It [...]]]></description>
			<content:encoded><![CDATA[<p>Since two days, I have merged the main servers used by two research laboratories at work. One server was an old Linux server which really needed a hardware upgrade, and the other one was a Mac Pro machine running a flaky OS X Leopard. The new server is of course running Linux: Debian Lenny.</p>
<p>It was a very interesting experience: working out procedures to migrate the mailboxes (from Dovecot on the Linux server and Cyrus on the Mac server to Cyrus on the new server), finding out how to set up one NIC in two different subnets (especially the routing is a little bit tricky), getting all services hooked up to LDAP and managed by <a href="https://oss.gonicus.de/labs/gosa/">GOSA</a>, getting dhcpd to do exactly what we want in a shared-network set up, and much more.</p>
<p>The new server is a <a href="http://h10010.www1.hp.com/wwpc/us/en/sm/WF05a/15351-15351-3328412-241644-3328421-3579900.html">HP DL185 G5</a> with an AMD Opteron quad core CPU and 8 GB of RAM and hosts two KVM virtual machines, one for public services and another one running internal services. You can visit the two websites, which are also hosted on this machine of course, of the concerned research labs:</p>
<ul>
<li><a href="http://arti.vub.ac.be">Artificial Intelligence Laboratory</a></li>
<li><a href="http://como.vub.ac.be">Computational Modeling Lab</a></li>
</ul>
<p>Maybe in the not too far away future, I should try to move the services hosted on the underpowered desktop machine running this website, also to a virtual machine&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://artipc10.vub.ac.be/wordpress/2009/07/01/server-migration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Updating to Debian Lenny</title>
		<link>http://artipc10.vub.ac.be/wordpress/2009/02/16/updating-to-debian-lenny/</link>
		<comments>http://artipc10.vub.ac.be/wordpress/2009/02/16/updating-to-debian-lenny/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 22:06:33 +0000</pubDate>
		<dc:creator>Frederik</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[LDAP]]></category>

		<guid isPermaLink="false">http://artipc10.vub.ac.be/wordpress/?p=142</guid>
		<description><![CDATA[Last week-end, Debian Lenny 5.0 was finally released. I use Debian on most servers I manage at work. A few of them were already using Lenny when it was still the testing branch, but most are still on Debian Etch. So this morning I decided to test upgrade one of the less critical Etch systems [...]]]></description>
			<content:encoded><![CDATA[<p>Last week-end, Debian Lenny 5.0 was finally released. I use Debian on most servers I manage at work. A few of them were already using Lenny when it was still the testing branch, but most are still on Debian Etch. So this morning I decided to test upgrade one of the less critical Etch systems to Lenny. That system is only used to store back-up files from other systems, so it would not be a problem if that machine was off line for a couple of hours.<br />
According to the <a href="http://www.debian.org/releases/lenny/i386/release-notes/ch-upgrading.en.html">release notes</a>, you should rather use aptitude instead of apt to upgrade, so that&#8217;s what I did. All went well, until suddenly the package upgrade hung while installing new udev configuration files. I could Ctrl-C the process to continue, but from that moment on, more and more post installation scripts started hanging and had to be interrupted.</p>
<p>I noticed that also simple commands, such as ps and getent passwd were hanging too and that I could not log in via SSH anymore. Fortunately, the existing SSH connections continued to work, so I was not locked out yet.</p>
<p>I straced getent passwd and noticed that it hung while trying to connect to the remote LDAP server. The problem was apparently that Lenny&#8217;s libnns_ldap tried to connect via LDAPS to port 389, while LDAPS uses port 636 by default. It seems that you need to specify the port number 636 now to make LDAPS work right, so for example: ldaps://remote.host:636. I fixed this in libnss-ldap.conf and pam_ldap.conf, and then I could finish the upgrade without any problem. Apparently this is a <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=462366">known problem</a>.</p>
<p>So definitely modify your configuration first if you are using LDAP authentication and want to upgrade to Lenny. I should probably also fix my nsswitch.conf so that applications don&#8217;t start to hang if the LDAP server is unreachable&#8230;</p>
<p>In spite of this problem, the whole upgrade was done in less than 1 hour. Without that problem, I guess it would have taken about 20 minutes less. Quite impressive!</p>
]]></content:encoded>
			<wfw:commentRss>http://artipc10.vub.ac.be/wordpress/2009/02/16/updating-to-debian-lenny/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

