Prof. Dr. Detlef Stern

Zettelstore 0.5

Die gute Nachricht für alle Nutzer des Zettelstore: Version 0.5 ist verfügbar. Dies gilt auch für die Bibliothek, um auf den Zettelstore zuzugreifen (a.k.a Zettelstore Client).

Seit dem letzten Release 0.4 sind mehr als vier Monate vergangen. Da erwarten viele viele Änderungen. Doch die Liste der Änderungen ist ähnlich lang, wie die der Vorversion. Warum?

Zum einen habe ich einen Hauptberuf und es war Vorlesungszeit seit Mitte März. Zum anderen habe ich einiges eher indirektes für den Zettelstore getan, indem ich die Präsentationssoftware Zettel Presenter weiter entwickelte (und nebenher fast alle „Foliensätze“ auf diese Software umstellte). Nicht zuletzt sind die Änderungen am Zettelstore durchaus erheblich, aber kaum für Nutzer sichtbar.

Aber eins nach dem anderen.

Neben der Web-basierten Oberfläche bietet der Zettelstore über seine externe Schnittstelle (API) die Möglichkeit, Zettel in unterschiedlichen Repräsentationen zu erhalten. Natürlich auch in dem Format, in dem der Zettel erstellt wurde. Das ist aber für externe Software wie den Zettel Presenter mühselig. Besser geht es, wenn die syntaktische Struktur eines Zettels übertragen wird. Dafür gab es schon länger eine JSON-basierte Struktur (ZJSON, d.h. Zettel JSON) und ein eigenes Format, dass ich „Native“ nannte. Dieses glich grob dem gleichnamigen Format der Software Pandoc. Diese nutzt intern ebenfalls ein JSON-basiertes Format, ZJSON ist dem nicht unähnlich. Pandoc ist auf eine bestimmte Weise eine Art Vorbild für den Zettelstore. Ich hoffe zusätzlich, einen Adapter für beide zu erstellen.

Das Native-Format diente fast nur der internen Fehlersuche. Eine Software zum Einlesen dieses Formates gibt es nicht. Also (fast) nutzlos. Irgendwann überlegte ich, ob es nicht ein einfach einzulesendes Format gibt. Ja gibt es. Seit den 1960er-Jahren. Wurde zunächst in der Programmiersprache Lisp eingesetzt (einer Sprache, mit der Probleme der starken KI versucht gelöst zu werden) und nennt sich S-Expressions. Es gibt im wesentlichen Symbole und Listen. Letztere können geschachtelt werden und sind durch runde Klammern erkennbar. Schon vor dem Internetzeitalter hat jeder Informatikstudent, der etwas auch sich hielt, wenigstens ein Framework zum Einlesen von S-Expression geschrieben. Viele sind sogar weiter gegangen, und haben einen einfachen Lisp- oder Scheme-Interpreter für diese programmiert.

Die S-Expressions des Zettelstore habe ich noch um Zeichenketten und positive, ganze Zahlen ergänzt und erste Funktionen geschrieben, um Zettel in eine S-Expression-Repräsentation umzuwandeln. Erstes Ergebnis: Zettelrepräsentationen als S-Expressions sind kürzer als die mit ZJSON (welches ich vom Platzbedarf versucht habe, klein zu halten).

Zweites Ergebnis: die Funktionen zu Einlesen von S-Expressions waren schnell programmiert. Die so entstandenen internen Datenstrukturen können auch gut zum Erzeugen von S-Expressions verwendet werden. Das wiederum könnte das Generieren der HTML-Repräsentation vereinfachen.

Drittes Ergebnis: die Repräsentation als S-Expression kann als Anweisung aufgefasst werden, wie die Struktur eines Zettels zu interpretieren ist. Nun kommt ins Spiel, dass schon in Lisp der Programmcode aussieht wie die Daten. Daten ist Programmcode ist Daten. Dieses Konzept besitzt den schönen Namen Homoikonizität. Das erleichtert das Interpretieren der Zettelstruktur, um z.B. daraus HTML zu generieren. JSON besitzt diese Eigenschaft nicht. Wenn man so will, enthält der Zettelstore nun einen Lisp-Interpreter.

Wenn man so will, dann sind mit dieser Version auch Anwendungen der KI gut möglich ;).

Basierte die gesamte externe Kommunikation des Zettelstore bis zur Version 0.4 auf JSON, so treten nun S-Expressions ergänzend hinzu. Zusätzlich hat sich dadurch ein Teil der internen Struktur verbessert. Selbst er Zettel Presenter kommuniziert mit dem Zettelstore in erheblichen Teilen auf Basis der S-Expressions. Einige Schnittstellen (API) basieren noch ausschließlich auf JSON. In kommenden Versionen ändert sich das auch.

Vermutlich sollte ich mal einen eigenen Post schreiben, um JSON und S-Expressions zu vergleichen.

Bevor ich es vergesse: der Zettelstore unterstützt Repräsentationen im (Z)JSON-Format, nun als S-Expressions, als HTML-Dokument, als Text-Format (das nur den Text eines Zettels enthält) und im Zettelmarkupformat (gut für die Migration von Markdown nach Zettelmarkup, wie z.B. bei meinen Vorlesungsunterlagen).

Diese ganze Umstellung nahm einen Großteil der vier Monate ein. Das mal so als Ausrede.

Ein weiter Aspekt der Version 0.5 ist die Verbesserung für den Fall, dass man einen Zettelstore auf einem Server betreiben möchte. Es wird nun erzwungen, dass Sitzungsinformationen stark verschlüsselt werden (vorher war das optional). Fehlgeschlagene Anmeldeversuche können geloggt werden, inklusive IP-Adresse des Verursachers. Die Größe einer Anfrage aus dem Internet ist beschränkt, um Server-Ressourcen zu schonen.

Auf der Web-basierten Oberfläche kann man, je nach Rolle eines Zettels, spezifisches CSS ausgeben lassen. Das ist z.B. nützlich, um „Folien-Zettel“ sich schon grob so anzeigen zu lassen, wie sie im Zettel Presenter aussehen können. Für Rolle, Titel und Syntax eines Zettels gibt es nun keine Default-Werte mehr. Die waren notwendig, als der Zettelstore noch nicht so robust war und fehlende Werte Programmabbrüche provozierten. Inhaltlich sind diese Default-Werte sowieso frag-würdig, z.B. wenn man Zettel von anderen übernehmen will. In der Web-basierten Oberfläche sind Rolle und Syntax eines Zettels mit einer datalist hinterlegt, um leichter mögliche / erlaubte Werte zu erfahren. Zusätzlich kann man nun Zettel speichern, um diese direkt weiter zu bearbeiten.

All diese Dinge kamen in der praktischen Arbeit mit dem Zettelstore auf. Übrigens nicht nur mir. Daher danke ich auch den Feedbackgebern.

Bis auf Fehlerkorrekturen und andere Kleinigkeiten ist dies der Umfang der Version 0.5. Die Bibliothek zum Arbeiten mit S-Expressions gibt es auch separat.

Was in der nächsten Version fertiggestellt wird, muss ich mir noch überlegen. Die übernommene Bibliothek für einfache Zeichnung enthält noch zu viele kleinste Problemfälle. Im Normalfall reicht sie, aber nur für einfachste Zeichnungen. Vielleicht ergänze ich sie um Pikchr. Diese scheint mir ausgereifter und besitzt eine Portierung nach Go. Das wäre mal zu evaluieren.

Irgendwie kam mir letztens die Idee von Zetteln mit einer Lebensdauer. Anwendungsbeispiel: Zettel über Personen oder nur temporär relevante Ereignisse. Ach, es gibt in meinem Zettelstore viele Zettel mit Ideen.

Neben dem Zettel Presenter soll es einen Zettel Blog geben, um Blogposts mit Hilfe von Zetteln zu erstellen. Darüber hinaus denke ich über ein Zettel Mail nach, mit dessen Hilfe eMails in Zettel verwandelt werden. Die Integration mit Pandoc hatte ich schon angesprochen.

Wenn man so will, stabilisiert sich das Produkt Zettelstore. Damit rücken weitere Anwendungen, die den Zettelstore so richtig nützlich machen, nach vorne,

Aber vielleicht kommt noch eine Anregung aus dem Kreis der Nutzer oder Interessierten dazu …

Update 2023-07-31: Die Bibliothek für S-Expressions ist umgezogen.