メニューボタン
IBMi海外記事2016.07.14

なぜ Node.js なのか?

Aaron Bartell 著

お気づきでないかもしれませんが、IBM 人の Tim Rowe とそのチームは、あるときはベンダーとの関係を通して、またあるときは IBM から直接、過去数年間驚くべき量のオープン・ソースを提供してきました。最近は頻度は増しながら、実際にオープン・ソースは、長い間 IBM i とその先行版の大黒柱となっています。Apache Web サーバーから始まり、Java、PHP および MySQL、Ruby、Node.js、Python、さらに聞いたこともないようなソースへと進化していきました。この記事ではオープン・ソース (特に Node.js) を取り上げます。しかし、まず RPG に関する私の経歴を多少お話させていただきます。

私の主要言語は 12 年間 RPG でした。会議でセッションを開催すると、「RPG でできないことはほとんどない」と言うのが口癖でした。このモットーでオープン・ソースのほとんどを作成してきましたが、それらは mowyourlawn.com をご覧ください。各ショップがゼロ地点から始めなければならないとしたら、開発者のコミュニティ全体としてほとんど発展がないことがわかっているので、こうお話したのです。このプロセスは、しばらくは楽しかったのですが、最後には配管のようなコードの作成に時間を掛けすぎて、期限に間に合わないことがわかりました。

同じ頃、私は Ruby on Rails プロジェクトの一員でした。コミュニティの規模 (また本質的には、利用できるオープン・ソース・ツールの量) が、いかに早くビジネス・ソリューションを提供できるかに、極めて直接的に相関していることがわかりました。問題は RPG 言語ではありません。そうではなく 我々 RPG コミュニティなのです。我々の仲間で、他人が構築できるようにオープン・ソースを作成している人はほとんどいません。あらゆる RPG オープン・ソース・プロジェクトについて、他の言語で何千というオープン・ソース・プロジェクトがあります。素早く行動を起こすために、他のビジネスと同じツールを持っていないと、我々のビジネスが不利な立場になります。何年もの間言語闘争 (RPG 対その他すべて) に明け暮れていたために、取り組んだビジネスのより大きな目標に無頓着になっていました。客観的になれなかったのです。

では、人はどうするか? 特定のテクノロジーを追求すべきか、導入すべきか判断する公式の開発を始めました。コミュニティのようにモノを眺めました。それらはどのようにコラボレートするのか? どの程度頻繁にリリースが発生するか? テクノロジーはどのくらいの間存在しているか? どのようなライセンスの元で動作するか? 商業団体のバックアップはあるのか? 「つかの間のはかない」テクノロジーなのか? 要するに、取り組みを決めたテクノロジーによりビジネス・リスクをどのように減らすか?

それがこの記事のトピック「なぜ Node.js なのか」につながるのか? PHP ではダメなのか? または Ruby では? Java では? あるいは Python では? これらの言語はそれぞれ、大規模なコミュニティおよび商業団体がバックアップしています。Node.js を検討する理由は何でしょうか?

Node.js には他の言語にはない利点が 1 つあります。それは 1 つの言語でクライアントとサーバー両方に対応している点です。

我々の限られた能力と相関して、プログラミング・スタック全体の知識を維持するには、これは特筆すべきことです。一般的に Web アプリケーション・シナリオでは、両方の分野で十分に対応できる人材を見つけることができるのは稀なため、「フロントエンド開発者」と「バックエンド開発者」がいます。常に変化する言語、構文、フレームワークに遅れをとらないようにするための 1 日の時間は限られているためそうするのです。この点を大局的に眺めると、RPG グリーン・スクリーン・プログラミング・モデル以上のものを求める必要はありません。このモデルでは、1 人の開発者が (受注、在庫、出荷など) アプリケーション全体をコーディングできました。どのようにしてそれが可能になったのでしょうか? 取り組むほどのテクノロジーがなかったからです。Web プログラミングは RPG プラス *DSPF ぐらい簡単だと言えるとは思いませんが、見たところ Node.js はいくつかの面で我々と最も親しくしていたと言えます。繰り返しますがその理由は、一個人で維持する必要があるテクノロジーの量を減らすためです。

Node.js は 2009 年に生まれました。最初に使用したときは、きわめてリスクが高かったのですが「かっこ良かった」のです。明らかに「かっこいい」は、新しいテクノロジーをビジネスで採用する十分な理由ではありません。2011 年、パッケージ・マネージャー (npmjs.com) が作成されました。Node Package Manager (npm) を使用して開発者は、労力を互いに簡単に分かち合うことができました。それが Node.js を「かっこいい」から「一般受け」へ、さらにリスクが少ないものへと押し上げました。そうです、大衆性がリスクを減らします。

Node.js が大衆性を獲得したとき、その向かうべき方向性について多くの意見がありました。2014 年、意見がヒートアップし、個別のプロジェクト io.js が結成されました。コミュニティを真っ二つに分けることは、明らかに良くありません。2015 年 2 月、その違いが解決され、財団法人 Node.js が創立されました。その間中ずっと、また現在まで、Node.js をビジネス推進の主要テクノロジーとして採用した超大物企業がありました。それはとりわけ、GoDaddy、Groupon、IBM、LinkedIn、Microsoft、Netflix、PayPal、楽天、SAP、Voxer、Walmart、Yahoo! などです。これら大企業はほんの一部です。彼らが Node.js を採用することでさらにリスクが減りました。しかし、まだそれでも私にとっては、最も興味あることではありません。信じられないほど素晴らしいと思うことは、プログラミング言語を作成する両者 IBM と Microsoft が、現在、両者とも共通言語 Node.js の推進に取り組んでいる点です。(あるいは、純粋主義者には Javascript。あるいは、最も純粋な純粋主義者には ECMA)。

この重なりが目撃できるのは、Microsoft が その Chakra JavaScript エンジンを Node.js に提案している点です。Microsoft は (ご想像どおり) Node.js を使用して 新世代の Visual Studioも作成しています。IBM は、Node.js スペースで目立つプレーヤーの 1 つである StrongLoop を最近購入しました。あえて言えば、Node.js は単にかっこいいをはるかに上回っています。現在の基盤は十分であり、おそらく、最も重要な点として信じられないほど勢いがあるということです。

私の説明はすべて、この個人的な影響評価につながっています。Node.js は、IBM i ショップがビジネスに採用するのに十分なほどリスクを減らしました。

この記事のここまでは、主に Node.js を採用する可能性があるテクノロジーとして評価している IT マネージャーにお話してきました。では、Node.js の内幕を深く掘り下げて見てみましょう。

Node.js は本質的にサーバー側ネットワーク・プログラミング、通常は Web ブラウザー型アプリケーションを対象とした Javascript API の集合です。サーバー側の Javascript は Google の V8 Javascript エンジンを移植することで可能になりました。IBM は Node.js を Power チップセットで実行させました。つまり、Node.js は IBM i でも動作するということです。

IBM は過去数年間、支出に見合うだけのはるかに多い価値を提供してきました。developerWorks IBM i ページ のすべての機能拡張を見てみましょう。IBM は 5733OPS ライセンス・プログラムを通して 2014 年後半に IBM i に Node.js を提供開始しました。このプログラムはメンテナンス費用を払えば追加コストは不要です。(「V5R3 や V5R4 を使用しているので Node.js を実行できません」と頻繁に言われるので、こう言うのです。では、今すぐアップグレードしましょう! そして、メンテナンス費用を払ってください!)

IBM は、入手方法やインストール方法など IBM i に関する Node.js の相当数の文書をここにまとめました。そのため、ここではインストールについてはお話しません。
気の利いた紹介のように、「Hello World (みなさんこんにちは)」というシナリオで始めます。Node.js は IBM i の PASE 環境で動作します。PASE は本質的に AIX ですが、AIX カーネルを使用するのではなく、そのカーネルに IBM i を使用します。つまり、Node.js プログラムを実行するには PASE 側に「入る」必要があります。そのために、グリーン・スクリーン・コマンド・ラインから CALL QP2TERM を発行します。これで、以下に示すようにいわゆるシェルに配置されます。

技術情報画像01

シェルは、さまざまなコマンドを入力できるコマンド行インターフェースです。優れたシェルの概要は、Bash Is Not a Shell Game をご覧ください。

スクリーンショットでおわかりのように、ドル ($) 記号を表示されています。これは、私がコマンドを入力するのを待つプロンプトです。これは 5250 コマンド・ラインが動作する様子に非常に似ていますが、シェルの方がはるかに先を行っています。現在いるディレクトリーがわかるように「pwd」と入力しました。この場合、私のプロファイルの /home ディレクトリーです。

では、最初の Node.js プログラムを作ってみましょう。シェルで下記のコマンドを実行するか、他のツールで「hi.js」という名前のファイルを作成し、その中に「console.log('hi world')」を配置します。

技術情報16

下記のコマンドを実行してプログラム hi.js を呼び出します。

技術情報17

以下のようになるはずです。

技術情報画像02

それはどのように動作したでしょうか? では、まず PASE は「node」というコマンドを探しに出かけました。PASE では値を保持する環境変数があります。その 1 つに「PATH」という名前が付いています。「PATH」環境変数には、コマンドを入力すると検索されるすべてのディレクトリーが入っています。下記のように、「echo」コマンドを使用して環境変数の中身を表示できます。

技術情報18

上記で、多くのパスがコロンで区切られているのがわかります。しかし「node」プログラムはどこにあるのでしょうか? 下記のように、「which node」コマンドを使用して場所を学習できます。

技術情報19

おわかりのように、「node」プログラムは /QOpenSys/usr/bin/node にあります。しかし、それは正確には真実とは言えません。表示されているのは、シンボリック・リンクとも呼ばれる実際のプログラムへのショートカットであるためです。プログラムまたはコマンドの実際の場所を学習するには、下記のように「Is」(list)コマンドを使用できます。

技術情報20

行の先頭の「l」は、これがシンボリック・リンクであることを意味している点に注目してください。行の後半で、それが指している場所 /QOpenSys/QIBM/ProdData/Node/bin/node がわかります。IBM はここに Node.js をインストールしています。

「hi.js」プログラムに戻りますが、いったん「node」プログラムが配置されると、ノード・プログラムが後を引き継ぎ、渡されるパラメーターを受け取ります。この場合、単一のパラメーターである、呼び出したい Javascript プログラムを渡します。IFS にある Google の V8 エンジンが hi.js をマシン・コードに変換して実行します。

以上です。最初の Node.js プログラムを作成しました。特に取り立てて言うことはありませんが、構築の基盤となります。F3 キーを押して QP2TERM を終了します。

次にいわゆる Node.js REPL を紹介します。これは Node.js の対話式コマンド行プログラミング環境です。REPL は Read (読み取り)、Eval (評価)、Print (印刷)、Loop (ループ) の頭文字です。

以下に示すのは、SSH プログラムとプロトコルを使用して IBM i のシェルに入っている Mac 上のターミナル・アプリケーションです。Windows で類似したツールと言えば putty でしょう。

技術情報画像03

スクリーンショットで、どの Node.js バージョンが node -v で環境が整っているか確認する方法を示します。次に、パラメーターを指定せずに「node」と入力します。それにより REPL に入ります。コマンド・プロンプトがより大記号 (>) に変わるため、REPL にいることがわかります。この時点で、Javascript を手動で入力するか、コード全体を貼りつけることができます。これが完了したら、「.exit」と入力してシェルに戻ることができます。シェル・セッションを終了するには、「exit」と入力できます。

サーバー側の Node.js (および Javascript) を学習およびデバッグするのに、Node.js REPL がいかに便利かいくら強調しても足りません。例えば、特定の RPG プログラムとのインターフェースをとるために Node.js を作成している場合、しばしば Node.js を REPL に貼りつけて即座に実行し、エラーがある場合は認識します。エラーがない場合、変更してコードを再度貼りつけます。

コマンド・ラインについて紹介してきましたので、次のレベルに進んで「Hello World (みなさんこんにちは)」を行う Web アプリケーションをご紹介します。選択した方法を使用して「app.js」という新しいファイルを作成し、以下のコードをそのファイルに貼りつけます。

技術情報21

以下に詳しく説明します。

  • 最初の行は、RPG の「/COPY」と同じように「require(...)」 API を使用して外の機能を取り込みます。
  • 次に、request と response object という 2 つのパラメーターで受け取る「handle_request」という関数を定義します。Javascript 関数は RPG サブプロシージャーと似ています。
  • HTTP サーバーを作成し、「handle_request」関数をパラメーターとして渡します。いいですか、関数をパラメーターとして渡しているというのは、私の RPG 脳にとって新しい概念です。しかも結果である「http.createServer(...)」をまたも Javascript 関数である変数に保存しています。
  • このマシンの IP (自分のマシンの ID に変更します) のポート 8282 でリスンし始めるとすべてがまとまります。
  • 最後に、いつサーバーが起動を完了したのかわかるよう「Server running」を出力します。

起きたばかりのことについて、いくつか興味深い点に注意してください。まず、Node.js にはそれ自身の Web サーバーがあります。そうです、Apache を最初に置く必要はありません。もちろん必要ならばできますが。次に、「http.createServer(...)」の呼び出し時に「handle_request」をパラメーターとして指定した方法に代わり「コール・バック」の概念が導入されています。コール・バックは RPG のプロシージャー・ポインターに似ています。ブラウザーから要求が来ると、どの Javascript 関数が「http.createServer(...)」で指定されていても、そこに処理が渡されます。 このアプリケーションを開始するには、以下のコマンドを PASE シェルから発行します。

技術情報22

プログラムで指定した IP およびポートをブラウザーでポイントします。このように表示されるはずです。

技術情報画像04

これでできあがりです。あなたの最初の Node.js プログラムです。PASE シェルで「Ctrl + C」を入力すると、サーバーを終了できます。

webix.com フロントエンド Javascript ライブラリーを使用して Node.js から DB2 表にアクセスする方法を示した次号をご期待ください。IBM i Node.js group on LinkedIn もご覧ください。IBM i に関連した Node.js について討論する実質的に「井戸端会議」のような場所です。

いつものように、わからないことや質問がある場合は、abartell@krengeltech.com に直接ご連絡ください。

あわせて読みたい記事

PAGE TOP