Ruby | Gviz の力をかり、 CodeIQ で私が出題した問題を出題順に並べ、挑戦者の多い問題を強調表示してみる

# Ruby | Gviz の力をかり、 CodeIQ で私が出題した問題を出題順に並べ、挑戦者の多い問題を強調表示してみる

## 概要
Gviz の力をかり、 CodeIQ で私が出題した問題を出題順に並べ、挑戦者の多い問題を強調表示してみます。

## CodeIQの出題について
CodeIQでエンジニア向けの問題を出題しています。
下記の3アカウントがあります。

https://codeiq.jp/ace/tbpgr/
https://codeiq.jp/ace/tbpgr_badge/
https://codeiq.jp/ace/tbpgr_colosseum_manager/

2013年12月から出題開始。毎月3問前後の出題をしてきて、
出題件数も多くなってきたので、Gvizの力で過去の問題群を並べ、
人気だった問題を確認してみたいと思います。

## 元データ（LTSV）

出題情報はLTSVファイルにまとめました。

~~~
no:969  title:第5回 デスマコロシアム  start_at:2014/07/22 challengers:98
no:943  title:技術者の会話  start_at:2014/07/16 challengers:69
no:972  title:Gitに入門しよう！  start_at:2014/07/03 challengers:155
no:971  title:Gitで歴史を捏造する？！ start_at:2014/07/07 challengers:62
no:942  title:ポモドーロテクニック  start_at:2014/06/16 challengers:83
no:915  title:第4回 デスマコロシアム  start_at:2014/06/09 challengers:79
no:884  title:Ruby警官から警告を受けろ問題  level1  start_at:2014/05/19 challengers:19
no:883  title:Ruby警官から警告を受けろ問題  level2  start_at:2014/05/19 challengers:14
no:872  title:第3回 デスマコロシアム  start_at:2014/05/12 challengers:104
no:835  title:第2回 デスマコロシアム  start_at:2014/04/14 challengers:92
no:826  title:他人のサイトにモンキーパッチ  start_at:2014/04/07 challengers:25
no:827  title:マインドマップ使ってますか？  start_at:2014/04/07 challengers:25
no:791  title:第1回 デスマコロシアム  start_at:2014/03/18 challengers:141
no:790  title:ChefでLL言語一括Hello  start_at:2014/03/14 challengers:12
no:774  title:Hello Vagrant!  start_at:2014/03/14 challengers:18
no:768  title:2文字10秒で解くJava風Ruby  start_at:2014/02/27 challengers:48
no:746  title:EmmetでHTML高速記述  Lv1 start_at:2014/02/17 challengers:100
no:725  title:EmmetでHTML高速記述  Lv2 start_at:2014/02/17 challengers:74
no:710  title:CoffeeScript入門  start_at:2014/01/29 challengers:26
no:698  title:メタな世界：宣言的な機能追加（基礎）  start_at:2014/01/28 challengers:46
no:697  title:メタな世界：宣言的な機能追加（応用）  start_at:2014/01/28 challengers:17
no:653  title:年賀状プログラム  start_at:2013/12/23 challengers:13
no:625  title:コピペシステム社の粗悪システムを改修  start_at:2013/12/12 challengers:16
~~~

LTSV形式をご存じない方は下記をどうぞ。
[LTSV公式サイト](http://ltsv.org/)
[LTSV FAQ - LTSV って何? どういうところが良いの?](http://d.hatena.ne.jp/naoya/20130209/1360381374)
[【今北産業】3分で分かるLTSV業界のまとめ【LTSV】](http://d.hatena.ne.jp/naoya/20130207/1360240992)
[アクセスログ解析が楽になる日本産テキストフォーマットLTSVを知っていますか？ #ltsv](https://codeiq.jp/magazine/2014/08/12686/)

ちなみに現在進行形で LTSV の問題を出題中です。（2014/09/01 締め切り）
https://codeiq.jp/ace/tbpgr_badge/q1024
https://codeiq.jp/ace/tbpgr_badge/q1025

## コード

~~~ruby
require "gviz"
require "colorable"

ltsv_src = File.open('./problems.ltsv', 'r:utf-8') { |f|f.read }
ltsv = ltsv_src.split("\n").map { |line|Hash[line.split("\t").map{ |column| column.split(":", 2)}] }
color = Colorable::Color.new(:black)

def color_index(challengers)
  color_index = challengers.to_i/10
  color_index = 11 if color_index > 11
  color_index
end

Graph do
  global layout: :sfdp, label:"CodeIQ @tbpgr 出題問題", fontsize:60, size:15, overlap:false, fontname:'MS GOTHIC'
  nodes shape: :ellipse, fontname:'MS GOTHIC', fontsize:10, style: :filled, colorscheme: :paired12
  ltsv.sort_by { |e|e['no'] }.reverse.each_cons(2) do |p1, p2|
    route p1['no'].to_sym => p2['no']
    magnification1 = p1['challengers'].to_i/2
    magnification2 = p2['challengers'].to_i/2
    node p1['no'].to_sym, { label: "#{p1['title']}(#{p1['challengers']})",
        fontsize: 20*magnification1,
        width: 2*magnification1,
        height: 2*magnification1,
        fillcolor: color_index(p1['challengers'])
    }
    node p2['no'].to_sym, { label: "#{p2['title']}(#{p2['challengers']})",
        fontsize: 20*magnification2,
        width: 2*magnification2,
        height: 2*magnification2,
        fillcolor: color_index(p2['challengers'])
    }
  end
  save :"codeiq_problem", :png
end
~~~

## 出力

![codeiq_problem.png](https://qiita-image-store.s3.amazonaws.com/0/43480/7d2c59ac-b18d-8194-1acd-7665747226a2.png)

## おまけ
※挑戦者の少ない順に並べてみました)

![codeiq_problems_sort_challengers.png](https://qiita-image-store.s3.amazonaws.com/0/43480/05a6fea9-5a0b-f6fa-0b78-166e237de3ae.png)