Node-REDがかなり便利だった
いま開発している機械学習系のプロジェクトで、外部のAPIと連携させる必要があったのでNode-REDを導入してみました。
Node-REDを使うと、ハードウェアデバイス・API・オンラインサービスなどと連携するFlowをブラウザ上でヴィジュアル的に編集できるようになります。
Node.jsがインストール済みならば以下のコマンドでインストールできます。
$ npm install node-red
Node-REDはlatestバージョンのNode.jsが推奨されているので、Node.jsのバージョンが古いならばアップデートさせておくと良いでしょう。
Node-REDのファイル構成
現時点のNode-REDのファイル構成は以下の通りです。
└─┬ node-red@0.16.2
├── basic-auth@1.1.0
├─┬ bcrypt@1.0.2
│ ├── bindings@1.2.1
│ ├── nan@2.5.0
│ └─┬ node-pre-gyp@0.6.32
│ ├─┬ mkdirp@0.5.1
│ │ └── minimist@0.0.8
│ ├─┬ npmlog@4.0.2
│ │ ├─┬ are-we-there-yet@1.1.2
│ │ │ └── delegates@1.0.0
│ │ ├── console-control-strings@1.1.0
│ │ ├─┬ gauge@2.7.3
│ │ │ ├── aproba@1.1.1
│ │ │ ├── has-unicode@2.0.1
│ │ │ ├── object-assign@4.1.1
│ │ │ ├── signal-exit@3.0.2
│ │ │ ├─┬ string-width@1.0.2
│ │ │ │ ├── code-point-at@1.1.0
│ │ │ │ └─┬ is-fullwidth-code-point@1.0.0
│ │ │ │ └── number-is-nan@1.0.1
│ │ │ ├─┬ strip-ansi@3.0.1
│ │ │ │ └── ansi-regex@2.1.1
│ │ │ └── wide-align@1.1.0
│ │ └── set-blocking@2.0.0
│ ├─┬ rc@1.1.7
│ │ ├── deep-extend@0.4.1
│ │ ├── ini@1.3.4
│ │ ├── minimist@1.2.0
│ │ └── strip-json-comments@2.0.1
│ ├─┬ rimraf@2.5.4
│ │ └─┬ glob@7.1.1
│ │ ├── fs.realpath@1.0.0
│ │ ├── inflight@1.0.6
│ │ ├─┬ minimatch@3.0.3
│ │ │ └─┬ brace-expansion@1.1.7
│ │ │ ├── balanced-match@0.4.2
│ │ │ └── concat-map@0.0.1
│ │ └── path-is-absolute@1.0.1
│ ├─┬ tar@2.2.1
│ │ ├── block-stream@0.0.9
│ │ └── fstream@1.0.11
│ └─┬ tar-pack@3.3.0
│ ├── fstream-ignore@1.0.5
│ ├── once@1.3.3
│ ├─┬ readable-stream@2.1.5
│ │ └── string_decoder@0.10.31
│ └── uid-number@0.0.6
├── bcryptjs@2.4.0
├─┬ body-parser@1.15.2
│ ├── bytes@2.4.0
│ ├── content-type@1.0.2
│ ├─┬ debug@2.2.0
│ │ └── ms@0.7.1
│ ├── depd@1.1.0
│ ├─┬ http-errors@1.5.1
│ │ ├── setprototypeof@1.0.2
│ │ └── statuses@1.3.1
│ ├── iconv-lite@0.4.13
│ ├─┬ on-finished@2.3.0
│ │ └── ee-first@1.1.1
│ ├── qs@6.2.0
│ ├── raw-body@2.1.7
│ └─┬ type-is@1.6.15
│ └─┬ mime-types@2.1.15
│ └── mime-db@1.27.0
├─┬ cheerio@0.22.0
│ ├─┬ css-select@1.2.0
│ │ ├── boolbase@1.0.0
│ │ ├── css-what@2.1.0
│ │ ├── domutils@1.5.1
│ │ └── nth-check@1.0.1
│ ├─┬ dom-serializer@0.1.0
│ │ └── domelementtype@1.1.3
│ ├── entities@1.1.1
│ ├─┬ htmlparser2@3.9.2
│ │ ├── domelementtype@1.3.0
│ │ └── domhandler@2.3.0
│ ├── lodash.assignin@4.2.0
│ ├── lodash.bind@4.2.1
│ ├── lodash.defaults@4.2.0
│ ├── lodash.filter@4.6.0
│ ├── lodash.flatten@4.4.0
│ ├── lodash.foreach@4.5.0
│ ├── lodash.map@4.6.0
│ ├── lodash.merge@4.6.0
│ ├── lodash.pick@4.4.0
│ ├── lodash.reduce@4.6.0
│ ├── lodash.reject@4.6.0
│ └── lodash.some@4.6.0
├── clone@2.1.0
├─┬ cookie-parser@1.4.3
│ ├── cookie@0.3.1
│ └── cookie-signature@1.0.6
├─┬ cors@2.8.1
│ └── vary@1.1.1
├─┬ cron@1.2.1
│ └─┬ moment-timezone@0.5.13
│ └── moment@2.18.1
├─┬ express@4.14.0
│ ├─┬ accepts@1.3.3
│ │ └── negotiator@0.6.1
│ ├── array-flatten@1.1.1
│ ├── content-disposition@0.5.1
│ ├── encodeurl@1.0.1
│ ├── escape-html@1.0.3
│ ├── etag@1.7.0
│ ├── finalhandler@0.5.0
│ ├── fresh@0.3.0
│ ├── merge-descriptors@1.0.1
│ ├── methods@1.1.2
│ ├── parseurl@1.3.1
│ ├── path-to-regexp@0.1.7
│ ├─┬ proxy-addr@1.1.4
│ │ ├── forwarded@0.1.0
│ │ └── ipaddr.js@1.3.0
│ ├── qs@6.2.0
│ ├── range-parser@1.2.0
│ ├─┬ send@0.14.1
│ │ ├── destroy@1.0.4
│ │ └── mime@1.3.4
│ ├─┬ serve-static@1.11.2
│ │ └─┬ send@0.14.2
│ │ └── ms@0.7.2
│ └── utils-merge@1.0.0
├─┬ follow-redirects@1.2.1
│ └─┬ debug@2.6.3
│ └── ms@0.7.2
├─┬ fs-extra@1.0.0
│ ├── graceful-fs@4.1.11
│ ├── jsonfile@2.4.0
│ └── klaw@1.3.1
├─┬ fs.notify@0.0.4
│ ├── async@0.1.22
│ └── retry@0.6.1
├─┬ i18next@1.10.6
│ ├─┬ cookies@0.7.0
│ │ └── keygrip@1.0.1
│ ├── i18next-client@1.10.3
│ └── json5@0.2.0
├── is-utf8@0.2.1
├─┬ js-yaml@3.7.0
│ ├─┬ argparse@1.0.9
│ │ └── sprintf-js@1.0.3
│ └── esprima@2.7.3
├── json-stringify-safe@5.0.1
├── jsonata@1.0.10
├── media-typer@0.3.0
├─┬ mqtt@2.2.1
│ ├─┬ commist@1.0.0
│ │ ├── leven@1.0.2
│ │ └── minimist@1.2.0
│ ├─┬ concat-stream@1.6.0
│ │ └── typedarray@0.0.6
│ ├─┬ end-of-stream@1.4.0
│ │ └─┬ once@1.4.0
│ │ └── wrappy@1.0.2
│ ├─┬ help-me@1.1.0
│ │ ├── callback-stream@1.1.0
│ │ ├─┬ glob-stream@6.1.0
│ │ │ ├─┬ glob-parent@3.1.0
│ │ │ │ ├─┬ is-glob@3.1.0
│ │ │ │ │ └── is-extglob@2.1.1
│ │ │ │ └── path-dirname@1.0.2
│ │ │ ├── is-negated-glob@1.0.0
│ │ │ ├─┬ ordered-read-streams@1.0.0
│ │ │ │ └── is-stream@1.1.0
│ │ │ ├── pumpify@1.3.5
│ │ │ ├── remove-trailing-separator@1.0.1
│ │ │ ├─┬ to-absolute-glob@2.0.1
│ │ │ │ ├─┬ extend-shallow@2.0.1
│ │ │ │ │ └── is-extendable@0.1.1
│ │ │ │ └─┬ is-absolute@0.2.6
│ │ │ │ ├─┬ is-relative@0.2.1
│ │ │ │ │ └─┬ is-unc-path@0.1.2
│ │ │ │ │ └── unc-path-regex@0.1.2
│ │ │ │ └── is-windows@0.2.0
│ │ │ └─┬ unique-stream@2.2.1
│ │ │ ├─┬ json-stable-stringify@1.0.1
│ │ │ │ └── jsonify@0.0.0
│ │ │ └── through2-filter@2.0.0
│ │ └── through2@2.0.3
│ ├── inherits@2.0.3
│ ├── minimist@1.2.0
│ ├─┬ mqtt-packet@5.3.0
│ │ ├── bl@1.2.0
│ │ ├── process-nextick-args@1.0.7
│ │ └── safe-buffer@5.0.1
│ ├── pump@1.0.2
│ ├─┬ readable-stream@2.2.9
│ │ ├── buffer-shims@1.0.0
│ │ ├── core-util-is@1.0.2
│ │ ├── isarray@1.0.0
│ │ ├── string_decoder@1.0.0
│ │ └── util-deprecate@1.0.2
│ ├── reinterval@1.1.0
│ ├── split2@2.1.1
│ ├─┬ websocket-stream@3.3.3
│ │ └─┬ duplexify@3.5.0
│ │ ├─┬ end-of-stream@1.0.0
│ │ │ └── once@1.3.3
│ │ └── stream-shift@1.0.0
│ └── xtend@4.0.1
├── mustache@2.3.0
├─┬ node-red-node-email@0.1.22
│ ├─┬ imap@0.8.19
│ │ ├─┬ readable-stream@1.1.14
│ │ │ ├── isarray@0.0.1
│ │ │ └── string_decoder@0.10.31
│ │ └── utf7@1.0.2
│ ├─┬ mailparser@0.6.2
│ │ ├── encoding@0.1.12
│ │ ├─┬ mimelib@0.3.0
│ │ │ └── addressparser@1.0.1
│ │ └── uue@3.1.0
│ ├─┬ nodemailer@1.11.0
│ │ ├─┬ libmime@1.2.0
│ │ │ ├── libbase64@0.1.0
│ │ │ └── libqp@1.1.0
│ │ ├─┬ mailcomposer@2.1.0
│ │ │ └─┬ buildmail@2.0.0
│ │ │ ├── addressparser@0.3.2
│ │ │ └── needle@0.10.0
│ │ ├── needle@0.11.0
│ │ ├─┬ nodemailer-direct-transport@1.1.0
│ │ │ └── smtp-connection@1.3.8
│ │ └─┬ nodemailer-smtp-transport@1.1.0
│ │ ├── clone@1.0.2
│ │ └── nodemailer-wellknown@0.1.10
│ └─┬ poplib@0.1.7
│ └─┬ optimist@0.6.1
│ └── wordwrap@0.0.3
├─┬ node-red-node-feedparser@0.1.7
│ ├─┬ feedparser@1.1.3
│ │ ├── addressparser@0.1.3
│ │ ├── array-indexofobject@0.0.1
│ │ └─┬ readable-stream@1.0.34
│ │ ├── isarray@0.0.1
│ │ └── string_decoder@0.10.31
│ └─┬ request@2.74.0
│ ├── aws-sign2@0.6.0
│ ├── aws4@1.6.0
│ ├─┬ bl@1.1.2
│ │ └─┬ readable-stream@2.0.6
│ │ └── string_decoder@0.10.31
│ ├── caseless@0.11.0
│ ├─┬ combined-stream@1.0.5
│ │ └── delayed-stream@1.0.0
│ ├── extend@3.0.0
│ ├── forever-agent@0.6.1
│ ├─┬ form-data@1.0.1
│ │ └── async@2.3.0
│ ├─┬ har-validator@2.0.6
│ │ ├─┬ chalk@1.1.3
│ │ │ ├── ansi-styles@2.2.1
│ │ │ ├── escape-string-regexp@1.0.5
│ │ │ ├── has-ansi@2.0.0
│ │ │ └── supports-color@2.0.0
│ │ ├─┬ commander@2.9.0
│ │ │ └── graceful-readlink@1.0.1
│ │ ├─┬ is-my-json-valid@2.16.0
│ │ │ ├── generate-function@2.0.0
│ │ │ ├─┬ generate-object-property@1.2.0
│ │ │ │ └── is-property@1.0.2
│ │ │ └── jsonpointer@4.0.1
│ │ └─┬ pinkie-promise@2.0.1
│ │ └── pinkie@2.0.4
│ ├─┬ hawk@3.1.3
│ │ ├── boom@2.10.1
│ │ ├── cryptiles@2.0.5
│ │ ├── hoek@2.16.3
│ │ └── sntp@1.0.9
│ ├─┬ http-signature@1.1.1
│ │ ├── assert-plus@0.2.0
│ │ ├─┬ jsprim@1.4.0
│ │ │ ├── assert-plus@1.0.0
│ │ │ ├── extsprintf@1.0.2
│ │ │ ├── json-schema@0.2.3
│ │ │ └── verror@1.3.6
│ │ └─┬ sshpk@1.13.0
│ │ ├── asn1@0.2.3
│ │ ├── assert-plus@1.0.0
│ │ ├── bcrypt-pbkdf@1.0.1
│ │ ├─┬ dashdash@1.14.1
│ │ │ └── assert-plus@1.0.0
│ │ ├── ecc-jsbn@0.1.1
│ │ ├─┬ getpass@0.1.6
│ │ │ └── assert-plus@1.0.0
│ │ ├── jodid25519@1.0.2
│ │ ├── jsbn@0.1.1
│ │ └── tweetnacl@0.14.5
│ ├── is-typedarray@1.0.0
│ ├── isstream@0.1.2
│ ├── node-uuid@1.4.8
│ ├── oauth-sign@0.8.2
│ ├── qs@6.2.3
│ ├── stringstream@0.0.5
│ ├─┬ tough-cookie@2.3.2
│ │ └── punycode@1.4.1
│ └── tunnel-agent@0.4.3
├── node-red-node-rbe@0.1.8
├─┬ node-red-node-twitter@0.1.10
│ ├── oauth@0.9.14
│ ├─┬ request@2.81.0
│ │ ├── caseless@0.12.0
│ │ ├─┬ form-data@2.1.4
│ │ │ └── asynckit@0.4.0
│ │ ├─┬ har-validator@4.2.1
│ │ │ ├─┬ ajv@4.11.7
│ │ │ │ └── co@4.6.0
│ │ │ └── har-schema@1.0.5
│ │ ├── performance-now@0.2.0
│ │ ├── qs@6.4.0
│ │ ├── tunnel-agent@0.6.0
│ │ └── uuid@3.0.1
│ └── twitter-ng@0.6.2
├─┬ nopt@3.0.6
│ └── abbrev@1.1.0
├─┬ oauth2orize@1.7.0
│ └── uid2@0.0.3
├── on-headers@1.0.1
├─┬ passport@0.3.2
│ ├── passport-strategy@1.0.0
│ └── pause@0.0.1
├── passport-http-bearer@1.0.1
├── passport-oauth2-client-password@0.1.2
├─┬ raw-body@2.2.0
│ ├── iconv-lite@0.4.15
│ └── unpipe@1.0.0
├── semver@5.3.0
├── sentiment@2.1.0
├─┬ uglify-js@2.7.5
│ ├── async@0.2.10
│ ├── source-map@0.5.6
│ ├── uglify-to-browserify@1.0.2
│ └─┬ yargs@3.10.0
│ ├── camelcase@1.2.1
│ ├─┬ cliui@2.1.0
│ │ ├─┬ center-align@0.1.3
│ │ │ ├─┬ align-text@0.1.4
│ │ │ │ ├─┬ kind-of@3.1.0
│ │ │ │ │ └── is-buffer@1.1.5
│ │ │ │ ├── longest@1.0.1
│ │ │ │ └── repeat-string@1.6.1
│ │ │ └── lazy-cache@1.0.4
│ │ ├── right-align@0.1.3
│ │ └── wordwrap@0.0.2
│ ├── decamelize@1.2.0
│ └── window-size@0.1.0
├── when@3.7.7
├─┬ ws@1.1.1
│ ├── options@0.0.6
│ └── ultron@1.0.2
└─┬ xml2js@0.4.17
├── sax@0.6.1
└─┬ xmlbuilder@4.2.1
└── lodash@4.17.4