4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-01-12

: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

  • 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インストール

  • まずはインストーラーをこちらから取得する
  • 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
  • 任意のフォルダを選択、開く
    • 今回はffrpgsrc_for_qiita
  • コマンドパレットを表示
    • Windows:Ctl + Shift + P
    • Mac:Cmd + shift + P
  • sftpと入力し、SFTP:Configを選択
    image.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
  • 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

  • 入力後、Connect ボタンを押下

6.【PC】サンプルコードの作成とPush

  • VSCodeのエクスプローラーエリアで右クリック、新規ファイル作成

  • ffrpgsrc_for_qiitaフォルダ直下にadd10.rpgle というサンプルのファイルを作成
    image.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
  • IBM iの5250画面でも確認
    image.png
    • SO/SIは自動的に挿入されているため、ソース側で特別にSO/SIを追記することは不要

おまけ

  • SFTP拡張機能を使ってSSH接続でターミナルをオープンさせる
    • 左サイドバーのSFTPアイコンを押下、5.で設定したIBM iの接続設定のフォルダ(緑塗りつぶし部分)を右クリックし、Open SSH in Teminalを選択
      SFTP.png
    • わざわざ別ターミナルでssh接続しなくてよいのでちょっと便利

😢躓いた点→解決:sunny:

2byte文字が文字化けてる!?

  • 他区画(V7.5)で同様の作業をした際、IFSにPushされたファイルはCCSID:1208(UTF8)のはずなのですが、819になっていました。
  • 暫定対応として、5250画面でファイルの属性変更(CHGATR)で、*CCSIDを1208に変更して、その後は問題なしです。
    image.png

解決:v:

  • 長らくPTFをあてていなかった区画だったので、最新の累積PTFとTRをあて、解決しました。

おわりに

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

参考記事

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?