1 पॉइंट द्वारा GN⁺ 2024-05-02 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • ffs(file filesystem) एक ऐसा टूल है जो JSON, YAML, TOML जैसे semi-structured data को फ़ाइल सिस्टम के रूप में mount करके Unix shell tools से explore और edit करने देता है
  • Unix shell में string processing tools काफी हैं, लेकिन इसकी मूल data structure file system है, इसलिए यह tree-shaped data को edit करने के लिए अच्छी तरह fit नहीं बैठता
  • ffs [file] फ़ाइल को mount point से जोड़ता है और unmount करने पर updated result को stdout या तय output file में भेजता है
  • फ़ाइल लिखना और directory बनाना JSON keys और objects में convert होता है, और 1, true, false, खाली फ़ाइल क्रमशः number, boolean, null values के रूप में reflect होते हैं
  • Linux पर FUSE, macOS पर macFUSE चाहिए, और यह Windows, ऐसे environment जहाँ FUSE इस्तेमाल नहीं हो सकता, केवल search वाले काम, या बहुत बड़ी फ़ाइलों के लिए उपयुक्त नहीं हो सकता

Semi-structured data को directory की तरह संभालना

  • ffs का मतलब file filesystem है; यह semi-structured data को file system की तरह mount करके परिचित shell tools से काम करने देता है
  • अभी supported formats JSON, YAML, TOML हैं, और आगे और formats support करने की योजना है
  • विस्तृत usage ffs manpage में देखा जा सकता है

Mount और edit workflow

  • Default execution ffs [file] है; यह file.blah को file mount point पर mount करता है और final updated version को stdout पर output करता है
  • ffs -m MOUNT file से explicit mount point specify किया जा सकता है, और -o OUTPUT से output file specify की जा सकती है
  • ffs -i file फ़ाइल को inplace edit करता है; volume को unmount करने पर result वापस file में लिखा जाता है
  • Example में दिखने वाले conversion rules

    • echo Mikey Indiana >object/name JSON के name value को बदलता है
    • echo 1 >object/nose string नहीं, बल्कि number 1 के रूप में reflect होता है
    • mkdir object/pockets और उसके अंदर की files JSON object में convert होती हैं
    • खाली फ़ाइल mistakes JSON में null के रूप में record होती है

Installation requirements और distribution

  • Linux में FUSE चाहिए
  • macOS में macFUSE चाहिए
  • Latest development builds Linux, macOS single executables के रूप में उपलब्ध हैं
  • Specific releases release page पर देखे जा सकते हैं, और current version 0.1.2 है
  • source से भी build किया जा सकता है

Related resources और comparison points

  • PLOS 2021 paper “Files-as-Filesystems for POSIX Shell Data Processing” उपलब्ध है
  • jq और gron command line पर JSON संभालने वाले tools हैं
  • ffs की अलग पहचान यह है कि यह कई formats support करता है, परिचित shell tools से edit करने देता है, और नई language सीखने की जरूरत नहीं पड़ती
  • Windows usage, FUSE न इस्तेमाल कर पाने की स्थिति, केवल search की जरूरत वाले काम, और बहुत बड़ी files ffs के लिए उपयुक्त नहीं हो सकते
  • License GPLv3 है

1 टिप्पणियां

 
GN⁺ 2024-05-02
Hacker News टिप्पणियाँ
  • यह कमाल का है। हाल ही में मैंने libfuse को Nim में wrap करने के बाद hello filesystem example को port किया, और लगभग यही चीज़ बनाकर देखी
    मेरे version में data को pipe से देना पड़ता है और mount point specify करना पड़ता है, और काम खत्म होने पर result को standard output पर लिखता है। इसलिए इसे pipe chain के अंदर फिट किया जा सकता है, लेकिन output भी खुद संभालना पड़ता है
    अभी मैं यह भी तलाश रहा हूँ कि क्या दूसरी चीज़ों को भी filesystem बनाया जा सकता है। मैंने Nimdow window manager के लिए एक status bar भी बनाई, जहाँ individual files में content लिखने पर blocks वाली bar output के रूप में बनती है, जिससे status bar की सामग्री को आसानी से बदला जा सकता है
    एक और tool जो बनाया, वह libvlc-आधारित music player है। उसे folder देने पर वह ID3 tags वाले media को पढ़ता है और by-artist, by-album जैसे folders बनाता है। हर file का नाम - होता है और उसमें actual file का full path होता है। गाना चलाने के लिए किसी file को control/current पर cat करना होता है और control/command में play लिखना होता है। playlist features और commands और भी हैं, लेकिन लक्ष्य ऐसा music player बनाना है जिसे script करना बहुत आसान हो

    • एक idea: code files या project को recursively mount करना। tree-sitter जैसी चीज़ से class और function definitions निकालकर, actual file को दर्शाने वाली directory के अंदर उन्हें अलग-अलग “files” बनाया जा सकता है
      अगर codebase की structure समझनी हो तो बस tree चला लो :)
      और गहराई में जाएँ तो imports को symbolic links वगैरह के रूप में resolve भी किया जा सकता है, काफ़ी दिलचस्प संभावनाएँ हैं
    • सोच रहा हूँ क्या आप Nim code share कर सकते हैं। कुछ समय से FUSE के साथ कुछ करना चाहता था, और कुछ projects में Nim इस्तेमाल कर रहा हूँ
    • लगता है अच्छा होगा अगर process information को filesystem के रूप में expose करने का कोई built-in तरीका हो
      उदाहरण के लिए music player का current track name पाने के लिए cat /proc/$pid/fs/current_track, या browser के खुले tabs की list देखने के लिए ls /proc/$pid/fs/tabs जैसा कुछ। शायद HTML या embedded images भी निकाली जा सकती हों
      अभी भी यह FUSE से किया जा सकता है, लेकिन इतना झंझट वाला है कि कोई करता नहीं
  • यह काफ़ी उपयोगी है, इसलिए इसे operating system स्तर की standard feature होना चाहिए
    Unix-परिवार के operating systems disk images को mount करके उनका content देखने देते हैं। लेकिन file के अंदर file को explore करना हो तो उपयोगी formats इससे कहीं ज़्यादा हैं। compressed archives इसका बढ़िया उदाहरण हैं
    कुछ file managers इसे support करते हैं, लेकिन इसे application layer में रखना सबसे सही जगह नहीं लगता। शायद file-format-specific drivers की तरह implement किया जा सकता है

    • असल में ज़रूरत यह है कि हर file format के लिए mount command लिखी जाए, और file format detect करके सही dispatch करने के लिए अलग command हो। शायद वह file command जैसी होगी, और यह सब user space में संभव होना चाहिए
      अभी इसे रोकने वाला एकमात्र कारण यह है कि MacOS user-space filesystem API expose नहीं करता। Linux, Windows, BSD में यह पहले से संभव है
      अगर कोई Apple developer यह पढ़ रहा हो, तो file provider extensions काफ़ी नहीं हैं। FUSE के बराबर कुछ दीजिए। मुझे पता है कि वह मौजूद है
    • avfs पहले से है। यह FUSE filesystem के रूप में यह काम करता है। इसका usage सबसे intuitive नहीं है, लेकिन काम करता है और extend भी किया जा सकता है
      https://avf.sourceforge.net/
    • यह reiserfsv4 की मुख्य design feature थी, लेकिन Linux ने आख़िरकार इसे merge करने से मना कर दिया। शायद पत्नी की हत्या वाले मामले ने भी मदद नहीं की होगी
    • सच में जिज्ञासा है, यह उपयोगी कैसे है? मुझे कोई ठोस use case समझ नहीं आ रहा
    • मुझे लगा archivemount पहले से यही करता है, या मैं कुछ miss कर रहा हूँ?
      खैर, अगर वही आपकी चाहत नहीं भी है, तो FUSE कहीं ज़्यादा general mechanism है, इसलिए यह आपकी ज़रूरत का काम करा सकता है, और शायद उससे भी ज़्यादा
  • git commits को filesystem की तरह mount भी किया जा सकता है
    https://jvns.ca/blog/2023/12/04/mounting-git-commits-as-fold...
    पिछली पोस्ट: https://news.ycombinator.com/item?id=38527866

    • अब बस एक बहुत बड़ा ruleset चाहिए जो तय करे कि कौन-सा revision चुनना है, और फिर वह उस अपवित्र दानव Rational ClearCase में बदल जाएगा
  • शीर्षक देखकर मैं उत्साहित हो गया था कि शायद यह वही चीज़ है जिसे मैं पहले ढूँढ़ रहा था या खुद बनाना चाहता था। लगा यहाँ पूछना ठीक रहेगा
    क्या ऐसा कोई FUSE filesystem है जो mounted रहते समय tmpfs की तरह memory में चले, और unmount करते समय उसे disk पर एक single file में serialize कर दे?
    archive files को mount करने वाले FUSE drivers सबसे क़रीब लगते हैं, लेकिन फिर symbolic links जैसी चीज़ें पाना मुश्किल हो जाता है

    • जो सबसे क़रीब मिला वह https://github.com/guardianproject/libsqlfs है
      libsqlfs SQLite database के ऊपर POSIX-style filesystem implement करता है। यह single file के अंदर अपने hierarchy और namespace के साथ read/write filesystem देता है, और shared library या FUSE module की तरह इस्तेमाल किया जा सकता है
    • यह pure in-memory नहीं है, लेकिन https://github.com/jrwwallis/qcow2fuse जैसी कोई चीज़ काम आ सकती है
      OSX के DMG जितना polished नहीं है, लेकिन उदार नज़र से देखें तो काफ़ी मिलता-जुलता उद्देश्य पूरा करता है
      या फिर tmpfs को wrap करके ऐसा बनाया जा सकता है कि unmount के समय उसे symbolic links सुरक्षित रखने वाले tarball में serialize कर दे
    • ज़रूरी क्यों है कि यह memory में ही हो?
      शायद आपको पहले से पता होगा, लेकिन अगर buffers सिर्फ unmount के समय flush हों, तो data corruption तक ले जाने वाले कई व्यावहारिक scenarios होते हैं
      फिर भी आप जो समस्या हल करना चाहते हैं, वह दिलचस्प लगती है
    • क्या यह ज़रूरी है कि FUSE ही हो? loopback से disk image mount करना काफ़ी नहीं होगा?
    • बिल्कुल वैसी चीज़ याद नहीं आ रही, लेकिन अगर किसी image file को /tmp में copy करके इस्तेमाल करें और unmount के बाद उसे disk पर वापस ले जाएँ, तो काफ़ी हद तक वैसा ही होगा
  • Parts-of-file File System भी है: https://www.usenix.org/conference/2005-usenix-annual-technic...

  • Omar Rizwan का TabFS याद आ गया: <https://omar.website/tabfs/>

  • मैंने 2003 में यह किया था। हैरानी की बात है कि यह तेज़ था, और fine-grained locking करना आसान हो गया था
    इसे मैंने एक बड़े website creation tool की web template language में per-user database की तरह इस्तेमाल किया था

  • शीर्षक देखकर पहले लगा यह कोई meme है
    लेकिन यह सच में बहुत चतुर idea है। व्यक्तिगत रूप से मैं ज़्यादातर data processing ऊँची-स्तर की languages में करता हूँ, इसलिए खुद शायद कम इस्तेमाल करूँ, लेकिन मुझे लगता है कि कुछ लोग इसके अच्छे use cases ज़रूर ढूँढ़ लेंगे
    यह box के बाहर सोचने वाला अच्छा approach है

  • यह सच में बढ़िया लग रहा है, इसे जल्द से जल्द आज़माना चाहिए
    JSON files के अंदर browse या search करने के लिए यह बहुत काम आ सकता है

  • अगर यह दिलचस्प लग रहा है, तो Solvent-Configr भी आपको पसंद आ सकता है
    https://aws.amazon.com/marketplace/pp/prodview-i3ym46leenag4
    यह filesystem mechanism से objects को model करता है, ताकि filesystem-style navigation support करने वाले object-based solutions design किए जा सकें
    demo: https://youtu.be/XgTgubZQPHw