Railsで運用しているサービスのKPI管理画面kintoneで作る

こんにちは！
[kintone Advent Calendar 2016](http://qiita.com/advent-calendar/2016/kintone) の23日目の記事です。

# Railsで運用しているサービス

音楽を聞きながら作業に集中するためのサービス
245cloud（ニシコクラウド）
http://245cloud.com/
を個人で開発・運用しています。
ソースはここで公開しています。
https://github.com/pandeiro245/245cloud

もともとDBはparse.comっていうBaaSに保存してて
イケてるDashboardがあったからそれが管理画面的な感じだったんですけど
（毎日アクティブユーザ数とかメールで送ってくれたりもしたし）
サービス終了ということでデータをparse.comからEC2上のMySQLに移管し、
管理画面はもっぱらRailsコンソールです。

```
irb(main):002:0> User.count
   (0.5ms)  SELECT COUNT(*) FROM `users`
=> 1025
```

ユーザ数1,025人かみたいなｗ

# KPI管理画面

過去に３回「管理画面チラ見せ♡ナイト」というイベントを開催しました。

1回目：https://atnd.org/events/53193
2回目：https://atnd.org/events/57411
3回目：https://connpass.com/event/31779/

登壇者にRailsの事例は多く、
RailsAdminやActiveAdminを試すんだけど
色々辛いですよねみたいな話でした。

あと非エンジニアもSQL覚えて参照用のMySQLユーザでデータ取っているみたいな話も聞きました。

さくっと管理画面を作ることにベストプラクティスは存在しないように思いました。
なので試してみたい。kintoneで管理画面を作れないかと。

# kintone
kintoneは2015年末に出会ったのでちょうどkintone歴1年になります。

年末に「kintone_sync」というfreeeやGitHubやTwitterなどのデータをkintoneと同期するgemを作りました。
http://www.slideshare.net/pandeiro245/api-kintone-rubygem-2016-0122-kintone-cafe

Gemfileに

```
gem 'kintone'
gem 'kintone_sync', github: 'pandeiro245/kintone_sync'
```

と追記して`bundle install`し、
`.env`というファイルを作って

```
KINTONE_HOST='hoge.cybozu.com'                                                             
KINTONE_USER='hoge'
KINTONE_PASS='hoge'
```

と記載してコンソール再起動するだけで動きます

# とりあえずDaily新規登録ユーザ数
利用者毎の登録時間はusersテーブルのcreated_atカラムなのでこんなkintoneアプリを作成
![image](https://qiita-image-store.s3.amazonaws.com/0/37824/ad6be099-bf7f-97a9-af19-9646a911e5da.png)

そしてUserモデルに下記を追加して実行すると…。

```
  def self.sync(app_id)
    start = Time.now
    k = KintoneSync::Kintone.new(app_id)
    records = User.find_each.map{ |user| {created_at: user.created_at } }
    k.create_all!(records)
    puts "created: #{Time.now - start} seconds"
  end 
```

![image](https://qiita-image-store.s3.amazonaws.com/0/37824/a9ae1a54-0fcc-0331-23ae-346d059a59e9.png)

ちゃんと保存されております！Userレコードが1,025件なので数字もあってます。

EC2のmicroインスタンスで動いているのですが全件同期で5秒ぐらいでした。

手前味噌ながらkintone_sync便利すぎる…。

![image](https://qiita-image-store.s3.amazonaws.com/0/37824/5b032f5a-e311-6dda-eddb-0649db848a28.png)

kintone上でこうやって選択するだけで

![image](https://qiita-image-store.s3.amazonaws.com/0/37824/2465f548-8f43-646a-586d-009ebc24fd89.png)

こんな感じで12月のデイリー新規登録者数が確認できます。
（12月7日（水）が多めだけど理由はわからず）

# とりあえず24分間集中（Workload）がちゃんと達成された数を知りたい

workloadsテーブルは8万件ぐらいあったのでひとまずこんな感じで5,000件だけ同期。

```
  def self.sync(app_id)
    start = Time.now
    k = KintoneSync::Kintone.new(app_id)
    records = self.order('id desc').limit(5000).map{ |w| {created_at: w.created_at, facebook_id: w.facebook_id, music_key: w.music_key, title: w.title, is_done: w.is_done}}
    k.create_all!(records)
    puts "created: #{Time.now - start} seconds"
  end 
```

所要時間は19秒でした。

![image](https://qiita-image-store.s3.amazonaws.com/0/37824/5826d882-d225-5083-2ffb-73e1499739be.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/37824/dff6487f-7fee-db1f-9e14-ed2fa9261457.png)

kintone上で上記のように設定されるとできました

![image](https://qiita-image-store.s3.amazonaws.com/0/37824/18f71642-1c60-0a6d-baf5-0ddde1db7380.png)

だいたい平日が多くて土日に下がる感じかなと

# 利用者データと集中結果データを紐付ける

![image](https://qiita-image-store.s3.amazonaws.com/0/37824/42033812-6fd4-f70b-6816-cd9b08ad9ef2.png)

こんな感じで利用者アプリに「関連レコード」という肩のフィールドを追加するだけでこうなります。

![image](https://qiita-image-store.s3.amazonaws.com/0/37824/bba35201-1f36-d9ac-eb8c-ba9b0a878f5b.png)


# 最後に
今後は下記とかも試していきたいです！

* よく聞かれている時間帯
* 利用回数推移
* よく聞かれている曲