VSCodeでFFRPGをシュッと始める　環境構築／ソースをIFSへPush編

# :muscle:前置き
- 前職では、IBM i（AS/400）の開発はエミュレーターからSTRPDM、既存ソースで参考になるものをPDMのOPT:3でコピーして～を繰り返していました。
- そんな私ですが、最近ようやくFFRPGを触る機会を持つことができ、以下の感想を持ちました。
    - 「わたしたちの知っているRPG開発ではない」
    - 「書きやすいし、他言語経験者にも優しい」
    - 「FFRPGを扱えるようになることによってIBM iの開発者が他言語にトライするハードルが下がりそう」
- 早く始めなかった理由は、業務やコスト以外に開発環境構築が大変そう、CCSIDとかいろいろ考えないといけないのでは？という始めることへの漠然とした不安でした。
- この不安を取り除いて、**シュッ**と素早く、安全に環境を構築し、FFRPGに飛び込む人を増やしたいと思い、記事に残したいと思います。
- 様々な方の良い記事を参考にして本記事を作成しておりますが、個人的な意見を含んでおります。ご承知おきください。


# 本編の前に
## :question:VSCodeで固定長のソースコードは編集できるのか
- お試しで、データ転送でtxt形式でダウンロードしたソースコードの拡張子を.rpgle、.rpgに変更して確認しました。
- 尚、下記にあるVSCodeの拡張機能がインストールされている前提で確認をしております。
## :bulb:固定長編集はできるが、使いづらい。VSCode開発はFFRPGを選びたい
- RPGⅢ、RPGⅣ（固定長）　→　編集はできます！が、桁位置などがずれると大変＆プロンプトがないので、慣れない人は苦戦しそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/0e81c768-88c0-d154-224d-69cbf358cdba.png)

- RPGⅢはRPGⅣへソースの変換 (CVTRPGSRC)をし、FFRPGに徐々に変えていくことをお勧めしたいです。
- SEUのプロンプトのような機能を求める場合は、RDi（Rational Developer for i）がおすすめです。
- また、プロンプトが優しいSEU自体は、V6.1で機能追加はされておらず、様々な便利関数が使えない状況です。
- 上記のことより、**VSCodeでよりモダンに楽しく開発をするならFFRPGに挑戦**していただきたい、と思います。

# 0. 環境前提
- PC環境
    - Windows11
- 接続先IBM i
    - IBM iバージョン：V7.4
    - QCCSID：1399（5035でも恐らく同様で、問題ないと思います）　
    - 導入済ライセンスに`5733SC1`があり、OpenSSHが利用できる状態

# 1.【PC】VSCode/拡張機能インストール
## VSCodeインストール
- まずはインストーラーを[こちらから取得](https://code.visualstudio.com/download)する
- Windowsユーザーの方はexeをダブルクリック→ウィザード通りに操作を行う

## 拡張機能インストール
- `Ctl + Shift + X`　または　左のパズルアイコンの拡張機能を押下し、拡張を追加する
    - 拡張機能は必須と任意があります。表にしたのでごお好みでインストールを！

| 拡張の名前 | 必須or任意 | 何ができる拡張？|
|:-----------|------------|:------------|
| Japanese Language Pack for Visual Studio Code       | 必須        | VSCodeの日本語対応 |
| IBM i Development Pack| 必須      | VSCodeでRPG/CL/COBOLのソースコードの保守、コンパイルといった開発が簡単にできてしまう拡張機能のパッケージ |
| SFTP     | 必須      | PC→IBM i（IFS）へソースコードの自動保存用に使用 |
| indent-rainbow       | 任意        | FFRPGのインデントを美しく表示してみたい人ー！ |
| vscode-icons       | 任意        | アイコンがわかりやすい！FFRPGには対応していませんが…|

# 2.【IBM i】SSHD起動
- 5250画面のエミュレーターにて以下コマンドを実行し、SSHDを起動
    ```
    STRTCPSVR *SSHD
    ```
- SSHDの起動状況を確認
    - SSHD起動後、QUSRWRKサブシステム内にジョブ`QP0ZSPWP`が開始される。このジョブが存在しているかを確認
- QCCSIDが1399ではなく、65535の場合は…
    - SSHD起動ユーザープロファイルを`CRTUSRPRF`で作成する
        - ユーザープロファイルを作成時CCSIDを**5035**にする
    - SSHD起動ユーザープロファイルで`STRTCPSVR *SSHD`コマンドを実行

# 3.【IBM i】ソースファイルを配置するフォルダ作成
- 5250画面のエミュレーターにて以下コマンドを実行
    - ※作成ディレクトリは任意。今回は`ffrpgsrc_for_qiita`とする
    ```
    MKDIR DIR(‘/home/＜ユーザー名＞’)
    MKDIR DIR(‘/home/＜ユーザー名＞/ffrpgsrc_for_qiita’)
    ```

# 4.【PC】PCフォルダに保存したソースをIFSに自動Pushさせる（SFTPを利用）
- まずはVSCodeを開き、フォルダを開くを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/76c258e3-de37-477f-23ff-a467ba7460a9.png)
- 任意のフォルダを選択、開く
    - 今回は`ffrpgsrc_for_qiita`
- コマンドパレットを表示
    - Windows：`Ctl + Shift + P`
    - Mac：`Cmd + shift + P`
- `sftp`と入力し、SFTP:Configを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/9285848a-54b5-89c2-a611-5010281fb823.png)
- jsonファイルが開くので、以下の内容で更新を行う
    - `uploadOnSave`をTrueとすることで、フォルダ・ファイルを保存をするとIFSに自動更新（自動転送）がされる
    - `remotePath`には 3.で作成したソースファイル配置ディレクトリを指定
    ```
    {
        "name": "＜任意で指定＞",
        "host": "＜IPまたはホスト名を指定＞",
        "protocol": "sftp",
        "port": 22,
        "username": "＜ユーザー名＞",
        "password": "＜パスワード＞",
        "remotePath": "/home/＜ユーザー名＞/ffrpgsrc_for‗qiita",
        "uploadOnSave": true
    }
    ```
- 公開鍵認証を使う場合は`"password":`の行を削除し、`"privateKeyPath:"`にて、秘密鍵を設定する（PPK形式は使えなかったので、OpenSSH形式で作成しました）
- 秘密鍵のパスと名前は、ご自身で作成したものを読み替える
    ```
    {
        "name": "＜任意で指定＞",
        "host": "＜IPまたはホスト名を指定＞",
        "protocol": "sftp",
        "port": 22,
        "username": "＜ユーザー名＞",
        "remotePath": "/home/＜ユーザー名＞/ffrpgsrc_for_qiita",
        "privateKeyPath": "C:/Users/＜ユーザー名＞/.ssh/openssh_key",
        "uploadOnSave": true
    }
    ```  
    
# 5.【PC→IBM i】VSCodeにてIBM iへ接続設定を行う
- IBM iの接続情報を作成する
    - 左メニューバーのIBM iサーバーアイコンを押下＞SERVERS ＋ボタンを押下
    ![IBMiNewConnection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/6f599959-bdf1-04ba-0d8e-4aaf05fa249a.png)


- Connection情報に以下を入力

    | Left align | Right align |
    |:-----------|:------------|
    | Connection Name      | Connectionに接続名を入力        |
    | Host or IP Addless     | 接続する区画のIPまたはHost名を入力      |
    | Port     | 接続時使用ポート（22ポートでOK）      |
    | Username     | サインオン・ユーザー      |
    | Password     | サインオン・ユーザーのパスワード      |

- 秘密鍵を使う場合はパスワードは入力せず、Private keyを選択する（こちらの拡張機能はOpenSSH、RFC4716、PPK形式に対応しています）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/d2e92db8-c606-1196-848e-0acf40ce5de1.png)
- 入力後、Connect　ボタンを押下

# 6.【PC】サンプルコードの作成とPush
- VSCodeのエクスプローラーエリアで右クリック、新規ファイル作成
- ffrpgsrc_for_qiitaフォルダ直下に`add10.rpgle` というサンプルのファイルを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/8f1144ec-be3c-8428-d48a-9b907038768e.png)


- ソースコードは以下を貼り付け（内容はCALL時の引数に10を足してDSPLYするもの）

    ```
    **free
    
    ctl-opt dftactgrp(*no) main(main);
    //---------------------
    // main処理 add10
    // CALL PGM(コンパイルするLIB/ADD10) PARM((S (*CHAR 1)) (900 (*DEC 9 0))) 
    // サンプルコード
    //---------------------
    
    dcl-proc main;
        dcl-pi *N;
            #kubun char(1);
            #number packed(9:0);
        end-pi;
        
        if #kubun = 'S';
            dsply  subpro(#number);
        else;
            dsply '区分NG';
        endif;
        
    end-proc;
    
    dcl-proc subpro;
        dcl-pi *n varchar(52);
            number packed(9:0);
        end-pi;
    
        dcl-s dsplay_message  char(52); 
    
        number = number + 10;
        dsplay_message = '返却結果：' + %char(number);
    
        return dsplay_message;
    end-proc;
    ```
- 上記ソースコードを`Ctrl + S`で保存
    - 保存することにより、PC→IBM i（IFS）へPush完了


# 7.【PC】IFSにPushされているか確認
- 左下IFS　BROWSERにて、 4.にてsftp.json内でremotePath指定したパス（`/home/<ユーザー名>/ffrpgsrc_for_qiita`）にサンプルソースが存在していることを確認
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/bb2f41a0-4f34-0a1c-97a2-5fc4b142e177.png)
- IBM iの5250画面でも確認
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/19115f62-c02e-b38b-54c6-7f4809ff170c.png)
    - SO/SIは自動的に挿入されているため、ソース側で特別にSO／SIを追記することは不要

# おまけ
- SFTP拡張機能を使ってSSH接続でターミナルをオープンさせる
    - 左サイドバーのSFTPアイコンを押下、5.で設定したIBM iの接続設定のフォルダ（緑塗りつぶし部分）を右クリックし、Open SSH in Teminalを選択
    ![SFTP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/79b67121-8b05-cad7-81a8-994e0a2c80f9.png)
    - わざわざ別ターミナルでssh接続しなくてよいのでちょっと便利

# 😢躓いた点→解決:sunny:
## 2byte文字が文字化けてる！？
- 他区画（V7.5）で同様の作業をした際、IFSにPushされたファイルはCCSID：1208（UTF8）のはずなのですが、819になっていました。
- 暫定対応として、5250画面でファイルの属性変更（CHGATR）で、*CCSIDを1208に変更して、その後は問題なしです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/edcee022-9114-b418-11de-fbc21db5cb6c.png)
 
## 解決:v:
- 長らくPTFをあてていなかった区画だったので、最新の累積PTFとTRをあて、解決しました。

# おわりに
- ローカルPCでソース編集をし、IFSにPushするところまでを実施することができました。
- 次回、VSCodeでコンパイル時の設定（ライブラリーリスト変更、コンパイルコマンドのパラメータ変更）とコンパイルリストの確認方法の記事を追加予定です。

# 参考記事
- この記事は以下の情報を参考にして執筆しました。
    - [IBM iユーザーに捧げるVisual Studio Code入門｜Visual Studio Codeを使用したFF RPG開発の実際◎特集 Part3](https://www.imagazine.co.jp/feat-visual-studio-code-part3/)
    - [IBM i駆け出し日記：VS CodeでIBM iを触る~設定編~](https://qiita.com/koga39chan/items/20e9f468f3079c62472a)
    - [【できるIBM i 7.4解剖】第10回 「IBM i のSFTPとFTPSサポート」](https://www.i-cafe.info/column/serials/dekiruibmi_no10)
        - こちらの記事では公開鍵／秘密鍵をPuttyで作成されています。
        - 上記記事通りにPuttyで秘密鍵を作成をされた方は、puttygenのエクスポート機能を使うことで、PPK形式→OpenSSHにエクスポートができます。これによって、VSCodeのSFTP拡張機能で使うOpenSSHの秘密鍵を作ることができます。2回鍵を作成せずに利用できるので、ぜひエクスポート機能をお使いください！
        - puttygenでは、OpenSSH形式→PPK形式もできます。