ブラウザ監視
昨日(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 がブラウザのプロセス名。
ところで、自分の場合 Twitter のクライアントに twicli というブラウザベースのものを使っているので、これをどうしようかと迷ったが、結局 twicli は Chrome で動かすことにした(人によって違うと思うが、自分にとって Twitter は timesink ではない)。Twitter 以外のネットには Firefox だけしか使わないという意志は必要だけど、これを破るのはかなり明確な行動なので、まあいけるんじゃないだろうか。
(追記)2〜3日運用してみた。いい感じ。ちなみに、終了はタスクマネージャから。