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

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

魂の鎧"RedfishViewer"錬金術 ~第二章:魂の解体新書~

旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。

第一章:降臨の儀では私が血と汗と涙で鍛え上げた魂の鎧「RedfishViewer」(Redfish API探索ツール)の降臨の儀式と、最低限の操縦法について語った。 しかし、あの鎧に秘められた真の力は、まだ何も明かされていない。

今回は、ソースコードという名の設計図をただ読み解くのではなく、私がこの鎧を鍛え上げる上で、どこで悩み、何を考え、どんな魔法を編み出したのか、その「思考の軌跡」を辿る旅に出ようと思う。 これは、単なる機能紹介ではない。Prismという難解な魔法体系と格闘し、七転八倒の末に一つの答えに辿り着いた、一人の錬金術師の独白である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • RedfishViewerという魂の鎧に、どんな魔法が秘められているのか知りたい者
  • C#のMVVM、特にPrismフレームワークという険しい山で、実践的な設計思想に触れたい探求者
  • ViewModel間の疎結合な通信や、非同期処理のUIへの反映といった高度な錬金術に興味がある冒険者
  • IEventAggregatorやReactivePropertyといった魔法体系の実装例を求める開発者
  • 複雑なアプリケーション設計における「なぜそう作ったのか」という思考の軌跡を辿りたい者

砂漠の道標

  • RedfishViewer - Redfish APIを視覚的に探索するための自作WPFアプリケーション。C#とPrismフレームワークで実装。
  • Prism - WPF/Xamarin向けMVVMフレームワーク。疎結合な設計を実現する各種機能を提供。
  • MVVM(Model-View-ViewModel) - UIとビジネスロジックを分離する設計パターン。ViewとViewModelをデータバインディングで接続。
  • IEventAggregator - Prismが提供するイベント配信機構。ViewModel間で疎結合なメッセージング通信を実現。
  • ReactiveProperty - リアクティブプログラミングをサポートするライブラリ。非同期処理とUIの連携を簡潔に記述。
  • DiffPlex - テキスト差分検出ライブラリ。二つの文字列を比較しハイライト表示。
  • Notification.Wpf - WPFアプリでトースト通知を実装するライブラリ。
  • Log2Console - .NETアプリのログをリアルタイム表示するツール。UDPでログを受信し可視化。

魂の鎧の構造:三位一体の階層構造

RedfishViewerの心臓部は、三段階の階層構造で成り立っている。

  • MainWindow.xaml(器): 全てを内包する、唯一無二のウィンドウ。
  • Requests.xaml(顔): 旅人が最初に触れる、リクエストとメニューを司る顔。
  • Responses.xamlなど(四肢): 顔からの命令を受け、実際に様々な魔法を発動する手足。

この構造を理解することが、鎧の動きを読み解く第一歩だ。

Requests 画面

全ての魔法の起点となる鎧の「顔」

第一の秘儀:IEventAggregatorという名の伝書バト

この鎧を鍛える上で、私が最も長く砂漠を彷徨った謎。 それは「顔(Requests)で唱えた呪文をどうやって手足(Responses)に伝えるのか?」という問題だった。 ViewModel同士が互いを直接知ってしまう「密結合」の呪いは、鎧の柔軟性を奪い、メンテナンスという名の悪夢を呼び込む。

試行錯誤の果てに辿り着いた答えがPrismが用意したIEventAggregatorという万能の「伝書バト」(イベント配信機構)だ。

顔でPublish(放つ)した伝書バトを手足がSubscribe(受け取る)。伝書バトの足にはリクエスト情報という名の羊皮紙が結びつけられている。 この魔法により、鎧の各部位は互いの存在を知ることなく見事に連携して動く。 これこそがPrismがもたらす「疎結合」という恩恵の真髄の一つである。

HTTP レスポンス

伝書バトが届けた情報に応じて景色を映し出す

第二の秘儀:時を操る魔法と比較

この鎧の最も強力な魔法の一つが前回のリクエスト結果との「差分」を可視化する機能だ。 データベースに保存された過去の記録と現在の記録をDiffPlexという名の古文書(差分検出ライブラリ)の力を借りて比較し、異なる箇所だけをハイライトする。

現在レスポンスと過去レスポンスの比較

過去と現在、二つの時間を並べて見る

この魔法を実装する上で最後まで悩んだのは「表示順」だ。 実用性を重視し、あえて左右で異なる時間軸(現在→過去、過去→現在)を採用した。 美学よりも旅の快適さを優先した、苦渋の決断である。

第三の秘儀:自律するゴーレムと、狼煙

第一章でも触れた、この鎧の奥義。 JSONの海から@odata.idという名の真珠を拾い集め、再帰的に探査を続ける、まさに自律するゴーレムだ。 しかし、この非同期で動き続けるゴーレムの状況をどうやって主(UI)に伝えるのか? 探査の状況は、Notification.Wpfという魔法(トースト通知ライブラリ)で打ち上げるトーストという名の狼煙で知らされる。

自動検索モードの中止

暴走するゴーレムを緊急停止させることも可能だ

魂の声を聴く道具:Log2Console

Prismという難解な魔法体系を解き明かす上で、何よりの助けとなったのがLog2Consoleという名の真実の鏡(ログ可視化ツール)だ。 鎧の内部で何が起きているのか、その魂の声をリアルタイムで映し出してくれる。

RedfishViewer のトレース

真実の鏡が鎧の魂の動きを可視化する

これからPrismの山に挑む冒険者は、何をおいても、まずこの鏡を手に入れるべきだ。 これがあれば、道に迷うことは格段に減るだろう。

羊皮紙を巻く前に

当初は「Redfishの情報を再帰的に取得したい」という、ささやかな願いから始まった旅だった。しかし気づけばPrismの深淵を覗き込み、仕事でも実用に耐えるほどの巨大な魂の鎧を鍛え上げていた。七転八倒の末に辿り着いた設計思想を、ここに記録しておく。

RedfishViewerの心臓部を支える三つの魔法

  1. IEventAggregatorによる疎結合 - ViewModel間で互いの存在を知ることなく連携する伝書バトの仕組み。顔(Requests)と手足(Responses)が独立して動く鍵。
  2. ReactivePropertyによる非同期連携 - UIスレッドを止めることなく、自律するゴーレムの状態を主に伝える魔法。トースト通知による狼煙も、この力あってこそ。
  3. Log2Consoleによる可視化 - Prismという難解な魔法体系を解き明かす真実の鏡。これなしでは、今もまだ砂漠を彷徨っていただろう。

まとめ

今回が初のPrismアプリなので、まだまだ改善の余地は多いだろう。しかし、この苦難の旅で得た知見は計り知れない。この羊皮紙が、同じようにPrismという険しい山に挑む未来の冒険者の助けとなることを願う。

その神髄に触れたいと願う猛者は、ぜひアトリエでソースコードを読み解いてみてほしい。

おっと、もうこんな時間か。相棒が「次の目的地へ出発するぞ」と急かしている。今日はこのへんで筆を置くとしよう。

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

第一章への道標

この章で用いた魔法の古文書

旅の必需品

ラクダの独り言

ご主人が「よろいが完成した!」とか言って、やけに得意げになっている。なんでも「でんしょばと」がどうとか、「ごーれむ」がどうとか、俺にはさっぱり分からん言葉ばかりだ。そんなに凄いもんなら、砂漠の真ん中で故障した時に自分で直せるのか? まあ、その小難しい鎧とやらが、俺の代わりに荷物を運んでくれるなら、いくらでも褒めてやるんだがな。おっと、腹が鳴っちまった。