<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.5.1" -->
<rss version="0.92">
<channel>
	<title>MASDA</title>
	<link>http://www.metaphor.co.jp/masuda/blog</link>
	<description></description>
	<lastBuildDate>Sat, 14 Feb 2009 00:14:49 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>ja</language>
	
	<item>
		<title>PerspectiveProjection</title>
		<description>自分が担当してるSWFがルート(stage直下のドキュメントクラス)として起動されるケースと、子として読まれるケースがある案件で、パースの見た目が異なってハマった。。PerspectiveProjectionがnullじゃないDisplayObjectがネストされたとき、どういう扱いになるんだろう？？

3D使うのはそこだけだったので、addChildされたとき上方のperspectiveProjectionを全てnullにしつつ、ルートの表示オブジェクトのみ値を設定して結果を合わせた。けどなんか気持ち悪い。。


var o:DisplayObject = this;
while (o.parent != stage) {
  o.transform.perspectiveProjection = null;
  o = o.parent;
}


リキッドの場合は、プロジェクションセンターも更新しないと意図通りにならないかも・・。

private function onResize(evt:Event):void {
  var proj:PerspectiveProjection = root.transform.perspectiveProjection;
  var pt:Point = proj.projectionCenter;
  pt.x = stage.stageWidth * 0.5;
  pt.y = stage.stageHeight * 0.5;
  proj.projectionCenter = pt;
  root.transform.perspectiveProjection = proj;
}
 </description>
		<link>http://www.metaphor.co.jp/masuda/blog/?p=33</link>
			</item>
	<item>
		<title>GC判定再び</title>
		<description>GCされたかテストするクラスの改良版。

最後の参照を消すとき、

_instanceVar = null; //これでいつか解放されるはずだが・・

と書いているところを、

//常に戻り値のnullが代入されるが、同時に漏れを確認
_instanceVar = GC.shouldBeGarbage(_instanceVar); // 以降、ゴミとして回収されるべき！

と書くことにします[*注]。これで参照の消し忘れがあれば、直後にエラーになってくれます。多分。

ちなみにFlexでは子SWFがアンロードされると、以下のように表示されるのでこれの出番は少ないかもしれません。

[SWF のアンロード]Users:masuda:Documents:Flex Builder 3:Test:bin-debug:child.swf


以下にいくつかサンプルを挙げます。
ドキュメントクラスのコンストラクタに書かれているコードだと思って下さい。

ローカル変数はGCされる:

var o:DisplayObject = new Sprite();
GC.shouldBeGarbage(o); //=> GC succeeded: 4489216 => 4771840


インスタンス変数に退避したため延命され、GCされない:

var o:DisplayObject = new Sprite();
_instanceVar = o;
GC.shouldBeGarbage(o); //=> Error


表示リストに残っているため、GCされない:

_instanceVar = new Sprite();
addChild(_instanceVar);
//removeChild(_instanceVar); //この行が必要だった
_instanceVar = GC.shouldBeGarbage(_instanceVar); //=> Error


ローカル変数はクロージャに延命され、クロージャはstageに延命されるのでGCされない:

var o:DisplayObject = new Sprite();
addChild(o);
removeChild(o);
GC.shouldBeGarbage(o); //=> Error
//o = null; //この行が必要だった
stage.addEventListener(
  Event.ENTER_FRAME,
  function(evt:Event):void ...</description>
		<link>http://www.metaphor.co.jp/masuda/blog/?p=30</link>
			</item>
	<item>
		<title>las3r (2)</title>
		<description>las3r、Clojure(むしろLisp)がよく分からないまま手探りで弄っています。便利だと思ったのが、アリティによる多重定義と、暗黙のdestructuring-bind(アンパック代入みたいなもん？)。

以下は0〜2個の引数を取るMath.random:

(defn rand
  ([] ((. Math random)))
  ([n] (* n (rand)))
  ([a b]
    (if (< a b)
      (+ a (rand (- b a)))
      (+ b (rand (- a b))))))

(rand -1 1) ;=> -0.689156367443502

要は引数のパターンに応じた振り分けと同時に変数束縛されるようですが、これが再帰関数の場合には特に便利で、例えばリストをペアに区切ったリストにして返す手続きは:

(defn pairs [l]
 ...</description>
		<link>http://www.metaphor.co.jp/masuda/blog/?p=29</link>
			</item>
	<item>
		<title>las3r</title>
		<description>clojureというJVM向けLisp方言があるらしいのですが、それのAVM2向けコンパイラがAS3で書かれています。
http://github.com/aemoncannon/las3r/wikis

構文的な違いが結構あり戸惑ったのですが、こちらを見ればだいたいつかめると思います。

Schemeじゃないから当然かもしれませんし、ABC的に実装に難があるからかも分かりませんが、残念ながら:

	末尾最適化なし (末尾再帰にはrecurを使えばスタックを消費しない)
	継続なし


しかし、それを差し引いてもASにない以下の特徴を楽しむことができます:

	マクロが使える
	動的コンパイル


しかも、Emacs向けにlas3r-modeが用意されていて、起動中のSWFに対し修正を動的に反映できます。
以下手順:


	etc/las3r-mode.elをEmacsのロードパスへ配置
	もしなければ、以下もDLしてロードパスへ配置
http-get.el, http-cookies.el, http-post.el
	.emacsに以下を追記
(autoload 'las3r-mode "las3r-mode" "Major mode for las3r." t)
(add-to-list 'auto-mode-alist '("\\.lsr$" . las3r-mode))
	src/lsr/boot.lsrの最終行、;;(connect-to-eval-pipe)をコメントインしておく
	etc/eval_pipe.rbを起動しておく
	対象のSWFを起動しておく
	Emacsにて*.lsrの編集中にF5 (すると、バッファ全体がevalされる)


この手の試みがじわりじわりと増えてきているような気がしますね・・。
今後が楽しみです。

関連メモ:
http://hg.mozilla.org/tamarin-central/file/d92e466aed84/esc/src/
元?

http://eval.hurlant.com/
上記のAS3版だと思う。las3rはこれの一部を使っている。

http://ariyan-harhid.cocolog-nifty.com/blog/2008/10/tamarin-esc-c-2.html
上記の改良版。実行時エラー情報を詳しく教えてくれたりetc

http://happyabc.org/
OCaml製のSchemeコンパイラ

http://www.bitbucket.org/SumiTomohiko/actionpython/overview/
これは・・？

http://haxe.org/com/libs/hxasm
haXeのABCアセンブラ

http://www.sephiroth.it/weblog/archives/2008/07/expressions_evaluation_at_almost_nati.php
上記のAS3版を基礎としたシンプルな電卓デモ

http://www.anotherbigidea.com/javaswf/avm2/AVM2Instructions.html
見やすい

http://code.google.com/p/as3c/
インラインアセンブラ
 </description>
		<link>http://www.metaphor.co.jp/masuda/blog/?p=28</link>
			</item>
	<item>
		<title>llfuture</title>
		<description>一昨日、llfutureという大変コアなイベントでお話させていただく機会を得ました。ハプニングの連続の中、温かい目で見守っていただい方、どうもありがとうございました。

この辺りの話を聞くのは今回が初めてであったという方には、私のプレゼン内容が(メディア)アートと思われてしまうとまずいので、コマーシャルであると断っておきます。プレゼンの最初で口頭でも言い訳していたのですが、ちょっと言葉足らずであったと反省しております。。個人的にはかなり貴重な体験をさせていただいて大満足なのですが、やはりだいぶ役不足感満天でしたね・・。江渡浩一郎さんはとっくの昔にメディアアート作品にRubyを活用しておられましたし、少しでもメディアアート事情を知っていた方には非常に残念な発表となることは流石に自覚しておりましたが、折角お話をいただいたので、えいや！と発表した次第であります。。。。

あともう一点補足です。NON-GRIDさんを中心に企画・制作され、GUIの実装に関わらせていただいたInteractiveMirrorですが、一部でバーチャルで試着できるかのように解釈されてしまっているようですが、そんなことはありませんｗ そんな発言をしたつもりはなかったのですが、、おかしいですね・・　

ところで、これが初めてLLのイベントを見る機会となったのですが、内容が高度過ぎてついていけない話題が多かったもののプレゼン技術の異様に高い方ばかりで楽しませていただきました。InterCommunicationで以前に久保田教授が触れていたライヴパフォーマンスのインターフェースとしての関数型言語(Haskell + SuperCollider)、多分ポイントフリースタイルの簡潔さ辺りを評価しているのではと推測しますが、もしそういった形態のライヴであればいかにも楽しんでいただけそうであると感じました。音楽的知識が皆無過ぎるので言ってみるだけですが！

VJをするなら、fluxusのデモのようにあからさまに副作用あるとピュアじゃないとお叱りを受けそうですので、視覚的な構造は図形言語方式で記述し、時は代入でなくストリームで扱うことになるでしょう。まんま以下の形です:
http://www.ipa.go.jp/jinzai/esp/2005youth/mdata/99-02.html

もう既にどこかにいるような気がしますが、パフォーマーとして誰かがこの道を進んでくれるならすごく見てみたいし、美しいプロセスだと思ってしまうのですが・・。 </description>
		<link>http://www.metaphor.co.jp/masuda/blog/?p=26</link>
			</item>
	<item>
		<title>jp.nium.display</title>
		<description>jp.nium.displayをちらみしたメモになります。開発中のrev1837の時点を見てフライングで書いているので、予告なしに変更され得る層を紹介しようとしているのかもしれませんし(というのも書いている最中にlistenOnStageが消えたからです！)、逆に周知のことを紹介しているのかも分かりませんが、痒いところに手が届いているあまり興奮を禁じ得ませんでした。その点ご了承下さい。

実は最近になってようやくProgressionを勉強しています。ver3からの入門です(汗)。3本柱の一つであると聞くキャストですが、今まで表示オブジェクトのサブクラス化を好んで行わない(= リンケージしないでインスタンス名つけて操作する)スタイルで制作していたという極めて個人的な理由で食わず嫌いしていたのですが、その考えはすぐに変わることになりました。

リンケージの手間を惜しむ私のような人間には、リンケージ一括設定(特に接尾辞プロファイル！)が以前から提供されていたようですし、開発予定の画面ではなんかキャストのテンプレートを自動生成してくれそうな雰囲気すら漂わせているように見えますが(気のせいでしょうか？)、もしそのようになればキャストのサブクラスを作る負担はかなり減ることになるので期待が膨らんでしまいます。さらにキャストはonCastXXXの処理中に追加したコマンドを同期化してくれるだけかと思っていたものの、実はjp.nium.display系の便利機能を継承していたことを知り、主な機能をチェックしてみようと思ったわけでした。

IEventIntegrator
removeAllListeners(completely:Boolean = false):void
restoreRemovedListeners():void
これら二つを用いて、イベントの配信停止と再開が手軽に実現できるようです。ただし、addExclusivelyEventListenerで追加された場合この限りではないようです。

IExDisplayObject
このインターフェースを実装しているクラスのインスタンスは、jp.progression.casts.*の以下の3つのパッケージ関数によって表示ツリーの階層を問わず簡単に取得できるようです。

getInstanceById(id:String):DisplayObject
表示オブジェクトにidを設定しておくと、階層問わず参照できるようです。getElementByIDみたいですね。
 	
getInstancesByGroup(group:String, sort:Boolean = false):Array
表示オブジェクトにグループ名を設定しておくと、階層問わず集められるようです。
 	 	
getInstancesByRegExp(fieldName:String, pattern:RegExp, sort:Boolean = false):Array
任意のフィールドで正規表現にマッチした表示オブジェクトを階層問わず集められるようです。例えば、ボタンごとにインスタンス名をつける代わりに以下のように参照することもできそうです。

//同一シンボルを1つしか配置しないため、クラス名からインスタンスが一意に決まる
CastButton(getInstancesByRegExp('className', /^AboutButton$/)[0])
.sceneId = aboutScene.sceneId;


追記: 先ほど試してみたところ、これらの3つのメソッドはaddChildしてステージに追加しなくても使えるみたいです。ということはid設定したら自己責任でexDisplayObject.id = null;などとしてコレクションから消さないとGCされないのかな・・？
 	 	
setProperties(props:Object):DisplayObject
プロパティの一括設定を行えるようです。CastSpriteの表示アニメーション以前に行う座標などの初期化をすっきりとまとめられそうです。

ExDisplayObject
toBitmapData(transparent:Boolean = true, fillColor:uint = 0xFFFFFFFF):BitmapData
表示オブジェクトの内容をBitmapData化したものを取得します。

以上の操作は、ExLoader, ExMovieClip, ExSprite, ExTextFieldなどで利用できる感じです。このうち、コンテナ系のものであれば以下も利用できる感じです。

IExDisplayObjectContainer 
children : Array
DisplayObjectContainerの子の走査は面倒でしたが、これで随分楽になりそうです。IExDisplayObjectContainerは、必ずしもインデックス値が連続している必要はないため、あらかじめ大きな値を設定しておいて最前面を確保したいときなどに便利そうです。となれば、走査するにあたってnull要素を除いた子のリストが欲しくなるでしょうが、こいつがそれを提供してくれるっぽいです。

contains(child:DisplayObject):Boolean
指定された表示オブジェクトを含むか、自身であればtrueを返します。孫、ひ孫・・とツリー全体をテストしてくれるようです。

removeAllChildren():void
全ての子を削除します。地味に便利です。

最後に、インスタンス化できるものでユニークだなと思った機能に以下があります。

ExSprite
isDragging : Boolean
startDrag()を使用中か否かを返します。

ExMovieClip
isPlaying : Boolean
ムービークリップの再生ヘッドが移動中か取得します。

repeat : Boolean
ループ再生するかを取得または設定できるようです。

switchAtPlaying():void
再生と停止を切り替えます。

ExTextField
appendTextAtCaretIndex(newText:String):void
テキストフィールドのキャレット位置に文字列を挿入できるみたいです。

displayパッケージの機能拡張は継承の苦しい裂目が見えてきて大変な部分だと想像しますが、ここまで使い勝手の優先を貫いていることに感心してしまいました。おかげで、各々の表示キャストはDisplayObjectと同一視できつつ、一方でIExDisplayObjectとしての顔も持つようです。しかし、これもProgressionのごく一部に過ぎないと思うと驚異的ですね！ </description>
		<link>http://www.metaphor.co.jp/masuda/blog/?p=25</link>
			</item>
	<item>
		<title>非同期処理いろいろ</title>
		<description>去年頃から、シングルスレッドかつイベントドリブンなFlash環境で散らかりがちな非同期処理を、すっきりと書けるようにするための試みが多く見受けられるようになりました。それらの特徴をざっと調べてみたメモになります。先駆者達のやり方を広く知り、あわよくば何か洞察を得たいからであって、各ライブラリの優劣を独断と偏見で決定するような主旨ではありません。それからプログラム勉強する前にまず日本語の勉強しろっていうくらい思いやりのない説明が延々続きますが、万が一誰かの参考になればと思い載せておくことにします。

各ライブラリの特徴をつかむため、以下のポイントについて共通で見ていくことにします。


合成
複数の処理を直列化・並列化した複合物を区別なく扱えるか？処理の入れ子はどのように実現されているか？

並列実行
複数の処理の同時実行と、完了の待ち合わせが可能か？

例外処理
エラーハンドラは追加できるか？エラーからの回復は可能か？

続行
エラー発生時に、現在の処理をスキップして、残りの処理を続行することが可能か？

中止
処理の中止は可能か？

値の受け渡し
処理の結果として得られた値を、後続の処理に受け渡す仕組みはあるか？

冗長さ
処理を追加する手順はどうか？クラスを新規に作るのか？クロージャを渡すのか？

動的な処理の追加
処理を追加できる有効なタイミングは？実行後にも処理を追加でき、実行キューのように振る舞うか？

開始トリガ
処理の構築と実行が切り離されていて明示的に開始するのか？それとも構築と同時に暗黙で開始されるのか？

再実行
同じ非同期処理を、2回以上実行可能か？

進捗通知
ロードなどの進捗を通知する枠組みがあるか？

イベントへの適合
完了の通知は、AS3のイベントモデルに準拠して行われるか？
逆に、イベントを各々の非同期処理モデルに適合させる方法は提供されているか？


flashrod Job
var job:Job = new Sequence(
	new Trace("begin"),
	new Concurrent(new URLGet("http://www.google.com/"),
	               new URLGet("http://www.yahoo.com/"),
	               new URLGet("http://www.apple.com/"),
	          ...</description>
		<link>http://www.metaphor.co.jp/masuda/blog/?p=24</link>
			</item>
	<item>
		<title>HoC spectrum</title>
		<description>House of Cardsのデータで遊んでみました:
http://www.metaphor.co.jp/2008/07/visualization-of-spectrum-radiohead-house-of-cards/

マウスを動かすとアングルが変わるのですが、顔を横から見たときにサウンドスペクトルになっています。
勢いに任せたひどいソースは以下:
source code

GoogleCodeで提供されているCSVそのままだとちょっと重いので、上のソースに含まれているcsv2binary.rbを使っていろいろと都合のいいバイナリファイルに変換しています。具体的には:


	「頂点数, X, Y, Z, 明度, X, Y, Z, 明度, X, Y, Z, 明度・・・」 の繰り返しの並び
	フレームを間引く (デモでは1フレ飛ばしでデータを作り、15fpsで再生)
	明度が低い頂点を捨てる (デモでは60以下を捨てたため髪の毛がない)
	X, Y, Zは適当に16bitにおさめる
	モデルの中心あたりに原点を移動


Flash側はそれをロードし、ByteArrayから頂点情報を読み出して描画という感じです。音に同期させるため、(フレームレートに依存しない)再生時間を元にByteArray中の目的とするフレームを指すpositionを計算しています。

追記:
いちから解説をするべきでしょうが、以下に非常にシンプルなコードが紹介されていたため割愛します！

RadioheadのプロモーションがGoogle Codeで行われている理由

さらに追記:
今改めて未読消化してみるとFlash版の挑戦者はたくさんおられたようです。日付を見るにとても仕事速い！

http://blog.r3c7.net/?p=209
http://nutsu.com/blog/2008/071720_radiohead.html
http://aquioux.blog48.fc2.com/blog-entry-446.html

迷わず頂点を減らした私はなんだか反則してしまったような気持ちです。。 </description>
		<link>http://www.metaphor.co.jp/masuda/blog/?p=21</link>
			</item>
	<item>
		<title>Stream.as</title>
		<description>前回の方向でStreamを再実装してみる。ただしそのままだとつまらないのでStreamをオブジェクト風にしてみる。nullを空ストリームを表すために使ってしまうとメソッドチェーンに失敗する可能性が出てくるので、StreamのサブクラスであるNullStreamを定義し、メソッド呼び出しに対して何もしないよう実装する。

enum(0, 100).filter(function():Boolean {return false;}).forEach(trace); // => (何も起きない)
trace(enum(0, 100).filter(function():Boolean {return false;})); // => [object NullStream]

([]).forEach(trace);と同様な挙動と言われれば当たり前と思うかもしれない。

今のところ最低限のことしか実装してないけど、やはりこっちのアプローチの方があっちよりシンプルかも・・？
勉強ため、ソースの中で解説してみる:


//Stream.as
package masda.stream {
  public class Stream {
    private var _car:Object;
    private var _cdr:Function;

//Streamの実体は、先頭要素(car)と残りのStreamを返す関数(cdr)。    
    public function Stream(car:Object, cdr:Function/*delayed object*/) {
     ...</description>
		<link>http://www.metaphor.co.jp/masuda/blog/?p=20</link>
			</item>
	<item>
		<title>stream-cons</title>
		<description>SICPのストリームの定義がかっこよくてしびれました。

例えば引数に指定した数から始まる整数列を返す手続きはSICPだと:

(define integers-starting-from n
  (stream-cons n (integers-starting-from (+ n 1))))


これをAS3でやると多分こんな感じになる:

function integersStartingFrom(n:uint):Stream {
  return new Stream(n, function():Stream {
    return integersStartingFrom(n + 1);
  });
}


自分が以前似たようなことをやったときは、同様の関数が以下のような醜い姿に:

function count(start:uint):Iterable {
  return new Iterable(function():Function {
    var i:uint = start;
    return function():uint {
    ...</description>
		<link>http://www.metaphor.co.jp/masuda/blog/?p=17</link>
			</item>
</channel>
</rss>
