ffs: UNIX ファイルシステムとして JSON のような半構造化データをマウントするツール
- ffs は File Filesystem の略で、半構造化データをファイルシステムとしてマウントし、馴染みのあるシェルツールで JSON、YAML などのツリー構造を持つ現代的フォーマットを扱えるようにするツールです
sed のような文字列処理で JSON を編集する方法は適切ではないため、ffs を使うと便利です
- 現在 ffs は JSON、YAML、TOML をサポートしており、将来的により多くのフォーマット対応を予定しています
ffs 使用例
ffs [file] コマンドで file.blah を file というマウントポイントにマウントし、更新後の最終版ファイルを stdout に出力します
ffs -m MOUNT file で明示的なマウントポイントを指定できます
ffs -o OUTPUT で出力ファイルを指定できます
ffs -i file でファイルを直接編集でき、ボリュームをアンマウントすると結果が file に再度書き戻されます
- 編集時、nose キーの値が文字列ではなく数値になり、pockets ディレクトリがオブジェクトへ変換されることを確認できます
ffs のインストール方法
- Linux では FUSE が、macOS では macFUSE が必要です
- 単一の実行ファイルをダウンロードできます
- ソースからのビルドも可能です
ffs についてさらに詳しく
- PLOS 2021 の「Files-as-Filesystems for POSIX Shell Data Processing」を参照
- デモ動画と発表動画が公開されています
関連ツール比較
- jq、gron などは CLI で JSON を扱うための有用なツールです
- ffs は複数フォーマットのサポート、慣れたシェルツールでの編集、追加の言語学習が不要といった利点があります
- ただし Windows 非対応、FUSE 利用不可、検索のみ必要な場合、非常に大きなファイルの場合などには ffs が適していないことがあります
GN⁺の意見
- JSON、YAML、TOML など現代のウェブ開発でよく使われる半構造化データを扱う場面で有用そうです。特にシェルスクリプトで自動化を行う場合、強力な手段になりそうです
- ただし FUSE ベースのため性能面での問題が発生する可能性があり、Windows 非対応は残念です。WSL で利用可能かどうかは不明です
- オープンソースのため、より多くのフォーマットに対応できるよう貢献できる点が長所です。ユーザーとしては利便性と生産性向上に役立つでしょう
- sed や awk などのクラシックなテキスト処理ツールに慣れたエンジニアなら、学習コストをかけずにすぐ適用できます
- API 応答をローカルに保存してデバッグする場合や、半構造化された設定ファイルを頻繁に修正する必要がある場合に有用です
1件のコメント
Hacker News コメント
ユーザーが自作した libfuse を Nim でラップして「hello」ファイルシステムのサンプルをポーティングし、データをパイプ経由で受け渡し、マウントポイントを提供する版を作成した。完了時は stdout を通して結果を書き込む。これにより、パイプライン内でインラインに使えるが、出力は確実に取り込む必要がある。
現在、他にファイルシステムとして作れるものを模索中。Nimdow ウィンドウマネージャ向けにステータスバーを作成し、個別ファイルに内容を書き込むと、ブロック付きのバーを出力として生成できる。ステータスバーの内容を簡単に置き換えられるため、非常に便利だ。
libvlc を使った音楽プレイヤーも作成した。ID3 タグ付きのメディアを読み取り、「アーティスト別」「アルバム別」などのフォルダを作成する。各ファイルは「<トラック番号> - <曲名>」と命名され、実際のファイルのフルパスを含む。曲を再生するには、そのようなファイルの1つを
control/currentで cat し、control/commandに play という単語を書き込む。プレイリスト機能や追加のコマンドもあるが、基本的な考え方はこれだ。目標は、超強力なスクリプト可能な音楽プレイヤーを作ることだ。Unix 系 OS はディスクイメージをマウントして中身を探索できる。ただし、ファイル内部のファイル探索に役立つファイル形式はもっとある。圧縮アーカイブがその1つだ。一部のファイルマネージャはこれをサポートしているが、アプリケーション層でこの機能を入れるには最適な層ではない。ファイル種別ごとのドライバとして実装できる。
マウント中は tmpfs のようにメモリ内で実行され、アンマウント時にはディスク上の1つのファイルにシリアライズされる FUSE ファイルシステムを探している。アーカイブファイルをマウントする FUSE ドライバが最も近いが、シンボリックリンクのようなものは取得できない。
Git のコミットをファイルシステムとしてマウントすることもできる。(リンク参照)
Parts-of-file File System もある。(Usenix リンク参照)
Omar Rizwan の TabFS を想起させる。(リンク参照)
2003 年にこのようなことをやっていた。驚くほど速く、粒度の細かいロックを簡単に作れた。巨大なウェブサイト構築ツール向けのウェブテンプレート言語のユーザ別データベースとして使っていた。
JSON のキーにスラッシュがあるとどうなるか、という質問。
これにより、ファイルをディレクトリ構造としてコミットする可能性が開く。これがマージと衝突にどのような影響を与えるか気になる。
見た目がいい。できるだけ早く試してみるべきだという意見。JSON ファイル内部を検索し、ナビゲートするのに便利だろう。