SlideShare a Scribd company logo
1 of 21
Node-red+JSONataで
function地獄からの卒業
きみも JSONataが つかえるフレンズ になろうよ!
はらだ かずひろ
自己紹介
• 原田一弘(はらだ かずひろ)
• 株式会社ウフルに2016年新卒入社
• 社会学部出身(ジブリ映画で卒論かきました)
• 社会人1年目は、マイコン書いたり、はんだづけした
り、LoRaWAN触らせていただいたり、BLEとにら
めっこしたり。。
• 曰くNative Node-redderらしい
• 最近はNintendo Switchとアイドルにお熱
• そろそろビジネス用のtwitter垢をつくります。。
簡単なfunctionを書きがち
JSONata?
• Version 0.16 released 11 January 2017
• ChangeノードとSwitchノードに追加
• Functionを使わなくても簡単なmsg整形が可能になった
結構下の方にあった
dataだけを配列として
取り出したい。。。
なにこれ すごーい
こんなダミーデータを用意。
JSONオブジェクトからの様々な
参照方法を紹介(*’ω’*)
index指定で持ってこれる!
msg.payload.Address.Street & ‘ , ’ & msg.payload.Address.City
じゃなくていい!
*指定も可能!
他階層のtype
(;つД⊂)ゴシゴシ
JSONata Functions について
• 選ぶ!insertを押す!引数を設定でおしまい!
• functionsのリストから選べるものが実装済み。
こんなデータからkeyだけ抜き出したい。。
change nodeで使えそうなfunctions
• $keys(object)
オブジェクトのkeyを抜き出し
• $spread(object)
オブジェクトをkeyとvalueを一つの要素にした配列を生成
• $lookup(object,key)
• オブジェクトの中からkeyを検索しvalueを返す
• $append(array,array)
• ふたつの配列を結合
• $number(arg),$string(arg)
• 数値変換、文字列変換
“test”:
{
“abc” : 123,
“def” : 456
}
[abc,def]
[{“abc”:123},{“def”:456}]
switch nodeで使えそうなfunctions
• $exist(arg)
• 引数が存在するかをt/fで返す。
• $Boolean(arg)
• いろいろt/f判定ができる→
• $count(array)
• 配列の要素数を返す
• $max(array), $min(array)…
• いろいろ数字関係
高度なfunctions
• 右記二つは説明がないがnode-redで実装済み
• 今回mapは使えることを確認した
諸注意
• 公式のJSONataリファレンスのものがすべて使えるわけではな
い。
• $trimなどnode-redで実装されていないfunctionもある
• functionsの選択リストにあるものは使える
• Operatorsも非対応なものがある
• ~>, ..など高度なもの
• flowやglobalの値は参照できない(?)
• 直打ちだと効かなかった
• 一度msg値にsetすればよい
参考にしたとこ
• 公式サイト:http://jsonata.org/
• github https://github.com/jsonata-js/jsonata
• npm https://www.npmjs.com/package/jsonata
• JSONata Tech Talk
• https://www.youtube.com/watch?v=c6VHGlAJEaU
JSONataを適度に使いこなして
作業効率あげれるフレンズになろう!
special thanks いらすとや

More Related Content

What's hot

CyberAgentのインフラについて メディア事業編 #catechchallenge
CyberAgentのインフラについて メディア事業編 #catechchallengeCyberAgentのインフラについて メディア事業編 #catechchallenge
CyberAgentのインフラについて メディア事業編 #catechchallengewhywaita
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)VirtualTech Japan Inc.
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術dena_study
 
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容sairoutine
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャtorisoup
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!デベロッパーネットワーク
 
Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上Ryo Sasaki
 
UIbuilderを使ったフロントエンド開発
UIbuilderを使ったフロントエンド開発UIbuilderを使ったフロントエンド開発
UIbuilderを使ったフロントエンド開発Atsushi Kojo
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ
誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ
誰もAddressableについて語らないなら、自分が語るしかない…ッッッッTatsuhiko Yamamura
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
Node-REDのプログラミングモデル
Node-REDのプログラミングモデルNode-REDのプログラミングモデル
Node-REDのプログラミングモデルAtsushi Kojo
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようShohei Okada
 
Fargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころFargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころYuto Komai
 
Node RED で実現する製造業の DX
Node RED で実現する製造業の DXNode RED で実現する製造業の DX
Node RED で実現する製造業の DX雅治 新澤
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介AdvancedTechNight
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作るtorisoup
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 

What's hot (20)

CyberAgentのインフラについて メディア事業編 #catechchallenge
CyberAgentのインフラについて メディア事業編 #catechchallengeCyberAgentのインフラについて メディア事業編 #catechchallenge
CyberAgentのインフラについて メディア事業編 #catechchallenge
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
 
FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術FINAL FANTASY Record Keeperのマスターデータを支える技術
FINAL FANTASY Record Keeperのマスターデータを支える技術
 
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
 
Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上
 
UIbuilderを使ったフロントエンド開発
UIbuilderを使ったフロントエンド開発UIbuilderを使ったフロントエンド開発
UIbuilderを使ったフロントエンド開発
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ
誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ
誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
Node-REDのプログラミングモデル
Node-REDのプログラミングモデルNode-REDのプログラミングモデル
Node-REDのプログラミングモデル
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
 
Fargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころFargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころ
 
Node RED で実現する製造業の DX
Node RED で実現する製造業の DXNode RED で実現する製造業の DX
Node RED で実現する製造業の DX
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 

Node-red+JSONataでfunction地獄からの卒業

Editor's Notes

  1. 自己紹介 昨年からnode-redや弊社のenebularを使ってフローを作る業務を行っていますが、
  2. 一部抜粋ですが、こんな感じのフローを書いています。 functionの内部で複雑な処理をおこなっておりますが、一部 こんな感じでstringをオブジェクトにする処理や、配列からkeyのみ取り出す処理など、msgの改変のみをしている箇所もあったりします。 これを何度も書いたりすることが多いのですが、今回お話しさせていただくもので、この辺の作業効率がグンと上がります。 それが
  3. JSONataです。 今年に入って追加されたニクいやつで、 expressionとしてchange node とswitch nodeのリストの中にあります。
  4. そもそもJSONataとは、npmとして提供されていて 今年1月11日に行われたアップデートでNoder-red上に実装されました。 先ほども申しましたがswitch change node expressionとして追加されています。 リリースノートのJSONata項を意訳すると、これまでFunction nodeでないとできなかった簡単なmsg整形をすることが可能になりました。 リリースノートの例として挙げられてるのは絶対温度と相対温度、つまりケルビンから℃の変換をchange nodeのみで変換しているメソッドです。 ちなみにこのJSONataの項ですがかなり下の方にありました。
  5. 最近IoT関連のフローをつくることが多いのですが、 数あるセンサから、timestamp,id,dataのような項目が送られてきて 一定周期で平均する。なんてことをよくやります。 今まではfunction nodeでfor in構文を回してdataだけの配列を作って処理したりしていました が、しかし jsonataを使うと msg.payload.dataでdataのみの配列をつくることができます。
  6. 他にもこんな書き方ができますよというのをいくつか消化します。 ということでこのようなダミーデータを用意しました。 人の名前と住所や電話番号などのデータですね。
  7. オブジェクトの中の配列の最後の要素をとってきたい。 そんなときも、change nodeでjsonataを使い、index指定することで、取ってくることができます。
  8. 住所のデータが町と通りで別れていて、とってくるときも Addressの下にStreetとCityがあるのですが、 このように書けば、きちんととって来れます。 このように、それぞれ長々と書かなくても平気です
  9. 最後にこのtypeのvalueを抜き出します。 pauyloadの下にあるphone、Emailの下にそれぞれtypeが定義されているのですが msg.payload.*.typeと*指定することで、配列でとってくることができます。 個人的にこれすごい感動しました。
  10. こんな感じで皆さんもJSONataを使って、作業効率をあげてみませんか? Expressionを開くと、このようにeditorが開くので、長いものを打つときはこちらから入力してください。 ん? なんかしたの方に
  11. functionsがあります! プルダウン・・・すると
  12. 結構種類ある!!!
  13. ってことで、Jsonata functionsについて残り時間説明いたします。 プルダウンから、functionを選んで、insertすれば引数指定されますので、書き換えておしまいです。 大概のものについては説明が書いてありますが、Jsonataの公式のドキュメントに例も載っています。 key functionでは、オブジェクトの中からkeyのみを抜き出し配列にするfunctionです。 switchnodeやchangenodeで使えそうなfunctionをいくつか紹介していきます。
  14. まずはchange nodeです ・先ほどのkeyはオブジェクトからkeyのみの配列を生成します。 スプレッドはオブジェクトをkeyとvalueを1つの要素にした配列を生成します。 lookupも使えます。オブジェクトからkeyを検索して、中身を返します。 あとは配列を結合するappendやvalue変換のnumber,stringが使用頻度高そうだなと思ったので、詳しくは公式リファレンスからご覧ください。
  15. そしてswitch node で使えそうなのは 引数が存在するかをt/fで返すexist、 ルールにのっとってt/f判定ができるBoolean 配列の要素数を返すcountや、マックス、ミニマム、サムなどの数字関係は閾値判定をするときに気軽に使うことができます。
  16. 最後に高度なfunctionとして、mapとreduceが用意されていて、 こちら他の言語と同じように使えると思いますが、今回mapのみ動作を確認しました。 mapはfunctionとarrayを引数にします。 自分でfunctionを定義して、配列の要素ひとつひとつにそのfunctionを適応します。 私がやってみたのは、JSONataでtripleという3倍するfunctionを定義して、 1~10の数字が入った配列に3をかけてみました。 これがchangenodeで2行ほど書くだけで実装できます。
  17. ちょっと、気づいた注意点です。 公式のリファレンスの中にtrimなどのfunctionが定義されていますが、noderedの選択リストで選べるもの以外は実装されていませんでした。 Operatorsといって、特殊な書き方をするものも一部使えませんでした。 そして、Jsonataの構文上ではflowやglobalの値は参照できませんでした。一度msg値にsetしてから使うようにすれば解決するかと思います。