2008年01月28日

【インタビュー】「ActionScript 3はさらに進化する」 - ActionScriptマスター コリン・ムック氏

マイコミジャーナルに、コリン・ムックのインタビュー記事が掲載されていました。

【インタビュー】
「ActionScript 3はさらに進化する」 - ActionScriptマスター コリン・ムック氏

http://journal.mycom.co.jp/articles/2008/01/22/adobeinterview/

ActionScript の今後や、Flash のオーサリング環境についてのインタビューですが、先日英訳した、ActionScript 3.0: Is It Hard or Not? の内容にも多少触れているところもありますので、興味のある方はぜひ。
posted by ActionScript 3.0 を一から学ぶ超初心者 at 18:46| Comment(0) | TrackBack(0) | ActionScript 関連の記事 | このブログの読者になる | 更新情報をチェックする

2008年01月25日

ActionScript 3.0: Is It Hard or Not?(英訳 その5 最終回)

それをするには、もっとたくさんのコードが!

私がオンラインや会話で繰り返し聞いた、1つの最終的な ActionScript 3.0 の誤解は、以下の通り:
「ActionScript 3.0 は本当にクールだ。しかし、もっと冗長でなかったらばよいと思う! 簡単なことをするのに書くコードが多いよ!」
私が定期的に見る、ActionScript が冗長であるという証拠として出される2つの例がここにあります:

1) ActionScript 1.0 と ActionScript 2.0 で URL にアクセスするためにこのコードを使用:
getURL("http://www.moock.org");

ActionScript 3.0では、このコードを使用:
navigateToURL(new URLRequest("http://www.moock.org"));


2)ActionScript 1.0 と ActionScript 2.0 で .swf ファイルをムービークリップの中にロードするために、このコードを使用:
someClip.loadMovie("foo.swf");

ActionScript 3.0では、このコードを使用:
var loader:Loader = new Loader();
loader.load(new URLRequest("foo.swf"));
someClip.addChild(loader);

前の2つの例では、ActionScript 3.0 のコードは、以前のコードより長いです。
しかし、それらの2つの単発的な例は、一般的な傾向を意味しません。
私自身のプログラミングにおいて、ActionScript 3.0 が、概して ActionScript 2.0 または ActionScript 1.0 より冗長な言語でないとわかっています。
例えば ActionScript 3.0 では、テキストフィールド、ボタン、またはムービークリップを製作するために要求されるコードは、ActionScript 2.0 と ActionScript 1.0 とほぼ同じ長さです。
ここに ActionScript 3.0 のコードと以前のコードの間の違いの全体的な特色を伝える、ひとつの例があります:
// ActionScript 1.0 と ActionScript 2.0
someClip.createTextField("t", 1, 0, 0, 0, 0);
t.border = true;
t.text = "hello world";

// ActionScript 3.0
var t:TextField = new TextField();
t.border = true;
t.text = "hello world";
someClip.addChild(t);

明らかに、ActionScript 3.0 のコードの中に、16のキーストロークが存在します。
しかし、私は新しい ActionScript 3.0 が、それらの小さい違いを補う以上のものを構築するとわかっています。
たとえば、ActionScript 3.0 でテキストフィールドをもう一つのムービークリップへ移動したいならば、こうします:
someOtherClip.addChild(t);

ActionScript 1.0/2.0 では、直接テキストフィールドを動かすことができないので、目的のムービークリップの中で新しいテキストフィールドを作り、それから、最初のテキストフィールドの特徴を新しいテキストフィールドへコピーする関数を書かなければなりません。
それは、ActionScript 3.0 では記述する必要がない、多くの余分な(そして、複雑な)コードです。

同様に、正規表現とイベントのようなものは、ActionScript 3.0 のネイティブな部分です。しかし、ActionScript 1.0 と ActionScript 2.0 では、余計な時間とコードを費やして、あなた自身が実現する方法を書くか、誰かの実現方法をリサーチしなければなりません。

さらに、実はActionScript 3.0が、以前のものよりも冗長でない多数のケースが存在します。
E4X(XML を働かせるための ActionScript 3.0 システム)を考えてみてください。
このような XML ドキュメントから、情報を検索したいと思ってください:
<STAFF>
<EMPLOYEE>
<NAME>Marco</NAME>
<MANAGER>James</MANAGER>

</EMPLOYEE>

<EMPLOYEE>
<NAME>Graham</NAME>
<MANAGER>James</MANAGER>

<EMPLOYEE>

<EMPLOYEE>
<NAME>James</NAME>
<MANAGER>Dorian</MANAGER>

</EMPLOYEE>
</STAFF>

ActionScript 2.0 または ActionScript 1.0 で、2番目の従業員の名前を検索したいならば、こうします:
staff.firstChild.childNodes[1].firstChild.firstChild

ActionScript 3.0 では、こうします:
staff.EMPLOYEE[1].NAME

ActionScript 3.0コードはより短くて、より直観的です。

さて、ジェームズが管理しているすべての従業員のリストをもらいたいと思ってください。
ActionScript 2.0 または ActionScript 1.0 では、こうします:
var managedByJames = new Array();
for (var i = 0; i < staff.firstChild.childNodes.length; i++) {
if (staff.firstChild.childNodes[i].childNodes[1].firstChild.nodeValue
== "James Porter") {
managedByJames.push(staff.firstChild.childNodes[i]);
}
}

ActionScript 3.0 では、こうします:
staff.*.(MANAGER == "James Porter")

ActionScript 3.0 のコードは、非常に短く、ずっと直観的です。

単発的に並んでいるコードの長さの比較では、ActionScript 3.0 は時々勝って、時々負けます。
しかし私自身のコードで、システムのロジックが、より簡潔、かつ少しの回避方法で表現できるので、ActionScript 3.0 のきれいな構造が、一般的に短いプログラムを生むことがわかりました。

私は、信じたい

今、私は、あなたが私のポイントを理解したと信じています:
FutureSplash として知られていた頃から Flashを使っていた開発者が、ActionScript 3.0 を避ける良い理由を、私は全然見つけることができません。
タイムライン上の単純なスクリプトをまだ使うことができますし、基本を学ぶのはかなり簡単で、ActionScript 2.0 または ActionScript 1.0 よりも、明らかに冗長であるということが見つかりません。
それどころか、一旦 ActionScript 3.0 を学び始めれば、クリーンな API と Flex Builder のコーディングアシスタンスが利用できることで、よりすばやくプログラムを作成でき、メンテナンスも簡単であることを発見しました。
新しい言語に含まれる(本稿で名前が挙がっていない)私が評価する他のもの:

・ActionScript 2.0 よりもずっと速度が速い
・バイナリソケットやバイナリデータにアクセスする
・改善されたテキストメトリック
・sound spectrums へのパラメトリックアクセス
・Flash CS3 で生み出す資産の統合
http://moock.org/lectures/ActionScriptAndFlashCS3/を参照)
・無料のコンパイラや開発フレームワーク

そして、もう50個はここにあります:Grant Skinner によって数え上げられた、『Reasons ActionScript 3.0 Kicks Ass

私のアドバイス?
もし、あなたがあまりに複雑であることを心配して、まだ ActionScript 3.0 に挑戦しないならば、どうかその宣伝を信じないでください。
あなた自身が好意を持って、毎日の仕事で1ヵ月間、心から ActionScript 3.0 を試してみてください。
それから、あなたがそれが好きかどうか、あなた自身で決めてください。
あなたが失望することを、私はとても信じないでしょう。
posted by ActionScript 3.0 を一から学ぶ超初心者 at 18:00| Comment(0) | TrackBack(0) | ActionScript 関連の記事 | このブログの読者になる | 更新情報をチェックする

2008年01月24日

adobe が、先日のコリン・ムックのレポートを掲載しました

コリン・ムックの「今から始める ActionScript 3.0 - WORLD WIDE TOUR」
http://www.adobe.com/jp/events/as3/

というわけで、本家 adobe のページに、先日のコリン・ムックのレポートが掲載されました。

内容もイベントの流れに沿って説明してあるので、当日行った方は確認に、行けなかった方はおおまかな内容確認に使えるのではないでしょうか。

ところで、この記事に気になる一文が。
セミナーで利用した教材はこちら (日本語訳版も近々公開予定)
どうやら、actionscript 3.0 from the ground up の日本語訳が公開されるようです。

いやぁ、良かった良かった。
これで、オレもイベント前に予習した意味があったというものです。
あ、あれ、目から水が…
posted by ActionScript 3.0 を一から学ぶ超初心者 at 22:32| Comment(0) | TrackBack(0) | ActionScript 関連の記事 | このブログの読者になる | 更新情報をチェックする

ActionScript 3.0: Is It Hard or Not?(英訳 その4)

一般に、ActionScript 3.0 の新しい表示システムが、わずかな限界がある以前のものより、学ぶのが簡単であることは、私にもわかります。
過去において、Flash の表示システムを学んでいる新しいプログラマーたちは、回避方法が文書化されておらず、Flashコミュニティの言い伝えだけが存在するような、訳のわからない限界に必然的に遭遇していました。
例えば、ActionScript 2.0 は、存在する2つのグラフィックの間に、新しいグラフィックを挿入する直接的な方法を提供しませんでした。
その代わりに、プログラマーたちは、表示リストで既存のグラフィックスを再編成するため、swapDepths() を使ったカスタムのdepth(深さ)の管理コードを書くことが当然となっていました。
同様に、ActionScript 2.0 は、1つの .swf のシンボルを、もう一つの .swf の表示リストに結びつける直接的な方法を提供しませんでした。
その代わりに、プログラマーたちは、例によって"子".swf を望ましい"親".swf の中に配置して、子の内部で子シンボルを結びつけました。

ActionScript 2.0 とActionScript 1.0 の限界のための回避方法は、Flash 開発者へのおなじみの分野となりましたが、新しい ActionScript プログラマーにとっては、深刻な学習への障害でした。
対照的に、ActionScript 3.0 では、表示システムがほとんど有効に作用する
ので、新しいプログラマーたちは、扱いにくい回避方法を研究する時間が少なくなり、価値のあるプログラミング技法を学ぶのに、より多くの時間を費やせます。
ActionScript 3.0 では、既存のグラフィックの間にグラフィックを挿入するのに、addChildAt() を使うことができます。
画面外のグラフィックの全部のコンテナを取ってくることもできますし、後ろのスクリーン上の他のどこかへ、それを配置することもできます。
そして、1つの .swf からもう一つの .swf の表示リストへ、簡単にシンボルのインスタンスを加えることができます。
これらは時間を節約するだけでなく、あらゆる ActionScript プログラムの回避方法コードの量を減らし、学習が簡単であるという気持ちを満足させます。

ActionScript 1.0 と ActionScript 3.0 の学習の難しさを比較する、最後の例を見ましょう:
単純なログインデータをサーバーに出す。
ActionScript 1.0 のコードがあとに続く:データを送ったり、ロードするために、LoadVars を使い、loadVariables() を使わないことに注意。
コードは、ステージ上の2つのテキストフィールドにあると仮定します:usernameField (ログイン名) と responseField (サーバの反応)
// 1フレーム目のコード
var dataSender = new LoadVars();
var dataReceiver = new LoadVars();
dataReceiver.onLoad = function () {
responseField.text = this.serverResponse;
}

function submitForm () {
dataSender.username = usernameField.text;
dataSender.sendAndLoad("http://www.example.com/cgi-bin/login.pl",
dataReceiver,
"GET");
}

// submit ボタンのコード
on (release) {
submitForm();
}

ActionScript 3.0 の場合:
// 1フレーム目のコード
var variables = new URLVariables();
var request = new URLRequest();
request.url = "http://www.example.com/cgi-bin/login.pl";
request.data = variables;

var loader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, completeListener);

submitButton.addEventListener(MouseEvent.CLICK, clickListener);

function completeListener (e:Event) {
responseField.text = loader.data.serverResponse;
}

function clickListener (e:MouseEvent) {
variables.username = inputField.text;
loader.load(request);
}

率直に言って、前の例の両方とも、初心者プログラマーが理解するのは難しいと思います。
両方の場合とも、コードを理解するために、プログラマーにはクラスからオブジェクトを作ること、価を変数に割り当てること、イベントのために登録することの適切な理解がなければなりません。
しかし、ActionScript 3.0 のコードは、いくつかの長期的な利益を提供します:

・ActionScript 3.0 では、一旦 URLLoader を使うことを学べば、二進数、テキスト、変数、XMLを含む、どんなデータでもロードすることができます。
ActionScript 2.0 以前の場合、対照的に、XMLをロードする(XML.load()を参照)ために別々のクラスが必要でした。また、変数をロードする(loadVariables())ために、競争メカニズムが存在していました。
ActionScript 3.0 では、URLLoader についての知識は、さまざまなデータに持っていくことが可能です。

・ActionScript 3.0 では、一旦 URLLoader を使うことを学べば、その知識をグラフィックアセット(例えば、.jpg ファイル や .swf ファイル)をロードする Loader クラスの仲間に直接適用することができます。
ActionScript 2.0 以前の場合、矛盾するシステムは、loadMovie()、loadMovieNum()、MovieClipLoader のようなグラフィックアセットを使用していました。
さらに、グラフィックスをロードするために使用した、ActionScript 2.0 の API は、テキストデータをロードするのに用いられるそれらと違っていました。
ActionScript 2.0 と ActionScript 1.0 の均一性の欠如は、新しい ActionScript の開発者に、彼ら自身のコードを疑わせます。
私は、しばしばプログラマーたちが「本当に .jpg ファイルをロードするのに、loadMovie() を使わなければいけせんか?」「生のテキストファイルをロードしたいんですが、loadVariables() を使わなければいけせんか? それは変数のためにデザインされたかのように聞こえますが。」
「いつ、loadVariables() の代わりに、LoadVarsを使わなければなりませんか?」と尋ねるのを聞きました。
対照的に、ActionScript 3.0 のローディング API は、単純で、首尾一貫しています:
Loader はグラフィックアセットをロードするために、そして、URLLoader はバイナリまたはテキストデータをロードするために存在します。
Loader と URLLoader は、両方ともローディングのために load() メソッドを使います。 そして、両方とも同じロードステータスイベント(Loader の場合、Loader Infoメソッドを通して)を発生します。
全体のローディングシステムを作るこの均一性が、ActionScript の以前のバージョンより、学習を簡単にします。

・ActionScript 3.0 では、addEventListener() の知識とビルトインイベントアーキテクチャは、言語のすべて、構成要素から、ネットワークのオペレーション、イベントの入力に当てはまります。
一旦、1つのオブジェクトからイベントを取り扱うことを学べば、どんなオブジェクトから、どんなイベントを要請するかの知識を持ちます。
ActionScript 2.0 以前の場合、デベロッパーは4つの異なる方法、ハンドルイベント(イベントプロパティを含む)、イベントリスナー、on() イベントと onClipEvent() イベント、を学ぶように要求されました。

・学習過程と比較したイベントについて話すのに対し、Flash の以前の on()/onClipEvent() システムと新しい addEventListener() システムを比較することは、重要だと思います。
以前のシステムは、Flash のオーサリング環境で、ビヘイビアをビジュアルオブジェクトにアタッチする便利な方法を提供します。
新しいシステムは、コードを集中させ、対処可能にしておく方法を提供します。
概念的に、on()/onClipEvent() システムは、役に立つデベロップメントメタファーですが、その要求を満たす完全なツールを得ることはできませんでした。
しばしば、ビジュアルオブジェクトに置かれたソースコードは、繰り返しが多く扱いにくいもので、バグと難しい複数の開発ワークフローに時間を取られるようになりました。

・したがって、on()/onClipEvent() システムは、Flash CS3 から削除されました。
私は、将来、アドビが on()/onClipEvent() の体系のリバイバルを考慮に入れた、ビジュアルデベロップメントツールセットを向上させることを望みます。
たとえば、ひょっとしたら、ビジュアルオブジェクトに置かれたコードは、集中化した場所からの自動生成のクラスであっても、編集可能でなければなりません。
ふさわしいツールのサポートによって支援され、イベントリスナーをビジュアルオブジェクトにアタッチすることは、生産的なワークフローの理にかなった部分となるでしょう。
アドビの新しいツール、Thermo はその方向に動いているようです。
posted by ActionScript 3.0 を一から学ぶ超初心者 at 18:00| Comment(0) | TrackBack(0) | ActionScript 関連の記事 | このブログの読者になる | 更新情報をチェックする

2008年01月23日

ActionScript 3.0: Is It Hard or Not?(英訳 その3)

では、今より複雑なプログラムの動きの例を、最初はActionScript 1.0 で少し見てみましょう。
コードは、円のまわりでムービークリップを回転させます。
前述の通り、"ball" と呼ばれるムービークリップインスタンスが、Flash オーサリングツールで、手動で1フレーム目に置かれていると仮定します。
var rpm = 30;
var radius = 150;
var centerX = 230;
var centerY = 200;
var theta = 0;
var degreesPerSecond = rpm * 360 / 60;
var now = getTimer();

var intervalID = setInterval(moveClipAroundCircle, 20, ball);

function moveClipAroundCircle (theClip) {
var then = now;
now = getTimer();
var elapsed = now - then;
var numSeconds = elapsed / 1000;
var degreeIncrement = degreesPerSecond * numSeconds;
theta += degreeIncrement;
theta %= 360;
var radians = degreesToRadians(theta);
theClip._x = centerX + Math.cos(radians) * radius;
theClip._y = centerY - Math.sin(radians) * radius;
}

function degreesToRadians(degrees) {
return (degrees/180) * Math.PI;
}

これが ActionScript 3.0 による、同じスクリプトです:
// 1フレーム目のコード
var rpm = 30;
var radius = 150;
var centerX = 230;
var centerY = 200;
var theta = 0;
var degreesPerSecond = rpm * 360 / 60;
var now = getTimer();

var intervalID = setInterval(moveClipAroundCircle, 20, ball);

function moveClipAroundCircle (theClip) {
var then = now;
now = getTimer();
var elapsed = now - then;
var numSeconds = elapsed / 1000;
var degreeIncrement = degreesPerSecond * numSeconds;
theta += degreeIncrement;
theta %= 360;
var radians = degreesToRadians(theta);
theClip.x = centerX + Math.cos(radians) * radius;
theClip.y = centerY - Math.sin(radians) * radius;
}

function degreesToRadians(degrees) {
return (degrees/180) * Math.PI;
}

もう一度。変数名の主要なアンダースコアの除去を除き、ActionScript 3.0 のコードは ActionScript 1.0 と同一で、したがって、学習は少しも難しくありません。
私は、このやり方で制作しません。

もう一つの例に移って、実行時、プログラム的にムービークリップシンボルのインスタンスを作りたいとします。
ActionScript 1.0 によるやり方:

1.ライブラリの中のムービークリップのシンボルを右クリックして、リンケージを選択
2."ActionScript に書き出し"をチェックする
3.識別子に "BallSymbol" と名前を指定、次にOKをクリック
4.タイムライン上に、次のコードを追加:
someParentClip.attachMovie("BallSymbol", "ball1", 0);

ActionScript 3.0 によるやり方:

1.ライブラリの中のムービークリップのシンボルを右クリックして、リンケージを選択
2."ActionScript に書き出し"をチェックする
3.クラスに "BallSymbol" と名前を指定、次にOKをクリック
4.ActionScript のクラス警告ダイアログで、OKをクリック
5.タイムライン上に、次のコードを追加:
someParentClip.addChild(new Ball());


ActionScript 1.0 と ActionScript 3.0 のやり方の唯一の根本的な違いは、プログラム的にムービークリップインスタンスを作成し、それをステージに加えるコードを使用することです。
// ActionScript 1.0 のコード:
someParentClip.attachMovie("BallSymbol", "ball1", 0);

// ActionScript 3.0 のコード:
someParentClip.addChild(new Ball());

新しいプログラマが“シンボルの新しいインスタンスを作成する”やり方を学ぶために、私は ActionScript 3.0 の語法 "new Ball"は、ActionScript 1.0 の語法、"attachMovie('BallSymbol'...)" より直観的であると思います。
構文 "new Ball" は、“新しいモノを作る”というコンセプトを、より直接的に表します。
また、ActionScript 3.0 の語法 "addChild()" は、"親"ムービークリップが"子"ムービークリップを含むという、表示階層のコンセプトをうまく補強します。
語法を越え、ActionScript 3.0 のやり方は、もう一つの利益を提供します:
そのクラスに基づく用語は、新しいデベロッパーが、もし彼らが選択をすれば、より複雑なオブジェクト指向プログラミングに、スムーズに移行することを助けます。
ActionScript 3.0 では、"new Ball()" を書くために使う知識は、表示可能、不可能に関わらず、他の全てのオブジェクトの種類に、直接適用できます。
一旦、デベロッパーが "new Ball()" を言うことを学んだならば、その次に "new TextField()"、"new Date()"、"new MovieClip()"、"new ColorPicker()"などは、すぐ理解できます。
ActionScript 3.0 の一貫した"new をベースにした"表示オブジェクトの具体化は、ライブラリのムービークリップシンボルの attachMovie() 、一般的なムービークリップである createEmptyMovieClip()、新しい空のテキストフィールドである createTextField()、非表示オブジェクトである "new SomeClassName()" を含む、以前の具体化テクニックのコレクションより複雑ではありません。
ActionScript 2.0 とActionScript 1.0 のオブジェクトの具体化テクニックは、
初心者には覚えるのが難しく、Flash に“気まぐれな”開発環境という評判を与えるのを助けました。
posted by ActionScript 3.0 を一から学ぶ超初心者 at 18:00| Comment(0) | TrackBack(0) | ActionScript 関連の記事 | このブログの読者になる | 更新情報をチェックする