ミルク

グラフシミュレータの名前を改めて,「ミルク」というよく分からない名前で,プログラム名称で開発を行ってしまった...まあ,名前に深い意味はない.ただ,なんとなくだ.
最新版のグラフシミュレータは,軽量データフロー処理コンテナ(なんだそりゃ)になる予定.いまは,プロトタイプを作成していて,技術的な問題点を明らかにしている最中.
前バージョンの反省を活かし,新バージョンでは,ユーザが作成するのは次の2種類のファイルになる予定.

  1. 処理内容を記述する設定ファイル
  2. 実際の処理を行うJavaファイル

設定ファイル

設定ファイルは,処理の流れを記述します.具体的には,次のような記述になります.


  
    
    
    
    
  
  
    
    
    
    
  

上記の記述における処理の流れは,こんな感じ.

  1. 標準入力から文字列を行単位で受け取ります.(jp.ifdef.myanya.milk.sample.StdIn)
  2. 文字列を,小文字変換,大文字変換し,二つの新しい文字列を作ります.(jp.ifdef.myanya.milk.sample.ProcessA)
  3. 二つの文字列を,で結合します.(jp.ifdef.myanya.milk.sample.ProcessB)
  4. 結合した文字列を,標準出力に表示します.(jp.ifdef.myanya.milk.sample.StdOut)

Java記述

それぞれ4つのJava記述は次のような感じ.

StdIn
package jp.ifdef.myanya.milk.sample;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class StdIn {
  private BufferedReader input;
  private boolean finished;
  public StdIn(){
    input = new BufferedReader( new InputStreamReader(System.in) );
    finished = false;
  }
  public boolean eval( String[] out ) {
    try {
      out[0] = input.readLine();
      if( out[0] == null ) finished = true;
    }catch( IOException e ){
      finished = true;
    }
    return !finished;
  }	
}

標準入力から文字列を受け取るJavaファイルです.

ProcessA
package jp.ifdef.myanya.milk.sample;

public class ProcessA {
  public boolean eval( String in, String out0, String out1 ) {
    out0[0] = in.toLowerCase();
    out1[0] = in.toUpperCase();
    return true;
  }
}

入力された文字列を,大文字,小文字へと変換します.

ProcessB
package jp.ifdef.myanya.milk.sample;
public class ProcessB {
  public boolean eval( String in0, String in1, String[] out ) {
    out[0] = in0 + " : " + in1;
    return true;
  }
}

二つの文字列を結合します.

StdOut
package jp.ifdef.myanya.milk.sample;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class StdOut {
  private BufferedWriter output;
  public StdOut(){
    output = new BufferedWriter( new OutputStreamWriter(System.out) );
  }
  public boolean eval( String in ) {
    try {
      output.write( in.toString() );
      output.newLine();
      output.flush();
    }catch( IOException e ){}
    return true;
  }
}

入力された文字列を,標準出力へと出力します.

実行結果

>>aaaa
>>bbbb
>>dddd
aaaa : AAAA
>>cccc
bbbb : BBBB
>>eeee
dddd : DDDD
>>ffff
cccc : CCCC
>>gggg
eeee : EEEE
>>hhhh
ffff : FFFF
>>[Ctrl+Z]
gggg : GGGG
hhhh : HHHH

一応,動いてますよ.

まとめ

見ていただければ分かるように,前グラフシミュレータでの問題点はほとんど解決されています.

  1. 不必要なコンストラクタはありません.
  2. 入出力関数でのポート指定もありません.
  3. 入出力データは,文字列に限らず何でもOKです.
  4. 無駄なtry{}catch{}もありません.(入出力時に発生するIOExceptionなどは,仕方がない)
  5. InterruptedExceptionもありません.(スレッド使ってないし)
  6. ステートマシンの分かりづらさ... これは今後の課題です.
  7. DefaultFunctionalModule...なんですか,それは.

とにかく,POJOっぽくJavaコードを書いて,設定ファイルに組み込んでしまえば,勝手に動いて,勝手に終了します.
いまのところは,こんな感じ.

追記

グラフシミュレータという名前を止めるのは,実は,大学院時代の研究をいまだに引きずっていると思われたくないってのが一番だったりして.
お手軽にフィルタ処理とかを仕掛けられる個人用アプリケーションコンテナが欲しいだけなんよね.本当なら,JBIとかに対応しているアプリケーションサーバとかを立ち上げて遊べばよいのだけど,あれは重厚すぎる.非力なノートPC上で常時立ち上げていたくないし.
で,面白そうだから作ってしまえと,かっつり作ってみたってわけ.まあ,半日で作ったものだから,物自体はあまりいい出来ではないけど,ガワは悪くないかなあと.