GitHub 芝生入門/芝生応用

GitHub の芝生(Contribution Graph)に関する資料が意外と見当たらなかったので、自身の勉強も兼ねてまとめてみることにしました。

# 対象読者
- 「芝生」「草を生やす」の意味がわからない方（「入門」あたりを読んでください）
  - 「リポジトリ」「ブランチ」など基本は知っていると仮定します（解説しません）
- 芝生に関する小ネタを読みたい方（知っているところは読み飛ばしてください）

# 芝生入門

## 芝生とは？草を生やすとは？
まず、GitHub には Contributions という「過去一年間でこれだけ活動したよ」を可視化する機能があります。
 
![contributions_graph](https://help.github.com/assets/images/help/profile/contributions_graph.png)  
出典: [Viewing contributions on your profile - User Documentation](https://help.github.com/articles/viewing-contributions-on-your-profile/)

ここは毎日熱心に活動しているとキレイな緑色が並びます。その見た目が芝生みたいにカラフルだからか、日本では **芝生** と呼びます（正確な起源や由来はわかりません）。

この芝生に緑色を増やすには、Contribution（GitHub上での活動のうち芝生に反映される活動）を行う必要があります。この行為を **草を生やす** といいます。

## 草を生やすにはどうしたらいい？
では、GitHub 上で何をすれば草が生えるのでしょうか。詳細は GitHub のヘルプ [Viewing contributions on your profile - User Documentation](https://help.github.com/articles/viewing-contributions-on-your-profile/) に書いてありますが、ざっくり言うと、

- master ブランチあるいは gh-pages ブランチへのコミット
- Issue や Pull Request の新規

です。

## XX contributions in private repositories. って何？
芝生の緑色マスをクリックすると「その日はこんなリポジトリにn回コミットしたよ」的な情報が表示されますが、たまに「2 contributions in private repositories.」みたいな情報が表示されることがあります。

これは「詳細は伏せるけどプライベートリポジトリで2回ほど草生やしたよ」という意味です。プライベートなので詳細は何も公開したくない、でも芝生には反映したいという心理を汲み取ってくれる機能です。

この機能は、デフォルトでは無効になっています（つまり芝生にすら反映されません）。有効にするには設定が必要です。これもヘルプ [Publicizing or hiding your private contributions on your profile - User Documentation](https://help.github.com/articles/publicizing-or-hiding-your-private-contributions-on-your-profile/) に書いてありますが、簡単に書いておくと、

- 右上のアバターアイコン部分 → Settings → Contributions

の Include private contributions on my profile にチェックを入れることで有効になります。

# 芝生応用
入門はこのくらいにして、ここからは芝生に関するネタを雑多に取り上げます。

## 芝生が禿げる時
リポジトリを削除すると、そこに紐付いていた Contribution もなくなります。つまり **芝生が禿げます**。

（詳細は後述しますが）芝生アートを消したい場合は、このテクニックを使います。芝生アート用のリポジトリを作って、散々楽しんだらリポジトリ毎消してやることで元通りです。

## 黄色い芝生
芝生が黄色になる時があります。ハロウィンです。詳しくは Twitter で当時の状況を見てみてください。

- [github halloween lang:ja - Twitter検索](https://twitter.com/search?f=tweets&q=github%20halloween%20lang%3Aja&src=typd)

黄色だと草とは呼べませんね。何と呼びましょうか。落ち葉？

## 芝生アート
Ascii Art や Emoji Art があるように、芝生で絵を描く遊びもあったりします。正式な用語は知らない（たぶん無い）のですが、便宜上 **芝生アート** と書くことにします。

芝生アートを描くツールはいくつか存在します。

- [gelstudios/gitfiti: abusing github commit history for the lulz](https://github.com/gelstudios/gitfiti)
- [taichi/gontributions: GitHub Contribution Graph Hack](https://github.com/taichi/gontributions)
- [jbranchaud/commitart: Modifying the commit history of git repositories in order to write messages in GitHub's contribution graph.](https://github.com/jbranchaud/commitart)
- [ben174/git-draw: Allows you to draw in your github heatmap](https://github.com/ben174/git-draw)
  - 芝生に直接草を描いて、最後に Render ボタンを押すとその絵を反映するコマンドがエクスポートされるという Chrome 拡張

どうやって実現しているかですが、最後の git-draw を見た感じだと、過去の日付でコミットするみたいです。でも草の濃さはどうやって調整するんでしょう？……コードリーディングの題材としても面白いかもしれませんね。

ちなみに、GitHub への反映は即時ではないようです（？）。 gitfiti の README を引用すると、

> Wait... Seriously, you'll probably need to wait a day or two for the gitfiti to show in your commit graph.

とあります。

## 草を絶やさない方法
ズラリと草を敷き詰めた芝生に憧れるものですが、忙しかったりすると簡単に空いちゃいます。白マスがスカスカ表示されてると格好悪いです。

草を絶やさない方法は色々あると思いますが、たとえばこんな方法があります。

- [funnythingz/funnypush: to push every day to GitHub.](https://github.com/funnythingz/funnypush)

1回だけ Commit と Push を行うスクリプトを作っておいて、それをジョブスケジューラ(cronとか)で毎日流すようにする、というアイデアのようです。

## 芝生を画像化したい
PNG 画像で出力してくれるサービスがあります。

- [Grass-Graph / Imaging your GitHub Contributions Graph](https://grass-graph.moshimo.works/)

ちなみに [解説記事](http://blog.a-know.me/entry/2016/01/09/222210) と [ソース(GitHub)](https://github.com/a-know/grass-graph) もあります。

芝生が SVG で取得できることが肝のようです。その気になれば色々応用できそうですね。

## GitHub ガチ勢はどんな芝生を持っているのか
調べてみたら普通に見つかりました。

- [Most active GitHub users (by contributions). http://twitter.com/paulmillr](https://gist.github.com/paulmillr/2657075/)

Follower 636 人以上のユーザー限定（芝生で遊んでる勢がヒットしないよう弾いてる？）で Contributions 上位 256 位を算出した記事です。

1位は **11088 Contributions**。単純計算で **1日30Contributions** の年中無休です。（芝生遊び等でズルしてないのだとして）どんな生活をしたらそうなるんでしょうか。想像もつきません。

## そもそも芝生で遊ぶのって OK なん？
私も早速芝生で遊んでみようと思ったのですが、そもそも GitHub が許してくれているのかが不明です。改めて [Terms of Service](https://help.github.com/articles/github-terms-of-service/) に目を通してみました。

芝生遊びを直接的に禁じる文言は無さそうですが、間接的には [3. Conduct Restrictions](https://help.github.com/articles/github-terms-of-service/#3-conduct-restrictions) の

> use our servers for any form of excessive automated bulk activity (for example, spamming), or relay any other form of unsolicited advertising or solicitation through our servers, such as get-rich-quick schemes;

このあたりでしょうか。たとえば「Contributions の値をカンストさせたいので Commit と Push を行う処理を無限ループで回して放置しとく」「何ならマルチスレッドやら複数起動やらでブーストさせる」行為は該当しそうですね。

また [G. API Terms](https://help.github.com/articles/github-terms-of-service/#g-api-terms) にて API の Abuse と Overuse も禁止しているので、API を使いまくって芝生をいじるのもダメでしょう。

ちなみに芝生アートについては、（上述したものは）Push は一回だけで済むため問題は無いと思います。

# おわりに
芝生ネタを取り上げてみました。色々遊んでみたくなりますね。