まだ厨二病

RとPyhtonを使ったデータ分析・統計解析らへんの話題をしていくだけ

📦RStudioでの作業状況を自動で記録するWakaTimeプラグインを作成しました

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

f:id:u_ribo:20160130003116p:plain

参考記事

plus.appgiga.jp

プラグインが対応しているエディタはこのページにある通りです。AtomSublime Text 2、Emacsなど有名どころには対応していますね。だがしかし肝心のRStudioのプラグインはまだ開発されていない様子です。

...WakaTimeは使いたい。されどプラグインがない。というわけで非公式のWakaTimeプラグインをRパッケージとして作りました。WakaTimeのR(RStudio)用プラグインということで{wakatimer}です。Pythonを使ってね、という公式の命令を無視して完全にRでできています。

github.com

同様に、Rでの作業時間を記録するパッケージとして@dichika さんが作成された{timecard}があります。

準備

利用する時に以下の項目について用意する必要があります。

  1. WakaTimeのアカウント
  2. アカウント作成時に与えられるAPIキー
  3. WakaTimeへのOAuth 2.0認証に用いるアプリケーションの登録

    • アプリケーションの登録では、Authorized Redirect URIsのところを"http://localhost:1410"にしておいてください。そしてその下にある%22App) ID"と"App Secret"の値が必要になります。
  4. 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.idapp.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のダッシュボードで表示できる内容については関数で一発表示できるようにしたいです。

諸注意

  • 非公式のプラグインなのでご利用の際はいろいろ気を付けてくださいご利用は各自の責任でどうぞ...
  • 時々挙動が怪しいです。正常にPOSTされなくても、めげずにコードを書いてください。
  • Rの終了がちょぴっと遅くなります。
  • 試した環境がとても限定的なので少なからずバグやエラーがあります。報告いただければ対応します。
    • {wakatimer}ではRStudioがもっている「最近開いたファイル」の情報を利用していますが、Windowsのパスがわかりません...。一応設定していますが、間違っているかもしれません。ぜひお知らせください。
広告を非表示にする