ブラウザ監視

昨日(7/29)、研究室にいる時間の 9割ぐらいをネット閲覧で過ごしてしまった。これはよくない。ということで、対策を考える。例によって、意志を強くするという方向以外で。

ネットの見過ぎに関しては、以前「http://d.hatena.ne.jp/lionfan/20080523」に感銘を受けて、作業用 PC とネット閲覧用 PC を分けるということを実践してみた。

しかし、運用してみて気づいたのは、「作業用 PC でネットができないと困る場合はどうしてもある」ということ。「○○を実現するにはどうすればいいか調べる」という時、見つけたサイトのコードを参考にしながら書いて、うまくいかなかったら別のサイトも参考にして、という作業を反復する必要がある。そのたびに席を移るのはいかにもアホらしい。また、パッケージやアプリケーションをダウンロードする等も、作業用の PC でやらないといけない。ネット用 PC から共有スペースにダウンロードする等も考えられるが、それにしても宿命的にアホらしい。

そこで考えたのが、「ブラウザを長時間起動していると警告を出す」というスクリプト。要するに、長い間使っているのが問題なのだ。短い時間、必要なだけネットを見ることはかまわない。

そういうわけで実装。Windows なので WSH、言語は JScript。本来、こういうのは VBScript で書いたほうがずっと楽だというのは知っているのだが、どうしても精神的に抵抗感があって使う気になれない。

var checkIntervalInSeconds = 60;
var allowedTimeInSeconds = 300;
var waitInputInSeconds = 60;
var browserProcessName = "firefox.exe";

var WshShell = WScript.CreateObject("WScript.Shell");
var secondsEllapsed = 0;
var objWMIService = GetObject("winmgmts:\\\\.\\root\\cimv2");
while (true) {
	var foundCount = 0;
	var procFirefox = null;
	var procs = objWMIService.ExecQuery("select * from win32_process where name = \"" + browserProcessName + "\"");
	var procIter = new Enumerator(procs);
	if (procIter.atEnd()) {
		secondsEllapsed = 0;
	}
	WScript.Sleep(checkIntervalInSeconds * 1000);
	secondsEllapsed += checkIntervalInSeconds;
	if (secondsEllapsed >= allowedTimeInSeconds) {
		var ret = WshShell.Popup("ブラウザが起動されてから一定時間が経過しています。\n必要な作業でしたら「はい」を押して継続してください。", waitInputInSeconds, "警告", 4 | 48);
		if (ret != 6) {
			try {
				procIter.item().terminate();
			} catch(e) {}
		}
		secondsEllapsed = 0;
	}
}

checkIntervalInSeconds がチェックする間隔(秒)、allowedTimeInSeconds が警告を出すまでの時間(秒)、waitInputInSeconds が警告を出してからの入力待ち時間(秒)、browserProcessName がブラウザのプロセス名。

DropBox でも共有しておいた。ファイル

ところで、自分の場合 Twitter のクライアントに twicli というブラウザベースのものを使っているので、これをどうしようかと迷ったが、結局 twicliChrome で動かすことにした(人によって違うと思うが、自分にとって Twitter は timesink ではない)。Twitter 以外のネットには Firefox だけしか使わないという意志は必要だけど、これを破るのはかなり明確な行動なので、まあいけるんじゃないだろうか。

(追記)2〜3日運用してみた。いい感じ。ちなみに、終了はタスクマネージャから。