私が作るプログラム、自分では結構センスがいいと思っています。プログラマとしての技量のなさを、一発ネタでカバーしているだけとは自覚しております。しかし、使ってみると案外便利。でも、プログラムの仕様を聞いただけではどうしてこんなものが役に立つのか分かりにくいのも確か。フリーソフト開発秘話、目次へ
今回のプログラムについては、その傾向がさらに強いです。いや、実際に使って便利なのかどうか、正直な話自分でも疑問があります。こんなものいったい誰が使うのだろう。もちろん、プログラムを書いたからにはその必要性はちゃんとあります。
日立のJP1で遠隔地のNTサーバーにhostsファイルの定義を送付した後、各サーバー内でhostsファイルを更新。そして更新後の各サーバーhostsファイルにきちんと必要な定義が切られているかどうかを確認する羽目に陥ったのです。
hostsファイルのあり場所は各サーバー共通ですから、リモートコレクトという機能を使えば一挙に集めてくるのもそんなに大変ではないそうです。ただし、ディレクトリ情報付きで飛んできますから、そこからファイルを一個一個取り出して比較するのは、とてもたいへん。
さらに、必要な定義を納めているファイルは複数に分かれているので、hostsファイルの比較はさらにめんどくさくなります。具体的手順としては、さらに面倒なことにWindows標準の比較ツールFCは、バグがひどくて今回の比較には使えないことが判明しました。
- 集めてきたファイル群から階層をたどって、該当サーバーのhostsファイルを探しだす。
- 必要な定義を切った手元ファイルを集めて一つにまとめる。
- 双方のファイルをソートする。
- diff、、、じゃなかったFCを使って比較する。
そして、申し遅れましたが、NTサーバーは300台以上あります。限られた時間内に配布結果をチェックするのは事実上不可能です。そこで書いたのがこのプログラムです。日立のJP1を信じていれば、そして、導入したということは信じているはずであって、したがってこんなもの不要なのですが、今回マルチベンダーなので、何か問題があったとき、JP1が悪さしてるんじゃないの?と言われるかもしれません。それでは問題の解決が遅れるだけなので、自分で確認することにしました。
そんなわけで、プログラム名は実に安易に「hostcomp」となりました。最初は一回こっきり使えればいいやということで、プログラム内部に定数を埋め込みまくっておりました。こんなことやるのは今回限りだろう。また他にやる人もいないだろう、という判断です。
でもやがて気がつきました。「JP1/NETM/DM使う人は、多かれ少なかれ、配布したファイルを確認したいと考えているんではないだろうか。」そこで汎用的に使えるように書き換えました。アルゴリズムにもチューニングを加えました。比較するファイル名も、コメント行を示す記号も、比較結果出力ファイル名もiniファイルで指定します。ちなみにこちらの事情から複数ファイルの合計と複数ファイルの合計を比較可能としています。元ファイルがソートされている必要はありません。同じ行がどこかにあればOKとみなします。
そして、JP1ですから、配布対象のホスト名全部について一括で照合する必要があります。これはパラメータファイルに対象のホスト名を切っておくと連続して処理してくれます。具体的には比較するファイル名、パスを指定する際、該当部分にパラメータを参照してねと書き込んでおくと、パラメータファイルに切られたホスト名を次々と読み込んで関連するファイルを照合してくれます。
ちなみにパラメータファイルに何も切らないと、ファイル群同士を比較してくれます。多少はJP1/NETM/DM以外で使えるようにもしています。(むしろ、この機能を使うことが多いです。FCの代わりにね。)
空行は無視、コメント行は見ますが、コメント文字だけの行は実質空行と見なして無視。
そして、これが苦労したのですが、比較するファイルを指定する際にワイルドカード(アスタリスク)モドキを使えます。したがって、DMZという拡張子で圧縮されたファイルを復元してできる、JP1のアンアーカイバがつける連番+ホスト名というディレクトリの下を探索したい場合でも「*ホスト名」で指定すればきちんと照合してくれます。すごいだろう>日立製作所。というわけで、JP1/NETM/DMで悩んでいる同志の方々、どうぞお使いください。(といってもまだどこにもアップロードしていない。使用説明書と、それとアイコンがまだできていないのよ。)ただし、テキストファイル専用です。
それからJP1/NETM/DMは集配信スレッドを同時に10個しかあげられないそうですから(100という説もあるが、多分10)、リモートコレクト機能を使ってファイルを集めてくるときは気をつけてください。沢山のクライアントに対して同時に集信をかけますと、配信サーバー側に一斉に返事がやってきて、処理できなくなるようです。
あくまで私の推測ですが、ファイルを集信するときは、普通の「送信完了」の電文と違って受信に時間がかかるので、その分スレッドを長時間占有し、従って他のホストからの電文を受けられなくなるのでしょう。一度に飛ばすリモートコレクトジョブは、さあ、20くらいが限界なのかなあ。
なお、リトライされぬまま残ったジョブは「実行中」のステータスで配信サーバーに居残り続けます。今回は同じクライアントに対してシステム情報の取得ジョブを送ると、終了してくれました。(このへんの電文作成のトリガーがどうなっているかはよくわからん。)JP1の製造元の日立グループのみなさんも、使ってみてくださいね。あ、今度はソース公開します。その代わりといっちゃ何ですが、こういうツール作れる人を自社製品のモニターなんかにしておくといいなあとか思いません?チャンドラー2、どっかにホコリかぶっていませんか?(生産中止の製品のモニターに立候補しても、そりゃ無理ですね。)それから、TVも録画できる液晶一体型デスクトップなんぞもいいですねえ。(最近さもしくなったなあ>自分)いや別に洗濯機でも嬉しいんですがね。
このビデオにもなるパソコン、もう一つ機能があれば、是非使いたいんですよ。各LANに一台ずつ。ビデオデッキによくある機能で、NHKの放送に合わせて自動的に内部時計を合わせるというのがありますよねえ。ビデオ機能を持たせるなら、その機能もつけてくれませんか?(^^;
LAN環境では各サーバー、クライアントの時計を合わせるということも重要です。で、できれば正しい時刻に合わせたい。ディーリングサポートシステムなどの場合は取引時刻が重要になりますので、特にそのニーズは高い。インターネットに接続すれば簡単なのは分かっていますが、セキュリティ上、これだけのために外部ネットワークとの接続を行いたくはない。だからTV放送の時刻と合わせてくれるようなものがほしいわけです。GPSから時刻をもらうこともできますが、そのためにアンテナを張るのもねえ。TVアンテナなら、どこかにありますから。
上の文、技術的推測も入っているので、不適当な箇所があって訂正の必要があると思ったら教えてください、と日立製作所のJP1フォーラムにメールを出しました。ツールはオープンソースで公開すると言っているわけですから決して聞きっぱなしではないわけで、礼儀は逸していないと思っています。
2営業日たちましたが今のところ返事はありません。多分上のような解釈が広がっても問題はないと日立自身判断してくださったわけでしょう。これってお墨付きかな?
いや、相手にされていないだけでしょう。