Categorie invece di directory, o Sistema di file semantico per Linux

La classificazione dei dati è di per sé un tema interessante per la ricerca. Amo collezionare informazioni che sembrano utili e ho sempre cercato di creare gerarchie logiche per le mie cartelle. Un giorno, in sogno, ho visto un programma bello e pratico per assegnare tag ai file e ho deciso che non potevo più vivere così.

Il problema dei file gerarchici

Gli utenti si trovano spesso a dover scegliere dove salvare un nuovo file e a dover affrontare la difficoltà di trovare i propri file (a volte i nomi dei file non sono affatto progettati per essere memorizzati da un essere umano).

Una possibile soluzione sono i file system semantici, che di solito sono un'estensione dei tradizionali file system. In essi, le directory sono sostituite da attributi semantici, noti anche come categorie, tag o metadati. Userò più spesso il termine «categoria», poiché nel contesto dei file system la parola «tag» a volte suona strana, specialmente quando entrano in gioco «sottotag» e «alias dei tag».

L'assegnazione delle categorie ai file elimina in gran parte i problemi di spazio di archiviazione e ricerca: se ricordi (o sospetti) almeno una delle categorie assegnate a un file, questo non andrà mai perso di vista.

In precedenza, su Habr è stata sollevata più di una volta questa questione (una volta, due volte, tre volte, quattro e altri), qui descrivo la mia soluzione.

Il percorso verso l'implementazione

Subito dopo il sogno menzionato, ho descritto nel mio taccuino un'interfaccia a riga di comando che garantisce il necessario lavoro con le categorie. Allora pensai che in una settimana o due avrei potuto scrivere un prototipo usando Python o Bash, e poi sarebbe stata necessaria un'attività per creare un'interfaccia grafica con Qt o GTK. La realtà, come sempre, si è rivelata molto più dura, e lo sviluppo si è prolungato.

L'idea iniziale era di realizzare prima di tutto un programma con un'interfaccia a riga di comando comoda e concisa, che avrebbe creato, eliminato categorie, assegnato categorie ai file e rimosso categorie dai file. Ho chiamato il programma vitis.

Il primo tentativo di creare vitis è finita senza risultati, poiché troppo tempo era dedicato al lavoro e all'università. La seconda opportunità è stata già qualcosa: sono riuscito a completare il progetto pianificato per la mia tesi di laurea e persino a realizzare un prototipo dell'interfaccia GTK. Ma quella versione si è rivelata così poco affidabile e scomoda che ho dovuto ripensare molto.

Ho utilizzato la terza versione per un lungo periodo, trasferendo migliaia dei miei file in categorie. Questo è stato fortemente facilitato dalla funzionalità di completamento automatico di bash. Tuttavia, alcuni problemi, come la mancanza di categorie automatiche e la possibilità di archiviare file con lo stesso nome, sono rimasti, mentre il programma già soffriva per la sua complessità. Così sono arrivato alla necessità di affrontare i problemi nello sviluppo di software complesso: scrivere requisiti dettagliati, sviluppare un sistema di testing funzionale, studiare le istruzioni per l'imballaggio e molto altro. Ora ho raggiunto ciò che avevo in mente, quindi questa modesta creazione può essere presentata alla comunità open source. Una gestione dei file così specifica, come quella attraverso un concetto di categorie, solleva questioni e problemi inaspettati, e la loro risoluzione. vitis ha generato intorno a sé altri cinque progetti, alcuni dei quali saranno menzionati nell'articolo. Fino ad ora vitis non ho acquistato l'interfaccia grafica, ma la facilità d'uso delle categorie di file dalla riga di comando supera già per me qualsiasi vantaggio di un normale file manager grafico.

Esempi di utilizzo

Iniziamo con qualcosa di semplice: creiamo una categoria:

vitis create Musica

Aggiungiamo ad essa, per esempio, qualche composizione:

vitis assign Musica -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3"

Puoi visualizzare il contenuto della categoria "Musica" con il sottocomando "show":

vitis show Musica

Puoi riprodurla utilizzando il sottocomando "open".

vitis open Musica

Poiché nella nostra categoria "Musica" c'è solo un file, verrà avviato solo quello. Per aprire file con i programmi predefiniti, ho creato un'utilità separata. vts-fs-open (gli strumenti standard come xdg-open o mimeopen non mi soddisfacevano per vari motivi; ma, se lo desideri, nelle impostazioni puoi specificare un'altra utilità per l'apertura universale dei file). Questa utilità funziona bene con diverse distribuzioni e ambienti desktop, quindi consiglio di installarla insieme a vitis.

Puoi anche specificare direttamente il programma per aprire i file:

vitis open Musica --app qmmp

Categorie invece di directory, o Sistema di file semantico per Linux

Creiamo ancora categorie e aggiungiamo file utilizzando «assign». Se i file sono assegnati a categorie che non esistono ancora, viene emessa una richiesta per la loro creazione. È possibile evitare richieste superflue se si utilizza il flag —yes.

vitis assign Programming R -f "Introduzione a R.pdf" "Pacchetto statistico R: teoria delle probabilità e statistica.pdf" --yes

Ora vogliamo aggiungere al file "Pacchetto statistico R: teoria delle probabilità e statistica.pdf" la categoria "Matematica". Sappiamo che questo file ha già la categoria "R" e quindi possiamo utilizzare il percorso della categoria dal sistema Vitis:

vitis assign Matematica -v "R/Pacchetto statistico R: teoria delle probabilità e statistica.pdf"

Fortunatamente, l'autocompletamento bash renderà questo facile da realizzare.

Controlliamo cosa abbiamo ottenuto, utilizzando il flag —categories per vedere l'elenco delle categorie per ogni file:

vitis show R --categories

Categorie invece di directory, o Sistema di file semantico per Linux

Nota che ai file sono state anche assegnate categorie automatiche in base al formato, tipo (unisce formati) ed estensione dei file. Queste categorie possono essere disattivate se lo si desidera. In seguito, farò sicuramente la localizzazione dei loro nomi.

Aggiungiamo per varietà qualcos'altro in "Matematica":

vitis assign Matematica -f "Analisi Matematica - 1984.pdf" Perelman_Matematica_intrigante_1927.djvu 

E adesso inizia la parte interessante. Invece di categorie, possiamo scrivere espressioni con operazioni di unione, intersezione e differenza, ovvero utilizzare operazioni sugli insiemi. Ad esempio, l'intersezione di «Matematica» con «R» restituirà un file.

vitis show R i: Matematica

Sottraiamo dalla «Matematica» i riferimenti al linguaggio «R»:

vitis show Matematica R #oppure vitis show Matematica c: R

Possiamo unire senza scopo musica e linguaggio R:

vitis show Musica u: R

Il flag -n permette di «estrarre» dal risultato della query i file desiderati per numero e/o intervalli, ad esempio, -n 3-7, o qualcosa di più complesso: -n 1,5,8-10,13. Spesso è utile con il sottocomando open, che consente di aprire i file desiderati dalla lista.

Categorie invece di directory, o Sistema di file semantico per Linux

Anche se ci allontaniamo dall'uso della normale gerarchia delle directory, è spesso utile avere categorie nidificate. Creiamo una sottocategoria «Statistica» nella categoria «Matematica» e aggiungiamo questa categoria al file appropriato:

vitis create Matematica/Statistica

vitis assign Matematica/Statistica -v "R/Introduzione a R.pdf"

vitis show Matematica --categories

Categorie invece di directory, o Sistema di file semantico per Linux

Possiamo vedere che questo file ora ha la categoria "Matematica/Statistica" anziché "Matematica" (i link superflui vengono tracciati).

Riferirsi al percorso completo può essere scomodo, creiamo un alias "globale":

vitis assign Matematica/Statistica -a Statistica

vitis show Statistica

Categorie invece di directory, o Sistema di file semantico per Linux

Non solo file ordinari

Link internet

Per uniformare l'archiviazione di qualsiasi informazione, sarebbe utile, almeno, categorizzare i link alle risorse online. E questo è possibile:

vitis assign Habr ColoreAnomalia -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yes

In un luogo specifico verrà creato un file con il titolo della pagina HTML e l'estensione .desktop. Questo è il formato tradizionale per i collegamenti in GNU/Linux. Tali collegamenti ricevono automaticamente la categoria NetworkBookmarks.

Naturalmente, i collegamenti vengono creati per essere utilizzati:

vitis open ColoreAnomalia

L'esecuzione del comando porta all'apertura nel browser del link appena salvato. I collegamenti categorizzati alle fonti online possono fungere da sostituto ai segnalibri del browser.

Frammenti di file

È anche utile avere categorie per segmenti di file specifici. Non è male, vero? Ma l'attuale implementazione riguarda solo file di testo, audio e video comuni. Per esempio, se è necessario contrassegnare un determinato estratto di un concerto o un momento divertente in un film, usando assign puoi fare uso dei flag —fragname, —start, —finish. Salviamo l'introduzione da "Duck Tales":

vitis assign vitis assign -c Intros -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Duck Tales intro"

vitis open Intros

In realtà, non c'è alcuna troncatura dei file, ma viene invece creato un file puntatore a un frammento, in cui viene descritto il tipo di file, il percorso del file, l'inizio e la fine del frammento. La creazione e l'apertura dei puntatori ai frammenti sono delegate a utility specificamente sviluppate da me per questi scopi: mediafragmenter e fragplayer. Il primo crea, il secondo apre. Nel caso di file audio e video, l'avvio del file multimediale da una posizione specifica a un'altra avviene tramite il lettore VLC, quindi deve essere presente nel sistema. Inizialmente volevo farlo basandomi su mplayer, ma per qualche motivo la posizione non era molto precisa in quel momento.
Nel nostro esempio, viene creato un file "Duck Tales intro.fragpointer" (che viene posizionato in un luogo particolare), e poi viene riprodotto il frammento dall'inizio del file (poiché —start non è stato specificato durante la creazione) fino al segno dei 59 secondi, dopo di che VLC si chiude.

Un altro esempio: abbiamo deciso di categorizzare una specifica esibizione a un concerto di un qualche artista famoso:

vitis assign Лепс "Salvate le nostre anime" -f Григорий Лепc - Concerto Pарус - canzoni di Vladimir Vysotsky.mp4 --fragname "Salvate le nostre anime" --start 00:32:18 --finish 00:36:51

vitis open "Salvate le nostre anime"

Quando apri il file, verrà riprodotto dalla posizione desiderata e si chiuderà dopo quattro minuti e mezza.

Come funziona tutto ciò + funzionalità aggiuntive

Archiviazione delle categorie

All'inizio della progettazione di un sistema di file semantico, mi sono venuti in mente tre metodi: attraverso l'archiviazione di collegamenti simbolici, tramite un database, attraverso una descrizione in XML. Ha vinto il primo metodo, poiché, da un lato, è semplice da implementare e, dall'altro, l'utente ha la possibilità di visualizzare le categorie direttamente dal file system (ed è comodo e importante). All'inizio dell'uso vitis nella directory home dell'utente viene creata una directory «Vitis» e un file di configurazione «.config/vitis/vitis.conf». Nella ~/Vitis vengono create directory corrispondenti alle categorie, e in queste directory-categorie vengono create delle link simboliche ai file originali. I sinonimi delle categorie sono solo dei link a essi. Naturalmente, la presenza della directory «Vitis» nella home di un utente potrebbe non piacere a qualcuno. Possiamo cambiare in qualsiasi altro luogo:

vitis service set path /mnt/MyFavoriteDisk/Vitis/

a un certo punto diventa chiaro che categorizzare file sparsi in vari luoghi non ha molto senso, poiché la loro posizione può variare. Perciò, inizialmente mi sono creato una directory in cui ho semplicemente salvato tutto, assegnando a tutto questo delle categorie. Poi ho pensato che sarebbe stato utile formalizzare questo aspetto a livello programmatico. Così è nato il concetto di «spazio file». All'inizio dell'utilizzo vitis sarebbe utile configurare subito un tale luogo (dove verranno archiviati tutti i file di cui abbiamo bisogno) e attivare il salvataggio automatico:

vitis service add filespace /mnt/MyFavoriteDisk/Filespace/
vitis service set autosave yes

Senza il salvataggio automatico quando si usa il sottocomando «assign», sarà necessario un flag —save se si desidera salvare il file aggiunto nello spazio di archiviazione.

Inoltre, è possibile aggiungere più spazi di archiviazione e modificare le loro priorità, cosa che può essere utile quando ci sono molti file e sono conservati su diversi supporti. Qui non discuterò di questa possibilità; per i dettagli, si possono consultare le informazioni del programma.

Migrazione del file system semantico

In un modo o nell'altro, la directory Vitis e gli spazi di archiviazione possono teoricamente spostarsi di volta in volta. Per riportarli a funzionare, ho creato un'utilità separata link-editor, che può modificare massivamente i link, sostituendo parti del percorso con altre:

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 -R

Nel primo caso, dopo essersi trasferiti da /mnt/MyFavoriteDisk/Vitis/ alla directory home, vengono modificate le link simboliche associate agli alias. Nel secondo caso, dopo aver cambiato la posizione dello spazio file, tutte le link in Vitis vengono aggiornate con le nuove in base alla richiesta di sostituzione di una parte del loro percorso.

Categorie automatiche

Se si esegue il comando vitis service get autocategorization, si può notare che, per impostazione predefinita, è configurato l'assegnazione delle categorie automatiche in base al formato (Format e Type) e all'estensione dei file (Extension).

Questo è utile quando, ad esempio, è necessario trovare qualcosa tra i PDF o controllare cosa si ha di EPUB e FB2; basta eseguire la query

vitis show Format/MOBI u: Format/FB2

È così che gli strumenti standard di GNU/Linux come file o mimetype non mi hanno soddisfatto, proprio perché non identificano sempre correttamente il formato. Ho dovuto implementare una mia soluzione basata sulle firme dei file e le estensioni. In effetti, il tema della determinazione dei formati dei file è interessante e meriterebbe un articolo a parte. Posso già dire che, anche se potrei non aver previsto un riconoscimento accurato per tutti i formati nel mondo, la soluzione funziona piuttosto bene nel complesso. Tuttavia, attualmente il formato EPUB è identificato come ZIP (giustificato in generale, ma non dovrebbe essere considerato un comportamento normale nella pratica). Fino a un certo punto, considerate questa possibilità come sperimentale e segnalate eventuali bug. In situazioni strane, è sempre possibile usare le categorie in base all'estensione dei file, ad esempio, Extension/epub.

Se sono attivate le autocatene per formato, sono anche incluse le autocatene che raggruppano alcuni formati in tipi come: «Archivi», «Immagini», «Video», «Audio» e «Documenti». Per queste sottocategorie saranno anche creati nomi localizzati.

Di cosa non si parla.

vitis è diventato uno strumento molto versatile, e è difficile coprire tutto in una volta. Accennerò brevemente a cosa è ancora possibile fare:

  • le categorie possono essere eliminate e rimosse dai file;
  • i risultati delle query possono essere copiati nella directory specificata;
  • i file possono essere eseguiti come programmi;
  • il comando show ha molte opzioni, ad esempio, ordinamento per nome/data di modifica o accesso/dimensione/estensione, visualizzazione delle proprietà dei file e dei percorsi agli originali, inclusione della visualizzazione dei file nascosti, e altro;
  • salvando i riferimenti alle fonti Internet, è possibile anche mantenere copie locali delle pagine HTML.

Tutti i dettagli possono essere trovati nella guida dell'utente.

Prospettive

Spesso gli scettici dicono che 'nessuno si prenderà la briga di sistemare questi tag'. Posso dimostrare il contrario con la mia esperienza: ho già categorizzato più di seimila file, creato oltre mille categorie e alias, e ne è valsa la pena. Quando con un comando vitis open Piano aprendo l'elenco delle tue cose da fare o quando con un comando vitis open LaTeX apri il libro di Stolyarov sulla tipografia LaTeX, è già moralmente difficile usare il file system 'alla vecchia maniera'.

Su questa base nascono diverse idee. Ad esempio, si potrebbe realizzare una radio automatica che riproduce musica a tema in base alle condizioni meteorologiche attuali, alle festività, al giorno della settimana, all'ora del giorno o dell'anno. Un'altra idea correlata è un lettore musicale che conosce le categorie e può riprodurre musica utilizzando espressioni con operazioni sulle categorie come se fossero insiemi. Potrebbe essere utile sviluppare un demone che monitori la cartella "Download" e proponga di categorizzare i nuovi file. E, naturalmente, sarebbe opportuno creare un gestore di file semantico grafico adeguato. In passato, avevo persino realizzato per un'azienda un servizio web per la condivisione collettiva di file, ma non era una priorità ed è diventato obsoleto, sebbene avesse raggiunto un elevato livello di operatività. (A causa dei grandi cambiamenti nel stesso vitis, non è più utilizzabile.)

qui una piccola dimostrazione

Categorie invece di directory, o Sistema di file semantico per Linux

Conclusione

Vitis — non è il primo tentativo di modificare radicalmente lo stile di lavoro con i dati, ma ho ritenuto importante realizzare le mie idee e rendere l'implementazione accessibile pubblicamente con licenza GNU GPL. Per comodità, è stato realizzato un pacchetto deb per x86-64, che dovrebbe funzionare su tutte le moderne distribuzioni Debian. Ci sono stati alcuni problemi su ARM (mentre tutti gli altri programmi correlati, vitis, funzionano normalmente), ma in futuro sarà costruito un pacchetto funzionante anche per questa piattaforma (armhf). Attualmente ho smesso di creare pacchetti RPM a causa di problemi con Fedora 30 e della difficoltà di distribuzione su molte distribuzioni RPM, ma in ogni caso più tardi saranno prodotti pacchetti almeno per un paio di esse. Per ora si può usare make && make install o checkinstall.

Grazie a tutti per l'attenzione! Spero che questo articolo e questo progetto possano rivelarsi utili.

Link al repository del progetto

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster