Clasificarea datelor este o temă interesantă pentru cercetare. Îmi place să colecționez informații care par utile și am încercat mereu să creez ierarhii logice de directoare pentru fișierele mele. Odată am visat o aplicație frumoasă și convenabilă pentru etichetarea fișierelor și am decis că nu pot continua să trăiesc așa.
Problema sistemelor de fișiere ierarhice
Utilizatorii se confruntă adesea cu dilema alegerii locului de salvare pentru un nou fișier și cu dificultatea de a găsi propriile fișiere (uneori numele fișierelor nu sunt concepute pentru a putea fi reținute de către oameni).
O soluție pot fi sistemele de fișiere semantice, care sunt de obicei un strat deasupra sistemelor tradiționale de fișiere. În acestea, directoarele sunt înlocuite de atribute semantice, numite și etichete, categorie, metadate. Voi folosi frecvent termenul „categorie”, deoarece în contextul sistemelor de fișiere, cuvântul „eticheta” poate părea ciudat, mai ales când apar „sub-etichete” și „pseudonime ale etichetelor”.
Atribuirea de categorii fișierelor reduce considerabil problemele legate de locul de stocare și de căutarea fișierelor: dacă îți amintești (sau intuiești) măcar una dintre categoriile atribuite fișierului, acesta nu va mai dispărea niciodată din vedere.
Această temă a fost abordată anterior pe Habr (, , , și altele), aici îmi voi descrie soluția.
Calea către implementare
Imediat după visul menționat, am descris într-un caiet o interfață de linie de comandă care să furnizeze funcționalitatea necesară gestionării categoriilor. Atunci am decis că în termen de o săptămână-două pot scrie un prototip folosind Python sau Bash, iar apoi va trebui să lucrez la crearea unei interfețe grafice pe Qt sau GTK. Realitatea, ca de obicei, s-a dovedit a fi mult mai dură, iar dezvoltarea s-a prelungit.
Conceptul inițial a fost să creez mai întâi o aplicație cu o interfață de linie de comandă convenabilă și concisă, care să permită crearea și ștergerea categoriilor, atribuirea acestora fișierelor și eliminarea lor din fișiere. Am numit aplicația vitis.
Prima încercare de a crea vitis s-a terminat fără succes, deoarece o mulțime de timp a început să fie consumată pentru muncă și studii. A doua încercare a fost deja ceva: am reușit să finalizez proiectul gândit pentru disertația de master și să creez chiar și un prototip al interfeței GTK. Dar acea versiune s-a dovedit atât de nesigură și incomodă, încât a trebuit să regândesc multe aspecte.
În a treia versiune, am început să o folosesc efectiv pentru o perioadă îndelungată, clasificând câteva mii de fișiere în categorii. Acest lucru a fost în mare parte datorat implementării completării automate în bash. Dar unele probleme, cum ar fi lipsa automată a categoriilor și posibilitatea de a stoca fișiere cu nume identice, au rămas, iar programul deja se înclina sub propria complexitate. Așa am ajuns la necesitatea de a rezolva problemele dezvoltării de software complex: să scriu cerințe detaliate, să dezvolt un sistem de testare funcțională, să studiezi instrucțiunile de pachetare și multe altele. Acum am ajuns la ceea ce mi-am propus, astfel că această modestă creație poate fi prezentată comunității libere. O gestionare atât de specifică a fișierelor, cum este cea prin conceptul de categorii, ridică întrebări și probleme neașteptate, iar în rezolvarea lor vitis a generat în jurul său încă cinci proiecte, unele dintre acestea fiind menționate în articol. Până astăzi vitis nu am obținut o interfață grafică, dar comoditatea utilizării categoriilor de fișiere din linia de comandă depășește pentru mine orice avantaje ale unui manager de fișiere grafic obisnuit.
Exemple de utilizare
Să începem cu ceva simplu - să creăm o categorie:
vitis create MuzicăSă adăugăm pentru exemplu o compoziție:
vitis assign Muzică -f "The Ink Spots - I Don't Want To Set The World On Fire.mp3"Pentru a vizualiza conținutul categoriei „Muzică”, putem folosi subcomanda „show”:
vitis show MuzicăO putem reda folosind subcomanda „open”
vitis open MuzicăDeoarece în categoria „Muzică” avem un singur fișier, acesta va fi redat. Pentru a deschide fișierele cu aplicațiile implicite, am creat o utilitate separată vts-fs-open (instrumentele standard precum xdg-open sau mimeopen nu m-au mulțumit din mai multe motive; însă, dacă este nevoie, în setări poți specifica o altă unealtă pentru deschiderea universală a fișierelor). Această unealtă funcționează bine pe diferite distribuții cu medii de lucru diferite, așa că recomand să instalezi și aceasta împreună cu vitis.
De asemenea, poți specifica direct programul pentru deschiderea fișierelor:
vitis open Muzică --app qmmp
Să creăm încă categorii și să adăugăm fișiere folosind „assign”. Dacă fișierele sunt atribuite categoriilor care nu există încă, se va face o solicitare pentru a le crea. Poți evita o solicitare inutilă folosind flag-ul —yes.
vitis assign Programare R -f "Introducere în R.pdf" "Pachet statistic R: teoria probabilităților și matstatistica.pdf" --yesAcum vrem să adăugăm fișierului „Pachet statistic R: teoria probabilităților și matstatistica.pdf” categoria „Matematică”. Știm că acest fișier are deja categoria „R”, așa că putem utiliza calea categorică din sistemul Vitis:
vitis assign Matematică -v "R/Pachet statistic R: teoria probabilităților și matstatistica.pdf"Din fericire, completarea automată bash va permite să facem acest lucru cu ușurință.
Să vedem ce a ieșit, folosind flag-ul —categories, pentru a vedea lista categoriilor pentru fiecare fișier:
vitis show R --categories
Observați că fișierelor le-au fost atribuite și categorii automate în funcție de format, tip (care unește formate) și extensie. Aceste categorii pot fi dezactivate, dacă se dorește. În curând voi face o localizare a denumirilor lor.
Să adăugăm pentru diversitate în „Matematică” ceva în plus:
vitis assign Matematică -f "Analiză matematică - 1984.pdf" Perelman_Distracție_matematică_1927.djvu Acum începe partea interesantă. În loc de categorii, se pot scrie expresii cu operații de unire, intersecție și diferențiere, adică se pot folosi operații pe mulțimi. De exemplu, intersecția „Matematicii” cu „R” va da un singur fișier.
vitis show R i: MatematicăSă scădem din „Matematică” mențiunile limbajului „R”:
vitis show Matematică R #sau vitis show Matematică c: RPutem unifica fără scop muzica și limbajul R:
vitis show Muzică u: RFlag-ul -n permite „extracția” din rezultatul cererii a fișierelor dorite după numere și/sau intervale, de exemplu, -n 3-7, sau ceva mai complex: -n 1,5,8-10,13. Este adesea util cu subcomanda open, care permite deschiderea fișierelor dorite din listă.

Deși ne îndepărtăm de utilizarea ierarhiei standard a directorilor, este adesea util să avem categorii încrucișate. Vom crea subcategoria „Statistică” în categoria „Matematică” și vom adăuga această categorie fișierului corespunzător:
vitis create Matematică/Statistică
vitis assign Matematică/Statistică -v "R/Introducere în R.pdf"
vitis show Matematică --categories
Putem observa că acest fișier are acum categoria „Matematică/Statistică” în loc de „Matematică” (linkurile inutile sunt urmărite).
A apela calea completă poate fi incomod, să creăm un alias „global”:
vitis assign Matematică/Statistică -a Statistică
vitis show Statistică
Nu doar fișiere obișnuite
Linkuri de internet
Pentru a uniformiza stocarea oricărei informații, ar fi util, cel puțin, să categorisim linkurile către resursele de internet. Și acest lucru este posibil:
vitis assign Habr Anomalie de Culoare -i https://habr.com/ro/company/sfe_ro/blog/437304/ --yesÎntr-un loc special va fi creat un fișier cu titlul paginii HTML și cu extensia .desktop. Acesta este formatul tradițional pentru un shortcut în GNU/Linux. Aceste shortcuturi primesc automat categoria NetworkBookmarks.
Este evident că shortcuturile sunt create pentru a fi folosite:
vitis open Anomalie de CuloareExecutarea comenzii duce la deschiderea în browser a linkului salvat recent. Shortcuturile categorisite pentru surse de internet pot înlocui marcajele din browser.
Fragmente de fișiere
De asemenea, este util să avem categorii pentru fragmentele individuale de fișiere. O propunere bună, nu-i așa? Dar implementarea actuală abordează doar fișierele text obișnuite, fișierele audio și video. Să presupunem că doriți să marcați un anumit moment dintr-un concert sau o scenă amuzantă dintr-un film, atunci când utilizați assign, puteți folosi flagurile —fragname, —start, —finish. Să salvăm intro-ul din „Povestirile cu Rațe”:
vitis assign vitis assign -c Intro-uri -f Duck_Tales/s01s01.avi --finish 00:00:59 --fragname "Intro Duck Tales"
vitis open Intro-uriÎn realitate, nu are loc nicio eliminare a fișierelor; în schimb, se creează un fișier-reprezentant pentru un fragment, în care sunt descrise tipul fișierului, calea către fișier, începutul și sfârșitul fragmentului. Crearea și deschiderea reprezentanților pentru fragmente este delegată utilitarelor pe care le-am creat special pentru aceste scopuri — mediafragmenter și fragplayer. Primul creează, al doilea deschide. În cazul înregistrărilor audio și video, redarea fișierului media de la o anumită poziție la alta se face cu ajutorul player-ului VLC, așa că acesta trebuie să fie de asemenea în sistem. La început, am vrut să fac asta pe baza mplayer-ului, dar acolo poziționarea în momentul dorit era destul de necorespunzătoare.
În exemplul nostru se creează un fișier „Duck Tales intro.fragpointer” (care este plasat într-un loc special), iar apoi se redă fragmentul de la începutul fișierului (deoarece —start nu a fost specificat la crearea lui) până la marca de 59 de secunde, după care VLC se închide.
Un alt exemplu — am decis să categorisim o anumită interpretare la un concert al unui artist cunoscut:
vitis assign Lepс "Salvați-ne sufletele" -f Grigori Lepс - Concert Păcuri - piesele lui Vladimir Vysotski.mp4 --fragname "Salvați-ne sufletele" --start 00:32:18 --finish 00:36:51
vitis open "Salvați-ne sufletele"La deschidere, fișierul va fi inclus la poziția dorită și se va închide după patru minute și jumătate.
Cum funcționează totul + funcționalități suplimentare
Stocarea categoriilor
La începutul gândirii asupra organizării unui sistem de fișiere semantice, mi-au venit în minte trei metode: prin stocarea link-urilor simbolice, printr-o bază de date, prin descrierea în XML. Prima metodă a câștigat, deoarece, pe de o parte, este simplă de implementat, iar pe de altă parte, utilizatorul are posibilitatea de a vizualiza categoriile direct din sistemul de fișiere (ceea ce este convenabil și important). La începutul utilizării vitis în directorul de acasă al utilizatorului se creează un director „Vitis” și un fișier de configurare „.config/vitis/vitis.conf”. În ~ /Vitis se creează directoare corespunzătoare categoriilor, iar în aceste directoare-categorii se creează link-uri simbolice către fișierele originale. Aliasurile categoriilor sunt de asemenea doar link-uri către acestea. Desigur, prezența directorului „Vitis” în catalogul de acasă poate fi incomodă pentru unii. Putem comuta la orice alt loc:
vitis service set path /mnt/MyFavoriteDisk/Vitis/La un moment dat devine clar că a clasifica fișierele dispersate în diferite locuri nu are prea mult sens, deoarece amplasarea lor se poate schimba. De aceea, la început, mi-am creat un director în care am început pur și simplu să salvez tot și să îi atribui categorii. Apoi, am decis că ar fi bine să formalizez acest moment la nivel de programare. Așa a apărut conceptul de „spațiu de fișiere”. La începutul utilizării vitis imediat ar fi util să configurăm un astfel de loc (acolo vor fi stocate toate fișierele de care avem nevoie) și să activăm salvarea automată:
vitis service add filespace /mnt/MyFavoriteDisk/Filespace/
vitis service set autosave yesFără salvare automată, la utilizarea subcomenzii „assign” va fi necesar un flag —save, în cazul în care dorim să salvăm fișierul adăugat în spațiul de fișiere.
Mai mult decât atât, putem adăuga mai multe spații de fișiere și schimba prioritățile acestora, ceea ce poate fi util atunci când sunt foarte multe fișiere și acestea sunt stocate pe suporturi diferite. Aici nu voi analiza această opțiune, detalii pot fi citite în ajutorul programului.
Migrarea sistemului de fișiere semantice
Așa sau altfel, directorul Vitis și spațiile de fișiere pot teoretic să se mute din loc în loc. Pentru a le face funcționale, am creat un utilitar separat link-editor, care poate edita în masă linkuri, înlocuind părți ale căii cu altele:
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În primul caz, după ce ne-am mutat din /mnt/MyFavoriteDisk/Vitis/ în directorul personal, se editează legăturile simbolice asociate cu aliasurile. În al doilea caz, după ce se schimbă amplasarea spațiului de fișiere, toate linkurile din Vitis se schimbă conform cererii de înlocuire a părții căii lor.
Categorii automate
Dacă rulăm comanda vitis service get autocategorization, putem vedea că, în mod implicit, categorii automate sunt configurate în funcție de format (Format și Type) și extensia fișierelor (Extension).
Este util, de exemplu, când trebuie să găsim ceva printre PDF-uri sau să vedem ce avem stocat din EPUB și FB2, putem executa pur și simplu cererea
vitis show Format/MOBI u: Format/FB2S-a întâmplat astfel încât instrumentele standard GNU/Linux, cum ar fi file sau mimetype, nu m-au mulțumit din cauza că nu determină întotdeauna corect formatul; a trebuit să creez propriul algoritm bazat pe semnăturile fișierelor și extensiile acestora. În general, subiectul determinării formatelor fișierelor este interesant pentru cercetare și merită un articol separat. Deocamdată, pot spune că, deși nu am prevăzut recunoașterea corectă pentru toate formatele din lume, totuși, în general, funcționează deja destul de bine. Totuși, pentru EPUB, formatul este determinat ca ZIP (ceea ce este justificat, dar pe teren nu ar trebui considerat un comportament normal). Până la unele timpuri, considerați această posibilitate ca fiind experimentală; raportați bug-urile. În situații neobișnuite, se pot utiliza categorii bazate pe extensiile fișierelor, de exemplu, Extension/epub.
Dacă sunt activate autocategorii pe format, sunt de asemenea activate autocategorii care unesc unele formate, cum ar fi: „Arhive”, „Imagini”, „Video”, „Audio” și „Documente”. Pentru aceste subcategorii vor fi create și denumiri localizate.
Despre ce nu s-a spus
vitis s-a dovedit a fi un instrument foarte complex și este dificil de acoperit totul dintr-o dată. Voi menționa pe scurt ce altceva se mai poate face:
- categoriile pot fi șterse și îndepărtate de la fișiere;
- rezultatele cererilor pe expresii pot fi copiate într-un director specificat;
- fișierele pot fi lansate ca programe;
- comanda show are numeroase opțiuni, cum ar fi sortarea după nume/data modificarilor sau acces/size/extensie, afișarea proprietăților fișierelor și a căilor către originalele acestora, inclusiv afișarea fișierelor ascunse etc.;
- la salvarea link-urilor către surse de internet, se pot salva și copii locale ale paginilor HTML.
Toate detaliile pot fi găsite în documentația pentru utilizatori.
Perspective
Deseori, scepticii spun că „nimeni nu va eticheta aceste tag-uri singur”. Din experiența mea pot dovedi contrariul: am categorisit deja peste șase mii de fișiere, am creat peste o mie de categorii și pseudonime, și a meritat. Când cu o singură comandă vitis open Plan deschizi lista task-urilor tale sau când cu o singură comandă vitis open LaTeX deschizi cartea lui Stolyarov despre sistemul de tipărire LaTeX, devine dificil din punct de vedere mental să folosești sistemul de fișiere „în stil vechi”.
Pe această bază apar o serie de idei. De exemplu, se poate realiza un radio automat care să redea muzică tematică în funcție de vremea actuală, sărbătoare, zi a săptămânii, moment al zilei sau an. De asemenea, o idee apropiată ar fi un player muzical care să cunoască categoriile și să poată reda muzica pe baza unor expresii cu operații asupra categoriilor ca asupra mulțimilor. Ar fi util să realizăm un demon care să supravegheze directorul „Descarcări” și să sugereze categorisirea fișierelor noi. Și, bineînțeles, ar trebui să creăm un manager de fișiere semantice grafic adecvat. Odată, am realizat un serviciu web pentru utilizarea colectivă a fișierelor, dar acesta nu era o prioritate și a devenit învechit, deși a atins un nivel înalt de funcționalitate. (Având în vedere modificările semnificative în sine vitis, nu mai este potrivit pentru utilizare.)
aici este o mică demonstrație

Concluzie
Vitis — nu este prima încercare de a schimba radical stilul de lucru cu datele, dar am considerat important să-mi implementez ideile și să public realizarea în acces deschis sub licența GNU GPL. Pentru comoditate, a fost realizat un pachet deb pentru x86-64, care ar trebui să funcționeze pe toate distribuțiile moderne Debian. Pe ARM au apărut unele dificultăți (deși toate celelalte programe asociate cu vitis, funcționează normal), dar în continuare va fi compilat un pachet funcțional și pentru această platformă (armhf). Am oprit temporar crearea pachetelor RPM din cauza problemelor cu Fedora 30 și a complexității dispersării pe multe distribuții RPM, dar mai târziu totuși se vor face pachete pentru câteva dintre ele. Între timp, se pot utiliza make && make install sau checkinstall.
Vă mulțumesc tuturor pentru atenție! Sper că acest articol și acest proiect vor putea fi utile.
Sursa: habr.com
