ewd 3トレーニング・コース #1 node.jsとgt.mの統合方法
Post on 21-Jan-2018
156 Views
Preview:
TRANSCRIPT
EWD 3トレーニング・コース #1
Node.jsとGT.Mの統合方法M/Gateway Developments Ltd.
Rob Tweed訳: 日本ダイナシステム株式会社 嶋 芳成
GT.M版編集:澤田潔
※本稿オリジナルはCache’向けとして編纂
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
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
NodeMインターフェース
Node.jsプロセス
JavaScript
NodeMモジュール
GT.Mプロセス
コール・イン・インターフェース
グローバル
2016/9/30 4EWD 3 トレーニング・コース #1
Node.jsインターフェース
•NodeMは、GT.M専用
•GT.MのMUMPSコードを、JavaScript/Node.jsから実行するためのAPIfunciton() を新設
•その後、CachéのオブジェクトAPIも追加
2016/9/30 5EWD 3 トレーニング・コース #1
NodeMインターフェース
Node.jsプロセス
JavaScript
NodeMモジュール
GT.Mプロセス
コール・イン・インターフェース
グローバル 関数 オブジェクト
2016/9/30 6EWD 3 トレーニング・コース #1
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
NodeMインターフェース
Node.js
JavaScript
NodeMモジュール
コール・イン・インターフェース
グローバル 関数 オブジェクト
GT.Mプロセス
2016/9/30 8EWD 3 トレーニング・コース #1
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
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
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
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
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
単純な例
• グローバル・ノードをセットします• すなわち、 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
単純な例
• グローバル・ノードの値を取り出(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
NodeM の API
• データベースの Open と Close
• グローバル・ノードの Set, Get, Kill
• あるノードが存在するかどうかを調べる ($data)
• $order と $query 等価の関数 (順方向と逆方向)
• グローバル・ディレクトリのリストを作る
• グローバル・ノードの値を増やす($increment)
• グローバル・ノードの Lock と Unlock
• グローバルの木構造の一部を他と Merge する
2016/9/30 16EWD 3 トレーニング・コース #1
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
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
NodeM の API
• 非同期と同期• 複数ユーザーのアクセスに単一のNode.jsプロセスを用いる
のなら、非同期APIを用いなくてはなりません
• 同期API• 若干高速
• 利用方法がより簡単で直感的です• コール・バック地獄やPromiseなどを使うのを避けることができます
• ブロッキングI/O
• シングル・ユーザーでテストする以外、 Node.jsではふつう使われません。
... しかし EWD 3 ではこの常識を変えます ...
2016/9/30 19EWD 3 トレーニング・コース #1
top related