PycharmでAWSのインタプリタを利用する

## やること
AWSのインスタンスのインタプリタを使って、ローカルのpycharmで開発！

## 背景
特定のモジュールをインストールするのが困難を極めるとき、既にインストールされているAWSのAMIやdockerコンテナなどを利用するのはとても楽です。
ただ僕はコーディングをpycharmなどのIDEでやりたいので、サーバーに入ってvimで開発するのは少し敷居が高い。。
pycharmで、サーバーへremoteでログインして、そのサーバーのインタプリタを使ってコーディングできる機能を発見したので試して、メモ書きをする。
※　professional版でしかできないので注意。

## 環境
- Mac Book Pro OSX El Capitan (ver10.11.3)
- Pycharm Professional
- AWSのEC2インスタンス

## 方法
### 1 pycharmのインタプリタ設定でAdd Remoteを押す。
Pycharm Preferences→ Project: hoge→ Project Interpreterをクリックすると、以下の画面が現れる。この右上の歯車をクリックすると、
![スクリーンショット 2017-05-04 16.22.06.png](https://qiita-image-store.s3.amazonaws.com/0/40159/ca0145f6-819c-e9ec-ab32-e51e121c35f6.png)
以下のウィンドウが出るので、「Add Remote」を押す。
<img width="127" alt="スクリーンショット 2017-05-04 16.37.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/40159/cb8e1587-f2f2-4949-786d-8378d034ad68.png">

### 2 SSH設定
Add Remoteを押すと、インタプリタのConfigureが現れるので、SSH Credentialsを押すと以下のような設定画面になる。
![スクリーンショット 2017-05-04 16.22.29.png](https://qiita-image-store.s3.amazonaws.com/0/40159/a8ac2d8f-eb0e-d36e-f2c5-2f146854dc82.png)

ここでそれぞれ、以下を指定。

- Host:54.xx.xx.xxなどのパブリックIPの指定
- port:ssh接続時のポート番号を指定
- user name:ec2-userなどのssh接続ユーザーの指定
- Auth type:password or pemの、接続方法の指定
- password:パスワードか、pemファイルの保存先を指定
- Python interpreter path:インタプリタのパスを指定。  
※　基本/usr/bin/pythoinで良いと思いますが、分からなければ「which python」で普段利用しているpythonのパスを調べてセット。

これでOK。
あとたまに、AMIによってはec2-userなどの一般ユーザーではなく、rootユーザーで作業用環境が構築されている場合があるため、このときはsshd_configと公開鍵をいじってあげる。

```
# sshd_configの修正
vi /etc/ssh/sshd_config
# PermitRootLogin forced-commands-onlyを以下に。
PermitRootLogin without-password

# 公開鍵のコピー
mv /root/.ssh/authorized_keys /root/.ssh/authorized_keys_bak
cp -f /home/ec2-user/.ssh/authorized_keys /root/.ssh/authorized_keys
service sshd reload
```

ここまで書いたが、この機能、結構めんどくさいことに気づいた。。
まず、ローカルのパスがリモート側に存在しないと実行できない。
おそらくこの機能は、ローカルで書いたものをリモートにそっくりそのまま上げて利用するのが正しい？
続いて、何故かインポートできないモジュールが存在する。
caffeを使っているのだけど、import caffeでそんなのないって言われる。
anaconda配下にpycaffeがないので、anaconda配下に移してあげないといけないかも。

んーー、　importエラーが出ないローカルIDEでソースを作って、それを上げるのには使える？？かな。。
デバッグできないのがかなり悲しいけども。。。
上の問題は、余力があれば調査してみます。

## 追記
ローカルとリモートのパスの対応付けと、オートアップロード機能に気付いたので追記。

### ローカルとリモートの対応付けの方法
1 上のタブの”RUN"から"Edit Configration.."をクリックする。
2 Path Mappingの右側をクリックする。
3 localパスとRemote pathをセットする。
以上。

### オートアップロードの方法
対応付けしても、作業はあくまでローカルなので、AWSに一々ローカルで変更したソースを上げないとダメ。
これを、ローカルのpycharmで修正したソースを、自動でAWSに上げる方法。
1 Preferences->Deploymentで、＋ボタンを押す。
2 SFTPを選択して、グローバルIP Root path="/" keypair指定　でOK。Browse files on serverはそのままで大丈夫。
3 Preferences->Deployment->Optionsで、Upload changed files automatically...をAlwaysにかえて、Override default permissions on files:を任意の権限に指定。
以上。

これで、ローカルでpycharmでコーディングして、それがAWS上で即時反映されて開発できる。
デバッグもできる。素晴らしい。

### cudaを利用する場合
cudaのlib系に対するパスがなくてエラーになる場合がある。
その際は、RunのConfigurationsで、Environment Variableに以下をセット。

```
LD_LIBRARY_PATH　/usr/local/cuda/lib64:$LD_LIBRARY_PATH
```

### リモートインタプリタを利用中、デバックで「: cannot connect to X server」が出てエラーになる場合
正確に把握はしていないが、サーバー上でXcodeが使えない場合にエラーになるっぽい。
そこで、ローカルのXcodeで補完するための作業が必要。

１. ローカルから、以下で接続。

```
ssh -Y username@ipaddress
```

２. 1の接続で、以下のコマンドで、DISPLAYの内容を確認。

```
echo $DISPLAY
> localhost:10.0
```

３. pycharmのEnvironment Variableに2の内容をセット。

```
DISPLAY localhost:10.0
```

４. 1の接続をしたまま、pycharmでデバッグ実行。
でOK。

### AWSなどのクラウド上のtensorboardなどを確認したいがポートが解放されていない場合

ローカルから、以下で接続をしておいて、サーバー上で、利用ポートを9999指定し、ローカルのブラウザにlocalhost:8888で接続をしに行くと、そのアクセスが9999へポートフォワードされて表示ができる。

```
ssh -L 8888:localhost:9999 user@pablic_ip
```