<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>宇都宮ウエブ制作所 &#187; AS3</title>
	<atom:link href="http://utweb.jp/blog/archives/tag/as3/feed" rel="self" type="application/rss+xml" />
	<link>http://utweb.jp/blog</link>
	<description>宇都宮さんっていう、夫婦でやってるウエブサイト制作請負の大阪下町家内製手工業業務日誌</description>
	<lastBuildDate>Thu, 02 Feb 2012 14:35:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/tag/as3/feed" />
		<item>
		<title>HTML5+Three.jsで3Dプログラミングに挑戦！</title>
		<link>http://utweb.jp/blog/archives/1330</link>
		<comments>http://utweb.jp/blog/archives/1330#comments</comments>
		<pubDate>Wed, 01 Feb 2012 09:31:43 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=1330</guid>
		<description><![CDATA[丸坊主なのに寝癖が付く男、正宗です。前回の記事「Actionscript3erが覚えるJavascriptでのクラス開発まとめ」でjavascriptをActionscript3ライクに書く方法をまとめてみたので、今度は [...]]]></description>
			<content:encoded><![CDATA[<p>丸坊主なのに寝癖が付く男、正宗です。<a href="http://utweb.jp/blog/archives/1281">前回の記事「Actionscript3erが覚えるJavascriptでのクラス開発まとめ」</a>でjavascriptをActionscript3ライクに書く方法をまとめてみたので、今度は練習がてらHTML5をさわってみました。</p>
<p>WebGL版です。<br />
<div id="attachment_1331" class="wp-caption alignnone" style="width: 310px"><a href="http://utweb.jp/test/html52/" title="Webかるた" target="_blank"><img src="http://utweb.jp/blog/wp-content/uploads/2012/02/a3c02fe803077ec2c342b35229b46313-300x205.png" alt="クリックで別ウインドウで開きます。" title="Webかるた" width="300" height="205" class="size-medium wp-image-1331" /></a><p class="wp-caption-text">クリックで別ウインドウで開きます。</p></div><br />
画像クリックすると別ウインドウで開きます。<br />
うまく動かない場合はWebGLを使わない素のCanvasレンダリングも作ってみましたので<a href="http://utweb.jp/test/html5/" target="_blank">こちらのリンク先</a>を参照してください。<br />
スクロールで3D空間をうねうね動く的なことがやりたいんだろうな、って思ってもらえたらうれしいです。ちなみに背景には旅行の思い出の写真をあしらって、ナイスな感じに仕上げました。<br />
ソースは適当にほじくって見てみてください。</p>
<p>今回は、はじめてHTML5を触ってみた中でわかったことを書きたいと思います。<br />
<span id="more-1330"></span><br />
HTML5でJavascriptからグラフィックを操作するには、従来のdivの操作に加えてSVGとCanvasを使う方法が加わったらしく、とりあえず今回はCanvasを使ってみました。</p>
<h3>3Dライブラリthree.jsについて</h3>
<p>ご存じのとおり、SVGはベクターを扱うタグでして、Canvasはピクセルを扱う場所になります。AS3だとベクターもラスターもどっちもよく扱うのでJSでも出来るんだろうけど流石に今回ピクセル操作ばっかりプログラミングするのは面倒くさかったので何かいいライブラリはないかと思っていると、どうやら3Dのライブラリ<a href="https://github.com/mrdoob/three.js/" target="_blank">three.js</a>が何やら面白そうです。<br />
ある程度のJavascriptの知識と、3Dライブラリを使ったプログラムの経験があればすんなりと使うことが出来ました。<br />
がんばってAPIを掘り下げれば、かなり面白いものが作れそうです。</p>
<p>注意すべき点は、たぶんバージョンアップのためだと思うのですがAPIの仕様が変わっていて、古い解説文書などですと動かない場合があることです。<br />
あとどうしてもドキュメントが少ないので、特にリファレンスが無いと何も出来ない僕にとっては、慣れ親しんだASDocくらい詳しいリファレンスが無いのが地味に大変でした。</p>
<p>ただし、クラス名やプロパティに変な癖も無いのでリファレンスが足りて無くても何とかなりました。<br />
一般的な3Dライブラリと似たような感じで</p>
<ul>
<li>シーンを作って、カメラを作って、レンダラーを作って</li>
<li>シーンや表示オブジェクトは入れ子構造にできて</li>
<li>ジオメトリとマテリアルを持つメッシュを作成して表示オブジェクトに追加</li>
<li>シーンとカメラを指定してレンダリングを実行</li>
</ul>
<p>という、ごくごく自然な流れでプログラミングできました。</p>
<p>面白いことに、WebGLでレンダリングするレンダラーと、素のCanvasにレンダリングするレンダラーがあるんですが、その二つをかなり簡単に切り替えられるんです。<br />
ここらへんは型付けがゆるいJavascriptならではの面白みだと思いました。</p>
<h3>制作環境について</h3>
<p>かなり残念な英語力と記憶力、たぐいまれなるタイピングミスの持ち主の僕にとって、開発環境こそが頼みの綱です。<br />
今回は<a href="https://twitter.com/#!/kotaro_tan" target="_blank">@kotaro_tan</a>さんに<a href="https://twitter.com/#!/masamunet/statuses/154863766771744768" target="_blank">教えて頂いた</a>WebStormというIDEを使ってみました。<br />
<div id="attachment_1332" class="wp-caption alignnone" style="width: 310px"><a href="http://utweb.jp/blog/wp-content/uploads/2012/02/13aaed03c6d403c190b9057b96e705b2.png" title="WebStorm"><img src="http://utweb.jp/blog/wp-content/uploads/2012/02/13aaed03c6d403c190b9057b96e705b2-300x217.png" alt="なにやらかっこいいクラスを作ってるなう" title="WebStorm" width="300" height="217" class="size-medium wp-image-1332" /></a><p class="wp-caption-text">なにやらかっこいいクラスを作ってるなう</p></div><br />
コードに色がたくさんついて綺麗なので気に入っています！</p>
<h3>Javascriptをクラスで開発していくことについて</h3>
<p><a href="http://utweb.jp/blog/archives/1281">前回の記事「Actionscript3erが覚えるJavascriptでのクラス開発まとめ」</a>でJavascriptでクラスを作って開発するスタイルをまとめてみたわけですが、手前味噌ながらこれが非常に役に立ちました。<br />
javascriptにはjavascriptの面白さがあるので、AS3のクラスっぽい作り方が無理矢理なのであれば何もわざわざjavascriptの面白さを消してまでクラス作りをする必要は全くないと思っていたのですが、無理矢理どころかむしろだいぶ自然にクラスが使えたので、だいぶ効率よく作ることが出来ました。<br />
後述するjsファイルの重複ロード問題も今回はクラスを使って解決できましたし、デザインパターンが使えるのもなによりうれしいひなまつりです（こんど娘が初節句なんです。楽しみで楽しみで）。<br />
クラスは僕も最初かなり苦手意識を持っていましたが、品質を上げるための先人の知恵の結晶なので今後ももっともっと勉強していきたいです。</p>
<h3>Javascriptのゆるさについて</h3>
<p>Javascript特有の「ゆるさ」は長所でもあり短所でもあるんですが、久々にまあまあの量のJavascriptをコーディングして、このゆるさもかなり楽しめました。<br />
個人的にはガチガチの型付け言語をガチガチのIDEで扱った方が実質的なコーディング速度は速いと思うんですが、Javascriptの設計のゆるさからくる「アイデアが形になるまでの速度感」はAS3とはまた違った面白さがあります。<br />
AS1の頃の面白さとHTML5の新鮮さの良いところどりはずるいと思います。</p>
<p>javascriptの楽しさをたっぷり楽しんだ上で、今後の課題も書き留めておきたいと思います。<br />
あくまでActionscript3よりな人間が久々に遊びでJavascript触ってみて対応というか妥協した程度の記録ですので、今後かならず解決するべきだしもっといいノウハウは他にあるはずです。</p>
<h4>変数やオブジェクトがいくらでも上書きできてしまう</h4>
<p>定数は無理としても、prototypeに閉じ込めるなどしてprivateな空間は作るべきなのでしょうが、今回はそこまでしませんでした。変数のアクセス範囲を出来るだけ狭くすることが鉄則なのに、非常に悩みどころです。</p>
<h4>名前空間について</h4>
<p>いちおう最初のファイルに</p>
<pre class="brush:javascript">if(!jp_utweb_namespace){
    var jp_utweb_namespace = {};
}</pre>
<p>こういう事書いておくことで「俺はグローバルの名前空間をあんまり汚染しない男だぞ」アピールをしているのですが、正直気に入っていません…。<br />
最低でもプロジェクトごとにも別けたいし、ネームスペースの変数名そのものを持ち回りたいんですが、そこらへんは今後の課題として残りました。</p>
<h4>重複ファイルのロードについて</h4>
<p>こういったjavascriptファイルがあったとして、<br />
onece.js</p>
<pre class="brush:javascript">;(function(ns){
    alert('一回しか実行を想定していない処理！');
})(jp_utweb_namespace);</pre>
<p>HTMLで二回読み込まれてしまうと</p>
<pre class="brush:html"><script type="text/javascript" src="onece.js"></script>
<script type="text/javascript" src="onece.js"></script></pre>
<p>当然二回実行されてしまいます。<br />
実行前にDOMを調べて、src属性に自分のファイル名と同じscriptタグが２つ以上ある場合は一回しか実行しない、といった処理をすればいいのですが、うまくライブラリ化できなかったので、それは今後の課題になります。</p>
<p>今回とった方法では、クラスを作成する処理ばかりにしておいて、最後にrun.jsというスクリプトファイルのみ、重複チェックを行って、ActionScriptでいうドキュメントクラスに相当するクラスを一回だけ実行する、というやり方にしました。</p>
<p>クラスを作成する直前に</p>
<pre class="brush:javascript">;(function(ns){
    if(!!ns.Mein){
        return;
    }
    ns.Main = functino(){};
})(jp_utweb_namespace);</pre>
<p>こんな感じでチェックを入れても良かったのですが、タイプミスなどによるデバッグがしづらくてかえって危険なのでやめました。<br />
実際に上のコードはこんなに短いのに見つけるのが困難なバグがあります。<br />
ここは素直に</p>
<pre class="brush:javascript">;(function(ns){
    ns.Main = functino(){};
})(jp_utweb_namespace);</pre>
<p>こう書くことにしました。<br />
重複ロード時にクラスが複数回生成されてしまうコストが発生しますが、プログラムの意図しない箇所でバグるよりはマシかと。</p>
<h3>まとめ</h3>
<p>いまのところまだちょっと触って遊んでみた程度ですので、今後案件に投入できるかどうかの判断もまだ現段階ではつきませんが、面白い技術であることには間違いないです。<br />
少なくともWEB上でリッチなインターフェースやモーション、体験を作るということにおいてはActionScripterこそ親和性の高い技術なので、これからどんどんと横断的に開発できるノウハウを見つけ出してハイブリッドな開発者がたくさん増えると面白いかと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/1330/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/1330" />
	</item>
		<item>
		<title>Actionscript3erが覚えるJavascriptでのクラス開発まとめ</title>
		<link>http://utweb.jp/blog/archives/1281</link>
		<comments>http://utweb.jp/blog/archives/1281#comments</comments>
		<pubDate>Sun, 29 Jan 2012 07:40:28 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=1281</guid>
		<description><![CDATA[カレーうどんが好きです。今日のお昼はカレーうどんでした。正宗です。
今日はJavascriptでクラス開発をしてみたいと思います。
冒頭のカレーうどんは関係ないですね。何かいわなきゃと思ってつい好物を出してみました。
ご [...]]]></description>
			<content:encoded><![CDATA[<p>カレーうどんが好きです。今日のお昼はカレーうどんでした。正宗です。<br />
今日はJavascriptでクラス開発をしてみたいと思います。<br />
冒頭のカレーうどんは関係ないですね。何かいわなきゃと思ってつい好物を出してみました。<br />
ご存じのとおり、Actionscriptはもともとバージョン1の頃はJavascriptとほぼ同じ言語であり、つまりAS1の頃のクラス開発がそのまま使える形となっています。</p>
<p>そこでJavascriptでクラスを作ったりするときに「あれ？ASだとこうやるやり方、JSだとどうやるんだっけ」ってのを減らせるように、完全に個人的な備忘録を作ってみました。自己流なうえにオレオレ規約ばっかりで恥ずかしい限りですがせっかく作って公開したのでなんらかのお役にたてばうれしいです。</p>
<p>Javascriptでのクラスの作り方は本当にたくさんの方法がありますが、その中で僕が一番馴染んでいる書き方だけを勝手に選んでのせています。<br />
さっきふと思い立ってやった方法をそのままばんばんのせている感じです。<br />
あと、JSとの類似性を浮き上がらせるためにASにはあえて型を宣言しないで書いています。<br />
ASやJSの綺麗なコードの書き方ではなく、あくまでもASに似せたやり方でJSを書いていく方法を探った記事ですのでご了承ください。<br />
あと、技術書でも何でもなくあくまで個人の備忘録ですので恥ずかしながら盛大に間違えている箇所がたくさんあるかと思います。その場合間違いは常に正していきたいのでご指摘頂けると大変嬉しいです。<br />
ほんと僕のブログ間違いもおおいんで前置きも長々となってしまってすいません。<br />
<span id="more-1281"></span></p>
<p>同じ処理を最初にAS3、次にJSの順番で書いてみたいと思います。</p>
<h3>クラスを使ってみる</h3>
<p>クラスを使う方法はまさに全く同じです。<br />
actionscript3</p>
<pre class="brush:as3">//インスタンスメンバを使う場合。
var d = new Date();
trace(d.getTime());
//クラスメンバを使う場合。
trace(Math.random());</pre>
<p>javascript</p>
<pre class="brush:javascript">//インスタンスメンバを使う場合。
var d = new Date();
console.log(d.getTime());
//クラスメンバを使う場合。
console.log(Math.random());</pre>
<p>つまり<strong>作り方の違いさえうまく吸収できれば、クラスを使うぶんにおいてはほぼ全くといっていいほど同じように使えるようになる</strong>ってことではあーりませんか。<br />
こりゃいいや、さっそく作り方をまとめてみよう。</p>
<h3>クラスを作ってみる</h3>
<p>AS3のほうは意図的にpackageブロックを書いていません。<br />
actionscript3</p>
<pre class="brush:as3">public class Human {
	public function Human() {}
}</pre>
<p>javascript</p>
<pre class="brush:javascript">/**
 * @constructor
 */
function Human(){};</pre>
<p>Javascriptではfunction宣言するだけでクラスが作れます。この部分がそのままコンストラクターになります。<br />
作ったクラスは先ほどみたいにASでもJSでも全く同じように</p>
<pre class="brush:as3">var John = new Human();</pre>
<p>こういうふうに使えるようになります。</p>
<h3>プライベートプロパティ、プライベートメソッドを作ってみる</h3>
<p>JSでは言語としてprivateをサポートしてないっぽい？<br />
言語がサポートしていない以上、なんとかして隠匿化するコードを書いた方が良いのかもしれませんが、個人的にはオリジナルで処理を組むよりは規約を作って<a href="http://code.google.com/intl/ja/closure/utilities/docs/linter_howto.html" target="_blank">こういったチェックツール</a>に頼る方が好みなので、JSのほうは<a href="http://cou929.nu/data/google_javascript_style_guide/#visibility-private-protected" target="_blank">Googleのコーディング規約を参考に</a>こうしてみました。<br />
まあClosure Linterまだ使ったことないですが。<br />
actionscript3</p>
<pre class="brush:as3">public class Human {
	public function Human() {}

	private var himitsu_ = 'わりと最近うんこをもらした';

	private function think_() {
		trace('（´-`）.｡oO（蛇口からビールが出ればいいのになあ…。');
	}
}</pre>
<p>javascript</p>
<pre class="brush:javascript">/**
 * @constructor
 */
function Human(){
    /** @private */ this.himitsu_ = 'わりと最近うんこをもらした';

    /** @private */ this.think_ = function() {
        console.log('（´-`）.｡oO（蛇口からビールが出ればいいのになあ…。');
    };
};</pre>
<p>JSのほうは、コンストラクタ内で宣言することで「これはプライベートな空間なんですよ」と（自分が）強く思い込むことにしました。</p>
<blockquote><p>2012/01/29 追記<br />
コンストラクタ内でvar で宣言しておいて、getter/setterで操作するってやり方を今知りました。うーん、それ使うかどうしようか迷う…。</p></blockquote>
<blockquote><p>2012/01/29 さらに追記<br />
さっそく<a href="https://twitter.com/#!/taikiken" target="_blank">@taikiken</a>さんからpublic/privateをわける方法を教えて頂きました。<br />
<a href="https://twitter.com/#!/taikiken/status/163534841021861889" target="_blank">ツイッター</a><br />
<a href="http://www.inazumatv.com/contents/archives/6350" target="_blank">JavaScriptでOOP – Classみたいなのにprivateな関数と変数 | イナヅマtvログ</a><br />
コンストラクタ内でvarでプライベート宣言しておいた上で、mainというfunctionもprivateで保持しつつそこのprototypeにpublicな変数と関数を入れておいてreturnするというやり方ですね（僕が言葉にするとかえってわかりにくいですが教えて頂いたコードはすごい明快です）。プロトタイプベースのクラス、奥が深い！</p></blockquote>
<h3>パブリックプロパティ、パブリックメソッドを作ってみる</h3>
<p>JSがprivateをサポートしていない（未確認）以上、publicもファブリックもあったもんじゃない（最近IKEAに行きました）のですが、JSのほうではprototypeに宣言することで「これはパブリックな空間にあるんですよ」と（自分が）強く思い込むことにしました。<br />
actionscript3</p>
<pre class="brush:as3">public class Human {
	public var syumi = 'プリクラ集め、水に向かって綺麗な言葉を言い続けること';

	public function work() {
		trace('|^o^|＜ひきこもりぎみなのでそとをあるくのはにがてです');
	}
}</pre>
<p>javascript</p>
<pre class="brush:javascript">/**
 * @constructor
 */
function Human(){};
/** @public */ Human.prototype.syumi = 'プリクラ集め、水に向かって綺麗な言葉を言い続けること';

/** @public */ Human.prototype.work = function() {
    console.log('|^o^|＜ひきこもりぎみなのでそとをあるくのはにがてです');
};</pre>
<h3>スタティックなプロパティやメソッドを作ってみる</h3>
<p>JSではクラス（正確にはFunctionオブジェクト？）に直接定義することでstaticになりました。<br />
actionscript3</p>
<pre class="brush:as3">public class Human {
	public static function help() {
		trace('困ったときはお互い様。');
	}
}</pre>
<p>javascript</p>
<pre class="brush:javascript">/**
 * @constructor
 */
function Human(){};
Human.help = function() {
    console.log('困ったときはお互い様。');
};</pre>
<p>助け合いの心は人が誰もが持っている心。美しいですね（美）</p>
<h3>継承してみる</h3>
<p>僕の作ったクラスがだいぶ人としても完成されてきた頃なので、ここらで継承して新たなクラスを作ってみたいと思います。<br />
actionscript3</p>
<pre class="brush:as3">public class Hentai extends Human{
	public function Hentai() {}

	public function zenra() {
		trace('╰⋃╯');
	}
}</pre>
<p>javascript</p>
<pre class="brush:javascript">/**
 * @constructor
 * @extends {Human}
 */
function Hentai() {};
Hentai.prototype = new Human();
Hentai.prototype.zenra = function() {
    console.log('╰⋃╯');
};</pre>
<p>Javascriptでは新たなクラスのprototypeにスーパークラスをインスタンス化させると継承できました。</p>
<h3>オーバーライドしてみる</h3>
<p>JSはそのまま親クラスを上書きするだけとしています。<br />
actionscript3</p>
<pre class="brush:as3">public class Hentai extends Human{
	public override function work() {
		//super.work();
		trace('三╰⋃╯');
	}
}</pre>
<p>javascript</p>
<pre class="brush:javascript">/**
 * @constructor
 * @extends {Human}
 */
function Hentai() {};
Hentai.prototype = new Human();
/** @override */ Hentai.prototype.work = function() {
    //this.constructor.prototype.work.call(this , arguments);
    console.log('三╰⋃╯');
};</pre>
<h3>インターフェースを使ってみる</h3>
<p>JSではインターフェースもサポートされていないので、インターフェースに似たふるまいをするコードを書くか書かないか、書くとしたらどこまで書こうか、ここ一番悩んだんですが、結局コードとしては一切書かないことにしました。<br />
だいたい<a href="http://code.google.com/intl/ja/closure/compiler/docs/js-for-compiler.html" target="_blank">この辺の記事</a>を参考に、規約で実現する方法を探っているところです。今のところコメントにinterfaceと書いてるだけですが。<br />
actionscript3</p>
<pre class="brush:as3">public interface IBijin {
	function yasashii();
	function iinioi();
}

public interface IIsya {
	function care();
}

public class Jyoi implements IBijin, IIsya{
	public function Jyoi() {}
	public function yasashii() {}
	public function iinioi() {}
	public function care() {}
}</pre>
<p>javascript</p>
<pre class="brush:javascript">/**
 * @interface
 */
function IBijin() {};
IBijin.prototype.yasashii = function() {};
IBijin.prototype.iinioi = function() {};

/**
 * @interface
 */
function IIsya() {};
IIsya.prototype.care = function() {};

/**
 * @constructor
 * @implements {IBijin, IIsya}
 */
function Jyoi() {};
Jyoi.prototype.yasashii = function() {};
Jyoi.prototype.iinioi = function() {};
Jyoi.prototype.care = function() {};</pre>
<p>こんな感じでしょうか？コードがなんかだいぶ投げやりになってきたなあ。</p>
<h3>さいごに</h3>
<p>僕がまとめた限りではまあだいたいこんなものではないでしょうか。<br />
無理矢理にしてまでJSをASのクラスライクに書いていく必要はないと思いますが、わりかし自然にASっぽく書くことも出来なくはなさそうな感じはします。<br />
今話題のArctic.jsやenchant.jsなど（ふたつとも僕はまだ残念ながら使えていないんですが）のようにASライクに書けるJSのライブラリも増えてきましたし、とりあえず横断的に開発してみたくてまとめてみました。<br />
ASもそうですがJavascriptも独学の完全自己流なので本当は晒せるほどは自信がないですが、何かしら役に立てばなによりです。</p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/1281/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/1281" />
	</item>
		<item>
		<title>ActionScriptとJavaScriptとの連携をまとめてみる</title>
		<link>http://utweb.jp/blog/archives/1230</link>
		<comments>http://utweb.jp/blog/archives/1230#comments</comments>
		<pubDate>Sat, 22 Oct 2011 16:53:22 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=1230</guid>
		<description><![CDATA[普段の仕事で「あ、これはブログに書き留めておこう」と思ったことの半分以上は、仕事の忙しさを理由になかなか書くことが出来なくて、それだけにこうして休日の夜中でもちょっとでも時間に空きがあればブログを書けることがどんなに嬉し [...]]]></description>
			<content:encoded><![CDATA[<p>普段の仕事で「あ、これはブログに書き留めておこう」と思ったことの半分以上は、仕事の忙しさを理由になかなか書くことが出来なくて、それだけにこうして休日の夜中でもちょっとでも時間に空きがあればブログを書けることがどんなに嬉しいか。<br />
妻の高校の頃のジャージがやけに似合う男、正宗です。<br />
今日は、ActionScript3のExternalInterfaceを使ってJavaScriptと連携する際の、普段から気をつけていることをまとめてみたいと思います。<br />
サンプルのソースは<a href="https://github.com/masamunet/ExternalInterface----" target="_blank">こちら、github</a>に置いてみました。<br />
<span id="more-1230"></span><br />
AS3でJSとイチャイチャするにはExternalInterfaceを使えばいいというのは周知の事実ですが、いろいろと気をつけておいた方が良いことがたくさんあります。<br />
特に長年やっててまとめようまとめようと思っていた箇所を、いったんここにまとめてみたいと思います。<br />
絶対に気を付ける点はこちらです。</p>
<ol>
<li>ObjectタグのIDのどこかに「external」を入れる。</li>
<li>Javascriptの名前空間を出来るだけ汚染しない。</li>
<li>初期化の実行順序を守る</li>
</ol>
<blockquote><p>2011/10/23 追記<br />
ひろゆきさんに教えていただいたんですが<a href="https://twitter.com/#!/ProjectNya/status/127790607954485248" target="_blank">（こちら）</a>、IDに「external」を付けなくても動くそうです。</p></blockquote>
<p>AS側でやっといて便利なのは次の点です。</p>
<ol>
<li>JavaScriptとの連携は必ずシングルトンを介して行う。</li>
</ol>
<p>順番にみてみたいと思います。</p>
<h3>Cap1.ObjectタグのIDのどこかに「external」を入れる。</h3>
<p><a href="http://utweb.jp/blog/archives/41">こちらの記事</a>にあるように、IEのアホウはトンマなヤロウであるわけです。<br />
本来ならばIEのマヌケなバグにこちらが付き合ってやるいわれはないわけですが、ObjectタグのIDのどこかしらに「external」と入れてやれば万事解決するのであれば、そうしてやろうではありませんか。<br />
それが大人というものではないでしょうか。<br />
なのでSWFObjectの記述はこんな感じになるかと思います。</p>
<pre class="brush:javascript">
;(function(){
	var swfDirectory = "/";
	var swfFileName = "index.swf";
	var targetId = "flashcontent";
	var width = "800";
	var height = "600";
	var version = "9.0.45";
	var expressInstall = swfDirectory+"commons/scripts/swfobject/expressInstall.swf";
	var flashvars = {};
	flashvars.jsNamespace = "jp_utweb_ExternalInterface_sample";
	var params = {};
	params.menu = "false";
	params.quality = "best";
	params.scale = "noscale";//showAll
	params.salign = "tl";
	params.wmode = "transparent";//opaque wmode
	params.swliveconnect = "true";
	params.allowfullscreen = "true";
	params.allowscriptaccess = "always";
	params.allownetworking = "all";
	var attributes = {};
	attributes.id = "external_content";
	attributes.name = "external_content";
	attributes.align = "middle";
	swfobject.embedSWF(swfDirectory+swfFileName, targetId, width, height, version, expressInstall, flashvars, params, attributes);
})();
</pre>
<p>まずは22行目、23行目、ObjectのID属性に「external」が出現していることに注目してください。<br />
10行目の</p>
<pre class="brush:javascript">
flashvars.jsNamespace = "jp_utweb_ExternalInterface_sample";
</pre>
<p>は次のCap2で説明します。</p>
<h3>Cap2.Javascriptの名前空間を出来るだけ汚染しない。</h3>
<p>基本的には匿名関数とか使って、ぱっと実行された間に必要なときだけ呼び出されてあとは何事もなかったかのようにぱっと消えるのは格好良いんですが、ASからJSを呼び出そうとした場合、いろいろ試してみたんですがどうしても最低ひとつはJSの名前空間を汚染する必要があるという結論に至りました。<br />
これに関しては結構いろいろためして、一見して無駄だと思えるような、匿名関数の中でSWFObjectを実行してその中でSWFはJS側の関数を呼ぶことで全く名前を消費しない方法を使えないかとかいろいろ試したのですが僕のスキルではどうにもならず、結果としてどうしても一個だけ名前を消費する方法しか作れませんでした。<br />
これがそのJavaScriptのテンプレートです。</p>
<pre class="brush:javascript">
;var jp_utweb_ExternalInterface_sample;
(function(){
	this.getElementFromName = function(name){
		if (navigator.appName.indexOf("Microsoft") != -1){
			return window[name];
		}else{
			return document[name];
		}
	};
	jp_utweb_ExternalInterface_sample = function(){};
	jp_utweb_ExternalInterface_sample.ready = function(){
		//ActionScriptが実行可能状態になったら最初に呼び出される。
		//JS側からAS側に関数を呼び出すときは必ずこの関数が実行された後にしなくてはならない。
	};
	jp_utweb_ExternalInterface_sample.hoge = function(){
		//ActionScriptから適時呼び出される。
		var swf = this.getElementFromName("external_content");
		if(swf){
			//ActionScriptの関数を実行。
			swf.asFunction();
		}
	};
})();
</pre>
<p>一行目の</p>
<pre class="brush:javascript">
;var jp_utweb_ExternalInterface_sample;
</pre>
<p>これが唯一の名前空間となります。<br />
これと全く同じ名前を、Cap1の10行目で</p>
<pre class="brush:javascript">
flashvars.jsNamespace = "jp_utweb_ExternalInterface_sample";
</pre>
<p>というふうにFlashに伝えてあることによって、Flash側ではJavaScriptへの呼び出しを可能にします。<br />
Flash側での呼び出しはCap4で説明します。</p>
<h4>コーヒーブレイク：ぼくのかんがえたさいきょうのJS名前空間</h4>
<p>一旦休憩です。<br />
非常にくだらない事を書くので、読み飛ばしてCap3まで進めることを強くおすすめします。<br />
僕がJavaScriptを触っていて特に気を遣うのが名前空間の汚染なわけですが、大規模案件にかかわらず一人で開発しているような趣味のプログラミングでもどうしてもグローバルの名前空間の汚染が避けられない状況がよく出てきます。<br />
僕は僕なりにいろいろ調べてはみたんですが、JavaScriptは言語仕様としてどうしてもこれは避けられないのではないかと思うようになったわけです。<br />
名前空間を擬似的に扱うクラスを作ってみたりもしたんですが、そのクラスに一つ名前空間を使うという仕様になってしまい、これはだめだということで他のアプローチで名前空間を確保する方法を考えてみました。</p>
<h5>1:僕を褒める言葉を使用する。</h5>
<p>調べてみたんですが、少なくともインターネット上では僕を褒める言葉が使われている回数は皆無なのですね。<br />
そこでこれを利用して僕を褒め称える変数名を使用すると、絶対に名前空間が保証されるというアイデアです。<br />
こんなふうに使います。</p>
<pre class="brush:javascript">
var 正宗さんは格好いい = "ほげ";
var 正宗さんの言うことは常に正しい = "ふが";
</pre>
<p>2行目のように、僕を恒常的に肯定する言葉を用いるとより強固になります。</p>
<h5>2:自作ポエムを変数名にする。</h5>
<p>変数名などを自作のポエムにすることで著作権によってプログラマーの死語50年間まで担保される非常に強固な名前空間を仕様することができます。<br />
この場合の名前空間の強度はディズニー法の強度に依存します。</p>
<pre class="brush:javascript">
var かにをたべ　るとくちのなか　かゆくなる = "hoge";
</pre>
<p>プログラムが一気に風流になるという副次的効果付きでとてもおすすめです。<br />
仕方のない話しはここまでにして、本題に戻ります。<br />
今まではSWFを表示させるためにブラウザ側やHTML側、JavaScript側の問題でしたが、次はActionScript側の問題になります。</p>
<h3>Cap3.初期化の実行順序を守る</h3>
<p>よっぽどの理由がない限り、JS側からAS側に働きかける場合、AS側が準備完了かどうかを待ってJSは働きかけたほうがより安全だと思います。<br />
つまりAS側が準備完了になった時点ではじめてJSに通知して、JSはその通知を待ってASに働きかけるようにするのが定石と言えます。<br />
Cap2の11行目から14行目</p>
<pre class="brush:javascript">
jp_utweb_ExternalInterface_sample.ready = function(){
 //ActionScriptが実行可能状態になったら最初に呼び出される。
 //JS側からAS側に関数を呼び出すときは必ずこの関数が実行された後にしなくてはならない。
};
</pre>
<p>を用意しておき、必ずActionScript側から最初に呼び出されてJSの初期化をここで行うようにします。<br />
ここまでが僕が作った必ず守るべきルールになります。<br />
次からはActionScript側からJSと連携するのに便利な方法をまとめたものになります。</p>
<h3>Cap4.JavaScriptとの連携は必ずシングルトンを介して行う。</h3>
<p>この記事の最初に提示したgithubのサンプルソースを見ていただくとわかりやすいんじゃないかと思うんですが、Javascriptとの連携はそれを専門にしたシングルトンクラスにまかせることにします。<br />
ちょっと簡単に書いてみます。<br />
ActionScript3です。</p>
<pre class="brush:as3">
package
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.external.ExternalInterface;

	public class JavascriptTool extends EventDispatcher
	{
		public static const DO_HOGEHOGE:String = "doHogehoge";
		public static const DO_FUGAFUGA:String = "doFugafuga";

		private static var _instance:JavascriptTool;

		private var _jsNamespace:String;

		public static function getInstance(jsNamespace:String = null):JavascriptTool
		{
			if(!JavascriptTool._instance){
				JavascriptTool._instance = new JavascriptTool(new Enforcer());
				if(!jsNamespace){
					throw new JsNamespaceError("Javascriptと連携する名前空間を指定してください。");
				}else{
					JavascriptTool._instance._jsNamespace = jsNamespace;
				}
				try{
					ExternalInterface.addCallback("jsHoge", JavascriptTool._instance.hogehoge);
					ExternalInterface.addCallback("jsFuga", JavascriptTool._instance.fugafuga);
				}catch(error:Error){

				}
			}
			return JavascriptTool._instance;
		}

		public function ready():void
		{
			try{
				ExternalInterface.call(_jsNamespace + ".ready");
			}catch (error:Error){

			}
		}

		public function hogehoge():void
		{
			dispatchEvent(new Event(DO_HOGEHOGE));
		}

		public function fugafuga():void
		{
			dispatchEvent(new Event(DO_FUGAFUGA));
		}

		function JavascriptTool(enforcer:Enforcer):void{}
	}
}
class Enforcer{}
class JsNamespaceError extends Error{
	public function JsNamespaceError(message:String):void
	{
		super(message);
	}
}
</pre>
<p>シングルトンの説明は省いたとして、これ。<br />
ExternalInterface.addCallback<br />
第一引数がJavascript側から見える関数。<br />
第二引数が実際のActionScriptの関数。<br />
APIとして多言語に対しての接続部分が隠匿化できるので非常に優れてるといえますけど作業する本人達にとってはややこしいことこの上ないです。<br />
この部分を埋めるデバッグツールは存在しないわけですし。<br />
そうは言ってもわざわざJS側とAS側で呼び出す関数名を指定できるってことはJS側とAS側で違う名前にしておいたほうがいいって事ですかね？<br />
僕はそう解釈して実行していますが、このへんの名前の命名規則になにか良い方法があったら教えていただきたいです。</p>
<p>あと21行目、他はイレギュラーな使われ方をしたときにわざわざコンパイルエラーを出すように作ってあるのに対して、この部分だけはランタイムエラーになるようにしか作れませんでした。<br />
シングルトンの生成される最初だけ値を渡して初期化したいときに、初期化のタイミングで値が渡されたときとそれ以外で値が渡されたときの両方でコンパイルエラーを出す何か上手い方法があればどなたか教えてください。</p>
<p>というわけでまだまだ未完成ながらもこのシングルトンクラスをいきなりドキュメントクラスで使ってみたのがこちら。<br />
ActionScript3です。</p>
<pre class="brush:as3">
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;

	public class externalinterfaceSample extends Sprite
	{
		private static const _DEFAULT_JS_NAMESPACE:String = "hogehoge_msturi";
		public function externalinterfaceSample()
		{
			if(stage){
				_init();
			}else{
				addEventListener(Event.ADDED_TO_STAGE, _init);
			}
		}

		private function _init(e:Event = null):void
		{
			if(!(!e)){
				removeEventListener(Event.ADDED_TO_STAGE, _init);
			}

			var tf:TextField = new TextField();
			tf.border = true;
			tf.autoSize = TextFieldAutoSize.LEFT;
			addChild(tf);

			var jsNamespace:String = _DEFAULT_JS_NAMESPACE;
			var flashVars:Object = stage.loaderInfo.parameters;
			if(!(!flashVars.jsNamespace) && flashVars.jsNamespace.length > 0){
				jsNamespace = flashVars.jsNamespace;
			}
			var jsTool:JavascriptTool = JavascriptTool.getInstance(jsNamespace);
			jsTool.ready();

			tf.text = "Javascriptからの呼び出しが実行可能になった。";

			jsTool.addEventListener(JavascriptTool.DO_HOGEHOGE, function(e:Event):void{
				tf.text = "JavascriptからjsHogeが呼び出された。";
			});
			jsTool.addEventListener(JavascriptTool.DO_FUGAFUGA, function(e:Event):void{
				tf.text = "JavascriptからjsFugaが呼び出された。";
			});
		}
	}
}
</pre>
<p>こんな感じでどこでもシングルトンクラスからJSを実行できるし、逆にJSからの呼び出しもいつでもどこでもEventを受け取る形でキャッチできるようになるんだよ〜、というサンプルでした。<br />
ActionScript、スマートすぎる。</p>
<p>このCap4は全てgithubのままですが、最後にいちおうgithubのindex.htmlのソースも載せておきます！</p>
<pre class="brush:html">
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja" dir="ltr">
<head>
	<title>ExternalInterfaceの実験</title>
	<script src="http://www.google.com/jsapi" type="text/javascript" charset="utf-8"></script>
	<script type="text/javascript">
		google.load("swfobject", "2.2"); 
	</script>
	<script type="text/javascript">
	;(function(){
		var swfDirectory = "./";
		var swfFileName = "externalinterfaceSample.swf";
		var targetId = "flashcontent";
		var width = "400";
		var height = "50";
		var version = "9.0.45";
		var expressInstall = swfDirectory+"commons/scripts/swfobject/expressInstall.swf";
		var flashvars = {};
		flashvars.jsNamespace = "jp_utweb_ExternalInterface_sample";
		var params = {};
		params.menu = "false";
		params.quality = "best";
		params.scale = "noscale";//showAll
		params.salign = "tl";
		params.wmode = "transparent";//opaque wmode
		params.swliveconnect = "true";
		params.allowfullscreen = "true";
		params.allowscriptaccess = "always";
		params.allownetworking = "all";
		var attributes = {};
		attributes.id = "external_content";
		attributes.name = "external_content";
		attributes.align = "middle";
		swfobject.embedSWF(swfDirectory+swfFileName, targetId, width, height, version, expressInstall, flashvars, params, attributes);
	})();
	</script>
	<script>
	;var jp_utweb_ExternalInterface_sample;
	(function(){
		this.getElementFromName = function(name){
			if (navigator.appName.indexOf("Microsoft") != -1){
				return window[name];
			}else{
				return document[name];
			}
		};
		jp_utweb_ExternalInterface_sample = function(){
			return {
				ready:this.reary,
				clickHoge:this.clickHoge,
				clickFuga:this.clickFuga
			};
		};
		jp_utweb_ExternalInterface_sample.ready = function(){
		};
		jp_utweb_ExternalInterface_sample.clickHoge = function(){
			var swf = getElementFromName("external_content");
			if(swf){
				swf.jsHoge();
			}
		};
		jp_utweb_ExternalInterface_sample.clickFuga = function(){
			var swf = getElementFromName("external_content");
			if(swf){
				swf.jsFuga();
			}
		};
	})();
	</script>
</head>
<body>
<div id="flashcontent"></div>


<input type="button" value="ほげ" onClick="jp_utweb_ExternalInterface_sample.clickHoge();" />
	
<input type="button" value="ふが" onClick="jp_utweb_ExternalInterface_sample.clickFuga();" />
</body>
</html>
</pre>
<p>ちょっと実験用に名前のスコープをいじっております。<br />
特にjp_utweb_ExternalInterface_sampleを返す48行目は、明示的にpublicな関数を指定してやるとJavaScript側からも実行できるようになります。</p>
<h3>まとめ</h3>
<p>やっと最近コードスニペットというのを覚えたので、コードの再生産がだいぶマシになりました。<br />
毎回毎回こんだけ再発明するのしんどいですもんね。<br />
まだまだ未完成な部分も多いですが、もっと上手い方法を随時見つけていきたいと思います！</p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/1230/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/1230" />
	</item>
		<item>
		<title>FlashのひよこがPixel Benderではじめる並列処理入門 後編</title>
		<link>http://utweb.jp/blog/archives/1158</link>
		<comments>http://utweb.jp/blog/archives/1158#comments</comments>
		<pubDate>Mon, 05 Sep 2011 16:51:37 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=1158</guid>
		<description><![CDATA[前編の続きです。

ではFlashで呼び出してみよう！
ここまでの道のりが長かったですね。安心してください。それまでのほとんどが僕のゴタクです。
僕がはじめるにあたって先ず理解しておかないといけないことが多すぎただけで、 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://utweb.jp/blog/archives/1071">前編の続き</a>です。<br />
<span id="more-1158"></span></p>
<h3>ではFlashで呼び出してみよう！</h3>
<p>ここまでの道のりが長かったですね。安心してください。それまでのほとんどが僕のゴタクです。<br />
僕がはじめるにあたって先ず理解しておかないといけないことが多すぎただけで、ほとんどの人は実際にはここまですいすいと来られたはずです。</p>
<p>PixelBenderのpbjファイルをFlashのActionScriptで使うには二種類の方法があります。<br />
実行時に外部ファイルとして読み込むか、Embedであらかじめ埋め込んでおくかです。</p>
<p>前者はXMLや外部JPEGファイルと同じく、URLLoaderを使って読み込む方法です。<br />
Progressionだとこんな感じで</p>
<pre class="brush: as3">
addCommand(
	new LoadURL(new URLRequest(Directory.PBJ_DIR + "myPixelBender.pbj"), {dataFormat:URLLoaderDataFormat.BINARY}),
	function():void{
		var t:Command = this as Command;
		_shader = new Shader(t.latestData);
	}
);
</pre>
<p>Progressionを介さずに普通にAS3で書く場合も、URLLoaderのdataFormatをちゃんとURLLoaderDataFormat.BINARYにしておけばうまくいくと思います。<br />
こんな感じ。</p>
<pre class="brush: as3">
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, _onCompleteHandler);
loader.load(new URLRequest(Directory.PBJ_DIR + "myPixelBender.pbj"));
private function _onCompleteHandler(e:Event):void
{
	var shader:Shader = new Shader(loader.data);
}
</pre>
<p>実際にはエラーハンドリングなんかも行う必要ありますがそれはまた別の話なのでここではあえて触れないでおきます。</p>
<p>Embedであらかじめ埋め込んでおく方法は、こんな感じで</p>
<pre class="brush: as3">
[Embed(source="/../shaders/myPixelBender.pbj", mimeType="application/octet-stream")]
private var _myPixelBenderKernel : Class;
private var _myPixelBenderShader : Shader;
</pre>
<p>クラスのインスタンス変数として埋め込んでおいて、適切な場所で</p>
<pre class="brush: as3">
_myPixelBenderShader = new Shader(new _myPixelBenderKernel());
</pre>
<p>として呼び出してやるやり方です。</p>
<p>実行時に外部ファイルとして読み込むか、Embedであらかじめ埋め込んでおくか、どちらのやり方もメリットデメリットあるので自分で適切だと思う方法で呼び出せばいいのですが、もしその判断が出来ない・迷うようであれば後者のEmbedで埋め込む方法をおすすめしておきます。<br />
シェーダーを外部読み込みにするメリットが思いつかないのであればほとんどの場合外部読み込みのデメリットのほうがEmbedする方法のデメリットを上回るからです。</p>
<h3>呼び出したのでどうやって使おう？</h3>
<p>2種類の呼び出しの方法のどちらを使っても、ActionScriptではShaderクラスとして読み込まれることがわかりました。<br />
<a href="http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/display/Shader.html" target="_blank">ここでActionScriptリファレンスのShaderクラスとそれに付随するShader何々クラスを一読しておくとだいたい何すればいいかわかるかと思います。</a><br />
僕みたいにクラスの動作が全て頭に入っているわけではないひよここそ、リファレンスの存在は欠かせません（いまだにArrayにさえ、こんなメソッド無いかな〜とリファレンス引きながら作業してるくらいです）。</p>
<p>FlashがPixelBenderをShaderで読み込んだら、いろいろ出来ることがあるんですが、いまのところ僕はShaderJobを使うことをおすすめします。<br />
理由としてはShaderJobが圧倒的に速いからです。<br />
ブレンドモードとして使ったり、塗りに使ったり、フィルタとして使ったり、も確かに面白いのですがそれらがどうしても最終的にFlashの処理を挟む必要があるのにたいして、ShaderJobは同じ事が出来てしかも完全にFlashと処理が切り離せるので「<strong>Flashの処理速度という概念を無かったことに出来る</strong>」という冒頭の売り文句が発揮できるからです。<br />
しかもFlashとの同期処理・非同期処理のどちらで処理するかを実行時に選べるのです。<br />
これのおかげでShaderJobを使うことによってFlashの描画処理を徹底的にチューニングすることが出来るようになると思います。僕もまだそこまでには達していませんが、少なくともその入り口には立てた気がします。</p>
<p>ShaderJobを使うには、まず入力側のBitmapDataと出力先のBitmapDataが必要になります。<br />
入力の指定については、PixelBenderのKernelの書き方によって違うのですが、</p>
<pre class="brush: as3">
_shader.data.src.input = _inputBitmapData;
</pre>
<p>こんな感じで指定してやります。<br />
「src」っていう変数名が、ここがKernelで使ってる変数名によって違うので注意が必要です。<br />
PixelBenderで<br />
input image4 src;<br />
と書かれてあれば</p>
<pre class="brush: as3">
_shader.data.src.input = _inputBitmapData;
</pre>
<p>と書きますし、もし<br />
input image4 sauce;<br />
だと</p>
<pre class="brush: as3">
_shader.data.sauce.input = _inputBitmapData;
</pre>
<p>こういう感じでActionScriptを書くようになるかと思います。</p>
<p>あとはShaderJobの処理のさせ方ですが、<br />
<a href="http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/display/ShaderJob.html" target="_blank">ShaderJobのリファレンスを読むと</a>コンストラクタの第二引数に出力先のBitmapDataを指定しないといけないことになっているのがわかります。<br />
そこでこんなふうに</p>
<pre class="brush: as3">
var _shaderJob:ShaderJob = new ShaderJob(_shader, _outputBitmapData);
</pre>
<p>ShaderJobクラスのインスタンスを生成します。<br />
そのあとおもむろに</p>
<pre class="brush: as3">
_shaderJob.start();
</pre>
<p>してやってもいいんですが、面白いことにShaderJobはstartする際に処理を非同期で実行するか同期して実行するかを選べます。</p>
<pre class="brush: as3">
//_shaderJob.start();
_shaderJob.start(false);
</pre>
<p>このいずれの場合も非同期で実行します。<br />
なので</p>
<pre class="brush: as3">
_shaderJob.addEventListener(ShaderEvent.COMPLETE, _onShaderJobCompleteHandler);
//_shaderJob.start();
_shaderJob.start(false);
</pre>
<p>こんな感じでイベントリスナーを登録しておくとシェーダーの処理が完了したタイミングを捕捉できるようになります。<br />
画面の処理のために入力や画面の更新などFlashの他の処理を遅らせたくない場合に、完全に処理を分離できるので非常に効果を発揮します。</p>
<pre class="brush: as3">
_shaderJob.start(true);
</pre>
<p>こうした場合には同期して実行します。<br />
どのみち同期しててもPixelBenderのShaderJobの処理はほとんどの場合は一瞬で終わるので誤差は一瞬ですが、画面更新のタイミングと処理を完全に同期させておきたい場合に効果的です。</p>
<h3>さいごに</h3>
<p>書いててほんと自分でもびっくりするくらい長い記事になったのですがどうでしょうか。<br />
ほとんどがPixelBenderの技術の話しではなくてPixelBenderとはどういう動作をするものなのかの概念の話しばかりだったと思います。<br />
それだけ僕にとってPixelBenderは概念的な障壁が高く、でも一旦概念を理解してしまえば技術的にそんなにハードルの高いものではない、むしろとっつきやすく奥の深いとても楽しいものだと言うことが解りました。<br />
それに一旦こうして記事にして書いてしまえば、次からPixelBenderの技術的な記事書くときに「概念についてはこちらを参考にしてください」と言えるので、むしろ今後PixelBenderを研究していく布石になったと思います。</p>
<p>僕がPixelBenderを学びはじめるに当たって参考にしたAS3アニメーションのオライリー本にも書かれてあることですが、PixelBenderはOpenGLのシェーダー言語GLSLに非常によく似た言語で、そのノウハウがだいぶ参考になるかと思います。</p>
<p>僕個人の考えとしては、ブラウザ上での描画に限って言えば並列処理を実現するための方法はさまざまに企画が立ち上がっていますが、3年以上も前から提供されていてしかもFlashさえ走ればブラウザを問わず納品レベルできちんと動くPixelBenderには一日の長があるかと思います。<br />
PixelBenderそのものが意外にもとっつきやすくて奥が深く、それでいてFlashが何十倍も楽しくなる面白い技術なのも今回学ぶに当たって新鮮な驚きでした。</p>
<p>この技術がもっと普及して研究がされたら、もっと面白い使いどころが増えると思いますし今までFlashの処理速度が枷だったことがいろいろと解決する可能性が高いかもしれません。<br />
今回の記事ではあえて書かなかったのですが、僕はPixelBenderをByteArrayとかVectorで処理する方法にも非常に興味を持っています。<br />
この記事がきっかけになって、少しでもPixelBenderの使いどころの上手い人が増えて今まで処理速度がネックになっていた問題が解決できれば、WEBの表現はもう一段階自由になるのではないでしょうか。</p>
<p>そこまでは夢見すぎだとしても、少しでも処理速度による表現の限界を解決するヒントになれば幸いです。</p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/1158/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/1158" />
	</item>
		<item>
		<title>FlashのひよこがPixel Benderではじめる並列処理入門 前編</title>
		<link>http://utweb.jp/blog/archives/1071</link>
		<comments>http://utweb.jp/blog/archives/1071#comments</comments>
		<pubDate>Mon, 05 Sep 2011 16:45:28 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=1071</guid>
		<description><![CDATA[最初ぼくPixelBenderのこと「pixel bLender」と勘違いしていました。
 証拠 
 証拠その2
 僕、得意げになって何か言ってますね…。終始間違いの多い男です。
  僕たちの失敗。こんばんは。森田童子で [...]]]></description>
			<content:encoded><![CDATA[<p>最初ぼくPixelBenderのこと「pixel b<strong>L</strong>ender」と勘違いしていました。<br />
 <a href="https://twitter.com/#!/masamunet/status/101699832657358848" target="_blank">証拠 </a><br />
 <a href="https://twitter.com/#!/zendenmushi/status/102767979346927617" target="_blank">証拠その2</a><br />
 僕、得意げになって何か言ってますね…。終始間違いの多い男です。<br />
  僕たちの失敗。こんばんは。森田童子です。嘘です。正宗です。</p>
<p> さてさて、今さらながらPixelBenderについて勉強してみました。PixelBenderって登場したの確か3年以上も前ですよねえ。<br />
普段から情報共有が 盛んなFlashにおいて、僕が今まで3年もPixelBenderを使っていなかった理由はひとえに「PixelBenderが何をするものなのかわかりにくい！」からでした。<br />
 PixelBenderを使うとどうなるのか、Flashのどんな場面で使えるのか、どうやって使うのか、いやいやそれ以前の問題でただひたすら「PixelBenderが何をするものなのかわかりにくい！」のでした。<br />
もちろん、Adobeの告知不足とかそういった事が言いたいわけではなくて、僕のスペックではPixelBenderはわかりにくいからとっつきにくかった。というお話です。</p>
<p>で、勉強してみてわかった結果は、「PixelBender、かなり使える」ということです。<br />
簡単に言うとFlashの処理能力が<strong>別次元</strong>で向上します。<br />
おおげさですがおおげさでない表現として「<strong>Flashの処理速度という概念を無かったことに出来る</strong>」ほどのパフォーマンスです。<br />
「別次元」とか「処理速度という考え方を無かったことに」というのは、太字にしたのは煽りでもなんでもなく実際に本当に処理方法が違うからです。これに関しても出来るだけ簡単に説明します。<br />
いったんサンプルを見てください。</p>
<div style="width:300px;height:200px;">
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="300" height="200" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://utweb.jp/samples/pixelbender_practice/index.swf" /><param name="allowFullScreen" value="true" /><embed type="application/x-shockwave-flash" width="300" height="200" src="http://utweb.jp/samples/pixelbender_practice/index.swf" style="width:300px;height:200px;" allowFullScreen="true"></embed></object>
</div>
<p>ウエブカメラがあれば接続の許可を求められると思いますので許可してください。<br />
ウエブカメラがない、あっても許可しなかった場合は、僕が今年の夏にバラ園にいったときの思い出の写真がかわりに表示されることになると思うので、そういった悲しい事故がないよう、是非ともウエブカメラを使って遊んで頂くことを強くおすすめします。</p>
<p>マウスをうごかしてもらうとわかると思うんですが、昔からよくある、水面の波紋のような画像処理を効果に加えたサンプルです。<br />
DisplacementMapFilterとかで手垢がつきまくっているので、アンテナの高い人には今さらなサンプルです。<br />
ここで見て貰いたいのは、処理のほとんどをPixelBenderにまかせたことによる処理速度の安定です。</p>
<p>サンプルのソースコードはこちら。<br />
<a href="https://github.com/masamunet/blog_samples_pixelbender_practice" target="_blank">https://github.com/masamunet/blog_samples_pixelbender_practice</a></p>
<p>ソースコードをみてもらってもわかるように、基本的に僕はなにもしていません。処理のほとんどを外部のPixelBenderファイルに頼っています。<br />
具体的には<a href="http://www.derschmale.com/2009/04/23/return-of-the-ripples-shallow-water-simulation-with-pixel-bender/" target="_blank">こちら</a>のソースをほとんどの部分で使用しています。<br />
僕がやったことと言えば、もともとDisplacementMapFilterで処理していた部分もShaderJobを用いてPixelBenderで行うように変更したくらいですが、そのPixelBenderも<a href="http://www.boostworthy.com/blog/?p=245" target="_blank">こちら</a>の記事を参考にしてあります。<br />
このように、PixelBenderの概念を一旦理解したら、あとは自分でオリジナルなPixelBender処理を書くもよし、海外にあるいろいろなPixelBenderのファイルを（ライセンスに従って）使いこなすも良し、いずれにせよ処理速度という表現の枷からかなり自由に解き放たれるPixelBenderは是非是非習得すべき楽しい技術だと思います。</p>
<p>ちなみにPixelBenderの習得にあたって参考にした本はこちら。<br />
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&nou=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=yamayu-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4873114373" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe><br />
この本の第9章にPixelBenderについて書かれています。<br />
だからこの本以上のことはこのブログに書かれていないのでこの本を読んだ方はあんまり期待できる記事ではないと思いますが、PixelBenderについて僕なりに理解したことをまとめてみました。</p>
<p>PixelBenderはそんなに敷居の高い技術ではないです。<br />
実験レベルならすぐにはじめられて、効果は非常に高い（なにせ処理速度が別次元になるので）技術なので、ぜひともわかりやすく説明出来るようにまとめられたらと思います！<br />
<span id="more-1071"></span></p>
<p>とはいえさて何から書こう。<br />
やっぱり初心者にとってはそもそもまずPixelBenderが何かを知らないですよね。並列処理というちょっと特殊な処理の流れもあって、非常にとっつきにくい印象を受けるので、先ずはPixelBenderについて少し細かく説明してみたいと思います。<br />
なお、僕という初心者が理解した程度の説明を初心者を対象に説明するので情報の正確性については基本的に自信がないです。<br />
しかもピクセルシェーダーとかプログラマブルシェーダーと呼ばれる技術を意図的に全て「PixelBender」という名称を用いて説明しています。<br />
並列処理についても仮想化の話しとかまで説明し出すと僕が混乱するので、すべてハードウェアとして、つまり「並列処理を行う、そういう機械があるものとして」書いています。<br />
つまりここに書かれてあることをそのまま人に話すと笑われるかもしれないということです。</p>
<h3>はじめよう。先ず最初に、PixelBenderって何なん？</h3>
<p>PixelBenderとは、Adobeが開発したピクセルシェーダーを記述する言語のことです。その言語の記述やテスト、ビルドコンパイルするソフトのことをPixelBenderツールキットと呼びます。<br />
<div id="attachment_1099" class="wp-caption alignnone" style="width: 310px"><a href="http://utweb.jp/blog/wp-content/uploads/2011/08/db155b9b01b4fc02f1ceb4d7198a374c.png" title="PixelBenderツールキット2"><img src="http://utweb.jp/blog/wp-content/uploads/2011/08/db155b9b01b4fc02f1ceb4d7198a374c-300x203.png" alt="画像はCS5についてきてたPixelBenderツールキット2" title="PixelBenderツールキット2" width="300" height="203" class="size-medium wp-image-1099" /></a><p class="wp-caption-text">画像はCS5についてきてたPixelBenderツールキット2</p></div><br />
ピクセルシェーダーとはある一つのピクセルを計算して描画するプログラムの事です。<br />
このブログのこの記事ではピクセルシェーダーとPixelBenderを意図的に「PixelBender」と統一して説明しています。それは例えば「スクリプト言語全般に言えることだけれどActionScriptに於いても同様に」とか説明していくとかえって混乱する場合が多いのと同じ理由で、ピクセルシェーダー全般のことなのかPixelBenderに限った事なのか、PixelBenderを習い始めたい初心者にとっては行きすぎた情報の正確性はかえって混乱すると思ったからです（そしてどのみちこのブログ記事に情報の正確性を求めても無駄だと僕が知っているからです）。</p>
<h3>なるほど、わからん。もっと簡単に説明して？</h3>
<p>そのためにはまず最初に「パソコンはどうやって画面が表示されるのかな？」について考えないといけません。<br />
PixelBenderは凄く簡単に言うと「ピクセルを処理する言語」、もっと限定的に言うと「画像を処理するための言語」だからです。</p>
<h3>ではパソコンはどうやって画面が表示されるのかな？</h3>
<p>パソコンの画面の最小単位は1pxからできていることは説明の必要がないと思います。<br />
では仮に1pxだけ表示するディスプレイがあるとして、その1pxに赤を表示させてみましょう。<br />
<div id="attachment_1133" class="wp-caption alignnone" style="width: 245px"><a href="http://utweb.jp/blog/wp-content/uploads/2011/09/p1.png" title="p1"><img src="http://utweb.jp/blog/wp-content/uploads/2011/09/p1.png" alt="1ピクセルの画面に赤を描く" title="p1" width="235" height="231" class="size-full wp-image-1133" /></a><p class="wp-caption-text">1ピクセルの画面に赤を描く</p></div><br />
殴り書きの絵ですいません。<br />
こんな感じでCPUは赤を表示させています。<br />
ピクセルが増えて横に2ピクセルの画面ではどうでしょうか。<br />
<div id="attachment_1134" class="wp-caption alignnone" style="width: 292px"><a href="http://utweb.jp/blog/wp-content/uploads/2011/09/p2.png" title="p2"><img src="http://utweb.jp/blog/wp-content/uploads/2011/09/p2.png" alt="CPUは1ピクセルずつ処理している" title="p2" width="282" height="226" class="size-full wp-image-1134" /></a><p class="wp-caption-text">CPUは1ピクセルずつ処理している</p></div><br />
あたりまえですがCPUは1ピクセルずつ描画を処理していることになります。<br />
ところで最近のディスプレイはかなり高解像度ですが、仮に620ピクセル×480ピクセルの画面を表示させようとするとCPUはどのように動いているでしょうか。<br />
<div id="attachment_1136" class="wp-caption alignnone" style="width: 269px"><a href="http://utweb.jp/blog/wp-content/uploads/2011/09/p3.png" title="p3"><img src="http://utweb.jp/blog/wp-content/uploads/2011/09/p3.png" alt="620×480の画面に表示する" title="p3" width="259" height="248" class="size-full wp-image-1136" /></a><p class="wp-caption-text">620×480の画面に表示する</p></div><br />
一度に描画する処理の回数は解像度にそのまま匹敵するので620×480＝297600回の処理が必要になります。<br />
さらにこの画面を60フレームレートで動かそうと思うと297600×60＝17856000。一秒間に1千785万6千回ものCPUの処理が行われることになります。<br />
一個一個の処理は赤を出したり青を出したり程度なのでたいして重くない処理なのですが、コンピューターにとって画像の表示って意外と回数がかかる作業なのです。</p>
<p>こればっかりはCPUが進化して速くなっても、画面の表示処理だけはまともにやると解像度の処理回数がかかってしまうのはかつては避けられない問題でした。<br />
この問題を面白い方法で解決したのが次の考え方です。<br />
<div id="attachment_1137" class="wp-caption alignnone" style="width: 263px"><a href="http://utweb.jp/blog/wp-content/uploads/2011/09/p4.png" title="p4"><img src="http://utweb.jp/blog/wp-content/uploads/2011/09/p4-253x300.png" alt="1ピクセルずつに専用のCPUを割り当ててしまう" title="p4" width="253" height="300" class="size-medium wp-image-1137" /></a><p class="wp-caption-text">1ピクセルずつに専用のCPUを割り当ててしまう</p></div><br />
「画像を表示させるための機械」を作ってその中に、620×480の画面なら、620×480個。つまりCPUを297600個並べて、それぞれ1ピクセルを描画すればいい、と。<br />
ものすごいパワープレイすぎてそんな馬鹿なと思うかもしれません。だいたいパソコンのCPUなんて安くても一個1万円くらいするのにそんなのを297600個も並べてどうすんねんと。<br />
その気持ちはよくわかります。ただ、画面表示専用のこのCPUは、一個一個は赤か青かとかを表示するだけなのですごく簡単な仕事を任されているのみなんです。このくらいの仕事なら僕にも出来るかもしれません。<br />
さらに普通のパソコンのCPUと違うところは、パソコンのCPUはそれこそ一秒間に何兆回、いやもっと処理を行わないといけないのにたいして、この画面表示専用のCPUは極端に言えば一秒間に60回だけ処理できればいいのです。それも物凄く簡単な仕事だけを。</p>
<div id="attachment_1138" class="wp-caption alignnone" style="width: 246px"><a href="http://utweb.jp/blog/wp-content/uploads/2011/09/p5.png" title="p5"><img src="http://utweb.jp/blog/wp-content/uploads/2011/09/p5-236x300.png" alt="全ては同時に行われる" title="p5" width="236" height="300" class="size-medium wp-image-1138" /></a><p class="wp-caption-text">全ては同時に行われる</p></div><br />
色の出力しかできない簡単な処理を、しかも一秒間にたった60回しかできなくても、全ての処理は同時に行われるので一瞬で終わります。今までどんなに高性能なCPUでも処理回数がかかって仕方なかったところを、この画像処理の方法は一瞬で終わらせることができるのです。この「画像を表示させるための機械」はたいしたものです。</p>
<p>実際には本当に297600個も並べているのかというと半分本当で半分嘘になります。本当のところはもうちょっとソフトウェアやハードウェアレベルで仮想化なども行われているのですが、画像処理の並列処理についての考え方は基本的にこれまで説明したような処理で行われていることになります。<br />
しかもここまでの説明を「GPU」と説明すればわかるひとには一発でわかるものを、なぜ「仮想化とかそういう処理は置いておいて、「画像を表示させるための機械」というものがあることにしておく」などとまわりくどい説明を行ったかというと、PixelBenderはGPUが無くても動くからです。</p>
<h3>では改めて問う。PixelBenderとは何ぞや。</h3>
<p>PixelBenderとは、<br />
「つーかその1ピクセルごとに専用のCPUがあるならさ、そのCPUにプログラム走らせれば良いんじゃない？」という発想の元に生まれた、ピクセルを描画するためだけのプログラムです。</p>
<p>先ほど説明した「画像を表示させるための機械」が行っている1ピクセルの描画処理の流れはこんな感じです。<br />
<div id="attachment_1141" class="wp-caption alignnone" style="width: 260px"><a href="http://utweb.jp/blog/wp-content/uploads/2011/09/p6.png" title="p6"><img src="http://utweb.jp/blog/wp-content/uploads/2011/09/p6.png" alt="1ピクセルの描画処理の流れ" title="p6" width="250" height="300" class="size-full wp-image-1141" /></a><p class="wp-caption-text">1ピクセルの描画処理の流れ</p></div><br />
これが620×480個、とにかく沢山並んでいて、一斉に、同時に、処理するんでしたね。<br />
これにPixelBenderというプログラムを走らせるとこうなります。<br />
<div id="attachment_1142" class="wp-caption alignnone" style="width: 260px"><a href="http://utweb.jp/blog/wp-content/uploads/2011/09/p7.png" title="p7"><img src="http://utweb.jp/blog/wp-content/uploads/2011/09/p7.png" alt="PixelBenderの処理の流れ" title="p7" width="250" height="300" class="size-full wp-image-1142" /></a><p class="wp-caption-text">PixelBenderの処理の流れ</p></div>
<p>なんとなくPixelBenderというものがわかってきたでしょうか。<br />
冒頭（といっても記事の中盤）で説明した言葉をもう一回書いてみます。<br />
<strong>PixelBenderとはある一つのピクセルを計算して描画するプログラムの事です。</strong></p>
<h3>正体が分かればそんなに怖くない</h3>
<p>つまりPixelBenderが行う処理は、言ってしまえばRGBの値（正確にはあとアルファ値も）だけが入力されることと、出力もRGBの値（と正確にはあとアルファ値と）を出力するためだけのプログラムです。<br />
一個のプログラムは1ピクセルの色だけを出力するためのものです。<br />
そしてそれが何万個（場合によっては何千万個）も同時に実行されます。<br />
ActionScriptやJavaScriptなどのように、順番に実行される言語でプログラムしていると最初ちょっと戸惑いますが、PixelBenderは</p>
<ol>
<li>一個のピクセルを描画するためだけの言語
<ul>
<li>そしてそれだけしかできないのでたいして難しいわけではない</li>
<li>そもそも言語的にそれ以上の難しい事を出来るようにはなっていない</li>
</ul>
</li>
<li>全てが同時に実行される</li>
</ol>
<p>という二点のミソを理解すれば最初感じていた取っつきにくさは消え去りました。</p>
<h3>PixelBenderをFlashで使うことのメリット・デメリット</h3>
<p>そしてこのPixelBenderはFlashでもノーコストで使用できます。<br />
FlashのActionScriptにおいて、<br />
保守管理しやすい綺麗なコードを<strong>白魔法</strong><br />
高速化のために全てを犠牲にするような過激なチューニングが為されたコードが<strong>黒魔法</strong><br />
とするなら、PixelBenderはさしずめ<strong>召喚魔法</strong>です。<br />
全く異世界の力を借りることになり、威力は絶大。しかもノーコストです。</p>
<h4>メリット</h4>
<ul>
<li>同時に実行しなければならない処理がノーコストで一瞬にして終わる。</li>
<li>FlashのFPSを落とさない。</li>
</ul>
<p>実際にはFlashPlayerの実行環境の構成によりますが、理論上はFlashのFPSを落とすことはありません。</p>
<h4>デメリット</h4>
<li>PixelBenderの言語について多少なりとも習得が必要</li>
<li>処理できる型がBitmapDataかByteArrayに限られている</li>
<p>ByteArrayについてはまた別途書きます。</p>
<blockquote><p>2011/09/08追記<br />
<a href="https://twitter.com/#!/zahir1929/status/111511440271212544">ByteArrayと同じくVector.<Number>型も使えると教えて頂きました。</a></p></blockquote>
<p>ピクセルを描画するというPixelBenderの仕組み上、扱える描画オブジェクトがBitmapDataに限られます。<br />
BitmapData型を保持していない描画オブジェクトの場合、処理の前に常にbitmapData.draw()を発生させなければいけないので、このコストがいちばんの悩みどころになります。<br />
逆に言えば、BitmapData型を保持していればどんどん積極的にPixelBenderを使っていきたいところです。</p>
<h3>さっそく使ってみよう！PixelBender！</h3>
<p>とここまで書いておいてなんですが、悩んだんですがこの記事ではPixelBenderの言語については解説は書かないことにしました。<br />
理由は僕もまだはじめたばかりなので説明出来るほど言語にたいして理解が深くないためです。<br />
みなさんと同じく僕も目下勉強中なので、いずれ記事に出来るくらいには理解を深められたらと思います。</p>
<p>ただし、PixelBenderについては「PixelBender お目当ての処理」で検索するとけっこうな数で海外のPixelBenderのソースがヒットします。<br />
それらを参考にするも良し、ライセンス的に問題がないのであればそのままFlashに使用するもよしなので、およそ汎用的な処理であればPixelBender初心者でもかなりなことができてこの技術を手っ取り早く楽しむことは出来ます。</p>
<p>PixelBenderというプログラム言語についての解説は今回は省きますが、PixelBenderツールキットの使い方について、おおまかに説明してみたいと思います。<br />
ちなみに冒頭（といってもこの記事の中盤頃）でも書きましたがPixelBenderツールキットとはPixelBenderというプログラムを書いたり実行したりテストしたりコンパイルしたりするアプリツールのことです。Flashを作るあのソフトのことをFlashIDEと呼んだりするのと同じです。</p>
<p>PixelBenderツールキットは、AdobeCS4かAdobeCS5を買ってインストールしていれば標準で入っていると思います。CS5.5ではどうかわかりませんし、CS以外の他の方法で手に入れるやり方はわかりませんが、とにかくCSでインストールされているものとして話しをすすめてみます。<br />
ちなみにCS5ではPixelBenderツールキット2が入っていました。1と比べてどこか新しくなったんですかね？<br />
Macだと<br />
/アプリケーション/ユーティリティ/Adobe ユーティリティ<br />
/アプリケーション/ユーティリティ/Adobe ユーティリティCS5<br />
あたりに入ってると思います。</p>
<p><div id="attachment_1147" class="wp-caption alignnone" style="width: 310px"><a href="http://utweb.jp/blog/wp-content/uploads/2011/09/p8.png" title="p8"><img src="http://utweb.jp/blog/wp-content/uploads/2011/09/p8-300x159.png" alt="New Kernelで新規作成" title="p8" width="300" height="159" class="size-medium wp-image-1147" /></a><p class="wp-caption-text">New Kernelで新規作成</p></div><br />
立ち上げるとメニューから「File」→「New Kernel」で新規作成です。<br />
PixelBenderのプログラムはこのKernelという単位で動きます。<br />
今までくどくど説明してきたように、このKernelという小さなプログラムが1ピクセルを描画するためのプログラムとなります。<br />
<div id="attachment_1099" class="wp-caption alignnone" style="width: 310px"><a href="http://utweb.jp/blog/wp-content/uploads/2011/08/db155b9b01b4fc02f1ceb4d7198a374c.png" title="PixelBenderツールキット2"><img src="http://utweb.jp/blog/wp-content/uploads/2011/08/db155b9b01b4fc02f1ceb4d7198a374c-300x203.png" alt="画面は大きく3つにわかれています。" title="PixelBenderツールキット2" width="300" height="203" class="size-medium wp-image-1099" /></a><p class="wp-caption-text">画面は大きく3つにわかれています。</p></div><br />
画面は大きく3つに別れていて、上が画像の表示領域。<br />
下がプログラムのソースコードを書く場所、右側にいろいろな情報やパネルが並ぶようになっていると思います。<br />
このツールでPixelBenderの処理を書いたりテストしたりすることになります。<br />
プログラムはpbk（PixelBenderKernelFile）として保存されます。<br />
ひととおりプログラムを書いて満足できる結果が得られれば、さっそくFlashで使いたいと思います。その際はPixelBenderをFlashで使えるようにコンパイルしてやる必要があります。<br />
メニューの「File」→「Export Filter For Flash Player...」を選んでください。<br />
<div id="attachment_1148" class="wp-caption alignnone" style="width: 310px"><a href="http://utweb.jp/blog/wp-content/uploads/2011/09/p9.png" title="p9"><img src="http://utweb.jp/blog/wp-content/uploads/2011/09/p9-300x168.png" alt="Export For Flash Player..." title="p9" width="300" height="168" class="size-medium wp-image-1148" /></a><p class="wp-caption-text">Export For Flash Player...</p></div><br />
Flashでいうflaファイルがpbk。swfファイルがpbjファイルということになります。</p>
<p><a href="http://utweb.jp/blog/archives/1158">後半へ続きます。</a></p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/1071/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/1071" />
	</item>
		<item>
		<title>SWC+Progressionで快適コーディング生活はじまる！</title>
		<link>http://utweb.jp/blog/archives/910</link>
		<comments>http://utweb.jp/blog/archives/910#comments</comments>
		<pubDate>Thu, 21 Oct 2010 05:52:53 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[FlashBuilder]]></category>
		<category><![CDATA[Progression]]></category>
		<category><![CDATA[swf]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=910</guid>
		<description><![CDATA[いきなりですがswcファイルって「スウィック」って読むらしいですね。アドビの中の人もそう読んでたんで確かな情報です。
しかしながら僕は慣れなくていつも「エスダブルシー」って読んでしまうんですね。そこらへんのモサさが自分流 [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_911" class="wp-caption alignnone" style="width: 276px"><a title="SWC書き出し" href="http://utweb.jp/blog/wp-content/uploads/2010/10/51700dd1ba12bada0e02bb945011cba5.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/10/51700dd1ba12bada0e02bb945011cba5-266x300.png" alt="中段あたりにチェックボックスがあるよ" title="SWC書き出し" width="266" height="300" class="size-medium wp-image-911" /></a><p class="wp-caption-text">中段あたりにチェックボックスがあるよ</p></div>
<p>いきなりですがswcファイルって「スウィック」って読むらしいですね。アドビの中の人もそう読んでたんで確かな情報です。<br />
しかしながら僕は慣れなくていつも「エスダブルシー」って読んでしまうんですね。そこらへんのモサさが自分流さ、なんて無頼を決め込んで今日も「エスダブルシーエスダブルシー」と 読んでいます。<br />
僕が「エスダブルシー」って言う度に周りが若干イラっとした顔されるんですが、それでもかわまず「エスダブ…エスダボースィー」とか呼び続けてるのに未だ怒られた事がないのは 、ひとえに僕の人徳だと思います。</p>
<p>無駄な軽口はこのくらいにして、先日行われたひよこの会で少しだけ要望があったのでSWCと連携してProgressionでのFlashサイト開発環境を超快適にする方法をご紹介したいと思います。<br />
今までのやり方にもよりますが、体感100倍速いと言っても全くおおげさでないくらい、爆速開発が可能になりますよ！<br />
<span id="more-910"></span></p>
<h3> そもそもパブリッシュが遅い…</h3>
<p>Progressionに限らずですが、Flashサイトを作っていて一番のネックになるのが「パブリッシュに時間がかかる」事なんですよね。<br />
それもflaファイルが肥大すればする程パブリッシュに時間がかかるようになり、納品間近の追い込みの時期になるにつれてパブリッシュだけで1分以上かかるようになるし…（ヒーッ）。</p>
<p>デバッグなんかもそうですが、「よりわかりやすく、より気持ちよく」動くことを心がけているFlashサイトにとって、1pxの位置や0.1秒の速度までこだわってなんべんも動かしてみて作り込むことはよくあることなのに、パブリッシュに時間がかかるようになるとそれもままなりません。</p>
<h3>書き出せるものは先に書き出しておけば…</h3>
<p>そこで今回ご紹介するswcなんですが、これは言ってしまえば頻繁に変更しない素材はあらかじめswc形式で書き出しておいて 、それを使うことによって開発を進めていこう、という方法なんですね。<br />
この方法自体は、僕もkatapadさんから教えて頂きました。<br />
ちなみに僕というひよこ向けの備忘録なので、最初はswcとは何か、どうやってswcを書き出すのかなどの事が書かれてありますが、Progression連携のミソは一番最後なので、swc書き出しに精通されてる方はこのまま最後まですっ飛ばして読まれてもいいかもしれません。</p>
<h3>ものには順序がある。まずはFlashBuilderとProgressionを連携させるようにしておく</h3>
<p>僕の現在のFlash開発環境は100％FlashBuilder+Progressionなので、その方法でご説明します。<br />
基本的なところは同じなので他の開発環境 でも工夫してswc連携スタイルが作れることと思います。</p>
<p>まずは僕の以前の記事<br />
<a href="/blog/archives/815" target="_self">Progression4をいい感じにFlashBuilderで作業できるようにする </a><br />
を参考にしてください。<br />
これはFlashBuilderがsrcにあるflaファイルを勝手にbin-debugフォルダにコピーしてしまう現象を回避できなかったので、思い切ってflaファイルを削除してそれでもちゃんとswfがパブリッシュできるように設定し直した方法ですが、基本的にこのスタイルで開発を進めていくことになります。</p>
<p>記事に沿って、index.flaとかpreloader.flaを思い切って捨てちゃって下さい。次に進みます。</p>
<h3>新規flaファイルを作る</h3>
<p>FlashCS5の「ファイル」→「新規」から新規flaファイルを作ります。Progressionと連携させるのでASのバージョンはもちろんAS3です。<br />
僕はFlashBuilder連携を前提にこの記事を書いていますんで、今回FlashCS5指定ですがFlashDevelopとかFDT、FlexBuilderなどお使いの環境に合わせて読まれてる方にとっては、特にFlashCSのバージョンは関係はありません。</p>
<p>新規flaファイルの保存場所はどこでもかまいません。どこでもかまいませんがFlashBuilderのワークスペース以外のところに作るのがおすすめです。flaファイルのファイル名も何でもいいですが、ここでは<strong>material.fla</strong>と名付けました。</p>
<h3>SWCファイルを書き出す</h3>
<div id="attachment_912" class="wp-caption alignnone" style="width: 160px"><a title="おやこんなところにSWC書き出しのチェックが！" href="http://utweb.jp/blog/wp-content/uploads/2010/10/bad291777fba55d2fb440901354724a7.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/10/bad291777fba55d2fb440901354724a7-150x150.png" alt="おやこんなところにSWC書き出しのチェックが！" width="150" height="150" class="size-thumbnail wp-image-912 " /></a><p class="wp-caption-text">おやこんなところにSWC書き出しのチェックが！</p></div>
<p>そのままFlashの「ファイル」→「パブリッシュ設定」で真ん中らへんに「SWC書き出し」というチェックボックスがあるので、ここにチェックを入れます。<br />
そのままパブリッシュしたらflaファイルと同じフォルダに「material.swf」が出来たと思います。</p>
<div id="attachment_913" class="wp-caption alignnone" style="width: 160px"><a title="swcファイル書き出し" href="http://utweb.jp/blog/wp-content/uploads/2010/10/61f5826cf97f3819d29b2e1895fddeb9.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/10/61f5826cf97f3819d29b2e1895fddeb9-150x150.png" alt="おやこんなところにSWCファイルが出来ちゃった！" title="swcファイル書き出し" width="150" height="150" class="size-thumbnail wp-image-913 " /></a><p class="wp-caption-text">おやこんなところにSWCファイルが出来ちゃった！</p></div>
<h3>material.flaのライブラリの中はリンケージ書き出しのシンボルでいっぱい！</h3>
<p>さてさて、これでswc書き出し用のflaファイルが新規作成できましたので、早速作業に入っていきましょう。<br />
基本的にはmaterial[素材]というファイル名からも想像がつくように、このflaファイルの役割は「<strong>素材倉庫</strong>」です。長年慣れ親しんできたflaファイルをただの素材倉庫にするのは僕もしのびないですが快適環境作りのため。最終的にはFlash全体の開発環境が快適になることによって自然とこのflaファイルの活躍の場も以前より増してきますのでご心配なく！</p>
<p>最終的にライブラリの中にたくさんリンケージ書き出しのシンボルが作れました。</p>
<div id="attachment_915" class="wp-caption alignnone" style="width: 160px"><a title="ライブラリの様子" href="http://utweb.jp/blog/wp-content/uploads/2010/10/d9ec38aebee13f49f0a6f2382e344fc1.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/10/d9ec38aebee13f49f0a6f2382e344fc1-150x150.png" alt="ライブラリの中は血と汗と夢で一杯" title="ライブラリの様子" width="150" height="150" class="size-thumbnail wp-image-915  " /></a><p class="wp-caption-text">ライブラリの中は汗と涙と夢でいっぱい！</p></div>
<h3>書き出したSWCファイルをProgression開発環境にコピーする</h3>
<p>この記事ではProgression開発環境イコールFlashBuilderのワークスペースな意味合いで使っています。<br />
先ほど書き出したswcファイルを早速Progressionの開発環境で使ってみましょう。</p>
<p>具体的にはProgression開発環境のlibというフォルダに先ほどのswcファイルをコピーするだけで良いです。</p>
<div id="attachment_916" class="wp-caption alignnone" style="width: 310px"><a title="swcをlibフォルダに持ってきた" href="http://utweb.jp/blog/wp-content/uploads/2010/10/727373cc45b1639f577f17f80ce4d8c7.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/10/727373cc45b1639f577f17f80ce4d8c7-300x181.png" alt="わかりにくくてすみません。スクリーンショットでは800_material.swcとリネームされていますが特に意味はないです。" title="swcをlibフォルダに持ってきた" width="300" height="181" class="size-medium wp-image-916" /></a><p class="wp-caption-text">わかりにくくてすみません。スクリーンショットでは800_material.swcとリネームされていますが特に意味はないです。 </p></div>
<h3>たったこれだけ！</h3>
<p>FlashBuilder+Progression環境だと、この「swcをlibフォルダに入れる」だけであとは何もせずにswcの中にあるリンケージをそのままクラスとして読み込めるようになります！</p>
<div id="attachment_917" class="wp-caption alignnone" style="width: 310px"><a title="自動的に使える！" href="http://utweb.jp/blog/wp-content/uploads/2010/10/63251d6e1ca21681db35b6288b5ca9f3.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/10/63251d6e1ca21681db35b6288b5ca9f3-300x178.png" alt="快適すぎて死ぬｗｗｗ！" title="自動的に使える！" width="300" height="178" class="size-medium wp-image-917" /></a><p class="wp-caption-text">快適すぎて死ぬｗｗｗ！</p></div>
<p>他の環境だとクラスパスの設定とかしないといけないかもしれないですが、本来はひよこ的には「クラスパスって何？」ってところから記事を書きたいところなのですが今回の記事ではそれは割愛して、まあ他の環境でよくわからない場合は本番開発用flaと同じフォルダにswcファイルも入れておけば同じような感じにはなるかと思います。</p>
<h3>まじで便利なコンポーネント連携！</h3>
<p>さてさて、ここまでは普通にswc書き出しとの連携なんですが、Progressionが凄いのはここからなんです。</p>
<p>とちょっとそのまえにProgressionのAddChildコマンドについて少しお話を…。</p>
<p>FlashのActionScript3では、表示オブジェクトを画面上に入場/退場させる命令としてaddChildとremoveChildがあります。<br />
Progressionではそれをさらに便利にしたjp.progression.commands.displayパッケージがあって、ようはわかりやすく言うとAddChildコマンドやRemoveChildコマンドっちゅうのがあります。<br />
（他にもAddChildAtコマンドやRemoveAllChildrenなどなどいろいろ便利なコマンドもありますが、ややこしくなるのでこの記事では一律AddChildコマンド、RemoveChildコマンドと呼ぶことにします）<br />
ただ便利なだけでなく、Progression側で何が表示されてて何が退場していったのかの管理とか、それこそ重なり順とか、表示されたときに実行される処理とか、かなりProgressionの根幹に関わる処理が、このAddChild系コマンドの実行されたタイミングで行われています（いるような気がします）。<br />
なのでAddChildコマンドを使わずにaddChildだけで表示した場合、これがProgressionが管理しきれない表示オブジェクトとなってしまうので、使ってる経験上こういうのが思いがけずちょっとしたトラブルを招くことが多いです。</p>
<p>Progression始めた人で、僕が個人的にはまりやすいなと思うのが、この部分なので、例えばCastSpriteやCastMovieClip系の表示オブジェクトをAddChildコマンド経由せずにふつうにflashの addChildで表示させてしまってatCastAddedが正しく実行されないなどのミスで戸惑っている人がいるんじゃないかなと思っています。</p>
<p>swc連携に限ったことではないですが、Progressionでは特に初心者の場合でAddChildコマンドが何しちょるのかようわからん、といった場合はパフォーマンスを稼ぐなどの特別な理由がない限りはaddChildは使わずほぼ全てAddChildコマンドを使うようにしよう！と決めておくとそこらへんのミスが減るんじゃないかと僕は思います。</p>
<p>で、少し脱線したんで本題に戻りますが、とにかく<strong>ProgresisonのAddChild系コマンド、RemoveChild系コマンドはコンポーネントとも連携が利く</strong>ので、ここからが本領発揮です。</p>
<p>Flashの強力なタイムライン機能を活かしてInOutMovieコンポーネントでわしわしアニメーション描くもよし！</p>
<div id="attachment_919" class="wp-caption alignnone" style="width: 310px"><a title="InOutMovieコンポーネント" href="http://utweb.jp/blog/wp-content/uploads/2010/10/4b6b4a199c7c595116aa3c4e9c835218.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/10/4b6b4a199c7c595116aa3c4e9c835218-300x191.png" alt="複雑なアニメーションもInOutMovieコンポーネントで思いのまま！" title="InOutMovieコンポーネント" width="300" height="191" class="size-medium wp-image-919" /></a><p class="wp-caption-text">複雑なアニメーションもInOutMovieコンポーネントで思いのまま！</p></div>
<p>ボタンなんかもRollOverButtonコンポーネントでさくさく！</p>
<div id="attachment_920" class="wp-caption alignnone" style="width: 310px"><a title="RollOverButtonコンポーネント" href="http://utweb.jp/blog/wp-content/uploads/2010/10/40bde7fe2c065055784fb82c79febede.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/10/40bde7fe2c065055784fb82c79febede-300x196.png" alt="どうせswcの中に素材としてボタン置いてるんだからついでにコンポーネントでボタン化までしておいてしまえ！" title="RollOverButtonコンポーネント" width="300" height="196" class="size-medium wp-image-920" /></a><p class="wp-caption-text">どうせswcの中に素材としてボタン置いてるんだからついでにコンポーネントでボタン化までしておいてしまえ！</p></div>
<h3>new AddChildするだけの簡単なお仕事</h3>
<p>あとはリンケージさえ設定してもらえれば、あとはプログラム側ではnew AddChildするだけの簡単なお仕事です。本当に。<br />
ビジュアルとロジックの分離は当制作所でも必須課題なのですが、Progression導入でそこらへんも本当にやりやすくなりました。タイムラインでしっかり作り込みたいところはタイムラインで作って、Tweenerなどでぴっちり制御したいところはロジックを作って、それらの違いを意識せずに最終的に扱えるようになるのは、本当にパワフルな開発環境を整えることが出来ます。</p>
<p>この記事中、ほとんどが僕の無駄口で長くなってしまいましたが、実際はやってみると本当に簡単なので是非試してみて下さいね！<br />
デメリットとしては先ほど書いたように今まで慣れ親しんだflaファイルをただの素材置き場としてしか使わなくなる事への心の抵抗くらいですが、最終的にはFlashのタイムラインというパワフルな環境を十二分に発揮できるスタイルに移行するわけなので、かえって以前よりFlashCS5の出番が増えるようになります。<br />
「もっとこうしたほうがいいよ」とか「うちではこうしてるよ」ですとか、「うそばっかりやんけ！」などのご意見ありましたらコメント下さいね。<br />
最近「ブログ読んでます」という反応が少しだけ得られるようになって、本当嬉しいです。</p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/910/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/910" />
	</item>
		<item>
		<title>Progression4をいい感じにFlashBuilderで作業できるようにする</title>
		<link>http://utweb.jp/blog/archives/815</link>
		<comments>http://utweb.jp/blog/archives/815#comments</comments>
		<pubDate>Wed, 07 Jul 2010 15:01:29 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[FlashBuilder]]></category>
		<category><![CDATA[Progression]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=815</guid>
		<description><![CDATA[FlashBuilderはじめてみました。正宗です。
Progression4がFlashBuilderとの連携ができるようになっていたのがきっかけだったのと、あとFlashのコンパイル（パブリッシュ）がその都度グラフィ [...]]]></description>
			<content:encoded><![CDATA[<p>FlashBuilderはじめてみました。正宗です。</p>
<p>Progression4がFlashBuilderとの連携ができるようになっていたのがきっかけだったのと、あとFlashのコンパイル（パブリッシュ）がその都度グラフィックを書き出し直すので時間がかかるようになったのが嫌でグラフィックはあらかじめswc書き出ししておいてFlashBuilderからasだけをコンパイルできるようになったらいいなと思ったので、FlashBuilderを使いこなせるように勉強してみることにしました。</p>
<p>常々お伝えしているように、うちのFlash請負制作業務のほぼ100%をProgressionフレームワークを使用していますので、ProgressionとFlashBuilderがうまいこと連携できていないと困ります。いろいろ試してみてうまい感じに連携できるようになったので書いておきたいと思います。</p>
<p>あとFlashBuilderについての本や情報が多いですがだいたいがFlex技術者向けになっていて、MXMLとか僕もよくわからないのですが僕のやりたいFlash開発とは微妙に違う気がするので、Flash向けにFlashBuilderの設定方法なんかの情報があっても良いなーと思っていたので、今回の記事はProgressionとあわせて是非ともマスターしたい技術だと思います。</p>
<h3><span id="more-815"></span>先ずはFlashを立ち上げて</h3>
<p>最初はFlashを立ち上げてProgressionプロジェクトを作成するところからはじめます。</p>
<div id="attachment_816" class="wp-caption alignnone" style="width: 310px"><a title="新規プロジェクトを作成" href="http://utweb.jp/blog/wp-content/uploads/2010/07/d12d66eea7bc86d8b40dee99ab888a4a.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/d12d66eea7bc86d8b40dee99ab888a4a-300x76.png" alt="はじまりはいつもFlash" title="新規プロジェクトを作成" width="300" height="76" class="size-medium wp-image-816" /></a><p class="wp-caption-text">はじまりはいつもFlash</p></div>
<div id="attachment_817" class="wp-caption alignnone" style="width: 310px"><a title="クラススタイル" href="http://utweb.jp/blog/wp-content/uploads/2010/07/d2db931f0a9236b9238e0374210ea9e0.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/d2db931f0a9236b9238e0374210ea9e0-300x233.png" alt="種類：「クラス」にするのを忘れないで！" title="クラススタイル" width="300" height="233" class="size-medium wp-image-817" /></a><p class="wp-caption-text">種類：「クラス」にするのを忘れないで！</p></div>
<div id="attachment_818" class="wp-caption alignnone" style="width: 310px"><a title="FlashBuilderに対応させる" href="http://utweb.jp/blog/wp-content/uploads/2010/07/a0ad78e2cd8f01a66b01028beb29134d.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/a0ad78e2cd8f01a66b01028beb29134d-300x233.png" alt="「FlashBuilderに対応させる」のチェックも忘れるな！" title="FlashBuilderに対応させる" width="300" height="233" class="size-medium wp-image-818" /></a><p class="wp-caption-text">「FlashBuilderに対応させる」のチェックも忘れるな！</p></div>
<p>プロジェクトの設定で気をつけるところはここまでです。<br />
おもむろに「作成」ボタンを押すとしばらくしてProgressionプロジェクトが作成されるはずです。</p>
<div id="attachment_821" class="wp-caption alignnone" style="width: 310px"><a title="プロジェクトが作成された" href="http://utweb.jp/blog/wp-content/uploads/2010/07/82c4df06b28409daa3f1e12876f4d600.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/82c4df06b28409daa3f1e12876f4d600-300x184.png" alt="できたできたー！" title="プロジェクトが作成された" width="300" height="184" class="size-medium wp-image-821" /></a><p class="wp-caption-text">できたできたー！</p></div>
<p>プロジェクトが出来てしまえばもうFlashには用がありません（ひどい）。<br />
Flashはそのまま終了しましょう。</p>
<h3>ここからFlashBuilderで作業する</h3>
<p>ここから先はFlashBuilderで作業します。長年使い慣れたFlashを捨てて慣れないFlashBuilderを使っての作業になりますのでかなりドキドキします。</p>
<p>FlashBuilderのワークスペースの概念はおわかりでしょうか？<br />
もしまだでしたら今後FlashBuilderを使っていくにあたってワークスペースはよく切り替えることになるのでこの記事を読む前に「Eclipse ワークスペース」などで調べておく事をお勧めします。それ以前にFlashBuilderとEclipse との関係についても調べておいて損はありません。<br />
ワークスペースやEclipseについてよくはわかってないけど、手っ取り早くこの記事を読む場合、「<strong>とりあえずワークスペースとは作業フォルダを決める事なので、先ほどProgressionプロジェクトを作成したフォルダーの一階層上を選択しておけば良い</strong>」とだけ覚えておいてください。<br />
（僕の理解度もだいたいそのへんです）</p>
<blockquote><p><span style="color: #ff0000;"><strong> ※</strong>2010/11/10追記</span><br />
最近Dropboxで作業スペースを同期とってるんですが、ワークスペースをDropbox内に設定すると他のPCと同期をとったときにFlashBuilderのライセンス違反が起こるらしく、えらい大変なことになります。<br />
Dropboxなどで共有してる人は、プロジェクトファイルはDropbox上で、FlashBuilderのワークスペースは各PC固有のディレクトリで設定するのがお勧めです。</p></blockquote>
<p>ワークスペースを決めたら、先ほど作ったProgressionプロジェクトフォルダをFlashBuilderに登録します。</p>
<div id="attachment_823" class="wp-caption alignnone" style="width: 310px"><a title="Flexプロジェクトを開く" href="http://utweb.jp/blog/wp-content/uploads/2010/07/d871abcb461ba7b134548c47a5272bbc.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/d871abcb461ba7b134548c47a5272bbc-300x52.png" alt="ファイルメニューから開く" title="Flexプロジェクトを開く" width="300" height="52" class="size-medium wp-image-823" /></a><p class="wp-caption-text">ファイルメニューから開く</p></div>
<p>FlashBuilderのメニュー「ファイル」→「Flexプロジェクトを読み込み」を選びます。</p>
<div id="attachment_824" class="wp-caption alignnone" style="width: 310px"><a title="プロジェクトフォルダーを選ぶ" href="http://utweb.jp/blog/wp-content/uploads/2010/07/23a902f8711d84ba6da65c57dc94d6d5.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/23a902f8711d84ba6da65c57dc94d6d5-300x140.png" alt="プロジェクトフォルダーからさっき作ったフォルダを選ぶ" title="プロジェクトフォルダーを選ぶ" width="300" height="140" class="size-medium wp-image-824" /></a><p class="wp-caption-text">プロジェクトフォルダーからさっき作ったフォルダを選ぶ</p></div>
<div id="attachment_825" class="wp-caption alignnone" style="width: 148px"><a title="読み込み" href="http://utweb.jp/blog/wp-content/uploads/2010/07/bb82949cf87d656aef993ac263abbeb0.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/bb82949cf87d656aef993ac263abbeb0-138x300.png" alt="うまく読み込めた！" title="読み込み" width="138" height="300" class="size-medium wp-image-825" /></a><p class="wp-caption-text">うまく読み込めた！</p></div>
<p>上手く読み込めました！</p>
<p>ただ、ファイル構成をよくよくみてみると、srcフォルダにあるはずのflaファイルがbin-debugフォルダにもコピーされるんですね。このままではまずいですよね。</p>
<p>どうしたらいいかというと解決方法は簡単で、srcフォルダにあるflaファイルを削除すればいいんです。<br />
index.fla と preloader.fla の二つを削除します。</p>
<p>で、Progressionプロジェクトを作った時に自動的に「Index.as」が「bin-debug/index.swf」にパブリッシュされるようにFlashBuilderプロジェクトを設定してくれているんですが、同じように「Preloader.as」ファイルを「bin-debug/preloader.swf」として書き出すようにFlashBuilderプロジェクトを設定し直す必要があります。</p>
<p>他にもFlashBuilderのみでパブリッシュできるようにFlashBuilderプロジェクトの設定をいろいろ変更しておきましょう。</p>
<h3>FlashBuilderプロジェクトの設定をいい感じに設定し直す</h3>
<p>FlashBuilderプロジェクトの設定を変更するには、プロジェクトそのものを右クリックして「プロパティ」を選びます。</p>
<div id="attachment_826" class="wp-caption alignnone" style="width: 269px"><a title="プロジェクトを右クリックで「プロパティ」" href="http://utweb.jp/blog/wp-content/uploads/2010/07/e614e993033d708aa8a01225093edcad.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/e614e993033d708aa8a01225093edcad-259x300.png" alt="プロジェクトを右クリックで「プロパティ」" title="プロジェクトを右クリックで「プロパティ」" width="259" height="300" class="size-medium wp-image-826" /></a><p class="wp-caption-text">プロジェクトを右クリックで「プロパティ」</p></div>
<div id="attachment_827" class="wp-caption alignnone" style="width: 310px"><a title="Flexコンパイラ" href="http://utweb.jp/blog/wp-content/uploads/2010/07/bdff880318ca258df7f18234c4aace5c.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/bdff880318ca258df7f18234c4aace5c-300x227.png" alt="Flexコンパイラでは「HTMLラッパーファイルの生成」のチェックを消す。Hey YO!" title="Flexコンパイラ" width="300" height="227" class="size-medium wp-image-827" /></a><p class="wp-caption-text">Flexコンパイラでは「HTMLラッパーファイルの生成」のチェックを消す。Hey YO!</p></div>
<p>「HTMLラッパーファイルの生成」の<strong>チェックを外す</strong>んですよ。つけるんじゃないですよ。</p>
<div id="attachment_828" class="wp-caption alignnone" style="width: 310px"><a title="Flexモジュールの追加" href="http://utweb.jp/blog/wp-content/uploads/2010/07/3e78bccb1e0b72508a3c4775c2480e21.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/3e78bccb1e0b72508a3c4775c2480e21-300x227.png" alt="Flexモジュールでは追加ボタンを押す" title="Flexモジュールの追加" width="300" height="227" class="size-medium wp-image-828" /></a><p class="wp-caption-text">Flexモジュールでは追加ボタンを押す</p></div>
<div id="attachment_829" class="wp-caption alignnone" style="width: 310px"><a title="モジュールの追加" href="http://utweb.jp/blog/wp-content/uploads/2010/07/3a0b69052ed28d1652683bfd9298cf46.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/3a0b69052ed28d1652683bfd9298cf46-300x169.png" alt="書き出されるswfファイル名の大文字小文字に気をつけて" title="モジュールの追加" width="300" height="169" class="size-medium wp-image-829" /></a><p class="wp-caption-text">書き出されるswfファイル名の大文字小文字に気をつけて</p></div>
<p>「モジュールの追加」画面で気をつける事と言ったら、通常「<strong>P</strong>reloader.as」からは「<strong>P</strong>reloader.swf」が書き出されようとするので、大文字小文字に気をつけることですね。index.htmlを書き換えたくないのであれば、ここで出力SWFのファイル名を「<strong>p</strong>reloader.swf」と小文字に直しておきましょう。<br />
モジュールSWFのサイズは「最適化しない」にしておきましょう。</p>
<p>これでFlashBuilderプロジェクトの設定は完了です。<br />
いろいろ警告が出るとは思いますが、警告文を良く読むとほとんどの方にとっては問題ないケースかと思われますので、理解して問題ないならOK連打で元の作業画面に戻りましょう。</p>
<div id="attachment_830" class="wp-caption alignnone" style="width: 154px"><a title="ファイルを一旦削除してみる" href="http://utweb.jp/blog/wp-content/uploads/2010/07/0f3cb4a2b65b1a51666b2508b0923be9.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/0f3cb4a2b65b1a51666b2508b0923be9-144x300.png" alt="選択したファイルを削除だ！" title="ファイルを一旦削除してみる" width="144" height="300" class="size-medium wp-image-830" /></a><p class="wp-caption-text">選択したファイルを削除だ！</p></div>
<p>あとはsrcのindex.fla 、preloader.fla、bin-debufのindex.swfとindex.fla、preloader.swfとpreloader.flaを削除してみましょう。</p>
<p>そしてFlashBuilderメニューの「プロジェクト」→「クリーン」で一回プロジェクトをやり直して、bin-debugフォルダにflaファイルが出来なくなって、さらにindex.swfとpreloader.swfが作られていればOKです！</p>
<p>あとはがんがん開発するのみ！よいProgression+FlashBuilderライフを！</p>
<h3>おまけ</h3>
<p>MacではFinderからswfを右クリックして「情報を見る」で</p>
<div id="attachment_831" class="wp-caption alignnone" style="width: 139px"><a title="情報を見る" href="http://utweb.jp/blog/wp-content/uploads/2010/07/c98eb53655efd7153d3991a2bdf764de.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/07/c98eb53655efd7153d3991a2bdf764de-129x300.png" alt="「このアプリケーションで開く」を設定" title="情報を見る" width="129" height="300" class="size-medium wp-image-831" /></a><p class="wp-caption-text">「このアプリケーションで開く」を設定</p></div>
<p>「このアプリケーションで開く」で Flash Player Debuggerを選んでおいてね。</p>
<h3>flaファイルは死んでしもうたん？</h3>
<p>このやり方ではindex.flaとpreloader.flaを大胆にも削除してしまうので、今後一切をasファイルで行わなければならなくなります。flaファイルは果たして使えないのでしょうか？</p>
<p>いいえ違います。</p>
<p>flaファイルはswc書き出しをするようにして、プロジェクトフォルダのlibsフォルダに突っ込むようにしましょう。<br />
InOutMovieコンポーネントなどを使ったMCをリンケージ書き出ししておけば、「タイムラインを上手く使いつつ爆速コーディング可能な」Progression4+FlashBuilderというなかなか厨房臭いほど最強なコーディング環境が整うかと思います。</p>
<p>これはかなり万人向けな便利スタイルですので、また今後是非とも掘り下げて紹介したいとおもいますが、swcを駆使してうまいことFlashBulderとFlashとの両立スタイルも研究していきましょう！</p>
<h5>※2010/10/27追記</h5>
<p>さらにswcを駆使して使う方法はこちらの記事に書きました。<br />
<a href="http://utweb.jp/blog/archives/910">SWC+Progressionで快適コーディング生活はじまる！</a></p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/815/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/815" />
	</item>
		<item>
		<title>jQuery,ActionScript,Progressionで関数を登録する際に引数を渡す</title>
		<link>http://utweb.jp/blog/archives/789</link>
		<comments>http://utweb.jp/blog/archives/789#comments</comments>
		<pubDate>Sat, 12 Jun 2010 04:47:53 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=789</guid>
		<description><![CDATA[子供時代は痩せてたので口の悪い上級生から「ホネホネロック」とからかわれていましたが、その呼ばれ方、けっこう気に入ってました。正宗です。
JavaScriptでもActionScriptでも、関数を登録する場面ってけっこう [...]]]></description>
			<content:encoded><![CDATA[<p>子供時代は痩せてたので口の悪い上級生から「ホネホネロック」とからかわれていましたが、その呼ばれ方、けっこう気に入ってました。正宗です。</p>
<p>JavaScriptでもActionScriptでも、関数を登録する場面ってけっこうよくあって、ActionScriptでいえば特にaddEventListenerですね。そんなときに引数を渡したい事もあると思うんです。<br />
その方法を書いておきたいと思います。<br />
<span id="more-789"></span></p>
<h3>jQuery（JavaScript）の場合</h3>
<pre class="javascript">jQuery<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'#hogehoge'</span> <span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">load</span><span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'nanika.html'</span>, myFunc <span style="color: #66cc66;">&#41;</span>;
<span style="color: #003366; font-weight: bold;">function</span> myFunc<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066;">alert</span><span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'こんにちは'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre>
<p>こういうやつのmyFuncに引数を渡したいとき。</p>
<pre class="javascript">jQuery<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'#hogehoge'</span> <span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">load</span><span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'nanika.html'</span>, myFunc<span style="color: #66cc66;">&#40;</span> <span style="color: #3366CC;">'こんにちは'</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #003366; font-weight: bold;">function</span> myFunc<span style="color: #66cc66;">&#40;</span> argment <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		<span style="color: #000066;">alert</span><span style="color: #66cc66;">&#40;</span>argment<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<p>渡され先でreturn functionするのがコツです。コツなのです！</p>
<h3>ActionScriptの場合</h3>
<p>どんどんいきましょう</p>
<pre class="actionscript">_mc.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span> MouseEvent.<span style="color: #006600;">CLICK</span>, __click__<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'クリックされたよ'</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>;
functioin __click__<span style="color: #66cc66;">&#40;</span> argment <span style="color: #66cc66;">&#41;</span>:<span style="color: #000000; font-weight: bold;">Function</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">e</span>:MouseEvent <span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> argment <span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<h3>Progressionの場合</h3>
<p>こういう書き方が出来るってことはProgressionのaddCommand内でも使えるはず！</p>
<pre class="actionscript"> <span style="color: #000000; font-weight: bold;">new</span> SerialList<span style="color: #66cc66;">&#40;</span> <span style="color: #000000; font-weight: bold;">null</span>,
	myFunc<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'コマンドにFunctionを登録するときにも引数がわたせる'</span> <span style="color: #66cc66;">&#41;</span>,
	myFunc<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'どんどん渡そう'</span> <span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">function</span> myFunc<span style="color: #66cc66;">&#40;</span> argment <span style="color: #66cc66;">&#41;</span>:<span style="color: #000000; font-weight: bold;">Function</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span><span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> argment <span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre>
<h3>何故こうなるの？</h3>
<p>書き方だけわかっても、理屈がわからないと気持ち悪いですよね。一見意味不明な書き方にも見えるし、まる覚えしないと次もういちど書けないようでは身につけたとは言えません。<br />
僕なりに解釈した考え方を書いていこうと思います。<br />
ちなみに型が明記できるActionScriptで書いていきます。</p>
<h4>function は（）で実行される</h4>
<pre class="actionscript"><span style="color: #000000; font-weight: bold;">function</span> myFunc<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'hogehoge'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">//関数を実行</span>
myFunc<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span>;</pre>
<p>当たり前のルールなんですが、一度作った関数は、その関数の名前のお尻に() 「括弧」を付ける事で実行されます。<br />
ということは逆に言うと括弧を付けないと実行されないという事です。</p>
<h4>関数を実行せずとりあえず登録だけしておく</h4>
<pre class="actionscript"><span style="color: #000000; font-weight: bold;">function</span> myFunc<span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">e</span>:MouseEvent <span style="color: #66cc66;">&#41;</span> :<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'クリックされました'</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
_mc.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span> MouseEvent.<span style="color: #006600;">CLICK</span>, myFunc <span style="color: #66cc66;">&#41;</span>;</pre>
<p>こういう書き方をしている場合、ようは「マウスクリックされたときにmyFuncっていう関数を実行してね」と書いている訳です。</p>
<pre class="actionscript">_mc.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span> MouseEvent.<span style="color: #006600;">CLICK</span>, myFunc<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//まちがい</span></pre>
<p>こう書いちゃうと、マウスクリックの時に実行してほしい関数なのに今実行してしまいます。<br />
つまり、「あとで実行したい関数は、名前だけ登録しておく」のが正解なわけで、通常はそう書いている訳ですね。</p>
<h4>関数の「戻り値」をおさらいしよう</h4>
<p>本来関数を登録だけしておくはずの場所で、あえて実行する訳ですから通常だとエラーなわけです。間違いです。そこをあえて実行してみた場合、スクリプトの世界ではどのような事が行われるでしょうか。<br />
その謎を考える前に関数の「戻り値」というやつをもう一回おさらいしてみます。</p>
<pre class="actionscript"><span style="color: #000000; font-weight: bold;">function</span> myFunc1<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> :<span style="color: #0066CC;">int</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">100</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">var</span> a:<span style="color: #0066CC;">int</span> = myFunc1<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//変数aには数字の100が入る</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> myFunc2<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> :<span style="color: #0066CC;">String</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #ff0000;">&quot;こんにちは&quot;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">var</span> b:<span style="color: #0066CC;">String</span> = myFunc2<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//変数bには文字の「こんにちは」が入る</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> myFunc2<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> :<span style="color: #0066CC;">Object</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #66cc66;">&#123;</span> test:<span style="color: #ff0000;">&quot;ごはんおいしいです&quot;</span> <span style="color: #66cc66;">&#125;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">var</span> c:<span style="color: #0066CC;">Object</span> myFunc3<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//変数cにはObjectが入る</span></pre>
<h4>関数が関数を返す</h4>
<p>結論から言うと、イベントリスナーやコールバック関数など、「関数を今実行せず登録だけしておく」場所で「あえて実行させてみる」わけですから、そこで実行された関数が関数を返してしまえばいい、とある頭のいい誰かが考えた訳ですね。</p>
<pre class="actionscript"><span style="color: #000000; font-weight: bold;">function</span> myFunc<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> :<span style="color: #000000; font-weight: bold;">Function</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #cc66cc;">1</span><span style="color: #cc66cc;">+1</span> <span style="color: #66cc66;">&#41;</span>; <span style="color: #66cc66;">&#125;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">var</span> f:<span style="color: #000000; font-weight: bold;">Function</span> = myFunc<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//変数fに関数が入る</span>
f<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//関数が実行され1+1の計算結果が表示される</span></pre>
<p>たとえばイベントリスナーの第二引数には</p>
<pre class="actionscript"><span style="color: #000000; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">e</span>:Event<span style="color: #66cc66;">&#41;</span> :<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #66cc66;">&#125;</span></pre>
<p>この形が入れば言い訳ですから、</p>
<pre class="actionscript"><span style="color: #000000; font-weight: bold;">function</span> myFunc<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> :Functioin <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">e</span>:Event<span style="color: #66cc66;">&#41;</span> :<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #66cc66;">&#125;</span>;
<span style="color: #66cc66;">&#125;</span></pre>
<p>こういう形を返す関数を作っておいて</p>
<pre class="actionscript">_mc.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span> Event.<span style="color: #006600;">ENTER_FRAME</span>, myFunc<span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>;</pre>
<p>こういうふうにイベントリスナーの登録時にはmyFuncを実行してしまえば、関数が返ってくるので、その返ってきた関数のほうをイベントリスナーは登録してくれる、というのがこの書き方の謎の正体です。</p>
<p>はじめに発見した人はそうとう頭良いと思います。ぼくはこの理屈を発見したとき芸術性すら感じました。<br />
実用性もさることながら、こういった動作の合理性を考えていくのもかなり楽しいです。昔中学校の技術の時間にエンジンの仕組みを勉強して以来、その動作の合理性に魅せられて車オタクバイクオタクというよりはエンジンオタクになったのを思い出します。</p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/789/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/789" />
	</item>
		<item>
		<title>Progressionのリファレンスの場所</title>
		<link>http://utweb.jp/blog/archives/784</link>
		<comments>http://utweb.jp/blog/archives/784#comments</comments>
		<pubDate>Fri, 11 Jun 2010 01:06:26 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=784</guid>
		<description><![CDATA[小ネタの備忘録なんですが、Progressionをインストールしたときに自動的にリファレンスもローカルに保存されます。リファレンスは読み方さえわかれば、非常に有用な情報源なのでブックマークしておくと何かと便利です。
ちな [...]]]></description>
			<content:encoded><![CDATA[<p>小ネタの備忘録なんですが、Progressionをインストールしたときに自動的にリファレンスもローカルに保存されます。リファレンスは読み方さえわかれば、非常に有用な情報源なのでブックマークしておくと何かと便利です。<br />
ちなみにアドレスの「Flash%20CS5」と なっている部分はFlashCSのバージョンです。この場合はCS5の例です。</p>
<p>Windowsの場合（vista）<br />
file:///C:/Users/＜ユーザー名＞/AppData/Local/Adobe/Flash%20CS5/ja/Configuration/Progression/Help/ASDoc/index.html</p>
<p>Macの場合（Snow Leopard）<br />
file:///Users/＜ユーザー名＞/Library/Application%20Support/Adobe/Flash%20CS5/ja_JP/Configuration/Progression/Help/ASDoc/index.html</p>
<p>あわせてActionScriptそのもののリファレンスのローカルの場所を探す場合には次の記事も参考にしてみてください。<br />
<a href="http://utweb.jp/blog/archives/247">ActionScriptリファレンスをダウンロードする</a></p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/784/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/784" />
	</item>
		<item>
		<title>大阪ひよこの会　第一回ミーティングを行いました</title>
		<link>http://utweb.jp/blog/archives/778</link>
		<comments>http://utweb.jp/blog/archives/778#comments</comments>
		<pubDate>Mon, 07 Jun 2010 03:38:23 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[勉強会]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=778</guid>
		<description><![CDATA[「いまさら他人に聞けないFlashの基礎的な何かを勉強する」という名目ではじまった勉強会、「大阪ひよこの会」の第一回ミーティングを開催しました。
場所は株式会社オノフ様のミーティングスペースをお借りしました。
今回は第一 [...]]]></description>
			<content:encoded><![CDATA[<p><a title="大阪ひよこの会第一回ミーティング" href="http://utweb.jp/blog/wp-content/uploads/2010/06/osaka_vol1.png"><img src="http://utweb.jp/blog/wp-content/uploads/2010/06/osaka_vol1-300x83.png" alt="大阪ひよこの会第一回ミーティング" title="大阪ひよこの会第一回ミーティング" width="300" height="83" class="alignnone size-medium wp-image-779" /></a>「<strong>いまさら他人に聞けないFlashの基礎的な何かを勉強する</strong>」という名目ではじまった勉強会、<a href="http://atnd.org/events/4927" target="_blank">「大阪ひよこの会」の第一回ミーティング</a>を開催しました。<br />
場所は<a href="http://www.onoff.ne.jp/">株式会社オノフ</a>様のミーティングスペースをお借りしました。<br />
今回は第一回という事で勉強会の方向性なんかを話し合った訳ですが、その模様を書いておきたいと思います。<br />
<span id="more-778"></span><br />
まずはひよこの会の発足に至った経緯なんかは、こちらにスライドをアップしておきました。<br />
<a href="http://utweb.jp/samples/as3practice/piyo1/osakapiyo_mtg1.pdf" target="_blank">スライド(PDF)</a></p>
<p>そして<a href="http://www.project-nya.jp/modules/weblog/details.php?blog_id=1212" target="_blank">ひろゆきさんの記事はこちら！</a></p>
<p>Flashに限らずものごとには基礎が必要なんですが、この基礎の学習という奴がえらく退屈でわけわからんものが多いんですよね。晴子さんにイイカッコ見せたくてバスケ部に入ったのに最初はドリブルの練習ばっかりみたいな。<br />
この基礎を通り越してしまえば、あとは楽しい世界が開ける訳でして、絵が思った通りグリグリ動かせて楽しいとか、思った通りいかなくてもそれがちょっとしたパズルみたいで楽しいとか、何をやっても楽しくなる訳ですが、いかんせん基礎を通り越すまでが恐ろしくわけわからないつまらない部分が続きます。</p>
<p>なのでこのFlashの初歩的な部分をみんなで集まって楽しく勉強したらいいんじゃないっていう集まりがひよこの会になります。</p>
<p>ちなみにいつも形から入る僕のスキルはというと自称上級者といううさんくさいやつでして、基礎的な初歩的な事はわかってなかったりするのでこの機会に皆さんと一緒に勉強していけたらと思います！お手柔らかによろしくおねがいします！</p>
<h3>先ずは結論から</h3>
<p>いきなりですがミーティングで決まった事から書いていきます。ざくざくっと。</p>
<ul>
<li>マニアックに走りすぎない。あくまで初心者のひよこの会なのでテーマをマニアックなことに持っていかないよう心がける。「隣の人に聞ける」とかそういう場。</li>
<li>かといって初心者こそ「この質問がどのレベルなのか」判断できないもの。とりあえずはひよこの会では初心者の全ての質問を受け付けておいて今後「たまごの会」とか「にわとりの会」とか分科会が出来れば良いなあ。</li>
<li>目標は月一回だがまずは年六回の開催を。</li>
<li>場所はなるべく無料でお借りできるところを持ち回りで。</li>
<li>今のところTwitterで運営してATNDで募集する形。今後必要になってくれば掲示板などのツールを増やしても良いかな？</li>
<li>誰かに負担が集中する事を極力避ける。</li>
<li>会の報告なども、いまのところ各自のブログにまとめるなど参加者の自主性に全面的に頼る事にする。</li>
</ul>
<p>運営に関してはこんなところですか。まあまだ実際に勉強会を一回もやった事が無い会なので、ツールや受け皿については追々きめていけばいいかと思います。<br />
基本的に僕があんまり何もやらない派だし、ひろゆきさんはものすごく几帳面な方ですので、誰かに負担がかかるとするとそれは絶対ひろゆきさんにかかると思います（苦笑）！そうならないためにも、<strong>ひよこの会は皆さん の自主性で成り立っていますので是非積極的な参加をよろしくお願いします！！ </strong></p>
<p>いちおう次回からは早速勉強会をはじめるわけですが、次回のテーマは「みんなが明かす勉強法公開！」となっています。開催日時はまだ未定。</p>
<h3>初心者勉強会の意義とか</h3>
<p>ここから先は僕のゴタクになります…。</p>
<p>僕はFlashを触り始めて10年ですがActionScript3を触り始めてまだ3年目です。Flashではベテランのほうだと思いますしAS3では初心者です。もともと建築作業員でして工事現場で働きながら家で独学でFlashを勉強してきたのでもとからプログラムが得意だった訳でもないですし、初心者の苦労や基礎の難しさを現在進行形で味わっている一人でもありますし、10年やってきてFlashの楽しさを少しでも多くの人に伝えたい人間でもあります。</p>
<p>僕自身が「誰とでも声をかけたらすぐ仲良くなる」ような社交的なタイプでもないので、誰に対しても気後れしてしまって人と全然仲良くなれなかったりするほうでして、常々「こんな自分でもFlasherと仲良くなるにはFlashの話題をする場を作るしか無い！」と考えていました。名刺交換してもうまく仲良くなれませんが、目の前でPCを開いて一緒にFlashを見たりするのはたまらなく嬉しい訳です。</p>
<p>正直にいうと初心者勉強会と言っても、学校でしっかり管理されたカリキュラムとかそういうのではないので、どこまで効果的な学習が出来るかと言うと疑問が残ります。でも、Flashが楽しくなる前段階に必要な基礎の部分をみんなで持ち寄ってなるべく楽しく勉強して交流を深める事にはとても意義があると思います。</p>
<p>どうしても僕がうだうだと意見を書いていくとなんか変なテンションになっちゃうので、ひよこの会の意義なんかについては是非ともATNDやTwitter上の皆さんの意見を参考にしていただくとして、今後もみなさんの積極的な参加をお待ちしておりますよ！</p>
<ul></ul>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/778/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/778" />
	</item>
	</channel>
</rss>

