Wikipedia.org sagt zu WikiWikis:
"Wikis sind im World Wide Web verfügbare Seitensammlungen, die von den Benutzern online geändert werden können. Sie sind durch Links verbunden - wie anderer Hypertext auch. Sie lassen sich jedoch praktisch sofort am Bildschirm in einer Editbox ganz leicht ändern.
Die Einfachheit der Bearbeitung entsteht dadurch, dass - im Gegensatz zu HTML - nur mit wenigen Formatbefehlen gearbeitet wird. Dieser Minimalismus ermöglicht einer großen Gruppe von Menschen mit wenig Lernaufwand an diesem System teilzuhaben."
Auch die Erklärung WasIstEinWiki von wikiweb.at ist Empfehlenswert.
Diese Seitensammlungen werden durch CGI Skripte realisiert. Mittlerweile gibt es eine sehr umfangreiche Sammlung von diesen Skripten — auch WikiWikiEngines oder WikiWikiClones genannt. Eine Liste mit vielen Clones befindet sich auf der Seite des ursprünglichen WikiWiki Erfinders, Ward Cunningham. In dieser Sammlung befinden sich Skripte in vielen verschiedenen Programmiersprachen wie Python, Perl, Java, etc.
Alle diese Scripte haben aber ein Problem. Auf einer Sparcstation 10 (mit 36MHz und 32MB RAM) laufen diese Scripte viel zu langsam. Dieses liegt an der Tatsache, dass die Interpreter der jeweiligen Programmiersprache einen, für einen Low-End Rechner, zu hohen Balast mitbringen.
In der Praxis sieht es so aus, dass z.B. MoinMoin schon auf der Konsole, mit dem time Befehl, über 5 Sekunden CPU Zeit benötigt. Die reale Zeit, die zwischen Mausklick und dem Anzeigen der Seite liegt, ist bis zu 10 Sekunden lang.
Aber wie gesagt: "So etwas will ich haben."
Also setzte ich mich hin und schrieb mein eigenes WikiWiki. Für mein Wiki musste eine Programmiersparache her, die schneller als Perl oder Python ist. Ein Wiki in C wäre mit Sicherheit am schnellsten, der Aufwand aber nicht Verhältnismässig. Da die Hauptaufgabe eines Wikis ist, die Formatbefehle in HTML umzuwandeln, eignet sich für so etwas auch sed und awk. Und da man mit awk auch Programmieren kann, stand meine Wahl fest. Ich programmierte also mein WikiWiki in awk. Das Resultat — AwkiAwki.
Und um die Frage der Performance gleich zu beantworten:
# /usr/bin/time ./awki.cgi >/dev/null 0.23 real 0.06 user 0.26 sys
Mittlerweile ist AwkiAwki sogar ein kleines Projekt bei Sourceforge.net geworden: http://awkiawki.bogosoft.com/
Wie jedes bei Sourceforge gehostete Projekt, ist auch AwkiAwki OpenSource. Es steht unter der MIT Lizenz.
Wer AwkiAwki vor der Installation testen möchte, kann die Demo-Site bei Sourceforge oder meine oben genannte SUN Sparcstation waid (dyndns) besuchen.
Im folgenden beschreibe ich die Installation von AwkiAwki unter NetBSD. Anschließend gehe ich auf die Konfiguration ein.
Für AwkiAwki benötigt man ein Webserver der CGI-Skripte ausführen kann. Da das Ganze auf einem Low-End Rechner laufen soll, habe ich thttpd genommen. Die Installation unter NetBSD ist natürlich ein Kinderspiel.
# export PKG_PATH=ftp://ftp.de.netbsd.org/pub/NetBSD/packages/1.6/sparc/All # pkg_add thttpd
Die Standardkonfiguration kann von
/usr/pkg/share/examples/thttpd.conf
nach
/usr/pkg/etc/thttpd.conf
kopiert werden. Nach einem echo
"thttpd=YES" >> /etc/rc.conf
kann der Webserver mit
/usr/pkg/etc/rc.d/thttpd start
gestartet werden. Durch
hinzufügen der folgenden drei Zeilen zu /etc/rc.local
wird thttpd bei jedem Boot automatisch gestartet.
if [ -f /usr/pkg/etc/rc.d/thttpd ]; then /usr/pkg/etc/rc.d/thttpd start fi
AwkiAwki kann man über CVS oder WebCVS beziehen, oder von der Hompepage downloaden (einzeln oder als tarball). Letzteres ist am einfachsten.
# cd /tmp # wget -nd http://awkiawki.bogosoft.com/awkiawki-daily-snapshot.tar.gz # tar -xzvpf awkiawki-daily-snapshot.tar.gz # cd awkiawki
Das Stammverzeichnis von thttpd ist /usr/pkg/share/thttpd/
.
Für das Beispiel installieren wir AwkiAwki in das
/cgi-bin
Verzeichnis.
# cd /tmp/awkiawki # mkdir -p /usr/pkg/share/thttpd/cgi-bin # cp awki.cgi parser.awk special_parser.awk /usr/pkg/share/thttpd/cgi-bin/ # cp awki.png /usr/pkg/share/thttpd/
Nun muss noch ein Verzeichnis zum Speichern der Seiten erstellt werden und den Webserver Benutzer als Besitzer eintragen ( in unserem Beispiel der Benutzer nobody).
# cd /usr/pkg/share/thttpd/cgi-bin # mkdir data # chown nobody data/
Fertig. Das Ergebniss kann nun unter http://meinserver/cgi-bin/awki.cgi bewundert werden. Man sieht nun die erste Seite, die FrontPage. Diese ist noch leer und kann mit einem Klick auf Edit FrontPage bearbeitet werden. Unterhalb der Editbox werden die Formatbefehle aufgelistet. Durch das zusammenschreiben von grossgeschriebenen Wörtern kann man neü Seiten erstellen. (z.B. MeineNeüSeite). Nun kann man mit AwkiAwki herumexperimentieren: Ein paar neü Seite erstellen, die Formatbefehle testen, die Seiten auflisten lassen. Einfach alles Ausprobieren und so das WikiWikiPrinzip verstehen. (Z.B. listet ein Klick auf den oberen Seitennamen alle Seiten, die auf diese verweisen)
AwkiAwki bietet einige Optionen an, mit den es an die eigenen Bedürfnisse angepasst werden kann.
Es gibt keinen einheitlichen Namen der Konfigurationsdatei. Er ist
abhängig vom Scriptnamen. Einfach gesagt: Die Konfiguration muss im
gleichen Verzeichniss leigen, den gleichen Basename haben (also ohne
suffix) und mit .conf
enden. Wenn das Script
myawki.cgi
heisst, muss die Konfiguration
myawki.conf
heissen.
Alle Optionen und ihre Standardwerte stehen am Anfang der
awki.cgi
Datei. Die wichtigsten werde ich hier
erläutern.
Eine AwkiAwki Konfigurationsdatei besteht aus Zeilen mit jeweils einem Option/Werte Paar. Beide werden durch ein Gleichheitszeichen getrennt. Vor und nach dem Gleichheistzeichen können Leerzeichen oder Tabulator auftreten. Werte dürfen in Anführungszeichen stehen.
Beispiel:
default_page = "AwkiAwki" show_changes=15 css= "/site.css"
Diese Variable enthält den Namen der Startseite. Dies ist die Seite die bei einem Aufruf von awki.cgi angezeigt wird. Ausserdem befindet sich am Ende jeder Seite ein Link zu dieser Seite. Beispielwerte: SonnenblenDe, MeineSeiteDe, BogosoftDotCom, AwkiAwki, etc.
Um Listen zu gestallten muss man ein TAB gefolgt von einer 1 für nummerierte oder ein * für normale Listen eingeben. Da viele Browser Probleme mit dem Eingeben von Tabulatoren innerhalb einer Editbox haben, wurde eine Notlösung eingebaut. Durch eine Auswahlbox (Convert runs of 8 spaces to Tab) kann man AwkiAwki veranlassen, beim Speichern einer Seite, folgen von acht Leerzeichen in ein Tab umzuwandeln. Wenn man der Variable always_convert_spaces irgendeinen Wert zuweist, dann verschwindet diese Box und die Umwandlung der Leerzeichen erfolgt automatisch bei jedem Speichern.
Die Variable css kann eine URL enthalten, die auf eine externe CSS Datei verweist. Dadurch kann man das Aussehen von AwkiAwki beeinflussen.
Die Funktion RecentChanges listet die letzten 10 veränderten Dateien auf. Mit show_changes kann dieser Wert verändert werden.
Mit write_protection kann man bestimmte Seiten sperren, d.h. man kann sie nicht Editieren und Speichern. Als Wert für die write_protection Option kann man beliebige Reguläre Ausdrücke verwenden. Mit einem Pipe Zeichen (oder) kann man mehrere Ausdrücke aneinander Reihen.
Beispiele:
Wir erstellen nun ein weiteres Verzeichnis und erstellen dort eine Kopie von AwkiAwki.
# mkdir /usr/pkg/share/thttpd/cgi-bin/admin/ # cd /usr/pkg/share/thttpd/cgi-bin/admin/ # cp ../awki.cgi ../*parser.awk ./
Wie schon oben beschrieben, sucht AwkiAwki die Konfigurationsdatei im
gleichen Verzeichnis wie die Datei. Wir können im
cgi-bin/
Verzeichnis eine awki.conf
schreiben, in
der bestimmte Seiten gesperrt werden. Den Zugriff auf die gesperrten Seiten
realisieren wir mit einem zweiten AwkiAwki. Damit das zweite auf die
gleichen Seiten zugreifen kann, setzen wir die Variable
datadir
auf "../data/"
. Die
write_protection
bleibt hier leer.
Nun wird mit thtpasswd -c .htpasswd admin
ein
Passwortdatei erstellt.
Das Resultat ist ein AwkiAwki mit geschützen Seiten und ein weiteres passwortgeschütztes AwkiAwki mit Vollzugriff auf alle Seiten.
Das Ergebnis kann auch auf den folgenden Seiten getestet werden:
Mit AwkiAwki kann man auch eine schwachbrüstige SUN Sparcstation, IPX oder IPC in einen Server mit Webforum verwandeln, ohne das dabei der ganze Rechner in die Knie gehen muss.
Hier und dort wird AwkiAwki noch verbessert. Wer über Veränderungen informiert werden möchte, Verbesserungen hat, Bugs findet, oder einfach nur eine Frage zu AwkiAwki hat, kann sich die awkiawki-users mailling-list abonieren.