IBM i 上でNode.jsのWebアプリを動かす その1

# IBM i でのOSS利用

IBM i でオープンソースのソフトウェアを利用できることをご存知でしょうか？  
英語ではありますが、IBM i 上で稼働するOSSについてまとめられているドキュメントが公開されています。

https://ibmi-oss-docs.readthedocs.io/en/latest/README.html

PythonやNode.jsなどのソフトウェアをIBM i上で使うことができます。  
IFS (統合ファイル・システム)上で利用できるのですが、bashなどもあるので使い慣れている人であれば、特に困ることはないかと思います。  

いくつかのOSSを利用できるのですが、今回は何回かに分けてNode.jsを使ったアプリの紹介をしていきます。  
最終的な目標は、Node.jsからDBアクセスをするようなWebアプリを作ることです。  
少しインタラクティブなアプリを...ということで、QRコードをカメラで読み取ってステータスの更新を行うようなアプリを作ってみました。  

作成したアプリのコードはこちらにおいています。

https://github.com/tom-m-m/ibmi-nodejs-qr-detection/tree/main

私自身、Webアプリ開発の経験などはなく、手探りで作成したものです。  
至らない部分は、少し目を瞑っていただけると幸いです。  

# OSSのインストール

今回は、詳しく手順の紹介まではしませんが、OSSのインストールはACSに `オープン・ソース・パッケージ管理` の項目があるので、そこからインストール可能です。  
また、IFS上でyumを使うことでインストールできます。  
GUIから `オープン・ソース・パッケージ管理` を開くと、オープンソース環境が導入されていなければ、セットアップが行われるはずです。    
画像の一番下の選択項目ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/c38b8339-e943-5c9b-f594-8800c25b2db3.png)

パッケージの管理画面はこのように表示されます。    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/3ea96cb8-c4e6-4adf-7e63-09cfd809e906.png)

# IBM i 上の Node.js

それでは、早速 Node.js の話しに入っていきましょう。  
yum でインストール可能の Node.js のバージョンを確認してみます。  

``` bash
# yum search nodejs
ibmi-base                                                                                                                                        | 3.6 kB  00:00:00
ibmi-base/primary_db                                                                                                                             | 578 kB  00:00:01
ibmi-release                                                                                                                                     | 2.9 kB  00:00:00
========================================================================= N/S Matched: nodejs ==========================================================================
nodejs14.ppc64 : Node.js JavaScript Runtime
nodejs16.ppc64 : Node.js JavaScript Runtime
nodejs18.ppc64 : Node.js JavaScript Runtime
nodejs20.ppc64 : Node.js JavaScript Runtime

  Name and summary matches only, use "search all" for everything.
```
これを見ると、LTSのバージョンはサポートしているようです。  

ACSからも同じように確認できます。  
細かいバージョン情報も書かれていますが、実は当初この記事を書こうとしていた時よりも新しいバージョンが使えるようになっていました。  
オンラインの環境であれば、その都度最新のものが使えます。    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/a3b4fc56-9b50-3d28-d8f7-b98838cb71e4.png)

インストールは、`yum install <利用したいパッケージ名>` で行えます。  
ACSから対象のパッケージを選択し、 `インストール` ボタンをクリックしてもOKです。  

実行すると、インストールするかどうかの確認が表示されるので、 `y` を入力してインストールをします。  

```
# yum install nodejs20.ppc64
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nodejs20.ppc64 0:20.8.1-1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===================================================================================================================================
 Package                        Arch                        Version                          Repository                       Size
===================================================================================================================================
Installing:
 nodejs20                       ppc64                       20.8.1-1                         ibmi-base                        45 M

Transaction Summary
===================================================================================================================================
Install       1 Package

Total download size: 45 M
Installed size: 45 M
Is this ok [y/N]: 
```

インストールが完了したあと、 `node -v` でインストールされたバージョンが確認できます。  

```
# node -v
v20.8.1
```
正しく、インストールできてますね。  
もし、コマンドが見つからないという場合はパスが通っているか確認してください。  

こちらを実行するとパッケージのパスが設定されます。
```
echo 'PATH=/QOpenSys/pkgs/bin:$PATH' >> $HOME/.profile
echo 'export PATH' >> $HOME/.profile
```

これで、Node.js が使えるようになりました！  

# まずは動かしてみる

まずは、簡単に Hello World! がブラウザ上に表示されるようなページを作ってみます。  
※ Node.js 自体は、javascriptの実行環境ですのでブラウザを使う必要はないですが、今回はwebアプリを作るというゴールがあるので、単純なjavascriptの実行は紹介しません。


`mkdir` でアプリを作成するディレクトリを作ります。  
作成したディレクトリに `cd` で移動した後、`npm init --yes` を実行します。  

```
/home/E36965/work # mkdir helloworld  
/home/E36965/work # cd helloworld/
/home/E36965/work/helloworld # npm init --yes
Wrote to /home/e36965/work/helloworld/package.json:

{
  "name": "helloworld",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

これで、アプリを作成する準備ができました。  

新しく`index.js`という名前のファイルを作成して、下記を記述します。  
```
const http = require('http')
const svr = http.createServer(handler)

const port = 9443;
svr.listen(port)
console.log(`Listening on port ${port}!`)

function handler (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'})
  res.end('<h1>Hello World!</h1>\n')
}
```

ファイルが作成できたら、`node index.js` で実行します。  
そうすると、Node.js が実行され、今回指定したポート番号が表示されます。  

```
/home/E36965/work/helloworld # node index.js 
Listening on port 9443!
```

上のような表示がでたら、ブラウザから `http://<IBM iのIPアドレス>:9443` にアクセスします。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/e0f7de0c-b6e3-9f44-bc7b-e8a5d7d998f5.png)


Hello, World! が表示されたら成功です！  

1つ目の記事は、ここまでにしようと思います。  
Node.jsのインストールから、簡単な実行までを行いました。  

次回からは、作成したアプリをポイントを絞って順に解説できればと思います。  

---

- 2つ目の記事はこちら

https://qiita.com/tom_m_m/items/1d0139cc8b507be4b591