The Zen of Python

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than right now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea — let’s do more of those!

—Tim Peters

Minix in Qemu

Ich möchte das Betriebssystem Minix in der Version 3 im Laufe dieses Jahres ein wenig genauer unter die Lupe nehmen.
Minix basiert auf einem µKernel (im Gegensatz zu monolithischen Betriebssystemen wie Windows, Linux, BSD), der lediglich 3800 Zeilen Code umfasst. Ein einziger Mensch kann ihn also komplett verstehen. Wenn man bedenkt, dass auf 1000 Zeilen Code durchschnittlich 6 Bugs zu beklagen sind und monolithische Kernel Millionen Zeilen Code umfassen (Linux wahrscheinlich um die 4 Millionen und immer mehr kommt hinzu), dann wird klar, dass die Idee des µKernel ziemlich schlau ist.
Abgesehen von einigen grundlegenden Mechanismen (Interrupt Handling, Scheduler, Prozesse starten/stoppen) ist die gesamte Funktionalität (Driver, Files, Memory, Network, Shell) in User-space Prozesse ausgelagert, die von einem Reincarnation Server überwacht werden. Schmiert ein Prozess ab, wird er vom Reincarnation Server wieder gestartet.

In einem ersten Schritt nun Minix in einer virtuellen Qemu-Maschine laufen lassen (unter Ubuntu):

  1. Minix Image holen

    $ wget --tries=inf http://cd.minix3.org/download/IDE-3.1.1.iso.bz2
    $ bunzip2 IDE-3.1.1.iso.bz2
  2. Qemu installieren

    # aptitude install qemu
  3. Qemu Image bauen

    $ qemu-img create minix.img 1G
  4. Minix installieren

    $ qemu -localtime -net user -net nic -m 128 -cdrom IDE-3.1.1.iso -hda minix.img -boot d
  5. Minix starten

    $ qemu -localtime -net user -net nic -m 128 -cdrom IDE-3.1.1.iso -hda minix.img -boot c

Läuft schon sehr flott.
Hier noch das grundlegende Minix Paper.
Und wers wirklich wissen will, der muss das Buch Operating Systems Design and Implementation (3rd Edition) von Tanenbaum und Woodhull lesen. Liegt bei mir irgendwo rum. Ich werde es lesen. Noch dieses Jahr.

Gesegneter Code

Die fantastische Datenbanksoftware Sqlite, hochgeeignet, um viele viele schwierige Probleme zu lösen, ist unter der Public Domain veröffentlich (d.h. der Autor verzichtet vollumfänglich auf seine Urheberrechte). Statt einer Lizenz hat der geniale Kopf hinter diesem Projekt, Dr. Richard Hipp, eine Segnung in den Source Code eingefügt:

May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.

LibTomCrypt

Ich habe diese Woche eine freie Krypto-Library gesucht und bei Mr Tom St Denis gefunden. Die Lizenzbestimmungen:

LibTomCrypt is public domain. As should all quality software be.

Recht hat er, der Herr St Denis.

GPL vs. LGPL

Wurde in letzter Zeit häufig diskutiert, deshalb hier die Wikipedia-Erklärung:

Im Gegensatz zur GPL darf bei der LGPL auch geschlossener (d. h. proprietärer) Code mit dem LGPL-Code kombiniert werden, allerdings nur, wenn folgende Bedingung eingehalten wird: Ein Programm, das LGPL-Code zusammen mit eigenem proprietärem Code verwendet, muss so aufgebaut sein, dass jeder Endnutzer den quelloffenen LGPL-Code (oder modifizierte Versionen davon) in das endgültige Programm (selbstständig) linken kann. Dies kann entweder durch dynamisches Linken geschehen (wo der LGPL-Code in einer dynamischen Bibliothek verwendet wird); dann kann der Endnutzer eine eigene dynamische Bibliothek (Linux-Jargon: Shared Object) des LGPL-Teils erstellen (beispielsweise aus einer modifizierten Version des LGPL-Codes) und nutzen. Oder es kann durch statisches Linken geschehen – dann bekommt ein Endnutzer typischerweise die Objektdateien (oder Quelltext) des proprietären Codes und die Sourcen des LGPL-Codes und kann diese zusammenlinken.