アーキテクチャ#
このドキュメントでは、haniwers プロジェクトのアーキテクチャと設計の決定について説明します。
デュアルバージョンシステム#
haniwers は2つの並行実装を維持しています:
v0: プロトタイプ版(will be deprecated)#
場所: src/haniwers/v0/
特徴:
プロダクション対応の安定版CLI
基本的な機能を提供
シンプルで実証済みのアーキテクチャ
主要コンポーネント:
cli.py: Typer ベースのメインCLIインターフェースconfig.py: 設定管理daq.py: データ取得ロジックthreshold.py: 閾値スキャンとフィッティングpreprocess.py: 生データ処理postprocess.py: データ解析ユーティリティ
v1: 次世代版(in development)#
場所: src/haniwers/v1/
特徴:
モダンでモジュラーなアーキテクチャ
より優れたテスト容易性
関心の分離が改善
主要コンポーネント:
cli/: モジュラーなCLI構造main.py: エントリーポイントとグローバルオプションconfig.py: 設定管理コマンドdaq.py: データ取得コマンドscan.py: 閾値スキャンコマンド
config/: Pydantic モデルによる設定管理daq/: デバイス抽象化によるデータ取得log/: Loguru による構造化ロギング
バージョンの選択#
v0 (
haniwers): デフォルトのメインCLIv0 明示的 (
haniwers-v0): 明示的なv0 CLIv1 (
haniwers-v1): 次世代v1 CLIv1 エイリアス (
haniwers-ng): 次世代版のエイリアス
技術スタック#
言語とランタイム#
Python: 3.12+
パッケージ管理: Poetry 2.0+
仮想環境:
poetry run <command>またはpoetry env activate注:
poetry shellは非推奨
コア依存関係#
CLI: Typer - コマンドラインインターフェース
シリアル通信: pyserial - OSECHI検出器との通信
設定: TOML - 設定ファイル形式
データ処理: Pandas/Polars - データフレーム操作
ロギング: Loguru (v1) - 構造化ロギング
バリデーション: Pydantic (v1) - 設定モデルの検証
開発ツール#
フォーマッター: Ruff
リンター: Ruff
テスト: pytest
カバレッジ: pytest-cov
コミット: Commitizen
Pre-commit: pre-commit
ドキュメント: Sphinx, MyST, autodoc2
v0 アーキテクチャ詳細#
モジュール構成#
haniwers/v0/cli.py#
責務: メインのCLIエントリーポイント
Typerベースのコマンド定義
サブコマンド:
daq,scan,fit,vth,ports,run2csvログ設定とオプション解析
統一されたエラー処理
haniwers/v0/config.py#
責務: 設定管理
Config,RunData,UserSettingsクラスTOML設定ファイルの読み込み
daq.toml: データ取得設定scan.toml: 閾値スキャン設定
パス管理と環境固有設定
haniwers/v0/daq.py#
責務: データ取得(DAQ)
シリアル通信(pyserial)による測定器制御
RealEventクラスによるイベントデータ構造ファイル保存とタイムスタンプ管理
haniwers/v0/threshold.py#
責務: 閾値制御
scan_thresholds_in_parallel: 並列閾値測定Countデータクラス: 測定結果の構造化フィット処理とCSV出力
haniwers/v0/dataset.py#
責務: データ処理
Runクラス: 測定データへのアクセスパス管理とファイル操作
データフレーム変換
haniwers/v0/preprocess.py & haniwers/v0/postprocess.py#
責務: データ処理パイプライン
生データの前処理とリサンプリング
可視化とプロット機能
CSV形式への変換
デザインパターン#
責務の分離:
CLI: コマンド定義とオプション解析
DAQ: ハードウェア制御とデータ取得
Config: TOML設定の管理
Data Processing: 前処理・後処理・可視化
設定による柔軟性:
外部設定ファイル(TOML)
実験ラン管理(runs.csv)
環境変数サポート
データフロー:
生データ取得 → 前処理 → CSV保存 → 可視化・解析
v1 アーキテクチャ詳細#
モジュール構成#
haniwers/v1/cli/#
モジュラーなCLI構造:
main.py: エントリーポイントとグローバルオプション処理config.py: 設定管理コマンド(show, init)daq.py: データ取得コマンドscan.py: 閾値スキャンコマンド
改善点:
コマンドごとにファイルを分離(保守性向上)
テスト容易性の大幅な改善(モック戦略)
新規コマンド追加が容易(main.pyは2行変更のみ)
100%後方互換性を維持
詳細: CLI開発ガイドを参照
haniwers/v1/config/#
モジュラーな設定管理:
model.py: Pydantic モデルによる設定の定義と検証loader.py: 設定ファイルの読み込みロジックgenerator.py: 設定ファイルのテンプレート生成
改善点:
型安全な設定
自動バリデーション
より良いエラーメッセージ
haniwers/v1/daq/#
デバイス抽象化:
device.py: デバイス抽象化層mocker.py: テスト用モックデバイスsampler.py: サンプリングロジックmodel.py: データモデル定義
改善点:
テスト容易性の向上(モック機能)
より明確な抽象化
デバイスの交換が容易
haniwers/v1/log/#
構造化ロギング:
logger.py: Loguru ベースのロガー設定
改善点:
JSON形式の構造化ログ
より良いデバッグ情報
ログレベルの柔軟な制御
デザインパターン#
モジュラリティ:
小さく、焦点を絞ったモジュール
明確なモジュール境界
再利用可能なコンポーネント
テスト容易性:
依存性注入
モック可能なインターフェース
単体テストフレンドリーな設計
データフロー#
測定ワークフロー#
1. 閾値スキャン (scan)
↓
2. 閾値フィッティング (fit)
↓
3. 閾値設定 (vth)
↓
4. データ取得 (daq)
↓
5. 生データ変換 (raw2tmp)
↓
6. CSV変換 (run2csv)
ファイル管理#
タイムスタンプベースの命名:
生データ:
YYYYMMDD_HHMMSS_raw.dat処理済み:
YYYYMMDD_HHMMSS_run.csv
ディレクトリ構造:
data/
├── YYYYMMDD_HHMMSS_run.csv
├── runs.csv
sandbox/
├── YYYYMMDD_HHMMSS_raw.dat
├── YYYYMMDD_HHMMSS_tmp.csv
設計原則#
1. CLI第一#
すべての機能はCLIから利用可能
スクリプト化とオートメーションが容易
対話的とバッチ実行の両方をサポート
2. 設定ファイルによる制御#
ハードコードされた値を避ける
環境固有の設定を外部化
バージョン管理可能な設定
3. モジュール性と再利用性#
小さく、焦点を絞った関数とクラス
明確な責務の分離
再利用可能なコンポーネント
4. データの完全性#
タイムスタンプによる追跡可能性
生データの保存
再現可能な処理パイプライン
5. 段階的な複雑化#
シンプルなv0から開始
段階的にv1で機能を追加
両バージョンの互換性を維持
依存関係管理#
Poetry を使用する理由#
決定論的なビルド:
poetry.lockによる再現可能なインストール依存関係の分離: 開発、ドキュメント、テスト用の分離された依存関係
パッケージ公開: PyPI への公開が簡単
依存関係グループ#
[tool.poetry.dependencies]
python = "^3.12"
typer = "^0.9"
# ... コア依存関係
[tool.poetry.group.dev.dependencies]
pytest = "^8.0"
ruff = "^0.6"
# ... 開発用依存関係
[tool.poetry.group.docs.dependencies]
sphinx = "^8.0"
# ... ドキュメント用依存関係
テスト戦略#
テストの種類#
Unit Tests: 個別コンポーネントのテスト(
tests/{version}/unit/)Integration Tests: マルチモジュール相互作用(
tests/{version}/integrations/)Contract Tests: APIインターフェース
Manual Validation: quickstart.md のシナリオ経由
カバレッジ目標#
目標: 80%以上のカバレッジ
対象: プロダクションコード(v0, v1モジュール)
詳細はテストガイドラインを参照してください。
ドキュメント構造#
Sphinx + MyST#
フォーマット: Markdown(MyST)
ビルダー: Sphinx
テーマ: sphinx_book_theme
API ドキュメント: autodoc2
ドキュメントの種類#
ユーザー向け (
docs/users/): データ取得ワークフロー協力者向け (
docs/collaborators/): データ解析ワークフロー開発者向け (
docs/developers/): 開発ワークフロー共有 (
docs/_shared/): 用語集、コマンドリファレンス
継続的インテグレーション#
GitLab CI/CD#
テスト: すべてのコミットでpytestを実行
リンター: Ruffによる静的解析
カバレッジ: カバレッジレポート生成
ドキュメント: Sphinxビルド検証
将来の方向性#
v1 への移行#
v1の機能を段階的に拡張
v0との互換性を維持
最終的にv1をデフォルトに
計画されている改善#
よりよいエラーハンドリング
パフォーマンス最適化
追加のデータ形式サポート
リアルタイムデータ可視化
アーキテクチャ判断レコード (ADR)#
詳細なアーキテクチャ判断と設計決定については、Architecture Decision Records (ADR)を参照してください。ADRsは、プロジェクトの進化過程で下されたキー決定と、その理由を文書化しています。
アーキテクチャに関する質問や提案は、GitLab Issuesで歓迎します。