<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>feb19.jp blog</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/" />
   <link rel="self" type="application/atom+xml" href="http://feb19.jp/blog/atom.xml" />
   <id>tag:feb19.jp,2010:/blog/1</id>
   <updated>2010-02-11T03:07:40Z</updated>
   <subtitle>life is creative!</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.33-ja</generator>

<entry>
   <title>AS3 の演算子 ||= について</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000188.php" />
   <id>tag:feb19.jp,2010:/blog//1.188</id>
   
   <published>2010-02-11T02:52:48Z</published>
   <updated>2010-02-11T03:07:40Z</updated>
   
   <summary> AS3 だけでつかえるものではないのですが、AS3 での動作を確認し...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="89" label="as3" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="AS3 の演算子 ||= について" src="http://feb19.jp/blog/images/image110.jpg" width="400" height="100" />

AS3 だけでつかえるものではないのですが、AS3 での動作を確認したのでこんな表題にしました。最近巷ではやっている<a href="http://d.hatena.ne.jp/gifnksm/20100202/1265105961" target="_blank">最速文法マスター</a>の、<a href="http://blog.livedoor.jp/takaaki_bb/archives/51374100.html" target="_blank">AS3編</a>で、見慣れない演算子「||=」というものがあったので、これについて調べてみました。]]>
      <![CDATA[<strong>||= ダブルパイプイコール</strong> は、 a ||= b というふうに使います。a += b でいう a = a + b みたいなもので、a || = b を分解すると a = a || b と同じになります。

働きは、a の値が undefined (null) だった場合に、b を代入します。
なので、

<pre><code>var i:int;
i ||= 120;
trace(i);	// 120</code></pre>

になり、

<pre><code>var i:int;
i = 5;
i ||= 120;
trace(i);	// 5</code></pre>

となります。

原理を調べてみましょう。

|| 演算子は、「ショートサーキット」と呼ばれる特性を持ちます。

|| は論理和演算子なので、よく if 文などで使いますが、 if (mc || mc.parent) とした場合、評価の中ですでに mc が存在していれば、評価は true となり、 mc.parent は評価されません。この特性のことです。

つまり a ||= b の場合、 a = a || b となるので、 a がすでに存在している場合は a の値、 存在していない場合は与える値を代入してくれるのです。

<pre><code>import flash.display.MovieClip;
 
var mc:MovieClip;
mc = new MovieClipSubClass1();
trace(mc);	// MovieClipSubClass1
mc |= new MovieClipSubClass2();
trace(mc); 	// MovieClipSubClass1</code></pre>


ちなみに、||= ではなく、|= と、パイプ（|）が一つしかない場合は、ビット列の論理和をとる演算になります。これは ByteArray や BitmapData の計算時にたまに使いますね。


<strong>|= パイプイコール</strong>

a |= b の場合、a = a | b と同じ意味になります。
ビットの単位の論理和演算子です。

<pre><code>var n:int;
n = 2000;
n |= 130;
trace(n);	// 2002</code></pre>

「ビット」の論理和を取るので、数値を .toNumber(2) で二進数に変換してみると・・・

<pre><code>2000 : 11111010000
130  : 00010000010</code></pre>

です。論理和（同じ桁同士で、どちらか一方または両方が 1 なら 1 になり、どちらも 0 なら 0）を取ると、

<pre><code>2002 : 11111010010</code></pre>

になります。

これはビットの計算（数値、Number）用の演算子なので、当たり前ですが ||= のように MovieClip などには使えません（シンタックスエラーが出力されます）。


と、色々あるもんだ～ね～。


もちろん他にも色々あるみたいです。

って <a href="http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/operators.html" target="_blank">Adobe のヘルプ</a>にまるっとガッツリ美しくまとまってました。俺、要熟読。]]>
   </content>
</entry>
<entry>
   <title>iPhone SDK 「カテゴリ」について＋NSString の空白文字を除去する</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000187.php" />
   <id>tag:feb19.jp,2010:/blog//1.187</id>
   
   <published>2010-01-25T02:06:22Z</published>
   <updated>2010-01-25T02:20:30Z</updated>
   
   <summary> Objective-C では、高位のフレームワークで、低位のフレーム...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="191" label="iphone sdk" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="172" label="objective-c" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="iPhone SDK 「カテゴリ」について＋NSString の空白文字を除去する" src="http://feb19.jp/blog/images/image109.jpg" width="400" height="100" />

Objective-C では、高位のフレームワークで、低位のフレームワークのクラスを「カテゴリ」の仕組みを利用することにより、拡張することができます。このとき、低位のフレームワークに上位のフレームワークが影響を及ぼす事無くクラスを拡張することができます。（のメモ）]]>
      <![CDATA[たとえば Objective-C で文字列を扱うにはNSString というクラスを使用します。
NSString クラスは Mac OS でも使用可能な、低レベルレイヤーの Foundation フレームワークで定義されているクラスです。
iPhone SDK では、この NSString の文字列を iPhone の画面上に表示するメソッド「drawAtPoint:location withFont:font」が用意されています。

<pre><code>// 画面上に Hello World と表示します。
UIFont *font = [UIFont fontWithName:@"HiraKakuProN-W3" size:14.0f];
NSString *str = @"Hello World.";
[str drawAtPoint:CGPointMake(0, 0) withFont:font];</code></pre>

このメソッドは iPhone SDK に存在する、UIKit という高レベルレイヤーのフレームワークが、「カテゴリ」の仕組みを使用して NSString を「拡張」しています。

一般的にクラスを拡張するには、オブジェクト指向の世界では「サブクラス化」が一般的です。Objective-C ではそれに加え、カテゴリによるメソッドの追加という方法があり、サブクラス化の問題点「既存のインスタンスを拡張できない」「メソッド呼び出しのオーバーヘッドが増える」「型が変わってしまう」などを解決しています。

カテゴリは Obejctive-C が、クラスへメソッドの動的な追加ができるようになっているために使用可能になっています。

Objective-C のオープンソースライブラリなどでは、文字列操作用のライブラリの場合、「StringUtils」などのクラスを作るのではなく、NSString をカテゴリで拡張しているのが多く見られます。

カテゴリで既存のクラスを拡張した場合のファイル命名規則は「既存のクラス名＋"+"＋カテゴリ名」が一般的です。 


<strong>サンプル：文字列から空白文字を除去するための機能を NSString に追加する</strong>

XML や JSON の安全なパースの際には空白文字（や、改行文字）を除去します。

<pre><code>// NSString+TrimWhiteSpace.h
@interface NSString (TrimWhiteSpace)
- (NSString *) stringByTrimmingWhitespace;
@end</code></pre>

<pre><code>// NSString+TrimWhiteSpace.m
#import “NSString+TrimWhiteSpace.h”
@implementation NSString (TrimWhiteSpace)
- (NSString *) stringByTrimmingWhitespace
{
	return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
}
@end</code></pre>

使用方法

<pre><code>NSString *original = @”Hello World”;
NSString *trimmed = [original stringByTrimmingWhitespace];</code></pre>


この機能は使用しているコードがスマートになるので、 ActionScript にもほしいと思ってしまいます。 AS2 ならば prototype とかで MovieClip に独自プロパティとか独自メソッドを追加できたものですが。

参考：Categories: Modifying Existing Classes in Objective-C | NumberGrinder
<a href="http://www.numbergrinder.com/node/40" target="_blank">http://www.numbergrinder.com/node/40</a>]]>
   </content>
</entry>
<entry>
   <title>Flash CS4 で Flex SDK (mx パッケージ、クラス) を使う</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000186.php" />
   <id>tag:feb19.jp,2009:/blog//1.186</id>
   
   <published>2009-12-09T01:11:40Z</published>
   <updated>2009-12-09T04:37:39Z</updated>
   
   <summary> Flex 用のライブラリとかを見ると mx パッケージとか使われてい...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="147" label="cs4" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="144" label="flex sdk" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="Flash CS4 で Flex SDK (mx パッケージ、クラス) を使う" src="http://feb19.jp/blog/images/image108.jpg" width="400" height="100" />

Flex 用のライブラリとかを見ると mx パッケージとか使われていたりするので、そんなときは Flex SDK を Flash CS4 に設定すれば使えるようになる。]]>
      <![CDATA[環境をリフレッシュして、久しぶりに設定しようとしたらやり方を忘れていたのでメモ。


<strong>やり方1 .fla ファイルからの相対パス</strong>

Flex SDK を<a href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=flex3sdk" target="_blank">ここから</a>落としてくる。
All platforms, English | 120 MB ってやつ。

Flash の ActionScript 3.0 設定をこんな感じで設定。
ここでは .fla ファイルからの相対パスで Flex SDK フォルダの中の frameworks/libs ディレクトリを指定。

<img alt="相対パス" src="http://feb19.jp/blog/images/image108a.png" />

<pre><code>./flex_sdk_3/frameworks/libs</code></pre>


<strong>やり方2 Flash CS4 に設定</strong>

またはどの fla ファイルでも適用されているようにするにはこんな感じ。
Flash の環境設定を開き、「ActionScript」カテゴリーの中の「ActionScript 3.0 設定」ボタンを押すと下のウィンドウが開くので、「ライブラリパス」を絶対パスで指定。

<img alt="絶対パス" src="http://feb19.jp/blog/images/image108b.png" />


例えば Macintosh HD 直下においていたら、

<pre><code>/flex_sdk_3/frameworks/libs</code></pre>

とかになります。

---

以上で、強力な <a href="http://livedocs.adobe.com/flex/3_jp/langref/index.html" target="_blank">mx パッケージ</a>を使えるようになります。

とはいえ、mx.controls.DataGrid とかが使えるわけではないので、あんまり Flex らしいことはできないのだけど。。。(fl.controls が Flash には元々あるしね)
Validation 系のクラスは便利かも。（使った事ないけど）


以前 UIDUtil とかは使いました。擬似的なユニークIDが作れます。

<strong>mx.utils.UIDUtil でユニーク ID を生成する</strong>

<pre><code>import mx.utils.UIDUtil;
trace(UIDUtil.createUID());	//出力：5683E592-DBB5-6FFC-F5EE-6EB1AB7204F3</code></pre>


Web API やその他ウェブで配布されているライブラリは Flex 用とかいうのが多いので、Flash CS4 をお持ちの方は導入しておくと良い事あると思います。

<a href="http://feb19.jp/blog/archives/000158.php">メタデータを使うこともできるようになりますし</a>。
]]>
   </content>
</entry>
<entry>
   <title>Flash CS5 を予習　～Text Layout Framework (TLF) 編～</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000185.php" />
   <id>tag:feb19.jp,2009:/blog//1.185</id>
   
   <published>2009-11-18T02:47:29Z</published>
   <updated>2009-11-18T03:07:35Z</updated>
   
   <summary> Text Layout Framework (TLF) を使って、F...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="187" label="TLF" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="89" label="as3" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="179" label="cs5" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="141" label="player 10" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="189" label="text layout framework" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="Flash CS5 を予習　～Text Layout Framework (TLF) 編～" src="http://feb19.jp/blog/images/image107.jpg" width="400" height="100" />

Text Layout Framework (TLF) を使って、Flash コンテンツのテキストを縦書きにします。

先日縦組みレイアウトのブログサイトで初めて素敵なデザインのサイト「<a href="http://macromarionette.com/" target="_blank">macromarionette</a>」さんを見つけました。Flash Player 10 から導入された Flash Text Engine (FTE)。これをより使いやすくするためのフレームワーク <a href="http://labs.adobe.com/technologies/textlayout/" target="_blank">Text Layout Framework (TLF) ベータ版</a>がアドビから提供されたので、これを利用されているそうです。TLF は <a href="http://labs.adobe.com/technologies/flashcs5/" target="_blank">Flash CS5</a> から正式に組み込まれるので、正式版で仕様や方式が変わっている/追加されていることは大いにありえるのですが、面白そうなので予習として勉強開始＆メモ。]]>
      <![CDATA[もう少しで Flash CS5 public beta が出るそうですが、とりあえず今でもできる予習として、 Flash CS4 と Text Layout Framework (TLF) で縦書きの文字組みを作ってみます。

<strong>Flash CS4 編</strong>

<img alt="Flash CS4 で Text Layout コンポーネントを使って縦書きに" src="http://feb19.jp/blog/images/image107a.jpg" width="400" height="100" />

1. <a href="http://labs.adobe.com/downloads/textlayout.html" target="_blank">TextLayoutFramework beta を Adobe Lab からダウンロード</a>。
　※：学習用に Text Layout Component Examples というサンプルファイルもダウンロードしましょう。
2. Extension Manager CS4 でインストール。
3. Flash CS4 を開いて Flash ドキュメント作成。
4. コンポーネントパネルの「標準コンポーネント」Text Layout をステージにドラッグ。
　
<img alt="Text Layout コンポーネント" src="http://feb19.jp/blog/images/image107b.jpg" width="208" height="100" />
　
5. 「TextLayout Sample Text.」と書かれた Text Layout インスタンスが配置される。
6. Window > その他のパネル > Text Layout パネルを開く。

<img alt="Text Layout パネル" src="http://feb19.jp/blog/images/image107c.jpg" width="400" height="243" />

7. 配置したインスタンスを選択したまま、パネル左下「Get from Stage」ボタンを押してステージのインスタンスを同期する。
8. テキストエリアに何か適当に書いた後、「Send to Stage」すると、ステージのインスタンスに編集が反映される。
9. テキストを選択した状態で、パネル右側の操作パネルで色々設定できる。
10. CHARATER の Font を 小塚明朝、 Size を 18、Leading を 200%。Paragraph の Alignment を一番右のアイコン：均等揃え、Just.Rule を East Asian、 ADVANCED CHARACTER の Local を JAPANESE 、Dominant Baseline を Ideographic Center か Ideographic Bottom。そして FLOW の Orientation を Vertical という感じで設定していくと、結構いい感じに。

で、その<a href="http://feb19.jp/blog/swf/TLFTest1.html">完成サンプルはこちら</a>。

「/」（半角スラッシュ）は使わないとか、段落の頭は一文字下げるとかの基本も押さえていけば、よりいい感じになっていきそうです。

ただ操作性はまだイマイチ。ルビが振れないのは正直ガッカリ。CS5 で乗るとされる正式版に期待です。


<strong>Action Script 3.0 編　I　とりあえず表示</strong>

<img alt="AS3 で Text Layout Framework" src="http://feb19.jp/blog/images/image107d.jpg" width="400" height="100" />

AS からも制御可能。HTML でつかう &lt;body&gt; や &lt;p&gt; 、&lt;span&gt; などと同じようなイメージでテキストを階層構造化していくことで文章にします。

&lt;body&gt; は TextFlow インスタンス、 &lt;p&gt; は ParagraphElement インスタンス、 &lt;span&gt; は SpanElement インスタンスに置き換えて、上位のインスタンス（TextFlow）に下位のインスタンス（ParagraphElement、SpanElement）を addChild() することで指定できます。

テキストを入れていったら、TextFlow.flowComposer.addController() で DisplayObejctContainer のツリーに参加させて、TextFlow.flowComposer.updateAllContainers() で内容を更新します。

<pre><code>import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.elements.ParagraphElement;
import flashx.textLayout.elements.SpanElement;
import flashx.textLayout.container.DisplayObjectContainerController;
 
var tf:TextFlow = new TextFlow();
var p:ParagraphElement = new ParagraphElement();
var span:SpanElement = new SpanElement();
span.text = "ハロー、ワールド。";
tf.addChild(p);
p.addChild(span);
tf.flowComposer.addController(new DisplayObjectContainerController(this, 240, 400));
tf.flowComposer.updateAllContainers();</code></pre>

<a href="http://feb19.jp/blog/swf/TLFTest2.html">実行結果</a>。

flashx.textLayout パッケージを使うには CS4 にインストールした、TextLayoutComponent（コンポーネントパネルの「標準コンポーネント」Text Layout）を実行する .fla のライブラリにドラッグアンドドロップすることで使えるようになります。


<strong>Action Script 3.0 編　II　縦組みにする</strong>

<img alt="AS3 で Text Layout Framework その2" src="http://feb19.jp/blog/images/image107e.jpg" width="400" height="100" />

上の Flash CS4 上で作成したサンプルでは、「<a href="http://help.adobe.com/en_US/Flex/4.0/langref/flashx/textLayout/elements/FlowElement.html#blockProgression" target="_blank">縦書き</a>」「<a href="http://help.adobe.com/en_US/Flex/4.0/langref/flashx/textLayout/elements/FlowElement.html#locale" target="_blank">日本語禁則処理</a>」「<a href="http://help.adobe.com/en_US/Flex/4.0/langref/flashx/textLayout/elements/FlowElement.html#textAlign" target="_blank">均等揃え</a>」「<a href="http://help.adobe.com/en_US/Flex/4.0/langref/flashx/textLayout/elements/FlowElement.html#dominantBaseline" target="_blank">英語/日本語ベースライン揃え</a>」などを使用しています。これらは formats パッケージなどに用意されている定義クラスを用いることで実現できます。

というわけで、上の Flash CS4 で作った文字組サンプルを再現してみます。

<pre><code>import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.elements.ParagraphElement;
import flashx.textLayout.elements.SpanElement;
import flashx.textLayout.container.DisplayObjectContainerController;
 
import flashx.textLayout.edit.SelectionManager;
import flashx.textLayout.formats.BlockProgression;
import flashx.textLayout.formats.Direction;
import flashx.textLayout.formats.JustificationRule;
import flashx.textLayout.formats.TextAlign;
import flashx.textLayout.formats.VerticalAlign;
import flash.text.engine.TextBaseline;
 
var tf:TextFlow = new TextFlow();
 
tf.color = 0x212121;
tf.fontSize = 18;
tf.fontFamily = "Kozuka Mincho Pro R, Hiragino Mincho Pro W3, MS Mincho, _明朝, _serif";
tf.lineHeight = "200%";
tf.locale = "ja";	// japanese
tf.direction = Direction.LTR;
tf.dominantBaseline = TextBaseline.IDEOGRAPHIC_BOTTOM;
tf.blockProgression  = BlockProgression.RL;
tf.justificationRule = JustificationRule.EAST_ASIAN;
tf.interactionManager = new SelectionManager();
tf.textAlign = TextAlign.JUSTIFY;
tf.textAlignLast = TextAlign.LEFT;
tf.paddingRight = 5;
tf.paddingTop = 5;
tf.paddingLeft = 5;
tf.paddingBottom = 5;
 
var p:ParagraphElement = new ParagraphElement();
var span:SpanElement = new SpanElement();
span.text = "先日縦組みレイアウトのブログサイトで初めて素敵なデザインのサイト「macromarionette」さんを見つけました。Flash Player 10 から導入された Flash Text Engine (FTE)。これをより使いやすくするためのフレームワーク Text Layout Framework (TLF) ベータ版がアドビから提供されたので、これを利用されているそうです。TLF は Flash CS5 から正式に組み込まれるので、正式版で仕様や方式が変わっている/追加されていることは大いにありえるのですが、面白そうなので予習として勉強開始＆メモ。";
tf.addChild(p);
p.addChild(span);
 
tf.flowComposer.addController(new DisplayObjectContainerController(this, 550, 400));
tf.flowComposer.updateAllContainers();</pre></code>

<a href="http://feb19.jp/blog/swf/TLFTest3.html">実行結果</a>。上の Flash CS4 で作ったサンプルと違いはなさそうですね。

ちなみに文字組みをやってらっしゃる方には当然のお話ですが、縦書きで日本語と英語が混じった文だと、デフォルトではベースラインがずれているので、調整は必須です。（dominantBaseline プロパティを調整）

ルビについては基本的に振ることは出来ませんが、メインの TextFlow と別の TextFlow を使って、うまいことやったらできるのかなと思います。

というわけで<a href="http://feb19.jp/blog/swf/TLFTest.zip">今回のサンプル詰め合わせ（zip）</a>。縦書きスキーとしては TLF が広まって、さらなる進化と今後に期待なのです。とりあえずルビお願いします。ルビ。

参考：
<a href="http://help.adobe.com/en_US/Flex/4.0/langref/flashx/textLayout/elements/TextFlow.html" target="_blank">TextFlow - AdobeR FlexR 4 Beta Language Reference</a>
<a href="http://macromarionette.com/" target="_blank">macromarionette</a>]]>
   </content>
</entry>
<entry>
   <title>iPhone Core Audio プログラミング読んだー</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000184.php" />
   <id>tag:feb19.jp,2009:/blog//1.184</id>
   
   <published>2009-11-17T14:24:36Z</published>
   <updated>2009-11-17T14:37:30Z</updated>
   
   <summary> iPhone Core Audio プログラミングを読み終えました。...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="51" label="book" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="173" label="c" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="185" label="core audio" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="175" label="iphone" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="172" label="objective-c" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<a href="http://www.amazon.co.jp/gp/product/4797355158?ie=UTF8&tag=slog0e-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4797355158"><img alt="iPhone Core Audio プログラミング読んだー" src="http://feb19.jp/blog/images/image106.jpg" width="400" height="100" /></a><img src="http://www.assoc-amazon.jp/e/ir?t=slog0e-22&l=as2&o=9&a=4797355158" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

iPhone Core Audio プログラミングを読み終えました。 iPhone オーディオプログラミングの全てといっても過言ではない内容が詰まった本書。間違いなく iPhone アプリ制作者必読の書です。ちなみに C 言語、Objective-C の知識は多少必要です。]]>
      <![CDATA[iPhone で Core Audio かつ日本語のリソースは希少ですし、今までそれらは分散していたので概要や仕組み、API 同士の繋がりが掴みづらく、まさにこの本は待ちに待った！という感じでした。

<a href="http://www.amazon.co.jp/gp/product/4797355158?ie=UTF8&tag=slog0e-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4797355158"><img alt="Audio Processing という帯が異常にワクワクさせる" src="http://feb19.jp/blog/images/image106a.jpg" width="400" height="268" /></a><img src="http://www.assoc-amazon.jp/e/ir?t=slog0e-22&l=as2&o=9&a=4797355158" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

読み進めていくと、随所随所でオーディオプログラミングの基本、サウンドファイルフォーマット、リニアPCM、デシベル、音階、サイン波、音声合成、FM シンセ、FFT などの解説があり、オーディオプロセッシング（オーディオ信号処理）の学習にもなります。

<a href="http://www.amazon.co.jp/gp/product/4797355158?ie=UTF8&tag=slog0e-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4797355158"><img alt="Remote IO も図説で分かりやすく" src="http://feb19.jp/blog/images/image106b.jpg" width="400" height="200" /></a><img src="http://www.assoc-amazon.jp/e/ir?t=slog0e-22&l=as2&o=9&a=4797355158" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

オーディオプログラミングというと、シンセサイザーとか、エフェクター、楽器アプリ作りとかそういうイメージになりがちですが、基本的にはiPhone Core Audio の仕組みと API 解説が主。

iPhone と音にはさまざまな作法があり、とくに Audio Session は、音を扱うアプリならどのアプリにもかかわってくる作法になっているので、ほぼすべての iPhone アプリ製作者にとって必読といえます。

<a href="http://www.amazon.co.jp/gp/product/4797355158?ie=UTF8&tag=slog0e-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4797355158"><img alt="もはや教科書です" src="http://feb19.jp/blog/images/image106c.jpg" width="400" height="200" /></a><img src="http://www.assoc-amazon.jp/e/ir?t=slog0e-22&l=as2&o=9&a=4797355158" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

文章による解説がほとんどなので、時間をちゃんと取ってサンプルと見比べながらじっくり読み進めていく覚悟は必要かもしれませんが、iPhone OS API のバグとそのパターン、回避方法が事細かに解説されており、非常に実践的で、捨てるところのない内容です。著者の永野さんは非常によく研究されていると思います。

しかしほんと C 言語での操作のめんどくささは半端ないですね。ActionScript とか Objective-C がなんと楽なことか・・・。普通に第七引数とかを持つ関数がわんさか・・・。

<a href="http://www.amazon.co.jp/gp/product/4797355158?ie=UTF8&tag=slog0e-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4797355158"><img alt="iPhone テルミン" src="http://feb19.jp/blog/images/image106d.jpg" width="400" height="200" /></a><img src="http://www.assoc-amazon.jp/e/ir?t=slog0e-22&l=as2&o=9&a=4797355158" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

サンプルもスキンを乗せれば普通に有料アプリとして販売できそうなレベル。日本のアプリストアでテルミンや FM シンセがちょとはやりそうな予感。

<a href="http://www.amazon.co.jp/gp/product/4797355158?ie=UTF8&tag=slog0e-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4797355158"><img alt="iPhone Core Audio Programming" src="http://feb19.jp/blog/images/image106e.jpg" width="400" height="268" /></a><img src="http://www.assoc-amazon.jp/e/ir?t=slog0e-22&l=as2&o=9&a=4797355158" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

という感じでした。永野さん曰く名書「<a href="http://www.amazon.co.jp/gp/product/4797346809?ie=UTF8&tag=slog0e-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4797346809">詳解 Objective-C 2.0</a><img src="http://www.assoc-amazon.jp/e/ir?t=slog0e-22&l=as2&o=9&a=4797346809" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」を目指したとのことですが、実際素晴らしい内容です。しばらく手放せません。

iPhone OS は Mac OS X との共有部分も多いため、 Mac OS X オーディオプログラミングの基礎固めにもなった気がします。というわけで「Mac Core Audio プログラミング」も書いてほしー。

---

ちなみに僕の iPhone SDK オススメ書籍一覧のページは<a href="http://astore.amazon.co.jp/slog0e-22?_encoding=UTF8&node=18" target="_blank">こちら</a>。

入門、初級、中級、上級としてみました。
]]>
   </content>
</entry>
<entry>
   <title>Mac OS X 10.6 Snow Leopard で HP Photosmart C4380 を設定する</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000183.php" />
   <id>tag:feb19.jp,2009:/blog//1.183</id>
   
   <published>2009-10-28T02:58:10Z</published>
   <updated>2009-10-28T03:09:13Z</updated>
   
   <summary> Mac に Mac OS X 10.6 Snow Leopard ク...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="158" label="hp" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="101" label="mac" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="159" label="printer" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="183" label="snow leopard" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="Mac OS X 10.6 Snow Leopard で HP Photosmart C4380 を設定する" src="http://feb19.jp/blog/images/image105.jpg" width="400" height="100" />

Mac に Mac OS X 10.6 Snow Leopard クリーンインストールしたり、Snow Leopard インストール時にデフォルトでインストールされる各種プリンタドライバをインストールのチェックを解除していたり、AirMac Express のパスワードを変更していたり、様々な要因でプリンタのセットアップで（とくに無線接続：Bonjour）戸惑ったのでメモ。]]>
      <![CDATA[やったこと一覧

・<a href="http://support.apple.com/downloads/HP_Printer_Drivers_for_Mac_OS_X_v10_6">Apple が提供する Snow Leopard 用 HP プリンタのドライバをダウンロード</a>してインストール。
　システム環境設定からプリンタドライバを設定できるようになる。

・USB でつないで、システム環境設定＞プリントとファクスから、ウィンドウ左下の「＋」マークをクリックし、つないでいるプリンタ選択して「追加」する。

無線で接続する場合、以下。（ここでつまずいた）

・USB でつないだまま、HP が提供する <a href="http://h10025.www1.hp.com/ewfrf/wc/softwareDownloadIndex?softwareitem=mp-55604-3&lc=ja&dlc=ja&cc=jp&os=219&product=3221646" target="_blank">Mac OS X 10.5 用「プリンタドライバ」</a>をダウンロードして実行。
　HP のサイトでは、「<a href="http://h10025.www1.hp.com/ewfrf/wc/document?docname=c01879959&tmp_track_link=ot_faqs/top_issues/ja_jp/c01879959/loc:4&lc=ja&dlc=ja&cc=jp&product=3221646#N908" target="_blank">10.5 用ドライバはインストールするな</a>」という表記ですが、 その後に「無線のネットワークに接続して使用する場合」とかかれているように、インストーラーが必要です（最初しか読んでなくて、インストールしてはいけないものだと勘違いしてた）。
　無線接続の設定用ユーティリティアプリをインストールするためでもあります。これを実行し、セットアップウィザード中で、「ワイヤレスネットワーク設定の構成」をチェックして進むと設定ができます。

　AirMac の設定を変更（WEP パスワードを再設定）する際は、Bonjour （無線）接続の場合、C4380 の中で記憶している無線 LAN の設定をかえる必要があります。そのときにここでインストールする「HP セットアップアシスタント」を利用します。

・最後に、Bonjour 設定でプリンタをセットアップする。
　システム環境設定＞プリントとファクスから、USB 接続したときに追加したデバイスの設定をいったん削除し、また「＋」マークをクリックし、Bonjour の C4380 を選択し、「追加する」。

今はこの方法で大丈夫だけど、 HP のソフトが提供されなくなったり、新しい環境に対応しなくなったりすることもあると思うので、Apple と各種プリンタメーカーでもう少しスマートにできるよう、協力し合っていただきたいところであります。（あと HP のサポートページ、わかりづらいからリニューアルしてください。「補足」ばっかりじゃないの。整理してください。。）]]>
   </content>
</entry>
<entry>
   <title>AS3 で Flash コンテンツに YouTube Player を埋め込む</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000182.php" />
   <id>tag:feb19.jp,2009:/blog//1.182</id>
   
   <published>2009-10-16T09:23:17Z</published>
   <updated>2009-10-16T09:33:26Z</updated>
   
   <summary> AS3 用の Google 公式 YouTube 埋め込みプレイヤー...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="89" label="as3" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="135" label="youtube" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="AS3 で Flash コンテンツに YouTube Player を埋め込む" src="http://feb19.jp/blog/images/image104.jpg" width="400" height="100" />

AS3 用の Google 公式 YouTube 埋め込みプレイヤー API が公開されました。いままでは AVM1 用プレイヤーか、JavaScript 経由で操作するクロムレスプレイヤーしか無かったので、これでかなり簡単に Flash サイト内で YouTube プレイヤーを埋め込むことができるようになりました。ただし Flash Player 10 以上。（一応 Player 9 でも動くけどエラー出ます）]]>
      <![CDATA[とりあえず動くサンプルをごらんください。<a href="http://feb19.jp/blog/swf/EmbedYoutubePlayerTest.html" target="_blank">EmbedYoutubePlayerTest.html</a>。

Flash Player 10 用にパブリッシュされた、専用 YouTube プレイヤー SWF（http://www.youtube.com/apiplayer?version=3）をロードして、初期化（Event.INIT → "onReady" 後）再生用ファンクションをコールするだけのお手軽仕様。

YouTube ActionScript 3.0 Player API Reference - YouTube APIs and Tools - Google Code
<a href="http://code.google.com/intl/en/apis/youtube/flash_api_reference.html" target="_blank">http://code.google.com/intl/en/apis/youtube/flash_api_reference.html</a>

再生用ファンクションは自動再生するかどうかと、ビデオ ID を指定するか URL を指定するかで、合計四種類あります。

指定する映像のサムネイルをロードし、映像再生の準備をする（スタートボタンが画面中央に表示したまま停止する）ファンクション。

<pre><code>// Video ID を指定
player.cueVideoById(videoId:String, startSeconds:Number, suggestedQuality:String):Void</code></pre>

<pre><code>// URL を指定
player.cueVideoByUrl(mediaContentUrl:String, startSeconds:Number):Void</pre></code>

指定する映像をロードして自動的に再生開始するファンクション。

<pre><code>// Video ID を指定
player.loadVideoById(videoId:String, startSeconds:Number, suggestedQuality:String):Void</pre></code>

<pre><code>// URL を指定
player.loadVideoByUrl(mediaContentUrl:String, startSeconds:Number):Void</pre></code>


というわけで上記サンプルのソース。

<pre><code>package 
{
	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.net.URLRequest;
	import flash.system.Security;
	
	/**
	 * Embded YouTube Player Test
	 */
	public class EmbedYoutubePlayerTest extends MovieClip
	{
		private var _youtubePlayer:Object;
		
		public function EmbedYoutubePlayerTest()
		{
			Security.allowDomain("*");
			
			var loader:Loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
			loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3"));
		}
		private function initHandler(event:Event):void
		{
			_youtubePlayer = Loader(LoaderInfo(event.currentTarget).loader).content as Object;
			addChild(_youtubePlayer as DisplayObject);
			_youtubePlayer.addEventListener("onReady", onReadyHandler);
			_youtubePlayer.addEventListener("onError", onErrorHandler);
			_youtubePlayer.addEventListener("onStateChange", onStateChangeHandler);
			_youtubePlayer.addEventListener("onPlaybackQualityChange", onPlaybackQualityChangeHandler);
		}
		
		private function onReadyHandler(event:Event):void
		{
			trace("ready", Object(event).data);
			_youtubePlayer.setSize(320, 240);
			
			// キューする（スタートボタンが画面中央に表示したまま停止）
			//_youtubePlayer.cueVideoById("6hzrDeceEKc");
			
			// すぐさまロードして自動再生
			_youtubePlayer.loadVideoById("6hzrDeceEKc");
		}
		private function onErrorHandler(event:Event):void
		{
			// error 150 となる場合は、指定した映像が「埋め込み拒否」されている。（どうしようもない）
			trace("error", Object(event).data);
		}
		private function onStateChangeHandler(event:Event):void
		{
			// state -1 未スタート（SWFが読み込まれたときは -1 の onStateChange イベントが発行される）
			// state 0 終了
			// state 1 再生中
			// state 2 一時停止
			// state 3 バッファリング中
			// state 5 停止（SWF が読み込まれ、キューに追加されて、再生可能になったら 5 の onStateChange イベントが発行される）
			trace("state", Object(event).data);
		}
		private function onPlaybackQualityChangeHandler(event:Event):void
		{
			// クオリティを変更した場合
			trace("quality", Object(event).data);
		}
	}
	
}</code></pre>

<a href="http://code.google.com/intl/en/apis/youtube/flash_api_reference.html" target="_blank">公式ページ</a>ではより詳しく解説していますので、要熟読。
コントローラー（再生ボタンやシークバー）を作るときは player.playVideo() や player.seekTo(seconds, allowSeekAhead) をコールするわけですね。

昔作ったサイトでは AVM1 用のクロムレスプレイヤーを JavaScript で操作するというかなりめんどくさくてクセがあった方法じゃないと埋め込めなかったので、いい時代になったなぁとしみじみ。]]>
   </content>
</entry>
<entry>
   <title>AS3 で SWFAddress 2.4 を使う ( Flash でブラウザの戻るボタン、パーマリンクに対応する )</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000181.php" />
   <id>tag:feb19.jp,2009:/blog//1.181</id>
   
   <published>2009-10-09T02:28:54Z</published>
   <updated>2009-10-09T02:59:29Z</updated>
   
   <summary> Flash サイトのページ内で移動すると、ブラウザの戻るボタンが聞か...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="181" label="SWFAddress" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="89" label="as3" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="61" label="javascript" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="AS3 で SWFAddress 2.4 を使う ( Flash でブラウザの戻るボタン、パーマリンクに対応する )" src="http://feb19.jp/blog/images/image103.jpg" width="400" height="100" />

Flash サイトのページ内で移動すると、ブラウザの戻るボタンが聞かないとか、直接あのページを紹介したいのにあのページの URL （パーマリンク）がないとかいう話はもはや過去。今は SWFAddress でフルフラッシュサイトの全ページにパーマリンクを貼って、戻るボタンやなんやらでサクサクみれるフル Flash は作れるようになっているのです。
そんな用途に使う ActionScript/JavaScript ライブラリ「SWFAddress」について。]]>
      <![CDATA[<strong>SWFAddress とは？</strong>

Flash と JavaScript が通信を行い、JavaScript がブラウザと「アドレス」や「タイトル」、「履歴」などのコミュニケーションをおこなうことで、 Flash がブラウザとコミュニケーションしているかのように見せる方法を提供する、 ActionScript/JavaScript ライブラリの名前。

ブルガリアのソフィアにある Asual DZZD （http://www.asual.com/）という会社がオープンソースかつ <a href="http://ja.wikipedia.org/wiki/MIT_License" target="_blank">MITLicence</a> で<a href="http://www.asual.com/swfaddress/" target="_blank">公開</a>しています（要は自由に使っていいけど自己責任で使ってね、あと SWFAddress のソース内にある僕の著作権表示は消さないでねライセンス）。

Flash 内でパーマリンクを設定したいページに遷移してきたときに、ActionScript で SWFAddress に値を設定すると、ブラウザのアドレスバーにパーマリンクが設定されている、という仕組み。<a href="http://www.asual.com/swfaddress/samples/flash/" target="_blank">SWFAddress 公式のサンプルがこちら</a>。

ただ僕は何でもかんでも SWFAddress を使うべきではないと思っています。それは IE だとページ遷移の「カチッ」という音が Flash サイトであるにも関わらず鳴るのが気持ち悪いというのもありますが、演出を要するようなサイトで、演出をすっとばして見れるようにする URL を用意すると言うのは、「映画の後半などの、ここだけ見ればいいというポイントへ直接飛べる」的な「便利にするが故に伝えるべきものが伝わらなくなる」ということになるかもしれないと思うからです。

ショッピングサイトや、サービス系のサイトで全てまたは大部分のページに用意するのは有りだと思います。しかし、物をエモーショナルに伝えるべきスペシャルサイトなどでは、特定のチェックポイントだけにしたり、いっその事全く対応しないでおいたり、広告戦略を含めたサイトの役割・立ち位置に応じて臨機応変に使い分ける事を熟考すべきだと思います。

（話の前半の「戻るボタンが効かない」（つまり戻るボタンに頼りたくなる）というのは、デザインやモーションに問題がある気がします。フローティングを開いたときに「閉じるボタン」が分かりにくいとか。（戻るボタン対応すればマウスジェスチャとか使えるというのはあるけど）クリエイターならそこのクオリティを上げて対応したいところ？）


<strong>AS3 で SWFAddress 2.4 を使う</strong>

ここからは Flasher （実装者）向けの話。SWFAddress を使う場合は <a href="http://progression.jp/" target="_blank">Progression</a> や <a href="http://www.gaiaflashframework.com/index.php" target="_blank">Gaia</a> とかフレームワークを使ったりする方が色々良いと言う話を聞きますが男なら自力で実装。（SWFAddress も自分で実装しろよというツッコミは NO THANK YOU）

今日現在は 2.4 が最新なので最新を利用。<a href="http://www.asual.com/swfaddress/" target="_blank">このページ</a>から SWFAddress をダウンロードして、解凍してできたフォルダの中の sample ディレクトリ内に各種サンプルがありますのでこれらを利用します。

今回は FlashPlayer9 以上、AS3 で作るので「cs3」フォルダから  SWF を表示する HTML と index.html と swfaddress フォルダ、 swfobject フォルダ、SWFAddress.as、SWFAddressEvent.as をどこか好きな場所にコピー。index.html に埋め込む SWF のファイル名を指定。 SWFAddress は SWFObject という JS で SWF を埋めこまなければなりません。

AS では SWFAddress.setValue() でパーマリンクを設定したり、 SWFAddress.getPathNames() などを使って遷移を分岐させていったりします。

<a href="http://feb19.jp/blog/swf/SWFAddressTest.html#/one?abc=1&unko=suteki" target="_blank">サンプル</a>。

<pre><code>SWFAddressTest.as
 
package 
{
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	
	import SWFAddress;
	import SWFAddressEvent;
	
	/**
	 * for SWFAddress 2.4
	 */
	public class SWFAddressTest extends MovieClip
	{
		private var _tf:TextField;
		private var _defaultTitle:String;
		
		public function SWFAddressTest()
		{
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			
			_tf = new TextField();
			addChild(_tf);
			_tf.multiline = true;
			_tf.autoSize = TextFieldAutoSize.LEFT;
			_tf.width = 200;
			_tf.height = stage.stageHeight;
			_tf.text = "";
			
			SWFAddress.addEventListener(SWFAddressEvent.INIT, initHandler);
		}
		
		private function setButtons():void
		{
			var names:Array = [
				"zero",
				"one",
				"two/2",
				"three/3/3",
				"four/4/4/4/",
				"popup()",
				"href()",
				"forward()",
				"back()",
				"up()",
				"go(-2)",
				"resetStatus()"
			];
			for (var i:int = 0; i &lt; names.length; i++)
			{
				var btn:Sprite = new Sprite();
				btn.buttonMode = true;
				btn.addEventListener(MouseEvent.CLICK, clickHandler);
				btn.graphics.beginFill(0x101226);
				btn.graphics.drawRect(0, 0, 100, 30);
				btn.name = names[i];
				addChild(btn);
				
				btn.x = stage.stageWidth - 120;
				btn.y = i * 40 + 20;
				
				var tfm:TextFormat = new TextFormat();
				tfm.color = 0xEFEDD9;
				var tf:TextField = new TextField();
				tf.defaultTextFormat = tfm;
				tf.selectable = false;
				tf.text = names[i];
				btn.addChild(tf);
			}
		}
		private function clickHandler(event:MouseEvent):void
		{
			var target:Sprite = Sprite(event.currentTarget);
			
			// クエリ文字列が setValue によって消えてしまうので、あればくっつける
			var queryString:String = ( SWFAddress.getQueryString() ) ? "?" + SWFAddress.getQueryString() : "";
			switch(target.name)
			{
				case "zero":
				case "one":
				case "two/2":
				case "three/3/3":
				case "four/4/4/4/":
					SWFAddress.setValue(target.name + queryString);
					break;
				
				case "popup()":
					tracer("------------------");
					tracer("ポップアップウィンドウ起動（option値＝ width=320, height=230, scrollbar=NO）");
					tracer("正直動く気がしない");
					SWFAddress.popup("http://feb19.jp/blog/archives/000181.php", "popup", "width=320, height=230, scrollbars=NO");
					break;
				case "href()":
					tracer("------------------");
					tracer("_target でリンク");
					SWFAddress.href("http://feb19.jp/blog/archives/000181.php", "_target");
					break;
				case "forward()":
					tracer("------------------");
					tracer("SWFAddress の履歴を一つ進む");
					SWFAddress.forward();
					break;
				case "back()":
					tracer("------------------");
					tracer("SWFAddress の履歴を一つ戻る");
					SWFAddress.back();
					break;
				case "up()":
					tracer("------------------");
					tracer("SWFAddress の階層を一つ上がる");
					SWFAddress.up();
					break;
				case "go(-2)":
					tracer("------------------");
					tracer("SWFAddress の履歴を2つ戻る（引数に 1 を指定すると 1 つ進み、-3 を指定すると 3 つ戻る）");
					tracer("履歴が 1 しか残っていなくて、2 つ戻るを指定すると戻らない");
					SWFAddress.go(-2);
					break;
				case "resetStatus()":
					tracer("------------------");
					tracer("top.document.status = \"\"; を実行（ステータスバーをクリア）");
					SWFAddress.resetStatus();
					break;
			}
		}
		
		private function tracer(value:*):void
		{
			if (value is String)
				_tf.text = value + "\n" + _tf.text;
			else
				_tf.text = value.toString() + "\n" + _tf.text;
		}
		
		private function initHandler(event:SWFAddressEvent):void
		{
			SWFAddress.removeEventListener(SWFAddressEvent.INIT, initHandler);
			
			tracer("------------------");
			tracer("parameterNames: " + event.parameterNames);
			tracer("parameters: " + event.parameters);
			tracer("path: " + event.path);
			tracer("pathNames: " + event.pathNames);
			tracer("target: " + event.target);
			tracer("type: " + event.type);
			tracer("value: " + event.value);
			
			tracer("------------------");
			// SWF を呼び出す HTML の URL を取得
			tracer("getBaseURL: " + SWFAddress.getBaseURL());
			// 履歴をセットするか
			tracer("getHistory: " + SWFAddress.getHistory());
			// クエリ文字列にあるキー名を引数で指定するとその値がとれる。
			// クエリ文字列とは URL の後ろにつくことがある「?」以降の文字列。
			// ?abc=1&unko=suteki というような感じ。
			// この場合は unko キーの値「suteki」を取得できる。
			tracer("getParameter: " + SWFAddress.getParameter("unko"));
			// クエリ文字列のキー名一覧を配列で取得する。
			tracer("getParameterNames: " + SWFAddress.getParameterNames());
			// SWFAddress の path 文字列（#以降の文字列）を取得する。クエリ文字列は無視する。
			tracer("getPath: " + SWFAddress.getPath());
			// SWFAddress の path を配列で取得（「/」を区切りにして配列に格納してくれる）
			// 個人的にはアドレスの判別はこれを使うのが便利かつシンプルな気がします。
			// クエリ文字列は無視する。
			tracer("getPathNames: " + SWFAddress.getPathNames());
			// クエリ文字列の取得。（「?」以降の文字列）
			tracer("getQueryString: " + SWFAddress.getQueryString());
			// ステータスバーの値を取得。
			tracer("getStatus: " + SWFAddress.getStatus());
			// SWFAddress 文字列（SWFAddressEvent.value）の先頭に「/」がつくか
			tracer("getStrict: " + SWFAddress.getStrict());
			// ページのタイトルを取得する。
			tracer("getTitle: " + SWFAddress.getTitle());
			// ページ遷移中にトラッキングする際呼び出す関数 初期値は urchinTracker 
			tracer("getTracker: " + SWFAddress.getTracker());
			// #以降の文字列。クエリ文字列も含む。
			tracer("getValue: " + SWFAddress.getValue());
			_defaultTitle = SWFAddress.getTitle();
			
			setButtons();
			
			SWFAddress.addEventListener(SWFAddressEvent.CHANGE, changeHandler);
			SWFAddress.addEventListener(SWFAddressEvent.EXTERNAL_CHANGE, externalChangeHandler);
			SWFAddress.addEventListener(SWFAddressEvent.INTERNAL_CHANGE, internalChangeHandler);
		}
		
		private function changeHandler(event:SWFAddressEvent):void
		{
			tracer("------------------");
			// パラメータのキー名一覧を配列で取得
			tracer("parameterNames: " + event.parameterNames);
			// パラメータ全てを連想配列（Object 型）で取得
			tracer("parameters: " + event.parameters);
			// SWFAddress の path 文字列（#以降の文字列）を取得する。クエリ文字列は無視。
			tracer("path: " + event.path);
			// SWFAddress の path を配列で取得（「/」を区切りにして配列に格納してくれる）。
			tracer("pathNames: " + event.pathNames);
			tracer("target: " + event.target);
			tracer("type: " + event.type);
			tracer("value: " + event.value);
			
			// .pathNames[0] の値がどうかでウィンドウタイトルを変更する
			switch(event.pathNames[0])
			{
				case "zero":	SWFAddress.setTitle( _defaultTitle + " - Content 0" );	break;
				case "one":	SWFAddress.setTitle( _defaultTitle + " - Content 1" );	break;
				case "two":	SWFAddress.setTitle( _defaultTitle + " - Content 2" );	break;
				case "three":	SWFAddress.setTitle( _defaultTitle + " - Content 3" );	break;
				case "four":	SWFAddress.setTitle( _defaultTitle + " - Content 4" );	break;
				default:	SWFAddress.setTitle( _defaultTitle + " - Content Unknown" );
			}
		}
		
		private function externalChangeHandler(event:SWFAddressEvent):void
		{
			tracer("------------------");
			// パラメータのキー名一覧を配列で取得
			tracer("parameterNames: " + event.parameterNames);
			// パラメータ全てを連想配列（Object 型）で取得
			tracer("parameters: " + event.parameters);
			// SWFAddress の path 文字列（#以降の文字列）を取得する。クエリ文字列は無視。
			tracer("path: " + event.path);
			// SWFAddress の path を配列で取得（「/」を区切りにして配列に格納してくれる）。
			tracer("pathNames: " + event.pathNames);
			tracer("target: " + event.target);
			tracer("type: " + event.type);
			tracer("value: " + event.value);
		}
		
		private function internalChangeHandler(event:SWFAddressEvent):void
		{
			tracer("------------------");
			// パラメータのキー名一覧を配列で取得
			tracer("parameterNames: " + event.parameterNames);
			// パラメータ全てを連想配列（Object 型）で取得
			tracer("parameters: " + event.parameters);
			// SWFAddress の path 文字列（#以降の文字列）を取得する。クエリ文字列は無視。
			tracer("path: " + event.path);
			// SWFAddress の path を配列で取得（「/」を区切りにして配列に格納してくれる）。
			tracer("pathNames: " + event.pathNames);
			tracer("target: " + event.target);
			tracer("type: " + event.type);
			tracer("value: " + event.value);
		}
	}
	
}</code></pre>

SWFAddressEvent.INIT 後に getQueryString などをしないとエラーになったりするので（未初期化のため）、SWFAddress の操作は INIT 後から。

SWFAddressEvent.CHANGE イベントで、SWFAddress.setValue() した瞬間（INTERNAL_CHANGE）や、ブラウザで戻るボタンが押されたり、アドレスバーが変更された瞬間（EXTERNAL_CHANGE）を監視し、そのイベントハンドラで遷移を実装していきます。<a href="http://feb19.jp/blog/archives/000180.php">最新版の 2.4 から INTERNAL_CHANGE や EXTERNAL_CHANGE を取る事ができるようになりました</a>。

サンプルでは switch case で分岐して、ブラウザのタイトルを変更してみています。

ちなみにサンプルを触って気づいたと思いますが、 SWFAddress にはアドレスを操作するだけではなく、ブラウザの各種機能を使う機能が用意されていますが、現時点では SWFAddres.popup() は挙動がおかしいですし（<a href="http://feb19.jp/blog/archives/000172.php">Flash からポップアップウィンドウだすならこちら</a>）、ステータスバー関連もやや怪しいです。

現状アドレスの操作以外では、クエリ文字列（URL に付くことがある「?」以降の文字列）操作や、タイトルの操作ぐらいにとどめておいた方が良さそう。トラッカーもちょっと古い。

以上、現時点で SWFAddress を使う場合のメモでした。Flasher 以外も最近は覚えておくべきかと思って前半はちょっと普段より比較的平易な文章にしてみました。あと、これやっぱり結構実装めんどくさくてちょっとクセがあるので、途中でちょっと出ましたが <a href="http://progression.jp/" target="_blank">Progression</a> や <a href="http://www.gaiaflashframework.com/index.php" target="_blank">Gaia</a> みたいなフレームワークを利用するのもやっぱり有りだと思います。（なんだよそれ男じゃねーじゃんというツッコミも NO THANK YOU）

<a href="http://feb19.jp/blog/swf/SWFAddressTest.zip">サンプルのソースをzipで</a>。

AS1 や AS2 で実装したい場合は公式のサンプルを参考に。Flash 8 以上なら使えます。]]>
   </content>
</entry>
<entry>
   <title>SWFAddress 2.4 リリース</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000180.php" />
   <id>tag:feb19.jp,2009:/blog//1.180</id>
   
   <published>2009-10-08T00:04:13Z</published>
   <updated>2009-10-08T00:20:56Z</updated>
   
   <summary> SWFAddress が 2.4 にバージョンアップしていました。主...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="181" label="SWFAddress" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="107" label="as2" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="89" label="as3" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="SWFAddress 2.4 リリース" src="http://feb19.jp/blog/images/image102.jpg" width="400" height="100" />

<a href="http://www.asual.com/blog/swfaddress/?permalink=swfaddress-24.html" target="_blank">SWFAddress が 2.4 にバージョンアップ</a>していました。主にバグフィックスと、最新ブラウザ環境のサポートだそうですが、さらに URL を変更したのが Flash 内部か外部か判別することが可能になる INTERNAL_CHANGE と EXTERNAL_CHANGE イベントが追加されています。]]>
      <![CDATA[SWFAddress 2.4 リリースのアナウンスを日本語訳してみました（すげー怪しい）。

<blockquote>SWFAddress 2.4

ようやく非常に安定した最新版 SWFAddress 2.4 のリリースをアナウンスできてうれしいです。これまでのバージョンにあったいくつかの問題を修正し、いくつか面白い機能をつけました。更新内容はこちらです：

・INTERNAL_CHANGE イベントと、 EXTERNAL_CHANGE イベントの追加
・パラメータの配列をサポート
・IE8 サポートの改善
・IE の初期化時に関する問題の修正
・AS2/AVM2 と Mac OS で、ブラウザとの通信における問題の修正
・swfobject.createSWF の取扱いの修正
・WebKit bug 20355 問題（window.location.replace() を使ってリダイレクトした際にブラウザのヒストリが動作しない問題）の改善
・Frameset のサポートと、動作するサンプルを追加
・URL のパラメータとクエリ文字列（「?」以降の URL 文字列）に関するメソッドが、何もない場合は null を返すようになります（いままでは空の文字列を返していましたが、もう返さないよ。）

このプロジェクトはもうかなり成熟してきているけど、今後も面白いアイデアやリクエストについて考えていこうと思いますよ。
More open source goodness is coming soon.

Asual | Blog - SWFAddress 2.4
<a href="http://www.asual.com/blog/swfaddress/?permalink=swfaddress-24.html" target="_blank">http://www.asual.com/blog/swfaddress/?permalink=swfaddress-24.html</a></blockquote>

INTERNAL_CHANGE、EXTERNAL_CHANGE イベントの追加はうれしいですね。Flash 内部で setValue() されたときは INTERNAL_CHANGE で、Flash 外部（戻るボタン押した、URL を直接変更した、など）で URL が変更されたときは EXTERNAL_CHANGE イベントが発行されるようになったようです。

今まではこれらどちらも CHANGE イベントでしたが、判別できるようになったことで、INTERNAL_CHANGE の場合は演出などをして、 EXTERNAL_CHANGE の場合は演出せずページを切り替える、といっただしわけが出来そうです。（前からもできるにはできましたが、ちょっと工夫しないといけなかった）

onChange:Function、onInit:Function は健在ですが、onInternalChange:Function とかは用意されていないですね。

また、CHANGE イベントは相変わらず発行されているので、setValue された際は CHANGE イベントと、 INTERNAL_CHANGE または EXTERNAL_CHANGE が同時に（一応順番的に前者が先）発行されます。だしわけをする際は注意が必要そうです。

--

ちなみに今回の画像（ロブスター）は、SWFAddress のサンプルの中で、ロブスターを食べている女性の写真っぽいものがあるので、ロブスターにしてみました。]]>
   </content>
</entry>
<entry>
   <title>AS3 の FileReference.upload() の使い方と注意すべき点</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000179.php" />
   <id>tag:feb19.jp,2009:/blog//1.179</id>
   
   <published>2009-10-07T02:06:12Z</published>
   <updated>2009-10-07T02:15:00Z</updated>
   
   <summary> ユーザー参加コンテンツで「ユーザーが自由にファイルをアップロードした...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="167" label="FileReference" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="89" label="as3" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="FileReference.upload() の使い方と注意すべき点" src="http://feb19.jp/blog/images/image101.jpg" width="400" height="100" />

ユーザー参加コンテンツで「ユーザーが自由にファイルをアップロードしたいです。画像とか。」とかを作る場合、Flash Player 9 以上、AS3 ならば FileReference.upload() を使ってファイルをアップロードします。]]>
      <![CDATA[ただし色々 FileReference 系はややこしいので、注意すべき点がいっぱい。サーバーサイドとのやりとりを円滑に進めるためにも、ココでまとめているものは初期の段階でサーバーサイド担当者とやりとりできたらいいですね。

まず、FileReference.upload() の手順はこんな感じ。

<pre><code>var fileRef:FileReference = new FileReference();
fileRef.addEventListener(Event.SELECT, fileSelectedHandler);
fileRef.addEventListener(Event.OPEN, fileOpenHandler);
fileRef.addEventListener(ProgressEvent.PROGRESS, fileUploadProgressHandler);
fileRef.addEventListener(Event.COMPLETE, fileUploadedHandler);
fileRef.addEventListener(DataEvent.UPLOAD_COMPLETE, fileUploadResultHandler);
fileRef.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
function fileSelectedHandler(event:Event):void
{
	trace("SELECTED", fileRef.name, fileRef.size / 1024 + "KB");
	
	// つづけてアップロードしちゃう
	// ファイルサイズ制限持たせたい場合はここの前で FileReference.size を判別してエラー表示する
	var request:URLRequest = new URLRequest("なんたら.php/.cfm/.pl");
	// POST通信でなければならない
	request.method = URLRequestMethod.POST;
	// UPLOAD 開始。
	// アップロードするファイルのキー名は、デフォルトが Filedata になります。
	// 引数で変更可能。
	fileRef.upload(request, "Filedata", false);
}
function fileOpenHandler(event:Event):void
{
	// アップロード開始
	trace("START");
}
function fileUploadProgressHandler(event:ProgressEvent):void
{
	// アップロードのプログレスバー表示とかするときに
	trace(event.bytesLoaded / event.bytesTotal * 100, "%");
}
function fileUploadedHandler(event:Event):void
{
	// こちらからのアップロードが完了したとき
	// エラーが出た時のタイミングによって何がおかしかったかを判別するときに使うぐらい？
	trace("UPLOAD COMPLETE");
}
function fileUploadResultHandler(event:DataEvent):void
{
	// fileUploadedHandler のあとに、サーバースクリプトを経て帰ってくるデータ
	// サーバー側は必ず何か文字列でも XML でも何か返さなければならない
	trace("FINISH" + event.data);
}
function ioErrorHandler(event:IOErrorEvent):void
{
	// サーバーサイドスクリプトに Flash が到達できない場合
	trace("IO ERROR");
	trace(event.text);
}
function securityErrorHandler(event:SecurityErrorEvent):void
{
	// セキュリティ的なエラーが出た場合
	trace("SECURITY ERROR");
	trace(event.text);
}
function clickHandler(event:MouseEvent):void
{
	// ボタンをクリックしてアップロードする画像を選ぶためのファイルブラウザを開く
	var filters:Array = [];
	filters.push(new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png" ));
	fileRef.browse(filters);
}
 
var btn:Sprite = new Sprite();
btn.addEventListener(MouseEvent.CLICK, clickHandler);
btn.graphics.beginFill(0xff0000);
btn.graphics.drawRect(0, 0, 100, 100);
btn.graphcis.endFill();
addChild(btn);</code></pre>

ちなみにセキュリティ的に無理なのかな？とおもっていましたが、 FileReference.upload() が実行されるタイミングは、「ボタンのクリック直後でなければならない」ということは無いようです。
FileReference.browse() の実行は「ボタンのクリック直後でなければならない」です。


サーバー担当とのやりとりで気をつける点

<strong>1. Basic 認証が効いているとダメ。</strong>

Adobe のヘルプに記載有り。仕様です。
<a href="http://livedocs.adobe.com/flex/3_jp/langref/flash/net/FileReference.html#upload()" target="_blank">http://livedocs.adobe.com/flex/3_jp/langref/flash/net/FileReference.html#upload()</a>

認証が効いていると IO_ERROR となります。リリース前のテスト中は認証をかけておきたいという場合、開発機やテスト環境からのホストは認証がかからないようにする必要があります。

このあたりが参考になる気がします。

Basic 認証をかけるが，特定のホストは認証なしで通過させる方法 - memo.xight.org
<a href="http://memo.xight.org/2004-07-18-2" target="_blank">http://memo.xight.org/2004-07-18-2</a>

特定ディレクトリの認証をはずす方法 | RontanBlog
<a href="http://rontan.sakura.ne.jp/2009/08/tips_htaccess_basic_authorize/ target="_blank">http://rontan.sakura.ne.jp/2009/08/tips_htaccess_basic_authorize/</a>

floatingdays: Apacheで特定の URLのみ認証をかけない方法
<a href="http://fdays.blogspot.com/2008/07/apache-url.html" target="_blank">http://fdays.blogspot.com/2008/07/apache-url.html</a>


<strong>2. HTTPS だと問題が出る場合あり。通信はできるだけ HTTP で。</strong>

URL 内に HTTPS のポート番号（443）を記述すると動作する可能性があるらしい。

<pre><code>https://www.******.com:443/upload.php</code></pre>

AS2 だとコレでいけるけど、AS3 だといけないという情報があったりなかったり。。。
SSL環境でFlashからのファイルアップがうまくいかない問題（FF） | RontanBlog
<a href="http://rontan.sakura.ne.jp/2009/08/tips_file_reference_upload/" target="_blank">http://rontan.sakura.ne.jp/2009/08/tips_file_reference_upload/</a>

Firefox と相性が悪かったり。。
AIRLife.net: FileReference.upload()の宛先がhttpsだとFirefoxでは失敗する
<a href="http://blog.air-life.net/2008/06/firefoxfilereferenceuploadga.html" target="_blank">http://blog.air-life.net/2008/06/firefoxfilereferenceuploadga.html</a>

FlashでSSLの時に起きる問題｜Web制作で今すぐ使えるテクニック集
<a href="http://ameblo.jp/linking/entry-10094942703.html" target="_blank">http://ameblo.jp/linking/entry-10094942703.html</a>


<strong>3. サーバーは受信完了したら、何か出力する。</strong>

確認出来ていませんが、DataEvent.UPLOAD_COMPLETE が取れない場合があったりする、ということかもしれません。
成功したら「0」とかレスポンスするだけでもいいので完了したら echo("0"); とするだけでもいいかもしれません。

FileReference.uploadにまけるな！ - FLEXTIME FLASH
<a href="http://graphicker.jp/flextime/flash/archives/2008/05/as-upload.html" target="_blank">http://graphicker.jp/flextime/flash/archives/2008/05/as-upload.html</a>
↑HTTPS は 433 としてますが誤植かも。（正しくは 443）


<strong>4. クロスドメインポリシーファイル必須。</strong>

セキュリティーエラーでます。
クロスドメインポリシーファイルを置いてクロスドメインを許可しましょう。

PHP でプロキシすればいける？
YOPPA BLOG ≫ Flash(AS3)でcrossdomain.xml無しにクロスドメインにアクセスする
<a href="http://yoppa.org/rsd.php?itemid=691" target="_blank">http://yoppa.org/rsd.php?itemid=691</a>


<strong>5. その他サーバー環境などに応じて対応</strong>

色々なかなかやっかいで大変ですよねぇ。

---

<strong>Flash Player 10 以降と FileReference</strong>

ちなみに FlashPlayer 10 コンテンツを作るときならば、FileReference.browse() で呼び出したデータ（たとえば画像）のバイナリを FileReference.load() と FileReference.data でとることができ、それを URLVariables のパラメータにぶっ込むことができるので、通信では FileReference を使うことがなく、もう少しシンプルに考えられるかもしれません。

Flash Player 10 のローカルファイルアクセス機能 (FileReference クラス) - akihiro kamijo
<a href="http://blogs.adobe.com/akamijo/archives/2008/07/flash_player_10_5.html" target="_blank">http://blogs.adobe.com/akamijo/archives/2008/07/flash_player_10_5.html</a>

2009-09-04 - よせ とうふ [as3]FileReferenceのお話
<a href="http://d.hatena.ne.jp/folderol/20090904#1252076206" target="_blank">http://d.hatena.ne.jp/folderol/20090904#1252076206</a>]]>
   </content>
</entry>
<entry>
   <title>Flash CS5 Professional で iPhone アプリを作れるように</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000178.php" />
   <id>tag:feb19.jp,2009:/blog//1.178</id>
   
   <published>2009-10-06T10:49:03Z</published>
   <updated>2009-10-07T02:10:06Z</updated>
   
   <summary> アメリカで開催されている Adobe MAX 2009 にて CS5...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="179" label="cs5" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="175" label="iphone" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="Flash CS5 Professional で iPhone アプリを作れるように" src="http://feb19.jp/blog/images/image100.jpg" width="400" height="100" />

アメリカで開催されている Adobe MAX 2009 にて CS5 がお披露目。来年 4 月に本国で発売という噂も（なので日本は 5 月ぐらいに発売？）・・・。肝となるのはやはり iPhone アプリを開発することの出来る機能が追加されることでしょうか。Objective-C でいつでもどこでも登場する謎の @ マークに悩まされていたあなたも（僕も）サクサク AS3 で開発が可能。]]>
      <![CDATA[まずは公式情報。
<a href="http://labs.adobe.com/technologies/flashcs5/" target="_blank">Adobe Labs - Adobe Flash Professional CS5</a>
<a href="http://labs.adobe.com/technologies/flashcs5/appsfor_iphone/ target="_blank">Adobe Labs - Adobe Flash Professional CS5: Applications for iPhone</a>
<a href="http://www.adobe.com/devnet/logged_in/abansod_iphone.html" target="_blank">Developing for the Apple iPhone using Flash | Adobe Developer Connection</a>

ここの情報を読んでいると、どうやら AS3 を LLVM（中間言語）に変換して、それを iPhone App 形式にするっぽいです。

ってことは、iPhone SDK を使うのではなくて、Flash for iPhone に用意されたマルチタッチや各種センサー、マイク、カメラとかの ActionScript ライブラリ（API）で完結するってことでしょうね。flash.events.TouchEvent みたいなのが用意されているということでしょうか。（Windows 7 も各種センサー API を提供するということなので、iPhone のためだけに用意する API、というわけではないのでしょうし）

ってことは 3D っぽいアニメーション作ったからとはいえ、Open GL ES に変換してくれるというほどでもないからそんなに早くは動かないだろうし、楽器アプリを作ろうとしても、Audio Units レベルほどのレイテンシーを低くすることも無理でしょう。

とはいえ小さいオブジェクトのアニメーションや、描画エリアの小さい動きならばわりとサクサク動かせたりするのでしょうか。ためしに「<a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=331141362&mt=8" target="_blank">That Roach Game</a>」という Flash CS5 をつかって作られたとされる無料のゲームがあったのでちょっと試してみましたが、なかなか動いていますね。昔の Flash ゲームみたい。ゴキブリをタッチしてつぶすって発想がまた。。僕の iPhone は、iPhone 3G S ですが、フレームレートは 24 ぐらい出ているのかも？<a href="http://www.adobe.com/devnet/logged_in/abansod_iphone.html" target="_blank">ここ</a>で iPhone の GPU を使用して、結構頑張れるよ、みたいなこと書いてありますね。

<a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=331141362&mt=8" target="_blank"><img alt="That Roach Game" src="http://feb19.jp/blog/images/image100a.jpg" /></a>

そしてもちろん Cocoa Touch のコンポーネントも使うことも無理でしょうから、たとえば TableViewController みたいなのを作る場合は AS で自作するか、あわよくば、それっぽい Adobe 製のコンポーネントが用意されている、ということになるかな？

これは最近発表された AIR 2.0 が iPhone に乗る、と解釈した方がすっきりするかも。

ただこれは面白い事になってきた気がします。

次期 Flash Player となる 10.1 は、ケータイでフル機能が動くようになるということだし（ケータイキャリアの思惑やデバイスの問題でもろもろのセキュリティや何かしらの制限はかかるだろうけど）、いよいよケータイでの視覚表現が本格化してきた気がします。

Flash CS5 は Windows でも動くから、これで Windows でも iPhone アプリの開発が出来るようになるというわけだけど、さすがに iPhone のアプリを実機で動かすには Apple Developer Connection でライセンスを買い、Xcode のオーガナイザからしかテストの転送が出来ないから、結局 Mac を買わないといけなくて、Apple ニンマリ？

とりあえず Apple のデザインガイドラインにそぐわなくてリジェクトとかされないように、Apple の資料を熟読したり、まだまだ Objective-C ベースで Cocoa Touch の作法とかもろもろ、iPhone 開発ノウハウを勉強しておいたほうがいいかも。

参考：『iPhone』アプリの作成が可能な『Flash Professional CS5』登場 - japan.internet.com 携帯・ワイヤレス
<a href="http://japan.internet.com/allnet/20091006/10.html" target="_blank">http://japan.internet.com/allnet/20091006/10.html</a>
待望のニュース！Flash CS5 で iPhone アプリが開発できる(Flash CS5最新情報の翻訳も) | ClockMaker Blog
<a href="http://clockmaker.jp/blog/2009/10/flash-cs5-iphone/" target="_blank">http://clockmaker.jp/blog/2009/10/flash-cs5-iphone/</a>
携帯でも動くフルFlash Player、Adobeが発表 - ITmedia News
<a href="http://www.itmedia.co.jp/news/articles/0910/05/news045.html" target="_blank"> http://www.itmedia.co.jp/news/articles/0910/05/news045.html </a>]]>
   </content>
</entry>
<entry>
   <title>Flash Develop に見切りを付けて Flex/Flash Builder Eclipse plugin を入れるプレイ</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000177.php" />
   <id>tag:feb19.jp,2009:/blog//1.177</id>
   
   <published>2009-10-04T15:45:08Z</published>
   <updated>2009-10-04T15:47:34Z</updated>
   
   <summary> もうここ最近 Windows 環境で ActionScript を書...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="178" label="eclipse" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="46" label="flex" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="Flash Develop に見切りを付けて Flex/Flash Builder Eclipse plugin を入れるプレイ" src="http://feb19.jp/blog/images/image099.jpg" width="400" height="100" />

もうここ最近 Windows 環境で ActionScript を書くときは FlashDevelop 一択じゃね？と思っている僕ですが、Mac との環境を同じにしたいとか、なんか Flex とか渋いぜと思うと Flex/Flash Builder eclipse plugin なんぞをいれたくなる次第。Flash Develop はアイコンのデザインが好みじゃねーんだよ！と捨て台詞を吐いて。]]>
      <![CDATA[で、 eclipse と Flex Builder plugin 入れてみたけど、やっぱ Flash CS4 とは FlashDevelop の方が相性いい気がするのでメインは Flash Develop だなぁという感じ。

そんなわけで AS を書くためだけに eclipse は大げさな気もしてまだあまり動かしていませんが（大学のときに触ってたけど・・・）、色々出来そうな世界が広がる感じがするのでちょくちょくまた触りだしてみる。

ちなみに僕は今 Mac で AS を書く時は Flash CS4 Professional です。CS3 に比べて、2 つのファイルを並べて開く事が出来るようになったので、CS4 からメインエディタに昇格。Coda はあまり使っていません。 Flash CS5 でスクリプトエディタが強化されるという噂を聞いたので楽しみにしています。

<strong><img alt="eclipse 3.5 Galileo + Flex Builder 3 eclipse plugin を導入してみました" src="http://feb19.jp/blog/images/image099a.jpg" /></strong>

というわけで本題で、eclipse 3.5 Galileo + Flex Builder 3 eclipse plugin を導入してみましたのでそのメモ。

<strong>1. まずは eclipse 3.5 Galileo を手に入れる。</strong>
eclipse の公式サイト（ここ <a href="http://www.eclipse.org/downloads/packages/" target="_blank">http://www.eclipse.org/downloads/packages/</a>）からか、日本人用に最適化されたパッケージ版を（ここ <a href="http://mergedoc.sourceforge.jp/" target="_blank">http://mergedoc.sourceforge.jp/</a>）ダウンロードする。
オススメは日本語化されてフル機能が付いた Ultimate (JRE あり) をこちらから。
<a href="http://mergedoc.sourceforge.jp/" target="_blank">http://mergedoc.sourceforge.jp/</a>

<strong>2. 適当なディレクトリに設置。</strong>
eclipse を起動してみる。初回起動はまぁまぁ時間がかかるんですよね確か。
ワークスペースが聞かれるので、eclipse の作業ディレクトリとしたいディレクトリを指定する。
workspace って名前にはしといた方が良いかも。workspace は後から追加したり変更できます。

<strong>3. Adobe Flex Builder 3 Eclipse Plugin をダウンロード。</strong>
とりあえず体験ばーん。
<a href="https://www.adobe.com/cfusion/tdrc/index.cfm?product=flex_eclipse" target="_blank">https://www.adobe.com/cfusion/tdrc/index.cfm?product=flex_eclipse</a>
Flash Builder 4 ならこっち。
<a href="http://labs.adobe.com/technologies/flashbuilder4/" target="_blank">http://labs.adobe.com/technologies/flashbuilder4/</a>

<strong>4. Adobe Flex Builder Plugin をインストール。</strong>
このときに eclipse を設置しているディレクトリを聞いてきますが、3.2 または 3.3 でないと、インストーラーが認識できないようで、変なダイアログとエラーが出ますが「注意して続行する」という不思議な文言のボタンをクリックして続行。

<strong>5. eclipse と Flex Builder を関連づける</strong>
eclipse をインストールしたディレクトリに links というフォルダが出来る（なければ自分で作る）。
その中にある com.adobe.flexbuilder.feature.core.link というファイル（なければテキストファイルを作ってリネームをしたりして作成）をテキストエディタで開き、中身を、

<pre><code>path=C:/Program Files/Adobe/Flex Builder 3 Plug-in</code></pre>

と修正（または追記）する。元からファイル名が書かれていたら path= を書き足す。
要はインストールされたディレクトリを指定します。

なので、Flash Builder 4 ならば↓かな？

<pre><code>path=C:/Program Files/Adobe/Flash Builder Plug-in Beta</code></pre>

<strong>6. eclipse をクリーンして起動</strong>
普通に起動でもいいかも。
eclipse.exe -clean.cmd をダブルクリックして（-clean オプションをつけて） eclipse を初期化しつつ起動。

<strong>7. Flex 開発パースペクティブの設定</strong>
<img alt="パースペクティブを開く" src="http://feb19.jp/blog/images/image099b.jpg" />

右の方にあるパースペクティブを開くボタンから「その他」「Flex 開発」を入れて、パースペクティブを追加する。

<img alt="パースペクティブを開く 2" src="http://feb19.jp/blog/images/image099c.jpg" />

ハイ、ドーーーン！！

<img alt="Flex Builder 3 eclipse plugin" src="http://feb19.jp/blog/images/image099d.jpg" />

ほんと開発向けの見た目だよなぁ。慣れてないだけかもしれないけど、Flash CS4 とか立ち上げるとデザイン心がくすぐられるというか、モーションとかインタラクションでアートしたい感がするもん。これはこれでスクリプトガリガリ書こう、って気になるけど。

そんなわけで、とりあえず SWC 作成ツールにしてみようと思いました。

八角研究所 : Adobe Flex コンポーネントの作り方（4） - SWC形式での配布
<a href="http://www.hakkaku.net/articles/20080812-259" target="_blank">http://www.hakkaku.net/articles/20080812-259</a>]]>
   </content>
</entry>
<entry>
   <title>loader.unload と addChild/removeChild に関する、Flash Player 9 と 10 の微妙な差異</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000176.php" />
   <id>tag:feb19.jp,2009:/blog//1.176</id>
   
   <published>2009-08-25T01:11:23Z</published>
   <updated>2009-08-25T01:25:40Z</updated>
   
   <summary> Flash CS4 Professional で開発を行っていると、...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="89" label="as3" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="141" label="player 10" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="177" label="player 9" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="loader.unload と addChild/removeChild に関する、Flash Player 9 と 10 の微妙な差異" src="http://feb19.jp/blog/images/image098.jpg" width="400" height="100" />

Flash CS4 Professional で開発を行っていると、ムービーをプレビューで確認するときは基本的に Flash Player 10 になってしまうので、Flash Player 9 用コンテンツを作っているとややその動作の差異に頭を悩ませる事はしばしばあります。]]>
      <![CDATA[なんだかんだで Flash サイトはまだ Flash Player 9 対象が基本。Flash CS5 が出たら Flash Player 10 または 11 が基本になるんだろうか。Flash Player 11 では Dynamic Sound Generate の機能が強化されるといいなぁ。今のバッファサイズじゃレイテンシとかがちょっと悩ましい。簡単サウンド API が提供されるともっといいな。


Flash Player 9 の場合、外部からロードするコンテンツを addChild(loader) ではなく、 addChild(loader.content) するようにしておくと、removeChild(loader.content) して unload() するときにエラーが出てしまいます。

これが Flash Player 10 だったりすると、エラーは出ず正常に removeChild() と unload() が行われます。

ためしたサンプルコード。各ボタンを押した瞬間、red.swf、blue.swf、green.swf をロードしています。

<pre><code>red_btn.addEventListener(MouseEvent.CLICK, clickHandler);
blue_btn.addEventListener(MouseEvent.CLICK, clickHandler);
green_btn.addEventListener(MouseEvent.CLICK, clickHandler);
 
//ロードされるコンテンツのコンテナー
var container:Sprite = new Sprite();
container.y = 100;
addChild(container);
 
//ローダー。このローダーを使い回す。
var loader:Loader;
 
//現在ロードしてるコンテンツ名を格納しておく。
var current:String = "";
 
function clickHandler(event:MouseEvent):void
{
	var target:MovieClip = MovieClip(event.currentTarget);
	var swfName:String = target.name.substr(0, target.name.lastIndexOf("_"));
	loadContent(swfName);
}
 
function loadContent(swfName:String):void
{
	if (current == swfName)
		return;
	
	if(loader && loader.content)
	{
		container.removeChild(loader.content);
		loader.unload();
		loader = null;
	}
	
	current = swfName;
	
	loader = new Loader();
	loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
	loader.load(new URLRequest(swfName + ".swf"));
}
 
function loadCompleteHandler(event:Event):void
{
	var loader:Loader = LoaderInfo(event.currentTarget).loader;
	loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loadCompleteHandler);
	container.addChild(loader.content);
}</pre></code>

Loader でロードした中身（content）を親の DisplayObjectContainer に addChild し、消すときは removeChild で Loader の中身を親から取り外したあと、Loader をクリア（unload）。この瞬間に Flash Player 9 だとエラーが出ます。

<pre><code>ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。
	at flash.display::Loader/unload()
	at main_fla::MainTimeline/loadContent()[main_fla.MainTimeline::frame1:31]
	at main_fla::MainTimeline/clickHandler()[main_fla.MainTimeline::frame1:20]</code></pre>

Flash Player 10 で同じくダメなのであれば「そういうものなのね」で自己解決できるのですが、問題なく出来てしまいますし、心持ちこちらの方が美しい気がするので悩ましい所。（MVC 的に Loader という Controller と、content という View な感じ）

これを解決するには loader.content を addChild するのではなく、 loader を addChild するかたちにして、removeChild のときも同様にすれば解決できます。

上のコードの問題を解消したサンプルコード。loader.content ではなく、loader を addChild しています。

<pre><code>red_btn.addEventListener(MouseEvent.CLICK, clickHandler);
blue_btn.addEventListener(MouseEvent.CLICK, clickHandler);
green_btn.addEventListener(MouseEvent.CLICK, clickHandler);
 
//ロードされるコンテンツのコンテナー
var container:Sprite = new Sprite();
container.y = 100;
addChild(container);
 
//ローダー。このローダーを使い回す。
var loader:Loader;
 
//現在ロードしてるコンテンツ名を格納しておく。
var current:String = "";
 
function clickHandler(event:MouseEvent):void
{
	var target:MovieClip = MovieClip(event.currentTarget);
	var swfName:String = target.name.substr(0, target.name.lastIndexOf("_"));
	loadContent(swfName);
}
 
function loadContent(swfName:String):void
{
	if (current == swfName)
		return;
	
	if(loader && loader.content)
	{
		container.removeChild(loader);
		loader.unload();
		loader = null;
	}
	
	current = swfName;
	
	loader = new Loader();
	loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
	loader.load(new URLRequest(swfName + ".swf"));
}
 
function loadCompleteHandler(event:Event):void
{
	var loader:Loader = LoaderInfo(event.currentTarget).loader;
	loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loadCompleteHandler);
	container.addChild(loader);
}</code></pre>

addChild(loader) ってなんかすごい気持ち悪い気がするのですが、そもそも loader は DisplayObject なんだ思うと、ぐっとこらえられる気もします。

---

そういえば先月の Web Designing の「Flash の学校」で、Flash Player 10 の機能である「Dynamic Sound Generate」を使ったプライベートワークの「<a href="http://feb19.jp/blog/archives/000163.php" target="_blank">A Flash Polyphonic Synthesizer</a>」がこっそり<a href="http://aretokore.jp/blog/2009/07/webdesigning20098dynamicsoundgeneration2.html" target="_blank">載っていました</a>。

プライベートワークが本に載ったのは初めてです。多分。ちょっと嬉しかったです。よろしければ<a href="http://feb19.jp/polyphonic_synthesizer/" target="_blank">触ってみた事がない方は触ってみてください</a>。デザインもインタラクションも、あまりにも適当なので、今度はそのあたり頑張ります。]]>
   </content>
</entry>
<entry>
   <title>ありがとう Tweener／最終版 Tweener 1.33.74 小技</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000175.php" />
   <id>tag:feb19.jp,2009:/blog//1.175</id>
   
   <published>2009-08-09T01:59:56Z</published>
   <updated>2009-08-09T10:07:58Z</updated>
   
   <summary> Flash のトゥイーン系ライブラリのスタンダードとも言える Twe...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="89" label="as3" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="128" label="tweener" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="ありがとう Tweener／最終版 Tweener 1.33.74 小技" src="http://feb19.jp/blog/images/image097.jpg" width="400" height="100" />

Flash のトゥイーン系ライブラリのスタンダードとも言える Tweener の開発を、最新版である Tweener 1.33.74 をもって終了すると、作者 <a href="http://zehfernando.com/2009/tweener-4-years-later-a-post-mortem/" target="_blank">Zeh Fernando 氏のブログ</a>で発表されました。日本語訳は<a href="http://www.tonpoo.com/blog/2009/06/tweener/" target="_blank">こちら</a>。]]>
      <![CDATA[拡張性の高さや、Tweener.addTween() 一つでほとんど何でもできるシンプルかつ手軽な点、複数のコントロールポイントを指定することができるベジエトゥイーン（曲線軌道を描くトゥイーン）のサポート、困ったときは Tweener.removeTweens() 使っとけば全てストップできる人情味あふれる（？）機能、フレームレートに依存しない時間を指定出来る点など、すばらしいライブラリでした。おかげでご飯もいっぱい食べられました。

開発終了とのことですが、上記理由や、安定性の高さ、そして Tweener のクセを把握した自分としては、これからもしばらくはメインのトゥイーンライブラリでしょう。

さて、今後 Tween ライブラリを移行するのならどれがいいんだろう。いろいろ試して使っている上では、一番最近にできたライブラリである BetweenAS3 が個人的には良さげな気がします。クラス名がややまどろっこしいですが、BetweenAS3.tween().play() で Tweener.addTween() と同じぐらい手軽にかける感じとか、流石<a href="http://www.libspark.org/wiki/Thread" target="_blank">そうめんの人</a>が開発しているだけあって、機能が多く、それらの組み合わせも多く、長く深く使い込める感じ。何てったって処理速度が高速。

ちなみに <a href="http://code.google.com/p/tweensy/" target="_blank">Tweensy</a>、<a href="http://blog.greensock.com/tweenmaxas3/" target="_blank">TweenMax</a>、<a href="http://www.goasap.org/" target="_blank">GoASOP + HydroTween</a> はちょっと個人的には合わなかったです。でも <a href="http://www.tweensy.org/examples/fireFX.html" target="_blank">Tweensy FX</a> は面白いし、GoASOP + HydroTween も機能豊富でいいですね。

自作 Tween ライブラリもそうめんの人見習って少しづつ改善していこう。

最後に少し Tweener の便利技というか、小技をご紹介。


<strong>Tweener 小技</strong>

最終版でなくても使える機能ですが、Tweener.addTween() で指定する、ターゲットのオブジェクトは、配列で指定することが出来ます。
たとえば、MovieClip の配列を一斉にフェードアウトする。

<pre><code>var fxxx:Array = [silverlixxx_mc, visxx_mc, internetexploxxx_mc];
Tweener.addTween(fxxx, { time: 0.5, alpha: 0, transition:"linear" } );</code></pre>

for、while 文とかで回すよりシンプルです。（結局 Tweener の内部で回してるんですけどね）

/*--------------------------------

そしてこれが removeTweens() でできたらちょっと素敵な気もします。（最終版でもできません）

もしできたら、ページ遷移時や、UI を停止する際、表示しているページ内の Tweener で制御する MovieClip などを配列にしておいて、

<pre><code>Tweener.removeTweens( objs );</code></pre>

としてやると、制御しているオブジェクトを停止し、クリーンな状態にしてページを閉じてやることが出来たりしますし。

まぁ別に for か while で回せばいいだけなんですが。なんか一行で書けるって、お洒落だと思うのです。

--------------------------------*/

あと、多次元配列もつかえたら良いんですけどね。Array じゃなくなるまで内部で for か while で回して Array.concat() してくれたらいいのに。とか言ってみたりして。。ｗ


Tweener はシンプルで高機能な Tween 系ライブラリでよかったなぁ、というお話でした。]]>
   </content>
</entry>
<entry>
   <title>Flash CS4 の新モーショントゥイーンは「ピクッ」ってならない</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000174.php" />
   <id>tag:feb19.jp,2009:/blog//1.174</id>
   
   <published>2009-06-24T07:02:44Z</published>
   <updated>2009-06-24T07:09:28Z</updated>
   
   <summary> 「回転したムービークリップ」（特に写真とかを含むムービークリップだと...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="147" label="cs4" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="Flash CS4 の新モーショントゥイーンは「ピクッ」ってならない" src="http://feb19.jp/blog/images/image096.jpg" width="400" height="100" />

「回転したムービークリップ」（特に写真とかを含むムービークリップだとわかりやすい）に Flash CS3 までのモーショントゥイーン（CS4 で言うクラシックトゥイーン）を適用すると、キーフレームとそうじゃないフレームで、微妙に表示座標（または回転角）がずれていて、タイムラインを再生すると「ピクッ」ってなる有名なバグ（というか仕様だろうな）に悩まされていたけど、CS4 で新規搭載したモーショントゥイーンだと、ならない。]]>
      <![CDATA[Flash CS4 の新モーショントゥイーンはまだ慣れていなかったので、ほとんどのアニメーションをクラシックトゥイーン（Flash CS3 までのモーショントゥイーン）でやっていたのですが、回転したオブジェクトをアニメーションさせる時に困ってしまったので、試しに新モーショントゥイーンを使ってみたら「ピクッ」ってならなくなって一件落着という話。


そもそも今までのモーショントゥイーンは「キーフレームとキーフレームの間を補完する」というもので、おそらく「キーフレームは完全にユーザーが指定した座標、変形」で持ってくれるのだけど、モーショントゥイーンで補完するフレームでは、前後のキーフレームでプロパティが変化しているしていないにかかわらず補完のための演算をしていて、その演算：32ビット？浮動小数点演算で、丸め誤差が起きてしまうからだと思います。

だからバグというより旧モーショントゥイーン方式の限界（仕様？）なんだろうなと思っていました。

実際 Flash CS3 まではこんな感じでした。（Flash CS4 のクラシックトゥイーン）

<div id="flashcontent">旧モーショントゥイーンサンプル
<noscript>
<p>JavaScript を有効にしてください</p>
</noscript>
</div>
<script type="text/javascript">
// <![CDATA[
var so = new SWFObject("http://feb19.jp/blog/swf/MotionTweenClassic.swf", "sample", "400", "300", "10", "#FFFFFF");
so.addParam("quality", "best");
so.addParam("allowScriptAccess", "always");
so.write("flashcontent");
// ]]&gt;
</script>

一瞬ピクッってなるのが分かると思います。

タイムラインはこんなかんじです。
<img alt="旧モーショントゥイーンのタイムライン" src="http://feb19.jp/blog/images/image096a.jpg" width="400" height="100" />


Flash CS4 の新モーショントゥイーンではリニューアルしてその辺の仕様を再考されたのか、大丈夫なようになりました。

Flash CS4 新モーショントゥイーンで上のものとキーフレームのプロパティは同じにしています。

<div id="flashcontent2">新モーショントゥイーンサンプル
<noscript>
<p>JavaScript を有効にしてください</p>
</noscript>
</div>
<script type="text/javascript">
// <![CDATA[
var so = new SWFObject("http://feb19.jp/blog/swf/MotionTweenNew.swf", "sample", "400", "300", "10", "#FFFFFF");
so.addParam("quality", "best");
so.addParam("allowScriptAccess", "always");
so.write("flashcontent2");
// ]]&gt;
</script>

ピクッってならない！

タイムラインはこんなかんじです。
<img alt="新モーショントゥイーンのタイムライン" src="http://feb19.jp/blog/images/image096b.jpg" width="400" height="100" />

Flash CS4 の新モーショントゥイーンは、Flash Player 10 以上のみが対象<strong>ではなく</strong>、Flash Player 6 用（もちろんこれ未満も）、Flash Lite 用とかにも使えるので、モーショントゥイーンを頻繁に使う方は CS4 にアップデートされると幸せになれると思います。]]>
   </content>
</entry>

</feed>
