昨日に引き続いてのSigmaCanvasネタです.
SigmaCanvasでは,データを処理するコンポーネントを用意しておいて,それらを組み合わせることで所望のシステムを実現すること,を目指しています.
今日は,9/11時点でのSigmaCanvasのコンポーネントの作り方を紹介します.
クイックスタート
SigmaCanvasで使うコンポーネントはすべてSigmaCanvasItemという抽象クラスを継承して実装します.SigmaCanvasItemはakka.Actorを継承していますので,コンポーネントはすべてActorとして動作することになります.
実装するメソッドは次の4つ.
- init():Unit
コンポーネントの初期化ルーチンを書いておくメソッド
- wakeup():Unit
すべてのコンポーネントの初期化が終わった後に一度だけ呼び出されるメソッド.
- run(m:SigmaCanvasMessage):Unit
処理本体を書くメソッド接続元からのメッセージを受信したときに呼ばれます
- data:Seq[AnyVal]
後続のモジュールに引き渡すデータ
たとえば,データをダンプするコンポーネントは,こんな感じで実装します.
class HexDump extends SigmaCanvasItem{ def init():Unit = {} def run(m:SigmaCanvasMessage):Unit = { val a = m.obj.data for((b, i) <- a.zipWithIndex){ if(i % 8 == 0) printf("%08x:", i) printf(" %02x", b) if(i % 8 == 7) printf("\n") } } def data:Seq[AnyVal] = null def wakeup():Unit = {} }
SigmaCavasItemで提供されているユーティリティメソッド
SigmaCanvasItemでは,コンポーネントを実装する上で必要となりそうなメッソドを提供しています.特にユーザが使うことになるメソッドは次の2つです.
- forwared_to_all(a:Any)
後続のコンポーネントにメッセージを送る時に呼び出します.どんなコンポーネントが後段に接続しているかは,XMLで定義されて接続関係を元にシステムが管理していますので,個々のコンポーネントが知る必要はありません.
- getParam(k:String):Option[String]
XMLファイルで設定されているパラメタを取得します.デフォルト値を設定しておきたい場合には,対になるputParam(k:String, v:String)メソッドを使って設定しておくこととよいでしょう.
たとえば,あらかじめ設定しておいた変換処理を行って後続を呼び出すというような処理を実装したければ,次のような関数になります.
def run(m:SigmaCanvasMessage):Unit = { val a = m.obj.data if(m.obj.data == null || conv == null || cond == null) return for{ (d, i) <- a.zipWithIndex if cond(i) } result.enqueue(conv(d)) while(result. > bufsize) result.dequeue(); forward_to_all() }
あとは書くだけ
上以外のルールは今のところないので,あとはユーザの自由にコンポーネントを記述し,それを組み合わせてシステムをつくることができます(できるはず…)
ScalaからJavaのライブラリ呼び出しは簡単なので,JFrame使って画面にグラフ化したり,JavaMail使ってメールを送ったりということもできます.
コメント