Prof. Dr. Detlef Stern

Zettelstore 0.7

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

Was gibt es neues?

Zunächst habe ich die in Version 0.6 angekündigten Abkündigungen umgesetzt. Das war einfach. Es gibt nun nur noch die textuelle Angabe von Suchparametern, kein Gefrickel mit irgendwelchen URL-Parametern.

Entgegen meiner Ankündigung hat sich in diesem Bereich einiges geändert. Offensichtlich ist eine Änderung der Syntax für Zettelmarkup. Will man eine Suche angeben, so muss diese nicht mehr mit search:, sondern mit query: beginnen. Diese Änderung wird jedem Nutzer, der dieses Feature seit Version 0.6 verwendet, in der Zetteldarstellung sofort auffallen. Deshalb musste ich den behutsamen (aber komplexeren) Weg der Abkündigung nicht wählen.

Abfragen (statt Suchen)

Die Änderung zu query: lässt es ahnen, eine Query ist mehr als eine Search. Nach einem Suchbegriff können nun sog. Aktionen angegeben, abgetrennt durch einen senkrechten Balken (|). Aktionen können Aktionsparameter oder Aggregate sein. Ein mögliches Aggregat ist der Name eines Metadatums vom Datentyp „TagSet“, „Word“ oder „WordSet“. Wenn man sich z.B. die Schlagworte aller Zettel mit der Rolle „blogpost“ anzeigen lassen will, dann erreicht man dies durch die Query role:blogpost | tags. Damit werden übrigens die expliziten Listen aller Schlagworte und aller Rollen überflüssig. Diese lassen sich nun als | tags und | role darstellen. Mit | visibility werden die verwendeten Werte für Sichtbarkeit angezeigt und man erhält so einen guten Überblick, ob es Zettel gibt, die besser nicht für die Allgemeinheit bestimmt sind, wenn man seinen Zettelstore öffentlich betreibt.

Aktionsparameter sind NUMERIC (bzw. alles, was mit N beginnt), MAXn und MINn, wobei n eine positive Zahl ist. Mit NUMERIC wird die ausgegebene Liste zu einer Aufzählung. MAXn und MINn geben an, dass ein Aggregatswert nur dann ausgegeben werden soll, wenn die Anzahl der Zettel mit diesem Wert im angegebenen Bereich liegt. Damit kann man gut in seiner Zettelsammlung recherchieren.

Ach ja, und es gibt das Aggregat RSS. Damit wird ein RSS 2.0-konformer Feed erstellt. Wozu benötigt man das? Wenn man seinen Zettelstore öffentlich betreibt andere Änderungen automatisiert mitbekommen möchten. Es gibt nämlich sog. RSS-Reader, die genau solche RSS-Feeds abfragen. Häufiger Anwendungsfall: Blogs (aka Weblog). Ein Blog ohne RSS-Feed ist kein Blog. Um einen RSS-Feed für eigene Zettel mit der Rolle „blogpost“ zu erstellen, wobei diese nach Änderungsdatum sortiert sein sollen, aber nur für die letzten 30 Änderungen, dann reicht ein role:blogpost ORDER REVERSE published LIMIT 30 | RSS. Optional kann nach dem RSS noch ein TITLE ... angegeben werden. Alle Worte nach TITLE werden zum Titel des RSS-Feeds: role:blogpost ORDER REVERSE published LIMIT 30 | RSS TITLE Implizite Informationen. Wird kein TITLE angegeben, dann wird der Name des Zettelstores verwendet.

Suchbegriffe können nun mit einem logischen „oder“ verknüpft werden. Zum Beispiel liefert Europa OR role:blogpost alle Zettel, die entweder den Begriff „Europa“ enthalten oder die Rolle „blogpost“ verwenden.

Zettelstore als Blog

Nun kann der Zettelstore als Werkzeug für ein Blog verwendet werden, nicht nur das des Aggregats RSS. Bisher könnte der Zettelstore Inhalte nur dann ausliefern, wenn diese als Zettel abgelegt waren. Das ist für große Dateien nicht gut, denn der Zettelstore liest jeden Zettel vollständig in den Hauptspeicher ein, bevor er dessen Daten verarbeitet. Für große Präsentationsdateien, Bild-, Ton- oder Bewegtbilddateien kann das problematisch werden. Viel einfacher ist es, wenn diese Dateien an einem separaten Ort abgelegt werden. Dann lassen sich diese zwar nicht als Zettel verwendet, ist aber auch so gut wie nie nötig.

Der Zettelstore lässt sich so konfigurieren, dass man diesen separaten Ort als Dateiverzeichnis mittel asset-dir angibt. Dann werden die Dateien an diesem Ort vom Zettelstore unter Angabe des URL-Prefixes /assets/ ausgeliefert.

Ich nutze das für mein anderes Vorhaben, Agiles Studieren, wenn es zum jetziges Zeitpunkt (2002-09-18) auch noch nicht öffentlich ist. Diese Website wird mit dem Zettelstore betrieben werden. Die meisten Posts habe ich schon in Zettel konvertiert. Und die dort von mir zur Verfügung gestellten Präsentationen im PDF-Format, wie auch manche Bilder, lieferte ich über /assets/ aus. Wenn alles nach agilem Plan läuft, dann sollte spätestens Ende Oktober die Website umgestellt sein.

Wer weiß, vielleicht einmal auch diese Website.

Diagramme

Mit dem Zettelstore lassen sich nun Diagramme als Zettel ablegen. Es gibt zwar seit Version 0.3 die Möglichkeit, einfache Graphiken zu erstellen. Bei etwas komplexeren Diagrammen war dies haben nicht besonders hilfreich. Dies stellte sich für mich heraus, als ich meine Vorlesungsunterlagen für eine Lehrveranstaltung aus dem Bereich der Softwaretechnik auf den Zettelstore umstellte.

Ich behalf mir, indem ich die Zettelstore-basierte Software Zettel Presenter so erweiterte, dass diese Zettel mit speziell vorgegeben Inhalten selbst auswertete. Als Inhalt gab ich die textuelle Beschreibung nach Mermaid angab, die dann lokal als JavaScript im Browser interpretiert wird. Allerdings interferiert diese immer wieder mit der ebenfalls JavaScript-basierten Software für die eigentliche Präsentation (reveal.js).

Offenbar bin ich nicht der einzige, bei dem JavaScript-basierte Diagramme nicht so gut funktionieren. Und ich bin nicht der einzige, der für Graphiken / Diagramme SVG bevorzugt, Scalable Vector Graphics.

Der Entwickler der von mir verwendeten Software zur Versionskontrolle, Fossil, der auch die am häufigsten verwendete Datenbanksoftware SQLite erstellt hat, stand wohl vor einem ähnlichen Problem. Deshalb entwickelte er mit Pikchr eine Software, mit dessen Hilfe Diagramme in Textform beschrieben und zur graphischen Ausgabe nach SVG übersetzt werden. Leider in der Programmiersprache C. Der Zettelstore ist in Go programmiert.

Glücklicherweise bin ich nicht der einzige, der eine Version in Go hätte. Da alles Open-Source ist, kein Problem. Bis auf das Tun selbst, natürlich. Und so gibt es eine Portierung von Pikchr nach Go: gopikchr. Diese besitzt zum Glück keine Abhängigkeiten zu anderer Software und konnte so in den Zettelstore integriert werden.

Um Pikchr in einem Zettel nutzen zu können, ist es am einfachsten, als Zettelsyntax den Wert „pikchr“ anzugeben. Dieser Zettel lässt sich dann in anderen Zettel transkludieren.

Abkündigungen

Auch in dieser Version muss ich einige Merkmale des Zettelstore abkündigen. Ab Version 0.8 sind diese nicht mehr verfügbar.

So sind Schlagworte im Inhaltsbereich eines Zettels dann nicht mehr möglich. Natürlich noch als Metadaten, aber nicht mehr im Fließtext. Diese Schlagworte begannen, wie in vielen anderen Softwaresystemen, mit dem Zeichen #. (Ja, damit sind Hashtags gemeint.)

Problematisch ist aber, dass das Zeichen # auch in einigen anderen Zusammenhängen verwendet werden. Zum Beispiel im Englischen als Kennzeichen für eine Nummerierung (wie auch in Zettelmarkup). Das führte bei vielen Nutzern zu unerwünschten Schlagworten.

Zusätzlich war die interne Verarbeitung dieser Schlagworte etwas komplexer. Das äußerte sich in automatisch berechneten Metadaten content-tags und all-tags. Weg damit ab v0.8.

In der Programmierschnittstelle des Zettelstore (API) begannen die Namen einiger Parameter mit einem Unterstrich (_). Dies hatte seinen Ursprung in der früheren parameterbasierten Suche. Weg damit ab v0.8.

Und dank der erweiterten Abfragemöglichkeiten ist der API-Aufruf mit dem Endpunkt /m (aber nicht /m/ID) überflüssig. Kann also auch in v0.8 weg.

Ausblick

Die neue Version des Zettelstore ist seit einiger Zeit bei mir im produktiven Einsatz. Die Recherchemöglichkeiten mittels Suche / Abfragen helfen mir signifikant. Ebenso die erweiterten Möglichkeiten, Diagramme zu erstellen.

Mit der Version 0.7 gehe ich in die aber übernächster Woche beginnende Vorlesungszeit. Projektstudien auf Basis des Zettelstores werden diese Version nutzen. Vorlesungsunterlagen werden mit dieser Version präsentiert, und sie wird meinen Zweitblog neues Leben einhauchen.

Was wird die Version 0.8 bringen? Ich weiß es (noch) nicht. Die Abkündigungen sind in einer internen Fassung schon umgesetzt. Ansonsten gehe ich mal meine Zettel durch. Vielleicht baue ich ein Zettel Mail, mit dem man sich Zettel per Mail senden kann. Mal sehen.

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