アプリケーションの起動時間を測るソフトを作る(Java)

PCで何かしらの作業をしている時、その作業時間を測っておきたいと思うことがあります。 1万時間の法則という言葉もあるくらいですから、例えば趣味にどれくらいの時間を使っていて、 どれくらい頑張ったのかを確認して満足したり、 はたまたゲームなどに費やした時間を可視化して、多すぎるようなら反省したり(大体のゲームではプレイ時間が記録されますが)。 個人的には作業時間を記録して、そういうことに役立てたいと思っています。

作業時間を記録するWebサービスには、代表的なものにToggleなどがあり、一時期は自分も使っていました。 しかしこれは、作業開始時と終了時に自分でタイマーを操作しなければいけないため、作業時間を記録し忘れたり、タイマーを止め忘れたりしてしまうことが多々あり困っていました。

toggl.com

要するに何がしたいか

PCで起動しているソフトの起動時間を測定しておけば、タイマーの操作忘れに悩まされることもないだろうということです。 個人的には普遍的な悩みだと思っていて、探せば良さげなフリーソフトが見つかるかと思いきやそうでもなかったので、 練習を兼ねてJavaで組んでみることにしました。

コード

github.com

やることは単純で、指定したアプリが起動しているかを一定時間ごとに確認し、起動していれば累積起動時間を分単位で更新していきます。 起動しているかどうかの確認にはWindowstasklist | Findコマンドを使いました。サンプルとして自分が時間を記録したいと思っていたUnityとClipStudio Paintが確認対象になっています。

困った部分

JavaからWindowsのコマンドを呼び出すために、Runtime.exec()メソッドを使ったのですが、実はダブルクォーテーションで囲まれた部分があると正常に動作しないみたいで、結局バッチファイルを作って処理することにしました。そのせいで起動確認したいソフトごとにバッチファイル作る必要があったりしてややこしいことになってます。

課題

一分ごとに毎回データを保存しているのが冗長な気がするので、一時間ごとに保存、終了時にShutdownHookで保存とかのほうが良いのかもしれません。今はどうせ自分しか使わないので本当に最低限の要素しかありませんが、本格的に開発するならやっぱりC#とかのほうが良さげですね。Cにはアクティブウィンドウを取得するメソッドがあるみたいで、実際の作業時間を記録するなら明らかにそっちのほうがいいですし。地味にC#では使えたタプルがjavaでは使えなかったりして面倒でした。

参考にさせていただいたサイト

d.hatena.ne.jp