SlideShare a Scribd company logo
© Hitachi, Ltd. 2016. All rights reserved.
株式会社 日立製作所
2015/1/15
横井 一仁
Node-REDのデザインパターン
© Hitachi, Ltd. 2016. All rights reserved.
Node-RED環境構築手順(Bluemixの場合)
1
(1) Node-REDのインスタンス作成
(1-1) ダッシュボートの「アプリの作成」をクリック (1-2) ウェブアプリケーションを選択
(1-3) ボイラーテンプレート
を選択
(2-1) インスタンスの管理画面から
「サービスまたはAPIの追加」をクリック
(1-4) Node-RED Starter
を選択
(2-2) dashDBを選択
※「Bluemix」、「dashDB」は、 International Business Machines Corporationの登録商標、製品名称です。
(2) データベース(dashDB)とバインド
© Hitachi, Ltd. 2016. All rights reserved.
Node-REDとは
2
処理ノードをGUI上でつなぐ操作で、
簡単にアプリケーションを開発できる開発環境
• コーディング未経験者でも、アプリケーション開発が容易
• 複雑な処理を行いたい場合は、JavaScriptで記述も可能
• PC、タブレットで開発できるため、どこでも開発可能
IoT端末の異常をメール通知
タブレット端末上での編集操作
処理ノード間は、
主に変数msg.payloadを用いて
JSON形式のデータが渡される
フリック入力と似た操作で
編集できる
© Hitachi, Ltd. 2016. All rights reserved.
デザインパターンとは
3
• ソフトウェア設計者が発見し、編み出した設計ノウハウを
蓄積し、名前をつけ、再利用しやすいようにカタログ化したもの。
• 一般にGoFが提唱したオブジェクト指向言語向け23パターンを指す。
ja.wikipedia.org/wiki/デザインパターン_(ソフトウェア)引用: http://
# 分類 パターン
1 生成に関する
パターン
Abstract factory
2 Builder
3 Factory method
4 Prototype
5 Singleton
6 構造に関する
パターン
Adapter
7 Bridge
8 Composite
9 Decorator
10 Facade
11 Flyweight
12 Proxy
# 分類 パターン
13 振る舞いに関する
パターン
Chain of responsibility
14 Command
15 Interpreter
16 Iterator
17 Mediator
18 Memento
19 Observer
20 State
21 Strategy
22 Template method
23 Visitor
© Hitachi, Ltd. 2016. All rights reserved.
Node-REDのデザインパターン
4
Node-REDにおいてもデザインパターンがあると考えカタログ化を実施
• デザインパターンの観点
• Node-REDの開発でよく使われるパターン
• 従来JavaScriptのコードで実装していた処理を、処理ノードの
接続で表現することで、可読性、開発効率を向上させるパターン
• 処理ノードを繋ぎ変えるのみで修正が可能なパターン
(タブレットで開発ができるパターン)
qiita.com/zuhito/items/e9abfd6f1ba188f908ed※ URL: http://
本日は、下の記事で紹介した10個のデザインパターンを説明
「nodered デザインパターン」
でウェブ検索すると
見つかります。
© Hitachi, Ltd. 2016. All rights reserved.
Node-REDのデザインパターン
5
# パターン名 パターンの説明
使用頻度
高
ノード接続
を活用
タッチUIで
修正可
1 Store & Search データ格納、検索を行うパターン ◎
2 UI & API
ブラウザで受け付けた値を用いAPIを問
合せ、結果をブラウザ表示するパターン
◎
3 Timeout
処理時間が一定時間を越えた場合、
タイムアウトさせるパターン
◎ ○
4 while 繰り返し処理を行うパターン ○ ◎ ○
5 Sequence
複数の処理ノードから取得した値を
集計するパターン
○
6 Aggregator
複数の処理ノードから取得した値を
集計するパターン
○
7 Separator
1つの処理ノードから複数の異なる
値を出力するパターン
○
8 MapReduce MapReduce処理を行うパターン ○
9 Matcher
ネットワーク上を探索し、入力値が
条件に合致するか判定するパターン
◎
10 State 状態遷移を扱うパターン ○ ○
※◎: 特に該当、○: 該当
© Hitachi, Ltd. 2016. All rights reserved.
Node-REDの開発環境
6
デバッグ画面
デプロイボタン
使用可能な
処理ノード一覧
開発で使用する処理ノードを
配置する場所
© Hitachi, Ltd. 2016. All rights reserved.
デザインパターンの説明で使用する処理ノード
7
※ノードの色やアイコンが同じでも、左右の接続の有無で機能が異なる点に注意。
# 処理ノード 説明
1 inject クリックを契機として処理を開始する。
2 debug 前の処理ノードから渡された値をデバッグ画面に出力する。
3 http、
http response
HTTPサーバとして機能させる。(始点httpノードと、
終点http responseノードを組み合わせて使用する)
4 DB
DBを問い合わせる。
5 http request REST APIを問い合わせる。
6 function JavaScriptでコードを記述する。
7 template 定型文を定義する。
8 switch 条件分岐を行う。
9 delay 指定時間遅延させて、後続の処理ノードを実行する。
10 change 変数の削除等を行う。
11 comment コメント文を記載する。
© Hitachi, Ltd. 2016. All rights reserved.
ソースコードのインポート方法
8
[1] ソースコードをコピー [2] Node-RED開発環境の右上メニューの
Import→Clipboardから貼り付け
※ dashDB等、ソースコードをインポートしただけでは使用できない処理ノードもある。
dashDBノードはインポート後、プロパティからDBを選択する必要がある。
© Hitachi, Ltd. 2016. All rights reserved.
1. Store & Searchパターン
9
データをデータベースへ格納し、検索するパターン
• Storeパターンは、functionノードを用いてデータの選択と
格納する列名の指定を行い、後続のDBノードでデータを格納する。
• Searchパターンは、DBノードでSQL文を実行し、
検索結果を後続のdebugノードへ渡す。
© Hitachi, Ltd. 2016. All rights reserved.
1. Store & Searchパターン
10
列DATA
タイムスタンプ1
タイムスタンプ2
表TMP
格納
[1] injectノードのクリックを契機として、
タイムスタンプを表へ追記
• プログラム例(タイムスタンプを格納、検索)
検索
[2] injectノードのクリックを契機として、
表の内容をログ画面に出力
列DATA
タイムスタンプ1
タイムスタンプ2
タイムスタンプ3
表TMP
タイムスタンプ3“Tue Dec 22 2015 13:37:10”
現在の時刻
© Hitachi, Ltd. 2016. All rights reserved.
1. Store & Searchパターン
11
(2) Deploy後、表作成を実行
(デバッグ画面に[]が
出力されれば作成成功)
(1) 表を作成するCREATE TABLE文を定義
Service: dashDB-xx
Query: CREATE TABLE TMP (DATA VARCHAR(255));
• タイムスタンプ格納用の表を作成
↑左右に接続があるdashDBノード
※参考: 表を削除
(4) Deploy後、表削除を実行
(デバッグ画面に[]が
出力されれば削除成功)
(3) 表を削除するDROP TABLE文を定義
Service: dashDB-xx
Query: DROP TABLE TMP;
© Hitachi, Ltd. 2016. All rights reserved.
1. Store & Searchパターン
12
(4)SELTCT文を定義
Service: dashDB-xx
Query: SELECT * FROM TMP;
(2)格納先テーブルを登録
Service: dashDB-xx
Table: TMP
(1) タイムスタンプを列DATAに格納すると定義
Function:
(3) Deploy後、
タイムスタンプ格納を実行
(デバッグ画面の出力なし)
(5) Deploy後、検索を実行
(デバッグ画面に
検索結果が出力される)
• Storeパターンのデータ格納を複数回実行した後、Searchパターンを
実行すると、格納したタイムスタンプがデバッグ画面へ出力される。
• Storeパターンを用いて、タイムスタンプを格納
• Searchパターンを用いて、タイムスタンプを検索
msg.payload = {DATA: new Date(msg.payload).toString()};
return msg;
左のみ接続があるdashDBノード↑
© Hitachi, Ltd. 2016. All rights reserved.
2. UI & APIパターン
13
ブラウザで入力を受け付け、API問合せと結果表示を行うパターン
• 1つ目のUIパターンは、入力フォームHTMLをブラウザへ表示し、
ユーザから入力値を受け取る。
• 2つ目のUIパターンは、APIを問い合わせた結果を
格納した出力HTMLをブラウザへ表示する。
• APIパターンは、GETパラメータに指定された値を用いて、
検索等の処理を行い、その結果を返すREST API。
© Hitachi, Ltd. 2016. All rights reserved.
2. UI & APIパターン
14
• プログラム例(指定した表の行数を表示)
入力フォーム
出力結果
[1]表名を入力
[4] 指定した表の行数を表示
[2]送信をクリック
[3] REST APIを問い合わせて、
SELECT COUNT(*) FROM TMPを実行
© Hitachi, Ltd. 2016. All rights reserved.
2. UI & APIパターン
15
• ブラウザでhttp://
にアクセスし、表の行数が表示されれば成功
• APIパターン(引数qに指定したテーブルの行数を検索)
(1)APIのURL登録
URL: /api
(2)HTTP GETの引数qを用いてSQL文作成
Template:
(3)検索テーブルを登録
Service: dashDB-xxSELECT COUNT(*) FROM {{payload.q}};
※ dashDBノードに直接SQL文を記述する方法は、表名を変数として使用
できないため、Templateノードで作成したSQL文をdashDBノードへ渡した。
<アプリ名>.mybluemix.net/api?q=TMP
表の行数
© Hitachi, Ltd. 2016. All rights reserved.
2. UI & APIパターン
16
• ブラウザでhttp://
にアクセスし、入力フォームが表示されれば成功
• UIパターン(入力フォーム)
(1) URLを登録
URL: /input
(2) 入力フォームのHTMLを記述
Template: <FORM action=output>
テーブル名:
<INPUT type=text name=q>
<INPUT type=submit>
</FORM>
<アプリ名>.mybluemix.net/input
※ 説明簡略化のため、HTMLの<HTML>、<BODY>タグ等の記述は省略
© Hitachi, Ltd. 2016. All rights reserved.
2. UI & APIパターン
17
• UIパターン(出力HTML)
(1) URLを登録
URL: /output
(2) 問い合わせ用のURLを作成
Function:
(4) 変数msg.headersを削除
Rules: Delete msg.headers
(http request実行後は、Content-Typeが
JSONであるため)
(5) 出力HTMLを記述
Template:
• 入力フォームで表名TMPを入力し、行数が表示されれば成功
<HTML><BODY>
テーブルの行数は{{payload.1}}です。
</BODY></HTML>
msg.url = msg.req.host + "/api?q=" + encodeURI(msg.payload.q);
return msg;
(3) 問合せ結果の
形式をJSONに変更
Return:
a parsed JSON object
© Hitachi, Ltd. 2016. All rights reserved.
3. Timeoutパターン
18
処理に時間がかかる場合や、処理が停止した場合、
タイムアウト処理を行うパターン
• 処理に時間がかかった場合、タイムアウト表示処理を
先に実行するようにする。
• UIパターンにて、ノード間の処理が進まないと、ユーザは
長時間待たされるため、タイムアウト処理を入れると良い。
上の処理(青)に時間がかかった場合、
下の処理(赤)が先回りする。
© Hitachi, Ltd. 2016. All rights reserved.
3. Timeoutパターン
19
入力フォーム(存在しない表名を指定)
出力結果(正常処理)
• 従来のUI&APIパターンの処理
(表が存在しないとユーザは長時間待たされ、エラーが返る)
API問合せ時間が5秒以上
(存在しない表名を指定)
API問合せが5秒以内
(表名TMPを指定)
出力結果(タイムアウト時)
• プログラム例
(APIが応答しない場合、タイムアウトメッセージを表示)
3分程
経過後
出力結果(エラー)
入力フォーム
© Hitachi, Ltd. 2016. All rights reserved.
3. Timeoutパターン
20
• Timeoutパターン(httpノードと http responseノードの間に、
delayノードと templateノードを追加)
(2) タイムアウト時に表示するHTMLを記述
Template:
<HTML><BODY>タイムアウトしました。</BODY></HTML>
(1) delayノードを追加
(デフォルト待ち時間5秒)
入力フォーム
5秒
経過後
出力結果
• 存在しない表名(TMP以外)を指定し、
5秒後にタイムアウトの表示されれば成功
© Hitachi, Ltd. 2016. All rights reserved.
4. whileパターン
21
繰り返し処理を実現するパターン
• 以下の様なwhile文のコードをノードの接続関係で表現
• 定型のwhileパターンを用いることでノード接続変更の操作だけで、
既存の処理を繰り返し処理に対応させることができる。
var i = 0;
while (i < 4) {
console.log(i + "回目");
i++;
}
console.log("ループ完了");
© Hitachi, Ltd. 2016. All rights reserved.
4. whileパターン
22
• プログラム例(1回のinject実行で4回デバッグメッセージを表示)
• whileパターン (4)値iをインクリメント
Function: msg.i++;
return msg;
(3)メッセージを記述
Template: {{i}}回目
(1)初期値i=0を設定
Template: 0
Property: msg.i
(2)ループ条件を設定
Property: msg.i
条件: < 4 → 1
otherwise → 2
(5)メッセージを記述
Template: ループ終了
Injectノードを
クリック
出力結果
(4回デバッグを表示)
© Hitachi, Ltd. 2016. All rights reserved.
4. whileパターン
23
• 参考: whileパターンの応用
• 配列の長さ分、繰り返し処理をしたい場合
→ switchノードは変数を条件に指定できないため、条件文をi!=0とし定数化。
→ この変更に伴い、iの初期値を配列の長さとし、デクリメントでループさせる。
• 従来の処理を繰り返し処理に対応させたい場合
→ 配列のi番目のデータをpayloadに格納し、
後続の処理として従来処理を挿入する。
• 繰り返し処理で得た結果を、ループ後の処理で利用したい場合
→ 一時的にデータを退避するSequenceパターン(後述)を用いる。
条件文をi!=0にする
Sequenceパターンを
用いて処理結果を
別変数へ退避
Sequenceパターンを用いて退避した値を呼び出す
qiita.com/zuhito/items/ed5f505edaac2baeadd9
文字列内の各単語用いてREST APIを問い合わせる処理
http://
変数iをデクリメント
変数iの初期値を
配列の長さにする
配列のi番目のデータをpayloadに格納
© Hitachi, Ltd. 2016. All rights reserved.
5. Sequenceパターン
24
複数の処理ノードから得た値を集計するパターン
• 処理ノードを経由すると、変数payloadの値は上書きされるため、
後続の処理ノード(集計処理など)で必要となる値を、
一時的に他の変数に格納する。
• 集計を行う処理ノードで、一時的に格納した変数を呼び出す。
© Hitachi, Ltd. 2016. All rights reserved.
5. Sequenceパターン
25
• プログラム例(451+326=777を計算)
• 1つ目のfunctionノードがmsg.payloadに451を返す。
• 2つ目のfunctionノードがmsg.payloadに326を返す。
• 集計を行うfunctionノードが2つの値の和を求める。
Injectノードを
クリック
出力結果
© Hitachi, Ltd. 2016. All rights reserved.
5. Sequenceパターン
26
(2)値を一時変数tmpへ退避する処理を記述
Function: msg.tmp = msg.payload;
return msg;
(3)値326を返す処理を記述
Function: msg.payload = 326;
return msg;
(4)2つの値の和を計算する処理を記述
Function: msg.payload = msg.tmp + msg.payload;
return msg;
(1)値451を返す処理を記述
Function: msg.payload = 451;
return msg;
• Sequenceパターン
© Hitachi, Ltd. 2016. All rights reserved.
6. Aggregatorパターン
27
複数の処理ノードから得た値を集計するパターン
• 集計する値と数を管理するため、
グローバル変数context.globalを用いる。
• 集計を行うfunctionノードは、指定した数の入力を受け取った後、
後続の処理ノードに処理を渡す(return msg;を実行した時のみ
処理を引き継ぐ仕様を活用)。
• Sequenceパターンと比較すると、どの処理ノードの結果を
集計しているか、視覚的に分かりやすい。
© Hitachi, Ltd. 2016. All rights reserved.
6. Aggregatorパターン
28
• プログラム例(451+326=777を計算)
• 1つ目のfunctionノードがmsg.payloadに451を返す。
• 2つ目のfunctionノードがmsg.payloadに326を返す。
• 集計を行うfunctionノードが2つの値の和を求める。
Injectノードを
クリック
出力結果
※Sequenceパターンのプログラム例と同じ
© Hitachi, Ltd. 2016. All rights reserved.
6. Aggregatorパターン
29
• Aggregatorパターン
(4) グローバル変数に入力数定義、
データ格納先を用意する処理を参照
Function:
// グローバル変数に入力数を定義
context.global.n = 2;
// グローバル変数のデータ格納先を用意
context.global.data = new Array(2);
return msg;
(5) 2つの値の和を計算する処理を参照
Function:
//入力数を1減らす
context.global.n--;
// 値をデータ格納先に一時保存
context.global.data[context.global.n] = msg.payload;
// 定義した入力数に達した場合に、和を求めreturn
if (context.global.n === 0) {
var sum = 0;
for (var i = 0; i < context.global.data.length; i++) {
sum += context.global.data[i];
}
msg.payload = sum;
return msg;
}
(1) デザインパターンのページからAggregator
パターンのソースコードを貼り付ける。
(2)値451を返す処理を参照
Function: msg.payload = 451;
return msg;
(3)値326を返す処理を参照
Function: msg.payload = 326;
return msg;
© Hitachi, Ltd. 2016. All rights reserved.
7. Separatorパターン
30
1つのfunctionノードから2つの異なる値を出力するパターン
• functionノードのreturnをサイズ2の配列にし、
その配列の中に出力したい値を格納する。
• functionノードの出力数(Outputsの値)を2に設定する。
© Hitachi, Ltd. 2016. All rights reserved.
7. Separatorパターン
31
(1) 異なる2値を出力するよう記述
Outputs: 2
Function: msg.payload = 451; // 1つ目の出力を格納
var msg2 = {};
msg2.payload = 326; // 2つ目の出力を格納
return [msg, msg2]; // サイズ2の配列をretrun
• プログラム例(451と326を出力)
• 1つ目の出力のmsg.payloadに451を返す。
• 2つ目の出力のmsg.payloadに326を返す。
• Separatorパターン
Injectノードを
クリック
出力結果
(2つの値を出力)
© Hitachi, Ltd. 2016. All rights reserved.
8. MapReduceパターン
32
MapReduce処理を実現するパターン
• SeparatorパターンとAggregatorパターンを組み合わせたパターン
• MapとReduceの間のデータ転送処理をノード接続で記述
• MapReduceを理解するのに向いている(性能向上は期待できない)
• Map、Reduceの数を変更する場合は、手作業で増やす必要がある。
© Hitachi, Ltd. 2016. All rights reserved.
8. MapReduceパターン
33
• プログラム例(ワードカウント)
• Map処理: テキストデータを入力とし、単語(Key)とその単語の
出現頻度(Value)のペアをReduce処理へ渡す。
• Shuffle処理: Map処理がデータを受け渡すReducerは、Keyの値を基に
決定する。(今回は単語の先頭文字で決定)
• Reduce処理: 同じ単語(Key)の出現頻度(Value)の和を計算する。
入力データ
Map処理
Map処理
Map処理
Reduce処理
Reduce処理
<this,1>,<pen, 1>
This is a pen.
Give me a pen.
This pen is small.
<is, 2>,<give, 1>,
<me, 1>,<a, 2>
<this, 2>,<pen, 3>,
<small, 1>
出力結果
<is,1>,<a, 1>
© Hitachi, Ltd. 2016. All rights reserved.
8. MapReduceパターン
34
(3) Map処理を参照
Outputs: 2
Function:
var input = msg.payload.toLowerCase()
.replace( /.$/, “”).split(/ |, /);
var key_value = [];
for (var i=0; i<input.length; i++){
var key = input[i];
if (key in key_value)
{
key_value[key]++;
} else {
key_value[key] = 1;
}
}
var key1_value = [];
var key2_value = [];
for (var key in key_value){
if (‘a’<=key[0] && key[0]<=‘m’)
{
key1_value.push([key,k ey_value[key]]);
} else {
key2_value.push([key, key_value[key]]);
}
}
msg.payload = key1_value;
var msg2 = {};
msg2.payload = key2_value;
return [msg, msg2];
(2) Map数の定義を参照
Function:
var map = 3; // Map数を定義
context.global.n1 = map;
context.global.data1 = new Array(map);
context.global.n2 = map;
context.global.data2 = new Array(map);
return msg;
(4) Reduce処理を参照
Function:
// 入力数を減らす
context.global.n1--;
// msg.payloadのデータを格納
context.global.data1[context.global.n1] = msg.payload;
// 定義した入力数が来たら、集計処理を行い、msg.payloadを返す
if (context.global.n1 === 0){
// msg.payloadの合計値を算出
var tmp = [];
for (var i=0; i<context.global.data1.length; i++) {
var input = context.global.data1[i];
for (var j=0; j<input.length; j++) {
var key = input[j][0];
var value = input[j][1];
if (key in tmp) {
tmp[key] += value;
} else {
tmp[key] = value;
}
}
}
var output = [];
for (var key in tmp) {
output.push([key, tmp[key]]);
}
msg.payload = output;
return msg;
}
出力結果
(1) デザインパターンのページからMapReduce
パターンのソースコードを貼り付ける。
(5) ワードカウント
を実行
© Hitachi, Ltd. 2016. All rights reserved.
8. MapReduceパターン
35
• MapReduceパターンの編集(Map処理を4つに変更)
(2) 入力データ(templateノード)と
Map処理をコピー&接続
(1) Map数を3から4に変更
Function:
var map = 4; // Map数を定義
context.global.n1 = map;
context.global.data1 = new Array(map);
context.global.n2 = map;
context.global.data2 = new Array(map);
return msg;
(3) Map処理の2出力を
2つのReduce処理へ接続
(前処理結果から“this”、”pen”、
”is”、”small”の値が1ずつ増加)
出力結果
© Hitachi, Ltd. 2016. All rights reserved.
9. Matcherパターン
36
処理ノードのネットワークを探索し、入力値が条件に合致するか判定するパターン
• 各functionノードは、条件に合致した場合のみ通過し、後続のノードに処理を渡す。
• 全体の条件に合致している場合は、functionノードから成るネットワーク上から
出力が得られる。
• 後から全体の条件を修正したい場合は、ノードの接続を変更するのみで修正可
(タブレット上の操作のみで修正可)
© Hitachi, Ltd. 2016. All rights reserved.
9. Matcherパターン
37
• プログラム例(英文の文型判定)
英文を入力とする
Injectノードを順にクリック
出力結果
(文型の判定結果)
© Hitachi, Ltd. 2016. All rights reserved.
9. Matcherパターン
38
• Matcherパターン
(1) デザインパターンのページから、
Matcherパターンのソースコードを貼り付ける。
(2) 各英文をクリックすると、
文型の判定結果が出力される。
© Hitachi, Ltd. 2016. All rights reserved.
9. Matcherパターン
39
• Matcherパターンの編集
(主語に”冠詞 形容詞 名詞”の並びを許可する条件に変更)
(1) 主語に“冠詞 形容詞 名詞”を含む文を追加
Payload: string
The tall man walked.
(2) 他の形容詞のノードをコピー&ペーストし、
冠詞と名詞の間に挿入
© Hitachi, Ltd. 2016. All rights reserved.
10. Stateパターン
40
状態遷移を表現するパターン
• 状態を表すfunctionノードと、
遷移先を決定するswitchノードから成る。
(functionノードとswitchノードの内容は、全て同じ)
• 遷移のノード接続のみで、状態遷移を記述できる。
© Hitachi, Ltd. 2016. All rights reserved.
10. Stateパターン
41
• プログラム例(状態遷移表)
• 文字列を検査するための状態遷移表(状態aが開始点)
• 以下のうち、不合格(状態e)になる文字列はどれか判定する。
(ア) 0101 (イ) -1 (ウ) 12.2 (エ) 4.5.1 (オ) 451+
文字
符号 数字 小数点
現在の
状態
a a b e
b e b c
c e d e
d e d e
© Hitachi, Ltd. 2016. All rights reserved.
10. Stateパターン
42
(2) Switchノードに変数msg.cを渡す処理を参照
Function: var input = msg.payload;
var len = input.length;
if (msg.i == null) {
msg.i = 0;
} else {
msg.i++;
}
msg.c = input.charAt(msg.i);
msg.state = msg.i + "回目: 状態=a, 文字=" + msg.c;
if (msg.i < len) {
return msg;
}
(1) デザインパターンのページから、
Stateパターンのソースコードを
貼り付ける。
(3)遷移先条件を参照
Property: msg.c
条件:
matches regex +|- → 1
matches regex d → 2
== . → 3
(4) 各入力を
クリック
(判定結果が
出力される)
© Hitachi, Ltd. 2016. All rights reserved.
参考ページ
43
• Storeパターン
• ラズパイの情報をMQTT経由で取得し、dashDBに格納する例
• UI & APIパターン
• ブラウザの入力フォームから、Watson APIを問い合わせ、
結果を表示する例
dotnsf.blog.jp/archives/1047589155.html
「Node-RED(QuickStart) のデータを dashDB に格納する」
http://
qiita.com/KenichiSekine/items/7005df36093fabf00b41
「BluemixのNode-REDで簡単Webアプリ開発」
http://
© Hitachi, Ltd. 2016. All rights reserved.
まとめ
44
• Node-REDのデザインパターン10個を紹介
• 特にStore&Search~Sequenceパターンは実開発で有用
• Node-REDはハッカソンや実証実験など短時間の開発に向いている。
• 複雑な処理がカプセル化されているため、迅速に開発できる。
• DB、UI、API、ロジックなどのチームの役割分担が明確である。
• 役割毎に開発したプログラムをマージすることも容易である。
デザインパターンは、チーム開発時の共通認識、
共通言語として重要となると考える。
© Hitachi, Ltd. 2015. All rights reserved.
株式会社 日立製作所
Node-REDのデザインパターン
2015/1/15
横井 一仁
END
45

More Related Content

What's hot (20)

PDF
Node-REDのフローをバックアップしよう
Kota Suizu
 
PPTX
Relationship betweenddd and mvc
Takao Tetsuro
 
PDF
コンテナ今昔物語_2021_12_22
勇 黒沢
 
PPTX
【検証してみた】いま話題のVMware on IBM Cloud SoftLayer 配布版
Hayama Kyouhei
 
PDF
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
NTT DATA Technology & Innovation
 
PDF
コンテナ導入概要資料2018
Masahito Zembutsu
 
PDF
1891件以上のカーネルの不具合修正に貢献した再現用プログラムを自動生成するsyzkallerのテスト自動化技術(NTT Tech Conference ...
NTT DATA Technology & Innovation
 
PDF
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
MorioImai
 
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
NTT DATA Technology & Innovation
 
PPTX
LinAction Theme Docker
cyberblack28 Ichikawa
 
PPTX
【たぶん日本初導入!】Azure Stack Hub with GPUの性能と機能紹介
NTT Communications Technology Development
 
PDF
Tech Dojo 02/09 IBM Japan CSM
勇 黒沢
 
PDF
.NET Micro Framework (プラレールと電子工作)
Akira Hatsune
 
PDF
DevOpsに求められる様々な技術とその連携の学習方法
CASAREAL, Inc.
 
PDF
JSUG20171027-spfingboot-k8s-ocp
Nobuhiro Sue
 
PDF
Node red for-collecting_information
Harada Kazuki
 
PDF
[Interact 2018] 別視点からのハイパーコンバージドインフラ ~ ソフトウェアによる華麗な “ものづくり“ の世界
Daichi Ogawa
 
PDF
Cocos2d-xの深層 Cocos2d-x組み込みによるピュアAndroid/iOSアプリの外科手術的統合
gree_tech
 
PDF
怖くないブランチ開発外部公開用
CROOZ, inc.
 
PPTX
祝GA、 Service Fabric 概要
Takekazu Omi
 
Node-REDのフローをバックアップしよう
Kota Suizu
 
Relationship betweenddd and mvc
Takao Tetsuro
 
コンテナ今昔物語_2021_12_22
勇 黒沢
 
【検証してみた】いま話題のVMware on IBM Cloud SoftLayer 配布版
Hayama Kyouhei
 
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
NTT DATA Technology & Innovation
 
コンテナ導入概要資料2018
Masahito Zembutsu
 
1891件以上のカーネルの不具合修正に貢献した再現用プログラムを自動生成するsyzkallerのテスト自動化技術(NTT Tech Conference ...
NTT DATA Technology & Innovation
 
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
MorioImai
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
NTT DATA Technology & Innovation
 
LinAction Theme Docker
cyberblack28 Ichikawa
 
【たぶん日本初導入!】Azure Stack Hub with GPUの性能と機能紹介
NTT Communications Technology Development
 
Tech Dojo 02/09 IBM Japan CSM
勇 黒沢
 
.NET Micro Framework (プラレールと電子工作)
Akira Hatsune
 
DevOpsに求められる様々な技術とその連携の学習方法
CASAREAL, Inc.
 
JSUG20171027-spfingboot-k8s-ocp
Nobuhiro Sue
 
Node red for-collecting_information
Harada Kazuki
 
[Interact 2018] 別視点からのハイパーコンバージドインフラ ~ ソフトウェアによる華麗な “ものづくり“ の世界
Daichi Ogawa
 
Cocos2d-xの深層 Cocos2d-x組み込みによるピュアAndroid/iOSアプリの外科手術的統合
gree_tech
 
怖くないブランチ開発外部公開用
CROOZ, inc.
 
祝GA、 Service Fabric 概要
Takekazu Omi
 

Viewers also liked (10)

PDF
雑兵MeetUp #1 LT資料
Taku SHIMIZU
 
PPTX
IBM Bluemix Node-REDを使って簡単アプリ作成を体験する
Masaya Fujita
 
PDF
グループ会社を巻き込んで勉強会をやってみるには
Kazuto Kusama
 
PDF
Sphinxで社内勉強会(Git)の
資料を作ってみた
Taku SHIMIZU
 
PDF
ユーザー体験を盛り上げるアプリとBluemix
BMXUG
 
PDF
入門Ansible(未発表箇所)
Taku SHIMIZU
 
PDF
DALI初心者向け説明資料
Takahiro Nakahata
 
PPT
Bluemix node red-part iii
Joseph Chang
 
PDF
Docker PaaSとしての OpenShift, Deis, Flynn比較
Kazuto Kusama
 
PPTX
Muerte fetal in utero
Euni Ruiz
 
雑兵MeetUp #1 LT資料
Taku SHIMIZU
 
IBM Bluemix Node-REDを使って簡単アプリ作成を体験する
Masaya Fujita
 
グループ会社を巻き込んで勉強会をやってみるには
Kazuto Kusama
 
Sphinxで社内勉強会(Git)の
資料を作ってみた
Taku SHIMIZU
 
ユーザー体験を盛り上げるアプリとBluemix
BMXUG
 
入門Ansible(未発表箇所)
Taku SHIMIZU
 
DALI初心者向け説明資料
Takahiro Nakahata
 
Bluemix node red-part iii
Joseph Chang
 
Docker PaaSとしての OpenShift, Deis, Flynn比較
Kazuto Kusama
 
Muerte fetal in utero
Euni Ruiz
 
Ad

Similar to 20160115nodered design patterns (20)

PDF
HBaseCon 2012 参加レポート
NTT DATA OSS Professional Services
 
PDF
Synquery ja
EastCloud
 
PDF
Low-Codeプログラミングシステム Node-REDとその応用
HiroyasuNishiyama1
 
PDF
DSL駆動によるクラウド・アプリケーション開発
Tomoharu ASAMI
 
PDF
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
Tomoharu ASAMI
 
PDF
Spring3.1概要x di
Yuichi Hasegawa
 
PPTX
Hadoop scr第7回 hw2011フィードバック
AdvancedTechNight
 
PDF
クラウドセキュリティ基礎
Masahiro NAKAYAMA
 
PDF
IoT時代におけるストリームデータ処理と急成長の Apache Flink
Takanori Suzuki
 
PDF
【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう(Adapter・Factory Method・Singleton).pdf
耕二 阿部
 
PDF
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Shinpei Ohtani
 
PDF
Hyperledger Fabric 1.0 概要
LFDT Tokyo Meetup
 
PDF
Astah UML/ER/mindmapping modeling tool Introduction
Kenji Hiranabe
 
PDF
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Tomoharu ASAMI
 
PPT
Asakusa Enterprise Batch Processing Framework for Hadoop
Takashi Kambayashi
 
PPTX
まだプログラム手で書いて消耗してるの?~入出力例からプログラムを自動生成する技術~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
NTT DATA Technology & Innovation
 
PDF
ケーススタディ/実装 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第46回】
Tomoharu ASAMI
 
KEY
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
 
PPTX
ビッグデータ&データマネジメント展
Recruit Technologies
 
HBaseCon 2012 参加レポート
NTT DATA OSS Professional Services
 
Synquery ja
EastCloud
 
Low-Codeプログラミングシステム Node-REDとその応用
HiroyasuNishiyama1
 
DSL駆動によるクラウド・アプリケーション開発
Tomoharu ASAMI
 
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
Tomoharu ASAMI
 
Spring3.1概要x di
Yuichi Hasegawa
 
Hadoop scr第7回 hw2011フィードバック
AdvancedTechNight
 
クラウドセキュリティ基礎
Masahiro NAKAYAMA
 
IoT時代におけるストリームデータ処理と急成長の Apache Flink
Takanori Suzuki
 
【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう(Adapter・Factory Method・Singleton).pdf
耕二 阿部
 
Amazon Elastic MapReduce@Hadoop Conference Japan 2011 Fall
Shinpei Ohtani
 
Hyperledger Fabric 1.0 概要
LFDT Tokyo Meetup
 
Astah UML/ER/mindmapping modeling tool Introduction
Kenji Hiranabe
 
Object-Functional Analysis and Design : 次世代モデリングパラダイムへの道標
Tomoharu ASAMI
 
Asakusa Enterprise Batch Processing Framework for Hadoop
Takashi Kambayashi
 
まだプログラム手で書いて消耗してるの?~入出力例からプログラムを自動生成する技術~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
NTT DATA Technology & Innovation
 
ケーススタディ/実装 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第46回】
Tomoharu ASAMI
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
linzhixing
 
ビッグデータ&データマネジメント展
Recruit Technologies
 
Ad

More from BMXUG (20)

PDF
Node-REDのノード開発容易化ツール Node generator
BMXUG
 
PDF
無料で使える画像認識、Watson Visual Recognitionで遊んでみよう
BMXUG
 
PDF
Bluemixで実現する高速CMS環境と活用方法
BMXUG
 
PDF
Kubernets on IBM Cloud + DevOps
BMXUG
 
PDF
Bluemix(Node-RED)を使った空間の付加価値提案
BMXUG
 
PDF
基幹系システム基盤としてのIBM Bluemix - 避けて通れない高可用性の実現
BMXUG
 
PDF
Kubernetes+Ansibleでつくる最新Linuxディストリビューション開発環境
BMXUG
 
PDF
Rancher 2.0 Technical Preview & Bluemix Kubernetes Cluster Import
BMXUG
 
PDF
(きっと)あなたにも出来る!Hyperledger Composer でブロックチェーンアプリを動かしてみた
BMXUG
 
PDF
初めてのWatson Build Challenge
BMXUG
 
PDF
DSXでデータ・サイエンス
BMXUG
 
PDF
【大阪】Bluemix勉強会 - Watson ハンズオン -
BMXUG
 
PDF
Watsonを使ってAIアプリを作ってみよう!-ハンズオン-
BMXUG
 
PDF
SNS映えする「素敵ぶるみ女子」に近づくために知っておきたい盛りテク
BMXUG
 
PDF
Bluemixの概要とアプリの作り方
BMXUG
 
PDF
Node-REDのロードマップや見どころ
BMXUG
 
PPTX
Watsonでメール監視
BMXUG
 
PDF
よく見てワトソン!
BMXUG
 
PDF
ふぁ!?フォトソン君
BMXUG
 
PPT
みまもりWATニャン
BMXUG
 
Node-REDのノード開発容易化ツール Node generator
BMXUG
 
無料で使える画像認識、Watson Visual Recognitionで遊んでみよう
BMXUG
 
Bluemixで実現する高速CMS環境と活用方法
BMXUG
 
Kubernets on IBM Cloud + DevOps
BMXUG
 
Bluemix(Node-RED)を使った空間の付加価値提案
BMXUG
 
基幹系システム基盤としてのIBM Bluemix - 避けて通れない高可用性の実現
BMXUG
 
Kubernetes+Ansibleでつくる最新Linuxディストリビューション開発環境
BMXUG
 
Rancher 2.0 Technical Preview & Bluemix Kubernetes Cluster Import
BMXUG
 
(きっと)あなたにも出来る!Hyperledger Composer でブロックチェーンアプリを動かしてみた
BMXUG
 
初めてのWatson Build Challenge
BMXUG
 
DSXでデータ・サイエンス
BMXUG
 
【大阪】Bluemix勉強会 - Watson ハンズオン -
BMXUG
 
Watsonを使ってAIアプリを作ってみよう!-ハンズオン-
BMXUG
 
SNS映えする「素敵ぶるみ女子」に近づくために知っておきたい盛りテク
BMXUG
 
Bluemixの概要とアプリの作り方
BMXUG
 
Node-REDのロードマップや見どころ
BMXUG
 
Watsonでメール監視
BMXUG
 
よく見てワトソン!
BMXUG
 
ふぁ!?フォトソン君
BMXUG
 
みまもりWATニャン
BMXUG
 

Recently uploaded (9)

PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
PPTX
新卒・中途採用者向け採用ピッチ資料2025年7月版(20250702).pptx
Official74
 
PDF
第3回デジタル理学療法学会のシンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」での話題提供
Matsushita Laboratory
 
PDF
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
 
PDF
go tool と Minimal Version Selection アルゴリズム
Keisuke Ishigami
 
PDF
漁船に搭載されている電子装備と漁法について_VRC海洋学研究会_海のLT会発表資料
Yuuitirou528 default
 
PDF
第3回デジタル理学療法研究会学術大会シンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」の講演資料.
Matsushita Laboratory
 
PDF
2023年版Web3技術の理想と現実
Syuhei Hiya
 
PPTX
オープンソース界隈の利用者や技術者から見たオープンソースEDAとは? What is open source EDA from the perspecti...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
新卒・中途採用者向け採用ピッチ資料2025年7月版(20250702).pptx
Official74
 
第3回デジタル理学療法学会のシンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」での話題提供
Matsushita Laboratory
 
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
 
go tool と Minimal Version Selection アルゴリズム
Keisuke Ishigami
 
漁船に搭載されている電子装備と漁法について_VRC海洋学研究会_海のLT会発表資料
Yuuitirou528 default
 
第3回デジタル理学療法研究会学術大会シンポジウム「デジタル理学療法の組織活用:教育・管理・研究を繋ぐ新たな地平」の講演資料.
Matsushita Laboratory
 
2023年版Web3技術の理想と現実
Syuhei Hiya
 
オープンソース界隈の利用者や技術者から見たオープンソースEDAとは? What is open source EDA from the perspecti...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
 

20160115nodered design patterns

  • 1. © Hitachi, Ltd. 2016. All rights reserved. 株式会社 日立製作所 2015/1/15 横井 一仁 Node-REDのデザインパターン
  • 2. © Hitachi, Ltd. 2016. All rights reserved. Node-RED環境構築手順(Bluemixの場合) 1 (1) Node-REDのインスタンス作成 (1-1) ダッシュボートの「アプリの作成」をクリック (1-2) ウェブアプリケーションを選択 (1-3) ボイラーテンプレート を選択 (2-1) インスタンスの管理画面から 「サービスまたはAPIの追加」をクリック (1-4) Node-RED Starter を選択 (2-2) dashDBを選択 ※「Bluemix」、「dashDB」は、 International Business Machines Corporationの登録商標、製品名称です。 (2) データベース(dashDB)とバインド
  • 3. © Hitachi, Ltd. 2016. All rights reserved. Node-REDとは 2 処理ノードをGUI上でつなぐ操作で、 簡単にアプリケーションを開発できる開発環境 • コーディング未経験者でも、アプリケーション開発が容易 • 複雑な処理を行いたい場合は、JavaScriptで記述も可能 • PC、タブレットで開発できるため、どこでも開発可能 IoT端末の異常をメール通知 タブレット端末上での編集操作 処理ノード間は、 主に変数msg.payloadを用いて JSON形式のデータが渡される フリック入力と似た操作で 編集できる
  • 4. © Hitachi, Ltd. 2016. All rights reserved. デザインパターンとは 3 • ソフトウェア設計者が発見し、編み出した設計ノウハウを 蓄積し、名前をつけ、再利用しやすいようにカタログ化したもの。 • 一般にGoFが提唱したオブジェクト指向言語向け23パターンを指す。 ja.wikipedia.org/wiki/デザインパターン_(ソフトウェア)引用: http:// # 分類 パターン 1 生成に関する パターン Abstract factory 2 Builder 3 Factory method 4 Prototype 5 Singleton 6 構造に関する パターン Adapter 7 Bridge 8 Composite 9 Decorator 10 Facade 11 Flyweight 12 Proxy # 分類 パターン 13 振る舞いに関する パターン Chain of responsibility 14 Command 15 Interpreter 16 Iterator 17 Mediator 18 Memento 19 Observer 20 State 21 Strategy 22 Template method 23 Visitor
  • 5. © Hitachi, Ltd. 2016. All rights reserved. Node-REDのデザインパターン 4 Node-REDにおいてもデザインパターンがあると考えカタログ化を実施 • デザインパターンの観点 • Node-REDの開発でよく使われるパターン • 従来JavaScriptのコードで実装していた処理を、処理ノードの 接続で表現することで、可読性、開発効率を向上させるパターン • 処理ノードを繋ぎ変えるのみで修正が可能なパターン (タブレットで開発ができるパターン) qiita.com/zuhito/items/e9abfd6f1ba188f908ed※ URL: http:// 本日は、下の記事で紹介した10個のデザインパターンを説明 「nodered デザインパターン」 でウェブ検索すると 見つかります。
  • 6. © Hitachi, Ltd. 2016. All rights reserved. Node-REDのデザインパターン 5 # パターン名 パターンの説明 使用頻度 高 ノード接続 を活用 タッチUIで 修正可 1 Store & Search データ格納、検索を行うパターン ◎ 2 UI & API ブラウザで受け付けた値を用いAPIを問 合せ、結果をブラウザ表示するパターン ◎ 3 Timeout 処理時間が一定時間を越えた場合、 タイムアウトさせるパターン ◎ ○ 4 while 繰り返し処理を行うパターン ○ ◎ ○ 5 Sequence 複数の処理ノードから取得した値を 集計するパターン ○ 6 Aggregator 複数の処理ノードから取得した値を 集計するパターン ○ 7 Separator 1つの処理ノードから複数の異なる 値を出力するパターン ○ 8 MapReduce MapReduce処理を行うパターン ○ 9 Matcher ネットワーク上を探索し、入力値が 条件に合致するか判定するパターン ◎ 10 State 状態遷移を扱うパターン ○ ○ ※◎: 特に該当、○: 該当
  • 7. © Hitachi, Ltd. 2016. All rights reserved. Node-REDの開発環境 6 デバッグ画面 デプロイボタン 使用可能な 処理ノード一覧 開発で使用する処理ノードを 配置する場所
  • 8. © Hitachi, Ltd. 2016. All rights reserved. デザインパターンの説明で使用する処理ノード 7 ※ノードの色やアイコンが同じでも、左右の接続の有無で機能が異なる点に注意。 # 処理ノード 説明 1 inject クリックを契機として処理を開始する。 2 debug 前の処理ノードから渡された値をデバッグ画面に出力する。 3 http、 http response HTTPサーバとして機能させる。(始点httpノードと、 終点http responseノードを組み合わせて使用する) 4 DB DBを問い合わせる。 5 http request REST APIを問い合わせる。 6 function JavaScriptでコードを記述する。 7 template 定型文を定義する。 8 switch 条件分岐を行う。 9 delay 指定時間遅延させて、後続の処理ノードを実行する。 10 change 変数の削除等を行う。 11 comment コメント文を記載する。
  • 9. © Hitachi, Ltd. 2016. All rights reserved. ソースコードのインポート方法 8 [1] ソースコードをコピー [2] Node-RED開発環境の右上メニューの Import→Clipboardから貼り付け ※ dashDB等、ソースコードをインポートしただけでは使用できない処理ノードもある。 dashDBノードはインポート後、プロパティからDBを選択する必要がある。
  • 10. © Hitachi, Ltd. 2016. All rights reserved. 1. Store & Searchパターン 9 データをデータベースへ格納し、検索するパターン • Storeパターンは、functionノードを用いてデータの選択と 格納する列名の指定を行い、後続のDBノードでデータを格納する。 • Searchパターンは、DBノードでSQL文を実行し、 検索結果を後続のdebugノードへ渡す。
  • 11. © Hitachi, Ltd. 2016. All rights reserved. 1. Store & Searchパターン 10 列DATA タイムスタンプ1 タイムスタンプ2 表TMP 格納 [1] injectノードのクリックを契機として、 タイムスタンプを表へ追記 • プログラム例(タイムスタンプを格納、検索) 検索 [2] injectノードのクリックを契機として、 表の内容をログ画面に出力 列DATA タイムスタンプ1 タイムスタンプ2 タイムスタンプ3 表TMP タイムスタンプ3“Tue Dec 22 2015 13:37:10” 現在の時刻
  • 12. © Hitachi, Ltd. 2016. All rights reserved. 1. Store & Searchパターン 11 (2) Deploy後、表作成を実行 (デバッグ画面に[]が 出力されれば作成成功) (1) 表を作成するCREATE TABLE文を定義 Service: dashDB-xx Query: CREATE TABLE TMP (DATA VARCHAR(255)); • タイムスタンプ格納用の表を作成 ↑左右に接続があるdashDBノード ※参考: 表を削除 (4) Deploy後、表削除を実行 (デバッグ画面に[]が 出力されれば削除成功) (3) 表を削除するDROP TABLE文を定義 Service: dashDB-xx Query: DROP TABLE TMP;
  • 13. © Hitachi, Ltd. 2016. All rights reserved. 1. Store & Searchパターン 12 (4)SELTCT文を定義 Service: dashDB-xx Query: SELECT * FROM TMP; (2)格納先テーブルを登録 Service: dashDB-xx Table: TMP (1) タイムスタンプを列DATAに格納すると定義 Function: (3) Deploy後、 タイムスタンプ格納を実行 (デバッグ画面の出力なし) (5) Deploy後、検索を実行 (デバッグ画面に 検索結果が出力される) • Storeパターンのデータ格納を複数回実行した後、Searchパターンを 実行すると、格納したタイムスタンプがデバッグ画面へ出力される。 • Storeパターンを用いて、タイムスタンプを格納 • Searchパターンを用いて、タイムスタンプを検索 msg.payload = {DATA: new Date(msg.payload).toString()}; return msg; 左のみ接続があるdashDBノード↑
  • 14. © Hitachi, Ltd. 2016. All rights reserved. 2. UI & APIパターン 13 ブラウザで入力を受け付け、API問合せと結果表示を行うパターン • 1つ目のUIパターンは、入力フォームHTMLをブラウザへ表示し、 ユーザから入力値を受け取る。 • 2つ目のUIパターンは、APIを問い合わせた結果を 格納した出力HTMLをブラウザへ表示する。 • APIパターンは、GETパラメータに指定された値を用いて、 検索等の処理を行い、その結果を返すREST API。
  • 15. © Hitachi, Ltd. 2016. All rights reserved. 2. UI & APIパターン 14 • プログラム例(指定した表の行数を表示) 入力フォーム 出力結果 [1]表名を入力 [4] 指定した表の行数を表示 [2]送信をクリック [3] REST APIを問い合わせて、 SELECT COUNT(*) FROM TMPを実行
  • 16. © Hitachi, Ltd. 2016. All rights reserved. 2. UI & APIパターン 15 • ブラウザでhttp:// にアクセスし、表の行数が表示されれば成功 • APIパターン(引数qに指定したテーブルの行数を検索) (1)APIのURL登録 URL: /api (2)HTTP GETの引数qを用いてSQL文作成 Template: (3)検索テーブルを登録 Service: dashDB-xxSELECT COUNT(*) FROM {{payload.q}}; ※ dashDBノードに直接SQL文を記述する方法は、表名を変数として使用 できないため、Templateノードで作成したSQL文をdashDBノードへ渡した。 <アプリ名>.mybluemix.net/api?q=TMP 表の行数
  • 17. © Hitachi, Ltd. 2016. All rights reserved. 2. UI & APIパターン 16 • ブラウザでhttp:// にアクセスし、入力フォームが表示されれば成功 • UIパターン(入力フォーム) (1) URLを登録 URL: /input (2) 入力フォームのHTMLを記述 Template: <FORM action=output> テーブル名: <INPUT type=text name=q> <INPUT type=submit> </FORM> <アプリ名>.mybluemix.net/input ※ 説明簡略化のため、HTMLの<HTML>、<BODY>タグ等の記述は省略
  • 18. © Hitachi, Ltd. 2016. All rights reserved. 2. UI & APIパターン 17 • UIパターン(出力HTML) (1) URLを登録 URL: /output (2) 問い合わせ用のURLを作成 Function: (4) 変数msg.headersを削除 Rules: Delete msg.headers (http request実行後は、Content-Typeが JSONであるため) (5) 出力HTMLを記述 Template: • 入力フォームで表名TMPを入力し、行数が表示されれば成功 <HTML><BODY> テーブルの行数は{{payload.1}}です。 </BODY></HTML> msg.url = msg.req.host + "/api?q=" + encodeURI(msg.payload.q); return msg; (3) 問合せ結果の 形式をJSONに変更 Return: a parsed JSON object
  • 19. © Hitachi, Ltd. 2016. All rights reserved. 3. Timeoutパターン 18 処理に時間がかかる場合や、処理が停止した場合、 タイムアウト処理を行うパターン • 処理に時間がかかった場合、タイムアウト表示処理を 先に実行するようにする。 • UIパターンにて、ノード間の処理が進まないと、ユーザは 長時間待たされるため、タイムアウト処理を入れると良い。 上の処理(青)に時間がかかった場合、 下の処理(赤)が先回りする。
  • 20. © Hitachi, Ltd. 2016. All rights reserved. 3. Timeoutパターン 19 入力フォーム(存在しない表名を指定) 出力結果(正常処理) • 従来のUI&APIパターンの処理 (表が存在しないとユーザは長時間待たされ、エラーが返る) API問合せ時間が5秒以上 (存在しない表名を指定) API問合せが5秒以内 (表名TMPを指定) 出力結果(タイムアウト時) • プログラム例 (APIが応答しない場合、タイムアウトメッセージを表示) 3分程 経過後 出力結果(エラー) 入力フォーム
  • 21. © Hitachi, Ltd. 2016. All rights reserved. 3. Timeoutパターン 20 • Timeoutパターン(httpノードと http responseノードの間に、 delayノードと templateノードを追加) (2) タイムアウト時に表示するHTMLを記述 Template: <HTML><BODY>タイムアウトしました。</BODY></HTML> (1) delayノードを追加 (デフォルト待ち時間5秒) 入力フォーム 5秒 経過後 出力結果 • 存在しない表名(TMP以外)を指定し、 5秒後にタイムアウトの表示されれば成功
  • 22. © Hitachi, Ltd. 2016. All rights reserved. 4. whileパターン 21 繰り返し処理を実現するパターン • 以下の様なwhile文のコードをノードの接続関係で表現 • 定型のwhileパターンを用いることでノード接続変更の操作だけで、 既存の処理を繰り返し処理に対応させることができる。 var i = 0; while (i < 4) { console.log(i + "回目"); i++; } console.log("ループ完了");
  • 23. © Hitachi, Ltd. 2016. All rights reserved. 4. whileパターン 22 • プログラム例(1回のinject実行で4回デバッグメッセージを表示) • whileパターン (4)値iをインクリメント Function: msg.i++; return msg; (3)メッセージを記述 Template: {{i}}回目 (1)初期値i=0を設定 Template: 0 Property: msg.i (2)ループ条件を設定 Property: msg.i 条件: < 4 → 1 otherwise → 2 (5)メッセージを記述 Template: ループ終了 Injectノードを クリック 出力結果 (4回デバッグを表示)
  • 24. © Hitachi, Ltd. 2016. All rights reserved. 4. whileパターン 23 • 参考: whileパターンの応用 • 配列の長さ分、繰り返し処理をしたい場合 → switchノードは変数を条件に指定できないため、条件文をi!=0とし定数化。 → この変更に伴い、iの初期値を配列の長さとし、デクリメントでループさせる。 • 従来の処理を繰り返し処理に対応させたい場合 → 配列のi番目のデータをpayloadに格納し、 後続の処理として従来処理を挿入する。 • 繰り返し処理で得た結果を、ループ後の処理で利用したい場合 → 一時的にデータを退避するSequenceパターン(後述)を用いる。 条件文をi!=0にする Sequenceパターンを 用いて処理結果を 別変数へ退避 Sequenceパターンを用いて退避した値を呼び出す qiita.com/zuhito/items/ed5f505edaac2baeadd9 文字列内の各単語用いてREST APIを問い合わせる処理 http:// 変数iをデクリメント 変数iの初期値を 配列の長さにする 配列のi番目のデータをpayloadに格納
  • 25. © Hitachi, Ltd. 2016. All rights reserved. 5. Sequenceパターン 24 複数の処理ノードから得た値を集計するパターン • 処理ノードを経由すると、変数payloadの値は上書きされるため、 後続の処理ノード(集計処理など)で必要となる値を、 一時的に他の変数に格納する。 • 集計を行う処理ノードで、一時的に格納した変数を呼び出す。
  • 26. © Hitachi, Ltd. 2016. All rights reserved. 5. Sequenceパターン 25 • プログラム例(451+326=777を計算) • 1つ目のfunctionノードがmsg.payloadに451を返す。 • 2つ目のfunctionノードがmsg.payloadに326を返す。 • 集計を行うfunctionノードが2つの値の和を求める。 Injectノードを クリック 出力結果
  • 27. © Hitachi, Ltd. 2016. All rights reserved. 5. Sequenceパターン 26 (2)値を一時変数tmpへ退避する処理を記述 Function: msg.tmp = msg.payload; return msg; (3)値326を返す処理を記述 Function: msg.payload = 326; return msg; (4)2つの値の和を計算する処理を記述 Function: msg.payload = msg.tmp + msg.payload; return msg; (1)値451を返す処理を記述 Function: msg.payload = 451; return msg; • Sequenceパターン
  • 28. © Hitachi, Ltd. 2016. All rights reserved. 6. Aggregatorパターン 27 複数の処理ノードから得た値を集計するパターン • 集計する値と数を管理するため、 グローバル変数context.globalを用いる。 • 集計を行うfunctionノードは、指定した数の入力を受け取った後、 後続の処理ノードに処理を渡す(return msg;を実行した時のみ 処理を引き継ぐ仕様を活用)。 • Sequenceパターンと比較すると、どの処理ノードの結果を 集計しているか、視覚的に分かりやすい。
  • 29. © Hitachi, Ltd. 2016. All rights reserved. 6. Aggregatorパターン 28 • プログラム例(451+326=777を計算) • 1つ目のfunctionノードがmsg.payloadに451を返す。 • 2つ目のfunctionノードがmsg.payloadに326を返す。 • 集計を行うfunctionノードが2つの値の和を求める。 Injectノードを クリック 出力結果 ※Sequenceパターンのプログラム例と同じ
  • 30. © Hitachi, Ltd. 2016. All rights reserved. 6. Aggregatorパターン 29 • Aggregatorパターン (4) グローバル変数に入力数定義、 データ格納先を用意する処理を参照 Function: // グローバル変数に入力数を定義 context.global.n = 2; // グローバル変数のデータ格納先を用意 context.global.data = new Array(2); return msg; (5) 2つの値の和を計算する処理を参照 Function: //入力数を1減らす context.global.n--; // 値をデータ格納先に一時保存 context.global.data[context.global.n] = msg.payload; // 定義した入力数に達した場合に、和を求めreturn if (context.global.n === 0) { var sum = 0; for (var i = 0; i < context.global.data.length; i++) { sum += context.global.data[i]; } msg.payload = sum; return msg; } (1) デザインパターンのページからAggregator パターンのソースコードを貼り付ける。 (2)値451を返す処理を参照 Function: msg.payload = 451; return msg; (3)値326を返す処理を参照 Function: msg.payload = 326; return msg;
  • 31. © Hitachi, Ltd. 2016. All rights reserved. 7. Separatorパターン 30 1つのfunctionノードから2つの異なる値を出力するパターン • functionノードのreturnをサイズ2の配列にし、 その配列の中に出力したい値を格納する。 • functionノードの出力数(Outputsの値)を2に設定する。
  • 32. © Hitachi, Ltd. 2016. All rights reserved. 7. Separatorパターン 31 (1) 異なる2値を出力するよう記述 Outputs: 2 Function: msg.payload = 451; // 1つ目の出力を格納 var msg2 = {}; msg2.payload = 326; // 2つ目の出力を格納 return [msg, msg2]; // サイズ2の配列をretrun • プログラム例(451と326を出力) • 1つ目の出力のmsg.payloadに451を返す。 • 2つ目の出力のmsg.payloadに326を返す。 • Separatorパターン Injectノードを クリック 出力結果 (2つの値を出力)
  • 33. © Hitachi, Ltd. 2016. All rights reserved. 8. MapReduceパターン 32 MapReduce処理を実現するパターン • SeparatorパターンとAggregatorパターンを組み合わせたパターン • MapとReduceの間のデータ転送処理をノード接続で記述 • MapReduceを理解するのに向いている(性能向上は期待できない) • Map、Reduceの数を変更する場合は、手作業で増やす必要がある。
  • 34. © Hitachi, Ltd. 2016. All rights reserved. 8. MapReduceパターン 33 • プログラム例(ワードカウント) • Map処理: テキストデータを入力とし、単語(Key)とその単語の 出現頻度(Value)のペアをReduce処理へ渡す。 • Shuffle処理: Map処理がデータを受け渡すReducerは、Keyの値を基に 決定する。(今回は単語の先頭文字で決定) • Reduce処理: 同じ単語(Key)の出現頻度(Value)の和を計算する。 入力データ Map処理 Map処理 Map処理 Reduce処理 Reduce処理 <this,1>,<pen, 1> This is a pen. Give me a pen. This pen is small. <is, 2>,<give, 1>, <me, 1>,<a, 2> <this, 2>,<pen, 3>, <small, 1> 出力結果 <is,1>,<a, 1>
  • 35. © Hitachi, Ltd. 2016. All rights reserved. 8. MapReduceパターン 34 (3) Map処理を参照 Outputs: 2 Function: var input = msg.payload.toLowerCase() .replace( /.$/, “”).split(/ |, /); var key_value = []; for (var i=0; i<input.length; i++){ var key = input[i]; if (key in key_value) { key_value[key]++; } else { key_value[key] = 1; } } var key1_value = []; var key2_value = []; for (var key in key_value){ if (‘a’<=key[0] && key[0]<=‘m’) { key1_value.push([key,k ey_value[key]]); } else { key2_value.push([key, key_value[key]]); } } msg.payload = key1_value; var msg2 = {}; msg2.payload = key2_value; return [msg, msg2]; (2) Map数の定義を参照 Function: var map = 3; // Map数を定義 context.global.n1 = map; context.global.data1 = new Array(map); context.global.n2 = map; context.global.data2 = new Array(map); return msg; (4) Reduce処理を参照 Function: // 入力数を減らす context.global.n1--; // msg.payloadのデータを格納 context.global.data1[context.global.n1] = msg.payload; // 定義した入力数が来たら、集計処理を行い、msg.payloadを返す if (context.global.n1 === 0){ // msg.payloadの合計値を算出 var tmp = []; for (var i=0; i<context.global.data1.length; i++) { var input = context.global.data1[i]; for (var j=0; j<input.length; j++) { var key = input[j][0]; var value = input[j][1]; if (key in tmp) { tmp[key] += value; } else { tmp[key] = value; } } } var output = []; for (var key in tmp) { output.push([key, tmp[key]]); } msg.payload = output; return msg; } 出力結果 (1) デザインパターンのページからMapReduce パターンのソースコードを貼り付ける。 (5) ワードカウント を実行
  • 36. © Hitachi, Ltd. 2016. All rights reserved. 8. MapReduceパターン 35 • MapReduceパターンの編集(Map処理を4つに変更) (2) 入力データ(templateノード)と Map処理をコピー&接続 (1) Map数を3から4に変更 Function: var map = 4; // Map数を定義 context.global.n1 = map; context.global.data1 = new Array(map); context.global.n2 = map; context.global.data2 = new Array(map); return msg; (3) Map処理の2出力を 2つのReduce処理へ接続 (前処理結果から“this”、”pen”、 ”is”、”small”の値が1ずつ増加) 出力結果
  • 37. © Hitachi, Ltd. 2016. All rights reserved. 9. Matcherパターン 36 処理ノードのネットワークを探索し、入力値が条件に合致するか判定するパターン • 各functionノードは、条件に合致した場合のみ通過し、後続のノードに処理を渡す。 • 全体の条件に合致している場合は、functionノードから成るネットワーク上から 出力が得られる。 • 後から全体の条件を修正したい場合は、ノードの接続を変更するのみで修正可 (タブレット上の操作のみで修正可)
  • 38. © Hitachi, Ltd. 2016. All rights reserved. 9. Matcherパターン 37 • プログラム例(英文の文型判定) 英文を入力とする Injectノードを順にクリック 出力結果 (文型の判定結果)
  • 39. © Hitachi, Ltd. 2016. All rights reserved. 9. Matcherパターン 38 • Matcherパターン (1) デザインパターンのページから、 Matcherパターンのソースコードを貼り付ける。 (2) 各英文をクリックすると、 文型の判定結果が出力される。
  • 40. © Hitachi, Ltd. 2016. All rights reserved. 9. Matcherパターン 39 • Matcherパターンの編集 (主語に”冠詞 形容詞 名詞”の並びを許可する条件に変更) (1) 主語に“冠詞 形容詞 名詞”を含む文を追加 Payload: string The tall man walked. (2) 他の形容詞のノードをコピー&ペーストし、 冠詞と名詞の間に挿入
  • 41. © Hitachi, Ltd. 2016. All rights reserved. 10. Stateパターン 40 状態遷移を表現するパターン • 状態を表すfunctionノードと、 遷移先を決定するswitchノードから成る。 (functionノードとswitchノードの内容は、全て同じ) • 遷移のノード接続のみで、状態遷移を記述できる。
  • 42. © Hitachi, Ltd. 2016. All rights reserved. 10. Stateパターン 41 • プログラム例(状態遷移表) • 文字列を検査するための状態遷移表(状態aが開始点) • 以下のうち、不合格(状態e)になる文字列はどれか判定する。 (ア) 0101 (イ) -1 (ウ) 12.2 (エ) 4.5.1 (オ) 451+ 文字 符号 数字 小数点 現在の 状態 a a b e b e b c c e d e d e d e
  • 43. © Hitachi, Ltd. 2016. All rights reserved. 10. Stateパターン 42 (2) Switchノードに変数msg.cを渡す処理を参照 Function: var input = msg.payload; var len = input.length; if (msg.i == null) { msg.i = 0; } else { msg.i++; } msg.c = input.charAt(msg.i); msg.state = msg.i + "回目: 状態=a, 文字=" + msg.c; if (msg.i < len) { return msg; } (1) デザインパターンのページから、 Stateパターンのソースコードを 貼り付ける。 (3)遷移先条件を参照 Property: msg.c 条件: matches regex +|- → 1 matches regex d → 2 == . → 3 (4) 各入力を クリック (判定結果が 出力される)
  • 44. © Hitachi, Ltd. 2016. All rights reserved. 参考ページ 43 • Storeパターン • ラズパイの情報をMQTT経由で取得し、dashDBに格納する例 • UI & APIパターン • ブラウザの入力フォームから、Watson APIを問い合わせ、 結果を表示する例 dotnsf.blog.jp/archives/1047589155.html 「Node-RED(QuickStart) のデータを dashDB に格納する」 http:// qiita.com/KenichiSekine/items/7005df36093fabf00b41 「BluemixのNode-REDで簡単Webアプリ開発」 http://
  • 45. © Hitachi, Ltd. 2016. All rights reserved. まとめ 44 • Node-REDのデザインパターン10個を紹介 • 特にStore&Search~Sequenceパターンは実開発で有用 • Node-REDはハッカソンや実証実験など短時間の開発に向いている。 • 複雑な処理がカプセル化されているため、迅速に開発できる。 • DB、UI、API、ロジックなどのチームの役割分担が明確である。 • 役割毎に開発したプログラムをマージすることも容易である。 デザインパターンは、チーム開発時の共通認識、 共通言語として重要となると考える。
  • 46. © Hitachi, Ltd. 2015. All rights reserved. 株式会社 日立製作所 Node-REDのデザインパターン 2015/1/15 横井 一仁 END 45