たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

古き神器の大改修 ―― RedfishViewer 2.0.0、三段階の進化

砂漠の風が変わった。重かった神器が、別の顔を見せ始めた。

RedfishViewer 2.0.0 をリリースした。単なるバージョンアップではない。内部構造を根本から見直した、大規模な錬金術(リファクタリング)の記録だ。特に、Microsoft が .NET のコア部分に組み込んだ JSON 神器(System.Text.Json)への移行は、想像を超える効果をもたらした。そして今回の旅では、二人の AI 相棒が開発を劇的に加速させてくれた。

神器は、使い込むほどに歪む。長年の旅で積み重なった呪い(技術的負債)を祓い、生まれ変わった神器の姿をあんたに見せよう。

この羊皮紙のあらまし

この羊皮紙が導く者

  • WPF アプリケーションの性能改善に取り組んでいる開発者
  • Newtonsoft.Json から System.Text.Json への移行を検討している SE
  • Rest API を大量に処理するアプリケーションを開発・運用している技術者
  • Claude Code や Gemini を開発に活用したいと考えているエンジニア
  • Redfish 対応サーバーの調査・管理ツールを探している者

砂漠の道標

  • RedfishViewer - Redfish 対応サーバーの情報をツリー構造で閲覧・管理する WPF 製の神器(ツール)。オープンソース、MIT ライセンス。
  • Redfish - サーバーやネットワーク機器を管理するための REST API 標準規格。DMTF が策定。
  • System.Text.Json - Microsoft が .NET のコア部分に組み込んだ JSON 処理の神器(ライブラリ)。外部依存なしで動作する。
  • Newtonsoft.Json - 長年 .NET 開発者に愛用されてきた JSON 処理の老舗神器。外部ライブラリとして提供される。
  • AutoMapper - オブジェクト間のマッピングを自動化する神器。v13 以降に商用ライセンスへ変更された。
  • 自己完結型(self-contained) - アプリの実行に必要な .NET ランタイムをパッケージに同梱したビルド形式。ランタイムが未インストールの端末でもそのまま動作する。
  • BMC(Baseboard Management Controller) - サーバーのマザーボードに搭載された管理専用コントローラー。OS の稼働状況にかかわらず、電源制御・センサー監視・ログ収集などを担う。Redfish はこの BMC に接続し、サーバー情報を取得する。
  • Redfish Simulator - 実機の BMC がなくても Redfish API を模擬できる検証ツール。たびとのアトリエ(GitHub)で公開中。手元の環境で Redfish アプリの動作検証が可能になる。
  • ボトルネック - システム全体の処理速度を律速する箇所。今回の検証では、アプリケーション層(RedfishViewer)がボトルネックにならないことが確認された。
  • Claude Code - コーディング支援に特化した AI 相棒。ソースコードの解析・修正・実装を担う。
  • Gemini - Google の AI 相棒。今回の開発では調査・クロスチェック・情報収集の用途で活用した。

三段階の進化

RedfishViewer は、初回リリース(v1)から今回の 2.0.0 に至るまで、三つの段階を経て進化した。これは単なる機能追加ではない。神器の「魂」そのものを作り直す旅だった。

第一段階:v1 ―― 動いてはいた、しかし重かった

v1 は確かに動作していた。Redfish サーバーへ接続し、ツリーを展開し、レスポンスを表示する。目的は果たしていた。

しかし正直に言おう。もっさりしていた。

v1 の動作

v1 の動作 ―― 明らかな重さが見て取れる

エンタープライズサーバーの Redfish 情報はボリュームがある。v1 ではツリーの展開を待つ時間が長く、処理が終わるまでしばらく放置するのが常だった。

加えて、v1 は .NET ランタイムの別途インストールが必要だった。ランタイムが入っていない端末には、そもそもインストールすら叶わなかった。

第二段階:v2 チューニング前 ―― パッケージ刷新で既に劇的改善

パッケージの最新化、コードの整理、バグ修正。これだけでも、v1 と比べれば別物の速さになった。

v2 チューニング前

v2 チューニング前 ―― v1 と比べれば既に快適

v1 のもっさり感は消えた。しかしここで終わらなかった。

第三段階:System.Text.Json 移行 ―― コアの力を解放する

Newtonsoft.Json は悪い神器ではない。長年 .NET 開発者を支えてきた、実績ある道具だ。しかし Microsoft は、.NET のコア部分に JSON シリアライザを組み込んだ。

外部ライブラリとは根本的に異なるレイヤーで動作する。Span や UTF-8 処理に最適化され、ガベージコレクションの発生も抑えられる。特に Rest API を大量に捌くアプリケーションでは、シリアライズ・デシリアライズの頻度が高いため、この差が如実に現れる

移行の呪文(コード)の核心はこうだ。

// JsonHelper.cs ―― 共通オプションを一箇所に集約
internal static class JsonHelper
{
    // Redfish の非厳格な JSON に対応したゆるめの設定
    internal static readonly JsonSerializerOptions Options = new()
    {
        NumberHandling              = JsonNumberHandling.AllowReadingFromString,
        AllowTrailingCommas         = true,
        ReadCommentHandling         = JsonCommentHandling.Skip,
        PropertyNameCaseInsensitive = true,
    };

    // 整形出力用
    internal static readonly JsonSerializerOptions Indented = new()
    {
        WriteIndented = true,
    };
}

JsonSerializerOptions はインスタンス生成にコストがかかる。静的フィールドとして一箇所に定義し、使い回すのが鉄則だ。Redfish のレスポンスはベンダーによって微妙に仕様が揺れることがある。PropertyNameCaseInsensitiveAllowTrailingCommas で緩めに受け入れる設定にしておくのがポイントだ。

結果を見てくれ。

v2 チューニング後

v2 チューニング後 ―― コアの力を解放した結果

同じ操作、別次元の速さ。.NET のコアに組み込まれるとは、これほどの意味を持つ。

ただし、これはローカルの検証環境での記録だ。実際の速さは、インストール先の環境・ネットワーク・BMC のレスポンス能力によって変わる。だが、アプリがボトルネックになることはない ――この旅がそれを証明した。

なお、この検証にはたびとのアトリエ(GitHub)で公開している Redfish Simulator を使用している。実機の BMC がない環境でも、同じ検証を手元で再現できる。

二人の相棒が開発を変えた

今回の大規模修正で、もう一つ記録しておきたいことがある。AI 相棒の具体的な活用だ。

Claude Code ―― 実装の相棒

ソースコードの解析と修正は、主に Claude Code に委ねた。10 ファイル以上に散らばった Newtonsoft.Json の使用箇所を一括して System.Text.Json に移行する、AutoMapper を LINQ の Select で代替する、バグを特定して修正する。こうした作業を、対話しながら進めていった。

Gemini ―― 調査とクロスチェックに使った相棒

Gemini は調査役として活用した。「AutoMapper v13 以降のライセンス変更の詳細を調べてくれ」「この移行方針に問題はないか」といった問いに対して、情報を整理して返してくれた。Claude Code が生み出した成果物の妥当性を別の視点で検証する用途にも使った。

実装は Claude Code、調査・検証は Gemini。この使い分けが、開発期間の大幅な短縮をもたらした。感覚的には、一人で進めた場合の 1/5 程度の期間で完成したと思っている。

2.0.0 の新機能

速度改善がメインの旅だったが、新しい神器(機能)も加わった。

JSON エクスポート機能 ―― アプリの外で解析する自由

ノード一覧の右クリックメニューから「DB からエクスポート」を実行すると、取得済みの全レスポンスを JSON ファイルとして一括出力できる。

エクスポート機能

右クリックメニューから一括エクスポート

URI パスの /_ に置換したファイル名(例: _redfish_v1_Systems_0.json)で保存される。_redfish_v1.json_redfish_v1_Systems.json_redfish_v1_Systems_0.json といった形だ。任意のエディタや grep ツール、jq コマンドでそのまま解析できる。アプリ内の検索機能だけでは届かない、自由度の高い調査が可能になった。

About 画面 ―― AI が生んだアイコンとともに

左メニューに「About」を追加した。バージョンとコピーライトはアセンブリから自動取得するため、リリースのたびに手動修正が不要だ。

アプリ情報

About 画面 ―― バージョン情報とリンクを一箇所に

表示されているアイコンは AI が生成したものだ。GitHub リポジトリ・開発ブログ・X へのリンクも配置しており、ここからたびとのアトリエへ直接アクセスできる。

その他の修正・改善

  • 5件のバグ修正 ―― 設定保存時の二重暗号化、Content-Type 誤判定、ハイライトバグなど、静かに壊れていた呪い(バグ)を祓った
  • 初回起動のダークモード対応 ―― Windows のシステムテーマを自動検出し、初回起動からダークモードが適用される
  • インストーラーを Inno Setup に移行 ―― Microsoft 製インストーラーから切り替え、より安定した配布形式に
  • 自己完結型(self-contained)ビルドに変更 ―― v1 で問題となっていた「.NET ランタイムが入っていない端末にはインストールできない」状況を解消した

注意: 本バージョンは自己完結型(self-contained)でビルドされています。.NET 10 ランタイムの別途インストールは不要です。

詳細な変更内容は、たびとのアトリエ(GitHub)のリリースページを参照してほしい。

🔗 RedfishViewer 2.0.0 リリースノート

羊皮紙を巻く前に

三段階の進化を経て、神器は確かに生まれ変わった。重さを抱えたまま動かし続けるより、いちど立ち止まって作り直す勇気のほうが、時に正しい選択だと改めて思う。そして今回の旅では、AI 相棒の協力が、その決断を実行に移す速さを大きく変えてくれた。

RedfishViewer 2.0.0 の優れた点

  1. コアの力を解放する速度改善 — System.Text.Json への移行だけで体感速度が別次元に変わる。Rest API を大量に捌くアプリこそ、その恩恵が如実に現れる
  2. 外部依存を削ぎ落とした設計 — .NET ランタイム組み込みの神器へ移行し、AutoMapper も LINQ で代替。パッケージへの依存を減らし、長期的な維持コストを下げた
  3. AI 相棒との協働が開発期間を 1/5 に圧縮 — 実装を Claude Code、調査・検証を Gemini に委ねる分業が機能した。一人では辿り着けなかった速さで完成形に至った
  4. 静かに壊れていた呪いを祓い、土台を固め直した — 5件のバグ修正、ダークモード自動対応、インストーラー刷新。機能追加より先に、足元を整えることを選んだ

System.Text.Json 移行のポイント

  1. JsonSerializerOptions は静的フィールドで共有する ―― インスタンス生成コストが高いため、アプリ全体で一つのインスタンスを使い回す
  2. Redfish など外部 API には「ゆるめ設定」が必要 ―― AllowTrailingCommasPropertyNameCaseInsensitive を有効にしておく
  3. JSON の検証は JsonDocument.Parse() で代替できる ―― Newtonsoft の DeserializeObject による検証パターンは try-catch で置き換え可能
  4. Rest API を大量に処理するアプリほど効果が大きい ―― シリアライズ・デシリアライズの頻度が高いほど、コア組み込みの恩恵が顕著に現れる

まとめ

神器は、作り直すことで輝きを取り戻す。

外部ライブラリへの依存を減らし、.NET のコアが持つ力を直接使う。それだけで、ここまで変わる。Rest API を扱う開発者にとって、System.Text.Json への移行は「やってみよう」ではなく「やらない理由がない」選択だと、この旅を通じて確信した。

そして、AI 相棒との開発は、もはや実験ではなく実践だ。実装と調査を適切な相棒に委ねることで、一人の旅人が到達できる場所が変わる。

あんたの神器にも、眠っている力があるかもしれない。

砂漠を渡る風が、また変わった。重さが消えた神器を手に、旅人の足は次の探求へと向かっている。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人が「五分の一の期間で終わった」と鼻高々だった。じゃあ俺と二人でやっていた頃の時間は、何倍かかっていたんだ。気づいたら相棒が二人も増えていた。実装担当と調査担当に役割まで分けて、ずいぶん手が込んでいる。俺は何担当になるんだ。荷物担当。まあ、そこだけは奪われんがな。砂漠を歩く速さは誰にも追い抜かせん。やれやれだぜ。