Google Earth EngineのPython APIをローカルのWindows OSマシンで使う

Google Earth Engine（GEE）は元々Cord EditerでJavaScriptを使ったコーディングをしていたが、いろいろな点でPython APIに乗り換えたほうがメリットが多いらしく、一からdockerやらVMやらをお勉強したのでそのまとめ。基本的にWindows10を想定。

#ググればパッと使える、わけでもなかった件
GEEのホームページ：https://developers.google.com/earth-engine/python_install
↑Windowsでの設定は少し(個人的にはかなり)注意を要するため今回はそこを重点的に。

#Hyper-Vの有無によって2通りの方法がある
Hyper-Vは、Windows環境で仮想マシンを使うための環境。自分の場合、使っている端末の一つがWindows10 Professionalでもう一つがWindows10 homeだった。前者はHyper-Vが入っているが、後者は入っていない。1万数千円の投資でhomeからバージョンアップすることができるらしいが、お財布のひもが固い場合でも今回は何とかなった。

#Hyper-Vが入っている場合（Docker for Windowsを利用）
Hyper-Vが入っていてかつDocker for Windowsが対応していることが条件。少し古いOSだとDocker for Windowsの対象外かもしれない。

###Hyper-Vの有効化
ホームのスタートボタンで右クリック、「プログラムと機能」を選択。「Windowsの機能の有効化または無効化」を選択し、中にあるリストの中からHyper-Vを探してチェックを入れる。Hyper-Vが入っていなければおそらく非対応。

###仮想化の有効化
タスクマネージャを開いて、「パフォーマンス」タブを選択。右下で「仮想化：　有効」となっていれば問題なし。自分の場合、無効になっていたため、BIOS設定画面から有効化する必要があった。これを開く方法はコンピュータのメーカー等により異なりググる必要がある。自分の場合、一度コンピュータを再起動して某Functionキーを根気強く数回押していればログイン画面が出る前にそれらしき画面に行き着いた（個人談：2，3回だけ押していれば行けるかなーと思っていたので、毎回ログイン画面が先に出てきて「なんでかなー」と考え続けて無駄な時間を過ごした）。

###Docker for Windowsのインストール
[ここ](https://docs.docker.com/docker-for-windows/install/)からインストール。特に何も気にする点はないはず。
次回からはマシン起動時に自動的にDockerも開き、コマンドプロンプトでdocker操作ができるようになる。

###Cドライブ共有設定
画面右下のボリュームやネットワークのインジケーターがあるところから鯨マークのアイコンを右クリック、「Settings...」を開く。「Shared Drives」で「C」にチェックを入れる。これをしないと、dockerを走らせたときにエラーが返ってくる。

###コマンドプロンプトでの操作
まず、docker runに使う変数定義と作業用ディレクトリの作成。

```bat:
set "GCP_PROJECT_ID=test-run-gee"
set "CONTAINER_IMAGE_NAME=gcr.io/earthengine-project/datalab-ee:latest" 
set "HOME=%HOMEDRIVE%%HOMEPATH%"
set "WORKSPACE=%HOME%\workspace\datalab-ee"
mkdir "%WORKSPACE%"
cd %WORKSPACE%
```

setで変数定義。HOMEDRIVEとHOMEPATHは元々定義されている環境変数。Google Cloud Platformで用いるプロジェクトIDを指定するGCP_PROJECT_IDの中身は適当でよい。cdまででhomeに作成したworkspace\datalab-eeディレクトリに移動。ちなみにpowershellを使いたい場合は$(変数)の形にする。
次に、コンテナを作成して先にCONTAINER_IMAGE_NAMEで指定したimageを外部から読み込み、実行する。

```bat:
docker run -it -d -p "127.0.0.1:8081:8080" -e "PROJECT_ID=%GCP_PROJECT_ID%　-v "%WORKSPACE%:/content" %CONTAINER_IMAGE_NAME%
```
-eはプロジェクトIDをコンテナ内での環境変数に用いるためのオプション。このIDはgoogle.datalab.Context.default()に格納される。-dはバックグラウンドで回すためのフラグで、同じコマンドプロンプトで別の作業ができるようになるため普通こちらを付けたほうがベター。-pはローカルホスト（使っているマシン）のポートとコンテナ内でのポートを受け渡すオプション。これによって、ブラウザで[http://localhost:8081/](http://localhost:8081/)にアクセスして、コンテナ内のGoogle Cloud Datalabのページを見ることができる。このブラウザ内でJupyter Notebookを使ってpythonコーディングが可能となる。

#Hyper-Vが入っていない場合（Docker Toolboxを利用）

Docker ToolboxはDocker for Windows (Mac)が登場する前のもので、Oracleの仮想マシンの上にコンテナを載せて動作する。

###Docker Toolboxのインストール
[ここ](https://www.docker.com/products/docker-toolbox)からインストール。設定では一応[osuo様の投稿](http://qiita.com/osuo/items/99a2b7413ce75f8217be)を参考に、途中空白部分にチェックを入れる。

###Docker Quickstart Terminalを開く
初回時のみ数回承認のクリックが必要。クジラが現れるまで待つ。ターミナルはLinuxベースなのでコマンドもそちらに合わせる。

###コマンドプロンプトでの操作
まず、docker runに使う変数定義と作業用ディレクトリの作成。

```bash:
export GCP_PROJECT_ID=test-run-gee
export CONTAINER_IMAGE_NAME=gcr.io/earthengine-project/datalab-ee:latest
export WORKSPACE=${HOME}/workspace/datalab-ee
mkdir -p $WORKSPACE
cd $WORKSPACE
```
exportで変数定義。HOMEは元々定義されている環境変数。前の例ではユーザディレクトリがHOMEになっていたが、何も意識せずやるとこの場合はその下のデスクトップがHOMEになるみたい。Google Cloud Platformで用いるプロジェクトIDを指定するGCP_PROJECT_IDの中身は適当でよい。cdまででhomeに作成したworkspace\datalab-eeディレクトリに移動。
次に、コンテナを作成して先にCONTAINER_IMAGE_NAMEで指定したimageを外部から読み込み、実行する。

```bash:
docker run -it -d -p "8081:8080" -e "PROJECT_ID=$GCP_PROJECT_ID" -v "$WORKSPACE:/content" $CONTAINER_IMAGE_NAME
```
-eはプロジェクトIDをコンテナ内での環境変数に用いるためのオプション。このIDはgoogle.datalab.Context.default()に格納される。-dはバックグラウンドで回すためのフラグで、同じコマンドプロンプトで別の作業ができるようになるため普通こちらを付けたほうがベター。-pはローカルホスト（使っているマシン）のポートとコンテナ内でのポートを受け渡すオプション。注意すべきは、8081の手前に何もつけないこと。GEEホームページ通りに127.0.0.1（ローカル・ループバック・アドレス）をつけるとなぜかうまくいかない。Hyper-Vがある場合と違って、外部から持ってきた仮想マシンにコンテナを載せていることで、127.0.0.1の意味合いが異なっているらしい。

###ブラウザでコンテナにアクセス

ブラウザでは、http：//localhost:8081/を開いても接続が拒否される。コンテナの所在が自分の使っているマシンではなく、その上に載っかっている仮想マシンなので、こちらのIPアドレスを取得する必要がある。ターミナルで次のコマンドを入力。

```bash:
docker-machine ip
```
これによって得られるアドレスを使って、http：//（コンテナのIPアドレス）:8081/にアクセス。コンテナ内のGoogle Cloud Datalabのページを見ることができる。このブラウザ内でJupyter Notebookを使ってpythonコーディングが可能となる。

#コンテナを見たり閉じたり消したり
###コンテナを見る

```bash:
docker ps -a
```
特に、CONTAINER IDの確認で重宝。-aオプションはLinuxのls -aと同様に停止中のコンテナも表示する。

###コンテナを閉じる

```bash:
docker stop CONTAINER_ID
docker kill CONTAINER_ID
```
普通の終了か強制終了かの違い。

###コンテナを消す
```bash:
docker rm CONTAINER_ID
```
「docker ps -a」でコンテナの実行に失敗した残骸があるとまどろっこしいのでrmで痕跡を断つ。

#最後に
ひとまずこれらの方法でWindows OSでもGEE Python APIが使えるようになった。計算速度やダウンロード速度などのパフォーマンスについては今後使う中で分かってくるはず。

#追記：現状の問題点
Docker Toolboxのやり方のほうで、Datalabへのサインインができない
（アカウントの選択→SDKアクセスの許可→ERR_CONNECTION_REFUSED）。
アドレスにoauthcallbackと書かれているのでOAuth認証が関わっていそう。
そもそもプロジェクトIDを先にGoogle Cloud Platformのコンソール上で生成するのが自然な気がする。
しかも先ほど適当に生成したプロジェクトIDがCloud Platformのコンソール上には反映されていないっぽい（Hyper-V有の場合でも）。
どこから勉強をしていけばよいのか。