fairseqにプルリクを送るまで

# 背景
1. fairseq[^1]を使っていたらバグを見つけた
1. なんとか原因を突き止めて修正できた
2. プルリク送りたい

#### Contributing guideline
ここに大体書いてありますので、公式の情報を見たい方はこちらからどうぞ。
https://github.com/pytorch/fairseq/blob/master/CONTRIBUTING.md

# 流れ
1. [Facebook OSS の CLA](https://code.facebook.com/cla) に登録
2. [issue を作成](https://github.com/pytorch/fairseq/issues/new/choose)
2. [fairseq](https://github.com/pytorch/fairseq) を fork
3. fork したリポジトリをクローンし、ブランチを作成
4. コードを修正
5. コミット＆プッシュ
6. githubからプルリクエストを作成

# 詳細
## 1. Facebook OSS の CLA に登録
Facebookのオープンソースコミュニティのコントリビューターライセンス契約。
まずはこれに登録する。
プルリク送ったあとでも問題ないらしい。

リンク： https://code.facebook.com/cla

## 2. issue を作成
直接プルリクを作成しようとするとこんな感じの[デフォルトメッセージ](https://github.com/pytorch/fairseq/blob/73bacfb22dc4efc33219c590142ead36c23c338d/.github/PULL_REQUEST_TEMPLATE.md)が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9814/4426d760-e040-b50e-de1b-82002692d13b.png)

issue で議論しておいたほうがいいことが書いてあるので、issue を立てる。

issue は[ここ](https://github.com/pytorch/fairseq/issues)から立てられる。
![スクリーンショット 2020-07-19 10.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9814/c57ba0d6-0df0-7b4a-6db5-aeefbf303cf8.png)

New issue をクリックすると、次の4つから選べるので、 Bug Report の Get started をクリック。

* 🐛 Bug Report
    * Submit a bug report to help us improve
* 📚 Documentation/Typos
    * Report an issue related to documentation or a typo
* 🚀 Feature Request
    * Submit a proposal/request for a new feature
* ❓ Questions/Help
    * If you have questions, please first search existing issues and docs

Bug Report の場合、次の項目がデフォルトで作成されるので、埋めていく。

- Bug
- To Reproduce
    - Code sample
- Expected behavior
- Environment
- Additional context

それぞれ、下記のように書いた。

Bug: バグの内容を簡潔に2文程度で
To Reproduce: 実行した内容とコマンド
Expected behavior: 期待した挙動と実際の挙動を、実際の出力を添えつつどこが問題か分かるように
Environment: 必要そうな環境だけ
Additional context: 今回はPRを自分で作成する前提だったので、後でRPを送るよと


## 3. fairseq を fork
![スクリーンショット 2020-07-17 9.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9814/adc035c3-b7b7-7847-1fea-c60e6425287d.png)
ここをクリック。
そうするとリポジトリが自分のアカウントにコピーされて、 
`https://github.com/<user name>/fairseq`
ができる。

リンク: https://github.com/pytorch/fairseq

## 4. fork したリポジトリをクローンし、ブランチを作成
1. `git clone https://github.com/<user name>/fairseq`
2. `git branch issue`
3. `git checkout issue`

ブランチは作成してもしなくても大丈夫かもしれないが[^3]、ガイドラインには書いてあるのでやっておく。
ブランチ名は何でもいいと思う。

## 5. コードを修正
バグ部分を修正。
今回は量の少ない修正だったこともあり、コーディング規約などはきちんと調べずに書いた。
スタイルは既存のコードを参考にしつつ。
問題があればレビュー時に修正してもらえるだろうという目算。

## 6. コミット&プッシュ
コードをgitでコミットしてプッシュ。
コミットメッセージは、PR作成時にデフォルトのタイトルと本文になるっぽいので、ここで修正内容がちゃんと分かるように書いておくと良いかもしれない。

## 7. githubからプルリクエストを作成
[ここ](https://github.com/pytorch/fairseq/pulls)から。
![スクリーンショット 2020-07-19 10.59.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9814/e4ee7013-e7ed-2a30-bff6-43ff8b28c6ab.png)
New pull request をクリックすると、変更がプッシュされている場合は、Create pull request をクリックできるようになるので、master に送りつける。

デフォルトのプルリクのメッセージが表示されるので、編集していく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9814/4426d760-e040-b50e-de1b-82002692d13b.png)

Before submitting の欄は、今回はissueは立てたけどまだ議論されていないので、2番目の `Did you read the contributor guideline?` にだけチェックを付けておいた。

What does this PR do? の欄で、`(issue)`となっている箇所を事前に立てた issue の番号に変えると、自動的に関連付けられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9814/ad5a0aa1-902a-54b1-a656-c7674e79f491.png)
こんな感じで、issueの方に勝手にプルリクのリンクが付く。
github便利。

プルリクを送信すると、自動的にテストが行われる。
今回はテストが一部通らなかったが、そもそも master がテストに通っていないので、仕方ない。（commitをさかのぼってみてみたら、CIの種類を追加した当時から一度も通ってないっぽい。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9814/8a3ac1b1-e322-4c1d-4e74-b6c33c1d17f1.png)

--- 
以上。

何かあれば通知が来るようになっているので、座して待つのみ。

---
追記：4日後に無事にマージされた :tada:

[^1]: Python で書かれた Facebook AI が開発した Sequence-to-Sequence ツールキット。機械翻訳のような系列変換のニューラルモデルの実装が多数含まれている。

[^3]: 他の人のPRを見たらブランチを作成していない人も見受けられた。