(開発3)VSCode+Code for IBMi開発環境のインストール

## <u>■概略</u>
オープンソースエンジニア歴30年超の筆者が2023年からIBMiを学びだした学習記録です
FFRPGで開発をするためVSCodeにCode for IBMiをインストールします

## <u>■VSCodeのインストール</u>
### <u>◯VSCode</u>
自分のOS用のインストーラをダウンロードしインストールする  
```
https://code.visualstudio.com/download
```

### <u>◯VSCodeの拡張(IBMi LanguagesとCode for IBMi)</u>
VSCodeでRPG言語のハイライトをしてくれるプラグイン(IBMi Languages)と  
IBMi開発用のプラグイン(Code for IBMi)を導入する  
VSCodeを起動し、左ペインの[Extenstions(拡張)]で[Search Extensions in Marketplace]で
IBMi Languages と Code for IBMi を入力してインストールする  

### <u>◯ACS(5250エミュレータ)</u>
5250でログインはしませんが、ACSの持つ「SQLスクリプトの実行」アプリを使うので、  
ACSをインストールする

以下の手順に従い、
・PCにJDKのインストール  
・IBM IDの取得とACSのダウンロード  
・ACSのインストール  
を行う

参考にしたURL
```
https://www.i-cafe.info/column/serials/dekiruibmi_no6  
```
### <u>◯PC → IBMi </u>
IBMiへのsshをパスワードなしで利用するために、事前に鍵認証を作成し、公開鍵を登録する  

**1) PCのPowerShellで秘密鍵・公開鍵を作成する**  
```
PS C:\Users\名前> ssh-keygen -f {鍵ファイル名} -t rsa
```
→ 秘密鍵の {鍵ファイル名}.key と 公開鍵の {鍵ファイル名}.pub が作成される
　C:\Users\名前\.sshに上記ファイルをコピーしておく
　  
**2) 公開鍵をIBMiに登録する(.sshディレクトリを作成する)**  
　IBMiにsshしID/PWでログインする  
　以下user1でログインした例  
```
$ pwd
/home/USER1
$ mkdir .ssh
$ chmod 700 .ssh
```

**3) 公開鍵をIBMiに登録する(.sshに公開鍵を設定する)**  
```
PC $ scp C:\Users\名前\.ssh\{鍵ファイル名}.pub /hoem/user1/.ssh/authorized_keys
IBMi $ chmod 400 /home/user1/.ssh/authorized_keys
```

**4) 対象ホストと秘密鍵の対応を設定する**  
　PowerShellのC:\Users\名前\.ssh/configに以下を追加する  
```
# IBMi
Host {ホスト名}
    HostName IBMiのIPアドレス
    IdentityFile ~/.ssh/{鍵ファイル名}.key
    User {IBMiのユーザ名)
    Port 22
    IdentitiesOnly yes
    HostKeyAlgorithms +ssh-rsa
```
　  
**5) IBMiへのsshの認証鍵確認**  
　PowerShell(またはVSCodeのterminal)でパスワードなしでログインできたらOK  
```
PS C:\Users\user1\.ssh> ssh {ホスト名}
$
```

## <u>■VSCode+Code for IBMiの使い方</u>
インストール手順に従ってVSCodeにCode for IBMi Extensionをインストールして、Code for IBMi Extensionをクリックする

## <u>◯接続ダイアログ</u>
serversで[+]を押すと以下の画面が表示される
接続情報を入れて、[Save & Exit]すると次回から自動的に接続してくれる
![install_developenv00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/b5985980-e9d2-e76f-1365-1032ea141bbd.png)

## <u>◯IBMi接続時に表示される画面</u>
![install_developenv01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/378547a0-0f26-d5b0-2670-00b42487a28a.png)

#### <u>＊ライブラリリスト(パス相当)</u>
[current library]が優先してアクセスするライブラリ(ディレクトリ相当)  
　典型的にはコンパイルしたプログラムファイルが作成される場所  
　ボタンで変更可能  
User Library Listがアクセス対象になるライブラリのリスト(パス相当)  
　[+]ボタンで追加が可能  
　  
#### <u>＊オブジェクトブラウザー</u>
IBMiネイティブメンバーにアクセスできる  
メンバーなのでIBMiネイティブ上の(データ)ファイルはアクセス不可  
メンバーでもRPG3はアクセス不可  
あまり使っていない…
　  
#### <u>＊IFSブラウザー</u>
この機能をメインに使い、IFS上のソースを直接編集する  
この図の例は、以下のディレクトリ構成を開いている  
```
/home/TE001(ユーザ名)
├── JHDEL(プロジェクト名のディレクトリ)
│   ├── QFFRPGSRC(FFRPGソース用ディレクトリ)
│   │   ├──  debug.ffrpg(FFRPGソース)
```
　  
#### <u>＊terminal</u>
ここでIBMiにsshする。Powershellでssh設定をしていればパスワードなしでログインできる  
後述の複雑なコンパイル等行える  
  
参考URL) https://www.imagazine.co.jp/feat-visual-studio-code-part5/  
　　　　 https://www.imagazine.co.jp/code-for-ibm-i-j-part3/  
　  
### <u>◯コンパイル</u>
IFSブラウザ-ソースファイルで右クリック-Run Action-CRTBNDRPG でVSCode上でコンパイルが可能  
<font color=red>
ただし後述のCGI開発ではサービスプログラム=[複雑なコンパイル](https://qiita.com/takami_embomajp/items/d07dd17829fb70c826d2)が必要  
そのためbashスクリプトでコンパイルするのでIFSの右クリックコンパイルは使わない
</font>  

コンパイル成功時は「* was successfull」失敗時は「* was not successfull」と表示される  
[Open Output]ボタンでコンパイル結果が新規タブで開くのでエラー原因を見ることができる  
注意) 上記の通り簡便にコンパイルできるのはCRTBNDRPGだけ  
　　CRTBNDRPGは1ファイル1プログラムのコンパイル方法  
　　共通関数を別モジュールにするサービスプログラムのコンパイルは、  
　　・オプションを手動で指定し  
　　・複数回コンパイル(CRTRPGMOD+CRTSRVPGM+CRTPGM)  
　　を手動で実行する必要があり手間  
![install_developenv02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/bd2718c8-66ec-0597-9c71-b34814531504.png)
![install_developenv03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/93fb1a56-c60d-45f7-d78e-5c0a835f0e6a.png)
![install_developenv04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/d9ff9f43-8d2e-b83e-c416-65bc5c45fa8b.png)

### <u>◯VSCodeで桁位置固定のRPGLEを扱う</u>
RPGLEをVSCodeで扱う際は桁位置固定がわかりやすいように縦線をいれる  
　  
※条件  
1. IFSに置く  
2. 漢字コードがない(漢字コードがあるとシフトイン/シフトアウトの関係で桁がずれる)  
　  
※RPGLEの桁位置の意味は下記。＊{数字}の位置に縦線を入れたい  
```
＊6
06   桁目 (仕様書コード)
07-08桁目 (制御レベル)
09-11 桁目 (標識)
＊12
12-25桁目 (演算項目 1)
＊26
26-35桁目 (命令および拡張)
＊36
36-49桁目 (演算項目 2)
36-80桁目 (拡張演算項目 2)
＊50
50-63桁目 (結果フィールド)
64-68桁目 (フィールド長)
＊68
69-70桁目 (小数点以下の桁数)
71-76桁目 (結果標識)
＊81
81-100    (注記)
```

VSCodeのsettings.jsonはWindowsの場合以下にあるので末尾に以下のように設定する  
```
C:\Users\{ユーザ名}\AppData\Roaming\Code\User\settings.json
-- --
"editor.rulers": [6,12,26,36,50,68,81]
}
```

![install_developenv05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/4e5573de-b03b-cc28-f39f-a13974438ae7.png)

[【目次】オープンソースエンジニアがIBMi(AS400)を勉強してみた](https://qiita.com/takami_embomajp/items/f6ddf104aaa84bbc6a15)