MENU

ushiday@Hackな日々|Node.js itoolkit for IBM iを使う(牛田吉樹)

ushiday@Hackな日々

新年おめでとうございます。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]