<?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-07-29T09:03:55Z</updated>
   <subtitle>life is creative!</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.33-ja</generator>

<entry>
   <title>Flash Builder 4 Standard 導入</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000195.php" />
   <id>tag:feb19.jp,2010:/blog//1.195</id>
   
   <published>2010-05-25T16:48:18Z</published>
   <updated>2010-07-29T09:03:55Z</updated>
   
   <summary> 色々メモリリークチェックとか出来る Premium は必要になってか...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="15" label="flash" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="195" label="flash builder" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="Flash Builder 4 Standard 導入" src="http://feb19.jp/blog/images/image117.jpg" />

色々メモリリークチェックとか出来る Premium は必要になってからでいいやということで Standard 版を購入しました。というか Premium は高いねん。<a href="http://www.adobe.com/jp/products/flex/upgrade/" target="_blank">比較表はこちら</a>。とりあえず導入後のセッティングとか入れたプラグインとかメモ]]>
      <![CDATA[Web Premium CS5 から導入されるようになった Flash Builder 4 Standard。自分は Production Premium 組ですが、Production Premium にも、入れてほしい。


Flash CS4 Professional 用の俺プロジェクト設定

ActionScript プロジェクトでターゲットにするバージョンに応じた Flex SDK を選択。（9: Flex SDK 3, 10: Flex SDK 4）
出力ディレクトリ（bin-debug 的な）は空白。プロジェクトをどこかに作成。
html-temprate ディレクトリ消す。
fla を Flash CS4 で作成してプロジェクトフォルダの直下に作成。
これでプロジェクトファイルと fla とそのソースファイルディレクトリだけに。
パブリッシュは Flash CS4 で行います。

これが CS5 からより密接に連携出来そうなので楽しみです。</p>

コードヒントとかは最速（0ms）で出す設定にして、<a href="http://feb19.jp/blog/archives/000193.php">フォントはもちろん Menlo にしました</a>。


プラグインを入れたりする

Flex Formatter
<a href="http://sourceforge.net/projects/flexformatter/" target="_blank">http://sourceforge.net/projects/flexformatter/</a>

コード整形プラグイン。( や { のあとはスペースや改行を入れる入れない、インデントはどうする、あれはどうする、的な細かいコード記法が設定出来て、その設定自体をエクスポート／インポートできる。アドビが推奨しているコード記法設定がプリセットで用意されているのでそれを選択して、個人的にキモイと思った所をいくつか変更していきました。

・インデントはタブ文字で。
・コロンの前は空白入れない。
・コメントをインデント

とか。。。あと ASDocs 用の注釈をワンクリックで入れてくれるボタンもまぁまぁ便利ですが、getter/setter は setter の注釈は @private とするとか、getter は return いらないとかいう <a href="http://livedocs.adobe.com/flex/3_jp/html/help.html?content=asdoc_4.html#251224" target="_blank">ASDocs を作成するときのルール</a>があり、そのへんが未対応？なので、やや爪の甘さが残る気もします。
これは Flex Formatter が悪いというより Flash Builder が悪い？よくわかりません。
まぁそんな細かい所は自前で修正していきます。


Blueprint
<a href="http://labs.adobe.com/technologies/blueprint/" target="_blank">http://labs.adobe.com/technologies/blueprint/</a>

オンラインヘルプパネル。Flash Builder 付属の Adobe Help が AIR アプリだからか、イマイチ動作が不安定で重くて使い辛いので、Adobe Labs で公開されているこちらを入れました。インターネットにつながっている必要がありますが、さくっと使えて便利です。


Flash Snippets Panel
<a href="http://theflashblog.com/?p=1494" target="_blank">http://theflashblog.com/?p=1494</a>

コードスニペットパネル。<br />
あんまり使いませんが、入れておくと安心系のヤツです。

TODO/FIXME extension
<a href="http://www.richinternet.de/blog/index.cfm?entry=911D4B57-0F0D-5A73-AF6F4D4D04099757" target="_blank">http://www.richinternet.de/blog/index.cfm?entry=911D4B57-0F0D-5A73-AF6F4D4D04099757</a>

タスク管理支援プラグイン。タスクパネルにプロジェクト内のコードで入力されている TODO / FIXME 項目を一覧できるようにします。コード内に // TODO unkounko とか入れておくと、Flash Builder のビュー＞タスクに TODO 項目といて unkounko とリスト化してくれます。個人作業はもちろん、何人かで進めるプロジェクトに特に便利な気がします。


他にも Subversive （Subversion を Flash Builder / eclipse で使えるようにするプラグイン）とか Source Mate （コードを書いているときに色々支援してくれたりするプラグイン、有償）とか SFTP プラグイン（SFTP ツールプラグイン）が便利みたいです。
<a href="http://www.eclipse.org/subversive/" target="_blank">http://www.eclipse.org/subversive/</a>
<a href="http://www.elementriver.com/sourcemate/" target="_blank">http://www.elementriver.com/sourcemate/</a>
<a href="http://www.jcraft.com/eclipse-sftp/" target="_blank">http://www.jcraft.com/eclipse-sftp/</a>


それにしても最近の Flash 制作はインタラクティブ前提かつベクターではなくビットマップを制御して ActionScript バリバリなので、昔の Flash アニメーション制作とはもはや別ものになったなぁと、こういう強力な開発ツールを手にしてシミジミ。]]>
   </content>
</entry>
<entry>
   <title>Mac でファイルの関連付けを変える（Mac で AIR アプリがアップデート出来ないを解決する方法）</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000194.php" />
   <id>tag:feb19.jp,2010:/blog//1.194</id>
   
   <published>2010-04-24T03:11:47Z</published>
   <updated>2010-04-24T03:39:21Z</updated>
   
   <summary> ファイルを右クリックして「情報を見る」を選び、表示されたウィンドウの...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="110" label="air" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="125" label="flv" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="101" label="mac" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="Mac でファイルの関連付けを変える（Mac で AIR アプリがアップデート出来ないを解決する方法）" src="http://feb19.jp/blog/images/image116.jpg" />

ファイルを右クリックして「情報を見る」を選び、表示されたウィンドウの下の方にある「このアプリケーションで開く」を任意のアプリケーションにしたのち、すぐ下の「すべてを変更」をクリックして確認ダイアログで 「続ける」 をクリック。]]>
      <![CDATA[友人が新型 MacBook Pro 購入したということで自慢された記念に Mac Tips をメモ。

.swf とか .air  の拡張子が付いたファイルは、 Adobe Flash CS4 Professionalとか、 Apple Logic Studio （の、 Wave Burner）とかのアプリケーションがマシンに入っていると、ダブルクリックしたときにこれらのアプリケーションが立ち上がってしまう事があります。

.swf ならスタンドアロンプレイヤーで開きたいし、 .air ならAdobe AIR として動かしたいですね。特に後者なんか、 AIR アプリケーション内でアップデートの実行をしようとした場合、関連付け通りのアプリケーションで再起動してしまうので、うまくアップデートされない、なんて事があります。

.air を Adobe AIR Application Installer に関連付けます。

1. ファイルを右クリックして「情報を見る」
<img alt="ファイルを右クリックして「情報を見る」" src="http://feb19.jp/blog/images/image116a.png" />

2. 表示されたウィンドウの下の方にある「このアプリケーションで開く」を任意のアプリケーションに
<img alt="ファイルを右クリックして「情報を見る」" src="http://feb19.jp/blog/images/image116b.png" />

3. 「すべてを変更...」をクリック
<img alt="ファイルを右クリックして「情報を見る」" src="http://feb19.jp/blog/images/image116c.png" />

4. 確認ダイアログで「続ける」をクリック
<img alt="ファイルを右クリックして「情報を見る」" src="http://feb19.jp/blog/images/image116d.png" />

5. AIR パッケージになった！
<img alt="AIR パッケージになった！" src="http://feb19.jp/blog/images/image116e.png" />

これで AIR アプリをもう一度実行したとき、アップデートがうまく行われるようになります。

Mac だとアプリケーションとファイルの関連付けは、拡張子が無くてもファイルタイプとかで認識するので、あんまり「ファイルを関連付けする」的なこととか意識しない気がして、意外にハマり？そうなので以上メモでした。

--

.flv とかも Perian とか入れて Quick Time Player とかに関連づけると幸せです。]]>
   </content>
</entry>
<entry>
   <title>Mac OS X 10.6 Snow Leopard から入ってるフォント「Menlo」がコーディング作業にいい感じ</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000193.php" />
   <id>tag:feb19.jp,2010:/blog//1.193</id>
   
   <published>2010-04-01T15:31:52Z</published>
   <updated>2010-04-01T15:47:25Z</updated>
   
   <summary> Xcode でコード書いているとき、Eclipse でコード書くより...</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="192" label="font" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="193" label="xcode" 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 から入ってるフォント「Menlo」がコーディング作業にいい感じ" src="http://feb19.jp/blog/images/image115.jpg" />

Xcode でコード書いているとき、Eclipse でコード書くより書きやすいよなぁ、なんでだろう、と思って、なんとなく Xcode で使用しているフォントをチェックしてみたら、Menlo という見慣れないフォントが。どうやらこれは Mac OS X 10.6 Snow Leopard から入っているフォントのようですね。]]>
      <![CDATA[なので、Eclipse のエディタもフォントを変えてみたりしました。

<img alt="Monaco 11pt vs Menlo Regular 11pt" src="http://feb19.jp/blog/images/image115a.jpg" />

Monaco 11pt から Menlo Regular 11pt です。
ぱっと見、そんなに違いがないように見えますが、ちょっと書いてみるとかなり書きやすくなっている事を感じると思います。

キーワードが軽く太字になるのからというのもあると思いますが、Menlo は書体のアセンダが Monaco に比べて狭いから、大文字小文字が入り乱れるコードの中で大文字だけが目立つことなく散漫とした見た目にならないのが良いのだと思います。描画もシャープで見やすい気がします。


ちなみに Flash CS4 だとこんな感じ。

<img alt="Osaka レギュラー等幅、サイズ 11  vs Menlo Regular、サイズ 10" src="http://feb19.jp/blog/images/image115b.jpg" />


Osaka レギュラー等幅 11pt から Menlo Regular 10pt ですが・・・ Eclipse のフォントよりも大きくてガジガジしてるように見えるのは何故でしょう。
Flash がもしかして Cocoa で書かれているわけじゃない？から？なんかよくわかりませんね。Flash は Osaka 等幅の方が良いかもしれないようなそうでもないような。

好みによる、ってことで。w]]>
   </content>
</entry>
<entry>
   <title>AIR で JSON 形式ファイルの入出力</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000192.php" />
   <id>tag:feb19.jp,2010:/blog//1.192</id>
   
   <published>2010-03-31T16:21:11Z</published>
   <updated>2010-03-31T16:21:09Z</updated>
   
   <summary> AIR 祭り開催中。今回はファイル入出力。AS3 で扱っている Ob...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="110" label="air" 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="150" label="json" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<img alt="AIR で JSON 形式ファイルの入出力" src="http://feb19.jp/blog/images/image114.jpg" />

<a href="http://feb19.jp/blog/archives/000190.php">AIR 祭り開催中</a>。今回はファイル入出力。AS3 で扱っている Object 型のデータを JSON ファイルとして保存してみるメモ。]]>
      <![CDATA[Flash CS4 または CS3 + AIR 開発キットで、パブリッシュ設定 AIR 1.5 の .fla ファイルを作成して、SWF 作るようにドキュメントクラスに FileSaveAndReadTest と設定。

ステージ上に save_btn / load_btn / dummy_btn を配置して実行してください。

FileStream.open() ではなく FileStream.openAsync() を使って非同期に書き込みます。
（イベントリスナーで終了を受け取ったりする必要があるけど、プログレスバーとかも出せたり、大きなファイルを扱うときも open() した瞬間プログラムを停止させない）

ちなみに <a href="http://feb19.jp/blog/archives/000159.php">JSON を使う</a>ので、Adobe の <a href="http://code.google.com/p/as3corelib/" target="_blank">as3corelib</a> を入手する必要があります。

<pre><code>FileSaveAndReadTest.as
 
package 
{
	import com.adobe.serialization.json.JSON;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.MouseEvent;
	import flash.events.ProgressEvent;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	
	public class FileSaveAndReadTest extends Sprite
	{
		private var _data:Object;
		
		public function FileSaveAndReadTest()
		{
			// ステージにボタンがわりにする適当な MovieClip を設置
			save_btn.addEventListener(MouseEvent.CLICK, clickHandler);
			load_btn.addEventListener(MouseEvent.CLICK, clickHandler);
			dummy_btn.addEventListener(MouseEvent.CLICK, clickHandler);
		}
		
		private function clickHandler(event:MouseEvent):void
		{
			// クリックされたとき
			var target:MovieClip = MovieClip(event.currentTarget);
			switch(target.name)
			{
				case "save_btn":
					if (!_data)	return;
					// ダミーデータに変更（加算）を加えて保存
					_data.test[1] += 10;
					save();
					break;
				
				case "load_btn":
					// データを読み込む
					load();
					break;
				
				case "dummy_btn":
					// ダミーデータを突っ込む
					_data = {
						"test":	[0, 1, 2, 3, 4, 5],
						"testtest": "testtest",
						"testtesttest": {
							"test": [5, 4, 3, 2, 1, 0],
							"testtest": "unko"
						}
					}
					break;
			}
		}
		
		public function save():void
		{
			// AIR アプリ固有のデータ保存スペース
			trace(File.applicationStorageDirectory.url);
			var file:File = File.applicationStorageDirectory.resolvePath("sample.json");
			
			// ユーザーのデスクトップにする場合は File.desktopDirectory.resolvePath("sample.json");
			// ユーザーのドキュメントディレクトリにする場合は File.documentsDirectory.resolvePath("sample.json");
			// ユーザーのホームディレクトリにする場合は File.userDirectory.resolvePath("sample.json");
			// アプリケーションのリソースがインストールされているディレクトリにする場合は File.applicationResourceDirectory.resolvePath("sample.json");
			
			// オブジェクトを JSON ファイル形式に変換
			var json:String = JSON.encode(_data);
			
			// FileStream 使う
			var fs:FileStream = new FileStream();
			fs.openAsync(file, FileMode.WRITE);	// 書き込みモードで非同期的に開く
			fs.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			fs.addEventListener(ProgressEvent.PROGRESS, progressHandler);
			//fs.addEventListener(Event.CLOSE, closeHandler);
			fs.addEventListener(Event.COMPLETE, saveCompleteHandler);
			
			// 書き込む
			fs.writeUTFBytes(json);
		}
		
		private function ioErrorHandler(event:IOErrorEvent):void
		{
			trace(event.text);
		}
		
		private function progressHandler(event:ProgressEvent):void
		{
			
		}
		
		private function closeHandler(event:Event):void
		{
			
		}
		
		private function saveCompleteHandler(event:Event):void
		{
			// 閉じる
			var fs:FileStream = FileStream(event.currentTarget);
			fs.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			fs.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
			//fs.removeEventListener(Event.CLOSE, closeHandler);
			fs.removeEventListener(Event.COMPLETE, loadCompleteHandler);
			fs.close();
		}
		
		public function load():void
		{
			// AIR アプリ固有のデータ保存スペース
			trace(File.applicationStorageDirectory.url);
			var file:File = File.applicationStorageDirectory.resolvePath("sample.json");
			
			var fs:FileStream = new FileStream();
			fs.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			fs.addEventListener(ProgressEvent.PROGRESS, progressHandler);
			//fs.addEventListener(Event.CLOSE, closeHandler);
			fs.addEventListener(Event.COMPLETE, loadCompleteHandler);
			fs.openAsync(file, FileMode.READ);
		}
		
		private function loadCompleteHandler(event:Event):void
		{
			var fs:FileStream = FileStream(event.currentTarget);
			fs.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			fs.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
			//fs.removeEventListener(Event.CLOSE, closeHandler);
			fs.removeEventListener(Event.COMPLETE, loadCompleteHandler);
			
			// ファイルを文字列に変換して JSON デコード
			var str:String = fs.readUTFBytes(fs.bytesAvailable);
			var obj:Object = JSON.decode(str);
			
			// 一応中身の一部トレース
			trace(obj.test[1]);
			
			_data = obj;
			
			// 閉じる
			fs.close();
		}
	}
	
}</code></pre>

SharedObject とあんまり変わらん気もしますけど、保存容量制限問題とか、ファイルが任意の場所に作れるとか、多少自由が効きますね。]]>
   </content>
</entry>
<entry>
   <title>Adobe CS5 ティザーサイトオープン</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000191.php" />
   <id>tag:feb19.jp,2010:/blog//1.191</id>
   
   <published>2010-03-24T01:56:43Z</published>
   <updated>2010-03-24T02:12:13Z</updated>
   
   <summary> カウントダウンが始まっています。いよいよ CS5 ですね。globa...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="4" label="adobe" 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" />
   
   <content type="html" xml:lang="ja" xml:base="http://feb19.jp/blog/">
      <![CDATA[<a href="http://cs5launch.adobe.com/" href="_target"><img alt="Adobe CS5 ティザーサイトオープン" src="http://feb19.jp/blog/images/image113.jpg" /></a>

<a href="http://cs5launch.adobe.com/" href="_target">カウントダウンが始まっています</a>。いよいよ CS5 ですね。global launch 12 April なんて書いてあるから直訳すると 4 月 12 日世界発売ですけど、 CS4 までは本国で出てから一ヶ月後ぐらいに日本版は発売されていましたので、どうなんですかね。online for exclusive なんでオンライン限定なんですかね。ちなみにどうでもいいですが、僕今月引っ越しもするので金銭的に死にそうです。iPad 貯金切り崩すか悩んでいます。]]>
      <![CDATA[この辺で予習できそうです。
<a href="http://www.youtube.com/user/CS5ORG#p/u" target="_blank">http://www.youtube.com/user/CS5ORG#p/u</a>

Flash CS5 に関してはこの辺でしょうか。

Adobe Labs - Adobe Flash Professional CS5
<a href="http://labs.adobe.com/technologies/flashcs5/" target="_blank">http://labs.adobe.com/technologies/flashcs5/</a>

Adobe Flash Platform Blog
<a href="http://blogs.adobe.com/flashplatform/" target="_blank">http://blogs.adobe.com/flashplatform/</a>

Adobe Flash Professional CS5 * Adobe Flash Professional CS5
<a href="http://help.adobe.com/en_US/Flash/CS5/Using/index.html" target="_blank">http://help.adobe.com/en_US/Flash/CS5/Using/index.html</a>

trick7 - Flash CS5 新機能まるわかりビデオ
<a href="http://www.trick7.com/blog/2009/10/08-214224.php" target="_blank">http://www.trick7.com/blog/2009/10/08-214224.php</a>

Adobe、Adobe Flash Professional CS5の新機能情報を公開 － MACお宝鑑定団 blog（羅針盤）
<a href="http://www.macotakara.jp/blog/index.php?ID=7183" target="_blank">http://www.macotakara.jp/blog/index.php?ID=7183</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>

Adobe、Adobe Flash Professional CS5のiPhone書き出し機能「Packager for iPhone」の詳細情報を公開 － MACお宝鑑定団 blog（羅針盤）
<a href="http://www.macotakara.jp/blog/index.php?ID=7184" target="_blank">http://www.macotakara.jp/blog/index.php?ID=7184</a>

Flash CS5 で iPhone 書き出しのを上手い事パフォーマンス引き出せたら iTunes ストアでリリースしてみたいな。]]>
   </content>
</entry>
<entry>
   <title>AIR でファイルがドラッグアンドドロップされたことを NativeDragEvent で検知する</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000190.php" />
   <id>tag:feb19.jp,2010:/blog//1.190</id>
   
   <published>2010-03-23T16:19:28Z</published>
   <updated>2010-03-23T16:23:13Z</updated>
   
   <summary> 最近また AIR が楽しい気がして触っているのですが、 Google...</summary>
   <author>
      <name></name>
      
   </author>
   
   <category term="110" label="air" 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="AIR でファイルがドラッグアンドドロップされたことを NativeDragEvent で検知する" src="http://feb19.jp/blog/images/image112.jpg" />

最近また AIR が楽しい気がして触っているのですが、 Google で AIR 関連記事を探すと、 AIR beta 版の頃(または Apollo だった頃)の記事が上位にきて、すでに廃止された作法、API を使っていたりするのでちょっと困っています。

自分の中で整理するために、しばらくこのブログで基礎的な AIR の記事をアップしていきます。というか割と AIR 忘れたのでメモです。]]>
      <![CDATA[まずは基本のドラッグアンドドロップ。
ちなみに Flash CS4 (CS3) で作っているという想定です。

デスクトップとかからファイルをステージ上に配置した MovieClip インスタンス「droparea」にドラッグアンドドロップする方法です。

<pre><code>// MovieClip インスタンスに MouseEvent のように NativeDragEvent を設定
droparea.addEventListener(NativeDragEvent.NATIVE_DRAG_ENTER, nativeDragEnterHandler);
droparea.addEventListener(NativeDragEvent.NATIVE_DRAG_EXIT, nativeDragExitHandler);
droparea.addEventListener(NativeDragEvent.NATIVE_DRAG_DROP, nativeDragDropHandler);
 
// ドラッグしたまま droparea の上に来たとき
function nativeDragEnterHandler(event:NativeDragEvent):void
{
	droparea.alpha = 0.6;
	
	// ドラッグしているアイテムはファイルかどうか
	var clipboard:Clipboard = event.clipboard;
	if (clipboard.hasFormat(ClipboardFormats.FILE_LIST_FORMAT))
	{
		// droparea の上でのドロップを許可する
		NativeDragManager.acceptDragDrop(droparea);
	}
}
 
// ドラッグしたまま droparea から外れたとき
function nativeDragExitHandler(event:NativeDragEvent):void
{
	droparea.alpha = 1.0;
}
 
// ファイルをドロップしたとき
function nativeDragDropHandler(event:NativeDragEvent):void
{
	droparea.alpha = 1.0;
	
	// ドロップしたアイテムを取り出す
	var clipboard:Clipboard = event.clipboard;
	var files:Array = clipboard.getData(ClipboardFormats.FILE_LIST_FORMAT) as Array;
	
	// ドロップしたアイテムのうち、一つめのファイル
	var file:File = files[0];
	trace(file.name);
}</code></pre>

ちなみに複数の File インスタンスを得るには最後の取り出しのところを、

<pre><code>for each (var file:File in files)
{
	trace(file.name);
}</code></pre>

for each は楽ちんですね。]]>
   </content>
</entry>
<entry>
   <title>iPhone アプリ &quot;iBeat - BPM Counter&quot; を発売しました ＆ iPhone インタラクションデザインについて</title>
   <link rel="alternate" type="text/html" href="http://feb19.jp/blog/archives/000189.php" />
   <id>tag:feb19.jp,2010:/blog//1.189</id>
   
   <published>2010-03-11T00:52:19Z</published>
   <updated>2010-03-11T01:08:54Z</updated>
   
   <summary> BPM 計測アプリです。既に似たようなアプリはいくつか発売されている...</summary>
   <author>
      <name></name>
      
   </author>
   
   <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[<a href="http://feb19.jp/iphone/ibeat/" target="_blank"><img alt="iPhone アプリ "iBeat - BPM Counter" を発売しました ＆ iPhone インタラクションデザインについて" src="http://feb19.jp/blog/images/image111.jpg" /></a>

<a href="http://feb19.jp/iphone/ibeat/">BPM 計測アプリ</a>です。既に似たようなアプリはいくつか発売されているのですが、タップできるエリアが狭かったり、グラフィックでテンションがさがるようなアプリが多くて、楽器の練習時など実際に使っていて、やや不満を感じていました。次第に我慢の限界に達し、自分でデザイン・実装してみることにしました。]]>
      <![CDATA[色々な社会の仕組みも勉強したかったので、我慢の限界を我慢しつつコツコツ EIN も取って、 iTunes で有料アプリとして 115 円で販売開始しました。よろしければ、お買い求めください。

ちなみに最近はやりの Flash CS5 Packager for iPhone は使ってません。Xcode で Objective-C で書いています。てか CS5 ってまだ発売されていないはずなのに流行ってるなんて不思議ですね（なんてw）。

今回の iPhone アプリのインタラクションデザインにおいて考えたのは以下の 3 点。


1. タップエリアは広く

<img alt="タップエリアは広く" src="http://feb19.jp/blog/images/image111a.jpg" />

当たり前のことですが、ミスタッチ防止というのと、安心感。
大きければ、譜面を読みながらテンポを測る場合、目線を譜面に向かわせておいてもミスなく計測出来ます。タップで集中力を奪わないようにと。

あと、画面を広く占有する大きなボタンがあるだけで「これをタップしろ」というアフォーダンスを、タップボタン君が存分に発揮してくれる気がします。iPhone アプリではいちいち説明書を読め、チュートリアルを見ろ、ということはあまりできないので、視覚でユーザーが想像しやすいようにするのは重要ですよね。


2. 画面右下 i ボタンからのモーダルビューをクローズするボタンは、 i ボタンと同じ右下に

<img alt="画面右下 i ボタンからのモーダルビューをクローズするボタン" src="http://feb19.jp/blog/images/image111ba.jpg" /><img alt=" i ボタンと同じ右下に" src="http://feb19.jp/blog/images/image111bb.jpg" />

i ボタンを押すと、くるっと画面が回転し、アプリの簡単な紹介ページが開きます。
i ボタンをユーザーが押すとき、ユーザーがどのような持ち方、どの指でタッチするか考えました。

紹介ページでは、サポート Web ページを開くぐらいしか機能がないので、この間にユーザーが本体を右手と左手で持ち変えたり、またはタッチする指を変えたりというのはあまり考えられない気がします。

ユーザーが iPhone を利き手じゃない方の手で持っている、または机に置いている場合、操作を親指以外の指で操作する傾向があると思うので、ボタンを画面のどの辺りに置いても難なくタッチできると思います。
しかし、 iPhone を片手または両手で持って、その親指で操作しているときは、ボタンが画面の上部にあると、やや指から遠いため、タッチしにくい感じがします。結果、画面下部にボタンを配置する事にしました。

また、ユーザーが「気づく」という点においても、画面下からモーダルビューがせり上がってくるタイプのアニメーションが行われるのであれば、モーダルビューの上の方にクローズボタンを置いても良いと思うのですが、今回はくるっと回るアニメーション（画面の見た目がいきなり変わってしまう）なので、タッチした i ボタンに関連のある位置の方がいいと思い、右下に配置しました。

ちなみに iPad の場合は画面解像度が高いので、サポートページ情報ぐらいなのであれば画面遷移はせず、ポップアップ、バルーンなどのインタラクションで行う方が良いと思いました。


3. なんか海外を意識する？

<img alt="なんか海外を意識する？" src="http://feb19.jp/blog/images/image111c.jpg" />

iPhone アプリの売り上げのほとんどは海外と聞いていたので、普段ちらちら見ているものを参考にしながら、想像上の「海外」な感じのデザインパーツを作成していきました。グラデーションや、ノイズな感じとテカリ感のバランスなんですかね。正直難しいですが。

BPM の数値もただ iPhone にインストールされているフォントを使うだけでは面白くないので、グラデーションとグローを加えた、0 から 9 までの png パーツを切り出して、メモリ上に UIImage の NSArray として保持しておき、該当 UIImageView の UIImage を切り替えるという方法で表現しています。

UIImage を作る瞬間ちょっと負荷が高いので、viewDidLoad なタイミングで先に作っといて配列として保持しとく方がよさそうです。

openGL ES とか使った方がもっと高速できるかな？とはいえ現時点でラグもなく、十分早いですが。


でした。

で、これで効果があるかどうかはわかりませんが、色々こうやって無駄に考えていると勉強になっていい感じです。今後考え直す事があればまたバージョンアップや他のアプリでやってみたいです。

というわけで、よろしくお願いします。

→ <a href="http://feb19.jp/iphone/ibeat/">iPhone アプリ「iBeat - BPM Counter」 紹介ページ</a>

]]>
   </content>
</entry>
<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>

</feed>
