1 poin oleh GN⁺ 2024-05-02 | 1 komentar | Bagikan ke WhatsApp
  • ffs(file filesystem) adalah alat yang me-mount data semi-terstruktur seperti JSON, YAML, dan TOML sebagai sistem file agar bisa dijelajahi dan diedit dengan alat shell Unix
  • Shell Unix kaya akan alat pemrosesan string, tetapi karena struktur data dasarnya adalah sistem file, shell ini kurang cocok untuk mengedit data berbentuk pohon
  • ffs [file] menghubungkan file ke mount point, lalu saat di-unmount mengekspor hasil yang telah diperbarui ke stdout atau ke file output yang ditentukan
  • Penulisan file dan pembuatan direktori diubah menjadi key dan objek JSON; 1, true, false, dan file kosong masing-masing direpresentasikan sebagai nilai angka, boolean, dan null
  • Linux memerlukan FUSE, macOS memerlukan macFUSE, dan alat ini mungkin tidak cocok untuk Windows, lingkungan yang tidak bisa memakai FUSE, pekerjaan yang hanya butuh pencarian, atau file yang sangat besar

Menangani data semi-terstruktur seperti direktori

  • ffs adalah singkatan dari file filesystem, yang me-mount data semi-terstruktur seperti sistem file agar bisa dikerjakan dengan alat shell yang sudah familiar
  • Format yang saat ini didukung adalah JSON, YAML, dan TOML, dan dukungan untuk lebih banyak format direncanakan
  • Cara penggunaan lengkap bisa dilihat di ffs manpage

Alur mount dan pengeditan

  • Eksekusi dasarnya adalah ffs [file], yang me-mount file.blah ke mount point file dan mencetak versi akhir yang telah diperbarui ke stdout
  • Dengan ffs -m MOUNT file Anda bisa menentukan mount point secara eksplisit, dan dengan -o OUTPUT Anda bisa menentukan file output
  • ffs -i file mengedit file di tempat, dan saat volume di-unmount hasilnya akan ditulis kembali ke file
  • Aturan konversi yang terlihat pada contoh

    • echo Mikey Indiana >object/name mengubah nilai name di JSON
    • echo 1 >object/nose diterapkan sebagai angka 1, bukan string
    • mkdir object/pockets dan file-file di dalamnya diubah menjadi objek JSON
    • File kosong mistakes dicatat sebagai null di JSON

Syarat instalasi dan distribusi

  • Di Linux diperlukan FUSE
  • Di macOS diperlukan macFUSE
  • Build pengembangan terbaru tersedia sebagai executable tunggal untuk Linux dan macOS
  • Rilis tertentu bisa dilihat di release page, dan versi saat ini adalah 0.1.2
  • Anda juga bisa membangunnya dari source

Materi terkait dan titik perbandingan

  • Ada makalah PLOS 2021 “Files-as-Filesystems for POSIX Shell Data Processing”
  • jq dan gron adalah alat untuk menangani JSON dari baris perintah
  • Keunggulan ffs adalah mendukung beberapa format, bisa diedit dengan alat shell yang familiar, dan tidak mengharuskan mempelajari bahasa baru
  • Penggunaan di Windows, kondisi tanpa FUSE, pekerjaan yang hanya memerlukan pencarian, atau file yang sangat besar mungkin tidak cocok untuk ffs
  • Lisensinya adalah GPLv3

1 komentar

 
GN⁺ 2024-05-02
Komentar Hacker News
  • Ini keren. Baru-baru ini saya membungkus libfuse dengan Nim, lalu mem-port contoh filesystem hello, dan mencoba membuat sesuatu yang hampir sama
    Versi saya memasukkan data lewat pipe dan harus menentukan titik mount, lalu setelah selesai menulis hasilnya ke standard output. Jadi bisa disisipkan ke dalam rantai pipe, tetapi output-nya juga harus ditangani sendiri
    Saat ini saya sedang mengeksplorasi apakah hal lain juga bisa dibuat menjadi filesystem. Saya juga membuat status bar untuk window manager Nimdow; jika menulis konten ke file-file individual, akan terbentuk bar berisi blok sebagai output sehingga isi status bar bisa diganti dengan mudah
    Alat lain yang saya buat adalah pemutar musik berbasis libvlc. Jika diberi sebuah folder, alat ini membaca media yang memiliki tag ID3 dan menyusun folder seperti by-artist, by-album. Setiap file bernama - dan berisi path lengkap file aslinya. Untuk memutar lagu, caranya seperti melakukan cat satu file ke control/current dan menulis play ke control/command. Ada fitur dan perintah playlist lain, tetapi tujuannya adalah membuat pemutar musik yang sangat mudah di-script

    • Satu ide: me-mount file kode atau proyek secara rekursif. Dengan sesuatu seperti tree-sitter, definisi class dan fungsi bisa diekstrak, lalu masing-masing dibuat sebagai “file” di dalam direktori yang merepresentasikan file aslinya
      Jika ingin memahami struktur codebase, cukup jalankan tree :)
      Kalau masuk lebih dalam, import mungkin juga bisa diinterpretasikan sebagai symbolic link dan sebagainya; ada banyak kemungkinan menarik
    • Saya penasaran apakah Anda bisa membagikan kode Nim-nya. Sudah cukup lama saya ingin mencoba sesuatu dengan FUSE, dan saya menggunakan Nim di beberapa proyek
    • Terpikir bahwa akan bagus jika ada cara bawaan untuk mengekspos informasi proses sebagai filesystem dengan mudah
      Misalnya menjalankan cat /proc/$pid/fs/current_track untuk mendapatkan nama lagu yang sedang diputar di pemutar musik, atau ls /proc/$pid/fs/tabs untuk melihat daftar tab yang terbuka di browser. Mungkin HTML atau gambar yang disematkan juga bisa diambil
      Sekarang ini memang bisa dengan FUSE, tetapi merepotkan sehingga tidak ada yang melakukannya
  • Menurut saya ini cukup berguna sehingga seharusnya menjadi fitur standar di tingkat sistem operasi
    Sistem operasi keluarga Unix bisa me-mount disk image dan menjelajahi isinya. Namun jika menelusuri file di dalam file, ada jauh lebih banyak format yang berguna. Arsip terkompresi adalah contoh utamanya
    Sebagian file manager mendukung ini, tetapi menurut saya menaruhnya di lapisan aplikasi bukanlah tempat yang optimal. Sepertinya bisa diimplementasikan dengan pendekatan semacam driver per format file

    • Yang benar-benar dibutuhkan adalah cara menulis perintah mount untuk tiap format file, serta perintah terpisah yang mendeteksi format file dan melakukan dispatch ke yang sesuai. Mungkin mirip dengan perintah file, dan semuanya seharusnya bisa dilakukan di user space
      Satu-satunya faktor yang menghambat hal ini sekarang adalah MacOS tidak mengekspos API filesystem user space. Di Linux, Windows, dan BSD ini sudah memungkinkan
      Jika ada developer Apple yang melihat ini: ekstensi File Provider tidak cukup. Berikan padanan FUSE. Saya tahu itu ada
    • Sudah ada avfs. Itu melakukan hal ini sebagai filesystem FUSE. Cara pakainya bukan yang paling intuitif, tetapi berfungsi dan juga bisa diperluas
      https://avf.sourceforge.net/
    • Ini adalah fitur desain inti dari reiserfsv4, tetapi Linux akhirnya menolak untuk menggabungkannya. Mungkin kasus pembunuhan istrinya juga tidak membantu
    • Saya benar-benar penasaran, bagaimana ini berguna? Saya sulit melihat use case yang benar-benar bermanfaat
    • Saya kira archivemount sudah melakukan itu; apakah ada yang saya lewatkan?
      Bagaimanapun, sekalipun itu bukan yang Anda inginkan, FUSE adalah mekanisme yang lebih umum, jadi sepertinya bisa memungkinkan Anda melakukan hal yang diinginkan, bahkan lebih
  • Commit git juga bisa di-mount sebagai filesystem
    https://jvns.ca/blog/2023/12/04/mounting-git-commits-as-fold...
    Tulisan sebelumnya: https://news.ycombinator.com/item?id=38527866

    • Sekarang tinggal tambahkan tumpukan aturan raksasa untuk menentukan revisi mana yang dipilih, maka jadilah iblis terkutuk bernama Rational ClearCase
  • Saat melihat judulnya, saya berharap ini adalah sesuatu yang dulu pernah saya cari atau ingin saya buat sendiri. Sepertinya cocok bertanya di sini
    Apakah ada filesystem FUSE yang, selama di-mount, berjalan di memori seperti tmpfs, lalu saat di-unmount diserialisasi menjadi satu file tunggal di disk?
    Yang paling mendekati adalah driver FUSE yang me-mount file arsip, tetapi dengan begitu sulit mendapatkan hal seperti symbolic link

    • Yang paling mendekati yang saya temukan adalah https://github.com/guardianproject/libsqlfs
      libsqlfs mengimplementasikan filesystem bergaya POSIX di atas database SQLite. Ini menyediakan filesystem baca/tulis dengan hierarki dan namespace sendiri di dalam satu file, dan bisa digunakan sebagai shared library atau modul FUSE
    • Meski bukan murni berbasis memori, sesuatu seperti https://github.com/jrwwallis/qcow2fuse mungkin bisa
      Memang kasar dibanding DMG di OSX, tetapi jika dilihat dengan toleran, tujuannya mirip
      Atau bisa juga membungkus tmpfs agar saat unmount diserialisasi menjadi tarball yang mempertahankan symbolic link
    • Mengapa harus berada di memori?
      Seperti yang mungkin sudah Anda tahu, ada banyak skenario realistis di mana hanya melakukan flush buffer saat unmount bisa berujung pada kerusakan data
      Tetap saja, masalah yang ingin Anda pecahkan terlihat menarik
    • Apakah harus FUSE? Tidak bisakah me-mount disk image lewat loopback?
    • Saya tidak terpikir sesuatu yang persis seperti itu, tetapi menyalin suatu file image ke /tmp, menggunakannya, lalu setelah unmount memindahkannya ke disk sepertinya cukup mendekati
  • Ada juga Parts-of-file File System: https://www.usenix.org/conference/2005-usenix-annual-technic...

  • Saya teringat TabFS buatan Omar Rizwan: <https://omar.website/tabfs/>

  • Saya pernah melakukan ini pada 2003. Mengejutkannya, ini cepat, dan membuat fine-grained locking mudah dilakukan
    Saya memakainya sebagai database per pengguna dalam bahasa template web untuk alat pembuatan situs web besar

  • Saat melihat judulnya, saya kira ini meme
    Ternyata idenya benar-benar cerdas. Secara pribadi, saya melakukan sebagian besar pemrosesan data di bahasa tingkat lebih tinggi, jadi saya tidak yakin akan memakainya langsung, tetapi sepertinya akan ada orang yang menemukan use case-nya
    Pendekatan bagus yang berpikir di luar kebiasaan

  • Ini tampak sangat bagus, dan saya harus mencobanya sesegera mungkin
    Sepertinya akan sangat berguna untuk menjelajahi atau mencari di dalam file JSON

  • Jika ini menarik bagi Anda, Solvent-Configr juga mungkin menarik
    https://aws.amazon.com/marketplace/pp/prodview-i3ym46leenag4
    Dengan memodelkan objek melalui mekanisme filesystem, Anda bisa merancang solusi berbasis objek yang mendukung penjelajahan ala filesystem
    Demo: https://youtu.be/XgTgubZQPHw