SlideShare a Scribd company logo
1 of 16
EWD 3
トレーニング・コース #28
従来のMUMPSコードをewd-xpressと
統合する
M/Gateway Developments Ltd.
Rob Tweed
訳: 日本ダイナシステム株式会社 嶋 芳成
MUMPSコードを統合する
• cache.node の function() API を用います
• function() は、GT.M用の NodeM モジュールでも利用
できます
• MUMPS 外部関数を呼び出します
• Node.js/JavaScript から既存のMUMPSロジック
を呼び出すためには、それ用の外部関数のラッパーを
作る必要があります
EWD 3 トレーニング・コース #28 22016/9/30
関数を呼び出す
var result = this.db.function({
function: ‘myFunc^theRoutine’,
arguments: [arg1, arg2]
});
これは、次のコードと等価
Set result=$$myFunc^theRoutine(arg1,arg2)
EWD 3 トレーニング・コース #28 32016/9/30
function() の結果
• function() の呼び出しによって返される値は、非常
に長い文字列になる可能性があります
• 値を返すには、文字列化された(stringifed)JSONを用い
るかもしれません
• しかしこれには、JSON文字列を生成するために MUMPS の
JSON分析(parser)/生成(generator)プログラムが必要です
• これらは遅くなる傾向があります
• 信頼性が高いとは言えません
EWD 3 トレーニング・コース #28 42016/9/30
function() API の限界
• 引数は単純な変数に制限されます
• 数値または文字列
• 引数は参照渡しでは渡すことができません
• 従って、複雑なデータ構造を関数の引数経由では受け渡
しできません
EWD 3 トレーニング・コース #28 52016/9/30
従来のMUMPSを統合するのは可能か?
• できます!
• MUMPSのラッパー関数と複雑なデータを受け渡しす
るには、一時グローバルを使うという技があります
• cache.node (そしてNodeM)インターフェースが、
Caché (またはGT.M) とインプロセスで稼働していると
いうことを利用します
EWD 3 トレーニング・コース #28 62016/9/30
イン・プロセス連携
EWD 3 トレーニング・コース #28 7
Node.js
cache.node
NodeM
Caché
GT.M
Cコールイン・
インターフェース
2016/9/30
イン・プロセス連携
EWD 3 トレーニング・コース #28 8
Node.js
cache.node
NodeM
Caché
GT.M
Cコールイン・
インターフェース
process.pid $job
1対1対応しています
2016/9/30
イン・プロセス連携
EWD 3 トレーニング・コース #28 9
Node.js
cache.node
NodeM
Caché
GT.M
Cコールイン・
インターフェース
process.pid $job
New this.documentStore.documentNode(‘temp’, [process.pid]) ^temp($job)
これらは同じものを参照しています
2016/9/30
従来のコードを統合する
• Node.js 側では、従来の MUMPS 関数を呼び出す
前に、
• setDocument() を用いて、複雑な入力データを
process.pid を添え字とした一時グローバルに書き込みま
す
例えば、
var myComplexInputData = {//複雑な入力データをここに}
Var temp = new this.documentStore.documentNode(‘temp’, [process.pid]);
Temp.setDocument(myComplexInputData);
// ここでMUMPS関数を呼び出します
Var result = this.db.function({function: ‘myFunc^theRoutine’, arguments:[]});
2016/9/30 EWD 3 トレーニング・コース #28 10
従来のコードを統合する
• MUMPSの関数の中で:
• 複雑な入力データは、^temp($j) とその下位ノードとして
アクセスすることができます
• 従って、^temp($j) を input マージします
new inputs
merge inputs=^temp($j)
• これで複雑な入力データを、関数で取り出すことができ
ました
2016/9/30 EWD 3 トレーニング・コース #28 11
従来のコードを統合する
• MUMPSの関数の中で:
• この入力データを処理するMUMPSコードを呼び出します
• 複雑な出力データを、ローカル配列に入れます
• その配列を一時グローバルに逆にマージします
• 例えば、
new outputs
;出力データをこのoutputという配列に入れ、そして
kill ^temp($j) ;一時グローバルを消去
merge ^temp($j)=outputs
QUIT 1 ;関数が終了した
2016/9/30 EWD 3 トレーニング・コース #28 12
従来のコードを統合する
• Node.js側では
• 一時グローバルから結果を getDocument() を用いて取
り出す
• 一時グローバルのドキュメント・ノードを削除する
• 例えば、
var outputs = temp.getDocument();
temp.delete();
2016/9/30 EWD 3 トレーニング・コース #28 13
従来のコードを統合する
• ewd-xpress は ewd-qoper8 を用いていることを
思い出してください
• これによって cache.node API の同期処理を安全
に利用することができます
• つまり MUMPS 関数を ewd-xpress の中で呼び出
すのは同期処理です
• 従ってあなたの JavaScript のロジックは、MUMPS
関数が終了するまで、続きは待たされます
• MUMPSコード内で HANG したり LOCK で待たされるか
どうかには関わりません
2016/9/30 EWD 3 トレーニング・コース #28 14
従来のコードを統合する (複雑なI/O)
var myComplexInputData = {//複雑な入力データをここに}
var temp = new this.documentStore.documentNode(‘temp’, [process.pid]);
temp.delete(); // ここでは消去する
temp.setDocument(myComplexInputData);
// ここでMUMPS関数を呼び出します
var result = this.db.function({function: ‘myFunc^theRoutine’, arguments:[]});
// MUMPS の関数が終了すると、その出力を処理する
var outputs = temp.getDocument();
temp.delete(); // 一時グローバルを消去する
// MUMPS 関数から出力された複雑な出力データは、これで output オブジェクトに読み込まれま
した
2016/9/30 EWD 3 トレーニング・コース #28 15
従来のコードを統合する (複雑なI/O)
• 対応する MUMPS のラッパー関数
myFunc()
new inputs,outputs
merge inputs=^temp($j)
;従来のMUMPSルーチンや関数などを呼び出す
;inputs を処理し、出力データを outputs配列にセットする
kill ^temp($j)
merge ^temp($j)=outputs
QUIT 1
2016/9/30 EWD 3 トレーニング・コース #28 16

More Related Content

What's hot

闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
 

What's hot (12)

X86opti01 nothingcosmos
X86opti01 nothingcosmosX86opti01 nothingcosmos
X86opti01 nothingcosmos
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
 
Chainer v1.6からv1.7の新機能
Chainer v1.6からv1.7の新機能Chainer v1.6からv1.7の新機能
Chainer v1.6からv1.7の新機能
 
Javaメモリ勉強会
Javaメモリ勉強会Javaメモリ勉強会
Javaメモリ勉強会
 
Elmでjavascript
ElmでjavascriptElmでjavascript
Elmでjavascript
 
PyMC mcmc
PyMC mcmcPyMC mcmc
PyMC mcmc
 
Linuxにおける開発環境
Linuxにおける開発環境Linuxにおける開発環境
Linuxにおける開発環境
 
NanoStrand
NanoStrandNanoStrand
NanoStrand
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
 
vimの話20150111
vimの話20150111vimの話20150111
vimの話20150111
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
Minix Learning
Minix LearningMinix Learning
Minix Learning
 

Viewers also liked

Viewers also liked (9)

EWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化する
EWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化するEWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化する
EWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化する
 
EWD 3トレーニングコース#7 ewd-xpressメッセージ・パターンを適用する
EWD 3トレーニングコース#7 ewd-xpressメッセージ・パターンを適用するEWD 3トレーニングコース#7 ewd-xpressメッセージ・パターンを適用する
EWD 3トレーニングコース#7 ewd-xpressメッセージ・パターンを適用する
 
EWD 3トレーニング・コース #29 ewd-xpress を Linux systemdでサービスとして稼働させる
EWD 3トレーニング・コース #29 ewd-xpress を Linux systemdでサービスとして稼働させるEWD 3トレーニング・コース #29 ewd-xpress を Linux systemdでサービスとして稼働させる
EWD 3トレーニング・コース #29 ewd-xpress を Linux systemdでサービスとして稼働させる
 
EWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップ
EWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップEWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップ
EWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップ
 
EWD 3トレーニングコース#25 GlobalストレージのJavaScript用抽象化-(f) Documentデータベースのできること
EWD 3トレーニングコース#25 GlobalストレージのJavaScript用抽象化-(f) DocumentデータベースのできることEWD 3トレーニングコース#25 GlobalストレージのJavaScript用抽象化-(f) Documentデータベースのできること
EWD 3トレーニングコース#25 GlobalストレージのJavaScript用抽象化-(f) Documentデータベースのできること
 
EWD 3 トレーニング・コース #1 Node.jsとGT.Mの統合方法
EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法EWD 3トレーニング・コース #1 Node.jsとGT.Mの統合方法
EWD 3 トレーニング・コース #1 Node.jsとGT.Mの統合方法
 
EWD 3トレーニング・コース #2 EWD 3 の概要
EWD 3トレーニング・コース #2 EWD 3 の概要EWD 3トレーニング・コース #2 EWD 3 の概要
EWD 3トレーニング・コース #2 EWD 3 の概要
 
GT.M: A Tried and Tested Open-Source NoSQL Database
GT.M: A Tried and Tested Open-Source NoSQL DatabaseGT.M: A Tried and Tested Open-Source NoSQL Database
GT.M: A Tried and Tested Open-Source NoSQL Database
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 

Similar to EWD 3トレーニングコース#28 従来のMUMPSコードをewd-xpressと統合する

SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Y Watanabe
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
Etsuji Nakai
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
kenjis
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud Automation
Etsuji Nakai
 

Similar to EWD 3トレーニングコース#28 従来のMUMPSコードをewd-xpressと統合する (20)

EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化するEWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
 
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化するEWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
EWD 3トレーニングコース#30 ewd-xpressアプリケーションをモジュラー化する
 
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作るEWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
 
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作るEWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
 
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
EWD 3トレーニング・コース #3 EWD 3 モジュールの概要
EWD 3トレーニング・コース #3 EWD 3 モジュールの概要EWD 3トレーニング・コース #3 EWD 3 モジュールの概要
EWD 3トレーニング・コース #3 EWD 3 モジュールの概要
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
EWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップ
EWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップEWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップ
EWD 3トレーニングコース#5 ewd-xpressアプリ開発第1ステップ
 
Maxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミングMaxwell と Java CUDAプログラミング
Maxwell と Java CUDAプログラミング
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介環境構築自動化ツールのご紹介
環境構築自動化ツールのご紹介
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 
Pub/Sub model, msm, and asio
Pub/Sub model, msm, and asioPub/Sub model, msm, and asio
Pub/Sub model, msm, and asio
 
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
 
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
第142回Smalltalk勉強会 - PharoJSで作るWebアプリケーション
 
EWD 3トレーニングコース#3 EWD 3 モジュールの概要
EWD 3トレーニングコース#3 EWD 3 モジュールの概要EWD 3トレーニングコース#3 EWD 3 モジュールの概要
EWD 3トレーニングコース#3 EWD 3 モジュールの概要
 
Personal Cloud Automation
Personal Cloud AutomationPersonal Cloud Automation
Personal Cloud Automation
 

More from Kiyoshi Sawada

More from Kiyoshi Sawada (20)

EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/WebサービスにアクセスするEWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
 
EWD 3トレーニングコース#29 ewd-xpressをWindows上のサービスとして稼働させる
EWD 3トレーニングコース#29 ewd-xpressをWindows上のサービスとして稼働させるEWD 3トレーニングコース#29 ewd-xpressをWindows上のサービスとして稼働させる
EWD 3トレーニングコース#29 ewd-xpressをWindows上のサービスとして稼働させる
 
EWD 3トレーニングコース#27 GlobalストレージのJavaScript用抽象化-(h) EWD 3 セッション
EWD 3トレーニングコース#27 GlobalストレージのJavaScript用抽象化-(h) EWD 3 セッションEWD 3トレーニングコース#27 GlobalストレージのJavaScript用抽象化-(h) EWD 3 セッション
EWD 3トレーニングコース#27 GlobalストレージのJavaScript用抽象化-(h) EWD 3 セッション
 
EWD 3トレーニングコース#26 GlobalストレージのJavaScript用抽象化-(g) イベント駆動の索引管理
EWD 3トレーニングコース#26 GlobalストレージのJavaScript用抽象化-(g) イベント駆動の索引管理EWD 3トレーニングコース#26 GlobalストレージのJavaScript用抽象化-(g) イベント駆動の索引管理
EWD 3トレーニングコース#26 GlobalストレージのJavaScript用抽象化-(g) イベント駆動の索引管理
 
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩くEWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
EWD 3トレーニングコース#24 GlobalストレージのJavaScript用抽象化-(e) ドキュメントの末端ノードを渡り歩く
 
EWD 3トレーニングコース#23 GlobalストレージのJavaScript用抽象化-(d) ノードの範囲を渡り歩く
EWD 3トレーニングコース#23 GlobalストレージのJavaScript用抽象化-(d) ノードの範囲を渡り歩くEWD 3トレーニングコース#23 GlobalストレージのJavaScript用抽象化-(d) ノードの範囲を渡り歩く
EWD 3トレーニングコース#23 GlobalストレージのJavaScript用抽象化-(d) ノードの範囲を渡り歩く
 
EWD 3トレーニングコース#22 GlobalストレージのJavaScript用抽象化-(c) ドキュメントを渡り歩く
EWD 3トレーニングコース#22 GlobalストレージのJavaScript用抽象化-(c) ドキュメントを渡り歩くEWD 3トレーニングコース#22 GlobalストレージのJavaScript用抽象化-(c) ドキュメントを渡り歩く
EWD 3トレーニングコース#22 GlobalストレージのJavaScript用抽象化-(c) ドキュメントを渡り歩く
 
EWD 3トレーニングコース#21 GlobalストレージのJavaScript用抽象化-(b) JavaScriptの永続オブジェクト
EWD 3トレーニングコース#21 GlobalストレージのJavaScript用抽象化-(b) JavaScriptの永続オブジェクトEWD 3トレーニングコース#21 GlobalストレージのJavaScript用抽象化-(b) JavaScriptの永続オブジェクト
EWD 3トレーニングコース#21 GlobalストレージのJavaScript用抽象化-(b) JavaScriptの永続オブジェクト
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
 
EWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化する
EWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化するEWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化する
EWD 3トレーニングコース#18 GlobalストレジでNoSQLデータベースをモデル化する
 
EWD 3トレーニングコース#17 Globalストレジ・データベース入門
EWD 3トレーニングコース#17 Globalストレジ・データベース入門EWD 3トレーニングコース#17 Globalストレジ・データベース入門
EWD 3トレーニングコース#17 Globalストレジ・データベース入門
 
EWD 3トレーニングコース#16 ewd-xpressサービス
EWD 3トレーニングコース#16 ewd-xpressサービスEWD 3トレーニングコース#16 ewd-xpressサービス
EWD 3トレーニングコース#16 ewd-xpressサービス
 
EWD 3トレーニングコース#15 ewd-xpressでjQuery以外のフレームワークを利用する
EWD 3トレーニングコース#15 ewd-xpressでjQuery以外のフレームワークを利用するEWD 3トレーニングコース#15 ewd-xpressでjQuery以外のフレームワークを利用する
EWD 3トレーニングコース#15 ewd-xpressでjQuery以外のフレームワークを利用する
 
EWD 3トレーニングコース#14 ewd-xpressメッセージ用にAjaxを用いる
EWD 3トレーニングコース#14 ewd-xpressメッセージ用にAjaxを用いるEWD 3トレーニングコース#14 ewd-xpressメッセージ用にAjaxを用いる
EWD 3トレーニングコース#14 ewd-xpressメッセージ用にAjaxを用いる
 
EWD 3トレーニングコース#13 全てをひとつにまとめてewd-xpressで稼働させてみる
EWD 3トレーニングコース#13 全てをひとつにまとめてewd-xpressで稼働させてみるEWD 3トレーニングコース#13 全てをひとつにまとめてewd-xpressで稼働させてみる
EWD 3トレーニングコース#13 全てをひとつにまとめてewd-xpressで稼働させてみる
 
EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御
EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御
EWD 3トレーニングコース#12 ewd-xpressのセッション・タイムアウトの制御
 
EWD 3トレーニングコース#11 ewd-xpressでのエラー処理
EWD 3トレーニングコース#11 ewd-xpressでのエラー処理EWD 3トレーニングコース#11 ewd-xpressでのエラー処理
EWD 3トレーニングコース#11 ewd-xpressでのエラー処理
 
EWD 3トレーニングコース#10 ewd-xpressのSessionとユーザー認証
EWD 3トレーニングコース#10 ewd-xpressのSessionとユーザー認証EWD 3トレーニングコース#10 ewd-xpressのSessionとユーザー認証
EWD 3トレーニングコース#10 ewd-xpressのSessionとユーザー認証
 
EWD 3トレーニングコース#9 複雑なewd-xpressメッセージと応答
EWD 3トレーニングコース#9 複雑なewd-xpressメッセージと応答EWD 3トレーニングコース#9 複雑なewd-xpressメッセージと応答
EWD 3トレーニングコース#9 複雑なewd-xpressメッセージと応答
 
EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖
EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖
EWD 3トレーニングコース#8 ewd-xpressメッセージ・サイクルの解剖
 

EWD 3トレーニングコース#28 従来のMUMPSコードをewd-xpressと統合する

  • 1. EWD 3 トレーニング・コース #28 従来のMUMPSコードをewd-xpressと 統合する M/Gateway Developments Ltd. Rob Tweed 訳: 日本ダイナシステム株式会社 嶋 芳成
  • 2. MUMPSコードを統合する • cache.node の function() API を用います • function() は、GT.M用の NodeM モジュールでも利用 できます • MUMPS 外部関数を呼び出します • Node.js/JavaScript から既存のMUMPSロジック を呼び出すためには、それ用の外部関数のラッパーを 作る必要があります EWD 3 トレーニング・コース #28 22016/9/30
  • 3. 関数を呼び出す var result = this.db.function({ function: ‘myFunc^theRoutine’, arguments: [arg1, arg2] }); これは、次のコードと等価 Set result=$$myFunc^theRoutine(arg1,arg2) EWD 3 トレーニング・コース #28 32016/9/30
  • 4. function() の結果 • function() の呼び出しによって返される値は、非常 に長い文字列になる可能性があります • 値を返すには、文字列化された(stringifed)JSONを用い るかもしれません • しかしこれには、JSON文字列を生成するために MUMPS の JSON分析(parser)/生成(generator)プログラムが必要です • これらは遅くなる傾向があります • 信頼性が高いとは言えません EWD 3 トレーニング・コース #28 42016/9/30
  • 5. function() API の限界 • 引数は単純な変数に制限されます • 数値または文字列 • 引数は参照渡しでは渡すことができません • 従って、複雑なデータ構造を関数の引数経由では受け渡 しできません EWD 3 トレーニング・コース #28 52016/9/30
  • 6. 従来のMUMPSを統合するのは可能か? • できます! • MUMPSのラッパー関数と複雑なデータを受け渡しす るには、一時グローバルを使うという技があります • cache.node (そしてNodeM)インターフェースが、 Caché (またはGT.M) とインプロセスで稼働していると いうことを利用します EWD 3 トレーニング・コース #28 62016/9/30
  • 7. イン・プロセス連携 EWD 3 トレーニング・コース #28 7 Node.js cache.node NodeM Caché GT.M Cコールイン・ インターフェース 2016/9/30
  • 8. イン・プロセス連携 EWD 3 トレーニング・コース #28 8 Node.js cache.node NodeM Caché GT.M Cコールイン・ インターフェース process.pid $job 1対1対応しています 2016/9/30
  • 9. イン・プロセス連携 EWD 3 トレーニング・コース #28 9 Node.js cache.node NodeM Caché GT.M Cコールイン・ インターフェース process.pid $job New this.documentStore.documentNode(‘temp’, [process.pid]) ^temp($job) これらは同じものを参照しています 2016/9/30
  • 10. 従来のコードを統合する • Node.js 側では、従来の MUMPS 関数を呼び出す 前に、 • setDocument() を用いて、複雑な入力データを process.pid を添え字とした一時グローバルに書き込みま す 例えば、 var myComplexInputData = {//複雑な入力データをここに} Var temp = new this.documentStore.documentNode(‘temp’, [process.pid]); Temp.setDocument(myComplexInputData); // ここでMUMPS関数を呼び出します Var result = this.db.function({function: ‘myFunc^theRoutine’, arguments:[]}); 2016/9/30 EWD 3 トレーニング・コース #28 10
  • 11. 従来のコードを統合する • MUMPSの関数の中で: • 複雑な入力データは、^temp($j) とその下位ノードとして アクセスすることができます • 従って、^temp($j) を input マージします new inputs merge inputs=^temp($j) • これで複雑な入力データを、関数で取り出すことができ ました 2016/9/30 EWD 3 トレーニング・コース #28 11
  • 12. 従来のコードを統合する • MUMPSの関数の中で: • この入力データを処理するMUMPSコードを呼び出します • 複雑な出力データを、ローカル配列に入れます • その配列を一時グローバルに逆にマージします • 例えば、 new outputs ;出力データをこのoutputという配列に入れ、そして kill ^temp($j) ;一時グローバルを消去 merge ^temp($j)=outputs QUIT 1 ;関数が終了した 2016/9/30 EWD 3 トレーニング・コース #28 12
  • 13. 従来のコードを統合する • Node.js側では • 一時グローバルから結果を getDocument() を用いて取 り出す • 一時グローバルのドキュメント・ノードを削除する • 例えば、 var outputs = temp.getDocument(); temp.delete(); 2016/9/30 EWD 3 トレーニング・コース #28 13
  • 14. 従来のコードを統合する • ewd-xpress は ewd-qoper8 を用いていることを 思い出してください • これによって cache.node API の同期処理を安全 に利用することができます • つまり MUMPS 関数を ewd-xpress の中で呼び出 すのは同期処理です • 従ってあなたの JavaScript のロジックは、MUMPS 関数が終了するまで、続きは待たされます • MUMPSコード内で HANG したり LOCK で待たされるか どうかには関わりません 2016/9/30 EWD 3 トレーニング・コース #28 14
  • 15. 従来のコードを統合する (複雑なI/O) var myComplexInputData = {//複雑な入力データをここに} var temp = new this.documentStore.documentNode(‘temp’, [process.pid]); temp.delete(); // ここでは消去する temp.setDocument(myComplexInputData); // ここでMUMPS関数を呼び出します var result = this.db.function({function: ‘myFunc^theRoutine’, arguments:[]}); // MUMPS の関数が終了すると、その出力を処理する var outputs = temp.getDocument(); temp.delete(); // 一時グローバルを消去する // MUMPS 関数から出力された複雑な出力データは、これで output オブジェクトに読み込まれま した 2016/9/30 EWD 3 トレーニング・コース #28 15
  • 16. 従来のコードを統合する (複雑なI/O) • 対応する MUMPS のラッパー関数 myFunc() new inputs,outputs merge inputs=^temp($j) ;従来のMUMPSルーチンや関数などを呼び出す ;inputs を処理し、出力データを outputs配列にセットする kill ^temp($j) merge ^temp($j)=outputs QUIT 1 2016/9/30 EWD 3 トレーニング・コース #28 16