Aus Linux-Magazin 09/2005

Die fünfte Feder: Die neuen Features von Tcl 8.5

Tcl 8.5 steht kurz vor der Fertigstellung und bringt neben 50 Verbesserungen eine echte Überraschung mit: Die Basissprache erhält einen neuen Datentyp. Auch das eindrucksvolle Tile-Paket reift zusehends. Mit ihm nähert sich das Aussehen von Tk-GUIs dem anderer Widget-Bibliotheken.

Der recht kleine Versionssprung [1] von Tcl 8.4 auf die bald erscheinende Release 8.5 lässt kaum große Änderungen vermuten – weit gefehlt: Die neue Version glänzt mit 50 kleineren Verbesserungen sowie einem neuen Datentyp in der Basissprache. Letzteres ist einmalig in den vergangenen zehn Jahren.

Üblich und eher zu erwarten wäre, so umfangreiche neue Funktionen als Erweiterungspakete zu implementieren. Selbst die diversen objektorientierten Tcl-Sprachvarianten sind heute als Erweiterungsmodule implementiert [3]. Diese Strategie hält den Kern schlank und sorgt dafür, dass die hervorragende Unterstützung der drei Plattformen Unix, Mac OS X und Windows nicht leidet.

Die überraschende Neuerung in Tcl 8.5 heißt Dictionary. Dieser Datentyp geht auf einen Vorschlag von Donal K. Fellows und David Cargo zurück, die ihn als Tcl Improvement Proposal (TIP) einreichten [4]. Dictionaries heißen in anderen Sprachen auch assoziative Map oder Hashtabelle. Ähnlich einem Wörterbuch speichern sie Schlüssel-Wert-Paare. Tcl hat mit dem »array«-Kommando zwar längst etwas Ähnliches zu bieten; näher betrachtet unterscheiden sich Arrays und Dictionaries aber deutlich.

Array oder Dictionary

Array und Dictionary erfüllen ungefähr die gleiche Aufgabe: Sie speichern zu beliebig vielen Schlüsseln (Key) je einen Wert (Value). Die Reihenfolge der Schlüssel ist unbestimmt, nur die Zuordnung zu ihrem Wert ist relevant. Perl nennt die entsprechende Datenstruktur Hash Table, auch andere Sprachen kennen solche assoziativen Arrays. Tcl-Arrays funktionieren intern allerdings als Sammlung von Variablen.

Das hat unter anderem zur Folge, dass ein Programm jeden einzelnen Wert per »trace«-Kommando überwachen kann – beim Überwachen des ganzen Array entsteht enormer Overhead. Bei Dictionaries ist nur das Überwachen der kompletten Datenstruktur möglich, das klappt dafür ohne Geschwindigkeitsnachteil.

Übergabe am Stück

Es ist unmöglich, Arrays als Ganzes (by Value) an eine Funktion zu übergeben, das gelingt nur auf dem Umweg über einen Export in die Listendarstellung. Ein Dictionary lässt sich dagegen problemlos und ohne Umschweife weiterreichen. Zudem dürfen die Dict-Schlüssel eine baumähnliche Unterstruktur aufweisen. So gelingt es, hierarchische Datenstrukturen in einem Dictionary abzubilden. Außerdem erweisen sich die Filter- und Schleifenmethoden als sehr praktisch (siehe Tabelle 1).

Viele Programmierer sind von den Vorzügen der Dictionaries inzwischen überzeugt. Beispielsweise verwendet die neue Version 1.5 des PostgreSQL-Binding [6] optional Dictionaries anstelle der Arrays, um die Ergebnisse einer SQL-Abfrage effizient zu speichern: »pg_result -dict«. Dieses Feature ist noch experimentell, bis Tcl 8.5 als finale Version vorliegt.

Hierarchische Tabelle

In Abbildung 1 ist die Struktur eines Dictionary zu sehen. Die linke Seite zeigt eine einfache 1:1-Beziehung von Schlüssel und Wert. Das Dictionary auf der rechten Seite benutzt strukturierte Schlüssel mit zwei Ebenen. Die Abfrage nach dem Schlüssel »root home« führt zum Wert »/root«, die Abfrage für »ntp home« liefert »/var/lib/ntp«. Greift ein Programm direkt auf einen Schlüssel zu, der weitere Unterschlüssel besitzt, enthält es als Antwort den verbleibenden Bereich als Unter-Dictionary. Die Abbildung zeigt das für »root« und »ntp«.

Abbildung 1: Die Datenstruktur hinter den Dictionaries. Links eine einfache 1:1-Beziehung von Schlüssel und Wert, rechts ein Dictionary mit hierarchischen Schlüsseln. Eine Anfrage nach dem Hauptschlüssel liefert eine Untermenge, die alle Unterschlüssel und deren jeweiligen Wert enthält.

Abbildung 1: Die Datenstruktur hinter den Dictionaries. Links eine einfache 1:1-Beziehung von Schlüssel und Wert, rechts ein Dictionary mit hierarchischen Schlüsseln. Eine Anfrage nach dem Hauptschlüssel liefert eine Untermenge, die alle Unterschlüssel und deren jeweiligen Wert enthält.

Wörter im Dictionary

Das Beispiel in Listing 1 füllt den Inhalt der Datei »/etc/passwd« in ein Dictionary und arbeitet anschließend mit dieser Datenstruktur. Die Zeilen der Passwortdatei enthalten mit Doppelpunkt getrennte Felder. Der »split«-Aufruf in Zeile 9 trennt diese Felder und erzeugt daraus eine Tcl-Liste, die das Programm in der Variablen »eingabe« ablegt. Mehrere Aufrufe des folgenden Kommandos speichern den Wert unter dem angegebenen Schlüssel im Dictionary: »dict set Dict-Name Schlüssel Wert«.

Der Programmierer darf bei diesem Aufruf mehrere Schlüssel verwenden, um hierarchische (also baumartige) Datenstrukturen abzubilden. Als Erstes gibt er den Hauptschlüssel an (die Wurzel des Baums), danach die Unterschlüssel. Die Zeilen 10 bis 13 nutzen dies und geben als Hauptschlüssel den Accountnamen an (das erste Feld im Passworteintrag), danach den Namen des Feldes und als Wert seinen Inhalt.

Die User-ID des Benutzers »cz« ist durch das Kommando in Zeile 10 unter »cz uid« abgelegt. Die Zeilen 22 und 25 zeigen den Zugriff auf die Datenstruktur, einmal mit einem kompletten Schlüssel »cz name«, einmal mit dem Oberschlüssel »cz«. Im zweiten Fall liefert »dict get« alle gespeicherten Daten des Accounts »cz«. Abbildung 2 zeigt, wie die Ausgabe aussieht.

Abbildung 2: Die Ausgabe von Listing 1. Das Beispielprogramm verwendet das neue »dict«-Kommando, um den Inhalt der Passwortdatei auszuwerten. Es zählt die User, fragt einen speziellen Account ab und listet alle Benutzer, deren Namen mit A bis D beginnen.

Abbildung 2: Die Ausgabe von Listing 1. Das Beispielprogramm verwendet das neue »dict«-Kommando, um den Inhalt der Passwortdatei auszuwerten. Es zählt die User, fragt einen speziellen Account ab und listet alle Benutzer, deren Namen mit A bis D beginnen.

Listing 1: Das
»dict«-Kommando

01 #!/bin/sh
02 # 
03 exec tclsh8.5 $0 $@
04 
05 # Erzeugt ein Dictionary mit den Daten aus /etc/passwd
06 proc createDict {} {
07   set fd [open /etc/passwd]
08   while {[gets $fd line] > 0} {
09     set eintrag [split $line :]
10     dict set retval [lindex $eintrag 0] uid   [lindex $eintrag 2]
11     dict set retval [lindex $eintrag 0] name  [lindex $eintrag 4]
12     dict set retval [lindex $eintrag 0] home  [lindex $eintrag 5]
13     dict set retval [lindex $eintrag 0] shell [lindex $eintrag 6]
14   }
15   return $retval
16 }
17 set nutzerdaten [createDict]
18 
19 puts "Es gibt [dict size $nutzerdaten] Benutzer"
20 
21 # Direkter Zugriff
22 puts "nur Name [dict get $nutzerdaten cz name]"
23 
24 # Alle Informationen
25 puts "alle Daten «[dict get $nutzerdaten cz]»"
26 
27 # Benutzer filtern: Nur A bis D
28 set ad [dict filter $nutzerdaten key {[a-d]*}]
29 puts "Es gibt [dict size $ad] Benutzer, die mit a - d anfangen"
30 
31 # Benutzer ausgeben, dazu Schleife über alle Schlüssel
32 dict for {nutzer daten} $ad {
33   puts -nonewline "Benutzer $nutzer"
34   # Subeinträge als lokale Variable
35   dict with daten {
36     puts "t, Name «$name», Heimatverzeichnis $home"
37   }
38 }

Filterfrage

Das »dict«-Kommando taugt für deutlich mehr als für die bloße Datenspeicherung, es kann das Dictionary auch filtern und den Inhalt bearbeiten. Der »dict filter«-Aufruf in Zeile 28 sucht nach Einträgen, deren Schlüssel (hier der Accountname) mit den Buchstaben A bis D beginnt. Das Ergebnis landet im Dictionary »ad«. Als Suchmuster dient ein Glob-Pattern-Ausdruck: Der Stern hinter »[a-d]*« hat dieselbe Bedeutung wie in der Shell, er steht für beliebig viele beliebige Zeichen.

Zur Ausgabe der Nutzerdaten setzt das Beispielskript zwei weitere »dict«-Kommandos ein. Besonders praktisch ist das Schleifenkonstrukt:

dict for {Schlüsselvar Wertvar} Dict-Name {
Quelltext
}

Tcl führt den in der Schleife angegebenen Quelltext für jeden Schlüssel aus dem Dictionary einmal aus und füllt die beiden Variablen jeweils neu mit dem Schlüssel und dessen Wert. Die Zeilen 32 bis 38 in Listing 1 zeigen den Einsatz dieser Schleife.

Kontrollstrukturen

Da im Dictionary strukturierte Schlüssel liegen (siehe Abbildung 1, rechte Seite), erhält die Variable »daten« in Zeile 32 bei jedem Durchlauf ein neues Dictionary und keinen einfachen String. Zur Ausgabe seines Inhalts könnte das Programm die einzelnen Werte mit »dict get« abfragen. Eleganter geht es mit »dict with« wie in den Zeilen 35 bis 37. In Zeile 36 stehen alle Dictionary-Einträge in lokalen Variablen zur Verfügung, die wie die Schlüssel heißen und deren Wert zum jeweiligen Schlüssel passt.

Tabelle 1 stellt weitere wichtige Funktionen der Dict-Familie vor. Wer die mächtige und praktische Datenstruktur mit einer älteren Tcl-Version einsetzen möchte, findet unter [5] eine entsprechen-de Variante, die selbst in Tcl geschrieben ist.

Das neue »dict«-Kommando ist zwar die auffälligste Entwicklung, die Änderungsliste von Tcl 8.5 [1] führt jedoch über 50 Punkte auf, Bugfixes noch nicht gerechnet. Es handelt sich meist um Verbesserungen bestehender Kommandos, zum Beispiel eine höhere Zeitauflösung oder das Sortieren verschachtelter Listen. Es lohnt sich, diese Liste durchzulesen.

Tabelle 1: Das
»dict«-Kommando

 

Kommando

Erklärung

dict create Schlüssel Wert …

Erzeugt ein neues Dictionary. Es dürfen beliebig viele
Paare aus Schlüsselname und Wert angegeben sein, die das
Dictionary mit Inhalt füllen.

dict size Dictionary

Gibt die Anzahl der Einträge im Dictionary aus
(Schlüssel-Wert-Paare).

dict keys Dictionary Filter

Listet alle Schlüssel. Der Filter-Ausdruck ist optional;
er enthält ein Glob-Muster, zu dem die ausgegebenen
Schlüssel passen müssen.

dict values Dictionary Filter

Listet alle Werte, die im Dictionary abgelegt sind. Der Filter
ist optional (siehe »dict keys«).

Einzelne Einträge

 

dict get Dictionary Schlüssel

Gibt den Wert aus, der zum Schlüssel gehört.

dict set Dict-Name Schlüssel Wert

Belegt den Schlüssel mit dem angegebenen Wert.

dict unset Dict-Name Schlüssel Wert

Löscht ein Schlüssel-Wert-Paar.

dict append Dict-Name Schlüssel String

Hängt den String an den vorhandenen Wert an.

dict lappend Dict-Name Schlüssel Wert

Erweitert die Liste, die sich unter dem Schlüssel im
Dictionary befindet.

dict exists Dictionary Schlüssel

Prüft, ob das Dictionary den Schlüssel
enthält.

Operationen auf das gesamte Dictionary

 

dict replace Dictionary Schlüssel Wert …

Gibt ein neues Dictionary zurück, in dem es die
angegebenen Schlüssel mit dem jeweiligen Wert belegt.

dict filter Dictionary Filtertyp Argumente

Filtert das Dictionary nach den angegebenen Kriterien und
liefert das Ergebnis als neues Dictionary.

dict merge Dictionary1 Dictionary2 …

Fügt mehrere Dictionaries zu einem neuen zusammen.
Enthalten mehrere Dictionaries identische Schlüssel, landet
der Wert aus der zuletzt angegebenen Datenstruktur im
Ergebnis.

Kontrollstrukturen

 

dict for { Schlüsselvariable Wertvariable}

Dictionary Quelltext

Diese Schleife iteriert über alle Einträge, setzt die
Schlüssel- und die Wertvariable jeweils passend und führt
den angegebenen Quelltext aus.

dict with Dictionary Quelltext

Führt den Quelltext aus und setzt dabei lokale Variablen
ein, deren Namen den Schlüsseln im Dictionary entsprechen und
die deren Wert erhalten.

Glatte Kanten

Eine interessante Neuerung ist leicht zu übersehen: Tk 8.5 unterstützt endlich auch unter X11 Antialiasing, wenn beim Übersetzen die Configure-Option »–enable-xft« gesetzt war. Voraussetzung sind ein C-Compiler sowie X11-Header und -Bibliotheken. Die Quellen für Tcl und Tk befinden sich bei Sourceforge [2]. Folgende Zeilen übersetzen und installieren den Interpreter und seine Bestandteile:

tar xvzf tcl8.5-src.tar.gz
tar xvzf tk8.5-src.tar.gz
cd tcl8.5/unix
./configure
make && make install
cd ../../tk8.5/unix
./configure --enable-xft --with-tcl=/usr/local/tcl8.5/unix
make && make install

Danach befinden sich in »/usr/local/bin« die beiden neuen Tcl-Shells »tclsh8.5« und »wish8.5«. In Tk ist Antialiasing eingeschaltet und auch große Schriftgrade im Text oder Canvas stellen kein Problem mehr dar (Abbildung 3).

Abbildung 3: Durch Kantenglättung (Antialiasing) sehen Schriften in Tk 8.5 wesentlich eleganter aus als in früheren Versionen. Außerdem sind dank XFT nun beliebig skalierbare Schriften möglich.

Abbildung 3: Durch Kantenglättung (Antialiasing) sehen Schriften in Tk 8.5 wesentlich eleganter aus als in früheren Versionen. Außerdem sind dank XFT nun beliebig skalierbare Schriften möglich.

Tile

Leider erinnert das Aussehen von Tk unter X11 immer noch an das angestaubte Motif. Joe English arbeitet daher an seiner Tile-Erweiterung [7]. Sie enthält einen Theming-Mechanismus, der die Optik von Tk enorm auffrischt und mit anderen GUI-Toolkits gleichziehen lässt. Ähnliche Theming-Techniken finden sich in den Widgets von Gnome/GTK und KDE/Qt, sogar Java/Swing lässt sich an die eigenen Wünsche anpassen. Ein noch nicht verabschiedeter TIP [8] empfiehlt, dass binäre Tcl-Installationen wie die von Suse, Debian oder Red Hat künftig neben Tk auch die Tile-Erweiterung mitbringen.

Für das aktuelle Tile-Paket gibt es noch keine fertig kompilierte Version, ähnlich wie bei Tcl 8.5 ist selbst kompilieren angesagt. Nach dem Laden der Quellen von Sourceforge folgen die üblichen Kommandos:

tar xvzf tile-0.6.4.tra.gz
cd tile-0.6.4/
./configure --with-tcl=/usr/local/tcl8.5/U
unix/ --with-tk=/usr/local/tk8.5/unix/
make && make install

Nach der Installation zeigen die Beispielanwendungen im »demos«-Unterverzeichnis, was Tile leistet. Abbildung 4 enthält Screenshots mit verschiedenen Themes unter Linux, Windows und Mac OS. Während die Plattformen Windows XP und Mac OS X einen einheitlichen Look aufweisen, den Tile hervorragend nachbildet (und teilweise die Originalbibliotheken verwendet), ist Linux eine schwierigere Basis. Je nach Benutzervorliebe sollte Tk wie KDE/Qt aussehen oder Gnome/GTK nachbilden. Zurzeit passt sich Tile mit den beiden Themes »clam« und »alt« gemäßigt modern und unauffällig in die Widget-Welt ein.



Abbildung 4: Die Tile-Demoanwendung zeigt eindrucksvoll, wie gut und modern Tk-Anwendungen heute aussehen. Das Revitalized-Theme links eignet sich für Linux, die mittlere Abbildung zeigt das Windows-XP-Theme und rechts ist die Aqua-Variante für Mac OS X zu sehen.

Abbildung 4: Die Tile-Demoanwendung zeigt eindrucksvoll, wie gut und modern Tk-Anwendungen heute aussehen. Das Revitalized-Theme links eignet sich für Linux, die mittlere Abbildung zeigt das Windows-XP-Theme und rechts ist die Aqua-Variante für Mac OS X zu sehen.

Das Dialogfenster in Abbildung 5 lehnt sich im Design an die Arbeiten von Karsten Lentzsch [9] für Swing an. Der Titelrahmen ist als reine Tk-Lösung unter [10] zu finden, das Eingabefeld verwendet die neuen Widgets aus Tile.

Das Neueste

Das diesjährige Tcl/Tk-Nutzertreffen ist vorbei, die Papers sind inzwischen auf der Homepage [13] veröffentlicht. Neben einigen Vorträgen über Tile (siehe Artikel) waren 3D-Anwendungen und die Logger-Erweiterung zwei interessante Themen.

Die an der Universität Augsburg entwickelte Graph-Bibliothek Goblin liegt nun in Version 2.7.1 vor [14]. Mit dem zugehörenden Graph-Editor Goblet (Abbildung 6) lassen sich Graphen modellieren und typische Probleme wie die kürzeste Verbindung zwischen zwei Punkten lösen. Anders als viele andere Pakete ist Goblin in einem 300-seitigen Handbuch hervorragend dokumentiert.

Sendmail kommt bei vielen Organisationen und Firmen als E-Mail-Server zum Einsatz. Über die Sendmail-Milter-Schnittstelle hängen Admins ihre eigenen Funktionen in den Datenfluss [15]. Muonics stellt mit Tclmilter eine Skripterweiterung vor, mit der sich diese Schnittstelle auch mit Tcl-Skripten nutzen lässt [16]. Sie steht unter der GPL.

Fertige Objekte

Will Duquette hat seiner Objektorientierungs-Erweiterung Snit [17] nun die Version 1.0 verpasst. Außer diversen Bugfixes hat sich seit der Federlesen-Folge zu Snit [18] nichts mehr geändert.

Nicht für alle C-Funktionen gibt es passend vorgefertigte Tcl-Erweiterungen. Wer eine Funktion aus einer C-Bibliothek verwenden will, aber keine Lust hat, dazu eine eigene Erweiterung zu entwickeln, greift zu Roger Critchlows Ffidl. Mit diesem Paket rufen Tcl-Skripte beliebige Funktionen aus beliebigen Shared Libraries auf [19].

Neue Kommandos

Tile ersetzt nicht einfach die alten Widgets aus Tk, sondern bringt eigene Kommandos mit. Diese liegen im Namespace »ttk« und heißen wie ihre Vorbilder aus Tk, zum Beispiel »ttk::button«. Wer ausschließlich Tile-Widgets verwenden will, kann alle Kommandos aus »ttk« in den globalen Namensraum importieren und sie künftig ohne Präfix verwenden:

namespace import -force ttk::*

Danach erscheinen überall die neuen Widgets, deren Aussehen schon ohne weiteres Zutun die normalen Tk-Elemente übertrifft. Leider verhalten sich die Tile-Widgets nicht immer exakt wie ihre Tk-Pendants. Während bei Tk die Optionen »-font« oder »-background« das Aussehen jedes einzelnen Widget kontrollieren, ist das bei Tile nicht mehr möglich. Die Optionen sind zwar noch erlaubt, aber wirkungslos. An ihre Stelle tritt die Stil-Definition:

style default klein.TLabel -font {
  Helvetica 10
}
ttk::label .normal -text "Normaler Text"
ttk::label .klein  -text "Kleiner Text" -style klein.TLabel

Die Vorgehensweise erinnert ein wenig an modernes Webdesign, bei dem Cascading Style Sheets (CSS) das Aussehen definieren. Allerdings ist die Stil-Definition für Tile noch nicht ausgereift: Es fehlt beispielsweise ein Kommando, das die Werte bestehender Stile abfragt. Auch ist es umständlicher, für ein einzelnes Widget eine Stildefinition anzulegen statt – wie bei Tk – dem Widget-Kommando Optionen mitzugeben. Bei den neueren Anwendungen stören die Unterschiede zwischen Tk und Tile kaum, beim Portieren bestehender Skripte erhöhen sie aber den Aufwand.

Abbildung 5: Dieser moderne Tcl/Tk-Dialog verwendet die Tile-Erweiterung. Das Design lehnt sich an die JGoodies-Erweiterung an, die sich um Aussehen und Usability von Java/Swing-Applikationen bemüht.

Abbildung 5: Dieser moderne Tcl/Tk-Dialog verwendet die Tile-Erweiterung. Das Design lehnt sich an die JGoodies-Erweiterung an, die sich um Aussehen und Usability von Java/Swing-Applikationen bemüht.

Obwohl sich die bisherigen Tk- und die neuen Tile-Widgets problemlos mischen lassen, ist das Ergebnis meist nicht besonders ansprechend – die Tk-Elemente passen nicht zur neuen Optik. Gelegentlich bleibt dem Entwickler aber kein anderer Weg: Für manche Tk-Widgets gibt es kein Tile-Gegenstück und die beliebten Megawidget-Sammlungen wie BWidgets [11] verwenden ebenfalls Tk. BWidgets bringt lange vermisste Steuer- und Eingabeelemente wie Combobox, Notebook, Baum (Tree) mit.

Richtige Mischung

Was die Migrationsprobleme vorhandener Anwendungen und die umständlichen Stil-Definitionen betrifft, ist noch weitere Arbeit notwendig. Dennoch ist das Tile-Paket inzwischen so etabliert, dass es für neue Anwendungen mindestens einen Blick lohnt. Erweiterungen wie Csaba Nemethis Tablelist [12] nutzen bereits Tile, andere werden folgen. Schließlich verspricht Tile zusammen mit den Verbesserungen von Tcl/Tk 8.5, dass die Skriptsprache wieder mit anderen GUIs gleichzieht. (fjl)

Abbildung 6: Mit dem Editor Goblet modellieren und bearbeiten die Benutzer Graphen, die sie mit der Goblin-Bibliothek weiterverwenden können.

Abbildung 6: Mit dem Editor Goblet modellieren und bearbeiten die Benutzer Graphen, die sie mit der Goblin-Bibliothek weiterverwenden können.

Infos

[1] Liste der Änderungen in Tcl 8.5: [http://wiki.tcl.tk/10630]

[2] Tcl-Quellen: [http://tcl.sf.net]

[3] Carsten Zerbst, “Klasse Federn – Objektorientierung mit Tcl”: Linux-Magazin 07/01, S. 131

[4] Donal K. Fellows und David S. Cargo, “TIP #111 – Dictionary Values and Manipulators”: [http://www.tcl.tk/cgi-bin/tct/tip/111.html]

[5] Dict als Tcl-only-Erweiterung: [http://wiki.tcl.tk/10609]

[6] Tcl-Modul für PostgreSQL: [http://pgfoundry.org/projects/pgtcl]

[7] Tile: [http://tktable.sf.net/tile/]

[8] Donal K. Fellows, “TIP #248 – Distribute Tile with Tk”: [http://www.tcl.tk/cgi-bin/tct/tip/248.html]

[9] JGoodies: [http://www.jgoodies.com]

[10] Dialograhmen mit Farbverlauf: [http://wiki.tcl.tk/14449]

[11] BWidget: [http://tcllib.sf.net]

[12] Csaba Nemethis mehrspaltige Listbox (Tablelist): [http://www.nemethi.de]

[13] Tcl/Tk-Nutzertreffen: [http://www.t-ide.com/tcl2005e/results_TCL2005E.html]

[14] Goblin (Graph Object Library for Network Programming Problems): [http://www.math.uni-augsburg.de/opt/goblin.html]

[15] Arndt Lückerath, “Hört, hört – die Milter-Schnittstelle von Sendmail”: Linux-Magazin 08/02, S. 64

[16] Tcl-Schnittstelle für Milter: [http://www.muonics.com/FreeStuff/TclMilter]

[17] Snit (Snit\’s Not Incr Tcl): [http://www.wjduquette.com/snit/]

[18] Carsten Zerbst, “Appetithäppchen – RSS-Newsfeeds lesen mit Tcl, Snit und TDOM”: Linux-Magazin 01/05, S. 102

[19] Ffidl: [http://elf.org/ffidl/] und [http://wiki.tcl.tk/ffidl]

Der Autor

Carsten Zerbst lebt und arbeitet in Hamburg. Seit er 1991 auf Linux stieß, ist Tcl/Tk die Skriptsprache seiner Wahl. Inzwischen arbeitet er im Bereich der Produktdatenverwaltung bei einem großen Dienstleister.

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben