Files
VRCT/src-python/docs/modules/utils.md

133 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## utils モジュールsrc-python/utils.py
このドキュメントは `src-python/utils.py` に対する最近のリファクタ内容、公開 API、利用上の注意点、テスト方法をまとめたものです。
### 概要
- `utils.py` はプロジェクト全体で使われる汎用ユーティリティ群を提供します。主な内容:
- ネットワーク接続チェック (`isConnectedNetwork`)
- ソケットの空きポート確認 (`isAvailableWebSocketServer`)
- IP アドレス検証 (`isValidIpAddress`)
- 計算デバイス一覧取得 (`getComputeDeviceList` / `getBestComputeType`)
- Base64 デコード (JSON) (`encodeBase64`)
- ロガー設定/ログ出力ヘルパー (`setupLogger`, `printLog`, `printResponse`, `errorLogging`)
### 今回のリファクタ(要点)
- Optional 依存へのフォールバック: `torch``ctranslate2` が存在しない環境でも動作するよう、import をガードし、安全なデフォルトを返す実装にしました。
- 型注釈と docstring を追加して可読性を向上させました。
- ログ設定の重複ハンドラ追加を防ぐチェックを導入しました。
- `encodeBase64` はデコード失敗時に例外を投げず空辞書を返すように(安全側)変更しました。
- `getComputeDeviceList` は GPU 情報取得で失敗しても CPU 情報を返すように例外保護を行いました。
### 重要な利用上の注意breaking/behavior changes
- Optional 依存
- `torch` が無い環境では GPU 情報は取得できません(`getComputeDeviceList` は CPU エントリのみ返します)。
- `ctranslate2``get_supported_compute_types` が無い場合は空リストを返します。
→ 環境に依存する挙動を想定して、呼び出し側は存在チェックやフォールバックを実装してください。
- `encodeBase64` の挙動
- 不正な base64/JSON を入力した場合、例外を投げず `{}` を返します。既存コードが例外を期待している場合は注意してください。
- `isAvailableWebSocketServer` の仕様
- 指定した host:port に対して bind が成功すれば True を返します(「使用中かどうか」を判定する用途と逆の意味合いになることがあるため注意)。
- ロギング
- `setupLogger` は同じログファイルに対するハンドラを重複して追加しません。`errorLogging()` はログ書き込みに失敗した場合でも最後に trace を stdout に出力するフォールバックがあります。
### API 使い方(短い例)
```python
from utils import getComputeDeviceList, encodeBase64, printResponse
devices = getComputeDeviceList()
print(devices)
obj = encodeBase64('eyAia2V5IjogInZhbHVlIiB9') # -> {'key': 'value'}
printResponse(200, '/health', {'status': 'ok'})
```
### テスト方針
- optional 依存の違いを扱うため、ユニットテストは `torch``ctranslate2` をモックして行うことを推奨します。
- 例: `getComputeDeviceList()` は GPU がない環境でも CPU のエントリを返すことを確認するテスト。
### トラブルシュート
- ログファイルの書き込みエラー: 権限やディスク容量を確認してください。`error.log``process.log` の存在と権限をチェックします。
- `getComputeDeviceList()` が空しか返さない場合、`torch` または `ctranslate2` のインストールを確認してください。
### 変更履歴
- 2025-10-09: 型注釈・docstring 追加、optional import ガード、ロギング堅牢化。
# utils.py — 関数一覧と使用例
目的: 共通ユーティリティログ、JSON 出力、ネットワーク/ポート検査、デバイス/計算タイプ列挙、バリデーション等)を提供します。
主要関数とシグネチャ:
- validateDictStructure(data: dict, structure: dict) -> bool
- isConnectedNetwork(url: str = "http://www.google.com", timeout: int = 3) -> bool
- isAvailableWebSocketServer(host: str, port: int) -> bool
- isValidIpAddress(ip_address: str) -> bool
- getComputeDeviceList() -> dict
- getBestComputeType(device: str, device_index: int) -> str
- encodeBase64(data: str) -> dict
- removeLog() -> None
- setupLogger(name, log_file, level=logging.INFO) -> logging.Logger
- printLog(log: str, data: Any = None) -> None
- printResponse(status: int, endpoint: str, result: Any = None) -> None
- errorLogging() -> None
使用例:
```python
from utils import printResponse, getComputeDeviceList, validateDictStructure
# JSON 形式で mainloop に応答を返す
printResponse(200, '/get/data/version', {'version': '3.2.2'})
# 利用可能な計算デバイス一覧を取得
devices = getComputeDeviceList()
print(devices)
# 辞書構造のバリデーション
data = {'a': 1, 'b': {'c': 'x'}}
structure = {'a': int, 'b': {'c': str}}
ok = validateDictStructure(data, structure)
print('valid:', ok)
```
注意点:
- `printResponse` は stdout に JSON を出力しつつログファイルにも書き込みます。大きなオブジェクトは json.dumps で失敗する可能性があるため、例外処理が含まれています。
# utils.py — 詳細設計
目的: 小さなユーティリティ関数群。ロギング、ネットワーク検査、型検証、計算デバイス列挙など。
主要関数/変数:
- validateDictStructure(data: dict, structure: dict) -> bool
- 説明: 辞書が期待される構造(キーセットと値の型/入れ子)に完全一致するか検証する。
- 入力: data検証対象, structure期待構造: 値が型または入れ子 dict
- 出力: bool
- 例外: 型不一致や欠落時は False を返す(例外は投げない)。
- isConnectedNetwork(url="http://www.google.com", timeout=3) -> bool
- 説明: 指定 URL に HTTP GET して接続可否を判定。requests を使用。
- isAvailableWebSocketServer(host: str, port: int) -> bool
- 説明: 指定ポートへ bind できるかを試し、使用中かを判別するTrue=利用可能)。
- isValidIpAddress(ip_address: str) -> bool
- 説明: ipaddress.ip_address で検証。
- getComputeDeviceList() -> dict
- 説明: CPU と CUDA利用可能ならを列挙し、各デバイスでサポートされる compute types を取得する。
- 依存: torch, ctranslate2.get_supported_compute_types
- getBestComputeType(device: str, device_index: int) -> str
- 説明: デバイス名に基づき優先 compute_type を選び、利用可能なものを返す。デフォルトは "float32"。
- setupLogger(name, log_file, level=logging.INFO) -> Logger
- 説明: RotatingFileHandler を使って UTF-8 ログを作る。10MB ローテーション。
- printLog / printResponse / errorLogging
- 説明: mainloop と通信するために標準出力へ JSON を flush するユーティリティ。内部で file ログへも書く。
注意点:
- ネットワーク検査やファイル生成で例外が発生した場合、errorLogging() を呼んでトレースを error.log に保存する。