新年おめでとうございます。2023年も多くのHack!ができればと思います。前回のHack!ではNode.jsを取り上げましたので、今回もNode.jsの開発でIBM iとの連携を容易にしてくれる「itoolkit for IBM i」(以下、itoolkit)をご紹介します。
itoolkitで何が容易になるかというと、自身で開発した既存資産のCL、RPG、SRVPGM の呼び出しや連携が容易になります。また、IBM iのコマンドを実行し、その出力を簡単に受け取ることなどもできます。
前提
今回の説明では、前提として以下の環境が必要です。
・IBM iにSSH接続している端末
・SSH 接続の環境変数$PATHに/QOpenSys/pkgs/bin/が入っている
・yum本体が導入済み
・yum [Node.js] が導入済み(*本記事では、V14.19.1を使用しています)
ODBCの環境導入
今回のサンプル実装では、ODBC接続を用いて実行しているため、まずyumでODBC環境を整える必要があります。既にODBC環境が導入済みの場合は、この項は飛ばして構いません。
1. ODBCドライバの導入
はじめにPC端末などからSSHでIBM iに接続します。次にIBM i用のODBCドライバibm-iaccessを導入します。コマンドは次の通りです。
►新規の場合
yum install ibm-iaccess
►更新の場合
yum update ibm-iaccess
2. unixODBCの導入
次にunixODBCを導入します。コマンドは次の通りです。
yum install unixODBC unixODBC-devel
正常にインストールされると、IBM iのターミナル上のisqlでデータベース接続を確認できます。次のコマンドで確認します。
►データベースに接続
/QOpenSys/pkgs/bin/isql -v “*LOCAL”
+—————————————+
Connected!
sql-statement
help [tablename]
quit
+—————————————+
►SQLを実行する
SQL> select * from qiws.qcustcdt
SQLRowCount returns -1
12 rows fetched
►切断
SQL> quit
iToolkiを試す
iToolkiはnpmパッケージで提供されています。従ってnpmやyarnなどで導入します。本記事ではnpmを使っていますが、yarnユーザーの方は適宜yarnに置き換えて読んでください。
ただしyarnの場合は、iToolkiをインストールした際に「g++が見つからない」などのエラーが発生します。npmでは特にエラーは発生せず、正常にインストールが完了します。yarnでも、後述のサンプル・プログラムは正常に動作しましたが、念のためにnpmでの導入をお薦めします。
以下の流れに沿って、コマンドを実行していきます。
1. サンプル・プロジェクト用のディレクトリ作成
2. 作成したディレクトリへ移動
3. npm(yarn)プロジェクトの初期化
4. iToolkiの導入
5. サンプル・プログラムの作成
6. サンプル・プログラムの実行
1. サンプル・プロジェクト用のディレクトリ作成 ~ 3. npm(yarn) プロジェクトの初期化
次のコマンドで「ディレクトリ作成~サンプル・プロジェクトを初期化」までを行います。
1. サンプル・プロジェクト用のディレクトリ作成
mkdir toolkit-test
2. 作成したディレクトリへ移動
cd toolkit-test
3. npm(yarn) プロジェクトの初期化
npm init –yes
yarnの場合、yarn init
Wrote to …/package.json:
{
“name”: “xxxxx”,
“version”: “1.0.0”,
“description”: “”,
“main”: “index.js”,
“scripts”: {
“test”: “echo \”Error: no test specified\” && exit 1″
},
“keywords”: [],
“author”: “”,
“license”: “ISC”
}
package.json が作成されている事を確認
ls -la
package.json
4. iToolkiの導入
次のコマンドでiToolkiを導入します。itoolkitは、別途fast-xml-parserとODBCなどにも依存しています。
►itoolkiを導入
npm install itoolkit
yarnの場合、yarn add itoolkit
added 75 packages, and audited 76 packages in 38s
5 packages are looking for funding
run npm fund for details
found 0 vulnerabilities
►itookit の導入を確認
npm ls –all | grep “itoolkit\|fast-xml-parser\|odbc”
yarnの場合、yarn list –depth=0 | grep “itoolkit\|fast-xml-parser\|odbc”
— itoolkit@1.0.1
+– fast-xml-parser@4.0.12
+–ODBC@2.4.6
5. サンプル・プログラムの作成 ~ 6. サンプル・プログラムの実行
次に、touch cosine.jsで空のファイルを作成し、IFS上でNode.jsを編集します。編集にはIFS上のファイルをVSCodeで直接編集できるVSCode for i(下画面) がとても便利です。
/QSYS/QC2UTIL2 – cos関数 を呼び出すサンプル・ソースコード cosine.js の例
// クラスのインポート
const { Connection, ProgramCall } = require(‘itoolkit’);
const { XMLParser } = require(‘fast-xml-parser’);
//ODBC接続確立
const conn = new Connection({
transport: ‘odbc’,
transportOptions: { dsn: ‘*LOCAL’}
});
// サービスプログラムのインスタンス生成
const program = new ProgramCall(‘QC2UTIL2’, { lib: ‘QSYS’, func: ‘cos’ });
// 引数(入力)設定
program.addParam({ name: ‘angle’, type: ‘8f’, value: ‘0’, by: ‘val’ }); //expect… Angle input: 0 Cosine result: 1
// program.addParam({ name: ‘angle’, type: ‘8f’, value: ‘3.14159’, by: ‘val’ }); //expect… Angle input: 0 Cosine result: -1
// 引数(出力)設定
program.addReturn({ name: ‘cos’, type: ‘8f’, value: ” });
// プログラムを登録
conn.add(program);
// プログラムを実行
conn.run((error, xmlOutput) => {
if (error) {
throw error;
}
// XMLで出力する場合
// console.log(xmlOutput);
// XMLをJSONに変換
const XmlToJsonParser = new XMLParser();
const result = XmlToJsonParser.parse(xmlOutput);
// 返り値を出力
console.log(‘Angle input: ‘ + result.myscript.pgm.parm.data + ‘ Cosine result: ‘ + result.myscript.pgm.return.data);
});
サンプルの実行はnode cosine.jsで行います。正しく動作すれば、Angle input: 0 Cosine result: 1 と結果が出力されるはずです(下画面)。
今回のサンプル・プログラムは、GitHub上からクローンして実行することもできます。
►リポジトリのクローン
git clone https://github.com/ushiday/imag_ushiday_Hack.git
ディレクトリの移動
cd imag_ushiday_Hack/007/toolkit-test
依存パッケージのインストール
npm install
yarnの場合、yarn install
added 75 packages, and audited 76 packages in 31s
5 packages are looking for funding
run npm fund for details
found 0 vulnerabilities
►Node.jsプログラムの実行
node cosine.js
Angle input: 0 Cosine result: 1
最後に
今回はiToolkiという便利なライブラリをNode.jsで使用することで、IBM iとの連携が容易になりました。Webフロントエンドの開発において、JavaScriptは必須と言ってよい知識です。その点を考慮すると、サーバーサイドで習得する言語として、Node.jsは学習コスト面で非常に有利だと考えられます。IBM i界隈でもNode.jsがどんどん活用されるとよいですね。
今日のところはこれまで!
なお本記事は、CSC(中部システム)のパートナーであるSeiden Groupのプリンシパル、Alan Seiden氏に協力をいただきました。Seiden Groupは米国においてIBM iのOSSの発展に大きく貢献しており、私自身も彼とチームの活動にいつも刺激と感銘を受けています。この場を借りて改めて、Alan氏とSeiden Groupのチームメンバーに御礼を申し上げます。Great Thanks, Alan and SG Team guys!
著者
牛田 吉樹氏
株式会社中部システム
代表取締役社長
2001年中部システム入社。RPG技術者として数多くの受託開発案件を担当。その一方、オープンソースの習得も並行して進め、コミュニティ活動にも積極的に参加する。PHP、JavaScript、Node.jsなどに造詣が深い。TwitterやQiitaなどでも積極的に発言。2021年より現職。
[i Magazine・IS magazine]