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

Node-REDのノード開発容易化ツール Node generator
Node-REDのノード開発容易化ツールNode generatorNode-REDのノード開発容易化ツールNode generator
Node-REDのノード開発容易化ツール Node generatorBMXUG
 
Node-REDでプロジェクト管理を始めてみよう!
Node-REDでプロジェクト管理を始めてみよう!Node-REDでプロジェクト管理を始めてみよう!
Node-REDでプロジェクト管理を始めてみよう!Koji FUNATSU,
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
Node-RED TIPS:functionノード間で関数を共有する方法
Node-RED TIPS:functionノード間で関数を共有する方法Node-RED TIPS:functionノード間で関数を共有する方法
Node-RED TIPS:functionノード間で関数を共有する方法Kazuki Saito
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
Node-REDのworldmapの活用
Node-REDのworldmapの活用Node-REDのworldmapの活用
Node-REDのworldmapの活用OSgeo Japan
 
Raspberry PiのUSB OTGを試す
Raspberry PiのUSB OTGを試すRaspberry PiのUSB OTGを試す
Raspberry PiのUSB OTGを試すKenichiro MATOHARA
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門demuyan
 
データで散らかった製造業界における最高の翻訳機 Node-RED
データで散らかった製造業界における最高の翻訳機 Node-REDデータで散らかった製造業界における最高の翻訳機 Node-RED
データで散らかった製造業界における最高の翻訳機 Node-REDnodered_ug_jp
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
Node-REDのプログラミングモデル
Node-REDのプログラミングモデルNode-REDのプログラミングモデル
Node-REDのプログラミングモデルAtsushi Kojo
 
初心者向けWebinar AWSで開発環境を構築しよう
初心者向けWebinar AWSで開発環境を構築しよう初心者向けWebinar AWSで開発環境を構築しよう
初心者向けWebinar AWSで開発環境を構築しようAmazon Web Services Japan
 
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをOSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをi_yudai
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
 

What's hot (20)

Node-REDのノード開発容易化ツール Node generator
Node-REDのノード開発容易化ツールNode generatorNode-REDのノード開発容易化ツールNode generator
Node-REDのノード開発容易化ツール Node generator
 
Node-RED v2.0新機能紹介
Node-RED v2.0新機能紹介Node-RED v2.0新機能紹介
Node-RED v2.0新機能紹介
 
Node-REDでプロジェクト管理を始めてみよう!
Node-REDでプロジェクト管理を始めてみよう!Node-REDでプロジェクト管理を始めてみよう!
Node-REDでプロジェクト管理を始めてみよう!
 
Node-REDからREST APIに接続
Node-REDからREST APIに接続Node-REDからREST APIに接続
Node-REDからREST APIに接続
 
HTTP/2 入門
HTTP/2 入門HTTP/2 入門
HTTP/2 入門
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Node-RED TIPS:functionノード間で関数を共有する方法
Node-RED TIPS:functionノード間で関数を共有する方法Node-RED TIPS:functionノード間で関数を共有する方法
Node-RED TIPS:functionノード間で関数を共有する方法
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Node-REDのworldmapの活用
Node-REDのworldmapの活用Node-REDのworldmapの活用
Node-REDのworldmapの活用
 
gRPC入門
gRPC入門gRPC入門
gRPC入門
 
Raspberry PiのUSB OTGを試す
Raspberry PiのUSB OTGを試すRaspberry PiのUSB OTGを試す
Raspberry PiのUSB OTGを試す
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門
 
データで散らかった製造業界における最高の翻訳機 Node-RED
データで散らかった製造業界における最高の翻訳機 Node-REDデータで散らかった製造業界における最高の翻訳機 Node-RED
データで散らかった製造業界における最高の翻訳機 Node-RED
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
Node-REDのプログラミングモデル
Node-REDのプログラミングモデルNode-REDのプログラミングモデル
Node-REDのプログラミングモデル
 
初心者向けWebinar AWSで開発環境を構築しよう
初心者向けWebinar AWSで開発環境を構築しよう初心者向けWebinar AWSで開発環境を構築しよう
初心者向けWebinar AWSで開発環境を構築しよう
 
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチをOSTree: OSイメージとパッケージシステムの間にGitのアプローチを
OSTree: OSイメージとパッケージシステムの間にGitのアプローチを
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
Introduction of ISHI-KAI with OpenMPW
Introduction of ISHI-KAI with OpenMPWIntroduction of ISHI-KAI with OpenMPW
Introduction of ISHI-KAI with OpenMPW
 

Recently uploaded

プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 

Recently uploaded (8)

プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 

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してから使うようにすれば解決するかと思います。