1 puan yazan GN⁺ 2024-05-02 | 1 yorum | WhatsApp'ta paylaş
  • ffs(file filesystem), JSON, YAML ve TOML gibi yarı yapılandırılmış verileri dosya sistemi olarak bağlayıp Unix kabuk araçlarıyla gezmeyi ve düzenlemeyi sağlayan bir araçtır
  • Unix kabuğu metin işleme araçları açısından zengindir; ancak temel veri yapısı dosya sistemi olduğu için ağaç biçimli verileri düzenlemeye pek uygun değildir
  • ffs [file], dosyayı bir bağlama noktasına bağlar ve ayırma sırasında güncellenmiş sonucu stdout’a ya da belirtilen çıktı dosyasına aktarır
  • Dosya yazma ve dizin oluşturma işlemleri JSON anahtarlarına ve nesnelerine dönüştürülür; 1, true, false ve boş dosya sırasıyla sayı, boolean ve null değerleri olarak yansıtılır
  • Linux’ta FUSE, macOS’ta macFUSE gerekir; Windows, FUSE kullanılamayan ortamlar, yalnızca arama amaçlı işler ve çok büyük dosyalar için uygun olmayabilir

Yarı yapılandırılmış verileri dizin gibi ele almak

  • ffs, file filesystem ifadesinin kısaltmasıdır; yarı yapılandırılmış verileri dosya sistemi gibi bağlayarak alışıldık kabuk araçlarıyla çalışmayı sağlar
  • Şu anda desteklenen biçimler JSON, YAML ve TOML olup daha fazla biçim desteği planlanmaktadır
  • Ayrıntılı kullanım ffs manpage sayfasında görülebilir

Bağlama ve düzenleme akışı

  • Varsayılan çalıştırma ffs [file] şeklindedir; file.blah dosyasını file bağlama noktasına bağlar ve nihai güncellenmiş kopyayı stdout’a yazar
  • ffs -m MOUNT file ile açıkça bir bağlama noktası belirtilebilir, -o OUTPUT ile çıktı dosyası belirtilebilir
  • ffs -i file dosyayı yerinde düzenler; hacim ayrıldığında sonuç yeniden file içine yazılır
  • Örnekte görülen dönüşüm kuralları

    • echo Mikey Indiana >object/name, JSON’daki name değerini değiştirir
    • echo 1 >object/nose, string değil sayı 1 olarak yansıtılır
    • mkdir object/pockets ve içindeki dosyalar JSON nesnesine dönüştürülür
    • Boş dosya mistakes, JSON’da null olarak kaydedilir

Kurulum koşulları ve dağıtım

  • Linux’ta FUSE gerekir
  • macOS’ta macFUSE gerekir
  • En güncel geliştirme derlemesi Linux ve macOS için tek çalıştırılabilir dosya olarak sunulur
  • Belirli sürümler release page üzerinden görülebilir; mevcut sürüm 0.1.2’dir
  • source üzerinden derlemek de mümkündür

İlgili materyaller ve karşılaştırma noktaları

  • PLOS 2021 makalesi “Files-as-Filesystems for POSIX Shell Data Processing” bulunmaktadır
  • jq ve gron, komut satırında JSON ile çalışmaya yönelik araçlardır
  • ffs’nin farkı, birden çok biçimi desteklemesi, alışıldık kabuk araçlarıyla düzenlemeye izin vermesi ve yeni bir dil öğrenmeyi gerektirmemesidir
  • Windows kullanımı, FUSE kullanılamaması, yalnızca arama gerektiren işler ve çok büyük dosyalar ffs’ye uygun olmayabilir
  • Lisansı GPLv3’tür

1 yorum

 
GN⁺ 2024-05-02
Hacker News yorumları
  • Bu harika. Yakın zamanda libfuse’u Nim ile sarmaladıktan sonra hello dosya sistemi örneğini port ettim ve neredeyse aynısını denedim.
    Benim sürümümde veriyi pipe ile içeri vermek ve bağlama noktasını belirtmek gerekiyor; bitince sonucu standart çıktıya yazıyor. Bu yüzden bir pipe zincirinin arasına yerleştirilebiliyor ama çıktıyı da sizin yönetmeniz gerekiyor.
    Şimdilerde başka şeyleri de dosya sistemi olarak yapıp yapamayacağımı araştırıyorum. Nimdow pencere yöneticisi için bir durum çubuğu da yaptım; tek tek dosyalara içerik yazınca bloklardan oluşan bir çubuk çıktı olarak üretiliyor, böylece çubuk içeriğini kolayca değiştirebiliyorsunuz.
    Yaptığım bir başka araç da libvlc tabanlı bir müzik çalar. Bir klasör verdiğinizde ID3 etiketleri olan medyayı okuyor ve by-artist, by-album gibi klasörler oluşturuyor. Her dosyanın adı - ve gerçek dosyanın tam yolunu içeriyor. Bir şarkı çalmak için bir dosyayı control/current içine cat etmek ve control/command içine play yazmak gibi. Daha fazla çalma listesi özelliği ve komut var, ama amaç çok kolay betiklenebilen bir müzik çalar yapmak.

    • Bir fikir: kod dosyalarını veya projeleri özyinelemeli olarak mount etmek. tree-sitter gibi bir şeyle sınıf ve fonksiyon tanımlarını çıkarıp, gerçek dosyayı temsil eden dizinin içinde her birini birer “dosya” olarak oluşturabilirsiniz.
      Kod tabanının yapısını anlamak istiyorsanız sadece tree çalıştırmanız yeter :)
      Daha derine inince import’ları sembolik bağlantılar vb. olarak çözümlemek de mümkün olabilir; ilginç olasılıklar çok.
    • Nim kodunu paylaşabilir misiniz merak ediyorum. Bir süredir FUSE ile bir şeyler denemek istiyordum ve bazı projelerde Nim kullanıyorum.
    • Süreç bilgilerini dosya sistemi olarak kolayca açığa çıkaran yerleşik bir yöntem olsa güzel olurdu diye düşünüyorum.
      Örneğin müzik çaların mevcut parçasının adını almak için cat /proc/$pid/fs/current_track yapmak ya da tarayıcıdaki açık sekmelerin listesini görmek için ls /proc/$pid/fs/tabs çalıştırmak gibi. Belki HTML’i veya gömülü görselleri de almak mümkün olurdu.
      Bugün de FUSE ile yapılabilir, ama zahmetli olduğu için kimse yapmıyor.
  • Yeterince kullanışlı; bence işletim sistemi düzeyinde standart bir özellik olmalı.
    Unix benzeri işletim sistemlerinde disk imajlarını mount edip içeriklerine bakabiliyorsunuz. Ama bir dosyanın içindeki dosyaları gezdiğinizde işe yarayan biçimlerin sayısı çok daha fazla. Sıkıştırılmış arşivler bunun başlıca örneği.
    Bazı dosya yöneticileri bunu destekliyor, fakat bunu uygulama katmanına koymanın en uygun yer olduğunu düşünmüyorum. Dosya biçimine özel sürücüler gibi uygulanabilir.

    • Asıl gereken şey, her dosya biçimi için bir mount komutu yazma yöntemi ve dosya biçimini algılayıp uygun yere yönlendiren ayrı bir komut. Muhtemelen file komutuna benzer olur ve tamamı kullanıcı alanında mümkün olmalı.
      Şu anda bunu engelleyen tek şey MacOS’un kullanıcı alanı dosya sistemi API’sini açığa çıkarmaması. Linux, Windows ve BSD’de zaten mümkün.
      Bunu gören bir Apple geliştiricisi varsa: dosya sağlayıcı uzantıları yeterli değil. Bize FUSE karşılığını verin. Var olduğunu biliyorum.
    • Zaten avfs var. Bunu FUSE dosya sistemi olarak yapıyor. Kullanımı en sezgisel olanı değil ama çalışıyor ve genişletilebiliyor.
      https://avf.sourceforge.net/
    • Bu, reiserfsv4’ün temel tasarım özelliklerinden biriydi ama Linux sonunda birleştirmeyi reddetti. Muhtemelen eşini öldürme olayı da yardımcı olmamıştır.
    • Cidden merak ediyorum: Bu nasıl işe yarıyor? Gerçekten faydalı olabilecek kullanım senaryolarını pek göremiyorum.
    • archivemount’un zaten bunu yaptığını sanıyordum; bir şeyi mi kaçırıyorum?
      Her hâlükârda istediğiniz şey tam olarak o olmasa bile FUSE daha genel bir mekanizma; istediğinizi yapmanıza, hatta fazlasına izin verecek gibi görünüyor.
  • git commit’lerini dosya sistemi olarak mount etmek de mümkün.
    https://jvns.ca/blog/2023/12/04/mounting-git-commits-as-fold...
    Önceki yazı: https://news.ycombinator.com/item?id=38527866

    • Şimdi hangi revizyonun seçileceğine karar veren dev bir kural yığını ekleyince, o kutsal değerlere aykırı iblis olan Rational ClearCase oluyor.
  • Başlığı görünce, eskiden aradığım ya da kendim yapmayı düşündüğüm şey sandım ve heyecanlandım. Burada sormak iyi olabilir.
    Mount edilmişken tmpfs gibi bellekte çalışan, unmount edildiğinde de diskte tek bir dosyaya serileştiren bir FUSE dosya sistemi var mı?
    En yakını arşiv dosyalarını mount eden FUSE sürücüleri, ama o zaman sembolik bağlantılar gibi şeyleri elde etmek zorlaşıyor.

    • Bulduklarım arasında en yakını https://github.com/guardianproject/libsqlfs.
      libsqlfs, SQLite veritabanı üzerinde POSIX tarzı bir dosya sistemi uygular. Tek bir dosyanın içinde kendi hiyerarşisi ve ad alanı olan okuma/yazma dosya sistemi sağlar; paylaşımlı kütüphane ya da FUSE modülü olarak kullanılabilir.
    • Tamamen bellek tabanlı değil ama https://github.com/jrwwallis/qcow2fuse gibi bir şey mümkün olabilir.
      OSX’in DMG’sine kıyasla kaba, ama hoşgörülü bakarsanız benzer bir amaca hizmet ediyor.
      Ya da tmpfs’i sarıp unmount sırasında sembolik bağlantıları koruyan bir tarball’a serileştirecek şekilde yapılabilir.
    • Neden mutlaka bellekte olması gerekiyor?
      Muhtemelen zaten biliyorsunuzdur; tamponları yalnızca unmount sırasında flush etmek veri bozulmasına yol açabilecek çok sayıda gerçekçi senaryo yaratır.
      Yine de çözmeye çalıştığınız sorun ilginç görünüyor.
    • Mutlaka FUSE olmak zorunda mı? Disk imajını loopback ile mount etmek olmaz mı?
    • Tam olarak böyle bir şey aklıma gelmiyor, ama bir imaj dosyasını /tmp içine kopyalayıp kullanmak, sonra unmount edip diske taşımak oldukça yakın olabilir.
  • Parts-of-file File System de var: https://www.usenix.org/conference/2005-usenix-annual-technic...

  • Omar Rizwan’ın TabFS’ini hatırlatıyor: <https://omar.website/tabfs/>

  • 2003’te bunu denemiştim. Şaşırtıcı derecede hızlıydı ve ince taneli kilitlemeyi kolaylaştırıyordu.
    Devasa bir web sitesi oluşturma aracı için web şablon dilinde, kullanıcı bazlı veritabanı olarak kullanmıştım.

  • Başlığı gördüğümde bir meme sandım.
    Ama gerçekten akıllıca bir fikir. Kişisel olarak çoğu veri işlemeyi daha yüksek seviyeli dillerde yaptığım için doğrudan kullanır mıyım bilmiyorum; yine de kullanım alanları bulacak insanlar olacaktır.
    Kalıpların dışında düşünülmüş iyi bir yaklaşım.

  • Gerçekten iyi görünüyor; mümkün olan en kısa sürede denemeliyim.
    JSON dosyalarının içinde gezinmek veya arama yapmak için iyi kullanılabilir gibi.

  • Bu ilginizi çektiyse Solvent-Configr da ilginizi çekebilir.
    https://aws.amazon.com/marketplace/pp/prodview-i3ym46leenag4
    Nesneleri dosya sistemi mekanizmalarıyla modelleyerek, dosya sistemi tarzı gezinmeyi destekleyen nesne tabanlı çözümler tasarlayabilirsiniz.
    Demo: https://youtu.be/XgTgubZQPHw