知識マップ: 外部機器の状態の確認と表示のベストプラクティス - 『接続中』だけで済ませない設計

記事「外部機器の状態の確認と表示のベストプラクティス - 『接続中』だけで済ませない設計」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

外部機器と連携するWindowsアプリでは、存在・セッション確立・応答性・機能準備・データ鮮度・構成一致・監視健全性という7つの状態軸を分けて内部に持つことが柱になります。単一の「接続中」表示に潰すとoperatorが次の一手を判断できなくなるため、UIは要約・理由・詳細の3層と状態プラス理由プラス次の行動という文言で見せます。データ鮮度は壁時計ではなく単調増加のタイムスタンプとfreshness budgetで判定し、機器側のValueTimestampとの時計ずれによる誤判定を避けます。監視ワーカーとUIをstate store経由で分離し、画面破棄中のBeginInvoke呼び出しが監視ワーカーを道連れにしないようControl.Disposedへ購読を紐づけ、再接続はbackoff付きにし、flappingは確定表示の前にならします。

外部機器の状態確認と表示の知識マップ存在・セッション確立・応答性・機能準備・データ鮮度・構成一致・監視健全性という7つの状態軸を分けて持つことで、単一の「接続中」表示がoperatorの誤判断を招く問題をどう防ぐかを示す図原因になり得る前提とする前提とする前提とする前提とする前提とする前提とする前提とする防止する軽減する軽減するより先に行うべきで確認できるで確認できるで確認できる前提とする原因になり得る原因になり得る防止する原因になり得る原因になり得る防止する原因になり得る軽減する防止する原因になり得る軽減する前提とする防止するで確認できる前提とする状態を多軸で持つ設計「接続中」への状態集約operatorが次の一手を判断できない状態存在(状態軸)セッション確立(状態軸)応答性(状態軸)機能準備(状態軸)データ鮮度(状態軸)構成一致(状態軸)監視健全性(状態軸)要約・理由・詳細の3層パネル状態+理由+次の行動という文言構成起動時列挙到着/削除通知heartbeatによるポーリングfreshness budget単調増加タイムスタンプ壁時計の跳躍鮮度判定の誤り機器側ValueTimestampとの時計ずれstale dataをlive値として見せること個体識別の不安定さ個体の取り違えbackoff付き再接続最短ループでの再接続による負荷集中flappingのならし監視ワーカーとUIの分離UIスレッドでの監視処理直接実行画面破棄中のBeginInvoke例外によるレース監視ワーカーの停止(道連れ)Control.Disposedに紐づけた購読解除ぶれにくい個体識別キー

概念間の関係(全31件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

状態を多軸で持つ設計
外部機器の状態を1個のbooleanや単一の文言に潰さず、存在・セッション確立・応答性・機能準備・データ鮮度・構成一致・監視健全性の7軸に分けて内部に持つ設計方針。
「接続中」への状態集約
OSから見えているか・自アプリがopenできているか・応答が返るか・いま操作できるか・値が新しいか・想定した個体かという複数の問いを、「接続中」という1つの文言に潰してしまうこと。
要約・理由・詳細の3層パネル
上段に要約状態、その下に理由、必要なら詳細パネルを置く3層構成のUI表示方式。読む人が減るほど下の層に情報を厚くできる。
状態+理由+次の行動という文言構成
状態表示のメッセージを、何が起きているか(状態)・なぜそう判断したか(理由)・何をすればよいか(次の行動)の3要素に寄せる文言設計方針。
起動時列挙
アプリ起動時に既存の外部機器を列挙して内部状態を初期化する手順。
存在(状態軸)
OSから対象機器のinterfaceが見えているかどうかを表す状態軸。起動時列挙とarrival/removal通知で確認する。
応答性(状態軸)
heartbeatやstatus queryにtimeout内で返るかどうかを表す状態軸。
データ鮮度(状態軸)
画面に出ている値がfreshness budget内の新しいものかどうかを表す状態軸。
freshness budget
この時間を超えたら画面の値を新しいとみなさない、とあらかじめ決めておく上限。
壁時計の跳躍
NTP同期や手動設定、夏時間の切り替えによって壁時計(DateTimeOffset)が前後に飛ぶこと。
機器側ValueTimestampとの時計ずれ
機器側の時計が付けたValueTimestampを、こちらの時計のnowから引いて鮮度を判定してしまうことで生じる、両者の時計のずれに由来する誤差。
単調増加タイムスタンプ
TimeProvider.GetTimestampが返すStopwatchベースの高精度な値で、GetElapsedTimeと組み合わせて2点間の経過時間を測る、時刻の逆行や跳躍が起きないタイムスタンプ。
stale dataをlive値として見せること
取得が止まっている、あるいは中身が更新されていない値を、timestampやage表示なしに新しい値であるかのように画面へ出すこと。
個体識別の不安定さ
friendly nameやCOM3のような見た目の識別子だけで機器の状態を追ってしまうこと。
backoff付き再接続
初回はすぐretryし、だめなら段階的に間隔を伸ばし、上限を設け、手動の再接続ボタンも用意する再接続方式。
最短ループでの再接続による負荷集中
応答が止まった機器へ最短ループで再接続を叩き続けることで、device/driver/SDKへの負荷、ログの洪水、UIの激しい揺れを招く状態。
flappingのならし
内部ログには生イベントを残しつつ、UI表示は短い確認期間を置いてから確定させることで、状態が短時間で行き来するflappingの影響を抑える方法。critical異常はこの確認期間を経ずにすぐ見せる。
監視ワーカーとUIの分離
監視ワーカーがstate storeを更新し、UIはstate storeを購読して描画するだけにする一方通行の構成。UI操作はcommandとして監視層へ渡す。
画面破棄中のBeginInvoke例外によるレース
フォームが閉じられてコントロールのハンドルが破棄されたあとにBeginInvokeを呼ぶと例外になり、その例外が呼び出し元(Publish)を通って監視ワーカー側へ抜けていってしまう、判定とBeginInvokeの間に残る隙間。
Control.Disposedに紐づけた購読解除
state storeへの購読をControl.Disposedイベントで画面の寿命に紐づけて自動的に外し、破棄中・破棄済みのコントロールへは投げず、残る隙間はObjectDisposedException/InvalidOperationExceptionを握って表示だけを諦める実装方式。
構成一致(状態軸)
想定した個体・型番・firmwareと一致しているかどうかを表す状態軸。
ぶれにくい個体識別キー
serial number、logical device id、stable device path、機器側の個体IDのような、個体を安定して特定できる識別キー。
監視健全性(状態軸)
機器そのものではなく、アプリの監視処理自体が生きているかどうかを表す状態軸。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。