INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
本業の方のお仕事が再び忙しくなりつつあるので、断続的にしばらく更新が止まることがあります。

目次 | ←前へ / 2018-05-15 00:00 / 次へ→ / 最新へ⇒

■さっそくNode-REDの書き方で躓いてしまった…。定数的な変数の保持と再利用ってどうすんだろ

2018/ 5/15 0:00:00


RSSRSS配信中

https://www.inasoft.org/








昨日、Node-REDを覚えたので使いたいなぁ…なんてことを何気なく書きまして、色々実験していました。

現在、自宅内のRaspberry Piで行わせている処理の中に次のような流れのものがあります。

(cronで特定の日付日時で起動開始)

  1. 特定のIDと本日日付時刻を利用して作成した文字列でファイル名を作成し、変数Aにファイル名に入れる。
  2. ffmpegで音声ファイルをm4aファイルに変換し、変数Aの名称で保存する。
  3. 変数Aの名称のファイルを、scpでサーバ上へアップロードする。
実際にはもう少し複雑なことをやっていますが、単純かして上のような流れです。これを、Node-RED化したい。

考えた流れは次の通り。

injectで特定のIDを文字列として日時指定起動。

1でファイル名を作成し、msg.payloadに入れる。

2は[exec]でffmpegを実行し、出力ファイル名はmsg.payloadを引数として渡すようにする。

3は[exec]でsshpass&scpを実行し、転送元ファイル名を………どうやって渡そうか……?

いきなり困ってしまった。2でmsgは[exec]の出力(標準出力か、標準エラー出力か、戻り値)になってしまっているので、それを3に渡すことはできない。

何かmsg.payloadを保存しておく方法は無いか…と考えて、globalというものがあることを知った。

injectで特定のIDを文字列として日時指定起動。

1. ファイル名を作成し、msg.payloadに入れる。

2. msgをglobal内の変数に保管する。

3.[exec]でffmpegを実行し、出力ファイル名はmsg.payloadを引数として渡すようにする。

4.globalからmsgに変数に内容を復元。

5.[exec]でsshpass&scpを実行し、転送元ファイル名はmsg.payloadを引数として渡すようにする。


と、これで上手くいきそう。
と思ったのだが、よくよく考えてみたら、この流れは最大3多重で発生する可能性がある。つまり、後から実行された流れがglobalに保存したmsgを上書きしてしまう。コレじゃダメだ。

調べてみると、uuidを設定してその値ごとに保存/復元する方法等、いくつか方法はあるらしいけど、なんだか元々のシェルで書く方法より難しくなりそうな気がしてきた。できれば、こういった技術は物事を単純化させるために使いたい。

うーん、こういう混み入った場合の書き方のベストプラクティスを収集しておく必要がありそうだなぁ。



と、これを書き終わった後で、入力のmsgをそのまま出力のmsgとして返す方法はないかな…と考えていて、functionを使えないかと考えた。

msgを一切いじらず、functionの最後にreturn msg;としてしまえば、入力時のmsg内の変数はそのまま次に引き渡される。

問題はfunctionの中で[exec]相当の自由な実行ができないか…だが、

settings.jsに
functionGlobalContext: {
        child_process:require('child_process')
}


を追加。

var execSync = global.get('child_process').execSync;
execSync("/home/pi/a.sh"); /*←任意のコマンド*/
return msg;



でなんとかなるかな、と。



目次 | ←前へ / 2018-05-15 00:00 / 次へ→ / 最新へ⇒


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。




2560972 (+0119)[+0708]

Copyright© 2010-2021 INASOFT