自分の怠惰さと付き合う

自分の時間をどう使うかかなりの範囲を自分で決定できる環境にあるのだけれど、生来の怠け者なのでこのままだと人生が詰みそうである。

自分の怠惰さに全幅の信頼をおいているので、自分には期待せず出来るだけ環境から働きかけてくれるように最近始めたことを書いてみる。

ドブに捨てた時間を見つめる

アクティブアプリケーション

FluentdとGrowthForecastを使って自分の行動をロギング・可視化する - すぎゃーんメモ
を参考にアクティブアプリケーションの集計をとるようにした。

Elasticsearchとkibanaを試しに使ってグラフ化し、cronで0時に一日のサマリーをPushbulletHTTP APIで通知するようにした。Twitterを見まくったりしてることが可視化される。

org-modeとポモドーロ・テクニック

一応Emacsでorg-modeを一応使っているのだけれど、clockerというclockが動いていない状態でファイルを保存しようとすると文句を言ってくるpackageを入れてみた。package-installして

(require 'clocker)
(clocker-mode t)

一日のはじめに予定を立て、一日の終りにclocktableと比較して如何に何もしていないかを味わう予定でいる。

ついでにorgのclockと連携してポモドーロテクニックを試してみることにした。とりあえずthymeorg-pomodoroあたりを試してみたけれど人には薦めないかなぁという感じ。

自分だけの鬼教官を持つ

Language Exchangeのサイトでチャットか何かをしていたときに、ネイティブじゃないのに日本語がペラペラの人々がいて、あまりにも上手いのでどうやって学習したか聞いたところAnkiを薦められた。
暗記カード用のデータを入れておくと忘却曲線に従って良き頃を見計らって出題してくれるという良いアプリ。

本を読むときにAnkiに問題を入れながら読むと、理解していないと問題を作れないのでメモを取りながら読むよりもさらに主体的に読む必要が出てきて結構良い。知ったのはかなり昔なのに実は暗記カードとしてはほとんど使っていない。Ankiを立ち上げるには僕は怠惰すぎた。
なので、起きて最初にパソコンを立ち上げたときに30分Ankiしか立ちあげられなくしてみた。

スリープに入る時と復帰時にスクリプトを実行できるSleepWatcherを使う。

インストールと起動

% brew install sleepwatcher
% ln -sfv /usr/local/opt/sleepwatcher/*.plist ~/Library/LaunchAgents
% launchctl load ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist

適当なスクリプトを書く

デフォルトでは~/.sleepと~/.wakeupを実行するようになっているのでそれに従う。

.sleepで入眠時刻を記録する。

#!/bin/sh

SLEEP_WATCHER_DIRECTORY="$HOME/.sleepwatcher"
SLEEP_INFO="$SLEEP_WATCHER_DIRECTORY/slept_at"
if [ ! -d "$SLEEP_WATCHER_DIRECTORY" ]; then
  mkdir $SLEEP_WATCHER_DIRECTORY
fi

date +"%s" > $SLEEP_INFO

.wakeupでは6時間以上のスリープからの復帰時に一日の初めだとしている。ウェアラブルデバイスを使うともっとお洒落になるかもしれないけれど特に精度は必要ないのでこれでいい。
30分、Ankiがアクティブになっていないと勝手にアクティブにし続ける。
それが終わった後は一日の予定を立てることを促す。

#!/bin/zsh

. ~/.zshrc

SLEEP_WATCHER_DIRECTORY="$HOME/.sleepwatcher"
SLEEP_INFO="$SLEEP_WATCHER_DIRECTORY/slept_at"
if [ ! -d "$SLEEP_WATCHER_DIRECTORY" ]; then
  mkdir $SLEEP_WATCHER_DIRECTORY
fi

SLEPT_AT=$(cat $SLEEP_INFO)
START=$(date +"%s")
SLEEP_THRESHOULD=21600 # 6 hours
ANKI_DURATION=1800 # 30 mins
ANKI_END_AT=$(expr $START + $ANKI_DURATION)

if [ $(expr $START - $SLEPT_AT) -gt $SLEEP_THRESHOULD ]; then # if wake up
  # do Anki for $ANKI_DURATION
  terminal-notifier -title 'Anki' -message "$(expr $ANKI_DURATION / 60)分のAnkiタイムスタート"
  osascript -e 'activate application "Anki"'
  while [ $(date +"%s") -lt $ANKI_END_AT ]
  do
    ACTIVE_APP=$(osascript -e 'name of (info for (path to frontmost application))')
    if [ "$ACTIVE_APP" != 'Anki.app' ]; then
      terminal-notifier -title 'おい!' -message 'Ankiやれ'
      osascript -e 'activate application "Anki"'
    fi
    sleep 5
  done

  # make a daily plan
  terminal-notifier -title 'emacs' -message '一日の予定をたてよう'
  emacsclient --no-wait ~/org/gtd.org
fi

terminal-notifierを使っているので入っていなくてそのまま使いたい場合にはbrew insall terminal-notifierとかする。特に停止するためのコマンドなどは用意していないので、急用の場合にはpsしてgrepしてkillしたりする。sleep間隔が5秒だと停止できてしまうので1秒とかにしたほうがいいかもしれない。