投稿

Sortノードを使う(その2)

イメージ
ここのところずっと Node-RED のサンプルを見ながら各ノードの使い方を確認しています。 頭出しの記事はこちら をご確認ください。今回はSortノードシリーズの2回目です。 確認するサンプルは、前回に引き続き「 読み込み > サンプル > flows > node-red > sequence > sort > 01 - Sort array payload 」です。 シンプルなJSONata式でJSON配列をソートする 確認するのは5段目です。  入力データを生成するTemplateノードでは、name(文字列)とprice(数値)をプロパティに持つJSON配列を指定しています。 SortノードではJSONata式でキー「price」で昇順ソートするよう指定してあります。 実行すると、以下のログが出力されます。msg.payload.priceの値で昇順ソートされていますね。特に説明の必要はないと思います。 複数のプロパティを条件に組み込んでソートする 最後は6段目です。先ほどより少し複雑なJSONata式を利用して複数プロパティの値を条件に組み込んでソートします。 入力データを生成しているTemplateノードでは、先程と同様JSON配列を指定していますが、今度は複数の要素で同じ値のpriceを持っています。このサンプルではnameの値も考慮に入れてソートを行っています。 Sortノードを開くと、キーに何やら長ったらしいJSONata式が設定されています。このままだと見づらいので、右側の「...」ボタンを選択します。 SONata式の全体像が確認できます。この内容を言葉で表現すると以下のようになります。 priceの値を4桁のゼロ埋めした文字列を生成して、nameの値と文字列結合する 「 テスト 」タブを選択して、「 メッセージ例 」に name と price プロパティを持つJSONオブジェクトを指定すると、「 結果 」欄でこの式の動作を確認できます。この文字列でソートを実行します。 結果は以下の通り、priceの値が同じ場合、nameの値でソートされました。 まとめ まとめます。 ソート条件にJSONata式を利用すると複雑な動作を実現できる Sortノードシリーズはまだまだ続きます。

Sortノードを使う(その1)

イメージ
ここのところずっと Node-RED のサンプルを見ながら各ノードの使い方を確認しています。 頭出しの記事はこちら をご確認ください。今回からSortノードを見ていきます。 確認するサンプルは、「 読み込み > サンプル > flows > node-red > sequence > sort > 01 - Sort array payload 」です。配列をソートするってことですかね。内容はシンプルなのでサクサク見ていきます。 文字列配列を昇順にソートする 内容は見出しの通りです。 Templateノードでmsg.payloadに文字列配列を設定する 要素の値をキーにして昇順でソート 結果は以下の通り、文字列配列の要素が昇順でソートされました。予想通りかと思います。 文字列配列を降順にソートする 続いて2段目は降順ソートです。先ほどとの違いはSortノードの順序設定のみ。 結果は以下の通り、先ほどとは逆順になりました。 文字列配列を昇順ソートする再び 続いて3段目は1段目と同じく昇順ソートのサンプルですが、入力するデータが数値っぽい文字列です。 文字列として昇順ソートされましたね。特に説明は必要ないかと思います。 文字列配列を数値として昇順ソートする 4段目は3段目と入力データは同じですが、数値として昇順ソートします。 文字列なのに数値として昇順ソートできました。いちいち数値に変換しなくていいので、これは意外と便利かもしれない。 まとめ いったんここらでまとめます。 基本的に配列は文字列としてソートします 入力が文字列であっても、数値としてソートすることもできます 順序は昇順と降順から選択できます Sortノードシリーズは続きます。

Joinノードを使う(その4)

イメージ
ここのところずっと Node-RED のサンプルを見ながら各ノードの使い方を確認しています。 頭出しの記事はこちら をご確認ください。今回はJoinノードの4回目です。終わらねぇ。 確認するサンプルは、 前回 に引き続き「 読み込み > サンプル > flows > node-red > sequence > join > 02 - Manual join mode 」です。 メッセージを結合してkey/valueオブジェクトにする 5段目のフローから見ていきます。ざっくりとした流れは以下のとおりです。 DataノードでCSVデータを送信する CsvノードでCSVデータをJSONオブジェクトに変換する msg.payloadには以下のような値が指定されたメッセージ4つに分解される { name: "Apple", price: 100 } Changeノードでmsg.payload内の値を以下のプロパティに設定する msg.topic = "Apple"(msg.payload.nameの値) msg.payload = 100(msg.payload.priceの値) Joinノードで、2個の受信メッセージごとにmsg.topicの値をキーとしてkey/valueオブジェクトに結合して送信する これを実行すると、以下のようにmsg.payloadにJSONオブジェクトが指定されていることを確認できます。 メッセージを結合して結合オブジェクトにする 先ほどは結合した値がkey/valueオブジェクトでしたが、6段目のフローでは単純にオブジェクト結合します。ざっくりとした流れは以下のとおりです。 DataノードでJSON配列を送信する nameをキーに持つオブジェクトとpriceをキーに持つオブジェクトを交互に含んでいます(実際、こんなに都合の良いデータが生成されることはあるんだろうか) Splitノードで配列データを個別のメッセージに分割します Joinノードで、2個の受信メッセージごとにオブジェクトに結合して送信する これを実行すると、以下のようにmsg.payloadに2個ずつのオブジェクトがJSONオブジェクトに結合されたものが指定されていることを確認できます。ちなみに、Joinノード...

Hacktoberfest 2021に参加したらTシャツもらえました

イメージ
 昨年10月、Hacktoberfest 2021に参加しました。具体的には、Node-REDの標準ノードの翻訳に参加して4つのコントリビュートがマージされました。タイミング的にギリギリだったので、ダメかなと諦めていたのですが、先日Tシャツが届きました。ステッカーもたくさん同梱されていました。なんか嬉しいです。 レビュアーの皆様、ありがとうございました。また何か機会があればよろしくお願いします。

Joinノードを使う(その3)

イメージ
ここのところずっと Node-RED のサンプルを見ながら各ノードの使い方を確認しています。 頭出しの記事はこちら をご確認ください。今回はJoinノードの3回目です。 確認するサンプルは、前回に引き続き「 読み込み > サンプル > flows > node-red > sequence > join > 02 - Manual join mode 」です。 msg.completeを使って結合する 3段目のフローから見ていきます。ざっくりとした流れは以下のとおりです。 Templateノードで「 msg.payload 」に改行区切りの文字列を指定する Splitノードでmsg.payloadの文字列を改行で区切って複数のメッセージに分離する Functionノードでは、受信したメッセージが特定の条件を満たしていた場合に「 msg.complete 」に「 true 」を指定する 条件:msg.payloadにBananaまたはKiwiが指定されていたら Joinノードでは、受信したメッセージの msg.completeプロパティが設定されていたらメッセージを送信 する(それまでに受信したメッセージはカンマで区切って文字列結合する) Templateノード Splitノード Joinノード 実行すると、msg.completeプロパティが指定されるまでに受信したメッセージが結合されたログが出力されます。 メッセージを結合して配列にする ここまでは結合した値が文字列でしたが、4段目のフローでは配列にします。TemplateノードとSplitノードは上述のサンプルと同じなので省略します。ポイントはJoinノードの出力が「 配列 」に設定されている点です。 これを実行すると、以下のようにmsg.payloadに文字列配列が指定されていることを確認できます。 まとめ このへんで一旦まとめておきます。 手動モードでは「msg.complete」プロパティを指定するとメッセージの結合を区切ることができます 「msg.complete」を指定するまでに入力されたメッセージが結合されます 結合後のデータ型は文字列の他に配列が指定できます たぶん、この後のサンプルで紹介することになると思いますが、データ型は他にも選択肢があります Joinノード...

痩せてみた

イメージ
はじめに ここ10ヶ月ほど、体重のコントロールに取り組み、安定的に運用できるようになりました。しかしながら、何かのきっかけでリバウンドしてしまう可能性はあります。いつの日か、リバウンドしてしまった際に再度コントロールを取り戻せるようここにメモを残しておきます。 成果 ダイエットを本格的に開始したのは2021年4月1日です。当時と今を比較してみます。 Before:2021年4月1日 体重:70.8kg 胴囲:85.7cm After:2022年1月18日 体重:58.5kg 胴囲:70.5cm ちなみに身長と標準体重は以下のとおりです。 身長:176.3cm 標準体重:68.4kg これ以降は、この状態に至るまでに経験したことを記録します。 きっかけ ちょっと前から、なんとなくお腹が出てきていたことが気になっていました。特に椅子に座った姿勢が顕著でしたが、気のせいだろうと思いこむことにしていました。そんな中、久々に会った方に開口一番「 お腹出ましたね 」と言われ、それが気のせいではないことをはっきり自覚しました。 やったこと 翌日から生活習慣を改めることにしました。やったことは極めてありがちなことばかりで、以下のような内容です。問題はこれらを継続できるかどうかでした。 毎日体重を測る 夕食のご飯は茶碗1杯まで 間食は控えめに 歩く 毎日体重を測る どこで仕入れた情報か忘れましたが、 ダイエットをするならまずは体重を測れ というのを思い出してなんとなく始めました。体重をこまめに測ると、その間にやった食事や運動、排泄などの行動がどの程度体重に影響を与えるか見えてきます。見えたらあとは効果のあることを継続するだけです。私は以下のルールで実施しました。 測定タイミングは少なくとも一日2回 夕食後寝る前 朝起きた後朝食前 測定前にトイレは済ませる 測定は全裸で 寝る前は一日の中で最も体重が大きく、朝食前は逆に最も小さいタイミングと考えました。測定タイミングを一定にすることで前日と比較ができるようになります。トイレと全裸のルールは体重のブレを生じさせる要素をなるべく減らして自分に言い訳させないのが目的です。 また、細かいことですが、体重計はGoogle Fit対応のものを利用しています。体重計に乗るだけで自動的にスマホ上に記録できるので便利です。 夕食のご飯は茶碗1杯まで 食事...

Joinノードを使う(その2)

イメージ
ここのところずっと Node-RED のサンプルを見ながら各ノードの使い方を確認しています。 頭出しの記事はこちら をご確認ください。今回はJoinノードの2回目です。 確認するサンプルは、「 読み込み > サンプル > flows > node-red > sequence > join > 02 - Manual join mode 」です。今度は「 手動モード 」だそうです。7つのフローから構成されています。ちょっと多すぎですが、それだけいろいろな使い方ができるのだと思います。 指定した個数のメッセージごとに結合する 一番上の段は、指定した個数のメッセージごと結合するサンプルです。左側のTemplateノードから設定を見ていきます。ここでは「 msg.payload 」に改行区切りの文字列を指定しています。 続いて、その右側にあるSplitノードです。msg.payloadには文字列が格納されているので、改行(\n)ごとに個別のmsgオブジェクトに分割します。今回の場合、4つのメッセージに分割されます。 続いて、Joinノードは以下のように設定されています。 たくさん設定が見えますが、以下の条件でメッセージを結合して送信するようです。 結合対象の入力メッセージのプロパティは「 msg.playload 」 出力はカンマ(,)区切りの文字列 msgオブジェクトを2つ受け取るか「 msg.complete 」プロパティが設定されたメッセージを受信したタイミングで送信 実行すると、4つに分割されていたであろうメッセージが以下のように2つに結合されています。 指定した時間内に受信したメッセージを結合する 2段目のフローでは、指定した時間内に届いたメッセージを結合します。例によって左から順に設定を見ていきます。TemplateノードとSplitノードは上述のサンプルと同じなので省略します。 続いて、Delayノードです。Splitノードで分割したメッセージの流量を1メッセージ/秒に制限します。 最後に、このフローのポイントとなるJoinノードです。最初のメッセージ受信から2秒経ったらメッセージを出力します。言い換えると、 2秒以内に受信したメッセージを結合する ってことでしょうね。 これを実行すると、最初に紹介したフロー同じようなログ...