ewd 3トレーニング・コース #1 node.jsとgt.mの統合方法

19
EWD 3 トレーニング・コース #1 Node.jsとGT.Mの統合方法 M/Gateway Developments Ltd. Rob Tweed : 日本ダイナシステム株式会社 芳成 GT.M版編集: 澤田 潔 本稿オリジナルはCache’向けとして編纂

Upload: kiyoshi-sawada

Post on 21-Jan-2018

156 views

Category:

Software


7 download

TRANSCRIPT

Page 1: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

EWD 3トレーニング・コース #1

Node.jsとGT.Mの統合方法M/Gateway Developments Ltd.

Rob Tweed訳: 日本ダイナシステム株式会社 嶋 芳成

GT.M版編集:澤田潔

※本稿オリジナルはCache’向けとして編纂

Page 2: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

Node.jsとGT.M

• Node.js• サーバー・サイドのJavaScript

• 実行はシングル・スレッド

• JavaScriptは、開発(と成長)の余地がある、世界で最も人気のあるコンピュータ言語

• GT.M• 高性能な、多モデルのNoSQLデータベース

• 下部構造は階層型

• 通常は組み込み言語を用いてアクセスする• MUMPS言語(JIS X 3011)

• ITのメインストリームからは旧式とみなされている

• GT.Mのプライマリな言語としてのJavaScript

2016/9/30 2EWD 3 トレーニング・コース #1

Page 3: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

Node.jsインターフェース

• Cache’用のcache.node互換のAPI仕様• 言語パーサやエンジンは搭載されていない

• GT.Mのコール・イン・インターフェース経由でアクセスされる

• Node.jsインターフェース NodeMはDavid Wicksellにより開発された• https://github.com/dlwicksell/nodem

• インターフェース・モジュールのファイルはmumps.node

2016/9/30 3EWD 3 トレーニング・コース #1

Page 4: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

NodeMインターフェース

Node.jsプロセス

JavaScript

NodeMモジュール

GT.Mプロセス

コール・イン・インターフェース

グローバル

2016/9/30 4EWD 3 トレーニング・コース #1

Page 5: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

Node.jsインターフェース

•NodeMは、GT.M専用

•GT.MのMUMPSコードを、JavaScript/Node.jsから実行するためのAPIfunciton() を新設

•その後、CachéのオブジェクトAPIも追加

2016/9/30 5EWD 3 トレーニング・コース #1

Page 6: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

NodeMインターフェース

Node.jsプロセス

JavaScript

NodeMモジュール

GT.Mプロセス

コール・イン・インターフェース

グローバル 関数 オブジェクト

2016/9/30 6EWD 3 トレーニング・コース #1

Page 7: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

NodeMインターフェース

• Node.jsとGT.Mの間は非常に緊密に結合され、密接な関係にある• イン・プロセス

• Node.jsプロセスとそれに接続されるGT.Mプロセスは、ひとつの同一のプロセスとなっている• Node.jsプロセスID === GT.Mの$job

• Node.jsはGT.Mサーバー上にインストールされなくてはならない

2016/9/30 7EWD 3 トレーニング・コース #1

Page 8: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

NodeMインターフェース

Node.js

JavaScript

NodeMモジュール

コール・イン・インターフェース

グローバル 関数 オブジェクト

GT.Mプロセス

2016/9/30 8EWD 3 トレーニング・コース #1

Page 9: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

Node.jsインターフェース

•非常に速い接続• Node.jsとGT.Mのネットワーク接続よりもはるかに速い

• Globalストレージへのアクセスは、ネイティブなMUMPSコードの1/3~1/4のパフォーマンス

• 現在の制限は、Google V8 APIのボトルネックによる• https://bugs.chromium.org/p/v8/issues/detail?id=5144 参照

• ネイティブなMUMPSパフォーマンス同等となる潜在的可能性

2016/9/30 9EWD 3 トレーニング・コース #1

Page 10: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

NodeMをインストールする

• Node packege manager(npm)でインストール• cd ~/ewd3

• npm install nodem

• Node.jsのバージョンと64bit or 32bitごとにAPIが変更されている• 0.12.x – mumps0.120.node_i686 or _x8664

• 4.2.x – mumps4.2.node_i686 or _x8664

• 5.1.x – mumps5.1.node_i686 or _x8664

• これらの内1つを mumps.node という名前に変える

2016/9/30 10EWD 3 トレーニング・コース #1

Page 11: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

NodeM用のGT.M環境変数を設定• 環境変数設定

用.jsファイル

• ~/ewd3/setEnvironment.js

var fs = require('fs');var os = require('os');

module.exports = function() {

var home = process.env.HOME;var gtmdir = home + '/.fis-gtm';var gtmver = fs.readdirSync(gtmdir)[0];var gtmroot = gtmdir + '/' + gtmver;var gtmver2 = fs.readdirSync('/usr/lib/fis-gtm')[0];var gtmdist = '/usr/lib/fis-gtm/' + gtmver2 + '/utf8';

process.env['gtm_icu_version'] = '5.0' ;process.env['gtm_chset'] ='utf-8' ;process.env['gtmdir'] = gtmdir;process.env['gtmver'] = gtmver;process.env['gtm_dist'] = gtmdist;process.env['gtmgbldir'] = gtmroot + '/g/gtm.gld';process.env['gtmroutines'] = gtmroot + '/o(' + gtmroot + '/r ' + gtmdir + '/r)'if (os.arch() !== 'ia32') process.env['gtmroutines'] =

process.env['gtmroutines'] + ' ' + gtmdist + '/libgtmutil.so'process.env['gtmroutines'] = process.env['gtmroutines'] + ' ' + gtmdist + ' ' +

process.cwd() + '/node_modules/nodem/src';

};

2016/9/30 11EWD 3 トレーニング・コース #1

Page 12: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

GT.Mに接続するテスト用のスクリプト・

ファイルを作る

例えば:

~/ewd3/test.js

var setEnvironment = require('./setEnvironment')();// GT.M環境変数をセットvar interface = require('nodem');//NodeMをロードvar db = new interface.Gtm();

var ok = db.open();

//接続OKかどうかを確認console.log('ok: ' + JSON.stringify(ok));console.log(db.version());

2016/9/30 12EWD 3 トレーニング・コース #1

Page 13: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

GT.Mに接続する

• テスト用のスクリプトファイルを走らせる

• うまく接続されています!

$ cd ~/ewd3$ node test

ok: {"ok":1,"result":"1"}Node.js Adaptor for GT.M: Version: 0.6.2 (FWSLC); GT.M V6.2-002A Linux x86_64

2016/9/30 13EWD 3 トレーニング・コース #1

Page 14: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

単純な例

• グローバル・ノードをセットします• すなわち、 set ^test(“foo”,”bar”)=“hello world”

var node = {global: ‘test’,subscripts: [‘foo’,’bar’],data: ‘hello world’

}

db.set(node, function(error, result){//ノードが生成されたときに何かをする

});

2016/9/30 14EWD 3 トレーニング・コース #1

Page 15: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

単純な例

• グローバル・ノードの値を取り出(get)します• すなわち、 set value=^test(“foo”,”bar”)

var node = {global: ‘test’,subscripts: [‘foo’,’bar’],

}

db.get(node, function(error, result){console.log(‘value = ‘ + result.data);

});

2016/9/30 15EWD 3 トレーニング・コース #1

Page 16: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

NodeM の API

• データベースの Open と Close

• グローバル・ノードの Set, Get, Kill

• あるノードが存在するかどうかを調べる ($data)

• $order と $query 等価の関数 (順方向と逆方向)

• グローバル・ディレクトリのリストを作る

• グローバル・ノードの値を増やす($increment)

• グローバル・ノードの Lock と Unlock

• グローバルの木構造の一部を他と Merge する

2016/9/30 16EWD 3 トレーニング・コース #1

Page 17: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

NodeM の API仕様書

• https://github.com/dlwicksell/nodem#apis

• 参考資料 Cache.nodeのAPI• http://docs.intersystems.com/latest/csp/docb

ook/DocBook.UI.Page.cls?KEY=BXJS_refapi

2016/9/30 17EWD 3 トレーニング・コース #1

Page 18: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

Cachéオブジェクト用のAPI

• cache.node にはCachéオブジェクト用APIもある

• GT.Mにはオブジェクト・ハンドリングはありません

invoke_classmethod クラスメソッドを呼び出す

create_instance オブジェクトの新しいインスタンスを生成する

open_instance オブジェクトの既存のインスタンスを開く

get_property プロパティの値を検索する

set_property プロパティの値をセットする

invoke_method メソッドを呼び出す

save_instance インスタンスを格納する

close_instance インスタンスを閉じる

2016/9/30 18EWD 3 トレーニング・コース #1

Page 19: EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法

NodeM の API

• 非同期と同期• 複数ユーザーのアクセスに単一のNode.jsプロセスを用いる

のなら、非同期APIを用いなくてはなりません

• 同期API• 若干高速

• 利用方法がより簡単で直感的です• コール・バック地獄やPromiseなどを使うのを避けることができます

• ブロッキングI/O

• シングル・ユーザーでテストする以外、 Node.jsではふつう使われません。

... しかし EWD 3 ではこの常識を変えます ...

2016/9/30 19EWD 3 トレーニング・コース #1