日々ギョウムやケンキューに追われる皆さん、進捗どうですか。進捗、可視化できると楽しいですし仕事に対する意欲を高めるために良いですよね。そんなことを可能にするWakaTime というウェブサービスがあります。WakaTimeでは普段コーディングなどで使用しているエディタに専用のプラグインを導入することでコードをどのくらい書いたか、どのプロジェクトのどのブランチでどれくらいの時間作業をしていたかがわかります。

参考記事
プラグインが対応しているエディタはこのページにある通りです。AtomやSublime Text 2、Emacsなど有名どころには対応していますね。だがしかし肝心のRStudioのプラグインはまだ開発されていない様子です。
...WakaTimeは使いたい。されどプラグインがない。というわけで非公式のWakaTimeプラグインをRパッケージとして作りました。WakaTimeのR(RStudio)用プラグインということで{wakatimer}です。Pythonを使ってね、という公式の命令を無視して完全にRでできています。
同様に、Rでの作業時間を記録するパッケージとして@dichika さんが作成された{timecard}があります。
準備
利用する時に以下の項目について用意する必要があります。
- WakaTimeのアカウント
- アカウント作成時に与えられるAPIキー
WakaTimeへのOAuth 2.0認証に用いるアプリケーションの登録
- アプリケーションの登録では、Authorized Redirect URIsのところを"http://localhost:1410"にしておいてください。そしてその下にある%22App) ID"と"App Secret"の値が必要になります。
GitHubから
{wakatimer}パッケージのインストールdevtools::install_github("uribo/wakatimer")
wakatimerの使い方
パッケージを読み込んで、write_scope()という関数を実行するだけです。
詳しい説明は以下の通りになります。
まず肝心のパッケージを読み込んでください。
library(wakatimer) # Next, to run `write_scope()` and # authentication for file status record # :)
パッケージを読み込むと、WakaTimeにデータを送るために必要な認証を行うwrite_scope()をやるようにメッセージが出ます。パッケージをインストールしてから最初のwrite_scope()ではWakaTimeの認証を求められます(プロジェクトごとに認証が必要)。write_scope()には引数としてapp.idとapp.secretが用意されています。ここに渡す値は準備のところで取得したアプリの値になります。
毎回入力するのが面倒なのでオススメの使い方として、.Rproileに次のような記述をしておくと良いです。
Sys.setenv(WAKATIME_KEY = "<your api key>", WAKATIME_ID = "<application id>", WAKATIME_SECRET = "<application secret>")
というわけで改めてwrite_scope()を実施します。
write_scope() # 💻R (3.2.3) 🔵RStudio (0.99.868) 📦wakatimer (0.1.2)
これで準備完了です。ここからファイルの変更を記録していく仕組みです。他に必要なことはありません。あとは普段通りRStudioでコードを書いていきます。q()でRStudioを終了すると、データが送信されますので特に気にせず使い続けることができます。パッケージを読み込んだだけだど記録しない点だけ注意してください。
インターネットに接続されていない時はローカルデータベースにデータを保存しておいて、次回、ネットワーク接続がある時にwrite_scope()を実施するとデータがWakaTimeへ送られます。
APIを使った進捗の可視化
{wakatimer}パッケージでは、WakaTimeが提供するAPIをラップした関数を用意しています。なのでR上でも進捗状況の確認が可能です。
wakatimer:::wt_api(resource = "heartbeats", key = Sys.getenv("WAKATIME_KEY"), param = list(date = format(Sys.Date(), "%m/%d/%Y"), time = "time", "entity")) %>% .$data %>% tail() %>% knitr::kable(format = "markdown")
| entity | id | time | type | |
|---|---|---|---|---|
| 6 | ~/git/r_pkg/wakatimer/vignettes/wakatimer-workflow.Rmd | adcbc187-8d5f-4583-a21e-d332dd8853ee | 1454080409 | file |
| 7 | ~/git/r_pkg/wakatimer/R/wt_sync.R | c42f025e-7526-49b2-ba90-572b526e4f60 | 1454080804 | file |
| 8 | ~/git/r_pkg/wakatimer/R/wt_sync.R | a701e936-71c7-4878-8335-be4e3643f01a | 1454080811 | file |
| 9 | ~/git/hatena_blog/160130_wakatimer.Rmd | ce3ea352-f1f4-493e-a5d2-aefd8f05fce1 | 1454080888 | file |
| 10 | ~/git/hatena_blog/160130_wakatimer.Rmd | 11295336-55f2-4622-8982-d49274d2abd0 | 1454080898 | file |
| 11 | ~/git/hatena_blog/160130_wakatimer.md | 76898711-1a7c-4bb5-8c27-c3136f5c48bf | 1454080982 | file |
データをとってきてからがRの本領を発揮すると言っても良いので、ここは力を入れたいところなのですが、一通りのAPIを叩く方法はvignettesに書いていますが、まだ完全にはできていません。次のバージョンまでにWakaTimeのダッシュボードで表示できる内容については関数で一発表示できるようにしたいです。