GitHubリポジトリのスター数を見える化してみました。

この記事は[Goodpatch Advent Calendar](http://qiita.com/advent-calendar/2016/goodpatch)24日目の記事です。
今日はクリスマスイブですね:relaxed:　今年もあっという間すぎる...。

<img width="318" alt="スクリーンショット 2016-12-23 12.47.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/57442/05a6f1ac-9a62-ba84-a186-bcc78207bc5f.png">

## はじめに

[Goodpatch](http://goodpatch.com/jp)でフロントエンドエンジニアをしている @cawpea です。今年の9月に入社したばかりの新米です。
今月に入って急遽案件で[D3.js](https://d3js.org/)（データビジュアライゼーションのためのJavaScriptライブラリ）を使う事になり、巷の書籍やネットの記事で猛烈にインプットしております。D3.jsは巨大なライブラリなのですが、今年になってメジャーバージョンのアップデート（ver3→4）が行われており、書籍のコードがそのまま使えないのが最初苦労しました...。

今回はD3.jsの勉強がてら、GitHubリポジトリのスター数を可視化するサイトを作ってみたので、そのサイトを作るにあたって工夫した点や得られた知見を共有したいと思います。

[GitHub TopStars](http://github-topstars.hellopeople.jp/)
![GitHub_TopStars.png](https://qiita-image-store.s3.amazonaws.com/0/57442/a2366845-ef58-ffff-6369-62fa56fc2623.png)

## GitHubのスター数を可視化する試み

GitHubでは自分が好きなOSSや応援したいライブラリなどに対してスターをつける事ができます。Facebookでいう「いいね！」のようなものでしょうか。
必ずしもスター数が多い＝有用な技術、という事にはならないかもしれませんが、技術選定時などの１つの指標になると思います。
実はスター数が多いリポジトリを検索する事自体は[公式のGitHub上で行う事ができます。](https://github.com/search?utf8=%E2%9C%93&q=stars%3A%3E1&type=Repositories&ref=searchresults)
例えば、2016/12/23時点のスター数が多いリポジトリTOP10は以下になります。

|Ranking| Repository       |       Star |
|:--:|:-----------------|------------------:|
|1   | FreeCodeCamp/FreeCodeCamp             |211,197 |
|2   | twbs/bootstrap             |104,887 |
|3   | vhf/free-programming-books             |72,279  |
|4   | d3/d3             |58,218  |
|5   | facebook/react             |56,284  |
|6   | angular/angular.js             |53,971  |
|7   | sindresorhus/awesome             |48,372   |
|8   | FortAwesome/Font-Awesome             |47,234 |
|9   | getify/You-Dont-Know-JS             |47,103 |
|10   | robbyrussell/oh-my-zsh             |46,825  |

１位の[FreeCodeCamp](https://github.com/FreeCodeCamp/FreeCodeCamp)は主にフロントエンド言語（HTML,CSS,JavaScript..etc）を学習できるサイトらしいです。

[GitHub API](https://developer.github.com/v3/search/)を使用すれば、上記のようなリポジトリ情報を取得する事ができます。パラメータを指定すればキーワード検索や言語の指定、ソートも可能です。
今回はGitHub APIを利用して、言語毎にスター数の多いリポジトリを可視化する事で**誰でも簡単に人気のあるリポジトリを把握できるようにしよう**といった試みです。

ちなみにGitHub APIを使ったサービスに以下のようなものがあります。

- [GitHub Ranking](https://github-ranking.com/)（自分のGitHubアカウントでランク付けしてくれる。データが最新じゃないので更新はされていないっぽい？）
- [GitHut](http://githut.info/)（アクティブな言語を可視化する試み）

## 技術構成

<img width="1082" alt="スクリーンショット 2016-12-23 14.23.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/57442/7b57c861-073d-ce21-3bb1-024674f0d3f3.png">

技術構成は至ってシンプルです。今回は個人的にWeb ServerとAPI Serverを分ける方が簡単だったので、このような構成になっていますが、特にAPIを独立させる意味もないので今後は統合するかもしれません。Webサーバーは普通のレンタルサーバーなので、HerokuかAWSに統合してもいいかなと思っていますが、その辺の知見が浅いのでもう少し調べてから移行したいなと思っています。

数値を可視化するためにD3.jsの[PackLayout](https://github.com/d3/d3-hierarchy/blob/master/README.md#pack)を使用しています。PackLayoutを使用すると、例えば以下のような円状のグラフを生成する事ができます。

[Circle Packing](http://bl.ocks.org/mbostock/ca5b03a33affa4160321)
<img width="400" alt="スクリーンショット 2016-12-23 14.42.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/57442/9ca43ab3-3f31-f88d-ba44-eb9016b3d50e.png">


D3.jsを使うと、[公式ギャラリー](https://github.com/d3/d3/wiki/Gallery)にあるようなデータ可視化の実装をサポートしてくれます。中には複雑な計算が必要なものもありますが、多くのレイアウトはD3.jsが元々用意している関数で簡単に実装する事ができます。
最初は難しそうなイメージがありましたが、jQueryを描き慣れていれば、かなり馴染みやすい感覚でJavaScriptを書く事ができます。

## デザイン

<img width="936" alt="スクリーンショット 2016-12-23 15.25.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/57442/4863c0d5-ef66-2343-7efb-9f048e732d00.png">

GitHubは主にエンジニアが利用するものなので、"エンジニアが大好きなダークカラー"をベースにしています。
※同僚の@kubosho_さんも[そう言っていました。](http://qiita.com/kubosho_/items/1b027444cc27b892319d)

サイトのコンテンツ自体は情報量も少なく、シンプルに閲覧できるものにしたかったので、基本的にファーストビューに収まるようなレイアウトにし、フォントはデジタル文字に近いような矩形、且つスター数を比較する際に桁数の位置が変わらないような等幅フォントを[Google Fonts](https://fonts.google.com/)から探して、最終的に[Share Tech](https://fonts.google.com/specimen/Share+Tech)にしました。

<img width="1056" alt="スクリーンショット 2016-12-23 15.36.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/57442/6f691e1d-f3fc-af02-2561-675697d183d9.png">

また、PackLayoutの各円形の表示はスター数によって色が変わるようにしてある（スター数が多い場合は青、少ない場合は白）のですが、こちらは[d3-interpolate](https://github.com/d3/d3-interpolate)を使って実現しています。

## むすび

D3.jsの勉強がてら作り始めたサイトがGithub APIやらレスポンシブ対応やら対応する事になり、D3.js自体の勉強からかけ離れていきましたが、１つの形になった事と周辺技術の知識を得られたのは良かったです。
書籍のコードを写経しているだけだと、どうしてもスムーズに実装出来てしまうので血肉化しにくいと思います。
また、今回GitHubのスター数を可視化した事で自分が知っているリポジトリもあれば、知らなかったリポジトリも多く見つける事ができたので、これを機に色々なリポジトリを漁ってみようと思いました。