Visual Studio Code で Jetson nano(arm64) のリモート開発を行う

##はじめに
つい先週、Visual Studio Codeに待望のARM64リモート開発機能が登場しました。

Remote-SSHといったリモート開発機能が前々からありましたが、
登場当初はx86/x64のみのサポートで、先々月あたりにarmv7(=RPi)のサポートが追加されました。

しかし、arm64はサポート外のためJetsonのリモート開発はできませんでした。
多くの要望が出ていたこの機能、つい7日前(2019.8.30)にサポートされました。
[GitHub Issues: Please add support for Linux on ARM64](https://github.com/microsoft/vscode-remote-release/issues/69)
このIssueもCloseです。

##使い方
接続作業は以下の2ステップです。
(2019.9.6追記：鍵を用意しなくてもパスワード認証で普通に繋がりました。鍵はオプションです)

1. 鍵生成(オプション)
1. Visual Studio Codeの設定

公開鍵を使用したSSH接続と作業は同一です。


###1.鍵生成(オプション)
####Windowsで鍵生成する場合
色々な作り方がありますが、
初学者でもとっつきやすい方法だとTeraTermを使う方法な気がします。
[公開鍵認証によるSSH接続 - Tera Termの使い方](https://webkaru.net/linux/tera-term-ssh-login-public-key/)

手順も上記サイトを見ていただくのが良いです。


####Linux(リモート環境,Jetsonなど)で鍵生成する場合
ちなみにLinuxで鍵生成するときは以下のコマンド

```
ssh-keygen -t rsa -b 4096 -C "コメント"
```

出力先デフォルト(~/.ssh/)、パスコード無しで良いならEnterを3回ほど押せば生成されます。
生成されたファイル(例えばid_rsa)をローカル側の任意のフォルダに移動します。

###2.Visual Studio Codeの設定

2020年7月12日追記
**この前確認したら安定板でも接続できたので、別にInsiderじゃなくても良いです。**

####2.1 Insiderバージョンのインストール
正式リリース前なのでInsiderバージョンでしか使用できない機能です。
以下から落としてインストールします。
[Download Visual Studio Code Insiders](https://code.visualstudio.com/insiders/)

####2.2 拡張機能のインストール
「Remote-SSH」を使用しますが、注意点はNightly版を使用するという点です。
したがって、すでに「Remote-SSH」がインストールされている場合は、
アンインストールして、「Remote-SSH(Nightly)」をインストールしてください。
さらに「Remote Development」もインストールします。

####2.3 接続設定
画面左下の 「><」のマークをクリックすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248663/10b29af1-7646-8858-3427-98340ea192ee.png)
画面上部にメニューが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248663/d59a6664-bac3-9dd9-2028-48f0469745c4.png)
「Remote-SSH: Open Configration File...」を選択して設定を行います。

記述のイメージは以下の通り。

```config
Host jetson-nano                              #任意の名前
    HostName aaa.bbb.ccc.ddd                  #IPアドレス
    User user-name                            #ログインユーザー名
    IdentityFile C:\pass_to_rsakey\id_rsa     #鍵へのパス(鍵無しの場合は行ごと削除)
```

#####接続が上手くいかないとき ※2019.10.21追記
パスワード認証の場合、上記の接続設定だけでは接続に成功したり失敗したり安定しないようです。
理由はよく分かりませんが、症状を回避する設定はあるので追記しておきます。

設定を開いて、「show login」あたりで検索すると、**Remote.SSH: Show Login Terminal**の項目が出てくるので、チェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248663/48e6ae06-134a-9993-d677-51d9a0a63083.png)
こんな感じ。

これで毎回安定して接続できるようになります。


####2.4 接続
画面左下の 「><」のマークをクリックして、今度は「Remote-SSH: Connect to Host...」を選択し、
接続先一覧から先ほどの接続設定を選択します。

パスワードを求められた場合は入力します。

接続に成功後、何も開かれていない状態なので、フォルダを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248663/84a68a83-29a4-4f6d-63a5-e5f85b04c8bb.png)
内部のフォルダ一覧が出るので、所望のフォルダを開いて開発を行います。

####2.5 例えばPythonスクリプトのデバッグ
リモート環境には拡張機能が無いので、インストールが必要です。
.pyファイルを開くと色々メッセージが出てくるのでそれに従ってインストールすればよいと思います。
手動でインストールする場合も、拡張機能のタブを開けばリモート先にインストールするボタンが表示されています。


デバッグの使い勝手はローカルのVisual Studio Codeと同一です。
ステップ実行もブレークも問題なし。実に快適です。


##デバッグをsudoで実行したいとき
GPIOなどを使う場合は権限昇格が必要なためsudoで実行する必要があります。
デバッグ起動時にsudoで行うときは、launch.jsonを編集します。

デバッグ画面の、右上のドロップダウンリストから「構成の追加...」を選択します。
種別は「Python Current File」を選択します。
すると、launch.jsonの編集に入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248663/6f286120-f950-203b-6417-7799fb988cb0.png)

上記画像のように、```"sudo": true```を追加すると
デバッグ実行時にパスワードの入力を求められ、sudoで実行できます。

##トラブルシュートのヒント
2020年7月13日追記
ちょくちょく接続できなくて困る事例があるようです。
調べるときのヒントになるようメモを残しておきます。

- ~/.ssh/config への読み書き権限が不足している
- configファイルのファイルパスに空白が混じっている
- ~/.ssh/known_hosts に対象ホストが含まれている

##最後に
これは待望の機能です。
これでエッジ機器の開発が捗ることは間違いありません。
C/C++の拡張機能などにまだ[問題を抱えている](https://github.com/microsoft/vscode-cpptools/issues/429)らしくサポートは不完全ですが、それでも助かる人は多いと思います。

arm64のリモート開発に言及した記事が見当たらなかったので今回この記事を書きましたが、少しでも皆さんの参考になれば幸いです。

※本記事のSSH接続の鍵の取り扱いについて不安があります。もし何か気づかれた方がいらっしゃいましたら、教えて頂けると幸いです。