1 điểm bởi GN⁺ 2024-05-02 | 1 bình luận | Chia sẻ qua WhatsApp
  • ffs(file filesystem) là công cụ cho phép mount dữ liệu bán cấu trúc như JSON, YAML, TOML dưới dạng hệ thống tệp để có thể duyệt và chỉnh sửa bằng các công cụ Unix shell
  • Unix shell có nhiều công cụ xử lý chuỗi phong phú, nhưng vì cấu trúc dữ liệu cơ bản là hệ thống tệp, nên không thực sự phù hợp để chỉnh sửa dữ liệu dạng cây
  • ffs [file] sẽ gắn tệp vào mount point, và khi unmount sẽ xuất kết quả đã cập nhật ra stdout hoặc ra tệp đầu ra được chỉ định
  • Việc ghi tệp và tạo thư mục sẽ được chuyển thành key JSON và object, trong đó 1, true, false, tệp rỗng sẽ lần lượt được phản ánh thành giá trị số, boolean, và null
  • Linux cần FUSE, macOS cần macFUSE, và công cụ này có thể không phù hợp với Windows, môi trường không dùng được FUSE, tác vụ chỉ đọc để tìm kiếm, hoặc các tệp rất lớn

Xử lý dữ liệu bán cấu trúc như thư mục

  • ffs là viết tắt của file filesystem, cho phép mount dữ liệu bán cấu trúc như một hệ thống tệp để làm việc bằng các công cụ shell quen thuộc
  • Các định dạng hiện được hỗ trợ là JSON, YAML, TOML, và dự kiến sẽ hỗ trợ thêm nhiều định dạng khác
  • Có thể xem cách dùng chi tiết trong ffs manpage

Quy trình mount và chỉnh sửa

  • Cách chạy cơ bản là ffs [file], sẽ mount file.blah vào mount point file và in bản cập nhật cuối cùng ra stdout
  • Có thể chỉ định mount point rõ ràng bằng ffs -m MOUNT file, và chỉ định tệp đầu ra bằng -o OUTPUT
  • ffs -i file sẽ chỉnh sửa tệp tại chỗ, và khi unmount volume thì kết quả sẽ được ghi trở lại vào file
  • Quy tắc chuyển đổi thể hiện trong ví dụ

    • echo Mikey Indiana >object/name sẽ thay đổi giá trị name trong JSON
    • echo 1 >object/nose sẽ được phản ánh thành số 1, không phải chuỗi
    • mkdir object/pockets và các tệp bên trong nó sẽ được chuyển thành object JSON
    • Tệp rỗng mistakes sẽ được ghi là null trong JSON

Điều kiện cài đặt và phân phối

  • Trên Linux cần FUSE
  • Trên macOS cần macFUSE
  • Bản build phát triển mới nhất được cung cấp dưới dạng tệp thực thi đơn cho LinuxmacOS
  • Có thể xem các bản phát hành cụ thể trên release page, và phiên bản hiện tại là 0.1.2
  • Cũng có thể build từ source

Tài liệu liên quan và các điểm so sánh

  • Có bài báo PLOS 2021 “Files-as-Filesystems for POSIX Shell Data Processing”
  • jqgron là các công cụ xử lý JSON trên dòng lệnh
  • Điểm khác biệt của ffs là hỗ trợ nhiều định dạng, có thể chỉnh sửa bằng các công cụ shell quen thuộc, và không cần học một ngôn ngữ mới
  • ffs có thể không phù hợp nếu dùng Windows, không thể dùng FUSE, chỉ cần thao tác tìm kiếm, hoặc làm việc với các tệp rất lớn
  • Giấy phép là GPLv3

1 bình luận

 
GN⁺ 2024-05-02
Ý kiến trên Hacker News
  • Cái này hay đấy. Gần đây tôi bọc libfuse bằng Nim rồi port ví dụ hệ thống tệp hello, và cũng thử làm một thứ gần như tương tự
    Phiên bản của tôi cần đưa dữ liệu vào bằng pipe và chỉ định điểm mount; khi xong thì ghi kết quả ra đầu ra chuẩn. Vì vậy có thể chèn nó vào một chuỗi pipe, nhưng cũng phải tự lo phần đầu ra
    Hiện tôi đang khám phá xem có thể biến những thứ khác thành hệ thống tệp không. Tôi cũng làm một thanh trạng thái cho trình quản lý cửa sổ Nimdow; khi ghi nội dung vào từng tệp riêng lẻ, một thanh có các block sẽ được tạo ở đầu ra, nên có thể dễ dàng thay nội dung thanh trạng thái
    Một công cụ khác tôi làm là trình phát nhạc dựa trên libvlc. Khi đưa vào một thư mục, nó đọc các media có thẻ ID3 và tạo các thư mục như by-artist, by-album. Mỗi tệp có tên là - và chứa đường dẫn đầy đủ của tệp thật. Để phát một bài, chỉ cần cat một tệp vào control/current rồi ghi play vào control/command. Nó còn có thêm tính năng playlist và lệnh khác, nhưng mục tiêu là tạo một trình phát nhạc cực kỳ dễ script

    • Một ý tưởng: mount đệ quy các tệp mã nguồn hoặc dự án. Có thể dùng thứ như tree-sitter để trích xuất định nghĩa lớp và hàm, rồi tạo mỗi định nghĩa thành một “tệp” bên trong thư mục đại diện cho tệp thật
      Nếu muốn nắm cấu trúc codebase thì chỉ cần chạy tree :)
      Đi sâu hơn nữa, có lẽ cũng có thể diễn giải import thành symbolic link, v.v.; có rất nhiều khả năng thú vị
    • Tôi tò mò liệu bạn có thể chia sẻ mã Nim không. Tôi đã muốn thử làm gì đó với FUSE một thời gian, và đang dùng Nim trong vài dự án
    • Tôi nghĩ sẽ rất hay nếu có một cơ chế tích hợp sẵn để dễ dàng phơi bày thông tin tiến trình dưới dạng hệ thống tệp
      Ví dụ như cat /proc/$pid/fs/current_track để lấy tên bài hiện tại của trình phát nhạc, hoặc ls /proc/$pid/fs/tabs để xem danh sách tab đang mở của trình duyệt. Có khi còn có thể lấy cả HTML hoặc ảnh nhúng
      Hiện giờ FUSE cũng làm được, nhưng phiền phức nên chẳng ai làm
  • Tôi thấy nó đủ hữu ích để nên trở thành tính năng chuẩn ở cấp hệ điều hành
    Các hệ điều hành họ Unix có thể mount ảnh đĩa để xem nội dung. Nhưng nếu duyệt các tệp nằm bên trong một tệp, số định dạng hữu ích còn nhiều hơn nhiều. Ví dụ điển hình là các kho lưu trữ nén
    Một số trình quản lý tệp có hỗ trợ chuyện này, nhưng tôi không nghĩ đặt nó ở tầng ứng dụng là vị trí tối ưu. Có thể triển khai theo kiểu driver cho từng định dạng tệp

    • Thứ thật sự cần là một cách viết lệnh mount cho từng định dạng tệp, và một lệnh riêng để phát hiện định dạng tệp rồi dispatch phù hợp. Có lẽ nó sẽ giống lệnh file, và tất cả nên làm được trong user space
      Yếu tố duy nhất đang cản trở hiện nay là MacOS không phơi bày API hệ thống tệp user-space. Trên Linux, Windows, BSD thì đã làm được rồi
      Nếu có lập trình viên Apple nào đang đọc: file provider extension là chưa đủ. Hãy cho chúng tôi thứ tương đương FUSE. Tôi biết nó có tồn tại
    • Đã có avfs rồi. Nó làm việc này bằng một hệ thống tệp FUSE. Cách dùng không trực quan nhất, nhưng nó hoạt động và cũng có thể mở rộng
      https://avf.sourceforge.net/
    • Đây từng là tính năng thiết kế cốt lõi của reiserfsv4, nhưng Linux rốt cuộc đã từ chối merge. Có lẽ vụ giết vợ cũng không giúp ích gì
    • Tôi thật lòng thắc mắc: cái này hữu ích như thế nào? Tôi không thấy rõ các use case thực tế có thể hữu dụng
    • Tôi tưởng archivemount đã làm việc đó rồi; có phải tôi đang bỏ sót gì không?
      Dù sao thì, ngay cả nếu đó không phải thứ bạn muốn, FUSE là một cơ chế tổng quát hơn và có vẻ sẽ cho phép bạn làm điều mình muốn, thậm chí hơn thế nữa
  • Cũng có thể mount các commit git thành hệ thống tệp
    https://jvns.ca/blog/2023/12/04/mounting-git-commits-as-fold...
    Bài trước: https://news.ycombinator.com/item?id=38527866

    • Giờ chỉ cần thêm một đống quy tắc khổng lồ để quyết định chọn revision nào, là ta có con quỷ báng bổ Rational ClearCase
  • Nhìn tiêu đề tôi đã kỳ vọng vì tưởng đây là thứ mình từng tìm, hoặc từng định tự làm. Có lẽ hỏi ở đây là hợp lý
    Có hệ thống tệp FUSE nào chạy trong bộ nhớ như tmpfs khi đang được mount, rồi khi unmount thì serialize thành một tệp duy nhất trên đĩa không?
    Gần nhất là các driver FUSE mount tệp archive, nhưng như vậy khó có được những thứ như symbolic link

    • Thứ gần nhất tôi tìm được là https://github.com/guardianproject/libsqlfs
      libsqlfs triển khai một hệ thống tệp kiểu POSIX trên cơ sở dữ liệu SQLite. Nó cung cấp hệ thống tệp đọc/ghi trong một tệp duy nhất, có phân cấp và namespace riêng, và có thể dùng như shared library hoặc module FUSE
    • Không phải thuần bộ nhớ, nhưng có thể những thứ như https://github.com/jrwwallis/qcow2fuse sẽ làm được
      So với DMG của OSX thì thô hơn, nhưng nếu nhìn rộng rãi thì đạt mục đích tương tự
      Hoặc cũng có thể bọc tmpfs để khi unmount thì serialize thành tarball có bảo toàn symbolic link
    • Tại sao nhất thiết phải nằm trong bộ nhớ?
      Chắc bạn đã biết, nhưng có nhiều kịch bản thực tế trong đó chỉ flush buffer khi unmount có thể dẫn đến hỏng dữ liệu
      Dù vậy, vấn đề bạn đang cố giải có vẻ thú vị
    • Có nhất thiết phải là FUSE không? Không thể mount ảnh đĩa bằng loopback à?
    • Tôi không nghĩ ra thứ đúng y như vậy, nhưng có lẽ khá gần nếu copy một tệp image nào đó vào /tmp để dùng, rồi sau khi unmount thì chuyển nó ra đĩa
  • Cũng có Parts-of-file File System: https://www.usenix.org/conference/2005-usenix-annual-technic...

  • Làm tôi nhớ đến TabFS của Omar Rizwan: <https://omar.website/tabfs/>

  • Tôi đã làm việc này vào năm 2003. Đáng ngạc nhiên là nó nhanh, và giúp khóa chi tiết dễ hơn
    Tôi dùng nó như cơ sở dữ liệu theo người dùng trong một ngôn ngữ template web cho công cụ tạo website khổng lồ

  • Khi nhìn tiêu đề, tôi tưởng đây là meme
    Nhưng hóa ra là một ý tưởng thật sự thông minh. Cá nhân tôi chủ yếu xử lý dữ liệu ở các ngôn ngữ cấp cao hơn nên không rõ mình có dùng trực tiếp không, nhưng chắc sẽ có người tìm ra use case
    Một cách tiếp cận hay, nghĩ ngoài khuôn khổ

  • Trông rất tuyệt, tôi phải thử càng sớm càng tốt
    Có vẻ rất hữu ích để duyệt hoặc tìm kiếm bên trong tệp JSON

  • Nếu thấy cái này thú vị thì có thể bạn cũng sẽ quan tâm Solvent-Configr
    https://aws.amazon.com/marketplace/pp/prodview-i3ym46leenag4
    Bằng cách mô hình hóa đối tượng bằng cơ chế hệ thống tệp, bạn có thể thiết kế các giải pháp dựa trên đối tượng hỗ trợ duyệt kiểu hệ thống tệp
    Demo: https://youtu.be/XgTgubZQPHw