<?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; 正宗</title>
	<atom:link href="http://utweb.jp/blog/archives/author/masamune/feed" rel="self" type="application/rss+xml" />
	<link>http://utweb.jp/blog</link>
	<description>宇都宮さんっていう、夫婦でやってるウエブサイト制作請負の大阪下町家内製手工業業務日誌</description>
	<lastBuildDate>Wed, 16 May 2012 04:06:09 +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/author/masamune/feed" />
		<item>
		<title>FlashCS6でProgressionが使えるか試してみた</title>
		<link>http://utweb.jp/blog/archives/1533</link>
		<comments>http://utweb.jp/blog/archives/1533#comments</comments>
		<pubDate>Fri, 11 May 2012 16:08:27 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=1533</guid>
		<description><![CDATA[正宗です。ついに出ましたね。Adobe Creative Suite6。月額5千円（CS3以降を持ってる人は最初の一年間は月額3千円のキャンペーンもやってます）で使えるAdobe Creative Cloudという目新し [...]]]></description>
			<content:encoded><![CDATA[<p>正宗です。ついに出ましたね。<a href="http://www.adobe.com/jp/products/creativesuite.html" target="_blank">Adobe Creative Suite6</a>。<br />月額5千円（CS3以降を持ってる人は最初の一年間は月額3千円の<a href="https://creativecloud-specialoffer.adobe.com/special-offer/?loc=ja_JP&amp;cc=jp" target="_blank">キャンペーンもやってます</a>）で使える<a href="http://www.adobe.com/jp/products/creativecloud.html" target="_blank">Adobe Creative Cloud</a>という目新しいライセンス形態も話題となり、購入を検討しているクリエイターや企業も多いのではないでしょうか？<br />ちなみに私は悩んだあげくCreative Cloudにしました。<br />うちの制作所単位では、 <a href="http://www.adobe.com/jp/products/creativesuite/design-web-premium.html" target="_blank">Design &amp; Web Premium</a>+<a href="http://www.adobe.com/jp/products/aftereffects.html" target="_blank">After Effects</a>あたりがあれば十分なんですが、特にAfter Effectsはそんなに最新版買ってもまだ使いこなせない機能のほうが多いですし、さらに私個人としては<a href="http://www.adobe.com/jp/products/flash.html" target="_blank">Flash</a>、<a href="http://www.adobe.com/jp/products/flash-builder.html" target="_blank">FlashBuilder</a>、<a href="http://www.adobe.com/jp/products/fireworks.html" target="_blank">Fireworks</a>、<a href="http://www.adobe.com/jp/products/dreamweaver.html" target="_blank">Dreamweaver</a>、とこの4つさえガチ最新であれば業務のほぼ全ては作業可能なため自分のAdobeIDでCreative Cloudにする必要があるのかと言われれば実はあんまりないんですよね。<br />なので私はWeb Premiumのアップグレードライセンスを購入して、実際により多くのAdobe製品を使いこなしているうちのデザイナのみCreative Cloudライセンスにする方法のほうが合理的なので、それに加えて自分がCreative Cloudにする必要があるのかをずっと悩んでしました。</p>
<p>でも、私もCreative Cloudにしちゃいました。理由としてはやっぱり新しいもの好きなので最新機能が使いこなせなくてもいつまでも最新版を追いかけていたいことと、あこがれのAdobe製品使い放題！なことと、実際問題としてAdobe製品はうちのソフトウェア資産なのでそれが何世代までアップデート出来るのかなど面倒な運用管理を考える暇があればそのぶん明確に常にソフトウェアを最新版に保てる今回のライセンス形態はかなり興味があったからだというのが大きいです。<br />何より、クリエイティブ系ツールのアップデートってワクワクするんですよね。自分の腕が上がったわけではないのに、何かこう、新しいもの生み出せそうで。</p>
<p>というわけで、 さくっとCreative Cloudを購入しましてですね。一番気になるのはやはりFlashCS6でもProgressionが使えるのか！？です。<br />結論から言いますと使えました。<br /><span style="text-decoration: line-through;">全く、何も、問題なく、普通に、使えましたよ。</span></p>
<p><span style="text-decoration: line-through;">以下、ごくごく普通にインストールメモです。</span></p>
<hr />
<h3>2012/5/12追記</h3>
<p>すいません、現時点で私の環境で少し問題が発生しました。記事の最後に追記しています。</p>
<hr /><span id="more-1533"></span>
<p>Adobe Creative CloudのFAQページにも載っていますが、FlashCS6はCreative Cloudに入って無くても、つまり今まで通りソフトウエア単品を購入しても、他のCS製品を購入しても、どちらでも使えます。</p>
<p>まずは自身の使い方に合わせたいずれかの購入方法でFlashCS6が正しくインストールされているのが前提で進めていきます。</p>
<p>最初に<a href="http://progression.jp/" target="_blank">Progressionのサイト</a>にいき、メニューからダウンロードを選んでください。</p>
<p><a href="http://progression.jp/ja/download/" target="_blank">ダウンロードページへの直接リンクはこちら</a>。</p>
<p>この記事を執筆時点ではまだFlashCS5用のダウンロードリンクがありますが、気にせずダウンロード。<br />きっと近々更新があると思います！ </p>
<p><img title="dl0.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/dl0.png" alt="ダウンロード" width="600" height="445" border="0" /></p>
<p><strong>Progression4 日本語版パッケージ</strong>と書かれてあるリンクをクリックするとダウンロードが始まると思います。</p>
<p><img title="dl_1.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/dl_1.png" alt="ダウンロードしたProgression" width="456" height="393" border="0" /></p>
<p>上のようなファイルがダウンロード出来ると思います。</p>
<p><img title="dl_2.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/dl_2.png" alt="ExtentionManagerCS6で開けるか確認してみて" width="600" height="362" border="0" /></p>
<p>この時点で先にFlashCS6が正しくインストールされてあるなら、ダウンロードしてきたファイルをダブルクリックするだけでインストールが出来るんですが、念のためMacですと右クリックから「このアプリケーションで開く」を選択してちゃんとExtentionManagerCS6で開くか確認しておくことをおすすめします。<br />Windowsの場合はファイルの関連づけを確認してみてください。 </p>
<p><img title="install_0.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/install_0.png" alt="インストールなう" width="600" height="449" border="0" /></p>
<p>ExtentionManagerCS6が立ち上がると免責事項が出ますのでよく読んで、条件が合うなら<strong>承認する</strong>ボタンを押して先に進んでください。</p>
<p><img title="install_1.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/install_1.png" alt="署名されてないなう" width="600" height="449" border="0" /></p>
<p>署名の警告が出ます。<br />Adobeが「身元不確かなファイルをインスコするけどいい？」って聞いてきています。基本的には問題ありませんので、ご自身の判断で間違いないと思ったら<strong>インストール</strong>を押して先に進みます。</p>
<p><img title="install_2.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/install_2.png" alt="インストールできたなう" width="600" height="446" border="0" /></p>
<p>インストールできたなう。<br />ExtentionManagerは閉じてかまいません。</p>
<p>FlashCS6を立ち上げます。へーFlashCS6の起動時スプラッシュウインドウはこんななんだ。 </p>
<p><img title="run.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/run.png" alt="起動なう" width="600" height="508" border="0" /></p>
<p>起動が完了したら、Flashのメニューから「<strong>ウインドウ</strong>」→「<strong>その他のパネル</strong>」→「<strong>Progression プロジェクト</strong>」があれば成功です！</p>
<p><img title="run0.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/run0.png" alt="成功なう" width="600" height="269" border="0" /></p>
<p>特に何も問題なくインストール完了＆立ち上がりました！</p>
<p><img title="panel.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/panel.png" alt="パネルなう" width="312" height="350" border="0" /></p>
<p>まずは立ち上がったのでとりあえずのところ今日の検証はお終いです。<br />冒頭にも書きましたがクリエイティブツールのアップデートはわくわくします。このわくわくに負けないくらい、誰もが楽しめるコンテンツをうちもよりいっそう作れるように精進します！とCS6のアップデートに誓いを立てたのでした。</p>
<hr />
<h3>2012/5/12追記</h3>
<blockquote class="twitter-tweet" lang="ja">
<p>［B!］FlashCS6でProgressionが使えるか試してみた / 敢えて言うと、Flash Player 11書き出しの場合は、CastDocument (ExMovieClip)でコンフリクトのエラーが発生するのでそこだけ調整… <a title="http://htn.to/6RFKH1" href="http://t.co/WoV6qLhB">htn.to/6RFKH1</a></p>
<p>— clockmaker_botさん (@clockmaker_bot) <a href="https://twitter.com/clockmaker_bot/status/200983494938198016" data-datetime="2012-05-11T16:19:33+00:00">5月 11, 2012</a></p></blockquote>
<p><script type="text/javascript" src="//platform.twitter.com/widgets.js"></script></p>
<p>はやくも補足ありがとうございます！！！！近日中に調べてアップします。</p>
<hr />
<h3>2012/5/12追記</h3>
<p>拡張のインストールまではできたものの、新規プロジェクトを作ることが出来ませんでした。</p>
<p><img title="cp_0.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/cp_0.png" alt="なにやら様子がおかしいなう" width="600" height="472" border="0" /></p>
<p>ちょっと様子がおかしい…。</p>
<p><img title="cp_1.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/cp_1.png" alt="プロジェクト失敗なう" width="579" height="112" border="0" /></p>
<p>ううう残念…。ここは今後のProgressionのアップデートに期待です。<br />気分を変えてCS5で新規プロジェクトを作ってCS6で立ち上げてみます。</p>
<p><img title="cmp_0.png" src="http://utweb.jp/blog/wp-content/uploads/2012/05/cmp_0.png" alt="コンパイルエラー" width="600" height="231" border="0" /></p>
<p>ああ〜〜〜…。</p>
<p>どうもFlashPlayer11.1からMovieClipに今さらisPlayingプロパティが追加されたようで、競合しちゃうようです。今のところ解決方法としましては自分でソースを書き換えるのが一番はやいかと思います。</p>
<p>jp.nium.display.ExMovieClip.as</p>
<p>を開いて、126行目付近（見つからなければ「isPlaying():Boolean」でファイル内検索）の</p>
<pre class="brush:as3;first-line:126">public function get isPlaying():Boolean { return _isPlaying; }</pre>
<p>となっているところを</p>
<pre class="brush:as3;first-line:126">override public function get isPlaying():Boolean { return _isPlaying; }</pre>
<p>と書き換えてください（行の先頭に「override&lt;半角スペース&gt;」を書き加える）。</p>
<p>これでコンパイルは通りますし理屈では問題ないはずですが、コードを勝手に書き加えているので（ライセンス的にはたぶん<a href="http://progression.jp/ja/overview/license/#PPL-Basic" target="_blank">Progression™ Library License Basic</a>の権利3で条文に抵触しない範囲でソースコードの利用・修正・改変・複写・掲載・頒布を行うことが認められているので問題ないはずですが）今のところ僕も未検証な部分が多すぎるので、商用案件などではProgressionのアップデートを待つか、FlashPlayer10.3以下で書き出すようにしたほうがいいかと思います。</p>
<p>とりあえずは僕もこの新しいツールCS6でまずいろいろ遊びながら使い慣れていきたいと思います！</p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/1533/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/1533" />
	</item>
		<item>
		<title>今さらながら知ったWebStormとJSDocの深〜い関係</title>
		<link>http://utweb.jp/blog/archives/1501</link>
		<comments>http://utweb.jp/blog/archives/1501#comments</comments>
		<pubDate>Tue, 08 May 2012 03:40:19 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=1501</guid>
		<description><![CDATA[正宗です。ものすごく今さらな事を知ったのでおおはしゃぎで書き留めておきます。いかに今までまともにJSDocを書いていなかったか。
私が主に JavaScriptを書くときに使っているWebStormでJSDocをきちんと [...]]]></description>
			<content:encoded><![CDATA[<p>正宗です。ものすごく今さらな事を知ったのでおおはしゃぎで書き留めておきます。いかに今までまともにJSDocを書いていなかったか。</p>
<p>私が主に JavaScriptを書くときに使っているWebStormでJSDocをきちんと書くようにすると、JavaScriptの型をなかなか強力にサポートしてくれるようになりました。コードの補完機能なんかもかなり精度が上がってくるので、結果的にコーディングも速くなるのではないでしょうか。<br /> 私は特に普段はActionScript3を書く機会が多く、ご存じのとおりActionScript3は型を明示できる言語なのでFlashBuilderやFlashDevelop、FlashCS5などのIDEに備わっている補完機能に頼り切ってコーディングしているため、今まではJavaScriptで厳密に型を明示できないことで自分のスペックの低さによってコーディングが遅くスペルミスも多いという弱点となってしまっていたのですが、WebStormがJSDocをここまでサポートしてくれていると、普段からコードにドキュメントを残すことで型の整合性をチェックできつつ補完の精度も上がっていくという、まさに一石何鳥も得たりという思いです。これには野鳥愛好家も黙っていられないんではないでしょうか。</p>
<p>あと毎度の事ながら前置きですがこの記事ではJSDocの書き方は扱っていません。あくまでJSDocに型情報を書いていったらどこまでWebStormが補完してくれるか、だけ実験しています。 </p>
<p><span id="more-1501"></span><br />
<h3>基本形何発か</h3>
<p>まずはこの状態。</p>
<pre class="brush:javascript">;
var name = "utsunomiya";</pre>
<p>この状態で1行目にカーソルを入れて、/**（半角スラッシュひとつと半角アスタリスク（肛門みたいなの）ふたつ）を入れてEnter</p>
<pre class="brush:javascript">/**
 *
 * @type {String}
 */
var name = "utsunomiya";</pre>
<p>あとはここまで補完してくれます。うん、便利。</p>
<p>プリミティブな型やクラスは当然びしびし補完してくれます。<br />以下、同じように半角スラッシュと肛門ふたつで自動的に補完してくれる型を紹介します。 </p>
<pre class="brush:javascript">/**
 *
 * @type {Number}
 */
var age = 37;
/**
 *
 * @type {Date}
 */
var date = new Date();</pre>
<p>関数なんかがかなり強力です。<br />実際にこんな変な関数書くことはないんですが、JSDocの実験と言うことでご勘弁ください。</p>
<pre class="brush:javascript">function createNames(){
    return [
        "tanaka",
        "yamada",
        "suzuki"
    ];
}

function addName(name){
    var a = createNames();
    a.push(name);
    return a;
}</pre>
<p>ここまで書くとしめたものです。</p>
<pre class="brush:javascript">/**
 *
 * @return {Array}
 */
function createNames(){
    return [
        "tanaka",
        "yamada",
        "suzuki"
    ];
}
/**
 *
 * @param name
 * @return {Array}
 */
function addName(name){
    var a = createNames();
    a.push(name);
    return a;
}</pre>
<p>一気にここまで補完してくれました。<br />特にaddNameのローカル変数aに注目して欲しいんですが、ちゃんとcreateNamesの戻り値がArrayだっていうことを参照していらっしゃる。<br />IDEがここまでコードの意味を理解しているようになるといろいろと安心ですね。 </p>
<p>もちろんユーザー定義クラスなんかも言わずもがな。</p>
<pre class="brush:javascript">/**
 *
 * @constructor
 */
function Main(){};
/**
 *
 * @type {Main}
 */
var main = new Main();</pre>
<p>はいはい自動自動。</p>
<h3>ActionScript3でいうところのVectorなんかはどう？</h3>
<p>ActionScript3でよく使うVector.&lt;String&gt;こういった書き方はどうでしょうか？<br />結論から言いますと、@type {Vector.&lt;String&gt;}もいけました。AS3er歓喜です。</p>
<pre class="brush:javascript">/**
 *
 * @return {Vector.&lt;String&gt;}
 */
function createNames(){
    return [
        "tanaka",
        "yamada",
        "suzuki"
    ];
}
/**
 *
 * @type {Vector.&lt;String&gt;}
 */
var people = createNames();
/**
 *
 * @type {String}
 */
var person = createNames()[0];</pre>
<p>ただ、僕が何とかのひとつ覚えみたいにJavaScript書くときバイブルにしている<a href="http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=JavaScript_Types#JavaScript_Types" target="_blank">Googleのコーディング規約</a>によりますとArray.&lt;String&gt;やObject.&lt;String&gt;を推奨していますので、それに従って書くと問題が起こります。</p>
<pre class="brush:javascript">/**
 *
 * @return {Array.&lt;String&gt;}
 */
function createNames(){
    return [
        "tanaka",
        "yamada",
        "suzuki"
    ];
}
/**
 *
 * @type {Array.&lt;String&gt;}
 */
var people = createNames();
/**
 *
 * @type {*}
 */
var person = createNames()[0];</pre>
<p>Array.&lt;String&gt;で書くとArrayの中身がStringだということがWebStorm様がご理解いただけない…TT<br />もしかしたら設定などでレギュレーション出来るのかも知れませんが、情報ありましたら教えて頂くと嬉しいです。それか今後のバージョンアップに期待というところでしょうか。 </p>
<h3>もうちょっと複雑なことはできるかな？</h3>
<p>このへんになってくるとまだ補完が危うい感じ？ </p>
<pre class="brush:javascript">/**
 *
 * @return {Function}
 */
function test(){
    return function(x, y){
        return x * y;
    }
}
/**
 *
 * @type {*}
 */
var t = test();
console.log(t(2, 5));</pre>
<p>test()を実行したときの戻り値が追いかけられてなさそうではあります。<br />最初のtest()の戻り値がFunctionオブジェクトなので、これだとコンストラクターなのか関数なのかがわからない、ということでしょうか？ </p>
<pre class="brush:javascript">/**
 *
 * @return {function():number}
 */
function test(){
    return function(x, y){
        return x * y;
    }
}
/**
 *
 * @type {function():number}
 */
var t = test();
//ここで間違う
var n = t(2, 5);</pre>
<p>う〜ん、惜しいなあ。実に惜しい。</p>
<pre class="brush:javascript">/**
 *
 * @return {function}
 */
function test(){
    return function(x, y){
        return x * y;
    }
}
/**
 *
 * @type {*}
 */
var t = test();
/**
 *
 * @type {*}
 */
var n = t(2, 5);</pre>
<p>今はこれが精一杯＞＜</p>
<p>IDEの機能に引っ張られてコーディング規約が甘くなるのは本末転倒ですが、あまりIDEの機能に頼りすぎてるとIDEの能力を超えた書き方がバグを混ぜてしまう危険性も出てくるので（しかもその場合、コーダーが気付かないうちに自動的に混ぜてしまう場合が多いのでさらに厄介）そこらへんの線引きは難しいところと言うか、僕みたいなツール頼りすぎなんちゃってプログラマーのつらいところです。</p>
<p>まとめますと、ちょっと癖はありますがかなりコードを深く理解して補完してくれるようになるみたいで、使えそうです。特に普段はActionScript3で慣れたクラス開発型をJavaScriptでも行っているので、ユーザー定義クラスとプリミティブ型オブジェクトをしっかりトラッキングしてくれるところが気に入りました。<br />それにJSDocでコード補完をより精度を高めていくやり方は、規約とドキュメントのクオリティも高めてくれるので積極的に使っていきたいです。</p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/1501/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/1501" />
	</item>
		<item>
		<title>ノンプログラマーにこそお勧めしたい！Tween24というFlashのトゥイーンライブラリ</title>
		<link>http://utweb.jp/blog/archives/1398</link>
		<comments>http://utweb.jp/blog/archives/1398#comments</comments>
		<pubDate>Fri, 27 Apr 2012 12:36:22 +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=1398</guid>
		<description><![CDATA[まさむ寝です。間違えました。正宗です。眠は春いですね。
Flashのタイムラインアニメーションはなんとか触れるんだけどActionScript3は怖い、ましてやトゥイーンライブラリとかトゥイーンエンジンって何？という人向 [...]]]></description>
			<content:encoded><![CDATA[<p>まさむ寝です。間違えました。正宗です。眠は春いですね。</p>
<p>Flashのタイムラインアニメーションはなんとか触れるんだけどActionScript3は怖い、ましてやトゥイーンライブラリとかトゥイーンエンジンって何？という人向けに、ぜひとも一回Tween24というトゥイーンライブラリを使って試しに遊んでみてほしいと思って記事を書いてみました。<br />タイトルでノンプログラマー向けと書いていますが、ノンプログラマーとはつまりプログラムを書くことが得意でない人全般を指していますが、楽しくトゥイーンを作る話しですので特にWEBデザイナーさんに読んで欲しいと思っています。<br />以下トゥイーンライブラリを含むActionScriptクラスライブラリの事をライブラリと省略して書きます。Flashのライブラリウインドウのライブラリとは別ものとして読んでいってください。 </p>
<p>誤解を恐れずものすごく断定的な言い方をすれば、Flashを苦手と感じている人の多くはタイムラインアニメーションと比べるとActionScriptが難しいと感じていて、ましてやライブラリなんて難しすぎて使えないんじゃないかという印象を抱いている人は少なくないかと思います。<br /> 僕の個人的な考えとしては、タイムラインは直感的に使うのに非常に優れたものなのでそれと比べると確かにActionScriptは慣れないと難しいものではあると思います。少なくとも僕は慣れるまでは難しかったです。<br /> さらにそのActionScriptを駆使するライブラリという奴は難しいものの親玉みたいに考えていました。<br />しかしながら実際のところはライブラリはほとんどが<strong>難しい事を簡単にする目的で作られた</strong>ものであるため、ActionScriptの難しいところを簡単にしてくれます。</p>
<p>その中でも特に、Flashのモーションを制御する事に特化したライブラリ、Tween24は使いやすいことは言うまでもなく「<strong>使ってて楽しい</strong>」ライブラリでして、今までこういうActionScriptのライブラリと無縁だったノンプログラマーな方々にもこの楽しさは是非とも体験して貰いたい！と思って紹介記事を書いてみました。</p>
<p>最終的にTween24を深く知るようになるためにはActionScriptの知識が必要ですが、とりあえず動いて楽しいレベルくらいまではActionScriptがわからなくても体験できると思います。 <br />この記事でもActionScriptについては出来るだけ「何故そうなるのか」の説明を省いてTween24を動かすことだけに特化して紹介してみたいと思います。 <br />この春からWEB系クリエイターになった新人さんや、ほかにも今さらFlashをいちから勉強したくない人にもおすすめしてみたいです。</p>
<h3>目次</h3>
<ol>
<li>この記事が対象としている人</li>
<li>用意するもの</li>
<li>ブックマークしておきたいURL三傑</li>
<li>さっそくライブラリをダウンロードしよう</li>
<li>Tween24とは？</li>
<li>はじめてみよう</li>
<li>動かすものを作ってみる</li>
<li>とりあえず動かしてみる</li>
<li>コピペサンプル3つ</li>
<li>奥義、自動補完とメソッドチェーン</li>
<li>おまけ：自動補完がきかない！？</li>
</ol>
<p>普通なら一番最初にくるはずの「Tween24とは？」「はじめてみよう」の前にいろいろと能書きがありますが、いきなりはじめる前に自分が昔ライブラリを使い始めるまでに敷居が高いと感じてたところをいっこずつ潰していきたいと思います。</p>
<h3>この記事が対象としている人</h3>
<p>Flashはあんまり得意じゃないな〜とは思っているけど、とりあえずタイムラインアニメーションくらいは触ったことある人。<br />他にも一回くらいはActionScript3を勉強しようと挑戦してみたけど挫折したことがある人。<br /> もっと限定的に言うと、<strong>うちのデザイナーに説明する気持ちで書いています</strong>。</p>
<p>僕がノンプログラマーにTween24をおすすめしたい理由は主に3つあります。</p>
<ol>
<li>ActionScript3ぽくないすっきりした書き方！</li>
<li>addEventListenerとおさらばできるかも！？</li>
<li>とにかく使ってて楽しい自動補完</li>
</ol>
<p>理由についても後ほど説明を書きますが特に過去にActionScript3を難しいと思った人にTween24はおすすめしたいです。</p>
<p><span id="more-1398"></span><br />
<h3>用意するもの</h3>
<p>Tween24を使うにあたって用意するものは次のとおりです。</p>
<ol>
<li>Flash Professional CS5以降</li>
<li>Tween24</li>
</ol>
<p>Tween24はActionScript3で書かれているので、ActionScript3が書けるFlash CS3以降であれば使えるのですが、この記事ではCS5以降をおすすめします。<br /> この記事をかいている時点ではCS5、CS5.5、そして発売されたばかりのCS6が対象です。 <br />理由はあとでも詳しく触れますがCS5以降にはActionScriptを書くときの自動補完という機能がついているのですが、これとTween24の組み合わせが最高に楽しくて是非ともこの体験をしてもらいたいからです。</p>
<h3>ブックマークしておきたいURL三傑</h3>
<p>次にブックマークしておきたいURLを紹介します。いろいろと紹介したいところですが、いきなり沢山の情報を参考にしても迷うと思うので思い切って最初に読みたいURLを三つに絞ってみました。 <br />この3つをブックマークしておけばTween24はもう極めたも同然です（だいぶ誇張して言ってます）。</p>
<ul>
<li><a href="http://package.a24.cat/tween24/" target="_blank">Tween24</a>
<ul>
<li>Tween24の配布サイトです。ダウンロードの他、紹介、チュートリアル、サンプルコード、ASDoc（リファレンスというTween24の説明書）など、ドキュメントが抱負なのでひととおり読むだけでなくTween24を使っている間は何度もここを訪れることになります。</li>
</ul>
</li>
<li><a href="http://package.a24.cat/2011/11/24/tween24/" target="_blank">メソッドチェーンでスラスラ書ける！AS3トゥイーンライブラリ「Tween24」</a>
<ul>
<li>先ほど紹介したTween24配布サイト内の関連記事ですが、作者のa_24さんがTween24について紹介記事を書いています。作者さん本人が書いているのでこれ以上無いくらいわかりやすく紹介されてあるうえにチュートリアルは特に参考になるので是非とも個別にブックマークしておきたいところです。</li>
</ul>
</li>
<li><a href="http://www.project-nya.jp/modules/weblog/details.php?blog_id=1568" target="_blank">にゃあプロジェクト [AS3.0] Tween24のイージング</a>
<ul>
<li>にゃあプロジェクトさんがたくさんTween24記事を書かれてあってそのどれもが大変参考になるんですが、その中でも特に１ページだけ挙げるとすればこのリンク先を真っ先にブックマークしておくことをおすすめします。記事の最後に<a href="http://www.project-nya.jp/images/flash/Tween24_easing2.html" target="_blank">イージングのチートシート</a>があるんですが、これがみやすくて何度も参考にすることになります。ちなみにイージングとは「だんだん遅くなる」とか「だんだん速くなる」とか動きの速度に変化をつけるためのものなんですが、これを使いこなすと動きがとても活き活きとしてくるので断然お勧めです。</li>
</ul>
</li>
</ul>
<p>上に挙げた3つのURL以外にも、参考にさせて頂いた記事はたくさんあるんですが今回はあえて三つに絞って紹介してみました。</p>
<h3>さっそくライブラリをダウンロードしよう</h3>
<p>先ほども紹介したTween24のサイトにいって、ライブラリをダウンロードします。<br /> <a href="http://package.a24.cat/tween24/" target="_blank">Tween24</a><br />この記事を書いている時点ではバージョンが1.0.1なので、ここから最新版を入手します。<br /><a title="ダウンロード" href="http://utweb.jp/blog/wp-content/uploads/2012/04/sc0.png"><img class="size-medium wp-image-1408" title="ダウンロード" src="http://utweb.jp/blog/wp-content/uploads/2012/04/sc0-151x300.png" alt="最新版をダウンロードしよう。" width="151" height="300" /><br /></a>ZIPファイルでダウンロード出来ると思うので解凍してください。<br /> 解凍して出来たファイルをどこかお宝フォルダに入れて大事に保存してください。 <br /><a title="保存" href="http://utweb.jp/blog/wp-content/uploads/2012/04/ss1.png"><img class="size-medium wp-image-1411" title="保存" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss1-300x144.png" alt="フォルダごとどこか大事なファイル入れに保存しておいて下しあ。" width="300" height="144" /><br /></a>ダウンロードはこれで完了です。 <br />いちおうダウンロードしたファイルの中身をみてみましょう。<br /> 「src」というフォルダがあってその中に「Tween24_＜バージョン番号＞.swc」というファイルがあると思います。これがTween24のライブラリです。使い方は後ほど説明します。 <br /><a title="ss2" href="http://utweb.jp/blog/wp-content/uploads/2012/04/ss2.png"><img class="size-full wp-image-1416" title="ss2" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss2.png" alt="中にあるswcファイルを今後使うことになる。" width="194" height="139" /><br /></a>swcファイルの他に「a24→tween→」フォルダにいろいろな.asファイルがあります。<br />これらはTween24.swcライブラリのソースファイル（スクリプトが書かれたActionScriptのファイル）です。ActionScriptに興味のある方や、ソースファイルからライブラリを使用したい場合はこちらを使いますが、多くの方はあまり関係ないのでこちらは特に意識しなくても大丈夫です。</p>
<h3>Tween24とは？</h3>
<p>ここまで読んでもらうとわかるように、Tween24とはActionScript3でトゥイーンをするためのライブラリです。<br /> @a_24さんが個人で開発をされていて、誰でも気軽に使えるようにMITライセンスで公開されています。<br /> 非常に使い勝手が良いのが特徴で、動作が軽いこととメソッドチェーンと呼ばれる書き方で高機能なことをバランスよく使うことが出来るため、公開直後から大人気となった日本製トゥイーンライブラリです。 <br />「Actionscript3」の「ライブラリ」などとなにやら難しげなキーワードが出ましたが、ライブラリ本体そのものは先ほどダウンロードしてきたswcファイルが正体です。どうやって使うのかは次の項目で説明します。</p>
<h3>はじめてみよう</h3>
<p>はじめるまでに嫌になるくらい前置きが長かったですね。 まずはflaファイルを入れるための新しいフォルダを作ります。<br /> <img title="ss_createfolder.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_createfolder.png" alt="作業用フォルダを作ります" width="235" height="175" border="0" /><br />そしてその中に実験用のflaを作ります。<br /><img title="ss_createfla.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_createfla.png" alt="flaファイルを作ります" width="469" height="420" border="0" /><br />フォルダ名とファイル名に若干愛が感じられないですが次に行きます。<br />先ほどダウンロードしてきたライブラリから、swcファイルをflaと同じフォルダに<strong>コピーします</strong>。<br /> swcファイルはこうやってflaを作るたびにコピーして使うことになります。<br /> <img title="ss_swc.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_swc.png" alt="さっきダウンロードしてきたライブラリ" width="194" height="139" border="0" /> <br />これでフォルダの中はこうなっているはずです。<br /> <img title="ss_moveswc.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_moveswc.png" alt="swcファイルをコピーしてきます" width="469" height="420" border="0" /><br />ファイルの準備が整ったら、Flashを立ち上げてそのFlashのメニューの「ファイル」から「ActionScript設定」を選びます。</p>
<p><img title="ss_asconfig.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_asconfig.png" alt="ActionScript設定" width="422" height="600" border="0" /><br />何やら恐ろしげなウインドウが開きますが、中段にある「ライブラリパス」を選択後、「＋」プラスボタンを押して新しく指定するフォルダに「./」（半角でドットとスラッシュ）と入力します。<br /><img title="ss_setting.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_setting.png" alt="設定方法" width="464" height="600" border="0" /><br />これで準備完了です！FlashでTween24を使う準備が出来ました。</p>
<h3>動かすものを作ってみる</h3>
<p>トゥイーンのためのライブラリなのでまずは動かすものを作ってみましょう。なんでもいいのでとりあえず丸でも書いておきます。<br /> <img title="ss_create_circle.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_create_circle.png" alt="丸を書きます。" width="548" height="393" border="0" /><br />「シンボルに変換」でムービークリップにしておきます。中心点は真ん中にしておくと使い勝手が良いと思います。<br />さいごに、Actionscript3から呼び出せるようにするためにインスタンス名をつければ完了です。<br /> <img title="ss_instancename.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_instancename.png" alt="インスタンス名をつけてください" width="543" height="274" border="0" /><br />名前のつけかたには規則があるんですが、とりあえずは<br /><strong>最初の文字が半角アルファベットか半角アンダーバーであること、<br />あと途中にアンダーバー以外の他の半角記号や<strong>半角スペース</strong>が混じらないこと、<br />この二つが守られていればまあ何でも良い</strong>です（あまのじゃくな方は「じゃあ日本語でも入れてみよう」とすると思いますが、太字で書いた決まりさえ守っていれば日本語が混じってもまあ大丈夫です。おすすめはしませんが）。<br />ここでは半角で「maru」 と書きました。サンプル素材とインスタンス名に若干愛が感じられないですが次に行きます。</p>
<h3>とりあえず動かしてみる</h3>
<p>とりあえず何も考えずにコピペでTween24を使って動かしてみます。<br /> ActionScript3を書く用のレイヤーを新しく作ります。<br /> <img title="ss_add_layer.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_add_layer.png" alt="ActionScript書く用のレイヤーを作ります" width="498" height="367" border="0" /><br />こうやって、ActionScriptを書くための専用のレイヤーを作っておくと、便利です。<br />右クリックでメニューを出して「アクション」を選んで、アクションパネルを開きます。<br /> <img title="ss_action.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_action.png" alt="アクション" width="600" height="448" border="0" /><br />出てきたアクションパネルに次のスクリプトをコピー＆ペーストしてみてください。</p>
<pre class="brush:as3">import a24.tween.Tween24;
Tween24.tween(maru, 10).x(500).play();</pre>
<p>そこでおもむろにCmmand+Enter（WindowsだとCtrl+Enter）でプレビューします。 <br />丸が ゆっくり右に移動するのが確認できると思います。</p>
<p>サンプルが微妙すぎて全然面白くないかもしれないですが、ちょっとだけ画像でTween24の説明させてください。<br /> <img title="ss_script0.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_script0.png" alt="スクリプトはこうなってる" width="561" height="331" border="0" /><br />Tween24では、<strong>何を何秒かけてどう動かすか</strong>、を指定するだけで動かせます。そして最後に</p>
<pre>.play();</pre>
<p>と繋げて書くことでトゥイーンが実行されます。<br />ActionScriptがわからなくても勘のいい人ならこれなら多少は思った通りに動かせる気がしてきませんか？</p>
<p>最初のimport文は、Tween24を使ってActionScript3を書くときのおまじないですが、実際に動かしているスクリプトは「Tween24.〜」から始まる下の一行になります。<br /><strong>スクリプトとしては呼び名が正確ではないですが</strong>、この記事では説明しやすくするためにこの1行のActionScriptをコマンドと呼んで説明していきたいと思います。 </p>
<h3>コピペサンプル3つ</h3>
<p>先にも書きましたがTween24は豊富な機能を簡単に使えるためのバランスがすごくよくって、最初に紹介したリンク先にもたくさんのサンプルがあります。<br />ここでもできれば豊富な機能の全てを紹介したいのですが、 プログラミングが出来なくてもそれなりに動かせるサンプルを3つに絞って紹介してみました。</p>
<h4>順番に動かす</h4>
<pre class="brush:as3">import a24.tween.Tween24;
Tween24.serial(
	Tween24.prop(maru).x(50).y(50),
	Tween24.tween(maru, 2).x(500).y(50),
	Tween24.tween(maru, 2).x(500).y(200),
	Tween24.tween(maru, 2).x(50).y(200),
	Tween24.tween(maru, 2).x(50).y(50)
).play();</pre>
<p>順番に動かすにはコマンドをTween24.serial()で囲んでやります。最後に</p>
<pre>.play();</pre>
<p>で実行させる命令を繋げて書くのを忘れずに。<br />中のそれぞれの動きコマンドは半角カンマで区切ります。<br />順番に動かすやり方を本家サイトでは<a href="http://package.a24.cat/2011/11/24/tween24/#serial" target="_blank">直列トゥイーン</a>としてさらにわかりやすく書かれてあります。  </p>
<pre style="margin: 8px;">Tween24.prop(maru)</pre>
<p>と書かれてあるところは</p>
<pre style="margin: 8px;">Tween24.tween(maru, 0)</pre>
<p>と書いてもいいです。言い方が変ですが、要は動きに時間をかけたくないとき、tweenの時間の指定をゼロにするか、tweenのかわりにpropを使うか、好みの書き方が出来ます。<br />厳密にはpropを使った方が良いんですがtweenでゼロ秒指定したほうがわかりやすい人はそうしても特に間違いではないです。 </p>
<pre>.x(50).y(200)</pre>
<p>X座標とY座標など複数のプロパティを変化させたい場合はこのように半角のドットで繋げて書きます。これがメソッドチェーンと呼ばれる書き方で、jQueryが特に有名だと思います。<br />他にもXY座標などよく使われる書き方にはTween24で短く書ける他の書き方もありますが興味のある方は本家<a href="http://package.a24.cat/2011/11/24/tween24/#special" target="_blank">特殊プロパティ</a>を参考にしてみてください。</p>
<h4>同時に動かす</h4>
<p>スクリーンショットのように複数のインスタンスがある場合、これを同時に動かすにはいろいろ書き方があります。<br /> <img title="ss_parallel.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_parallel.png" alt="Ss parallel" width="600" height="247" border="0" /></p>
<h5>個別に動かす書き方</h5>
<pre class="brush:as3">import a24.tween.Tween24;
Tween24.tween(maru0, 5).y(200).play();
Tween24.tween(maru1, 5).y(200).play();
Tween24.tween(maru2, 5).y(200).play();
Tween24.tween(maru3, 5).y(200).play();</pre>
<p>コマンドをそのまま個別に書く書き方です。</p>
<h5>動かす対象を配列に入れるやり方</h5>
<pre class="brush:as3">import a24.tween.Tween24;
var a:Array = [maru0, maru1, maru2, maru3];
Tween24.tween(a, 5).y(200).play();</pre>
<p>動きが全く一緒であれば動かす対象を配列に入れるやり方もあります。</p>
<pre class="brush:as3">import a24.tween.Tween24;
Tween24.tween([maru0, maru1, maru2, maru3], 5).y(200).play();</pre>
<p>上の二つは少し書き方を変えましたが全く同じ動きになります。<br />配列に入れるこの方法は、ActionScriptに慣れてない人だと難しく感じてしまうかも知れないので、特に覚える必要はないかもしれませんがTween24に慣れたときにいろんな書き方があることも紹介しておきたかったのでいちおう載せておきました。</p>
<h5>Tween24.parallel()で囲むやり方</h5>
<p>先ほど「<strong>順番に動かす</strong>」でTween24.serial()を使ってコマンドを囲むやり方を紹介しましたが、同時に動かすときはコマンドをTween24.parallel()で囲んで書くやり方が便利です。</p>
<pre class="brush:as3">import a24.tween.Tween24;
Tween24.parallel(
	Tween24.tween(maru0, 2).y(100),
	Tween24.tween(maru1, 10).y(200),
	Tween24.tween(maru2, 5).y(-10),
	Tween24.tween(maru3, 20).y(300)
).play();</pre>
<p>なんともイラつく動きをしますが許してください。スクリプトで各々のコマンドがどういう動きを指定しているのかわかりやすく書こうとしたらこうなりました。<br />動きはコピペしたあとぜひとも数値をいろいろいじってみなさんで楽しんでください。</p>
<p>これだけだと「個別に動かす」やり方と変わらないんですが、parallelで囲むやり方を使うと先に紹介した順番に動かすserial()と組み合わせて使えるようになるので非常に強力になります。</p>
<pre class="brush:as3">import a24.tween.Tween24;
Tween24.serial(
	Tween24.tween(maru0, 0.5).x(100),
	Tween24.tween(maru1, 1).x(250),
	Tween24.parallel(
		Tween24.tween(maru2, 1).x(500),
		Tween24.tween(maru3, 1).x(500)
	)
).play();</pre>
<p>毎度毎度なんともイラつく動きをしますが許してください。Tween24が悪いんじゃなく、僕のサンプルがしょぼいんです。<br />スクリプトをコピペして、どの数字をいじったらどうなるか、わかって頂ければ幸いです。<br />本家サイトに<a href="http://package.a24.cat/2011/11/24/tween24/#parallel" target="_blank">並列トゥイーン</a>として詳しく書かれてあります。 <br />いろいろ組み合わせると複雑な動きもすっきり書けそうな気がしてわくわくしてきます。 </p>
<p>過去に一度でもActionScript3を難しいなと思った方は、ここまでサンプルを見て気付いたかも知れません。<br />そう、Tween24はあんまりActionScript3っぽくない書き方で使えるんです。 これが冒頭で述べた、Tween24をお勧めしたい理由のひとつです。<br />僕のこのブログの過去の記事でもActionScript3のコードはいろいろ載せているんですが、ActionScript3はどうしても初心者から見るとごちゃごちゃ複雑そうに見えてしまうんですが、Tween24は非常にすっきり書くことが出来るんです。</p>
<h4>クリックされたら動かす </h4>
<p>僕がTween24をおすすめする理由ふたつめ、「簡単なイベント連動ならaddEventListenerとおさらばできるかも！？」がこの書き方です。<br />ActionScript3が苦手な方のほとんどが、ボタンを押したりマウスでロールオーバーしたときのスクリプトの書き方を複雑に感じていると思います。それがTwee24ではこんなにすっきり書けます。<br /> <img title="ss_event.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_event.png" alt="またインスタンス名maruを確認しておく" width="497" height="312" border="0" /></p>
<pre class="brush:as3">import a24.tween.EventTween24;
import a24.tween.Tween24;
//ロールオーバーすると明るくなってちょっと拡大
EventTween24.onRollOver(maru,
	Tween24.tween(maru, 0.2).bright(2.55).scale(1.1)
);
//ロールアウトで明るさ元通り、拡大率も元通り
EventTween24.onRollOut(maru,
	Tween24.tween(maru, 0.1).bright(0).scale(1)
);
//クリックするとビヨヨンと大きくなる
EventTween24.onClick(maru,
	Tween24.tween(maru, 0.5, Tween24.ease.ElasticOut).scale(2)
);</pre>
<p>クリックの箇所の書き方が若干今までの書き方と違いますが、これはイージングをかけているためで、イージングについてはまた後ほど説明を入れます。<br />このコピペサンプルのようにクリックやマウスオーバーなどの簡単なイベントと連動してトゥイーンさせる命令だけだと、ActionScript3でaddEventListenerを駆使して書くよりもかなり簡単に書くことが出来るのがおわかりいただけたでしょうか。 <br />本家サイトでは<a href="http://package.a24.cat/2011/11/24/tween24/#event" target="_blank">イベント連動トゥイーン</a>についてもっと詳しく書かれてあります。 </p>
<h3>奥義、自動補完とメソッドチェーン</h3>
<p>僕がTween24をお勧めしたい理由3つめ。</p>
<p><strong>CS5以降の自動補完という機能と、Tween24のメソッドチェーンという書き方をあわせると、この上なく楽しいのです。</strong></p>
<p>もう一度言わせてください。</p>
<p><strong>CS5以降の自動補完という機能と、Tween24のメソッドチェーンという書き方をあわせると、めちゃくちゃ楽しいのです。</strong></p>
<p>どのくらい楽しいかというと、こればっかりは実際に使ってみて楽しさを体験してください。<br />今までこの記事ではコピペだけでも動くように紹介してきましたが、ここからは実際に入力する楽しさも味わって貰うために自動補完とメソッドチェーンについて紹介してみたいと思います。</p>
<p>一回アクションパネルのActionScriptを全部削除して、最初から次のようにキーボードを入力してください。</p>
<p>tween2　と入力したところでCommand+Space（WindowsはCtrl+Space）</p>
<p><img title="ss_pic.jpg" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_pic.jpg" alt="何か出てきた" width="320" height="240" border="0" /><br />スクリーンキャプチャが撮れなかったのできたない写真でごめんなさい。<br />何か出てきたと思います。そう、これこそがCS5以降のAdobe奥義、<strong>自動補完</strong>です。スクリプトで必要なスペルを自動的に選んでくれる頼もしい機能です！<br />もし写真のように補完用の小窓が 開かなかった場合は、いちおうこの記事の最後にトラブルシュートを載せていますのでそれも参考にしてみてください。</p>
<p>この小窓からマウスか矢印キーで「Twee24」を選んでEnterを押すとほら！<br /> <img title="ss_add0.png" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_add0.png" alt="補完してくれる！" width="600" height="232" border="0" /><br />こうやって補完してくれます。ありがたいことに、ActionScript3苦手な人だとかなり苦手意識のあるimport文もちゃんと補完してくれます。<br />驚くのはまだこれからです。この状態で、マウスカーソルは3行目のTween24と書かれたおしりにあると思いますが、そこで続けて半角ドットを押してください。<br /> <img title="ss_add1.jpg" src="http://utweb.jp/blog/wp-content/uploads/2012/04/ss_add1.jpg" alt="どんどん補完してくれる！" width="594" height="337" border="0" /><br />どんどん補完してくれます。</p>
<p>この補完小窓が開いたら、あとは矢印キーかマウスで目的のスペルを選んでも良し、途中まで続けてスペルを入力して補完候補を絞るも良し、とにかく面倒臭いコードの入力がかなりサクサク進むことになります！<br /><strong>さらに、自動で補完してくれるって事はスクリプトのスペルミスでエラーになる日々ともサヨウナラです！！！！</strong> </p>
<p>自動補完の技を身につけたらこんどはTween24のメソッドチェーンの奥義を試してみましょう。<br />次のコードをコピペじゃなく手で入力してみてください。</p>
<pre class="brush:as3">Tween24.tween(maru, 5).x(100).y(100).bright(1).scale(1.5).blur(32, 2).play();</pre>
<p>長いスクリプトももう怖くない。半角ドットを入力するたびに補完小窓が出てくると思いますが、消えてしまった場合は適宜Command+Spaceを押して自分で小窓を出します。<br />Tween24ではメソッドチェーンといって命令をドットで繋げて書くことが出来るのですが、例えば上のスクリプトはActionScript3を知らなくてもTween24をはじめたばかりでも、読めばなんとなく命令の意味がわかると思います。インスタンス名maruを5秒かけてX座標を100、Y座標を100、明度を1、拡大率を1.5倍、ぼかしを横32縦2になるようにトゥイーンさせています。<br />こういう複雑な命令をドットで繋げて書けるので、非常に書きやすく、あとで読んでも読みやすい、ごちゃごちゃしない作り方ができるようになります。</p>
<p>最後にTween24でイージングをする方法について紹介します。<br />トゥイーンを活き活きとしたものにするためにイージングといって動きに緩慢をつけることが多いのですが、これがやはりTween24ではメソッドチェーンとCS5以降の自動補完と組み合わせて非常に便利なのです。</p>
<p>Tween24でイージングをつけるにはtweenコマンドの秒数の指定の後にイージングを指定するようにします。<br />言葉にすると複雑そうですが実際に書いてみます。</p>
<pre class="brush:as3">import a24.tween.Tween24;
Tween24.tween(maru,2,Tween24.ease.BackOut).x(300).play();</pre>
<p>このサンプルではTween24.ease.BackOutこの部分で、行って戻るというイージングを加えています。<br />イージングについては冒頭で紹介したリンク先の<a href="http://www.project-nya.jp/modules/weblog/details.php?blog_id=1568" target="_blank">にゃあプロジェクトさんのサイト</a>がかなり詳しく載ってあるので是非とも参考にしてください。<br />本家サイトでも<a href="http://package.a24.cat/2011/11/24/tween24/#ease" target="_blank">イージングの設定</a>について書かれてあります。</p>
<p>いかがだったでしょうか。<br />自分でも書いてて誰に向けた記事なのか全然わからなくなってきました。サンプルもしょぼいし。<br />それでも、なんかこう、僕も私もやってみようかな、って人が増えるとうれしいです。紹介した甲斐があります。 <br />Tween24は使えば使うほど楽しさの発見があるので、長々と書いた割にこの記事ではTween24の楽しさの1割も紹介し切れていないのが残念ですが、 興味を持つきっかけくらいになれば幸いです。<br />興味もった方は是非とも最初に紹介したリンクを読みまくってTween24を楽しんでみてください！ </p>
<h3>おまけ：自動補完がきかない！？</h3>
<p>Command+Spaceを押してもこの記事のように自動補完小窓が開かない人、あわてずに次のことを確認してみましょう。</p>
<ol>
<li>わかっているとは思いますが、Command+Spaceの「Space」とはスペースキーの事です。</li>
<li>flaを保存しているフォルダの絶対パスに「日本語フォルダ名」が含まれていませんか？flaの保存フォルダの絶対パスの途中に日本語が入るとどうも自動補完ができなくなる場合があるようです。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/1398/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/1398" />
	</item>
		<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 = function(){};
})(jp_utweb_namespace);</pre>
<p>こんな感じでチェックを入れても良かったのですが、タイプミスなどによるデバッグがしづらくてかえって危険なのでやめました。<br />
実際に上のコードはこんなに短いのに見つけるのが困難なバグがあります。<br />
ここは素直に</p>
<pre class="brush:javascript">;(function(ns){
    ns.Main = function(){};
})(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>地獄のミサワ風WEBカメラの実験</title>
		<link>http://utweb.jp/blog/archives/1117</link>
		<comments>http://utweb.jp/blog/archives/1117#comments</comments>
		<pubDate>Sat, 03 Sep 2011 06:54:10 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=1117</guid>
		<description><![CDATA[正宗です。
今日の飲み会用に作ったネタです。
Webカメラから顔を認識して自動的に中央に寄せる実験です。
まだまだ処理が甘いけれど一旦公開。



DisplacementMapFilterのマップ作りに手こずった。
ソ [...]]]></description>
			<content:encoded><![CDATA[<p>正宗です。<br />
今日の飲み会用に作ったネタです。<br />
Webカメラから顔を認識して自動的に中央に寄せる実験です。<br />
まだまだ処理が甘いけれど一旦公開。</p>
<p><span id="more-1117"></span></p>
<p style="width:240px;height:320px;"><embed type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" src="/samples/misawacam/index.swf" width="240" height="320" play="true" loop="true" menu="true"></embed></p>
<p>
DisplacementMapFilterのマップ作りに手こずった。<br />
ソースコードは<a target="_blank" href="https://github.com/masamunet/misaka_cam">こちら</a>。&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/1117/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/1117" />
	</item>
		<item>
		<title>釣りタイトル「HTML5 v.s. Flash」ついて。</title>
		<link>http://utweb.jp/blog/archives/1050</link>
		<comments>http://utweb.jp/blog/archives/1050#comments</comments>
		<pubDate>Tue, 23 Aug 2011 18:56:21 +0000</pubDate>
		<dc:creator>正宗</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://utweb.jp/blog/?p=1050</guid>
		<description><![CDATA[僕はウエブサイト制作請け負いを生業としていまして、毎日いろんなウエブサイトを、大阪の隅っこの方で家内とたった二人でこしらえています。
一度でもお会いした方には、求められれば今まで制作した実績を、秘密保持の契約に問題ない範 [...]]]></description>
			<content:encoded><![CDATA[<p>僕はウエブサイト制作請け負いを生業としていまして、毎日いろんなウエブサイトを、大阪の隅っこの方で家内とたった二人でこしらえています。</p>
<p>一度でもお会いした方には、求められれば今まで制作した実績を、秘密保持の契約に問題ない範囲でお知らせしていますのでご存じの方も多いですが、ウエブサイト制作という目的に沿うためのありとあらゆる技術を駆使して業務に携わっており、その中でもとりわけFlashが大好きな、いわゆる業界の一部のみで使われるスラングであるところのFlasherという肩書きを好んで自称しております。</p>
<p>ここ数年でよく目にするようになった「HTML5 v.s. Flash」という言葉。<br />
別に個人の話しレベルでは何も思うことはなかったのですが、特にここ最近は大手技術系ニュースブログでもたぶんアクセス数欲しさからやってることなのだとは思いますが釣りタイトルで使われるようになり、ちょっと個人的に看過できないのではないかと考えるようになってきました。</p>
<p>ニュースブログのやってることは、記事という名の広告掲載場所を作るためのいわゆる看板板の作成のお仕事なので、釣りタイトルで人目を引くことに関しては何も異論はありません。<br />
何ズモードとか何デア何デアとか、けっこうかなりな大手ニュースブログで勝手に「もうFlashはいらない？」と煽られたFlashを、こよなく愛するいちユーザーが感じた、ちょっとした違和感を書きたいと思います。</p>
<p><span id="more-1050"></span></p>
<h3>大前提としてFlashとHTML5は対立関係に無い。排他的関係はもっと無い。</h3>
<p>「もうFlashはいらない？」</p>
<p>これわざとなんですかねえ。わざとなんですよねえ。何イデアアイデアさんとか何ズモードジャパンさんとか大手でもやってますが。</p>
<p>もしわざとでないんであれば、後述するようにもうニュースサイトの記事書くのやめたほうがいいですし、わざとなんであれば、アクセス数をすこしでも稼ぎたいお気持ちはすごくよくわかります。</p>
<p>もしかしたらFlashを触ったこともないような人とか、HTMLに全く理解の無い人からはあたかも対立関係があるように見えるのかもしれませんが、僕程度の半可通からみても対立するような技術ではないことはよくわかります。<br />
少なくとも僕の知ってるHTML5を研究してる人やFlashの凄い人や、誰に聞いても「むしろどこがどう対立するのかこっちが知りたい」という意見しか聞こえてこないです。<br />
何故「HTML5 v.s. Flash」という図式が外野で作られたのか。<br />
それには三つの本当とたった一つの勘違いがあるからだと僕は考えています。</p>
<h3>[本当.1]AppleとAdobeは対立しているように見える。</h3>
<p>これは本当だと思います。<br />
MacのOSアップデートLionのときにAdobeのアプリがことごとく動かなかった事から見ても、相当根が深いのかなと心配しています。</p>
<h3>[本当.2]AppleはiOSにFlashを搭載する予定はないし、その代わり「HTML5が動くよ」と言う。</h3>
<p>これも本当です。<br />
iOSではFlashのリッチな体験が出来ない問題に対してHTML5がその役割を代替することをアップルは期待しています。</p>
<h3>[本当.3]AdobeはiOSにFlashPlayerが走らないと困る。</h3>
<p>本当そうですよね。<br />
ただ、これが次の勘違いを生むことになります。</p>
<h3>[勘違い.1]AdobeはHTML5が普及すると困る。</h3>
<p>完全に勘違いです。<br />
Adobeが困るのはFlashPlayerが走らない環境が少なくなるのが困るのであって、つまりiOSでFlashPlayerが走らないことについては非常に困っています。<br />
2番目の本当でAppleがiOSのFlashの代替にHTML5を提示したこともあって、FlashとHTML5を同等に並べられて勘違いされやすいですが、iOSでFlashが動かないのはAdobeにとって大問題ですが、HTML5の普及とAdobeは何の関係もないんです。<br />
むしろ、クリエイターに制作ツールを売って生計を立てているAdobeにとって、クリエイターに支持されるHTML5のツールを作ることは至上命題なのです。<br />
ちょっとややこしいですが、</p>
<ol>
<li>iOS =&gt; HTML5好き　Flash無理</li>
<li>Adobe =&gt; Flashが動かないのは嫌！iOSでも動かして！</li>
<li>Apple =&gt; 嫌。Flashの代わりにHTML5動くし。</li>
</ol>
<p>というなりゆきと</p>
<ul>
<li>Adobe =&gt; クリエイターが使うツールを作って売ってる会社</li>
</ul>
<p>とはわけて考える必要があります。<br />
Adobeの顧客であるクリエイター、そのクリエイターの最近の出力先として無視できないのがWEB。<br />
WEBの出力先として無視できないのがiOS。<br />
iOSのWEBでFlashが動かない事は、Adobeのプラットフォーム戦略としては問題です。<br />
が、AdobeがHTML5のツールを出すことについてAdobeにとって特に何も問題になることはありません。</p>
<p>ということでAdobeがiOSでFlashPlayerが動かないのは困りものです。</p>
<p>でもそれ以外が全然的外れな感じがしないですか？<br />
問題がややこしいから普通に会話で「HTML5 v.s. Flash」とか言っちゃうのはわかるんだけれど、少なくとも大手といわれる技術系記事を書いて広告掲載場所を少しでも多く稼いでる看板板屋としては、素で勘違いしていたのであれば技術系の話題を書く素質無しだし、わざとやってたのだとしたらそうとうにあざといとは思います。<br />
わざとだとすれば、僕は大手のブログの記者に、アクセス数欲しさに「Flashはもう必要なし？」とまで煽られたので、少しは文句も言っていいでしょうか？</p>
<p>大手の知名度の割にはアクセス数が厳しいのか多少でも過激なタイトルをつけないといけない事情はわかります。<br />
「もうFlashはいらない？？？？？Adobeが作ったHTML5でFlash終了pgr」<br />
と煽って記事を書かないといけない心中はお察ししますが、僕がいちばん腑に落ちないのは<br />
いったいぜんたい何を持ってして、HTML5の表現力を引き出すツールができたからといってFlashがいらないと判断したかです。<br />
少なくともFlashを煽れば、記事にアクセスがつくと思ったのでしょうか？</p>
<h3>「もうFlashはいらない？？」</h3>
<p>もうFlashはいらないんでしょうか？</p>
<p>ナニを持ってしてそう感じたかは、僕が聞きたいくらいでが、ナニアイデアだったかナニギズモードだったかの記事では、彼らは「もうFlashはいらない」と感じたようです。</p>
<p>しかしながら僕はそう考えていません。<br />
今までFlashにしか出来なかった表現が（CSS3と組み合わせることで）HTML5でも出来るようになった。<br />
素晴らしいことです。<br />
Flashで培った表現が、より多くの人に見てもらえるプラットフォームが広がったのです。<br />
HTMLでできたサイトが動くようになったのです。</p>
<p>ねんがんの、動くサイトがやっと陽の目を浴びることになったのです。<br />
動くサイトは魅力的です。<br />
ユーザーにとって凄くわかりやすいです。<br />
「WEBサイトとはこういうものだから」という技術者の言い訳を超えた、<br />
「ページが切り替わるなら（うっとうしいと感じない範囲で）切り替わりのアニメーションをする、<br />
ボタンを押したら切り替わる、<br />
フリックしたら画面が指についてくる、<br />
といったように、ユーザーにとってわかりやすい制作物を作るためにアニメーションは絶対に欠かせません！</p>
<p>何デアアイデアとかいう超有名ブログとか何モードジャパンとか国際的に凄いか知らないですが彼らが言うには、なんかどうもFlashはいらないらしいです。ですが僕には納得できません。</p>
<p>僕が納得できないことと言うのは、つまり僕が知らないいろいろな事を相手は知っているという事で、もの凄く勉強のチャンスを得たと喜んでいます。</p>
<p>是非ともお話をお伺い存じたく奉りござ候でございますが、まあどうでもいいので、もしアクセス欲しさに「Flashはもういらない？」とかタイトルを 書いたのであればちょっとでも恥ずかしいと思ってくれたらそれでいいわけです。</p>
]]></content:encoded>
			<wfw:commentRss>http://utweb.jp/blog/archives/1050/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://utweb.jp/blog/archives/1050" />
	</item>
	</channel>
</rss>

