esa APIを利用してユーザー毎の投稿ランク、スターランクを作成し、情報共有を盛り上げる

esa APIを利用してユーザー毎の投稿ランク、スターランクを作成し、、情報共有を盛り上げたいと思います。

ランキングなど、ゲーミフィケーション的な仕組みで情報共有を盛り上げるテクニックについては、
情報共有に関する知見やお悩みを共有するイベントである[情報会議](http://johokaigi.org/)などでも度々話題になっていました。

よいのなら 作ってみよう ランキング - 575

## 前提
* esaのAPIの仕様は以下で確認すること
    * <i class="fa fa-external-link" style="font-size:1em;"></i> [esa API v1](https://docs.esa.io/posts/102)
* esaのAPI Clint Library(Ruby)
    * <i class="fa fa-external-link" style="font-size:1em;"></i> [esa - ruby](https://github.com/esaio/esa-ruby)
* 環境変数の利用
    * dotenv gemを利用
        * <i class="fa fa-external-link-square" style="font-size:1em;"></i> [dotenv gem で環境変数をスマートに管理](http://qiita.com/tbpgr/items/b7126c3d2d8f0329b11c)

## <i class="fa fa-code" style="font-size:1em;"></i> プログラム
### .env
```
ESA_API_TOKEN=your api token
TEAM=docs
```

運営チームを対象にして動作確認してみます。
自分のチームで試したい時はTEAMを`docs`から変更してください。

### esa-ranking.rb
```ruby
require 'dotenv'
require 'esa'
Dotenv.load

client = Esa::Client.new(access_token: ENV['ESA_API_TOKEN'], current_team: ENV['TEAM'])
page_unit = 100
post_count = client.posts(per_page: page_unit).body['total_count']
results = (1..((post_count / page_unit) + 1)).each_with_object([]) do |i, results|
  memo = client.posts(per_page: post_count, page: i).body["posts"].group_by{|e|e["created_by"]["screen_name"]}.each_with_object([]) do |e, memo|
    memo << { 
      name: e.first,
      number: e.last.count,
      star: e.last.reduce(0) { |a, e|a = a + e["stargazers_count"].to_i }
    }
  end
  results << memo
end

def output_ranking(results, key, label)
  puts
  puts label
  results.flatten
       .reduce(Hash.new(0)){ |a, e|a[e[:name]] += e[key];a }
       .sort { |(k1, v1), (k2, v2)| v2 <=> v1 }
       .chunk { |e| e.last }
       .each.with_index(1) { |e, i|
         names = e.last.map{ |e|e.first }.join(',')
         count = e.first
         puts "No.#{i} #{count} - #{names}"
       }
end

output_ranking(results, :number, "Posts count ranking")
output_ranking(results, :star, "Star count ranking")
```

## <i class="fa fa-play-circle" style="font-size:1em;"></i> 出力
### docs チームに対して実行
今回はesa docsチームを対象に実行してみました。

```
Posts count ranking
No.1 98 - fukayatsu
No.2 42 - taea
No.3 2 - esa_bot

Star count ranking
No.1 551 - fukayatsu
No.2 322 - taea
No.3 1 - esa_bot
```

## <i class="fa fa-users" style="font-size:1em;"></i> その他の出力例
どのチームも日報とかは書いてません。

### <i class="fa fa-user" style="font-size:1em;"></i> 某チームAに対して実行
利用期間約1年。

私以外の名前は適当に変えてあります。
ほとんど私とzangiefさんで書いてますがそもそも少人数のチームなので。
人が増えたのもごく最近で、元は3人のチームだったのでほとんどエントリが無いメンバーが多数になっている。

```
Posts count ranking
No.1 tbpgr - 274
No.2 zangief - 61
No.3 honda - 13
No.4 vega - 12
No.5 bison - 7
No.6 esa_bot - 4
No.7 dan - 1

Star count ranking
No.1 10 - zangief,tbpgr
No.2 5 - vega
No.3 3 - honda,bison
No.4 0 - esa_bot,dan
```

### <i class="fa fa-user" style="font-size:1em;"></i> 某チームBに対して実行
利用期間約半年。

私以外の名前は適当に変えてあります。
社長が私に次いで書いてるのがよい。
こちらも人数が少ないこともあってスターの文化は根付いてない。
また、人が増えたのはつい最近でも元々はPostsの上位4名のチームだった。

```
Posts count ranking
No.1 203 - tbpgr
No.2 70 - 社長
No.3 43 - グルメ
No.4 23 - 飛躍
No.5 19 - 新鋭A
No.6 17 - 昔
No.7 8 - メシア,リーダーシップ
No.8 4 - esa_bot
No.9 2 - 新鋭B
No.10 1 - 違いの分かる漢

Star count ranking
No.1 5 - 社長
No.2 4 - tbpgr
No.3 3 - グルメ
No.4 2 - リーダーシップ
No.5 1 - メシア,飛躍
No.6 0 - 新鋭A,esa_bot,違いの分かる漢,新鋭B,昔
```

### <i class="fa fa-user" style="font-size:1em;"></i> 個人利用のesaに対して実行
利用期間約1年。
業務外でも色々やってるのでその作業に必要なメモなど。

```
Posts count ranking
No.1 266 - tbpgr
No.2 4 - esa_bot

Star count ranking
No.1 1 - tbpgr
No.2 0 - esa_bot
```

### <i class="fa fa-user" style="font-size:1em;"></i> 出力例総括
私が一人でめっちゃ書いてる。
[情報会議](http://johokaigi.org/)などでも話題にでたのですが、情報共有は先導者＋フォロワーが
ガンガン書き込みむことで軌道にのせる、というのが王道みたいなので
一人で王道を突き進んでいるようです。

## <i class="fa fa-rocket" style="font-size:1em;"></i> メモ
この処理をベースに出力フォーマットを整えて月次ランキングを自動投稿とかいいですね。
または、リアルタイムで知りたければHubotやRuboty経由で上記の処理を呼び出せるようにするとか。

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [esa API v1](https://docs.esa.io/posts/102)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [esa - ruby](https://github.com/esaio/esa-ruby)