アクセスカウンタ

プロフィール

Author:croissant3

カテゴリー

最近の記事

月別アーカイブ(タブ)

最近のコメント

最近のトラックバック

月別アーカイブ

ブロとも申請フォーム

この人とブロともになる

月別アーカイブ

カレンダー

11 | 2016/12 | 01
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

小さな天気予報


-天気予報コム- -FC2-

全ての記事を表示する

全ての記事を表示する

PCノンセクションの10♪
PCに関することを色々と。っつうか最近VBネタばっかorz
スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
↑参考になったら拍手よろろ
フレームつきページの読み取り

WebBrowserに対してDHTMLで操作を行う際、
ページの読み込みが完全に終わるまで待ってから
コチョコチョと操作を行う流れになる。。 

実際にはWebBrowserのDocumentCompleteイベントをトリガーに
コチョコチョ操作を実装する訳で・・・
通常のフレーム分割されていないページなら
DocumentCompleteイベントを1度待てば済む話。


ところがフレーム分割されているページだと
DocumentCompleteイベント、BeforeNavigate2イベントが
非同期に複数パカパカとイベントが上がってくる。
さて全てのドキュメントを読み込むには
どこまで待てば良いのか?というのが今回のテーマ。


結果から話す。

WebBrowserのDocumentCompleteでこんな実装をすれば良い。

'----------------------------------
If pDisp Is WebBrowser.Object then
  '最後の親フレーム
Else
  '子供フレーム
  '読み込み途中なので無視
  Exit Sub
End If

'コチョコチョ処理をここから実装。
  :
  :
'-----------------------------------


ちなみにDocumentCompleteが発生する前に何か処理をしたい場合も一緒。

BeforeNavigate2イベントの中で

'-----------------------------------
If pDisp Is WebBrowser.Object then
  '親フレーム
Else
  '子フレームなので無視
  Exit Sub
End If
'初期化処理などをココに実装
  :
  :
'------------------------------------

解説するとフレームつきページを読み込んだ時の流れはこんな感じ。

BeforeNavigate2(親フレーム) 発生
BeforeNavigate2(子フレーム) 発生
BeforeNavigate2(子フレーム) 発生
BeforeNavigate2(子フレーム) 発生
DocumentComplete(子フレーム) 発生
DocumentComplete(子フレーム) 発生
DocumentComplete(子フレーム) 発生
DocumentComplete(親フレーム) 発生

子は順不同、最初と最後に必ず親フレームのイベントが上がってくる。
この親フレームのイベントを捕まえるには
pDisp Is WebBrowser.Object という条件で
判断が出来るという仕組み。


この様に実装しておくとフレーム分割されたページでも
pDispを使えば最後までドキュメントを読み込んだタイミングを
捕らえることが可能です。


↑参考になったら拍手よろろ
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

リモートシャットダウン(UPS管理)その4

具体的な処理毎の実現方法について。

(1)UPS情報の取得処理
   →WMI を使ってバッテリー稼動可能な時間を取得。
(2)リモートシャットダウン処理
   →WSH を使って "shutdown.exe" を実行。
(3)自分のホスト名の取得
   →WMI を使って取得。今回のサーバってアクティブスタンバイの冗長サーバなんで
    自分がアクティブなのかスタンバイなのかを判断する必要がある。
(4)リモートシャットダウンのコマンド発行前に対象PCが起動しているかをチェック
   →WSH を使ってpingを実行。実行結果のログに"Reply" の文字列があれば起動中とみなす。

こんな感じですかね。

とりあえずVBScriptを組んでタスクスケジューラに突っ込んで
UPSの電源ケーブルを抜いた所、UPSの電池が切れる前に全部のPCが
自動シャットダウンしてくれました。うまく動いている様子です。

動いてくれたのは良いけど・・なんか恥ずかしい作り。
クールにサービスプログラムで実装したひ。
やっぱ.NETや2005っすかね。orz


↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

リモートシャットダウン(UPS管理)その3

てな訳で仕切り直し。改めて考えてみる。
とりあえずリモートシャットダウンのコマンドは"shutdown.exe"で決まり。
問題のトリガーは・・・・自分で検出するしかないか。orz
[UPSの残量の取得]
確かWMIの解説サイトにバッテリー情報の取り出し方法が書いてあったはず。
ためしにサンプルを基にテストプログラムを作ってみたら・・・
UPS情報が取れるじゃん。良いねぇ♪
更にサンプルで紹介されていたプロパティ以外に色々漁ってみたら
バッテリー稼動可能な時間や充電率まで取得が出来た。かんぺき。
これなら勝てる♪(by尾崎)

[何で作る?]
今回はXPでなくWindows 2003 Serverだから
フォームレスの常駐型のVBプログラムは使えないorz
なんとかの一つ覚えだけど・・・またタスクスケジューラで
定期的に監視する形にしますか。
UPSのバッテリー残量、シャットダウンコマンドの発行、
などなど考えたら VBScriptでも十分やね。

ってな訳で
「バッテリー残量をチェック、バッテリー稼動が可能な時間が15分以下だったら
リモートシャットダウンコマンドを発行するスクリプト」を
定期的にタスクスケジューラで動かす形に決まり。

タスクスケジューラのお世話にならず
サービスプログラムにしたいなぁ。orz
↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

リモートシャットダウン(UPS管理)その2

とりあえず色々ググってみました。

[リモートシャットダウン方法]
WindowsXP, Windows 2003 Server には
リモートシャットダウンをするためのDOSコマンドが標準であるらしい。
"shutdown.exe" うわぁ。べたべたな名前。
ためしにDOS窓から叩いてみた。あ・動いた。完璧じゃん。

[リモートシャットダウンのトリガー]
今回のUPSにはAPC社のPowerChuteって電源管理ソフトがついている。
電圧低下の検出と自動シャットダウンはこいつが行うわけだけど、
自動シャットダウンする前に好きなコマンドを叩くインターフェースが用意されてるじゃん。
ここにリモートシャットダウンのコマンドを埋め込めばOK?
思ったより簡単♪(^^;

[早速テスト]
ってな訳でリモートシャットダウン処理をVBScriptにして早速組み込んでみた。
あれ?動かない。どうして火が入らないんだ?
げ・・・・UPSに添付されているPowerChuteは機能限定のBasic版。
3万払ってDeluxe版を購入しないと自動シャットダウン前に
指定したコマンドは叩けないらしい。やられた。。orz

別のトリガー方法を考えないとあかんです。orz


↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

リモートシャットダウン(UPS管理)その1

今年の夏WindowsサーバにやっとAPC社のUPS(Smart-UPS 750JB)をくっつけた。
そしたら最近サーバがもう一台増えちまった。でもUPSは増えてない。orz

UPSって電源ケーブルとは別にUSBやシリアルポートでも繋いでおいて
電圧低下をそのケーブル経由で検出、バッテリー残量がなくなる前に
PCが自分自身をシャットダウン出来るようにしているのよ。

でもUPSの(PCと接続する)ポートって通常1個なのよね。

1台のUPSに複数PCの電源を繋いだ場合、(瞬断レベルの電圧低下なら問題ないけど)
長時間の停電などの場合自動シャットダウンできるのは1台だけ。orz
他のPCは電圧低下を認識できないからUPSの電池が切れたらアウト。(UPSの意味がない)
何とか他のPCを救う方法はないか?と考えてみた。。。。

電圧低下を検出したPCが他のPCをリモートシャットダウンすればいいじゃん。(^^;

てな訳でリモートシャットダウンの方法と
リモートシャットダウンのトリガーについて調べ始めました。


↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

Windowsユーザ一括登録ツール(その2)

一応こんなのが出来ました。
エクセルの中のデータを読み出してaddusersコマンドと
net share コマンドで一括登録します。

MakeAccountTool

これでこんなのが登録できます。
(1) ユーザ
  ユーザ名、説明、初期パスワード、各種チェックボックスの設定など
(2) グループ
  グループ名、属するユーザなど
(3) (1),(2)を使った共有フォルダのアクセス権


こんなのはエクセルのマクロで作っちまうのが
簡単かと思うのですが・・
私はエクセルのマクロは知らないんです。orz



[2006.09.14追記]
よくこの記事を検索して飛んでくる人が多いので補足。

巷じゃActiveDirectoryを使った方法がよく紹介されてます。
今回のサーバはActiveDirectoryは使わずに
ローカルユーザ、ローカルグループでやってるんで
それに合わせた方法になってます。

あとaddusers.exe でユーザ、グループ情報を一括登録する際、
addusers.exe に読ませるテキストファイルはUTF-16じゃないと文字化けします。(^^;
FileSystemObjectでOpenTestFileする際はUNICODE指定をしてください。

↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

Windowsユーザ一括登録ツール(その1)

先日Windowsサーバのセットアップの際に行うユーザ登録処理を
ツール使って一括登録出来ないか?と相談された。

色々ググってみた所、Windows2000サーバ用リソースキットに含まれている
addusers.exe を使えばテキストファイルに定義したユーザ情報を
インポートしてくれるそうな。。。。
そのほか共有フォルダの設定云々もnet share コマンドで一括登録できるらしい。

実現方法はとりあえず解った。

どうやってツール化しようか。
ユーザ情報、所属グループ、共有フォルダのパーミッションなどを入力した
EXCELのファイルを用意させておいて・・・・
そのEXCELの情報を読み出して、
VBからユーザ、グループ、共有フォルダの登録をする形にしますか。。。。

面白そうなネタだけど
この手のツールって転がってそう。。。(^^;
↑参考になったら拍手よろろ
バックアップツール作成記(その6)

とりあえず作ってみました。

フォームレスのツールなのでキャプチャ画面はなし。(^^;
ネットワーク接続/切断の排他制御用のクラスも
適当に作ってみましたが適当に動いている様子。

LANケーブルの挿抜やネットワーク上のエラーが
発生した時のテストをやってみて問題なければ
サーバに突っ込んでみますか。。。 ↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

バックアップツール作成記(その5)

構想としてはこんな感じ。

とりあえずCopyEngineっていうUserControlを作成。

このCopyEngineには1JOB辺りの処理を全部実装。(汗)
#ちなみにJOBってのは定期的にネットワーク接続 →
#コピー処理 → 切断という処理を実行することを指してます。

(1)タイマによるコピー開始処理時刻の監視
(2)ネットワーク接続、コピー処理、切断機能
(3)失敗時のメール送信エンジン
(4)などなど




んでツール起動時に
このCopyEngineというUserControlを
Me.Controls.Add("AppName,CopyEngine",xxxx)
って感じでJOBの数だけ動的に追加。

各CopyEngineに対してJOB内容をプロパティで全部設定して
監視開始のメソッドを呼ぶ。

あとは各JOBで時間になったら勝手にコピー処理を行ってくれるので
メイン関数ではこの後は放置プレイ。(^^;

こんな具合です。

ただ1点。
この方式だと各JOB内でのネットワーク接続の定義内容が重複していた場合、
排他制御をかけておかないと先にコピー処理が終わったJOBが
勝手に切断しちゃったり、接続中の共有フォルダに
別JOBが接続するという罠があります。
これは排他制御用クラス作って一元管理させる予定。(^^;


同期処理をさせるとツール自体がダンマリしたり重くなるので
極力非同期で動くように作らないと。。。

なんか他に良い設計ないですかね。。。
↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

自動入力

このご時勢、機密情報漏えい防止の関係で
アクセス制限がかかっている
社内WEBページがメチャクチャ多い。

ちょこっと確認したいだけなのに毎回毎回毎回毎回
パスワードを入力するのが面倒なので
昼休み使って30分で作りました。

認証君


デスクトップを監視し、予め登録しておいたWEB画面やダイアログを見つけると勝手に自動入力してくれるものです。

自動入力機能のノウハウはGUI版ダウンローダを作ったときの
ソースのコピペ。(^^;

この手のツールって探せばありそう。でも探すのもめんどい。
外の汎用的なゴテゴテしたのは求めてないので
ぷち小道具として作ってみた所・・職場ですっごく重宝された。
↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

バックアップツール作成記(その4)

crontab形式の表記にアクセスするライブラリって全然ないや。

crontabの表記って余り気にしたことなかったけど
例えば "分" 一つの定義にしても

1,3,5 -------> 1,3,5
1,3-5,7 -------> 1,3,4,5,7
* -------> 0-59
*/2 -------> 偶数
1,4-6,8,22/3 --> 1,4,22

とか色々な表記があるのね。orz

自作?めんどいよぉ。orz
なんとかならないかなぁ・・・・
↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

バックアップツール作成記(その2)

とりあえず仕事の片手間で作ってみた。

(1)起動はタスクスケジューラ経由。
(2)スケジュール管理はタスクスケジューラ任せ。(^^;
(3)INIファイルに複数のコピー処理を定義できるようにした。
(4)一つのコピー処理は「接続」→「コピー」→「切断」。
   これを定義のあるだけ複数回実行する。
(5)エラー時はログ以外にメールでも通知。
(6)一通り処理が終わったら自分で勝手に死ぬ。

結局管理プロセスとコピープロセスのI/Fはレジストリで行う事に。
コピー内容をレジストリに書いてそのセクション名を引数に
コピープロセスを起動するようにしました。

これ以外の要求仕様はそのうち。(^^;

(4)の機能が好評です。(^^;
↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

バックアップツール作成記(その1)

とりあえず時間を見つけて構造を練ってみる。

(1)タスクスケジューラに登録して使うんだから
   1回のコピー処理が終わったらexitで落ちる形にする。

(2)フォームレスなツールは必須。

(3)ツール起動中はいくつものコピー処理を行うわけで、
   ギガ単位の大量コピーをしている最中は(Windowsの
   仕様上)ツールに制御が殆ど戻らないから他の処理が
   殆ど動かなくなっちまう。
   仕方がないので管理部分とコピー処理部分の
   プロセスを分けるしかないか。(^^;

(4)(3)での各プロセス間のI/Fはどうする?
   メッセージ?単にコピー処理の指定や結果をもらうだけなのに
   実装がめんどい。orz
   INIファイル?複数プロセスからのファイルアクセスが
   集中するのもやだ。
   レジストリ?これならまだいいか。(^^;

なんか以前作ったダウンローダに構造が似てきた・・・

    ↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

提案したは良いけれど

なんかしらんがコマンド一発でコピーするような
バックアッププログラムを自分が作って
Windowsサーバのタスクスケジューラに組み込むことになった。

余計な事言わなきゃ良かった。orz

↑参考になったら拍手よろろ
■ 続きを読む。 ■

テーマ:プログラミング - ジャンル:コンピュータ

職場での出来事

職場の人がサーバのOSを変えたら
市販のバックアップソフトが動かなくなったと騒いでた。

決まった場所を定期的にバックアップするだけなら
サービス起動可能なツールに乗り換えるか
タスクスケジューラで起動するような
コマンド一発のスクリプトでも用意すりゃいいじゃん。orz

本格的なバックアップ機能を要求しているわけじゃないんだから。orz
↑参考になったら拍手よろろ

テーマ:プログラミング - ジャンル:コンピュータ

リネームツール

ふと仕事で何百何千ものファイルを一括してリネームすることになった。

そっちは単にFileSystemObjectを使ってループしながらリネームすりゃ良いだけ。

ただ前々から欲しかったのがJEPGファイルの撮影時間を使ったリネームツール。(ExIF情報を引っ張ってくるやつね)
↑参考になったら拍手よろろ
■ 続きを読む。 ■

テーマ:プログラミング - ジャンル:コンピュータ

diffはファイル単位orz

仕事をしているとテキストファイルの比較はよく行う。
UNIX上じゃdiff,Windows上じゃDFやWinDiffで。
でもその手のファイルって当然のごとくファイル単位の比較。

もし一つのファイルに同じような記述が
2箇所あってこれらを比較したいって考えたらどうします?

他の人のやり方を見ると
比較したい2箇所をそれぞれ別ファイルに切り出して比較してます。
でもこの方法・・・本当にめんどい。
↑参考になったら拍手よろろ
■ 続きを読む。 ■

テーマ:ソフトウェア - ジャンル:コンピュータ

PCでlddもどき

ある日ポンと置かれた*.exeが一体どのプラットフォームで
作っているのか?判別できるチェックツールを作れないか?
と開発から相談を持ちかけられた。

管理人「ダイナミックリンクしているライブラリ名で判別できんの?」
開発 「判別出来る。UNIXならlddで一発だけど今回PCなんよ」
管理人「Dependency Walkerとかの解析ツールを使えば?」
開発 「あの手のツールって開発環境がPCに入ってないとダメだし
    一回でチェックしたい数が2000個くらいあるんよ」
管理人「それじゃ1個1個その手のツールに読み込ませるのは無理だな・・」

ちょっと調べてみますわ。 ↑参考になったら拍手よろろ
■ 続きを読む。 ■

テーマ:プログラミング - ジャンル:コンピュータ


ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

メールフォーム

名前:
メール:
件名:
本文:



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。