|
|
||
http://www.screencast.com/users/stomita/folders/Jing/media/a0086f46-5717-4211-b581-ac7bc742db2b
まだまだ、やることいっぱい。もちろん、いわゆる本公開ではありません。
現在Afrousはコアとなっているプロセス実行エンジン部分をリファクタリング中です。具体的には、変数や関数のネーミングの統一と言ったところから、複数の要求による同時実行制御、エラー処理などをサポートするためのオブジェクト構成について見直しています。まだ循環参照制御などといったところは実装できてませんが、一応非同期データ取得を依存性を元に順次制御するところまでは作り直せています。
まだこのバージョンのプロセスエンジンに対応するGUIのエディタ部分はありませんが、定義情報はJSONで記述できるので、JSONを直接記述してプロセス定義をすることは可能です。
var config = { name : "process1", params : [ { name : 'username', type : 'string', 'default' : 'stomita' }, { name : 'count', type : 'integer', 'default' : 5 } ], output : "${networkPosts}", actions : [ { name : "delnetwork", type : "Ajax.Jsonp", inputs : { "url" : "http://del.icio.us/feeds/json/network/${username}" } } , { name : "networkPosts", type : "Array.Iterate", inputs : { "array" : "${delnetwork}" }, innerProcess : { output : "${posts}", actions : [ { name : "posts", type : "Ajax.Jsonp", inputs : { "url" : "http://del.icio.us/feeds/json/${networkPosts_each}" } } ] } } ] }
JSONのプロセス定義のルートには以下のプロパティが記述できます。
ユニットアクションとは、プロセスに組み入れて再利用することが可能な処理が記述されたJavaScriptオブジェクトです。文字列、配列処理、AJAXリクエスト(JSONP)などは標準で組み込まれます。プロセス実行に必要なユニットアクションを新たに拡張して定義することも可能です。
JSONによる定義が終わったら、以下のスクリプトでプロセスを実行できます。
var pdef = new afrous.ProcessDef(config); // 設定情報のロード var proc = new afrous.ProcessInstance(pdef); // 定義情報からプロセスをインスタンス化 proc.start(function(obj) { /* */ }); // プロセスの開始。プロセスの出力結果はコールバック関数で受け取る
たぶんAfrousは表面的には全く関係ないと思うものが影響を与えています。
まず最初はなにがやりたかったかというと、Webサービスの表計算をやりたかった。表計算のWebサービス(Google Spreadsheetとか)じゃなくって。
表計算では、まずベースとなる入力データがあって、それを望む出力に向けてインクリメンタルに組み立ててくことする。で、一旦出力を設定しておけば、後からその入力データが変更になっても、出力は組み立てておいたロジックに従って自動的に変化する。
表計算が格子状のテーブルなのに対して、WebサービスのメッセージはXMLであれJSONであれ階層構造が基本なのだけど、きっと階層構造でも同じことが出来ると思った。その状態で、Webサービスの一つ一つがExcelでいうシートに相当している状態を考えてみようと思った。
そう考えていたときに全く別にHaskellとかをちらちら眺めていたら、表計算が関数型プログラミングの考えに近いのだと知った。
http://web.yl.is.s.u-tokyo.ac.jp/~ganat/memo/aboutHaskell.html
表計算ソフトを使ったことがある人は関数型プログラミングを 経験済みだと言えるでしょう。 表計算ソフトでは各セルの値を、他のセルの値を基に決定します。 ここで注目されるのは 何を計算するのかであり、 どう計算されるかではありません。
このことは、なんとなく実装へのヒントと勇気を与えてくれた。ただ、どこまで実装を関数型に近づけるかについての判断がまだつかないでいるので、ちょっとした足かせにもなっている。
先週、AfrousはIteration(for each loop)に対応してます。
これで例えば
とか
ということが出来るようになってます。
しかし、今のところイテレーションは直列処理で、しかも実装はデモで間に合うことを優先させたため、かなり汚いです。並列化とかはリファクタ後でないと無理そう。
Pipesで出来て今できていないオペと言えば文字列系かな。まあ正規表現くらいいつでも入れていいのですが、まんまPipesの後追いになるのもどうかなあと思うし。そもそも、そういえばもともとは「表計算をWebサービスでやれないのか」というアイディアだった(ような気がする)ので、むしろ集合関数の方に興味がある。
まあ、どっちにしろこれから2ヶ月くらいはリファクタ作業に入るので、サイトの見た目の更新は止まると思う。
ところで、今なんかうちの部屋の環境からサーバにアクセスできない。携帯からはアクセスできるので、経路のネットワークの問題なのか?はやくなんとかならんかな。