2013/08/27

NoFloでFlow-based programmingを試してみる

NoFloFlow-based programmingという、 Yahoo! Pipesなどのように、コンポーネント同士を接続したグラフによってプログラミングを行うライブラリ/ツールです。

KickStarterで先月から出資者を募集中で、プロジェクトが成功したあかつきには、GUIプログラミングでいろいろなことができそうなかんじですが、今回はnofloをライブラリとして用いることを念頭に、テキストベースでこのツールを試してみました。

NoFloの導入

公式ドキュメントにあるとおり、次のような手順で導入します。

$ mkdir my-noflo-example-app && cd my-noflo-example-app
$ echo '{"name": "my-noflo-example-app", "version": "0.0.1"}' > package.json
$ npm install noflo --save
$ ./node_modules/.bin/noflo -h
Usage:
  noflo [OPTIONS] [ARGS]

Options: 
  -i, --interactive      Start an interactive NoFlo shell
      --debug            Start NoFlo in debug mode
  -v, --verbose          Log in verbose format
  -s, --subgraph         Log subgraph events
  -h, --help             Display help and usage details

簡単な例

ファイルを読み込んでそれを表示する例を次に示します。

$ cat ShowContents.fbp 
Read(ReadFile) OUT -> IN Display(Output)
'package.json' -> IN Read()

1行目はコンポーネントと接続先をごっちゃにした表記で、ノード名 (コンポーネント) 出力ポート名 -> 入力ポート名 ノード名 (コンポーネント)のような形式です。

コンポーネントは一言で言えばシンプルな機能の関数で、noflo導入時に60個ほど用意されているものです。コンポーネント一覧はnoflo list .で確認できます。

$ ./node_modules/.bin/noflo list . | grep -E '(ReadFile|Output)'
Output (/Users/safx/src/Sample/my-noflo-example-app/node_modules/noflo/src/components/Output.coffee)
ReadFile (/Users/safx/src/Sample/my-noflo-example-app/node_modules/noflo/src/components/ReadFile.coffee)
ReadFileRaw (/Users/safx/src/Sample/my-noflo-example-app/node_modules/noflo/src/components/ReadFileRaw.coffee)

1行目で、「ファイル読み込みコンポーネント」の出力を、「標準出力に表示するコンポーネント」の入力にしており、2行目ではその「ファイル読み込みコンポーネント」の入力に'package.json'を指定しています。

結果として、このフローでは次のような結果が得られます。

$ ./node_modules/.bin/noflo ShowContents.fbp 
'{\n  "name": "my-noflo-example-app",\n  "version": "0.0.1",\n  "dependencies": {\n    "noflo": "~0.3.4",\n    "noflo-filesystem": "~1.0.0"\n  }\n}\n'

例2: Base64エンコード

先ほどの例の出力前にBase64でエンコードさせる例は次のようになります。

Read(ReadFile) OUT -> IN Enc(Base64Encode)
Enc() OUT -> IN Display(Output)
'package.json' -> IN Read()

このときは、次のような結果が得られます。

$ ./node_modules/.bin/noflo ShowContents.fbp 
'ewogICJuYW1lIjogIm15LW5vZmxvLWV4YW1wbGUtYXBwIiwKICAidmVyc2lvbiI6ICIwLjAuMSIsCiAgImRlcGVuZGVuY2llcyI6IHsKICAgICJub2ZsbyI6ICJ+MC4zLjQiCiAgfQp9Cg=='

ちなみに、nofloはDOT形式の表示を出力できたりするので、この例をdotにして、Erdosで表示させた結果は次のようになります。

JSON

冗長になりますが、JSON形式もサポートしています。

次のjsonは最初のShowContents.fbpをJSON形式にしたものです。

$ cat ShowContents.json
{
    "properties": {
        "name": "Read a file"
    },
    "processes": {
        "ReadFile": {
            "component": "ReadFile",
            "display": { "x": 91, "y": 154 }
        },
        "Output": {
            "component": "Output",
            "display": { "x": 209, "y": 414 }
        }
    },
    "connections": [
        {
            "src": {
                "process": "ReadFile",
                "port": "out"
            },
            "tgt": {
                "process": "Output",
                "port": "in"
            }
        },
        {
            "data": "package.json",
            "tgt": {
                "process": "ReadFile",
                "port": "in"
            }
        }
    ]
}

JSONでも同じ結果が得られます。

$ ./node_modules/.bin/noflo ShowContents.json 
'{\n  "name": "my-noflo-example-app",\n  "version": "0.0.1",\n  "dependencies": {\n    "noflo": "~0.3.4"\n  }\n}\n'

他のコンポーネントの導入

nofloはコンポーネントをnpmで追加することができます。例えば、Twitter用のコンポーネントは次のようにして追加できます。

$ npm install noflo-twitter --save

公式のライブラリページには今のところ40個のほどのライブラリがあり、250個ほどのコンポーネントが利用できます。

おわりに

NoFloの導入の簡単な利用方法について簡単に紹介しました。

nofloのGUI開発環境のファンディングの締切りは2013年9月15日で、まだ目標金額にはすこし足りない状況ですので興味のあるかたはこちらもどうぞ。

なお、nofloと似たようなツールにMeemooというのがありますが、作者であるForrest Oliphantさんもnofloのコアチームの一員になっているみたいです。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。