0
0

Pythonでカラフルなファイルシステムを作ってみた

Last updated at Posted at 2023-11-22

今回は、Pythonでカラフルなファイルシステムを作ってみました。

最近、Pythonでオリジナルのファイルシステムを作っています。色付けと簡単なフォーマットを適用するだけで見栄えが良くなることに気づいたので、そのコードを紹介します。

Decoderの準備

まず、色付けとログ記録を自動で行ってくれるデコレータのfuse_method関数です。この関数はデコレートされたメソッドを実行し、例外が発生した場合にはerror関数を呼び出します。

def fuse_method(f):
    def wrapped_func(*args, **kw):
        try:
            return f(*args, **kw)
        except:
            error('Unhandled error')
    return wrapped_func

次に、エラーメッセージを表示するためのerror、警告メッセージを表示するためのwarn、情報メッセージを表示するためのinfo、デバッグメッセージを表示するためのdebug関数です。

def error(*args, **kw):
    from traceback import format_exc
    print(f'{Fore.RED}ERRO{Fore.RESET}', *args, *kw)
    for line in format_exc().splitlines():
        print(f'{Fore.RED}   *{Fore.RESET}', line)

def warn(*args, **kw):
    print(f'{Fore.YELLOW}WARN{Fore.RESET}', *args, **kw)

def info(*args, **kw):
    print(f'{Fore.GREEN}INFO{Fore.RESET}', *args, **kw)

def debug(*args, **kw):
    print(f'{Fore.***}DEBG{Fore.RESET}', *args, **kw)

これらの関数を使うと、簡単にログを出力できます。以下はファイルシステムの一部のコード例です。

class OreOreFS(Fuse):
    ...
    @fuse_method
    def readlink(self, path):
        ....

このようにしてログ出力を自動化することができます。

オレオレファイルシステム

「オレオレファイルシステムって何?」と思われるかもしれませんが、これは私が考えた最強のファイルシステムです。実際には新しいファイルシステムを作ることはなく、既存のWebサービスをファイルシステムにマウントするフィルタドライバを作ることが多いです。特にWindowsでは、WebDAVのリダイレクタを作るだけで済む場合があります。ただし、WindowsでのFUSEの開発は少し難しいです。WSLで開発するか、Dokanを使うかを検討する必要があります。

PythonのFUSEライブラリであるpython-fuseを使用しています。以下はpython-fuseのサンプルコードの一部です。

https://github.com/libfuse/python-fuse/blob/master/example/hello.py

なお、pyfuseを使いたかったのですが、GentooのPortageには存在しなかったため、断念しました。

FUSEは以前、Dokanが全盛期の頃にたくさん開発したので、短期間で開発することができそうです。また、言語バインディングも豊富です。ただし、一番の問題は「どのようなファイルシステムにするか」ということです。ハードウェアから自作することも考えられますが、かなり手間がかかります。

さらに、ファイルシステムを作るために、さまざまなハードウェアの実験を行っています。例えば、ESP32のBLE LL周りのテストは非常に面倒ですが、ファイルシステムにすることで簡略化できるかもしれません。EEPROMなどのデバイスにアクセスすることもできますが、利用方法によっては少し手間がかかる場合があります。

コマンドを送信してデバイスに直接アクセスすることが好きなので、デバイスのドライバレベルの高度な操作はあまり詳しくありません(笑)

以前、遊びで購入したハードウェアのリンクを共有します。

https://jp.robotshop.com/products/devantech-usb-to-i2c-module

これはUSBを使用してさまざまなデバイスと通信するためのデバイスです。Cのサンプルコードのリンクも忘れてしまいましたが、どこかにあるはずです(笑)探してみて、見つかったら教えてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0