世界を動かす技術を、日本語で。

HNを表示: Node-REDに触発されたErlangのための視覚的フローベースプログラミング

2025年5月16日原文(github.com)

概要

  • Erlang-RED は、Node-REDのNodeJSバックエンドをErlangで置き換える実験的プロジェクト。
  • Erlang の並行処理・メッセージパッシング性能を活かし、Node-REDの低コード・視覚的フロー構築の利点を融合することが狙い。
  • Node-REDの既存フローコードとの 高い互換性 を目指すが、JavaScriptで書かれたfunctionノード等は未サポート。
  • テスト駆動開発 で進行し、ユニットテストや視覚的テストが統合されているのが特徴。
  • Docker・Heroku・Fly.io など多様なデプロイ手段をサポート。

Erlang-RED:Node-REDバックエンドをErlangで再実装する実験

プロジェクトの目的と背景

  • Node-REDの NodeJSバックエンド を、 Erlang による100%互換(functionノード等除く)実装に置き換えることを目標とする提案。
  • Node-REDは 拡張性・可読性・使いやすさ に優れる一方、NodeJSが シングルスレッド である点が課題認識。
  • Erlangは マルチプロセス・並行性 に優れ、 メッセージパッシング を前提とした設計であるため、Node-REDのフロー構築と親和性が高いと判断。
  • Erlangの 難解な文法 を、Node-REDの 視覚的・低コード なフロー設計で補完することを目指す発想。

開発戦略

  • テストフロー駆動開発 (flow driven development)を採用し、Node-REDのフローと同等の動作をテストで保証する方針。
  • テストフローは 別リポジトリ で管理し、保守性とNode-REDとの連携性を確保すること。
  • アーキテクチャは ノード間の相互依存 が多く、設計図は複雑になる傾向がある点を認識しつつ進行。

サポート中のノード・機能

  • catch :例外キャッチ(グループ未対応)
  • change :多くのオペレータ対応、基本的なJSONataもサポート
  • complete :一部ノードで利用可能
  • csv :RFC4180準拠、カンマ区切りのみ
  • debug :メッセージ全体のみ対応、プロパティ単位不可
  • delay :静的ディレイのみ、動的ディレイ未対応
  • exec :spawnモードでのコマンド実行・kill・タイムアウト対応
  • file in :/priv配下のファイル対応
  • function :Erlangコードのみ対応、タイムアウト・複数出力未対応
  • http in/request/response :GET/POSTのみ、一部制限あり
  • inject/join/json/junction/link/markdown/mqtt/noop/split/status/switch/template/trigger :各ノード基本機能を部分的にサポート
  • Contexts(flow/node/global) :未サポート
  • JSONata :Erlangで部分実装

Elixirとの連携

  • Elixirヘルパー をerlang-red-elixir-helpersリポジトリで管理し、ErlangノードからElixirノードも利用可能。
  • Elixirコードの直接利用も可能だが、基本はErlang構文を優先。
  • Earmark 等のElixirライブラリもErlangノード経由で参照可能。

ビルド・テスト・開発

  • ビルドrebar3 get-deps && rebar3 compileで依存取得とコンパイル
  • テストrebar3 eunitでユニットテスト実行
  • 開発rebar3 shell --apps erlang_redで開発シェル起動
  • エディタ起動open -a Firefox http://localhost:9090/node-redでNode-REDエディタ表示

Docker・デプロイメント

  • Docker開発 :リポジトリをクローンし、ボリュームマウント・ポート指定でErlang-REDを起動すること
  • リリースビルドrebar3 as prod release -n erlang_redでリリースパッケージ作成
  • Fly.ioDockerfile.flyとシェルスクリプトで簡単にデプロイ可能
  • Heroku :コンテナスタック利用、Dockerfile.herokuで指定フローのみ実行(エディタ無効化も可能)

テスト・ユニットテスト・視覚的テスト

  • ユニットテスト :Node-REDのエクスポートダイアログに「Create Test Case」ボタンを追加し、テストフローを視覚的に管理・実行
  • assertノード :メッセージ到達でテスト失敗、属性テスト等で正確な検証を実現
  • 視覚的ユニットテスト :テスト結果を一覧・個別実行・失敗箇所をデバッグパネルに通知し、フロー実装との互換性を担保

コントリビューションと関連リポジトリ

  • Erlangコード・Node-REDテストフロー の貢献を歓迎、Elixirコードは専用リポジトリで管理
  • 各テストフローは1機能に特化し、assertノードで検証すること
  • ユニットテストフロースイート はNode-RED/Erlang-RED両方で実行可能、FlowHub.orgで管理
  • JSONataサポート はErlangパーサーで部分的に実装、必要に応じて拡張可能
  • BEAM VM 上で動作するため、Erlang/Elixir等様々な言語の統合が視野

FAQ・コミュニティ

  • 質問・議論は Erlang ForumNode-RED Forum で受付
  • 詳細や議論は各種ドキュメント・フォーラム参照

追伸

  • Erlang-REDは、Erlangの 軽量プロセス・メッセージパッシング の利点をNode-REDのフローに活かすことを目指すプロジェクト
  • HNコミュニティからの フィードバック を歓迎

Hackerたちの意見

これいいね!例のセクションをもうちょっと上に移動させたらどうかな?見た目がすごく良くて、システムがどんな感じかをより良く伝えてくれると思う。ノードベースの環境ではこれが重要だよね。

一例として、私がErlang-REDを使って作ったウェブサイトがあるんだ[1] でもまだ初期段階だから、良い例はまだ思いついてないんだ。Erlangコミュニティからいくつかの例をもらって実装したいんだけど、もしアイデアがあればぜひ連絡してほしいな![1] https://red-erik.org

これには何年も興味があったんだ。他に似たようなプロジェクト知ってる?他の言語をターゲットにしてるやつとか。プログラミングのこのアプローチの主な問題点は何?大きなプログラムは扱いづらいの?

Py-Redっていうのは知ってるよ。Pythonで同じことをしようとしてるやつだね。Node-REDをフロントエンドにして、他のものをバックエンドに使う感じ。似たようなものは聞いたことないな。視覚的なフローベースのプログラミングの主な問題はツールだよね。視覚的な比較やバージョン管理をするための良いツールがないんだ。GitHubみたいなのは、エディタで見えるフローコードをレンダリングできないし。Node-REDの場合、フローを定義するJsonは比較できるけど、すぐに意味がなくなっちゃう。意味的な変更が視覚的な変更と混ざっちゃうから、ノードのx,y座標が変わったって、コードの論理には意味がないんだ。だから、コードの共有や共同開発が視覚的には難しいけど、ツールが不足してるからなんだよね。テキストプログラミングの時代も、SourceForgeやGitみたいなものがあったけど、今の視覚的コーディングと同じ問題があったよ。Node-REDには大きなプログラムをメンテナンスしやすくするための機能がたくさんある。フロー間をジャンプできるリンクノードみたいなものもあって、コードの再利用もできる。繰り返しのコードをカプセル化して、どこからでも参照できるサブフローもある。それがNode-REDを選んだ理由でもあるんだ。最も成熟していて、よくメンテナンスされているローコードの視覚的フローベースプログラミングツールだと思う。他にもn8nみたいな大きなものもあるけど、Node-REDの汎用性には欠けてるね。Node-REDを使ってウェブサイトを作りながら、RaspberryのインストールでLEDも制御できるんだ。Node-REDはめっちゃ柔軟だよ。

Unreal Blueprintが多分一番人気だね。かなりカスタマイズされたC++フレームワークの上にあるカスタムシステムだよ。ビジュアルスクリプティングはすごく生産的になり得るけど、これらの視覚的スクリプトはテキストにきれいに戻せないことが多いから、数十年分のツールを捨てちゃうことになるんだ。マージもうまくいかないことが多いし。

これはフローベースのプログラミングじゃなくて、ビジュアルプログラミングに関係してるんだ。PythonでホストされたLispインタプリタを修正して、JSON風のLisp - JLISPを読み込めるようにしたんだ。LispよりもウェブフロントエンドがJSONを出力する方がずっと簡単だからね。それから、この言語を中心にしたシンプルなローコードUIを作ったよ。エディタは、CADソフトのタイムラインみたいに左から右にLisp関数の呼び出しを整理してあって、個々の操作をクリックすると引数を編集できるんだ。システムを紹介するビデオはこちらだよ https://youtu.be/3Tf3lnuZcj8 編集可能なノートブック(読み込みが遅いけど、WASMでPythonを実行するよ) https://marimo.io/p/@paddy-mullen/jlisp-in-buckaroo 近いうちに静的にエクスポートされたJupyterノートブックを作るつもり。

まあ、こんな問題に関するページもあるよ; https://scriptsofanotherdimension.tumblr.com/ https://blueprintsfromhell.tumblr.com/ そして一番の問題は、強い制約が画面/ディスプレイのサイズなんだよね --- 一つの画面に収まらないコードの塊は追いかけるのが難しくなるし(次はどっちにスクロールすればいいの?)、モジュールを宣言するのが当然だと思ったら、結局は逃げようとしてたテキストの壁にぶつかることになる --- 各単語がきれいなボックスに包まれて、線で飾られてるだけなんだ。私の考えでは、アルゴリズムはどう見えるのかという質問に対する答えがまだないってことだね。それはさておき、できるときはこのスタイルで作業してるよ。よく使うのは: https://www.blockscad3d.com/editor/ でデザインをざっくり作ったり、もっと複雑なプロジェクトには: https://github.com/derkork/openscad-graph-editor を使ったりしてる --- ただ、その後者は通常、私が作業している特別なライブラリを使ってるけどね: https://github.com/WillAdams/gcodepreview

ここにいくつかの提案があるみたいだけど、nodescript.devを試してみるのもいいかも。これもnodejsベースだし。ちなみに、私はこのプロジェクトにちょっと関わってるんだ。

昨夜、Erlangの代わりにFLENGを使ってこんなの作ろうと思ってたんだ ;) Node-REDからインスパイアを受ける人が増えてるのがすごく嬉しい!絶対にこれで遊んでみるよ!

FLENG[1] - すごい、「Prologから派生した低レベルの並行論理プログラミング言語」って、Erlangと同じ系譜だから簡単に置き換えられそうだね。 ;)

Erlangのコースや本をおすすめしてくれる人いる?

learn you some erlangっていうのをよく見かけるんだけど、これはいいオンラインリソースみたいだね。その著者は「Erlang in Anger」って本も書いてるし、BEAMの本もあって、ErlangとBEAM仮想マシンについて深く掘り下げてるよ。Erlangを始めたばかりだから、あんまり詳しいことは言えないけどね!視覚的にコーディングする方が好きだな :)

Hacker Newsで議論の続きを見る