Die Klassifikation von Daten ist an sich ein interessantes Thema für Forschungsarbeiten. Ich liebe es, Informationen zu sammeln, die nützlich erscheinen, und habe immer versucht, logische Hierarchien für meine Dateien zu erstellen. Eines Nachts hatte ich einen Traum von einem schönen und praktischen Programm zur Kennzeichnung von Dateien mit Tags und beschloss, dass es so nicht weitergehen kann.
Das Problem hierarchischer Dateisysteme
Nutzer stehen oft vor der Herausforderung, einen geeigneten Speicherort für eine neue Datei auszuwählen, sowie der Schwierigkeit, ihre eigenen Dateien zu finden (manchmal sind die Dateinamen überhaupt nicht dazu gedacht, von einer Person erinnert zu werden).
Eine Lösung könnten semantische Dateisysteme sein, die in der Regel als Erweiterung des herkömmlichen Dateisystems fungieren. Verzeichnisse werden durch semantische Attribute ersetzt, die auch als Tags, Kategorien oder Metadaten bezeichnet werden. Ich werde häufiger den Begriff „Kategorie“ verwenden, da das Wort „Tag“ im Kontext von Dateisystemen manchmal seltsam klingt, insbesondere wenn „Untertags“ und „Tag-Aliase“ auftreten.
Das Zuordnen von Kategorien zu Dateien befreit in hohem Maße von den Problemen der Ablage und der Dateisuche: Wenn man sich (oder ahnt) nur an eine der zugewiesenen Kategorien einer Datei erinnert, wird die Datei nie aus den Augen geraten.
Diese Thematik wurde zuvor mehrfach auf Habré behandelt (, , , usw.), hier beschreibe ich meine Lösung.
Der Weg zur Umsetzung
Unmittelbar nach dem erwähnten Traum skizzierte ich in einem Notizbuch ein kommandozeilenbasiertes Interface, das die notwendigen Arbeiten mit Kategorien ermöglicht. Damals dachte ich, dass ich innerhalb von ein oder zwei Wochen einen Prototyp in Python oder Bash schreiben könnte, und danach müsste ich an der Entwicklung einer grafischen Benutzeroberfläche mit Qt oder GTK arbeiten. Die Realität stellte sich, wie immer, als viel härter heraus, und die Entwicklung zog sich.
Die ursprüngliche Idee war, ein Programm mit einer benutzerfreundlichen und prägnanten Befehlszeilenschnittstelle zu erstellen, das Kategorien erstellen, löschen, Kategorien Dateien zuweisen und Kategorien von Dateien entfernen kann. Ich nannte das Programm vitis.
Der erste Versuch, es zu erstellen vitis es endete ohne Ergebnis, da viel Zeit für Arbeit und das Institut aufgebracht wurde. Der zweite Versuch war bereits etwas: Es gelang, das geplante Projekt zur Masterarbeit abzuschließen und sogar einen Prototyp einer GTK-Oberfläche zu erstellen. Doch diese Version erwies sich als so unzuverlässig und unhandlich, dass ich vieles neu überdenken musste.
Die dritte Version habe ich selbst lange genutzt und dabei mehrere tausend meiner Dateien in Kategorien umgewandelt. Dies wurde unter anderem durch die implementierte Bash-Autovervollständigung erheblich erleichtert. Einige Probleme, wie das Fehlen automatischer Kategorien und die Möglichkeit, Dateien mit demselben Namen zu speichern, blieben jedoch bestehen, und das Programm kämpfte bereits mit seiner eigenen Komplexität. So kam ich zu der Notwendigkeit, die Probleme der Entwicklung komplexer Software zu lösen: Detaillierte Anforderungen zu formulieren, ein System für funktionale Tests zu entwickeln, Anleitungen zur Verpackung zu studieren und vieles mehr. Jetzt habe ich das Ziel erreicht, sodass dieses bescheidene Werk der Community zur Verfügung gestellt werden kann. Eine so spezifische Dateiverwaltung wie die Verwaltung über das Konzept von Kategorien berührt unerwartete Fragen und Probleme, und deren Lösung hat um mich herum fünf weitere Projekte hervorgebracht, von denen einige im Artikel erwähnt werden. vitis Bis heute vitis habe ich keine grafische Oberfläche erworben, aber der Komfort der Nutzung von Dateikategorien über die Kommandozeile überwiegt für mich bereits alle Vorteile eines herkömmlichen grafischen Dateimanagers.
Beispiele zur Verwendung
Lass uns einfach anfangen — erstellen wir eine Kategorie:
vitis create MusikFügen wir zum Beispiel ein Stück hinzu:
vitis assign Musik -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3"Den Inhalt der Kategorie „Musik“ kann man mit dem Unterbefehl „show“ anzeigen:
vitis show MusikWiedergabe ist mit dem Unterbefehl „open“ möglich
vitis open MusikDa wir in der Kategorie „Musik“ nur eine Datei haben, wird nur diese abgespielt. Für das Öffnen von Dateien mit den Standardprogrammen habe ich ein separates Dienstprogramm erstellt vts-fs-open (Standardtools wie xdg-open oder mimeopen waren aus verschiedenen Gründen für mich nicht akzeptabel; aber wenn nötig, können Sie in den Einstellungen ein anderes Dienstprogramm für das universelle Öffnen von Dateien angeben). Dieses Dienstprogramm funktioniert gut auf verschiedenen Distributionen mit unterschiedlichen Desktop-Umgebungen, daher empfehle ich, zusammen mit vitis auch dieses zu installieren.
Sie können auch direkt das Programm angeben, um Dateien zu öffnen:
vitis open Musik --app qmmp
Lassen Sie uns noch Kategorien erstellen und Dateien mit Hilfe von „assign“ hinzufügen. Wenn Dateien nicht existierenden Kategorien zugewiesen werden, wird eine Anfrage zur Erstellung gestellt. Überflüssige Anfragen können vermieden werden, wenn das Flag —yes verwendet wird.
vitis assign Programmierung R -f "Einführung in R.pdf" "Statistik-Paket R: Theorie der Wahrscheinlichkeiten und Mathematische Statistik.pdf" --yesJetzt möchten wir der Datei „Statistik-Paket R: Theorie der Wahrscheinlichkeiten und Mathematische Statistik.pdf“ die Kategorie „Mathematik“ hinzufügen. Wir wissen, dass diese Datei bereits die Kategorie „R“ hat, daher können wir den Kategorienpfad aus dem Vitis-System verwenden:
vitis assign Mathematik -v "R/Statistik-Paket R: Theorie der Wahrscheinlichkeiten und Mathematische Statistik.pdf"Glücklicherweise ermöglicht die Bash-Autovervollständigung, dies einfach zu bewerkstelligen.
Schauen wir uns an, was dabei herausgekommen ist, indem wir das Flag —categories verwenden, um die Liste der Kategorien für jede Datei anzuzeigen:
vitis show R --categories
Beachten Sie, dass den Dateien auch automatische Kategorien basierend auf Format, Typ (die Formate vereint) und Dateiendungen zugewiesen wurden. Diese Kategorien können bei Bedarf deaktiviert werden. Später werde ich unbedingt deren Namen lokalisieren.
Fügen wir zur Abwechslung noch etwas zu „Mathematik“ hinzu:
vitis assign Mathematik -f "Mathematische Analysis - 1984.pdf" Perelman_Fesselnde_Mathematik_1927.djvu Jetzt beginnt das Interessante. Anstelle von Kategorien können Ausdrücke mit Vereinigungs-, Schnitt- und Differenzoperationen geschrieben werden, das heißt, es können Mengenoperationen verwendet werden. Zum Beispiel ergibt die Schnittmenge „Mathematik“ und „R“ eine Datei.
vitis show R i: MathematikZiehen wir die Erwähnungen der Sprache „R“ aus „Mathematik“ ab:
vitis show Mathematik R #oder vitis show Mathematik c: RWir können Musik und die Sprache R ohne Ziel zusammenführen:
vitis show Musik u: RDas Flag -n ermöglicht es, aus dem Ergebnis der Abfrage die benötigten Dateien nach Nummern und/oder Bereichen auszuwählen, zum Beispiel: -n 3-7, oder etwas komplizierter: -n 1,5,8-10,13. Es ist oft nützlich mit dem Subbefehl open, der es ermöglicht, benötigte Dateien aus der Liste zu öffnen.

Obwohl wir uns von der Verwendung der üblichen Verzeichnisstruktur entfernen, ist es oft nützlich, verschachtelte Kategorien zu haben. Lassen Sie uns eine Unterkategorie „Statistik“ für die Kategorie „Mathematik“ erstellen und diese Kategorie der passenden Datei hinzufügen:
vitis create Mathematik/Statistik
vitis assign Mathematik/Statistik -v "R/Einführung in R.pdf"
vitis show Mathematik --categories
Wir können sehen, dass diese Datei jetzt die Kategorie „Mathematik/Statistik“ anstelle von „Mathematik“ hat (überflüssige Links werden verfolgt).
Es kann unpraktisch sein, den vollständigen Pfad anzugeben, also erstellen wir ein „globales“ Pseudonym:
vitis assign Mathematik/Statistik -a Statistik
vitis show Statistik
Nicht nur normale Dateien
Internet-Links
Um die Speicherung von Informationen zu vereinheitlichen, wäre es hilfreich, zumindest Links zu Internetressourcen zu kategorisieren. Und das ist möglich:
vitis assign Habr Farbabweichung -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yesAn einem speziellen Ort wird eine Datei mit dem Titel der HTML-Seite und der Endung .desktop erstellt. Dies ist das traditionelle Format für Verknüpfungen in GNU/Linux. Solche Verknüpfungen erhalten automatisch die Kategorie NetworkBookmarks.
Natürlich werden Verknüpfungen erstellt, um sie zu verwenden:
vitis open FarbabweichungDie Ausführung des Befehls öffnet im Browser den gerade gespeicherten Link. Kategorisierte Verknüpfungen zu Internetquellen können als Ersatz für Lesezeichen im Browser dienen.
Dateifragmente
Es ist auch hilfreich, Kategorien für einzelne Dateifragmente zu haben. Nicht schlecht, oder? Aber die aktuelle Implementierung betrifft vorerst nur normale Textdateien, Audio- und Videodateien. Angenommen, Sie möchten einen bestimmten Abschnitt eines Konzerts oder einen lustigen Moment aus einem Film markieren, dann können Sie bei der Verwendung von assign die Flags —fragname, —start, —finish verwenden. Lassen Sie uns die Titelmelodie von „DuckTales“ speichern:
vitis assign vitis assign -c Titelmelodien -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro"
vitis open TitelmelodienTatsächlich findet keine Dateibeschneidung statt, stattdessen wird eine Zeigerdaten-Datei auf das Fragment erstellt, die den Datei-Typ, den Pfad zur Datei, den Anfang und das Ende des Fragments beschreibt. Das Erstellen und Öffnen von Zeigern auf Fragmente wird den speziell von mir für diese Zwecke erstellten Dienstprogrammen — mediafragmenter und fragplayer — delegiert. Das erste erstellt, das zweite öffnet. Im Falle von Audio- und Videoaufnahmen erfolgt das Abspielen der Mediendatei von einer bestimmten bis zu einer bestimmten Position mit dem VLC-Player, daher muss dieser auch im System installiert sein. Zuerst wollte ich das auf Basis von mplayer machen, aber dort war das Positionieren aus irgendeinem Grund sehr fehlerhaft.
In unserem Beispiel wird die Datei „Duck Tales intro.fragpointer“ erstellt (sie wird an einem speziellen Ort abgelegt), und dann wird ein Fragment ab Beginn der Datei (da –start beim Erstellen nicht angegeben wurde) bis zur Marke von 59 Sekunden abgespielt, wonach VLC geschlossen wird.
Ein weiteres Beispiel — wir haben beschlossen, einen bestimmten Auftritt eines bekannten Künstlers zu kategorisieren:
vitis assign Лепс "Спасите наши души" -f Григорий Лепc - Konzert Pарус - Lieder von Wladimir Wyssozki.mp4 --fragname "Спасите наши души" --start 00:32:18 --finish 00:36:51
vitis open "Спасите наши души"Beim Öffnen wird die Datei an der gewünschten Position geladen und schließt nach viereinhalb Minuten.
Wie das alles funktioniert + zusätzliche Möglichkeiten
Speichern von Kategorien
Zu Beginn der Überlegungen zur Organisation eines semantischen Dateisystems kamen mir drei Möglichkeiten in den Sinn: durch Speicherung symbolischer Links, mittels einer Datenbank, durch Beschreibung in XML. Die erste Methode setzte sich durch, da sie auf der einen Seite einfach zu implementieren ist, und auf der anderen Seite hat der Nutzer die Möglichkeit, die Kategorien direkt im Dateisystem anzusehen (was bequem und wichtig ist). Zu Beginn der Nutzung vitis wird im Home-Verzeichnis des Benutzers ein Verzeichnis „Vitis“ und eine Konfigurationsdatei „.config/vitis/vitis.conf“ erstellt. In ~/Vitis werden Verzeichnisse angelegt, die den Kategorien entsprechen, und in diesen Kategorie-Verzeichnissen werden symbolische Links zu den Originaldateien erstellt. Die Aliase der Kategorien sind ebenfalls einfach Links zu ihnen. Natürlich könnte das Vorhandensein des Verzeichnisses „Vitis“ im Home-Verzeichnis einige Benutzer stören. Wir können zu jedem anderen Ort wechseln:
vitis service set path /mnt/MyFavoriteDisk/Vitis/Irgendwann wird klar, dass es wenig sinnvoll ist, die an verschiedenen Orten verstreuten Dateien zu kategorisieren, da sich ihre Standorte ändern können. Daher habe ich mir zunächst ein Verzeichnis erstellt, in das ich alles einfach ablegte und alles kategorisierte. Dann dachte ich, dass es sinnvoll wäre, diesen Prozess auf Programmebene zu gestalten. So entstand das Konzept des „Dateiraums“. Zu Beginn der Nutzung vitis wäre es hilfreich, so einen Ort einzurichten (dort werden alle benötigten Dateien abgelegt) und die automatische Speicherung zu aktivieren:
vitis service add filespace /mnt/MyFavoriteDisk/Filespace/
vitis service set autosave yesOhne Autowiederherstellung ist das Flag —save erforderlich, wenn Sie die Unterbefehl «assign» verwenden und die hinzugefügte Datei im Dateispeicher speichern möchten.
Darüber hinaus können mehrere Dateispeicher hinzugefügt und deren Prioritäten geändert werden, was nützlich sein kann, wenn viele Dateien vorhanden sind, die auf verschiedenen Medien gespeichert sind. Ich werde diese Möglichkeit hier nicht behandeln; Details sind in der Programmhilfe zu finden.
Migration des semantischen Dateisystems
So oder so kann das Verzeichnis Vitis und die Dateispeicher theoretisch manchmal von einem Ort zum anderen verschoben werden. Um dies funktionsfähig zu machen, habe ich ein separates Tool erstellt link-editor, das Massenbearbeitungen von Links vornehmen kann, indem es Teile des Pfads durch andere ersetzt:
cp -r /mnt/MyFavoriteDisk/Vitis/ ~/Vitis
link-editor -d ~/Vitis/ -f /mnt/MyFavoriteDisk/Vitis/ -r ~/Vitis/ -R
cp -r /mnt/MyFavoriteDisk/Filespace/ ~/MyFiles
link-editor -d ~/Vitis/ -f /mnt/FlashDrive-256/Filespace/ -r ~/MyFiles -RIm ersten Fall, nachdem wir von /mnt/MyFavoriteDisk/Vitis/ in das Home-Verzeichnis umgezogen sind, werden symbolische Links, die mit Aliassen verknüpft sind, bearbeitet. Im zweiten Fall werden nach der Änderung des Standorts des Dateispeichers alle Links in Vitis entsprechend der Anfrage zur Ersetzung eines Teils ihres Pfades aktualisiert.
Automatische Kategorien
Wenn Sie den Befehl vitis service get autocategorization, ausführen, können Sie sehen, dass standardmäßig die Zuweisung automatischer Kategorien nach Format (Format und Typ) und Dateiendung (Erweiterung) konfiguriert ist.
Dies ist nützlich, wenn Sie beispielsweise etwas unter PDFs suchen oder sehen möchten, was Sie an EPUB und FB2 gespeichert haben; Sie können einfach die Anfrage ausführen
vitis show Format/MOBI u: Format/FB2Es hat sich ergeben, dass die Standardwerkzeuge von GNU/Linux wie file oder mimetype für mich nicht geeignet sind, da sie nicht immer die Formate korrekt identifizieren. Daher musste ich meine eigene Implementierung basierend auf Dateisignaturen und Erweiterungen erstellen. Das Thema der Dateiformaterkennung ist allgemein ein interessantes Forschungsfeld und verdient einen eigenen Artikel. Ich kann bisher sagen, dass ich möglicherweise nicht für alle Formate weltweit eine ehrliche Erkennung vorgesehen habe, aber insgesamt funktioniert es bereits recht gut. Allerdings wird EPUB derzeit als ZIP-Format erkannt (was im Grunde gerechtfertigt ist, aber in der Praxis ist dies nicht als normales Verhalten zu betrachten). Bis zu einem gewissen Punkt sollten Sie diese Funktion als experimentell betrachten und mir von Bugs berichten. In seltsamen Situationen kann man immer die Kategorien basierend auf den Dateierweiterungen verwenden, zum Beispiel Extension/epub.
Wenn die automatischen Kategorien nach Format aktiviert sind, sind auch automatische Kategorien eingeschaltet, die einige Formate kombinieren, wie zum Beispiel: „Archive“, „Bilder“, „Video“, „Audio“ und „Dokumente“. Für diese Unterkategorien werden ebenfalls lokalisierte Bezeichnungen erstellt.
Was nicht gesagt wurde
vitis hat sich zu einem sehr vielseitigen Werkzeug entwickelt, und es ist schwierig, alles auf einmal zu erfassen. Kurz erwähne ich, was man noch machen kann:
- Kategorien können gelöscht und von Dateien entfernt werden;
- Suchergebnisse können in ein angegebenes Verzeichnis kopiert werden;
- Dateien können als Programme ausgeführt werden;
- Der Befehl show hat viele Optionen, zum Beispiel Sortierung nach Name/Änderungsdatum oder Zugriff/Größe/Erweiterung, Anzeige von Dateieigenschaften und Pfaden zu den Originalen, Anzeige von versteckten Dateien und mehr;
- Beim Speichern von Links zu Internetquellen können auch lokale Kopien von HTML-Seiten gespeichert werden.
Alle Einzelheiten finden Sie in der Benutzerdokumentation.
Aussichten
Skeptiker sagen oft, dass „niemand diese Tags selbst setzen wird“. An meinem Beispiel kann ich das Gegenteil beweisen: Ich habe bereits über sechstausend Dateien kategorisiert, mehr als tausend Kategorien und Synonyme erstellt, und es hat sich gelohnt. Mit einem einzigen Befehl vitis open Plan öffnen Sie Ihre To-Do-Liste oder mit einem einzigen Befehl vitis open LaTeX öffnen Sie das Buch von Stolyarov über das Layout-System LaTeX, dann ist es schon moralisch schwierig, das Dateisystem „auf die alte Art“ zu verwenden.
Auf dieser Grundlage entstehen eine Reihe von Ideen. Zum Beispiel könnte man ein automatisches Radio entwickeln, das thematische Musik entsprechend dem aktuellen Wetter, Feiertagen, Wochentagen, Tageszeiten oder dem Jahr abspielt. Ein weiteres verwandtes Thema wäre ein Musikplayer, der über Kategorien Bescheid weiß und Musik anhand von Ausdrücken mit Operationen über die Kategorien wie über Mengen wiedergeben kann. Nützlich wäre auch ein Daemon, der das Verzeichnis 'Downloads' überwacht und vorschlägt, neue Dateien zu kategorisieren. Und natürlich wäre es sinnvoll, einen ordentlichen grafischen semantischen Dateimanager zu erstellen. Ich habe sogar einmal für ein Unternehmen einen Webservice zur gemeinschaftlichen Verwendung von Dateien erstellt, aber er war nicht prioritär und wurde obsolet, obwohl er ein hohes Funktionsniveau erreicht hatte. (In Anbetracht der großen Änderungen in der vitis, ist er nun nicht mehr nutzbar.)
hier ist eine kleine Demo

Fazit
Vitis – ist nicht der erste Versuch, die Arbeitsweise mit Daten radikal zu ändern, aber ich hielt es für wichtig, meine Ideen umzusetzen und die Implementierung öffentlich unter der GNU GPL-Lizenz zur Verfügung zu stellen. Zur Bequemlichkeit wurde ein deb-Paket für x86-64 erstellt, das auf allen modernen Debian-Distributionen arbeiten sollte. Auf ARM gab es einige kleinere Schwierigkeiten (während alle anderen Programme, die mit vitis, zusammenhängen, normal funktionieren), aber in Zukunft wird auch für diese Plattform (armhf) ein funktionierendes Paket erstellt. Die Erstellung von RPM-Paketen habe ich vorerst eingestellt, da es Probleme mit Fedora 30 gab und es problematisch ist, sich auf viele RPM-Distributionen zu verteilen, aber später wird es trotzdem für ein paar von ihnen Pakete geben. Bis dahin kann man nutzen make && make install oder checkinstall.
Vielen Dank für Ihre Aufmerksamkeit! Ich hoffe, dieser Artikel und dieses Projekt können nützlich sein.
Quelle: habr.com
