Roundcube: sending mail broken with PHP 5.6 - STARTTLS failed

After upgrading to Debian Jessie I found that my Roundcube instance wouldn't send mail anymore. This is what I found in the error log of Roundcube:

[02-May-2015 17:03:05 +0200]: <frkdinel> SMTP Error: Authentication failure: STARTTLS failed (Code: ) in /usr/share/nginx/www/roundcube/program/lib/Roundcube/rcube.php on line 1714

And the SMTP log looked as follows:

[02-May-2015 17:03:05 +0200]: <frkdinel> Recv: 220 mail.example.org ESMTP
[02-May-2015 17:03:05 +0200]: <frkdinel> Send: EHLO example.org
[02-May-2015 17:03:05 +0200]: <frkdinel> Recv: 250-mail.example.org
[02-May-2015 17:03:05 +0200]: <frkdinel> Recv: 250-PIPELINING
[02-May-2015 17:03:05 +0200]: <frkdinel> Recv: 250-SIZE 26214400
[02-May-2015 17:03:05 +0200]: <frkdinel> Recv: 250-VRFY
[02-May-2015 17:03:05 +0200]: <frkdinel> Recv: 250-ETRN
[02-May-2015 17:03:05 +0200]: <frkdinel> Recv: 250-STARTTLS
[02-May-2015 17:03:05 +0200]: <frkdinel> Recv: 250-ENHANCEDSTATUSCODES
[02-May-2015 17:03:05 +0200]: <frkdinel> Recv: 250-8BITMIME
[02-May-2015 17:03:05 +0200]: <frkdinel> Recv: 250 DSN
[02-May-2015 17:03:05 +0200]: <frkdinel> Send: STARTTLS
[02-May-2015 17:03:05 +0200]: <frkdinel> Recv: 220 2.0.0 Ready to start TLS
[02-May-2015 17:03:05 +0200]: <frkdinel> Send: RSET
[02-May-2015 17:03:05 +0200]: <frkdinel> Send: QUIT

With the following configuration:

$config['smtp_server'] = 'tls://localhost';
$config['smtp_port'] = 587;
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';

After two hours I learned that PHP 5.6 does SSL peer verification, meaning that it checks the certificate of the SMTP server whether its a known CA. This used to work before, coming from Debian Wheezy using an older PHP version that didn't do this. On the internet I read about bugs in the Net-SMTP package, and found several workarounds about keeping the smtp_user option blank, or disable peer verification altogether. None of this is necessary, it's actually quite simple:

The smtp_server option must match the certificate's CN field! (Common Name)

So don't put localhost in there, put the full qualified domain name in there that matches your certificate.

Posted
Debian Jessie upgrade: fix spamassassin under systemd

Since a little while I host my own email, using the excellent tutorial on Ars Technica. I successfully completed the setup on a Debian Wheezy and have been using it quite happily for a few months. Until I upgraded to Debian Jessie which was released a few days ago. Most of the software got upgraded OK, except spamassassin was a bit more problematic. When starting this service, I would find the following messages in the logs:

Apr 29 19:38:10 example.org spamd[9039]: util: refusing to untaint suspicious path: "/${SAGLOBALCFGPATH}"
Apr 29 19:38:10 example.org spamd[9039]: util: refusing to untaint suspicious path: "/${SAHOME}"
Apr 29 19:38:10 example.org spamd[9039]: logger: removing stderr method
Apr 29 19:38:12 example.org spamd[9042]: Timeout::_run: check: no loaded plugin implements 'check_main': cannot scan!
Apr 29 19:38:12 example.org spamd[9042]: Check the necessary '.pre' files are in the config directory.
Apr 29 19:38:12 example.org spamd[9039]: child process [9042] exited or timed out without signaling production of a PID file: exit 255 at /usr/sbin/spamd line 2960.
Apr 29 19:38:12 example.org spamd[9039]: child process [9042] exited or timed out without signaling production of a PID file: exit 255 at /usr/sbin/spamd line 2960.
Apr 29 19:38:12 example.org systemd[1]: spamassassin.service: control process exited, code=exited status=255
Apr 29 19:38:12 example.org systemd[1]: Failed to start Perl-based spam filter using text analysis.
Apr 29 19:38:12 example.org systemd[1]: Unit spamassassin.service entered failed state.

The cause is to be found in the file /etc/default/spamassassin/, which was modified as described on this page of the tutorial. As you can see, it defines the environment variables $SAHOME and $SAGLOBALCFGPATH, which are used in the OPTIONS variable.

However, with the upgrade to Jessie, which defaults to systemd, these variables in OPTIONS are no longer expanded. systemd passes the value of OPTIONS verbatim to spamd (leaving ${SAHOME} and {SAGLOBALCFGPATH} intact), which spamd finds suspicious (and it should be!). The result is that the configuration is not read, causing the numerous errors in the logs. The setup with the variables worked before with the old init system, which was just part of a shell script and would properly evaluate the variables before passing it down to spamd.

Solution: substitute the variables in the OPTIONS line with their value. Shouldn't be a big deal since each variable occurs only once, and it's unlikely that these values should be changed anyway.

Posted
Toch YNAB gaan gebruiken

Een tijdje geleden maakte ik een vergelijking tussen GnuCash en YNAB. Voor de gewone sterveling raadde ik YNAB aan, maar dat ik zelf toch GnuCash was gaan gebruiken. En dat heb ik ook twee maanden gedaan. Maar nu ben ik uiteindelijk toch om naar YNAB, ondanks de nadelen die daaraan kleven (closed source en vrij prijzig met $60).

De voordelen van GnuCash staan nog steeds als een huis, maar er was één dealbreaker en dat was de magere support voor budgetteren. Zoals ik in m'n voorgaande artikel schreef, de budget-functionaliteit lijkt er los opgeschroefd te zijn. Het dialoog was onhandig in het gebruik en het was lastig te zien welke accounts nou binnen of buiten het budget vielen, en al helemaal als je onderweg bent. Al met al was het veel werk om de eerste regel van YNAB te hanteren: give every dollar a job. Inmiddels zat ik al in een mindset om Scheme en Guile te leren zodat ik de rapportages kon verbeteren, of zelfs een eigen open source YNAB-achtig programma te maken, gevoed door de uitgaven die in GnuCash zijn geregistreerd. Maar wacht eens even, in plaats van hier vele en vele uren in te steken kan ik ook gewoon nu klaar zijn en met $60 dollar over de brug komen. Bij mij wint pragmatisme het uiteindelijk van idealisme.

Een aantal verschillen tussen GnuCash en YNAB qua budget-functionaliteit:

  • Het budgetscherm van GnuCash laat niet zien wat je die periode hebt uitgegeven, daarvoor moet je een apart rapport uitdraaien.
  • Geld dat teveel is gebudgetteerd gaat niet automatisch over naar de volgende maand.
  • Een budget in GnuCash beslaat een vaste periode, startend bij een bepaalde maand (of jaar). Deze vastigheid heeft een aantal consequenties. Ten eerste zie je in december nog steeds het budget voor de maand januari van datzelfde jaar, iets dat dan nog amper relevant is. Ten tweede moet je voor ieder nieuw jaar een nieuw budget maken.

    Het is mogelijk om de startdatum te wijzigen van een budgetperiode, maar dit geeft het onverwachte resultaat dat de budgetwaarden van de maanden niet meegaan. Dus als voorheen de eerste kolom de budgetwaarden voor januari bevatten, dan zal na het wijzigen van de startdatum de eerste kolom nog exact dezelfde waarden bevatten, alleen staat er een andere maand boven.

  • Je kan de eerste YNAB-regel (give every dollar a job) wel toepassen, maar het is hand- en rekenwerk omdat niets automatisch voor je uitgerekend wordt.
  • Het afschatten van een budget voor een bepaald account is niet transparant en wordt overigens voor de hele budgetperiode toegepast in plaats van op een enkele maand.

Al deze nadelen begonnen uiteindelijk toch op te breken. YNAB kost dan wel wat geld, maar uiteindelijk gaat me dit toch een hoop tijd en irritatie schelen.

ikiwiki: Create new pages with the 404 plugin and nginx

On a private ikiwiki instance I'd like to be able to create pages from the web interface. The canonical way to do so is to create a link, follow it such that you get the edit screen for the new page. But in this particular case, the pages I wanted to create are only accessible through inline or map directives. In that case, creating a page can be done through a Git checkout or by adding a temporary link pointing to the new page. Both approaches are a bit clumsy.

For this, the 404 plugin was written, but it only works for Apache, while I'm hosting my instance with nginx.

Luckily, I found an excellent comment on this page that gives a working solution, which is the following nginx configuration:

location /ikiwiki {
          location ~ /ikiwiki.cgi {
                  fastcgi_pass unix:/var/run/fcgiwrap.socket;
                  include fastcgi_params;
          }

          error_page 404 @ikiwiki404;
}

location @ikiwiki404 {
          fastcgi_pass  unix:/var/run/fcgiwrap.socket;
          fastcgi_index ikiwiki.cgi;
          fastcgi_param SCRIPT_FILENAME   /usr/share/nginx/www/ikiwiki/ikiwiki.cgi;
          fastcgi_param DOCUMENT_ROOT      /usr/share/nginx/www/ikiwiki/;

          fastcgi_param QUERY_STRING "";
          fastcgi_param REQUEST_METHOD "get";
          fastcgi_param REDIRECT_STATUS 404;
          fastcgi_param REDIRECT_URL $uri;

          include fastcgi_params;
}

And don't forget to add the 404 plugin to your setup file:

add_plugins:
- 404
Boekarest maart 2015

Afgelopen weekend wederom naar Boekarest in Roemenië afgereisd. Geen uitgebreid reisverslag, maar simpelweg een lijst van plaatsen die ik bezocht heb.

Zaterdag

  • IKEA, grappig om al die enkele Zweedse woorden tegen te komen tussen al dat Roemeens.

Zondag


View Larger Map

  • Acuarela - Relaxt cafeetje voor een kop thee op een gezellige bovenverdieping. Adres: Strada Polonă 40.
  • AFI Palace Cotroceni. Grootste mall van Boekarest.

Maandag

  • Eetcafe Simbio. Bovenverdieping is aangenaam, benedenverdieping (rookgedeelte) minder gezellig. Eten was best goed. Adres: Strada Negustori 26.

  • Mislukte poging om het Nationaal Historisch museum te bezoeken, was gesloten.

  • Parcul Circului


View Larger Map

  • Wijnbar Corks. Adres: Strada Băcani.
  • Brown Pub. Adres: Strada Covaci.
  • Ierse pub St. Patrick. Adres: Strada Smărdan.


View Larger Map

GnuCash: multiple currencies in split transaction

When you withdraw money from an ATM in a foreign currency, the amount that is withdrawn is the result of the applicable exchange rate plus a transaction fee. This calls for a split transaction, but it's not really trivial how to do that in GnuCash.

Suppose we have these accounts:

  • Assets
    • Bank (EUR)
    • Cash (USD)
  • Expenses
    • Fees (EUR)

And we withdraw $100 from an ATM in the United States from a Euro bank account. Suppose the exchange rate is $1 = €0.942935 and the transaction fee is €1. From our bank account, €95.29 will be withdrawn. Recording this as a single (split) transaction can be done in two steps.

First, create a transaction without the fee incorporated. Open the ledger of your bank account, press the Transfer button in the toolbar and set the From account to Bank and the To account to Cash. The Amount at the top of the dialog is €94,29. The To Amount value - at the bottom of the dialog - is 100. The appropriate exchange rate should be auto-filled. Press OK to add this transaction.

At this point we can split this transaction by selecting it followed by clicking the Split button. Modify the Bank withdrawal and set it to €95.29. This will create an unbalance of €1,-, which we now can post to the Fees account. Press Enter and now we have a split transaction with multiple currencies.

Using GnuCash for Android together with the desktop

Since some time, GnuCash has a companion app (Google Play), which doesn't offer all the features and flexibility that we know from the desktop variant. It can read your GnuCash XML file (compressed), from which it imports the accounts and transactions inside.

I use the app only for entering transactions I make during the week, for example when spending cash on groceries. About once a week I export these transactions and import them into my main GnuCash file on the desktop. Then I wipe the transactions from my phone and start over again. This is my setup:

  1. Install the GnuCash app on your Android device.
  2. In the GnuCash app, go to Settings, General.
  3. Set the Default Export Format to QIF, which allows you to enter double entry transactions (the OFX format doesn't support this).
  4. Check the option Delete exported transactions.
  5. Make sure that Export all transactions is unchecked.
  6. Copy your GnuCash file to your Android device.
  7. Go to Settings, Accounts and choose Import GnuCash accounts. Locate the file you just copied, and you see that the app is populated with your accounts and transactions. Afterwards, remove the GnuCash file from your device.
  8. Then, remove the transactions by going to Settings, Transactions, Delete all transactions. We do this for two reasons: first, we want to create a delta on top of the main GnuCash file on the desktop. Second, I'm not comfortable with the idea that all transaction data is on my mobile device. The app can be configured to create a pin lock, but that's not really bullet proof. The disadvantage of deleting transactions is that you don't see the actual balance of your accounts.
  9. All accounts should show a balance of 0. We can make transactions, and you can collect a bunch of them during the week.
  10. It's time to export our transactions. From the menu choose Export transactions.... Choose the export method (sharing or storing on SD), make sure the QIF format is selected, and Delete after export is checked.
  11. Transfer the QIF file to your PC and in GnuCash choose File, Import, Import QIF.... The wizard should be straight-forward: all the account names should match exactly (unless you changed account names or their structure in the meantime).
  12. Done. Your transactions of the past week have been imported and the mobile app is ready to collect a new bunch of transactions.

As step 11 indicated, it's possible that you change account names or the account structure. This will raise minor issues during the import process, although it should be doable to fix. You might want to repeat steps 6, 7 and 8 with your current GnuCash file, after deleting all accounts from the mobile app first (Settings, Accounts, Delete all accounts). Make sure that all your transactions have been exported before you do this, otherwise you'll lose data.

For transferring your GnuCash file or the transaction exports, use whatever solution you like to transfer files from your PC to your mobile device. Personally I use Total Commander with the WebDAV plugin, which allows me to export directly to a WebDAV share.

GnuCash vs YNAB

Lang geleden, toen ik nog in het derde jaar van de middelbare school zat, wees een beroepskeuzetest uit dat accountant wel iets voor me zou zijn. Al lachend wuifde ik dat advies weg, wie wil er nou accountant worden? Dat is toch voortdurend gortdroge getallen door een molen halen, op een grijs kantoor met even grijze mensen? Bovendien, ik had toen al het idee dat ik iets met software wilde gaan doen. Want uiteraard is dat veel minder droge kost, nietwaar?

Maar achteraf gezien had deze beroepskeuzetest misschien toch wel gelijk. Want zoals ik mijn eigen financiën beheer heeft toch wel trekjes van accountancy.

Jarenlang heb ik m'n financiën in een spreadsheet beheerd, waaraan ik vele uren gesleuteld heb om het zo te krijgen zoals het er vandaag uit ziet. Gaandeweg ontwikkelde ik mijn eigen methode om met geld om te gaan. Deze methode had grofweg drie elementen:

  • Vaste lasten - Terugkerende zaken die betaald moeten worden, zoals de huur, zorgverzekering of energierekening;
  • Doelen - Financiële doelen met een redelijk korte termijn (allemaal vaak binnen een jaar). Door uit te rekenen hoeveel ik per maand opzij moest zetten haalde ik m'n doelen altijd op tijd;
  • Vrij te besteden geld - Geld voor dingen die ik wil. Dit is grofweg het bedrag dat overblijft door m'n vaste lasten en m'n doelen af te trekken van m'n inkomen.

Door gedisciplineerd aan m'n vaste lasten en doelen te houden kon ik hiermee heel goed anticiperen op de toekomst. Maar inzicht in het verleden was wat lastig, en ik merkte dat ik veel tijd was om de boel in balans te houden. Bovendien leende m'n spreadsheet zich minder voor verdere aanpassingen. Het begon eens tijd te worden om naar wat alternatieven te kijken. Hiervoor heb ik twee alternatieven bekeken: GnuCash en You Need A Budget (YNAB).

GnuCash

Ik kan me herinneren eerder heel kort naar GnuCash gekeken te hebben, maar ben toen hard weggerend omdat het er toch wel intimiderend uitzag. Dat is inmiddels wel enkele jaren geleden. Vandaag lijkt het beter aan te sluiten aan m'n behoeften.

Voordelen

  • Het is vrije open source software (gelicenseerd onder de GPL);
  • Het is gratis in gebruik;
  • Het is gebouwd rondom de principes van accounting;
  • Het is redelijk flexibel en uitgebreid. Budgetten, automatisch terugkerende betalingen, rapportages en een flexibel account-model om het naar je eigen situatie in te richten;
  • Geen cloud-functionaliteit (ja, dat is een voordeel). Alles wordt opgeslagen in een lokaal bestand, hoewel je er ook voor kan kiezen om het in een database op te slaan, zoals PostgreSQL;
  • Draait op Linux, Windows en Mac OS X;
  • Goede documentatie, die je op weg helpt zonder dat je veel kaas gegeten hebt van accounting.

Nadelen

  • GnuCash heeft een steile leercurve. Het kost wat uurtjes uitzoekwerk om er mee aan de slag te kunnen, zeker als je niet helemaal bekend bent met accounting;
  • Budgetten voelen aan alsof het een los aanhangsel is en doen niet precies wat ik wil. Zo wil ik een jaarbudget voor bepaalde accounts hanteren, terwijl ik voor de overige accounts een maandbudget wil handhaven. Dat is lastig of niet te realiseren;
  • Op sommige vlakken iets té uitgebreid. Zo is de MKB-functionaliteit irrelevant voor m'n persoonlijke financiën, en dat valt niet uit te zetten in de user interface;
  • Het is geschreven in C gebruik makend van de GTK-toolkit. GTK vind ik geen fijne toolkit in het gebruik of om mee te ontwikkelen, er zijn altijd issues mee. Zo is de performance van de GUI soms ver te zoeken (in de Windows-build). Ik heb ook het idee dat dit de ontwikkeling van GnuCash in de weg zit. Er wordt wel aan gewerkt, maar het staat op een laag pitje.

Android-client

GnuCash heeft sinds een poosje ook een Android-client. Dit is geen volwaardige client, het kan ook niet synchroniseren met de desktop-variant. Het kan wel je desktop-bestand inlezen, maar niet daar naar wegschrijven om het vervolgens weer met je desktop in te lezen. Dit inlezen is alleen nodig om alle accounts die je op de desktop hebt ook op je mobiel te krijgen, zodat je daar de boekingen naar de juiste accounts kan doen.

Waar de Android-client wel goed voor is om uitgaven meteen op te schrijven. Deze uitgaven kan je vervolgens exporteren als QIF- of OFX-bestand die je vervolgens op de desktop in kan lezen. Dus het is goed om delta's bij te houden. Na het exporteren kunnen alle transacties weer weggegooid worden (in de opties) en kan een nieuwe delta gemaakt worden. Ik zal dit in een latere post wat verder toelichten.

YNAB (You Need A Budget)

YNAB is een veelvoorkomende naam wanneer je je een beetje verdiept in persoonlijke financiën. Het berust op vier principes:

  1. Geef iedere dollar (of euro) een taak;
  2. Spaar voor slechtere dagen;
  3. Wees flexibel wanneer dingen niet zo gaan zoals je gepland hebt;
  4. Leef van het inkomen van afgelopen maand.

De software is gebouwd rondom deze principes, en het draait helemaal om invulling te geven aan je inkomsten.

Voordelen

  • De principes van YNAB sluiten nauw aan op m'n eigen principes die ik onafhankelijk door de jaren heen zelf ontwikkeld en ontdekt heb;
  • Er wordt onderscheid gemaakt tussen je bankrekeningen en je budget. Het maakt niet uit waar je geld staat, als iedere euro op je rekening(en) maar ergens aan is toegewezen;
  • Prettige en makkelijk te gebruiken interface;
  • Android- en iPhone-apps beschikbaar.

Nadelen

  • Prijzig, $60 (na een gratis trial van 34 dagen). Minor upgrades zijn daarna gratis, major upgrades moeten (tegen korting) opnieuw aangeschaft worden. Voor de mobiele applicaties wordt nog een kleine meerprijs gevraagd;
  • Closed source;
  • Cloud-sync alleen mogelijk via DropBox (maar het is wel mogelijk om op een lokaal netwerk te synchroniseren);
  • Geen directe mogelijkheid om bijvoorbeeld investeringen of leningen bij te houden;
  • Draait niet native op Linux;
  • Meerdere valutas binnen een budgetbestand wordt niet ondersteund.

M'n aanvankelijke angst dat YNAB erg gericht zou zijn op een Amerikaans huishouden lijkt ongegrond, het programma is ook gemakkelijk te gebruiken voor huishoudens in andere landen. De budgetten kunnen vrij eenvoudig naar eigen wens ingericht worden zodat ze op je aansluiten op je eigen situatie.

Conclusie

Het zijn twee programma's waarmee je je persoonlijke financiën mee bij kunt houden, maar ze hebben wel een hele andere insteek.

GnuCash is meer een accounting-programma met een steile leercurve, maar wel flexibel in alle soorten van vermogen die je maar kan hebben. YNAB is vele malen gebruiksvriendelijker, maar ietwat beperkt in functionaliteit. Een ander onderscheidend punt is dat GnuCash meer gericht is op het verleden en het heden en niet zozeer op de toekomst, terwijl YNAB zich juist wel op de toekomst richt. Budgetteren is een fluitje van een cent met YNAB, met GnuCash heb ik toch het net-niet gevoel (wat budgetten betreft).

Ik zou voor de meeste gebruikers dan ook YNAB aanraden, ondanks de tekortkomingen die ik hiervoor noemde. Maar het is niet mijn persoonlijke keuze, zelf ben ik voor GnuCash gegaan. Niet alleen om principiële redenen, maar ook omdat het net iets meer flexibiliteit biedt dan YNAB. Het zou geen kwaad kunnen om je eerst een beetje te verdiepen in accounting als je hiermee aan de slag wilt gaan, hoewel de GnuCash-documentatie wel van zodanige kwaliteit is om je hiermee op weg te helpen.

Update 4 april 2015: ik ben toch YNAB gaan gebruiken.

Berlijn 2015

Berlijn heb ik altijd een bijzondere stad gevonden. Sinds m'n eerste bezoek in 2009, dat slechts enkele dagen duurde, heb ik altijd weer terug willen gaan. Ik kan niet goed uitleggen waarom, maar wat vaststaat is dat Berlijn heel significante rol gespeeld heeft in de Europese geschiedenis. Vandaag de dag zijn nog steeds de littekens van de Tweede Wereldoorlog te zien en de opslitsing van Duitsland iets later in de 20e eeuw.

Na zes jaar was er weer een goede gelegenheid om naar Berlijn te gaan, om daar S. weer te ontmoeten met wie ik vorig jaar een hele mooie reis in China heb gemaakt.

Dag 1

Vroeg opgestaan om rond 7:00 uur 's ochtends de trein naar Schiphol te pakken. Ik had een slechte ochtend: een klein ongelukje thuis en gedoe bij de beveiligingscontrole op Schiphol door een paar kaarsen die ik in m'n rugzak had.

KLM had een (voor mij) nieuw systeem voor het boarden, waarbij je een nummertje moet trekken zodat mensen op volgorde het vliegtuig binnen kunnen gaan. Typisch Nederlands, maar op zich prettig: je kan immers langer op je stoel blijven zitten en wachten totdat je aan de beurt bent. Helaas was het niet feilloos, het lijkt geen rekening te houden met het feit of je bij het raam of aan het gangpad zit. Met m'n zitplaats aan het venster trof ik al twee mensen aan die de binnenste plaatsen al hadden bezet. Als je dan zo'n mooi systeem hebt waarbij je mensen laat op volgorde laat instappen, laat dan de mensen bij het raam eerder instappen dan de mensen aan het gangpad.

Om 11 uur was ik in Berlijn, mooi op tijd. Ik had nog even tijd voor mezelf, pas om 14:30 zou S. met haar vriend per trein Berlijn binnenkomen.

Ik ben met bus X9 naar de Zoologischer Garten gegaan, en via de Gedächtniskirche naar het hotel gelopen (dat een steenworp afstand van deze kerk ligt). Hoewel ik te vroeg was kon ik al wel inchecken.

Vervolgens even wat wezen eten bij de Subway aan de Joachimsthaler Straße vlakbij de Kurfürstendamm. Na een kleine aankoop bij een kledingzaak ben ik de U-Bahn ingegaan, om via Gleisdreieck uit te stappen bij de Potsdamer Platz. Daar even wat in de omgeving rondgelopen, onder andere de Linkstraße en toen weer terug. Het was 14 uur geweest, tijd om naar de Zoologischer Garten te gaan. Daar kwam - zoals gepland - om 14:30 de trein binnenrijden met S. en haar vriend.

Wederom naar het hotel gegaan en we zijn daarna samen naar de Potsdamer Platz gegaan. Van daaruit hebben we de hoofdattracties aangedaan: Sony Center, het Holocaust-monument en natuurlijk de Brandenburger Tor. Niets nieuws voor mij, maar desalniettemin leuk om hier in het hart van Europa te zijn. Via Unter den Linden en de Glinkaustraße zijn we naar de Friedrichstraße gelopen richting Checkpoint Charlie. Ten opzichte van zes jaar geleden was hier nog een buitenplaats aan toegevoegd met oude foto's en de historie van Checkpoint Charlie.

Zo'n beetje de eerste keten die je aan de westkant hebt is McDonald's, aldaar even wat koffie gedronken en zijn toen naar het Joodse Museum gelopen.

Het Joodse Museum bestaat uit verschillende delen. Je begint in een kil ondergronds stelsel van gangen waarin de gruwelijkheden van de Tweede Wereldoorlog belicht werden. Wanneer je verder naar boven gaat in dit gebouw met een bijzondere architectuur, kom je in het reguliere museum waar de Joodse cultuur verder uit de doeken gedaan wordt. Naast geschiedenis en het tonen van de tradities is er ook nog over een scala aan prominente joden te lezen.

Etenstijd. Bij de Hallesches Tor zijn we U6 opgestapt om bij Stadtmitte naar U2 te gaan. Bij de Bismarkstraße zijn we uitgestapt, S. wist een Duits restaurant aan de Wilmersdorfer Straße. Met een paar minuten noordwaarts lopen vonden we Wilhelm Hoeck 1892, een restaurant dat allerlei typisch Duitse gerechten serveert. Ontzettend ordinair heb ik een bratwurst met curry weggewerkt, onder het genot van een glas bier. Je bent in Duitsland of niet.

We hadden er een lange dag opzitten, tijd om weer terug naar het hotel te gaan.

Dag 2

's Ochtends om een uur of negen met U2 weer naar de Potsdamer Platz gereden, langs de Brandenburger Tor richting de Reichstag. Deze wilden we gaan bezoeken, maar er leek het een en ander veranderd te zijn ten opzichte van zes jaar geleden. Je moet eerst een toegangsbewijs aanvragen en dan kan je binnen een bepaald tijdslot naar binnen. Bij een nietszeggend gebouwtje aan de overkant van de straat stond een rijtje mensen te wachten om zo'n toegangsbewijs te krijgen. De wachttijd was echter aanzienlijk, we zouden pas in het begin van de middag naar binnen kunnen. We besloten om een toegangsbewijs voor de volgende ochtend aan te vragen, en met de papieren op zak liepen we richting Hauptbahnhof.

Met de S-bahn zijn we naar Alexanderplatz gegaan. Even over het plein gelopen, en even aan het begin van de Karl-Marx-allee gestaan. M'n Chinese reispartners leken onder de indruk te zijn, want de eenvoudige, saaie appartementenblokken uit de DDR kon zomaar doorgaan voor een doorsnee straat in China. We zijn toen weer terug gelopen naar de Alexanderplatz en naar de Fernsehturm gegaan. Er stond een flinke rij mensen te wachten, maar gelukkig was er zeer goed gratis internet (beter dan in het hotel), dus we vermaakten ons wel in de tussentijd. Een dik uur later zouden we dan naar binnen kunnen.

In de tussentijd hebben we nog wat souvenirwinkels bezocht, een rondje gelopen langs het raadhuis en de Neptunus-fontein, en tenslotte wat gegeten bij de Subway nabij de Fernsehturm. Daarna nog even in de lobby van de Fernsehturm gewacht waarna we om half twee naar binnen konden.

De lift was onder handen genomen sinds m'n vorige bezoek, met een venster bovenin zag je hoe de snelste lift van Europa door de schacht zich ruim 200 meter naar boven werkte in een paar seconden.

Het uitzicht was niet top, maar zeker niet slecht en je kon toch wel heel wat kilometers weg kijken (op heldere dagen kan je tot wel 80 km. zien). In de bar draaide muziek van m'n favoriete muzikant - Ludovico Einaudi - terwijl ik van het uitzicht genoot van een van m'n favoriete steden. Ik zou wel uren kunnen kijken naar de autootjes en treintjes, het voormalige oost-Berlijnse deel en hoe de Spree door de stad meandert. Toch hebben we hier geen uren doorgebracht, misschien hooguit een uur, waarna we weer met de lift naar beneden gingen.

Daarna gingen we met de trein naar Ostbahnhof, om van daaruit een stukje langs de restanten van de Muur te lopen. Daar waar de westzijde een lelijke warboel is van random graffiti, worden de nostalgische afbeeldingen aan de oostzijde nog gewoon in stand gehouden. Volgens mij wordt de muur wel eens in de zoveel jaar overgeschilderd, getuige dat de meeste toeristische graffiti uit 2013 en later stamt. We zijn zo noordwaarts gelopen, zijn de Oberbaumbrücke overgestoken om bij Schlesisches Tor de U-Bahn op te stappen. Via de Hallesches Tor zijn we naar het station van de Friedrichstraße gegaan.

Daar hebben we het Tränenpalast bezocht. Het station aan de Friedrichstraße fungeerde in tijden van de DDR als een grensstation, en in het portaal dat naast het station is gesitueerd namen bezoekers uit het westen van hun geliefden in het oosten. Dit portaal is vandaag een gratis toegankelijk museum dat de geschiedenis van de DDR vertelt, hoe Berlijn werd opgedeeld en hoe de inwoners daar mee omgingen. In de hal zijn de bagagebanden nog te zien en de hokjes voor de paspoortcontrole, nu verrijkt met foto's en video. In mijn optiek is dit museum een aanrader.

Na nog even kort boodschappen gedaan te hebben bij de Rewe aan de overkant van het Tränenpalast, zijn we noordwaarts gelopen om daar bij een echt Chinees restaurant te gaan eten (Lucky Star aan de Friedrichstraße). Eenmaal binnen was het echt alsof ik weer even in China was, behalve dat er Duits bier werd geserveerd. Aldaar kan je "Chinees fonduen", en het was weer even alsof ik terug in China was: het heerlijke eten dat ik gemist heb, en het aanvankelijke gevecht met eetstokjes.

Toen we het restaurant uit liepen was de droom over. Buiten dit stukje Chinees grondgebied beland je in een donkere, frisse Duitse stad. We hebben langs de Spree gewandeld naar Hauptbahnhof, om vervolgens met de S-Bahn terug te gaan naar het hotel bij de Zoologischer Garten.

Dag 3

Op deze ochtend hadden we de afspraak staan om naar de Reichstag te gaan, om half elf werden we verwacht. Gezien we om negen uur al klaar voor vertrek waren, stelde ik voor om naar de Reichstag te wandelen in plaats van de U/S-bahn, er was immers tijd genoeg. Over de Budapester Straße zijn we naar de Siegessäule gelopen. Ik heb deze altijd maar op grote afstand gezien vanaf de Brandenburger Tor, en ik had eigenlijk geen idee dat het zo'n groot bouwwerk was.

We zijn het verkeersplein overgestoken en deels door het park zijn we richting de Reichstag gelopen, ruim op tijd voor de afspraak.

Iets voor half elf konden we naar binnen. De Reichstag mag er dan wel oud uitzien van buiten, van binnen is het ultramodern. Met een gigantische lift werden we naar het dak geleid, aan de voet van de grote glazen koepel die de Reichstag vandaag kenmerkt. Architectuurtechnisch gezien best imposant en fotogeniek, met haar spiegels, spiralen en uitzicht over de stad. Om de binnencirkel van de koepel waren foto's die de geschiedenis van de Reichstag afbeeldden. Uiteraard foto's van de oorspronkelijke Reichstag, en de zwarte bladzijden in de Duitse geschiedenis waarbij de Nationaal Socialisten aan de macht kwamen, en waarna de Reichstag volledig was uitgebrand.

De glazen koepel is symbolisch van aard: de toegang is gratis voor het volk, die letterlijk boven de regering kunnen staan en op hun toe kunnen zien.

We hebben hier misschien wel een uur of twee doorgebracht, daarna zijn we weer naar beneden gegaan en zijn naar Hauptbahnhof gegaan. Daar hebben we wederom Aziatisch gegeten, deze keer wel fastfood, maar desalniettemin best lekker. Hier splitsten onze wegen: S. en haar vriend gingen winkelen aan de Ku'damm en omgeving, ik besloot om er een flinke wandeltocht op na te houden door de stad.

Vanuit Hauptbahnhof ben ik naar Alexanderplatz gegaan om van daaruit de Karl-Marx-allee af te lopen, bijna vijf kilometer achtereen. Voor mij een fijne wandeling terug in de tijd, waarbij nog steeds allerlei zaken uit het DDR-verleden de kop op steken. Ook heb ik de Frankfurter Tor nu van dichtbij gezien, ik heb nu eenmaal een zwak voor Stalinistische architectuur van de twee torens aan het plein. Bij de Frankfurter Allee ben ik de U-Bahn opgestapt en weer terug naar Alexanderplatz gereisd.

Vanuit de Alexanderplatz ben ik - zes kilometer lang - terug naar het hotel gelopen aan de Zoologischer Garten. Een mooie wandeling langs alle hoogtepunten van Berlijn.

Hierbij kwam ik voorbij een monument dat ik nog niet eerder had gezien, het Sovjetmonument dat de gesneuvelde soldaten herdenkt die in Berlijn zijn omgekomen tijdens de Tweede Wereldoorlog (met name 1945). Achter het monument was nog wat achtergrondinformatie te lezen over de oorlog, en zodoende leerde ik over het Treptower-park (Sovjet-monument en -begraafplaats). Daar was ik vlakbij toen ik de Karl-Marx-allee was afgelopen, maar het was nu te laat op de middag om daar nu nog naar toe te gaan. Dit staat nu wel hoog op m'n verlanglijstje voor de volgende keer dat ik in Berlijn ben.

Ik ben de Straße des 17. Juni overgestoken en door de parken weer richting de Budapester Straße gelopen om rond half vijf even te rusten bij het hotel na al het lopen van vandaag.

S en haar vriend waren ook moe - van het winkelen. Om een uur of zes zijn we naar een Italiaan aan de overkant van de straat geweest om daar een middelmatige pizza naar binnen te werken.

Daarna gingen zij naar een concert van de Blue Man Group, ik ging er wederom weer alleen op uit. Met U2 gingen we weer richting centrum, zij stapten uit bij de Potsdamer Platz, ik stapte twee haltes verder uit bij Stadtmitte. Een imposant uitziende kerk begroette mij toen ik weer bovengronds kwam, dit gebouw kende ik nog niet. Ik ben de Friedrichstraße in noordelijke richting gaan lopen. Bij de Torstraße ben ik rechtsaf gegaan, om dan vanuit de Rosenthaler Platz met de U-Bahn naar Alexanderplatz te gaan. Ik had het idee om wederom de Fernsehturm te bestijgen, en dat leek een goed idee. Geen wachtrij, weinig mensen boven en een prachtig uitzicht over deze miljoenenstad met haar miljoenen lampjes. Door de verlichting zag je beter hoe de hoofdstraten zich uitstrekten over de stad, met name de lange Karl-Marx-allee was erg aanwezig in het oostelijke uitzicht.

Ik was net op tijd weer terug beneden, want bij de veiligheidscontrole stond een grote groep scholieren te dringen om naar boven te mogen. Die drukte was ik net voor. Ik ben vanuit de Fernsehturm rechtstreeks de S-Bahn opgestapt en ben bij het hotel weer uitgestapt om weer wat verder te rusten van deze wandeling van enkele kilometers.

Na het concert waar S. naar toe ging zijn we nog wat wezen drinken in een rokerig cafeetje vlakbij het Europa-Center. Nog even wat bijgepraat en een halve liter witbier achterover geslagen. Het was inmiddels na twaalven en hoog tijd om maar te gaan slapen.

Dag 4

's Ochtends uitgebreid ontbeten in het hotel. M'n vlucht was pas halverwege de middag en de uitchecktijd was 11:00 uur, dus er was nog tijd. 's Ochtends ben ik even naar de Gedächtniskirche geweest, daar was ik nog niet eerder binnen geweest. Binnen vijf minuten na het verlaten van m'n kamer stond ik in een kleine ruimte waar tegenwoordig een expositie is dat de geschiedenis van de Gedächtniskirche en haar omgeving toont. Het kostte mij niet langer dan tien minuten en ben toen weer terug naar het hotel gegaan.

Om iets na elven zijn we vanaf Zoologischer Garten met bus X9 naar Tegel gereden, om aldaar een poosje te moeten wachten op onze vluchten. Ik ging terug naar Amsterdam, S. en haar vriend reisden verder naar Rome. Rondlopend door de terminal zag ik dat er ook een rechtstreekse vlucht naar Eindhoven was, volgende keer toch beter onderzoek doen dan blind voor KLM kiezen.

De terugreis verliep voorspoedig (al dan niet een paar minuten vertraging), en rond half zeven 's avonds was ik weer thuis. Het was fijn om weer even in Berlijn te zijn, en ik zou er helemaal niet mee zitten om daar nog een keer naar toe te gaan.

Slot

Berlijn heeft een bijzondere historische waarde, er valt veel te leren en te zien over met name de Tweede Wereldoorlog en het DDR-tijdperk. Je ziet dat Duitsers op een volwassen manier terugkijken op hun geschiedenis, iets dat ik niet terugzag in China toen ik het monument van de Nanjing-massacre bezocht. Men toont berouw voor wat er in de afgelopen honderd jaar is gebeurd, en grijpt iedere aangelegenheid aan om mensen erop te wijzen niet dezelfde fouten te maken die zij gemaakt hebben. Dat is misschien wel de kracht van Berlijn: de gebouwen zijn dan niet meer authentiek, maar het verhaal dat daarachter schuilt is dat zeker wel.

FOSDEM 2015

Ongeveer een uur geleden thuisgekomen van Brussel, waar afgelopen weekend FOSDEM editie 2015 plaatsvond. En wat mij betreft zal het de laatste FOSDEM zijn die ik nog ga bijwonen.

De laatste keer dat ik naar FOSDEM ben geweest was - geloof ik - in 2007 geweest. Ik wilde vorig jaar al naar FOSDEM gaan maar werd vlak daarvoor geveld door griep en kon daardoor niet gaan. Dit jaar geen griep (hoewel het wel rondwaart op het werk); dus afgelopen vrijdagmiddag de trein gepakt naar Brussel.

Mooi op tijd kwam ik aan bij het hotel in een grauwe grijze nietszeggende straat in het stadsdeel Elsene (Ixelles), ongeveer 20 minuten lopen van het Centraal Station. M'n kamer was precies zoals geadverteerd: een "kleine eenpersoonskamer met tweepersoonsbed". Niets gelogen. Maar goed, als het goed is breng je er toch niet veel tijd door. Daarna erop uit geweest om wat te wandelen door het centrum.

Nu dacht ik Brussel niet zo goed te kennen, maar ik had het ene deja-vu na het andere, stiekem heb ik in de voorgaande keren toch wel het een en ander van de stad gezien. Het was wat lastig om eten te vinden in het centrum waar je kon zitten en niet afgezet zou worden bij een louche Italiaans restaurant. Ik ben uiteindelijk maar gesettled voor een puntzak met frieten.

De volgende dag ben ik wat later naar FOSDEM gegaan, de opening en de eerste keynote vond ik niet zo interessant. Bij tramhalte Stephanie opgestapt samen met een kudde andere geeks. Tram 94 zat al goed vol toen deze aan kwam rijden, dus het was wel proppen. Ik denk dat de distributienaam Debian Squeeze in deze tram nummer 94 is ontstaan een aantal jaren geleden.

De setting van FOSDEM leek nauwlijks onveranderd. De nieuwigheden waren meer eetkraampjes en er was een nieuw gebouw K waar de booths stonden (niet meer in de donkere gangen van gebouw H, zoals acht jaar geleden). De Janson collegezaal was onveranderd met de aftandse bankjes en tafeltjes, en de devrooms in gebouw H waren donker en volgepakt als vanouds.

Maar het viel allemaal best tegen om verschillende redenen. Het waren de donkere, bedompte en versleten gebouwen, veel heen-en-weer geloop met het koude weer (maar gelukkig geen neerslag), ik voelde me er niet op m'n gemak en veel talks die ik bijwoonde waren matig. Het lijkt erop dat FOSDEM niet mijn type evenement (meer) is. Dit zijn mijn mensen niet, ook al delen we dezelfde interesses. Ik schaam me zelfs een beetje voor deze groep mensen, want vrouwen hebben eerder aangegeven de sfeer op FOSDEM intimiderend te vinden. En dat is ook mijn impressie. Constant had ik het gevoel hier geen deel van uit te willen maken.

Andere ergernis was de voedselvoorziening: altijd en overal lange rijen voor te duur eten, hoewel ik moet nageven dat het er wel goed uit zag. Gelukkig had ik een rugzak met eten bij me om de dag door te komen.

Dan de talks, zoals ik voorheen aangaf waren er veel matig. Waarschijnlijk heb ik te hoge verwachtingen gekweekt, want ik voelde me als een kind in een snoepwinkel toen ik een paar dagen van tevoren door het programma heen wandelde en uitkoos wat ik zoal wil gaan zien.

De eerste talk was in de Python Devroom, over het benaderen van de PostgreSQL-database gebruik makend van Python. In een moordtempo werden er verschillende libraries doorheen gejaagd, waarbij de onderlinge verschillen niet altijd even helder waren (twee libraries leken me haast identiek).

De tweede talk was What is wrong with Operating Systems (and how do we make things better) van Antti Kantee. Vermakelijk, maar weinig informatief. Een operating system werd vergeleken met de Black Knight uit Monty Python (video). Zowel ridders als OSen zitten alleen maar in de weg, ze zijn gedateerd en ze zijn kwetsbaar (terwijl ze denken dat ze onkwetsbaar zijn). Verder werd uit de doeken gedaan wat het nut is van een OS (enabling, abstracting, isolating, monitoring). De vraag in de titel tussen haakjes is onbeantwoord gebleven.

Rond het middaguur ging ik weer terug naar de Python Devroom voor een praatje over de prompt-toolkit voor Python (geschreven en gepresenteerd door Jonathan Slenders). Hier werd gedemonstreerd hoe je met weinig effort een command-line interface kan maken met auto-completion, syntax highlighting en andere goodies. Jammer dat ik m'n laptop niet bij me had want ik wou hier meteen mee aan de slag gaan, hier zag ik al meteen toepassingen voor.

Terug naar Janson, waar het release-mechanisme van Firefox uitgelegd werd. Hier werd het zogenaamde "train model" uitgelegd, met verschillende tracks in de vorm van de nightly build, de DevEd build, de beta build en uiteindelijk de stable build. Veranderingen sijpelen zo door van de minst stabiele versie naar de stabielere versie. Als je feature de trein "mist" is er weinig aan de hand, de volgende trein waar je je feature kan landen komt doorgaans snel voorbij. Dit voorkomt de zogenaamde rush van changes wanneer er een nieuwe release gebranched gaat worden. In het geval van bugs, zal een ontwikkelaar in het beste geval code debuggen dat ie 6 weken geleden geschreven heeft, in het slechtste geval 18 weken.

En weer terug naar de Python-devroom voor het praatje "When performance matters", over hoe je zonder zwarte magie in te zetten toch snellere Python-code kan schrijven. Meer mensen hadden dit idee en de DevRoom was dan ook afgeladen vol. Ik kon nog net een gaatje vinden aan de zijkant van de zaal, tegen de muur. Marc-André Lemburg ging aspecten af van de taal, geïmplementeerd met een aantal verschillende mogelijkheden. Iedere implementatie kost tijd, hij zette ze onder elkaar neer met een tijd in microseconden dat zo'n stuk implementatie duurt. Geen idee hoe hij dat nou gemeten had, hij heeft geen woord gerept over zijn methodiek. Misschien heb ik het gemist, want ik ben halverwege het praatje weggegaan. Niet omdat het praatje minder interessant was dan gehoopt, maar door de honderden mensen samengepakt in een kleine donkere ruimte had ik het idee dat ik bijna van m'n stokje ging, dus wilde accuut frisse lucht. Die micro-optimalisaties geloof ik wel.

Een veel interessanter praatje over optimalisatie werd vlak daarna gegeven door James Pallister, dit ging over superoptimalisatie en de GNU Superoptimizer (GSO). Hier werd uitgelegd hoe een superoptimizer (assembler)-code genereert dat door een normaal mens niet te lezen is (laat staan te schrijven), en ook nog eens een aantal malen korter is dan de meest aggressief geoptimaliseerde code dat wordt geproduceerd door GCC of Clang. In een voorbeeld die het teken (sign) teruggeeft van een integer, zag je hoe een doorsnee compiler een stukje C met acht instructies genereert, met jumps. De superoptimizer kwam echter aanzetten met code in vier instructies zonder jumps. De code deed merkwaardige adds en subtracts, maar uiteindelijk werkte het wel. Superoptimalisatie genereert (uitputtend) instructiereeksen, en er wordt gekeken of de code aan de specificatie voldoet. Bij een beetje instructieset heb je al een gigantische search space, dus je moet een beetje slim zijn om ongeldige of onzinnige instructiereeksen over te slaan. Zo is een mov r0, r0 een onzinnige operatie. De superoptimizer gaat vervolgens zoeken naar een optimale oplossing, dat kan de snelste oplossing zijn, of de kleinste oplossing of degene met de minste batterijconsumptie. Nagaan of een oplossing correct is gaat door middel van simulatie, of door een wiskundig bewijs (of een combinatie daarvan). Het staat allemaal nog wel in de kinderschoenen, maar dit vond ik wel een hele interessante ontwikkeling die ik nog niet kende.

Ik sloot de dag af in de Open Document Editors Devroom, waar het een en ander werd verteld over de LibreOffice Viewer die voor Android wordt ontwikkeld. Leuk om te zien, maar meer ook niet. De functionaliteit is vooralsnog beperkt. Daarnaast besprak Jan Iversen nog een project Corinthia dat doelt op mobiele platformen en het lezen/schrijven van office-documenten, maar echt scherp wat dit framework nu moet bewerkstelligen heb ik het niet. Te jong en nog te abstract om nu van enige waarde te zijn voor een eindgebruiker als ik.

Het was genoeg geweest voor vandaag, ik wilde mezelf bevrijden van de horde geeks op de ULB. In plaats van de tram te pakken ben ik te voet terug gegaan naar het hotel. Een fijne wandeling van een half uur door Elsene (waarschijnlijk net zo snel als de tram). Later op de avond er nog wat op uit om wat te eten, maar het restaurant dat ik op Google Maps gevonden had kreeg ik in real life niet gevonden, dus maar terugvallen op een Pizza Hut niet ver van het hotel).

Helaas begon toen bij mij de griep op te zetten (het zat er waarschijnlijk al een beetje in, gezien ik het niet helemaal meer had in de Python Devroom).

Zondagochtend de afweging gemaakt om de tweede dag bij te wonen of in bed te blijven. Gezien het feit dat ik beide alternatieven even aantrekkelijk vond, ben ik in bed gebleven. FOSDEM kon me gestolen worden. En ik heb er geen spijt van. De griep zette inmiddels door en de temperatuur schoot omhoog. Wat doe ik maandag? Terugreizen met een koortshoofd of een dag langer in het hotel blijven met alle onkosten van dien? De kleine kamer, waar ik niet verwacht had hier zoveel tijd in door te brengen, was ik nu toch ook wel beu.

Vanochtend voelde ik me iets beter, niet super, en besloot toch maar om naar huis te gaan waar ik op m'n eigen bank met m'n laptop rustig uit kan zieken. Wat mij betreft m'n laatste FOSDEM.

This blog is powered by ikiwiki.