メンチカツには醤油でしょ!!

AWS/Java/Node.js/Spreadsheets/Docker/Jenkins/コミュニティ・勉強会レポを主とした技術系ブログ

Node-REDをv1.0にすると動かなくなるノード (htmlグローバル汚染編)

前置き

釣りなタイトルでスミマセン。

シリーズ化するかしないかはまだ決めていませんが、今後も地雷を踏むようであればまた書こうと思いますので、今回はhtmlグローバル汚染編と付けました。

Node-REDのv1.0が2019/09/30に出ました。いくつかの大きな変更があり、外観もさることながら内部の処理も変更になっています。既に公開されている多くのカスタムノードはv1.0未満で動作するよう書かれていますが、v1.0にすると動かなくなることもあると思います。このシリーズのエントリーでは、それがどういう現象なのか、どうして起こったのか、どう実装すれば良いのか、などを書いていきたいと思います。(前置き長っ)

現象 (不具合の内容)

インストール済のカスタムノードのうち、これに該当するものは、パレットに出現しなくなる。下記の画像はcustomカテゴリにカスタムノードをyour node 1, your node 2, your node 3の3種類を定義して再現させた図です。

f:id:ryoichi0102:20200207204728p:plain

表示されるはずのカスタムノードがパレットに表示されない

f:id:ryoichi0102:20200207204922p:plain

v0.20系だとちゃんと表示されています

原因や発生条件

htmlファイルのscriptブロックにおいて、RED.nodes.registerType()以外に、何かしらの定義がconstで行われており、その名称が他のノードの命名と被っている場合。

f:id:ryoichi0102:20200207205023p:plain

グローバルにconst定義して命名が被った場合の例

対応

各カスタムノードのスクリプトは、無名関数内で実行されるようにする。

<script type="text/javascript">
    // グローバル名前空間の汚染を避ける
    (() => {
        // ここにいつも書いている処理を書く.

        // oneditprepareやoneditsaveなどで呼び出されるような
        // 共通のfunction定義.
        const yourCommonFunctionFromCustomNode = () => {
            // 何かしらの処理.
        };

        // カスタムノードの定義.
        RED.nodes.registerType('your-custom-node', {
            // category: '',
            // ...
            // (略)
        });
    })();
</script>

あとがき

結構ハマりました。

参考

そもそもv1.0で何が変わったの?はコチラへ。

qiita.com

VNC ViewerでRaspberry Piに繋ぐときCannot currently show the dekstop

現象

VNC ViewerでRaspberry Piリモートデスクトップ接続をしようとした際に、Cannot currently show the dekstopと表示され、画面が表示されない。
また、HDMIケーブルを接続してラズパイを起動するとVNC接続はできます。ラズパイ起動後にHDMIを挿しても、VNCは繋がりません。

f:id:ryoichi0102:20190820230726p:plain

IoTの現場など本番環境に設置する際は、常にHDMI接続しているわけではないので困りますよね。自動起動にしてあるNode-REDなどはブラウザからアクセスできており動いていることが確認できるので、ラズパイが起動しているのは判っている。

環境

VNC Viewer
・OSは、2019-06-20-raspbian-buster.img
・GrovePi+
Raspberry Pi 3 Model B+

解決方法

HDMI接続をすることなくVNCで画面を出すにはラズパイをデスクトップモード(サービスモード)で起動する必要があります。HDMIを繋いだ時だけVNC接続できるのはこれが原因のようです。デスクトップモードで起動するには、config.txtで解像度を指定します。そのため、GUIのコンフィグツールで指定するか、/boot/config.txtを編集します。

sudo raspi-config

VNCを有効にします。

その後、

sudo nano /boot/config.txt

でconfig.txtを編集します。今回は、

#hdmi_force_hotplug=1

コメントアウトして

hdmi_force_hotplug=1

のように編集しました。

なお、デスクトップモードで起動しない場合は、Virtual modeにする必要があり、この場合はコマンドラインからvncserverを起動しないといけないのでなんか面倒な気がします。もしかして、Virtual modeだとRaspberry Piへの負荷が低いのかな??

参考

www.raspberrypi.org

www.raspberrypi.org

Node.jsのバージョンやNode-REDのバージョンを指定してRaspberry Piにインストールする

概要

Raspberry PiでNode-REDを利用していると、インストールしているカスタムノードの都合でNode.jsやNode-REDのバージョンを固定してインストールしたいってことがあります。

そんなときのやり方を紹介します。

そもそもインストールがどうなっているのか

公式サイトを見てみます。Node-RED日本ユーザー会⇒ドキュメント⇒Getting Started⇒Raspberry Pi のページにはこう書いてあります。

https://nodered.jp/docs/getting-started/raspberrypi#node-redをインストールする

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

これは、GitHub上のnode-redのlinux-installersリポジトリにある、devディレクトリのupdate-nodejs-and-noderedというファイルを取得して、実行するというコマンドです。

このコマンドの中にNode.jsとNode-REDのバージョン指定がされています。ファイルの全容はここで確認できます。執筆時点では、177行目212行目224行目にNode.jsのインストールコマンドが、259~263行目にNode-REDのインストールコマンドがあります。

Node.jsのインストールコマンドはaptコマンドで

sudo apt install -y nodejs

Node-REDのインストールコマンドはnpm iコマンドで

npm i -g --unsafe-perm --no-progress node-red@latest 

となっていますので、ここにそれぞれバージョンを指定するコマンドに変更します。なお、上記はコマンド前後のsudoやifを除いて抜粋してありますので、それぞれのコマンド行を見て、必要な箇所だけ変更しましょう。

aptでのバージョン指定

aptコマンドのバージョンの指定の仕方はapt install 【パッケージ名】=【バージョン名】のように、イコールでバージョンを付けます。

どんなバージョンがあるのかの調べ方はapt list -a 【パッケージ名】です。

pi@raspberrypi:~ $ apt list -a nodejs

一覧表示... 完了
nodejs/不明 10.18.1-1nodesource1 armhf [10.17.0-1nodesource1 からアップグレード可]
nodejs/now 10.17.0-1nodesource1 armhf [インストール済み、10.18.1-1nodesource1 にアップグレード可]
nodejs/stable 10.15.2~dfsg-2+rpi1 armh

バージョンなので 12.14.1 のような数字なのかと思いきや10.18.1-1nodesource1のような長い名称がバージョン名となっています。

sudo apt install -y nodejs=10.18.1-1nodesource1

のように変更すれば指定のバージョンでインストールできます。

なお、apt-cache showpkg 【パッケージ名】でもインストールできるバージョンの一覧を表示できます。

pi@raspberrypi:~ $ apt-cache showpkg nodejs

Package: nodejs
Versions:
10.18.1-1nodesource1 (/var/lib/apt/lists/deb.nodesource.com_node%5f10.x_dists_buster_main_binary-armhf_Packages)
 Description Language:
                 File: /var/lib/apt/lists/deb.nodesource.com_node%5f10.x_dists_buster_main_binary-armhf_Packages
                  MD5: 964493985d4a02c9abd7e062f9234325
 Description Language:
                 File: /var/lib/dpkg/status
                  MD5: 964493985d4a02c9abd7e062f9234325

10.17.0-1nodesource1 (/var/lib/dpkg/status)
 Description Language:
                 File: /var/lib/apt/lists/deb.nodesource.com_node%5f10.x_dists_buster_main_binary-armhf_Packages
                  MD5: 964493985d4a02c9abd7e062f9234325
 Description Language:
                 File: /var/lib/dpkg/status
                  MD5: 964493985d4a02c9abd7e062f9234325

10.15.2~dfsg-2+rpi1 (/var/lib/apt/lists/raspbian.raspberrypi.org_raspbian_dists_buster_main_binary-armhf_Packages)
 Description Language:
                 File: /var/lib/apt/lists/raspbian.raspberrypi.org_raspbian_dists_buster_main_binary-armhf_Packages
                  MD5: 0d0bbaed314d7d26588d112ee4ede074

(以下長いので略)

ちなみに、パッケージの詳細を表示するコマンドはapt show -a 【パッケージ名】です。

pi@raspberrypi:~ $ apt show -a nodejs

Package: nodejs
Version: 10.17.0-1nodesource1
Priority: optional
Section: web
Maintainer: Chris Lea <chl@nodesource.com>
Installed-Size: 72.5 MB
Provides: nodejs-dev, nodejs-legacy, npm
Depends: libc6 (>= 2.17), libgcc1 (>= 1:3.5), libstdc++6 (>= 4.9), python-minima                                                                                            l, ca-certificates
Conflicts: nodejs-dev, nodejs-legacy, npm
Replaces: nodejs-dev (<= 0.8.22), nodejs-legacy, npm (<= 1.2.14)
Homepage: https://nodejs.org
Download-Size: 14.2 MB
APT-Manual-Installed: yes
APT-Sources: https://deb.nodesource.com/node_10.x buster/main armhf Packages
Description: Node.js event-based server-side javascript engine
 Node.js is similar in design to and influenced by systems like
 Ruby's Event Machine or Python's Twisted.
 .
 It takes the event model a bit further - it presents the event
 loop as a language construct instead of as a library.
 .
 Node.js is bundled with several useful libraries to handle server tasks :
 System, Events, Standard I/O, Modules, Timers, Child Processes, POSIX,
 HTTP, Multipart Parsing, TCP, DNS, Assert, Path, URL, Query Strings.

Package: nodejs
Version: 10.15.2~dfsg-2+rpi1
Priority: optional
Section: javascript
Maintainer: Debian Javascript Maintainers <pkg-javascript-devel@lists.alioth.deb                                                                                            ian.org>
Installed-Size: 153 kB
Depends: libatomic1 (>= 4.8), libc-ares2 (>= 1.7.0), libc6 (>= 2.4), libgcc1 (>=                                                                                             1:3.0), libicu63 (>= 63.1-1~), libnghttp2-14 (>= 1.3.0), libnode64 (= 10.15.2~d                                                                                            fsg-2+rpi1), libssl1.1 (>= 1.1.0), libstdc++6 (>= 4.1.1), libuv1 (>= 1.20.0~), z                                                                                            lib1g (>= 1:1.1.4)
Recommends: ca-certificates, nodejs-doc
Suggests: npm
Conflicts: nodejs-legacy
Replaces: nodejs-legacy
Homepage: http://nodejs.org/
Download-Size: 86.5 kB
APT-Sources: http://raspbian.raspberrypi.org/raspbian buster/main armhf Packages
Description: evented I/O for V8 javascript - runtime executable
 Node.js is a platform built on Chrome's JavaScript runtime for easily
 building fast, scalable network applications. Node.js uses an
 event-driven, non-blocking I/O model that makes it lightweight and
 efficient, perfect for data-intensive real-time applications that run
 across distributed devices.
 .
 Node.js is bundled with several useful libraries to handle server
 tasks:
 .
 System, Events, Standard I/O, Modules, Timers, Child Processes, POSIX,
 HTTP, Multipart Parsing, TCP, DNS, Assert, Path, URL, Query Strings.

npm i コマンドのバージョン指定

npmでのバージョン指定はnpm i 【パッケージ名】@【バージョン名】です。

バージョンの検索方法は、npmリポジトリNode-REDのページを参照します。

www.npmjs.com

ページを開くと、上部にタブが Readme, Explorer, Dependencies, Dependents, Releases と並んでいますので、この中の Releases タブをクリックすると、バージョンの一覧が表示されます。

npm i -g --unsafe-perm --no-progress node-red@0.20.7 

のようにインストール対象のバージョンを指定します。

インストールスクリプトの変更

インストールコマンドは、

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

のようにスクリプトの取得と実行を同時に行うコマンドになっていますので、スクリプトファイルをダウンロード⇒ファイル変更⇒ファイル実行の順で行います。

pi@raspberrypi:~ $ wget https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered

で、まずはファイルを取得します。

pi@raspberrypi:~ $ nano update-nodejs-and-nodered

で、ファイルの編集をします。エディタはviでもnanoでもいいですが、nanoが便利なの。

pi@raspberrypi:~ $ sh update-nodejs-and-nodered

で、スクリプトの実行をします。

参考

nodered.jp

yomon.hatenablog.com