ffs: UNIX dosya sistemiyle JSON benzeri yarı yapılandırılmış veriyi mount eden araç
- ffs, File Filesystem'un kısaltmasıdır; yarı yapılandırılmış veriyi bir dosya sistemi olarak mount ederek JSON, YAML gibi ağaç yapılı modern formatları, alışılmış shell araçlarıyla yönetebilen bir araçtır.
- JSON'u
sed gibi metin işleme yöntemleriyle düzenlemek iyi bir yöntem olmadığından, ffs kullanımı daha uygun olur.
- Şu anda ffs, JSON, YAML ve TOML destekliyor ve daha fazla formatın eklenmesi planlanıyor.
ffs kullanım örneği
ffs [file] komutu ile file.blah dosyası, file adındaki bir mount point'e bağlanır ve düzenlenmiş son sürüm stdout'a yazılır.
ffs -m MOUNT file ile açık bir mount point belirtilebilir.
ffs -o OUTPUT ile çıktı dosyası belirtilebilir.
ffs -i file ile dosya doğrudan düzenlenebilir; birim ayrıştırıldığında sonuç tekrar file dosyasına yazılır.
- Düzenleme sırasında
nose anahtarının değerinin dize yerine sayıya dönüştüğünü ve pockets dizininin bir nesneye dönüştüğünü görebilirsiniz.
ffs yükleme yöntemi
- Linux'ta FUSE, macOS'ta macFUSE gerekir.
- Tek bir çalıştırılabilir dosya indirilebilir.
- Kaynaktan derleme de yapılabilir.
ffs hakkında daha fazla bilgi
- Daha fazla bilgi için PLOS 2021'deki "Files-as-Filesystems for POSIX Shell Data Processing" makalesine bakın.
- Demo ve sunum videoları sunulmaktadır.
İlgili araç karşılaştırması
jq, gron gibi araçlar CLI'da JSON işlemek için iyi araçlardır.
- ffs'in avantajı; çoklu format desteği, alışılmış shell araçlarıyla düzenleme imkânı ve yeni bir dil öğrenmeye gerek kalmaması gibi noktalardır.
- Ancak Windows desteği olmaması, FUSE kullanılamayan senaryolar, yalnızca arama yapılacağı durumlar veya çok büyük dosyalar gibi durumlarda ffs uygun olmayabilir.
GN⁺ Görüşü
- JSON, YAML ve TOML gibi modern web geliştirmede yaygın kullanılan yarı yapılandırılmış verilerle çalışmak için kullanışlı görünüyor. Özellikle shell script ile otomasyon yapanlar için güçlü olabilecek bir araç.
- Ancak FUSE tabanlı olduğu için performans sorunları oluşabilir ve Windows desteğinin olmaması üzücü; WSL'de çalışıp çalışmayacağı net değil.
- Açık kaynak olması nedeniyle farklı formatların desteğini genişletmek için katkı sağlanabilmesi bir avantajdır. Kullanıcı açısından bakıldığında ise konfor ve verimliliği artırdığı düşünülebilir.
sed veya awk gibi klasik metin işleme araçlarına aşina bir mühendis için ek öğrenme maliyeti olmadan doğrudan uygulanabilir.
- API yanıtlarını yerel olarak saklayıp hata ayıklamak veya sıkça düzenlenen yarı yapılandırılmış konfigürasyon dosyalarıyla uğraşmak için yararlı olabilir.
1 yorum
Hacker News Yorumu
libfuse'u kendi geliştirdiğim şekilde Nim ile sarıp 'hello' dosya sistemi örneğini port ettim; veriyi bir pipe üzerinden ileten ve bir mount point sağlayan bir sürüm yaptım. Tamamlandığında stdout üzerinden çıktı veriyor. Böylece bunu pipe zincirine inline olarak ekleyebiliyorum ama çıktıyı güvenilirce almak gerekiyor.
Şu an dosya sistemi olarak nelerin yapılabileceğini araştırıyorum. Nimdow için bir pencere yöneticisi durum çubuğu yaptım; her bir dosyanın içine içerik yazdığımda çıktı olarak bloklu bir çubuk üretiyor. Durum çubuğundaki içeriği kolayca değiştirebildiğim için çok pratik.
libvlc kullanan bir müzik çaları da yaptım. ID3 etiketli medyayı okuyup 'sanatçıya göre', 'albüme göre' gibi klasörler oluşturuyor. Her bir dosya '<parça numarası> - <şarkı başlığı>' olarak adlandırılıyor ve gerçek dosyanın tamamı yolunu içeriyor. Bir şarkı çalmak için bu dosyalardan birini 'control/current' içine cat ederek, 'control/command' içine de play yazılır. Çalma listesi işlevi ve daha fazla komut gibi şeyler de var ama temel fikir bu. Amaç, son derece güçlü şekilde betiklenebilir bir müzik çaları yapmak.
Unix benzeri işletim sistemleri disk imajlarını mount edip içeriğini gezinebilir. Ancak dosya içi gezinmeyi kolaylaştıran daha birçok dosya formatı var. Sıkıştırılmış arşivler bunlardan sadece biri. Bazı dosya yöneticileri bunu destekler ama uygulama katmanı açısından bu özelliği eklemek en ideal yer değil. Dosya türü sürücüleriyle uygulanabilir.
Mount olduğu süre boyunca bellek içinde çalışan (tmpfs gibi) ve unmount edildiğinde tek bir disk dosyasına serileştirilen bir FUSE dosya sistemi arıyorum. Arşiv dosyası mount eden bir FUSE sürücüsü buna en yakın örnek ama sembolik linkler gibi şeyleri elde edemezsiniz.
Git commitlerini dosya sistemi olarak mount etmek de mümkün. (bağlantıya bakın)
Parts-of-file File System de mevcut. (Usenix bağlantısına bakın)
Omar Rizwan'ın TabFS'ini hatırlatıyor. (bağlantıya bakın)
Bunu 2003'te de yaptım. Şaşırtıcı şekilde hızlı ve ince taneli kilitlemeyi kolayca yapıyor. Büyük bir web sitesi inşa aracı için web şablonu dilinin kullanıcıya özel veritabanı olarak kullandım.
JSON anahtarlarında slash olduğunda ne olur diye merak ediliyor.
Bununla dosyaları bir dizin ağacı olarak commit etme ihtimali açılıyor. Birleştirme ve çatışmalar üzerindeki etkisinin ne olacağını merak ediyorum.
Harika görünüyor; mümkün olduğu en kısa sürede denemek lazım. JSON dosyalarının içeriğini aramak ve gezinmek için işe yarar gibi görünüyor.