TensorFlow2.0ドキュメントを翻訳してTF2.0Contributorになろう

# はじめに

Tensorflow2.0では誰しもがお世話になるであろうこの[公式Tutorial](https://www.tensorflow.org/tutorials)と[Guide](https://www.tensorflow.org/guide)、
実はこれらもOSSで作られたドキュメントで、
本家英語のGuideもそうですが、
たまに日本語の文章が出てくるものも**OSSで作られたGuide**だったりします。
みなさんも参加してみてはいかがでしょうか？

# 参加方法

## TFUGSlackに参加する

![logo_big.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/c271d05f-ae31-62e8-28ef-715b2bf8b597.png)


まず、[TFUGコミュニティ](https://tfug.jp/)に参加しましょう！！
基本的にそこで情報交換されるため、参加して色々と教えてもらいましょう。

## READMEとCONTRIBUTINGを読む

翻訳する前には[こちら](https://github.com/tensorflow/docs/tree/master/site/ja)の
README.mdとCONTRIBUTING.mdを必ず読むようにお願いします。

## 基本的なPullRequest手順

### DocsをForkする

![スクリーンショット 2019-12-14 15.16.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/c7977128-4462-5514-4536-f832409ada17.png)

TensorFlow/docsをForkして自分の配下のレポジトリにします。

### 翻訳されていない物を探す

TensorFlow/docsを`git clone`して、以下のコマンドを叩くと何が足りてないかわかります。

```sh:
diff ~/docs/site/en/guide ~/docs/site/ja/guide | grep en
```

```:結果
en/guide のみに存在: _graph_optimization.ipynb
en/guide のみに存在: _index.yaml
en/guide のみに存在: _toc.yaml
en/guide のみに存在: checkpoint.ipynb
en/guide のみに存在: create_op.md
en/guide のみに存在: data.ipynb
en/guide のみに存在: data_performance.ipynb
en/guide のみに存在: distributed_training.ipynb
ファイル en/guide/eager.ipynb と ja/guide/eager.ipynb は異なります
en/guide のみに存在: effective_tf2.md
en/guide のみに存在: estimator.ipynb
ファイル en/guide/function.ipynb と ja/guide/function.ipynb は異なります
en/guide のみに存在: gpu.ipynb
en/guide のみに存在: images
en/guide のみに存在: keras
en/guide のみに存在: migrate.ipynb
en/guide のみに存在: ragged_tensor.ipynb
en/guide のみに存在: saved_model.ipynb
en/guide のみに存在: tensor.md
en/guide のみに存在: upgrade.ipynb
en/guide のみに存在: variable.md
en/guide のみに存在: versions.md

```
それでいてかつ、PullRequestが出ていない物をみていきます。

![PullRequests](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/2c969d6e-0201-8d1b-cd09-5e15c0eef10f.png)

これで、まだ誰も翻訳していない物がわかるはずです。

### 手をつけることをSlackに報告しましょう

<img width="500" alt="Slack報告" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/e524be3b-b354-66f9-75b0-b1e84cff4def.png">

ここで、誰かやっているなら、声をあげてくれますし、ダブって同じところをやってた...みたいなことはないはずです。
(過去のSlackをみて、やっている人が発言しているのもみるのもいいですね。)

### ブランチを切る

まずはブランチを切りましょう。
Forkしたレポジトリのbranchをクリックします

![Branchボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/94a1ffa1-e408-9c8b-6ac7-ef5b4b571c1d.png)

これをクリックして、検索欄に新しく作成するブランチ名を書き込むと、ブランチ作成ボタンが出現します。

![createBranchボタン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/e9166732-a4cb-1051-4d4c-8bffde35448c.png)

命名規則的には、[Auther]\_[folder_name]\_[filename]と行った感じで書けば大丈夫です。
今回は[shamoji]が[ja_guide]の[ragged_tensor]っていう`.ipynb`ファイルを編集するのでこう書きます。

### Forkしたレポジトリで、jaフォルダに`.ipynb`データを写す

単純なことですがやりがちなのが、en/フォルダにあるデータを直で書き込んでしまうことです。
これだと差分が分かりにくくなるので、まず先にja/フォルダの同じ場所にコピーしましょう。

移動方法には二つ方法があって、
- enフォルダにある翻訳対象の`.ipynb`ファイルをダウンロードし、jaフォルダの同じ場所にアップロード&commitする
- ForkしたレポジトリをCloneしてcpしてCommitする(めんどい)
があります。後者は面倒なのでおすすめしません。

### 移動先のjaフォルダの`.ipynb`をColab上でみる

Commitが済みました段階で、`.ipynb`をColabで読んでみます。
GoogleColabratoryは差分もよくみれるので、翻訳では基本これを使って翻訳していきますし、レビューもします。

まず、[Colab](https://colab.research.google.com/notebooks/welcome.ipynb)を開きます。
そのあと、「ファイル」から、「ノートブックを開く」を選択しましょう。

![ノートブックを開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/095682f5-746c-ae3e-7563-e9ada140793b.png)

すると、直近でみてたNotebookたちの一覧が出てきます。ここで、右上のGitHubを選択します。

![GitHubボタンを選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/100cd0af-0bd5-ee45-a666-ba1d2d0f3042.png)

GitHubのURLの入力を求められるので、ForkしたレポジトリTopのURLを載せましょう。

![URLを選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/a776cf2b-162c-e5fd-fd82-57914d7c6588.png)

それで、先ほど作成したブランチを選択して、頑張って翻訳対象のファイルを探して見つけます。

![ブランチの選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/3693117d-c358-ee54-ea1d-c9cdfbb4958f.png)

クリックすることで、ページが開けて編集できる状態になりました。
これで、翻訳の準備は完了しました。

### 翻訳する

どんどん翻訳していきましょう。

![翻訳後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145843/76f4629d-ce89-8f80-65ab-d375c06f838d.png)

### PullRequestを出す

全て翻訳し終わったら、PullRequestを出してReviewをしてもらいましょう。
誰かが言ってましたが、**翻訳Reviewは再翻訳するのとほとんど同じくらい大変な作業なので、**
それを踏まえて、ちゃんとしっかりした物を作ってReviewをお願いしましょう。
 (自分もやらかしました、ごめんなさい)

実際にPullRequestを出してみましょう。
GitHubのWebUI上に、PullRequest出してみませんか？っていう黄色い物が出てきます。
それを押して、PullRequest発行画面に移ります。
(画像が出せなくて申し訳ない...)

tensorflow/docs master← [自分のID]/docs [自分の作ったブランチ]であることを確かめ、
タイトルには先人たちに習って、先頭に`JA: Add`をつけて、ファイルパス全てを書きます。
とりあえず検索用に`JA:`が付いていれば検索できるので、
それだけ忘れなければ分かるように書いていただければと思います。

### CLAサイン

PullRequestが出されると、GoogleからContributingに必要な法的サインを求めてきます。
内容は著作権に関すること、再配布、修正などに関すること、何かまずいことがあった時のこと(訴訟関連)
などなど、様々な法的なことに関しての承諾サインを求めてきます。
詳しくは本文をじっっくり読んでサインすることをおすすめします。
これにサインしないと基本的にContributeは認められないので、注意が必要です。(CIで自動で❌がつきます)

## ここまでがPullRequestまでの流れです。

あとはreviewを英語ベースでじっくりしてもらったあと、
LGTMが出ればマージ可能となりますので、マージしましょう。
(不用意にLGTMは打たないようにしましょう。
reviewer以外でもすぐにマージ可能になってしまいますので、気をつけてください）

## 翻訳する上での注意点

基本的に自由な翻訳活動ですが、結構翻訳にもルールが存在していて、結構罠にハマります。

### 翻訳せずにそのまま使う単語

[こちら](https://github.com/tensorflow/docs/tree/master/site/ja)を参考にしてもらえると、翻訳しないでそのままにすべき単語がいくつか載っています

### 校正ツール

TFUGではRedpenを使用して校正に取り組んでいます。
PullRequestではRedpenを使用して校正してから出しましょう。
[こちら](https://github.com/tfug/proofreading)にあります

### 項ごとにCommitを心がける
こうするとぱっと見でなにを訳したのかわかりやすいです。

### Colabで差分を見やすくしておく。

基本的にMarkDownでは`  `ダブルスペースが改行扱いになります。
Colab上で勝手に改行されるからとダラダラ長い文章を`\n`なしで投稿するとColab上、差分が見辛いです。
そこらへんもReviewerに配慮して翻訳してみましょう。

### 基本的に全てを翻訳すること。

意訳で書いて、ここも伝わるっしょ〜ってすっぽ抜かすと、reviewerはちゃんと指摘してきます。
本文に書いてあることは全て翻訳するのが原則です。

### なにここわからん。って思ったらreviewerに投げてみるのも手

結局100%完璧な翻訳を目指そうとすると時間だけが溶けていきますので、自分は(??)マークをつけて
Reviewerの方に相談しちゃいます。そうすると途中で心が折れるなんてことは無くなります。
雑な仕事は嫌われますが、パーフェクトまでも求められてはいません。
*Done is better than perfect*でいきましょう。

### 迷ったらとりあえずSlackに投げてみよう！

ここどうすればいいかわからない...といった時はSlackに聞いてみるのも手です。
様々に情報を持ってきてくれます。
ただし、その度に負担がかかっているというのは承知の上で聞きましょう。

# Contributorになるといい事

###俺、TF2.0Contributorなんだぜ！！

って言えます。(若林:「でもそれ翻訳なんですけどね」)
ただそれだけですけども、結構自慢できるんじゃないでしょうか。

## それ以外にいい事

基本的に翻訳した分野はめっちゃ詳しくなります。
翻訳は読むことよりもさらに深く読み込むことになりますので、
わからない分野ほどチャレンジして翻訳をしてみるということが大事だったりします。
それに、解釈がわからない部分をreviewerに教えてもらえるチャンスもあります。
そうすることで、理解が一層深まるため、おすすめです。

# おわりに

自分が翻訳すれば、TFワ"ガ"ラ"ン"となってる人も自分の力で解決できると思うと素敵じゃないですか？
自分は翻訳することで、レベルが上がるしContributorになれるのでハッピー！
Reviewerさんもそこまで労力かけずとも内容理解が深まる＋Contributeできるのでハッピー！
翻訳されたDocumentを読んでTF完全理解した人が増えてハッピー！
みんなTFを使い始めてGoogleもハッピー！といいこと尽くしでしょう。

ぜひ、翻訳やってみませんか？人手は足りない一方なので、何卒よろしくお願いします！
Enjoy翻訳Life！