ActionScript3でカリー化(引数束縛)

少し前にJavaScriptこことかここでネタにされたカリー化をas3でやってみた
試したコードはこんな感じ。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import flash.utils.setTimeout;
Function.prototype.curry = function (... rest):* {
  var args:* = rest;
  var self:* = this;
  return function (... rest):* {
      rest = args.concat(rest);
      return self.apply(this, rest);
  };
};

private function init():void {
    function sum(x:int, y:int):int { return x + y; }
    function mean3(a:int, b:int, c:int) : int { return (a + b + c) / 3; }
	
    trace( sum.curry(10)(15) );             // 25
    trace( mean3.curry(10)(20, 30) );       // 20
    trace( sum.curry(10).curry(20)() );     // 30
    trace( mean3.curry(10).curry(20)(30) ); // 20
    trace( sum.curry(10, 20)() );           // 30
}
private function showMessage(massage:String):void  {
    Alert.show("ぼたんくりっく" + massage, "Message", Alert.OK);
}
private function clickHandler(event:Event):void {
    setTimeout(showMessage.curry(event.currentTarget.label), 2000);
}
]]>
</mx:Script>
	<mx:Button x="10" y="10" label="ボタンA" id="btnA" click="clickHandler(event)"/>
	<mx:Button x="80" y="10" label="ボタンB" id="btnB" click="clickHandler(event)"/>
</mx:Application>

実行するためにはコンパイラオプション-strictをOFFにしないとビルドが通りませんが一応希望する動作になっているようです。

他言語での利用例でよく使われるイベントハンドラのコールバックに渡すクロージャに関してはFlexのイベントモデルはたいていコールバックにパラメータを渡す事が出来るので無理に使わなくても困る事ないんだけどね...

setTimeoutの例にしても第三引数にパラメータ配列を渡せるので普通に記述可能ですが、関数のバリエーションやコンボを作るってケースではそれなりに有効な気がします。

ActionScript3は意外とよくね?

  • ひがやすを blog スクリプト言語とタイプセーフな言語の生産性
  • id:nowokay:20070112 プログラム言語の次の5年,動的でもあり静的でもある言語

上記のエントリやその他でも多くのブログ等で同様の議論が行われていますね選択肢としてメインストリーム以外なら動的でもあり静的でもあるを実現している言語って
HaskellOCamlConcurrent CleanNemerle
とか型推論系だったりコンパイラインタプリタをあわせもった言語もいろいろあるみたいですが、趣味でつつくのはともかく業務で使うとなるとちょっと無理。

プログラミングパラダイムも「OOPAOP」に加え「FP」を加えたハイブリット、言語も「JavaJavaScriptJRuby|Groovy」とか「C#IronPythonJScript」とかを使い分けなければならないとしたら、局所的にはEoDになったとしても根底から理解するためのハードルは高くなるばかりですねぇorz

MSもC#3.0はFPの要素を取り入れ型推論を加える方向へ進化するみたいだし、Javaも関数型を入れるとかって話ですが(僕的にはそれよりもオペレータのオーバーライドを局所的にでも許してBigDecimalの演算とかを自然に記述できるような細かな点をどうにかして欲しいですが)

本題のFlex2に採用されているActionScript3ですが、初めて数ヶ月なのでまだまだ素人なのですが、mxmlcコンパイラオプション
・strict=true|false
・as3=true|false
・es=true|false
やクラス属性のdynamicを使い分ける事でJavaScriptと同様prototypeベース、Java等クラスベースのハイブリットな構成が可能です。
as3ネームスペースの切り替え以外にもコンパイラオプションが[メタデータタグ]で細かくしてい出来たりフィルタリング指定できると更に嬉しいところですが、今業務に投入できると自分が思える言語の中ではかなりお気に入りな言語仕様となっています。
前回のエントリでも言いましたけどLLスクリプト系のさくさく感とは程遠いのはあれですが(wそのおかげでJavaScriptより高速に実行できるのでまあ我慢ですね。実験するため、おとなしく自宅のハードも6年ぶりに新調しま〜す

標準ライブラリも同じECMAScriptをルーツとするJavaScriptより強力になっています。Arrayのメソッドsort,map,every,filterなんかの高階関数prototype.jsとかのAjaxライブラリに頼らずとも組み込まれていますし、後からprototypeを拡張するとしてもsetPropertyIsEnumerableがあるので有害プロトタイプ汚染も防げます。

標準だとリフレクションが使い難かったり([メタデータタグ]はランタイムで読めない、E4X式で帰る)してちょっと困ったところもありますが、Flex2は画面周りだけでなくプログラムマ視点からみるActionScript3もマルチプログラミングパラダイムをサポートしている点で悪くないのではないでしょうか?

ちなみにJScript.NETの構文がちょっと確認しただけですけどActionScript3とほとんど同じでびっくり!!
今ならVisualStudioのサポートが他の言語同様にされればAjaxブームに乗って使われたかもしれないなーっと思ってみた。だれかバリバリ使っている人がいるのかしら?

Flex2のインプレッション

前回のエントリからかなり経ちますが、ボチボチ日記を再開してみる。

実装中の案件でFlex2を使っています。過去MS、Java系のテクノロジしかさわった事がないのでFlashもFlex1.xも全く知らない状態から初めたので苦労していますが、使いどころを間違わなければ強力なプラットフォームだと思います。

ですが困った事に、FlexBuilder2の要求リソースは半端ではないですorz

割当てるメモリは標準の-Xmx512Mではすぐに不足するため-Xmx1024Mは割り当てたいので結果最低2GBのRAMは積んでいないといけないし、mxmlcjavaで動作しているらしくコンパイルもかなりの時間またされます。

快適に動かすためには、デュアルコアの最新CPUと2GB-RAMは必要かも?まあVistaを動かすのにもそれくらい要るのでいずれ標準的な構成になるんだろうけど、今の社内環境をいっぺんに入れ替えする訳にもいかないのでもう少し最適化してくれないかなぁー...

それとも高額なライセンスのFlex1時代から投入しているようなプロジェクトの連中は、皆強力なマシンなんだろうか?あんまりネット上で文句いってる人がいないのでどうなんだろ?

V2.0だとプロジェクトリソースが増えるにつれてFlexBuilder2が頻繁に挙動が怪しくなったり突然落ちたりする。eclipseベースになってはじめてのバージョンなのでありがちですが、英語版に提供開始されたアップデータの日本語版が早く提供されないとやってられません。

流行のLLにみられるサクサク感は皆無な環境なので、慣れるまでの試行錯誤が多い現状ではげんなりする事もありますが、良い点もいろいろあるので少しずつ記述しまっす。

DataSet vs カスタムエンティティその2

ちょっと遅くなりましたがid:sugimotokazuyaさんとid:Kazzzさんのトラックバックに対して返信を

まず前提として趣味や趣向の話では無いので視点を明確にしたいと思います。

チームを組んで開発作業を行うにあたってトータルで妥当な判断を下す必要があり(今風に言えばアーキテクトとしての視点という感じでしょうか)例として以下のような構成要素が存在するとします。

  • チームメンバのスキルはまちまちで経験の浅い者も戦力として使わなければならない
  • 運用フェーズ以降の保守開発は違うメンバーが行う事も検討しなければならない
  • 受託開発がメインで開発対象のシステム形態や業務ドメインが異なるケースが多い

メンバーの全てがハイスキルなドリームチームで構成されており、開発対象のシステム機能・性能・リリース間隔などが非常に重要になるのであればポールグラハムの言うhttp://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.htmlで述べられている概念のように最も生産的であろう戦術を取れば良いと思いますが、普通以下の奴も含めて普通以上のアウトプットを求めるには如何すれば良いのかを考えています。
また、http://japanese.joelonsoftware.com/Articles/BigMacsvs.TheNakedChef.htmlに落ち込まないようにバランスを取るという点も考慮する必要があり簡単な問題ではありません。

個人的な好みを言えば、Hibernateタイプの疎粒度オブジェクトを組み合わせてリッチなドメインモデルを構築する設計の方が美しいと感じますが、では実際にHibernateを使うとしてチームメンバ全員に

  • 最適なコレクションの使い分けの知識
  • シリアル化、HashCode、Equals、ToStringの完璧な実装
  • マッピングルールの理解と自動生成されるSQLの対応づけ
  • 遅延フェッチとイーガーフェッチの正しい使い分け
  • HQL構文の理解
  • Hibernateセッションの状態管理と制御
  • 循環リレーションとなる場合の制約条件

などなどを強制するのは先に挙げた構成要素から難しく導入は困難ば場合が多いです。
DataSetやDataAdapter等は標準機能なので最低これぐらいは知っていない奴は戦力にならんと突っぱねる事も可能だし、調べるにあたって日本語リソースも豊富です。

以上を踏まえて

PONO?かDataSetの選択は「使われる層に依るところが大きい」と言う意見がありますがMSの見解としては

に示されるようにDataSetにはDTOとして利用するケースも想定されている事が示されています。(MSの主張を素直に受け取ったらの話です)

オーバーヘッドに関しては.NET2.0からバリナリシリアル化に対応したり、メモリ内クエリのインデックスエンジンが強化されたり改善が図られているようです。
また、Hibernateならサーバーサイドで保持しているHibernateSessionがレコードの状態保持を行っているのに大してDataSetはDataRowStateに情報を保持しておりショートトランザクションを超えた管理が可能です。データの安全性から見ればデメリットにもなりえる機能ですがWebサービスやリッチクライアントではメリットとなりMSがいう非接続データアクセスという表現が現れている部分かと思います。

上記を考えると「使われる層に依るところが大きい」と言うよりも想定しているカバー範囲が大きいと言った方が適切な気がしますし最初に私が言った完璧には遠いが大抵の利用ケースで70〜80点をとれる良く考えられている技術という表現が伝わり易いと思います。
PONOと比較すれば非常にオーバーヘッドが大きいのは確かなので要件に合わないケースでは使えない事もあるでしょうし、特定用途に最適化されている訳ではないので最もシンプルな構成とも異なるでしょう。

駄目だしの多かったデザイナに関してですが、使うのはあくまでもDataSetの話で画面へTableAdapterやデータソースコンポーネントを貼り付けてレイヤー構造を壊す事はありません。
Daoの内部でDataAdapterの機能を使いますが、独自Daoではs2dao.netのパーサのベースになったコードを用いて複雑なクエリは2WaySqlにて記述しているのでデータを入れる対象がPONOかDataSetかの違いでDataAdapter構成ウィザード等もまったく使ってませんので・・・

また、エンティティの構造とプレゼンテーション層がやり取りを行うオブジェクトの構造を詰め替えるGoyaで言うところのDxoですが、型指定したDataSetやコードで構成したDataSetのスキーマはデータソースと異なっていても良いですし.NET2.0からDataRowStateを外部から操作可能だったと記憶しているので詰め替えを行っても上手く機能するのではないかと予測しています。

以上を踏まえ要件やトレードオフから判断して使い分ければ良いのでは?って思うので判断基準としてメリット・デメリットを挙げました。

DLinqが出てくるとさらに選択肢が増えそうで大変ですけどorz

Moto-1 オールスターズ第二戦 in TSタカタサーキット

今週末はhttp://www.moto-1.jp/第二戦へ参戦するためネット難民のためトラックバックに応じたいけど時間が無いので帰ってからにします。
結局今年も準備不足&練習不足のまま迎えてしまったオールスターズ参戦だが天気もよさそうだし、走りなれたタカタなので何とか上位を目指したい☆

気分はニッキーのハングオンドリだぁ〜
ハングオンドリムービー
何度か吹き飛ぶの覚悟で練習しないとムリポorz