TensorFlow ProbabilityへJupyter Notebookをコミットする前に知ってたら楽だったこと

#1. はじめに
年末からColaboratoryで遊んでいたDirichlet Process Mixture Model関係の内容をJupyter NotebookにまとめてTensorFlow ProbabilityのexampleへPRしました。
[Fitting Dirichlet Process Mixture Model Using Preconditioned Stochastic Gradient Langevin Dynamics](https://github.com/tensorflow/probability/blob/master/tensorflow_probability/examples/jupyter_notebooks/Fitting_DPMM_Using_pSGLD.ipynb)
マージされるまでいくつかハマった点があったので、問題、解決策と反省点を共有しようと思います。

#2. PRがGoogle CLAに承認されない問題
##2.1. 原因
GitHubアカウントの主アドレスにGmailのエイリアス(hoge.hoge+**fuga**@gmail.com)を使っていることが原因でした。

前提として、TensorFlow ProbabilityへのPRはGoogle CLAへの登録が必要です。PR後、GitHubアカウントがGoogle CLAへ登録していない場合、下記のように登録を促されます。
<img width="792" alt="スクリーンショット 2019-04-14 0.55.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333592/1ac530de-a7b3-bad0-b0c7-b0b23d05503f.png">

今回はある理由から新設したGitHubアカウント（新アカウント）からPRしました。新設アカウントの主アドレスは以前から使用しているアカウント（旧アカウント）の主アドレス（hoge.hoge@gmail.com）のエイリアス（hoge.hoge+fuga@gmail.com）を設定していました。旧アカウントはGoogle CLAに登録済みでした。
![github説明2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333592/2ac80d97-2b6b-80a6-646d-29e6dc5a6c4e.png)

PR後、Google CLAへ新アカウントの主アドレスを登録しようとしたところ、CLAではGoogleアカウントでログインできるGmailアドレスでしか登録できない＝エイリアスを使った主アドレスにしたGitHubアカウントはGoogle CLAに登録できないことが分かりました。
下の画像はエイリアスでログインを試みた場合です。エイリアスではGoogleアカウントへログインできないため、そのままではCLAへ登録できませんでした。
<img width="628" alt="スクリーンショット 2019-04-09 1.19.08のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/333592/20cd4da3-ffb7-981d-bd3a-b7675cd9ba88.png">

##2.2. 解決策
###2.2.1. 主アドレスの変更
まず、PRしたGitHubの設定ページから主アドレスをエイリアスを使わないものに変更しました。しかし、PR後プッシュした全てのコミットのアドレスを過去に遡って書き換える必要が分かりました。
下の画像は主アドレスを変更した時のものです。これまでPushしたコミットのアドレスはエイリアスを使っているので、複数人がコミットしていると勘違いされています。
<img width="795" alt="スクリーンショット 2019-04-14 1.41.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333592/ac70e141-e883-66d7-d8ca-83adb2d26a1e.png">

###2.2.2. 過去コミットのアドレスの書き換え
まず、ローカルで過去のコミットに遡ってアドレスをエイリアスを使わないものに書き換えました。方法は[Stack overflowのこのページ](https://stackoverflow.com/questions/2919878/git-rewrite-previous-commit-usernames-and-emails)を参考にしました。
下記コマンドを実行すると、過去コミットのアドレスが遡って書き換えられます。

```
git config alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\`echo \$VAR\`\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \$@; }; f "
git change-commits GIT_AUTHOR_EMAIL "hoge.hoge+fuga@gmail.com" "fuga.fuga@gmail.com"
```

リモートのコミットも書き換えるため、最後はアドレスを変更したコミットをforce pushしました。
正直この方法が最善だったかは分からないですが、なんとかGoogle CLAが認証してくれました。
<img width="790" alt="スクリーンショット 2019-04-14 2.22.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333592/1733cc00-6ded-6163-5e9a-2aa15c01b17e.png">

##2.3. 反省
OSSへコミットする可能性のあるGitHubアカウントではGmailのエイリアスを使うのは辞めた方が良さそうです。
今回のPRはコミットするのが私だけ、且つこのPRより後のコミットを書き換えるだけだったので最後はforce pushで逃げ切りましたが、他のケースでは今回のような手段は取れない場合が多いことを念頭に置いておきたいものです。

#3. GitHub上でJupyter NotebookのTEXが崩れる問題
プッシュした後にGitHub上で確認すると下のように表示崩れているTEXがありました。Colaboratoryで編集している時は何度もチェックしたのに、何故だ・・・。
<img width="834" alt="スクリーンショット 2019-04-14 2.57.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333592/3ddfa8ba-560d-bd2d-2a5f-6174a4505408.png">

##3.1. 原因
Colaboratoryでは動くTEXのマクロがGitHubのJupyter Notebookでは動かないことが原因でした。
GitHubのJupyter Notebookで動かなかったTEXは以下の通りです。

```
\DeclareMathOperator*{\argmax}{arg\,max} %argmax 
\argmax_{z_i}
```
\DeclareMathOperatorというマクロでargmaxの下付き文字を表現しようとしているのですが、GitHub上では正しく表示されませんでした。
上記のTEXをColaboratoryで表示させた結果が以下です。
<img width="1027" alt="スクリーンショット 2019-04-14 3.12.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333592/4f01e4e2-d54e-7fdb-57a1-820d6f6279ef.png">
ちゃんと表示されていることが分かります。

##3.2. 解決策
今回はGitHub上で動作しないマクロの使用をやめ、同じように下付き文字を表せる\undersetを使うことで上記の問題を回避しました。\undersetを使ったTEXは以下の通りです。

```
\underset{z_i}{\arg\max}
```
実際にColaboratoryとGitHub上でマクロを使った場合と使わない場合でどのように表示されるか比較しました。
まずはColaboratoryです。
<img width="1231" alt="スクリーンショット 2019-04-14 2.54.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333592/8a738a66-3fd0-9737-727f-2ef19330912b.png">
上が\DeclareMathOperatorマクロを使った場合、下が\undersetを使った場合です。どちらも正しく表示できています。
次にGitHub上で同じTEXを表示させた場合です。
<img width="1003" alt="スクリーンショット 2019-04-14 2.54.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333592/0c50b0d9-8f07-168c-9f48-4d00c35d0647.png">
マクロを使ったTEXは崩れていますが、\undersetを使った方がGitHub上でもちゃんと表示できています。

## 3.3. 反省
ColaboratoryとGitHubではサポートしているTEXの機能に違いがあることを認識し、Colaboratoryで編集した結果をgist等に一回保存して表示のチェックを行えば良かったなと思っています。

# 4. まとめ
自分がTensorFlow ProbabilityにJupyter NotebookをPRした際にハマった点、その解決策と反省を書きました。
OSSへコミットするGitHubのアカウントはエイリアスを使ったアドレスは使わない、Colaboratoryの表示とGitHubのJupyter notebookのtex表示は一緒じゃないことを意識して、PRする前に一回gistとかでチェックした方が良さそうです。