ライフハックを使って、仕事の効率アップなどを計る際の基本となる考え方に「数値化して記録する」というのがあります。たとえば、営業成績を記録・グラフ化してモチベーションアップや目標設定に使う、というのはこのハックのかなり古典的な手法だと言えます。

ところが困ったことに、仕事の「質」に対する最も大事な要素の一つである「集中力」は、数値化して記録することができません。例えば、ある時点での集中力を「モッポル」とか(何でもいいんですけど)測ることができれば、「やばい、集力が40モッポルを切ったから、ちょっと休憩でもするか」とか、「今日は平均60モッポルで仕事ができた。明日は80モッポル目指して気合い入れよう」とかできるわけです。

で、どうしたものかと考えてたんですが、思いついたのは、自分らみたいに基本的にパソコンの前に座って作業するような類の仕事の場合、キーボードの「打鍵数」が、ほとんどそのまま「仕事量」になるなぁ、ということ。(社保庁みたいに一日5000なんて打鍵数で何ができるんだ。余談ですが。) 特に文書とかコード書く仕事の場合そうですよね。一日の打鍵数は、たぶんそのまま「仕事量」の近似としていいだろうし、ある一定時間内の打鍵数は、その時間の「集中力」に従って単調増加する量だと考えることができます。だって、仕事サボってWeb見たりボーっとしてる時って、だいたいマウスホイールしか動かしてないんですよね(笑。

そこで、キーロガーを使って、自分の打鍵状況を監視することで、この「集中力」が自動で測定できて、さらに、継続して監視し続けて、集中が切れたと判断したら自動的に警告「仕事に戻るか休憩取るかどっちかにせい」を出してくれるようなツールがあったら便利かな、と考えたという次第です。

ということで実際に作ってみました。

まず、Mac用に使える良いキーロガーが無いものかと色々調べたのですが、そもそもこういう類のもの、自分でインストールして使うという需要が無いのか(当たりまえ)、なかなか良いものが見つからず。いくつか試したけど、上手く動かなかったり、でした。

幸い、たまたま興味があってイジっていたChucKというサウンド・プログラミング言語


ChucK => Strongly-timed, On-the-fly Audio Programming Language
http://chuck.cs.princeton.edu/

に、キーボードとマウスのイベントを全てキャプチャするという機能が備わっていたので、これをRubyでラップして、3分クッキング的に即席キーロガーを作ってみました。(ちなみにChucK自体もとても面白いプログラミング言語なので、いつかこれ単体で紹介したいです。)


#! /usr/bin/ruby
require "open3"
kstdin, kstdout, kstderr = *Open3.popen3('chuck examples/hid/kb.ck')
mstdin, mstdout, mstderr = *Open3.popen3('chuck examples/hid/mouse.ck')
Thread.fork {
 mstderr.each {|line|
  if line =~ /mouse button (¥d) down/
   puts [Time.now.format, "mouse", $1].join("¥t")
   STDOUT.flush
  end
 }
}
 
kstderr.each {|line|
 if line =~ /down: (¥d+) ¥(code¥) (¥d+) ¥(usb key¥) (¥d+) ¥(ascii¥)/
  puts [Time.now.format, "key", $1].join("¥t")
  STDOUT.flush
 end
}

(Time#formatはstrftime(”%Y/%m/%d %H:%M:%S”)の自作ショートカット)

こんな感じで、ChucKに入っているexamples/hid/kb.ck, examples/hid/mouse.ckを並行に子プロセスとして動かして、stderrに来たものに時刻情報をつけてstdoutに垂れ流すだけの簡単なものです。

ここでポイントなのは、マウスのイベントも一緒に取得している点。例えばパワポの作成とか、CADとか、仕事してるんだけど打鍵よりはマウス操作主体、っていう作業があって、こういう場合はマウスのクリックも記録してあげないと「仕事していない」って誤認識されてしまいますよね。こういうような「マウス系」仕事の特徴は、ボタンをクリックする回数が多くなるという点なので、マウスボタンのdownを記録しておけば、すくなくともヒマつぶしのWebブラウジングとは区別ができるという仕掛けです。

上のスクリプトを動かすと、こんな感じでひたすらイベントとコードを記録してくれます。

2007/10/21 16:43:18 key 7
2007/10/21 16:43:18 key 8
2007/10/21 16:43:18 key 40
2007/10/21 16:43:19 key 54
2007/10/21 16:43:19 key 40
2007/10/21 16:43:19 key 227
2007/10/21 16:43:19 key 44
2007/10/21 16:43:19 key 57
2007/10/21 16:43:19 key 27
2007/10/21 16:43:19 key 22
2007/10/21 16:43:20 key 227
2007/10/21 16:43:20 key 43
2007/10/21 16:43:20 key 43
2007/10/21 16:43:23 mouse 0
2007/10/21 16:43:25 mouse 0
2007/10/21 16:43:26 key 227
2007/10/21 16:43:26 key 43
2007/10/21 16:43:26 mouse 0
2007/10/21 16:43:28 mouse 0
2007/10/21 16:43:28 key 227
2007/10/21 16:43:29 key 43
2007/10/21 16:43:29 key 43
2007/10/21 16:43:30 mouse 0
2007/10/21 16:43:31 mouse 0

で、手短かに結論だけ書くと。

このように記録されたキー履歴をリアルタイムで監視して、打鍵数+クリック数の「分速」を測定し続けてくれて、それがある閾値(自分の場合、打鍵数+クリック数×3の過去5分間の平均が分速85という基準)を下回ったら、「集中力が切れた」と警告音を「ピピー!」と出してくれるようなものを作りました。試しに作業の手を止めてWebブラウジングをはじめてみると、見事に警告音が鳴って集中力を呼び戻してくれます。詳細はまた後日「解析編」として書きますが、ここまで来ればスクリプト書ける人ならささっと自分で組んでしまったほうが早いかも。自分用カスタマイズもできますし。(ちなみに警告音を出す部分も、上で紹介したChucKを使いました。これだと自分好みで警告音までカスタマイズできるので楽しいです)

で、結果ですが、これ使って仕事にとりかかってみたところ、一日がかりだと踏んでいた作業(具体的には、科研費申請書類のある部分の作成orz)が2時間弱であっさり終わってしまい自分でもびっくりして、興奮してエントリを書いている次第です。自分がいかに普段集中力が途切れがちか、ということと、集中力が切れてから元の作業に戻るまでのオーバーヘッドというのがいかに大きいか、というのをまじまじと実感させられる結果でした。

ということで、自分がこれまでに試したどのLifeHackよりも効果があったので、
だれかこういうのが1つにまとまった使い勝手の良いアプリ作ってください(> < )
Mac OSの上部バーに常駐して監視・記録するようなやつがいです。

ちなみに、エントリ書いた後になって調べてみたらWindowsにはこのテのソフトが既にあるらしいです。


窓の杜 - 【NEWS】キーボードの打鍵数を監視して総打鍵数や1時間あたりの“打率”を表示
http://www.forest.impress.co.jp/article/2006/04/19/typeanalyzer.html

でもこれだと時間単位が1時間と長過ぎるので「集中力監視」には使えないし、マウスをキャプってくれないので、マウス主体作業には使えないという難ありです。やはり自分用にカスタマイズしたLifeHackツールは最強ですね。

あ、あと、ソリティアをすごい早さでプレイしてたり、メッセですごい勢いでチャットしているような時にどうやって警告出すかは今後の課題。