La classificazione dei dati è un tema di ricerca molto interessante. Mi piace collezionare informazioni che sembrano rilevanti e ho sempre cercato di creare gerarchie logiche per le mie directory di file. Una volta, in un sogno, ho visto un programma bello e user-friendly per assegnare tag ai file, e ho deciso che non si poteva continuare a vivere così.
Il problema dei sistemi di file gerarchici
Gli utenti si trovano spesso ad affrontare la questione della scelta del luogo per salvare un nuovo file e del problema del rintracciare i propri file (a volte i nomi dei file non sono nemmeno pensati per essere facilmente ricordati da una persona).
Una possibile soluzione possono essere i sistemi di file semantici, che di solito sono un'estensione del tradizionale sistema di file. In essi, le directory sono sostituite da attributi semantici, noti anche come tag, categorie, metadati. Userò più spesso il termine «categoria», poiché nel contesto dei sistemi di file il termine «tag» può sembrare strano, soprattutto con l'emergere di «sottotag» e «alias di tag».
Assegnare categorie ai file elimina in gran parte i problemi di spazio di archiviazione e ricerca del file: se si ricorda (o si sospetta) almeno una delle categorie assegnate al file, il file non andrà mai perso di vista.
In precedenza su Habr è già stata sollevata questa tema (, , , et al.), qui descrivo la mia soluzione.
La strada verso l'implementazione
Subito dopo il sogno menzionato, ho descritto su un quaderno l'interfaccia a riga di comando che doveva garantire il necessario lavoro con le categorie. Allora ho pensato che in una o due settimane avrei potuto scrivere un prototipo, usando Python o Bash, e poi lavorare per creare un'interfaccia grafica con Qt o GTK. La realtà, come sempre, si è rivelata molto più dura e lo sviluppo si è allungato.
L'idea originale era di creare un programma con un'interfaccia a riga di comando semplice 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 in nulla, poiché molto tempo ha iniziato a essere dedicato al lavoro e all'università. La seconda prova è stata già qualcosa: sono riuscito a completare il progetto pensato per la tesi di laurea magistrale e addirittura a realizzare un prototipo dell'interfaccia GTK. Ma quella versione si è rivelata così poco affidabile e scomoda che ho dovuto rivedere molte cose.
Con la terza versione l'ho già usato davvero per molto tempo, classificando diverse migliaia dei miei file. Questo è stato fortemente facilitato dall'autocompletamento realizzato in bash. Ma alcuni problemi, come l'assenza di categorie automatiche e la possibilità di memorizzare file con lo stesso nome, rimanevano, e il programma stava già cedendo sotto la propria complessità. Così sono arrivato alla necessità di affrontare i problemi dello sviluppo di software complesso: scrivere requisiti dettagliati, sviluppare un sistema di test funzionali, studiare le istruzioni per il packaging e molto altro. Ora sono arrivato a ciò che avevo in mente, quindi questa modesta creazione può essere presentata alla comunità. Un sistema di gestione dei file così specifico, come la gestione basata su categorie, solleva domande e problemi inaspettati, e nella loro risoluzione vitis ha generato attorno a sé altri cinque progetti, alcuni dei quali saranno menzionati nell'articolo. Fino ad oggi vitis non ho acquisito un'interfaccia grafica, ma la comodità di utilizzare le categorie di file dalla riga di comando già supera per me qualsiasi vantaggio di un normale gestore di file grafico.
Esempi di utilizzo
Iniziamo con qualcosa di semplice: creiamo una categoria:
vitis create MusicaAggiungiamo per esempio un brano:
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 sotto-comando «show»:
vitis show MusicaPuoi riprodurlo usando il sotto-comando «open»
vitis open MusicaPoiché nella nostra categoria «Musica» c'è solo un file, verrà avviato solo quello. Per l'apertura dei 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; tuttavia, se necessario, nelle impostazioni puoi specificare un'altra utilità per l'apertura universale dei file). Questa utilità funziona bene su diverse distribuzioni con ambienti di lavoro vari, quindi ti consiglio di installarla insieme a vitis.
È possibile specificare direttamente il programma per aprire i file:
vitis open Musica --app qmmp
Creiamo altre categorie e aggiungiamo file utilizzando «assign». Se i file vengono assegnati a categorie che non esistono ancora, viene richiesta la loro creazione. È possibile evitare la richiesta aggiuntiva utilizzando il flag —yes.
vitis assign Programmazione R -f "Introduzione a R.pdf" "Pacchetto statistico R: teoria delle probabilità e statistica.pdf" --yesOra 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 di categoria del sistema Vitis:
vitis assign Matematica -v "R/Pacchetto statistico R: teoria delle probabilità e statistica.pdf"Per fortuna, il completamento automatico di bash renderà questo facile.
Controlliamo cosa abbiamo ottenuto, utilizzando il flag —categories, per vedere l'elenco delle categorie di ciascun file:
vitis show R --categories
Si noti 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 a "Matematica":
vitis assign Matematica -f "Analisi matematica - 1984.pdf" Perelman_Divertente_matematica_1927.djvu E ora inizia la parte interessante. Al posto delle categorie, si possono scrivere espressioni con operazioni di unione, intersezione e sottrazione, quindi utilizzare operazioni sugli insiemi. Ad esempio, l'intersezione di "Matematica" e "R" restituirà un solo file.
vitis show R i: MatematicaSottraiamo dalla "Matematica" i riferimenti al linguaggio "R":
vitis show Matematica R #o vitis show Matematica c: RPossiamo unire senza scopo la musica e il linguaggio R:
vitis show Musica u: RIl flag -n permette di "estrarre" dal risultato della richiesta i file necessari in base ai numeri 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 file specifici dall'elenco.

Sebbene ci allontaniamo dall'uso della normale gerarchia delle directory, è spesso utile avere categorie annidate. Creeremo una sottocategoria "Statistica" all'interno della categoria "Matematica" e aggiungeremo questa categoria al file appropriato:
vitis create Matematica/Statistica
vitis assign Matematica/Statistica -v "R/Introduzione a R.pdf"
vitis show Matematica --categories
Possiamo vedere che questo file ora ha la categoria «Matematica/Statistica» invece di «Matematica» (i link non necessari sono tracciati).
Riferirsi al percorso completo potrebbe essere scomodo, creiamo un alias «globale»:
vitis assign Matematica/Statistica -a Statistica
vitis show Statistica
Non solo file comuni
Link Internet
Per uniformare la memorizzazione di qualsiasi informazione, sarebbe utile, almeno, categorizzare i link alle risorse Internet. Ed è possibile:
vitis assign Habr Coloreanomalia -i https://habr.com/ru/company/sfe_ru/blog/437304/ --yesIn un luogo speciale verrà creato un file con il titolo della pagina HTML e con 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 ColoreanomaliaL'esecuzione del comando porta all'apertura nel browser del link appena salvato. I collegamenti categorizzati alle fonti Internet possono sostituire i segnalibri del browser.
Frammenti di file
È anche utile avere categorie per singoli frammenti di file. Non è male come proposta, vero? Ma l'attuale implementazione tocca solo file di testo normali, file audio e video. Diciamo che hai bisogno di segnare un certo pezzo di qualche concerto o un momento divertente in un film; allora, utilizzando assign, puoi avvalerti dei flag —fragname, —start, —finish. Salviamo l'introduzione di «DuckTales»:
vitis assign vitis assign -c Introduzioni -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Introduzione Duck Tales"
vitis open IntroduzioniIn realtà non avviene alcun taglio dei file; invece, viene creato un file puntatore al frammento, in cui è 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 strumenti appositamente realizzati 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. All'inizio volevo fare questo basandomi su mplayer, ma lì per qualche motivo il posizionamento non funzionava correttamente nel momento giusto.
Nel nostro esempio viene creato un file "Duck Tales intro.fragpointer" (che viene posizionato in un luogo specifico), e poi viene riprodotto un frammento dall'inizio del file (poiché —start non è stato specificato durante la creazione) fino al segno dei 59 secondi, dopodiché VLC si chiude.
Un altro esempio: abbiamo deciso di categorizzare una singola esibizione a un concerto di un noto artista:
vitis assign Лепс "Спасите наши души" -f Григорий Лепc - Концерт Парус - песни Владимира Высоцкого.mp4 --fragname "Спасите наши души" --start 00:32:18 --finish 00:36:51
vitis open "Спасите наши души"All'apertura, il file sarà incluso nella posizione desiderata e si chiuderà dopo quattro minuti e mezzo.
Come funziona tutto questo + possibilità aggiuntive
Conservazione delle categorie
All'inizio della progettazione dell'organizzazione del sistema di file semantico, ho pensato a tre modi: attraverso la conservazione di collegamenti simbolici, tramite un database, attraverso una descrizione in XML. Ha prevalso il primo modo, poiché da un lato è semplice da implementare, dall'altro consente all'utente di visualizzare le categorie direttamente dal sistema di file (ed è comodo e importante). All'inizio dell'utilizzo 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 collegamenti simbolici ai file originali. I nomi delle categorie sono anche semplici collegamenti a esse. Certamente, la presenza della directory "Vitis" nella home potrebbe non soddisfare alcuni. Possiamo passare a qualsiasi altro luogo:
vitis service set path /mnt/MyFavoriteDisk/Vitis/A un certo punto diventa chiaro che categorizzare file sparsi in vari posti ha poco senso, poiché la loro posizione può cambiare. Pertanto, per cominciare, ho creato una directory dove ho semplicemente scaricato tutto e ho assegnato categorie a tutto questo. Poi ho deciso che sarebbe stato bene formalizzare questo momento a livello software. È nato così il concetto di "spazio di file". All'inizio dell'utilizzo vitis non sarebbe male impostare subito un luogo del genere (dove saranno archiviati tutti i file necessari) e attivare il salvataggio automatico:
vitis service add filespace /mnt/MyFavoriteDisk/Filespace/
vitis service set autosave yesSenza il salvataggio automatico quando si utilizza il sottocomando «assign», sarà necessario il flag —save se si desidera salvare il file aggiunto nello spazio dei file.
Inoltre, è possibile aggiungere diversi spazi di archiviazione e modificarne le priorità, il che può essere utile quando ci sono molti file e sono memorizzati su diversi supporti. Qui non esaminerò questa possibilità, i dettagli possono essere letti nella guida del programma.
Migrazione del sistema di file semantico
In un modo o nell'altro, la directory Vitis e gli spazi di archiviazione a volte possono spostarsi da un luogo all'altro. Per garantire il funzionamento, ho creato un'utilità separata link-editor, che può modificare in massa i collegamenti, 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 -RNel primo caso, dopo essersi spostati da /mnt/MyFavoriteDisk/Vitis/ nella directory home, vengono modificati i collegamenti simbolici associati agli alias. Nel secondo caso, dopo aver cambiato la posizione dello spazio di archiviazione, vengono aggiornati tutti i collegamenti in Vitis ai nuovi 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ò vedere che per impostazione predefinita è configurata l'assegnazione automatica delle categorie in base al formato (Format e Type) e all'estensione dei file (Extension).
Questo è utile, ad esempio, quando si deve trovare qualcosa tra i PDF o controllare cosa si ha memorizzato da EPUB e FB2, è possibile eseguire semplicemente la richiesta
vitis show Format/MOBI u: Format/FB2È successo che gli strumenti standard GNU/Linux come file o mimetype non mi hanno soddisfatto precisamente perché non sempre determinano correttamente il formato; ho dovuto creare la mia implementazione basata sulle firme dei file e sulle estensioni. In generale, il tema del riconoscimento dei formati dei file è interessante per la ricerca e merita un articolo a parte. Al momento posso dire che, forse, non ho previsto il riconoscimento accurato per tutti i formati nel mondo, ma nel complesso già ora funziona abbastanza bene. In verità, per EPUB il formato viene attualmente determinato come ZIP (il che è giustificato, ma nella pratica non si dovrebbe considerare un comportamento normale). Fino a un certo punto, considerate questa possibilità come sperimentale, segnalate i bug. In situazioni particolari, è sempre possibile utilizzare le categorie in base all'estensione dei file, ad esempio, Extension/epub.
Se sono attive le autocatene per formato, sono anche attive le autocatene che raggruppano alcuni formati in categorie come: «Archivi», «Immagini», «Video», «Audio» e «Documenti». Anche per queste sottocategorie saranno creati nomi localizzati.
Di cosa non si parla
vitis è diventato uno strumento molto versatile e difficile da coprire tutto in una volta. Accennerò brevemente a ciò che è possibile fare:
- le categorie possono essere eliminate e rimosse dai file;
- i risultati delle query tramite espressioni 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 verso gli originali, attivazione della visualizzazione dei file nascosti e altro;
- salvando i link a risorse web, è possibile salvare anche copie locali delle pagine HTML.
Tutti i dettagli possono essere trovati nella guida utente.
Prospettive
Spesso i scettici dicono che «nessuno si prenderà la briga di inserire manualmente questi tag». Posso dimostrare il contrario con la mia esperienza: ho già categorizzato oltre seimila file, creato più di mille categorie e alias, e ne è valsa la pena. Quando con il comando vitis open Piano apri la lista delle tue attività o quando con il comando vitis open LaTeX apri il libro di Stolyarov sul sistema di composizione LaTeX, è già mentalmente difficile usare il file system «alla vecchia maniera».
Su questa base sorgono una serie di idee. Ad esempio, si potrebbe creare una radio automatica che riproduca musica tematica in base al meteo attuale, a festività, al giorno della settimana, all'ora del giorno o all'anno. Ancora collegato al tema è un lettore musicale che conosce le categorie e può riprodurre musica in base a espressioni con operazioni sulle categorie come se fossero insiemi. Sarebbe utile creare un demone che monitori la cartella "Download" e offra di categorizzare i nuovi file. E ovviamente, sarebbe opportuno realizzare un normale gestore di file semantico grafico. Un tempo avevo persino sviluppato per un'azienda un servizio web per la condivisione di file, ma non era una priorità ed è diventato obsoleto, anche se aveva raggiunto un alto livello di funzionalità. (A causa dei grandi cambiamenti nel stesso vitis, non è più utilizzabile.)
qui una piccola dimostrazione

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 sotto licenza GNU GPL. Per comodità è stato creato un pacchetto deb per x86-64, dovrebbe funzionare su tutte le moderne distribuzioni Debian. Su ARM ci sono state piccole difficoltà (tuttavia, tutti gli altri programmi legati a vitis, funzionano normalmente), ma in futuro verrà costruito un pacchetto funzionante anche per questa piattaforma (armhf). Ho smesso di occuparmi della creazione di pacchetti RPM a causa di problemi con Fedora 30 e alla difficoltà di disperdersi su molte distribuzioni RPM, ma in seguito verranno comunque creati pacchetti per almeno un paio di esse. Nel frattempo, si può utilizzare make && make install o checkinstall.
Grazie a tutti per l'attenzione! Spero che questo articolo e questo progetto possano risultare utili.
Fonte: habr.com
