投稿

2月, 2022の投稿を表示しています

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秒以内に受信したメッセージを結合する ってことでしょうね。 これを実行すると、最初に紹介したフロー同じようなログ

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

イメージ
ここのところずっと Node-RED のサンプルを見ながら各ノードの使い方を確認しています。 頭出しの記事はこちら をご確認ください。今回はJoinノードを見ていきます。その名の通り、複数のメッセージを結合するのが役割です。前回ご紹介したSplitとは逆ですね。 確認するサンプルは、「 読み込み > サンプル > flows > node-red > sequence > join > 01 - Automatic join mode 」です。「 自動モード 」とやらがポイントのようです。3つのフローから構成されているので順に見ていきます。 Splitノードで分割したメッセージをJoinノードの自動モードで結合する 一番上の段は、Splitノードで分割したメッセージをJoinノードの自動モードで結合するサンプルです。左側のTemplateノードから設定を見ていきます。ここでは「 msg.payload 」に改行区切りの文字列を指定しています。 続いて、その右側にあるSplitノードです。msg.payloadには文字列が格納されているので、改行(\n)ごとに個別のmsgオブジェクトに分割します。 続いて、Joinノードは以下のように設定されています。 動作:自動 このモードでは、本ノードがSplitノードと組となるか、 msg.parts プロパティが設定されたメッセージを受け取ることが前提となります。 このフローではmsg.partsプロパティは存在しないため、Splitノードと組となることが前提で動作します。実行すると以下のように4つに分割されたであろうメッセージが1つに結合されています。 これだけ見ると、分割した文字列をものをそのまま結合しただけなので、何が嬉しいのかサッパリ理解できませんが、ここでは基本的な動作はこういうものだと認識するのに留め、次のフローを確認していきます。 CSVデータをJSON配列に変換する 続いて2段目のフローでは、CSVデータをJSON配列に変換するサンプルです。結構使える場面が多いのではないでしょうか。例によって左から順に設定を見ていきます。Templateノードではmsg.payloadにCSVデータが指定されています。1列目が「name」で文字列データ、2列目が「price」で数値データ。各

Splitノードを使う

イメージ
 ここのところずっと Node-RED のサンプルを見ながら各ノードの使い方を確認しています。 頭出しの記事はこちら をご確認ください。今回はSplitノードを見ていきます。その名の通り、とにかくいろいろな値を分割するのが役割です。 確認するサンプルは、「 読み込み > サンプル > flows > node-red > sequence > split > 01 - Split message payload 」です。 4つのフローから構成されています。順に見ていきます。 特定の文字で文字列を分割する 一番上の段は入力「 msg.payload 」内の文字列を、指定した文字列(サンプルでは改行\n)で分割します。 msg.payloadには改行(\n)で区切られた文字列が指定されています。 実行すると、デバッグパネルに3件のログが出力されます。 一定の文字数ごとに文字列を分割する 続いて2段目のフローでは、入力「 msg.payload 」内の文字列を、指定した文字数ごとに分割します。 msg.payloadには先ほどと同じく改行(\n)で区切られた文字列が指定されています。これを実行すると、改行コード含め4文字ごとに分割されてログが出力されます。 配列を分割する 3段目のフローでは、入力「 msg.payload 」内の配列を、指定した要素数(サンプルでは1)ごとに分割します。 msg.payloadには文字列を要素に持つJSON配列が指定されています。 これを実行すると、配列の要素ごとにログが出力されます。 オブジェクトを分割する 最後の4段目のフローでは、入力「 msg.payload 」内のJSONオブジェクトをkey/valueの要素ごとに分割します。加えて、分割後のmsgオブジェクトの「 msg.topic 」にkeyに相当する文字列を格納します。 msg.payloadにはJSONオブジェクトが設定されています。 これを実行すると、要素ごとにログが出力されます。上述のSplitノードの設定通り「 msg.topic 」にkeyに相当する文字列が格納されていることと、「 msg.payload 」にvalueに相当する数値が格納されていることが確認できます。 まとめ ここまで確認したことをまとめます。 msg.pay

Udpノードを使う

イメージ
ここのところずっと Node-RED のサンプルを見ながら各ノードの使い方を確認しています。 頭出しの記事はこちら をご確認ください。今回はUdpノードを見ていきます。構成はほとんどTcpノードのサンプルと同じです。通信プロトコルがUDPを使っているだけで、表面上はTCPノードのサンプルと変わりません。ということで、これ以降全部省略してもいいのですが、サンプルを全部舐めることに意義があるので、儀式的に記事を書きます。 UDPクライアントからメッセージを送信する 確認するサンプルは、「 読み込み > サンプル > flows > node-red > network > udp > 01 - Transfer data using UDP protocol 」です。 上段のUdp outノードを確認すると、以下のように設定されています。 送信:UDPメッセージ ポート:1881 アドレス:localhost, ipv4 ローカルポートをランダムに使用 localhostのポート番号1881番にipv4上でUDPメッセージを送信するようです。設定によってはブロードキャストメッセージやマルチキャストメッセージも送信できるようです。ipv6も選べます。 続いて、下段のUcp inノードを確認すると、以下のように設定されています。 待ち受け:UDPメッセージ ポート:1881 種類:ipv4 出力:文字列 こちらは、UDPメッセージを待ち受けるようです。 Injectノードを実行すると、デバッグパネルに「 Hello, World! 」のログが出力されます。上段のフローで送信したUDPメッセージを下段のフローで受信してログ出力しています。 一応、動いてはいますが、これだけだとNode−RED内で完結してしまっているのでUDPサーバが動いている実感が湧きません。そこで、netcatコマンドを使ってUDPサーバにメッセージを送信してみます。 $ netcat -u localhost 1881 unko unko Node-REDのデバッグパネルを確認するとnetcatから送信した美しいメッセージが表示されています。以上で、UDPクライアントからメッセージを送信できました。 まとめ ここまで確認したことをまとめます。 Udp outノードを利用

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

イメージ
ここのところずっと Node-RED のサンプルを見ながら各ノードの使い方を確認しています。 頭出しの記事はこちら をご確認ください。今回はTcpノードの最終回です。 前々回の記事 では、サーバからクライアントにメッセージを送信しました。 前回の記事 では、クライアントからサーバにメッセージを送信しました。今回は、クライアントからサーバにメッセージを送信し、そのコネクション上でサーバからクライアントにメッセージを返信します。普通のTCPクライアントとサーバのやり取りをまるっと実装します。 TCPクライアントとサーバ間でメッセージを送受信する 確認するサンプルは、「 読み込み > サンプル > flows > node-red > network > tcp > 03 - Send reply to client of TCP connection 」です。 上段はサーバに対してリクエストを送信後、サーバからのメッセージの返信を待ち受けるクライアントのフローです。グレーのTcp requestノードを確認すると、以下のように設定されています。 サーバ:localhost ポート:1883 戻り値:指定文字の受信時 \n Injectノードでは「Hello, World!\n」という文字列をpayloadに指定して送信しています。 一方、下段は接続を待ち受けるサーバサイドのフローです。Tcp inノードを確認すると、以下のように設定されています。 種類:待ち受け ポート:1883 出力:ストリーム文字列のペイロード 区切り文字:\n 続いて、Changeノードを確認すると、msg.payloadの値を加工して、先頭に「Received: 」、末尾に改行コードを付加しています。 最後に、Tcp outノードは次のように設定されています。雰囲気的にmsg.payloadの内容をレスポンスとして返すんでしょうね。 種類:TCP応答 Injectノードを実行すると、デバッグパネルに「 Received: Hello, World!\n 」のログが出力されます。 上段のフローで「Hello, World!」のメッセージをサーバに送信する 下段のフローでサーバがメッセージを受信し、メッセージを加工してクライアントに返信する 上段のフローでサーバが