宇宙仮面の
C# Programming

 
Image

PingRadar

開発環境: Visual Studio 2003 

1.目次

2.目的

エイリアン3? を見て、エイリアンを探知するレーダーを作りたくなったのは、自分だけでしょうか^^l;
とにかく、レーダーぽいものを作りたかっただけです。

また、しょうもないものを。。。というコメントは却下! ^^/

3.参考

(1) http://www.eggheadcafe.com/articles/20020209.asp
Special Thanks to Peter A. Bromberg!
(2) http://www.syncfusion.com/FAQ/WinForms/FAQ_c81c.asp
けっこうディープな内容。
(3) Collection Item

4.解説

WinPing を作ったので、ちょっと遊びでレーダでPINGの距離を表示する PingRadar を作りました。距離は、Ping のラウンドトリップ時間を使用しています。

PINGは、表示が止まらないように、 BeginInvoke による非同期コールバックを使用しています。

今のバージョンでは、PINGをかけまくると、ネット攻撃と思われてしまうので、Ping ボタンを押したときだけ PING がかかるようにしています。

下図のニューメリックアップダウンカウンタで、260と表示されているのは、レーダの最大レンジが 260mSEC であることを意味しています。
↓図では、Yahoo JP、Yahoo US、Yahoo China、Yahoo Ausutrariaのときです。
レーダ波は中心から同心円状に10秒程度で広がるように表示していますが、何の意味もありません^^;見た目のためだけです^^;

OmniDirectionalPingRadar
Image


↓図は、見た目だけを変更して、普通のレーダのように、レーダ波がぐるぐるまわるようにしたものです。
クラス構成が妥当かどうか試しに作ってみました。
ほかのクラスに影響が出ずに、表示クラスだけの修正で作ることができたので、OK。

UniDirectionalPingRadar
Image

どのホストをPINGするかは、下のダイアログで編集するようにしています。
これは、DataSet と DataGrid の組み合わせです。
データのロード、セーブは、当初シリアライズでやろうとしていたんですが、
クラスに修正が入るとデータの互換性がなくなってしまうので、
これらのデータは、XML形式でファイルにセーブ、ロードできるようにしています。

チャート上には、名前が表示されます。PINGは、HostName に対して行われます。

Image

PingRadar.exe.config ファイルで、バックグラウンド色などの起動時の初期設定を変更できます。
PingRadar.exe.config ファイル
<?xml version="1.0" encoding="shift_jis"?>
<configuration>
<appSettings>
<!-- ユーザー アプリケーションおよび構成されたプロパティ設定をここに挿入します。-->
<!-- 例 : <add key="settingName" value="settingValue"/> -->
<add key="BoggyColor" value="YellowGreen" />
<add key="FontColor" value="Cyan" />
<add key="GridColor" value="Green" />
<add key="Range" value="500" />
<add key="WaveSpeed" value="100" />
<add key="BackColor" value="Black" />
</appSettings>
</configuration>

このあたりの解説は、動的プロパティを参照してください。

クラス構成はちょっと面倒なので、下のざっくりした図を見てください。
設計上は、RadarPanel は、ほかの用途でも使えそうだったので、
Pingには依存しないように、Radar, RararPanel、BoggyCollection, Boggy と Ping 依存部分で分離しています。
下図を見れば、大体想像がつくと思います。

最初は、MVCでいこうと思ったんですが、機影をどのように扱うか悩んだ末、C#/.NET のお作法?どおり、
パネルにアイテムのコレクションを追加するという、Model とView がくっついたMV-C 型?にしました。
純粋にMVC で設計しようとしても、View(ParaPanel) と Model(BoggyCollection) の
関係が強すぎるので、分離する意味がないような気がします。
むしろ、Panel にアイテムコレクションをつっこんでしまうほうが、直感的で好きです。
それも MVC の変形なのかもしれませんが、M と V を分離してもっときれいに組めるのかなぁ。。。。
結局は、MSのお作法で作るのが一番作りやすいという結論か?

下図は、Ver.0.3 のクラス構成(メインフレームは除く)です。

Image

5.PingRadar のダウンロード


Version 情報

V 0.1 2002/10/23初期バージョン
V 0.22002/10/28クラスライブラリを使用しないでも、ビルドできるようにフォルダ構成を修正。
app.config に対応。
DirectionalPingRadarPanel を将来的に追加したいので、PingRadarPanel Class を追加。
再利用しそうもないのに継承しておくという悪いOOの見本^^;
シリアライズ、デシリアライズでエラー処理を追加、Range も追加。
Ping の非同期コールバックの処理が気に入らない。。。。

BUG: BoggyCollection をフォームエディタで追加してからビルドすると、うまくいかない。

V 0.3 で、UniDirectionalRadar を追加する予定
設計が正しければ、OmniDirectionalRadar だけの修正でできるはず。^ ^;
V 0.32002/11/17だったんですが、別のところで設計を変えざるを得ませんでした。

一番の難関は、Collection Item でした。
Collection Item のところで解説しているように、リソースを使った Collection Item は、
移植性が悪いので、リソースを使わない方法に変えました。
このため、クラス構成をだいぶ修正する必要が出てしまいました。
別にこの機能を使う必要はないので、無視しておけばよかったんだけど、
そういう性格じゃないもんで、思いっきり回り道しました^^;
おかげで、Collection Item の章が1つできてしまった。
でも、UniDirectionalRadar の追加による影響はほとんどなしにすることができました。

伏兵は Serialize でした。
V.0.2 までは、BoggyCollection をシリアライズでロード、セーブしようとしたんですけど、
結局クラスに手が入ると、データの互換性がなくなってしまうんですね。
それで、直接XMLファイルを生成するようにしました。
よっぽどクラスを固める自信がない限り、Serialize は使わないほうがいいですね。

とりあえず、これでしばらく寝かせておいて、熟成したらばできあがり。^^;
V 0.42002/12/7UniDirectionalRadar(普通のレーダ風)と OmniDirectionalRadar(エイリアン風のレーダ)を
メニューから切り替えられるように修正しました。
あと、ファイルからロードしたときにレンジが更新されないバグを修正。
--------------------
以下のファイルをダウンロード、実行すると、インストーラが実行され、デスクトップに実行ファイル含むフォルダーをインストールします。
システムフォルダー、プログラムフォルダーなどのシステムフォルダーには何もインストールしません。

アンインストールは、コントロールパネルよりアプリケーションの追加・削除より、PingRadar を削除してください。

ファイルの削除のような危険なコードはありませんが、Ownリスクで実行してください。^^;

コメントありましたら、メイルください。^^;

V 0.5 は、アイコンをつけて、出来上がり?お正月かな ^ ^/
V 1.02002/12/24とりあえず、これで完了。
プログラムフォルダーにインストールするように修正。
C#の勉強を始めて、ここまでくるのに 9ヶ月もかかってしまった。
それでも、この程度のものしか作れない。。。涙(;;)
V 1.12003/1/19厳密名で署名。アイコンを埋め込みに変更。終了時にフェードアウト。
PingRadar インストーラ V.1.1 PingRadarSetup.msi (113kB) バイナリーのみ。