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

<channel>
	<title>fla.la</title>
	<atom:link href="http://fla.la/feed" rel="self" type="application/rss+xml" />
	<link>http://fla.la</link>
	<description>FLASH関連のネタを粛々とポストしていくのです。最近はUnion Platformに夢中</description>
	<lastBuildDate>Mon, 14 Dec 2009 04:46:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Loaderで読み込んだswfと読み出し元swf間のイベント伝達</title>
		<link>http://fla.la/archives/576</link>
		<comments>http://fla.la/archives/576#comments</comments>
		<pubDate>Mon, 14 Dec 2009 00:42:09 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[security]]></category>
		<category><![CDATA[Loader]]></category>

		<guid isPermaLink="false">http://fla.la/?p=576</guid>
		<description><![CDATA[Loaderに外部のswfを読み込んだ状態で、LoaderにMouseEvent.CLICKのイベントリスナーを設定しても反応しない、という現象に悩まされることが多々あります。
Loaderは、InteractiveObjectを継承しているので、MouseEventは受け取れるはずです。それに、Loaderにスタティックな画像(jpegやpngなど)を読み込んだ際には、LoaderにMouseEvent.CLICKのイベントリスナーを設定すれば、イベント拾えるんですよね。
これは以前、fla.la  &#187; クロススクリプティングで紹介した
ロード元swfファイルのDisplayObjectツリーと、ロードしたswfファイルのDisplayObjectツリー間のイベント伝達フロー
が関係してきます。
そこでAdobe ActionScript 3.0 * クロススクリプトを読んでみますと、以下の記述があります。


親オブジェクトを所有する SWF ファイルは、ソースオブジェクトを所有する SWF ファイルのドメインを信頼するために、Security.allowDomain() メソッドを呼び出す必要があります。
ソースオブジェクトを所有する SWF ファイルは、親オブジェクトを所有する SWF ファイルのドメインを信頼するために、Security.allowDomain() メソッドを呼び出す必要があります。


つまり読み込んだexample.com/hoge.swfからexample.net/fugo.swfを読み込んで、イベント伝達を可能にするためには、お互いのドメインを引数にしたSecurity.allowDomain()を実行する必要があるということになります。
サンプルソース
サンプルをwonderflに上げておきました。中央付近に表示されるキャラクターにMouseEvent.CLICKイベントのリスナーを登録していますが、クリックしても反応しません。
キャプチャーフェーズ、ターゲットフェーズ、バブリングフェーズすべてのフェーズでイベントが発生していないことがポイントです。
そこで、上部にある「Security.allowDomain()」というボタンをクリックしたあとで、キャラクターをクリックすると反応することが分かると思います。
Loaderで読み込んだswfと読み出し元swf間のイベント伝達例 &#8211; wonderfl build flash online
なお、http://asmple.com/work/avatar3.swfでは以下のSecurity.allowDomain()が記述してあります。

Security.allowDomain&#40;&#34;wonderfl.net&#34;&#41;;
Security.allowDomain&#40;&#34;swf.wonderfl.net&#34;&#41;;

]]></description>
			<content:encoded><![CDATA[<p>Loaderに外部のswfを読み込んだ状態で、LoaderにMouseEvent.CLICKのイベントリスナーを設定しても反応しない、という現象に悩まされることが多々あります。</p>
<p>Loaderは、InteractiveObjectを継承しているので、MouseEventは受け取れるはずです。それに、Loaderにスタティックな画像(jpegやpngなど)を読み込んだ際には、LoaderにMouseEvent.CLICKのイベントリスナーを設定すれば、イベント拾えるんですよね。</p>
<p>これは以前、<a href="http://fla.la/archives/145">fla.la  &raquo; クロススクリプティング</a>で紹介した</p>
<blockquote><p>ロード元swfファイルのDisplayObjectツリーと、ロードしたswfファイルのDisplayObjectツリー間のイベント伝達フロー</p></blockquote>
<p>が関係してきます。</p>
<p>そこで<a href="http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7c98.html">Adobe ActionScript 3.0 * クロススクリプト</a>を読んでみますと、以下の記述があります。</p>
<blockquote>
<ol>
<li>親オブジェクトを所有する SWF ファイルは、ソースオブジェクトを所有する SWF ファイルのドメインを信頼するために、Security.allowDomain() メソッドを呼び出す必要があります。</li>
<li>ソースオブジェクトを所有する SWF ファイルは、親オブジェクトを所有する SWF ファイルのドメインを信頼するために、Security.allowDomain() メソッドを呼び出す必要があります。</li>
</ol>
</blockquote>
<p>つまり読み込んだexample.com/hoge.swfからexample.net/fugo.swfを読み込んで、イベント伝達を可能にするためには、お互いのドメインを引数にしたSecurity.allowDomain()を実行する必要があるということになります。</p>
<h2>サンプルソース</h2>
<p>サンプルをwonderflに上げておきました。中央付近に表示されるキャラクターにMouseEvent.CLICKイベントのリスナーを登録していますが、クリックしても反応しません。</p>
<p>キャプチャーフェーズ、ターゲットフェーズ、バブリングフェーズすべてのフェーズでイベントが発生していないことがポイントです。</p>
<p>そこで、上部にある「Security.allowDomain()」というボタンをクリックしたあとで、キャラクターをクリックすると反応することが分かると思います。</p>
<div style="text-align:center;width:465px;"><iframe title="Loaderで読み込んだswfと読み出し元swf間のイベント伝達例 - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/cfcc2cb2078020bb10b3498a38bb1c9ed18cbd14" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/code/cfcc2cb2078020bb10b3498a38bb1c9ed18cbd14" title="Loaderで読み込んだswfと読み出し元swf間のイベント伝達例 - wonderfl build flash online">Loaderで読み込んだswfと読み出し元swf間のイベント伝達例 &#8211; wonderfl build flash online</a></div>
<p>なお、http://asmple.com/work/avatar3.swfでは以下のSecurity.allowDomain()が記述してあります。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #004993;">Security</span>.<span style="color: #004993;">allowDomain</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;wonderfl.net&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #004993;">Security</span>.<span style="color: #004993;">allowDomain</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;swf.wonderfl.net&quot;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/576/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UnionPlatformを紹介しました</title>
		<link>http://fla.la/archives/561</link>
		<comments>http://fla.la/archives/561#comments</comments>
		<pubDate>Tue, 06 Oct 2009 05:11:41 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>
		<category><![CDATA[slide]]></category>

		<guid isPermaLink="false">http://fla.la/?p=561</guid>
		<description><![CDATA[このブログを通してお伝えしてきましたUnion Platfom関連のお話は、会社のODF（One Day Free）という制度を使って調査して来ました。
そして先日、社内のODF発表会でUnion Platformの概要部分だけをざっくり解説しました。ブログへの掲載許可を頂いたので、その時のスライドを紹介します。５分ぐらいで発表したのでざっくり概要を知るには良いかも知れません。
Union Platformの紹介(クリックで始まります。以降のスライドへはダブルクリックで進みます。)
もっとUnion Platformを知りたい方は以下の記事もご確認下さい。
関連記事

UnionPlatform (1) 概要
UnionPlatform (2) 概念
Union Platform(3) 情報の共有化
Union Platform(4) Reactorのイベント
Union Platform(5) チャットを作る
Union Platform(6) Union Server入門
Union Platform(7) Union Server Module作成準備
Union Platform(8) Moduleサンプル

]]></description>
			<content:encoded><![CDATA[<p>このブログを通してお伝えしてきましたUnion Platfom関連のお話は、会社のODF（One Day Free）という制度を使って調査して来ました。</p>
<p>そして先日、社内のODF発表会でUnion Platformの概要部分だけをざっくり解説しました。ブログへの掲載許可を頂いたので、その時のスライドを紹介します。５分ぐらいで発表したのでざっくり概要を知るには良いかも知れません。</p>
<p><a href="http://koshikawa.net/slide/union/introduction/">Union Platformの紹介</a>(クリックで始まります。以降のスライドへはダブルクリックで進みます。)</p>
<p>もっとUnion Platformを知りたい方は以下の記事もご確認下さい。</p>
<h3>関連記事</h3>
<ol>
<li><a href="http://fla.la/archives/248" title="UnionPlatform (1) 概要">UnionPlatform (1) 概要</a></li>
<li><a href="http://fla.la/archives/287" title="UnionPlatform (2) 概念">UnionPlatform (2) 概念</a></li>
<li><a href="http://fla.la/archives/351" title="Union Platform(3) 情報の共有化">Union Platform(3) 情報の共有化</a></li>
<li><a href="http://fla.la/archives/315" title="Union Platform(4) Reactorのイベント">Union Platform(4) Reactorのイベント</a></li>
<li><a href="http://fla.la/archives/364" title="Union Platform(5) チャットを作る">Union Platform(5) チャットを作る</a></li>
<li><a href="http://fla.la/archives/347" title="Union Platform(6) Union Server入門">Union Platform(6) Union Server入門</a></li>
<li><a href="http://fla.la/archives/365" title="Union Platform(7) Union Server Module作成準備">Union Platform(7) Union Server Module作成準備</a></li>
<li><a href="http://fla.la/archives/369" title="Union Platform(8) Moduleサンプル">Union Platform(8) Moduleサンプル</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/561/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wonderfl apiが出来たらしい</title>
		<link>http://fla.la/archives/550</link>
		<comments>http://fla.la/archives/550#comments</comments>
		<pubDate>Sun, 04 Oct 2009 04:16:40 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[wonderfl]]></category>
		<category><![CDATA[api]]></category>

		<guid isPermaLink="false">http://fla.la/?p=550</guid>
		<description><![CDATA[wonderfl apiが出来たみたいです。
ドキュメントの邦訳はとんさんのブログが詳しいです。素敵。
Wonderfl API を使ってみよう！
ちなみに作成したAPI Keyの一覧は、http://wonderfl.net/account/api_keysから見れます。
Client作ってみた
というわけで自分もAS3のClientを作ってみた。こうやって使うイメージ。

// set your api key
WonderflAPIClient.apiKey = &#34;your_wonderfl_api_key&#34;;
&#160;
// create client
var client:WonderflAPIClient = new WonderflAPIClient&#40;&#41;;
&#160;
// listen
client.addEventListener&#40;WonderflAPIClient.GET_USER_COMPLETE, hander&#41;;
&#160;
// get user info
client.getUser&#40;&#41;;
&#160;
// handler
function hander&#40;event:Event&#41;:void
&#123;
	trace&#40;client.user.name&#41;;
&#125;

ソース
wonderflにあげてあります。L:121以降がWonderflAPIClientです。コピペでご利用下さい。
WonderflAPIClientを作ってみる &#8211; wonderfl build flash online
まとめ
今後のマッシュアップ作品に期待です。私も何か作りたい！
]]></description>
			<content:encoded><![CDATA[<p><a href="http://wonderfl.net/apis">wonderfl api</a>が出来たみたいです。<br />
ドキュメントの邦訳はとんさんのブログが詳しいです。素敵。</p>
<blockquote><p><a href="http://ton-up.net/blog/archives/310">Wonderfl API を使ってみよう！</a></p></blockquote>
<p>ちなみに作成したAPI Keyの一覧は、<a href="http://wonderfl.net/account/api_keys">http://wonderfl.net/account/api_keys</a>から見れます。</p>
<h2>Client作ってみた</h2>
<p>というわけで自分もAS3のClientを作ってみた。こうやって使うイメージ。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// set your api key</span>
WonderflAPIClient.apiKey = <span style="color: #990000;">&quot;your_wonderfl_api_key&quot;</span>;
&nbsp;
<span style="color: #009900;">// create client</span>
<span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">client</span><span style="color: #000000; font-weight: bold;">:</span>WonderflAPIClient = <span style="color: #0033ff; font-weight: bold;">new</span> WonderflAPIClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// listen</span>
<span style="color: #004993;">client</span>.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>WonderflAPIClient.GET_USER_COMPLETE, hander<span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// get user info</span>
<span style="color: #004993;">client</span>.getUser<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// handler</span>
<span style="color: #339966; font-weight: bold;">function</span> hander<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Event</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">client</span>.user.<span style="color: #004993;">name</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>

<h2>ソース</h2>
<p>wonderflにあげてあります。L:121以降がWonderflAPIClientです。コピペでご利用下さい。</p>
<div style="text-align:center;width:465px;"><iframe title="WonderflAPIClientを作ってみる - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/8c80c437763e2b477076d3328e0cf6fded8dff6a" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/code/8c80c437763e2b477076d3328e0cf6fded8dff6a" title="WonderflAPIClientを作ってみる - wonderfl build flash online">WonderflAPIClientを作ってみる &#8211; wonderfl build flash online</a></div>
<h2>まとめ</h2>
<p>今後のマッシュアップ作品に期待です。私も何か作りたい！</p>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/550/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Union Platformのgoogle group</title>
		<link>http://fla.la/archives/546</link>
		<comments>http://fla.la/archives/546#comments</comments>
		<pubDate>Sat, 03 Oct 2009 15:40:51 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>

		<guid isPermaLink="false">http://fla.la/?p=546</guid>
		<description><![CDATA[Union PlatformのGoogleグループを作成しています。
Union Platformに興味がある方は是非、http://bit.ly/uniongrpへ。
お気軽にご参加下さい。
サンプルを充実させたいので、まずはサンプルの準備をして行きたいと思います。
]]></description>
			<content:encoded><![CDATA[<p>Union PlatformのGoogleグループを作成しています。</p>
<p>Union Platformに興味がある方は是非、<a href="http://bit.ly/uniongrp">http://bit.ly/uniongrp</a>へ。<br />
お気軽にご参加下さい。</p>
<p>サンプルを充実させたいので、まずはサンプルの準備をして行きたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/546/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wonderflでキャプチャ</title>
		<link>http://fla.la/archives/536</link>
		<comments>http://fla.la/archives/536#comments</comments>
		<pubDate>Wed, 16 Sep 2009 01:41:31 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[wonderfl]]></category>

		<guid isPermaLink="false">http://fla.la/?p=536</guid>
		<description><![CDATA[wondeflで再生する前に表示されているキャプチャ画像ですが、
Frequently Asked Questions -> キャプチャについてにあるように、任意のタイミングにずらすことが可能です。
コレを使って、一番見せたいタイミングに近いところのキャプチャが出来るわけです。ただ、ローカルでwonderfl用のコードを書く際に

Wonderfl.capture_delay&#40;10&#41;;

この記述でエラーが起きてしまうので、どうにかならないかと思っていました。
んが、簡単に解決出来ることに気づきました。クラスパスが通っている箇所に以下のようなダミーのクラスを用意しておけば良いですね。

1
2
3
4
5
6
7
8
9
10
11
12
package  
&#123;
	public class Wonderfl 
	&#123;
		public static function capture_delay&#40;num:Number&#41;:void
		&#123;	
		&#125;
		public static function disable_capture&#40;&#41;:void
		&#123;
		&#125;
	&#125;	
&#125;

実は他にもメソッドがあるかもしれませんが、取りあえずはこれで事足ります。恥ずかしながら、今まではローカル作業中は、コメントアウトしてwonderflに挙げるときにコメントを外すという地味な作業をしていました。
これで少し手間が省けます。やった。
]]></description>
			<content:encoded><![CDATA[<p>wondeflで再生する前に表示されているキャプチャ画像ですが、<br />
<a href="http://wonderfl.net/help#help_capture">Frequently Asked Questions -> キャプチャについて</a>にあるように、任意のタイミングにずらすことが可能です。</p>
<p>コレを使って、一番見せたいタイミングに近いところのキャプチャが出来るわけです。ただ、ローカルでwonderfl用のコードを書く際に</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;">Wonderfl.capture_delay<span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight:bold;">10</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

<p>この記述でエラーが起きてしまうので、どうにかならないかと思っていました。</p>
<p>んが、簡単に解決出来ることに気づきました。クラスパスが通っている箇所に以下のようなダミーのクラスを用意しておけば良いですね。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span>  
<span style="color: #000000;">&#123;</span>
	<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> Wonderfl 
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0033ff; font-weight: bold;">public</span> static <span style="color: #339966; font-weight: bold;">function</span> capture_delay<span style="color: #000000;">&#40;</span>num<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>	
		<span style="color: #000000;">&#125;</span>
		<span style="color: #0033ff; font-weight: bold;">public</span> static <span style="color: #339966; font-weight: bold;">function</span> disable_capture<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>	
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>実は他にもメソッドがあるかもしれませんが、取りあえずはこれで事足ります。恥ずかしながら、今まではローカル作業中は、コメントアウトしてwonderflに挙げるときにコメントを外すという地味な作業をしていました。</p>
<p>これで少し手間が省けます。やった。</p>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/536/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Threadのtestってどう書くの？</title>
		<link>http://fla.la/archives/526</link>
		<comments>http://fla.la/archives/526#comments</comments>
		<pubDate>Fri, 11 Sep 2009 06:20:23 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Thread]]></category>
		<category><![CDATA[question]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://fla.la/?p=526</guid>
		<description><![CDATA[最近、Threadを使ってUnion用のThreadを作る機会が多いのですが、せっかくなのでtestを書こうと思っております。testはもちろん、AS3Unitを使っています。
Threadのtestを書く方法が良く分かりません。どうやるんだろうと思い考えてみたのがこれ。TestThreadはものすごい適当です。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package
&#123;
    import flash.events.Event;
    import org.libspark.as3unit.*;
    import org.libspark.as3unit.assert.*;
    import org.libspark.thread.EnterFrameThreadExecutor;
    import org.libspark.thread.Thread;
&#160;
    /**
     * HogeThreadTest
     */
    public class HogeThreadTest 
    &#123;
    [...]]]></description>
			<content:encoded><![CDATA[<p>最近、<a href="http://www.libspark.org/wiki/Thread">Thread</a>を使ってUnion用のThreadを作る機会が多いのですが、せっかくなのでtestを書こうと思っております。testはもちろん、<a href="http://www.libspark.org/wiki/yossy/AS3Unit">AS3Unit</a>を使っています。</p>
<p>Threadのtestを書く方法が良く分かりません。どうやるんだろうと思い考えてみたのがこれ。TestThreadはものすごい適当です。</p>
<p><span id="more-526"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.events</span>.<span style="color: #004993;">Event</span>;
    <span style="color: #0033ff; font-weight: bold;">import</span> org.libspark.as3unit.<span style="color: #000000; font-weight: bold;">*</span>;
    <span style="color: #0033ff; font-weight: bold;">import</span> org.libspark.as3unit.assert.<span style="color: #000000; font-weight: bold;">*</span>;
    <span style="color: #0033ff; font-weight: bold;">import</span> org.libspark.thread.EnterFrameThreadExecutor;
    <span style="color: #0033ff; font-weight: bold;">import</span> org.libspark.thread.Thread;
&nbsp;
    <span style="color: #3f5fbf;">/**
     * HogeThreadTest
     */</span>
    <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> HogeThreadTest 
    <span style="color: #000000;">&#123;</span>
        beforeClass static <span style="color: #339966; font-weight: bold;">function</span> setUp<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #009900;">// Threadの初期化をしておく</span>
            Thread.initialize<span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">new</span> EnterFrameThreadExecutor<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #004993;">test</span> <span style="color: #339966; font-weight: bold;">function</span> asyncMethod<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #009900;">// testしたいThreadを生成</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> thread<span style="color: #000000; font-weight: bold;">:</span>HogeThreadTest = <span style="color: #0033ff; font-weight: bold;">new</span> HogeThreadTest<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #009900;">// test用のThreadでラップする</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> testThread<span style="color: #000000; font-weight: bold;">:</span>TestThread = <span style="color: #0033ff; font-weight: bold;">new</span> TestThread<span style="color: #000000;">&#40;</span>thread<span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #009900;">// test用のThread完了後にdispatchされるEvent.COMPLETEを待つ</span>
            testThread.dispatcher.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">Event</span>.<span style="color: #004993;">COMPLETE</span>, async<span style="color: #000000;">&#40;</span>
            <span style="color: #339966; font-weight: bold;">function</span><span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Event</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
            <span style="color: #000000;">&#123;</span>
                assertTrue<span style="color: #000000;">&#40;</span>thread.reactor.isConnected<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>,
                     <span style="color: #990000;">&quot;check whether connected reactor.isConnected() is true or not.&quot;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #000000;">&#125;</span>,<span style="color: #000000; font-weight:bold;">1000</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #009900;">// test用のThreadを実行</span>
            testThread.<span style="color: #004993;">start</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.events</span>.<span style="color: #004993;">Event</span>;
<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.events</span>.<span style="color: #004993;">EventDispatcher</span>;
<span style="color: #0033ff; font-weight: bold;">import</span> org.libspark.thread.Thread;
&nbsp;
<span style="color: #3f5fbf;">/**
 * Test用のThread
 */</span>
<span style="color: #9900cc; font-weight: bold;">class</span> TestThread extends Thread
<span style="color: #000000;">&#123;</span>
    <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _dispatcher<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">EventDispatcher</span>;
    <span style="color: #3f5fbf;">/**
     * Eventを送出するためにEventDispatcherインスタンスを生成
     */</span>
    <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #0033ff; font-weight: bold;">get</span> dispatcher<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">EventDispatcher</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0033ff; font-weight: bold;">return</span> _dispatcher;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #3f5fbf;">/**
     * 保持するThreadインスタンス
     */</span>
    <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _thread<span style="color: #000000; font-weight: bold;">:</span>Thread;
&nbsp;
    <span style="color: #3f5fbf;">/**
     * runメソッド
     */</span>
    override <span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #339966; font-weight: bold;">function</span> run<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #009900;">// コンストラクタで受け取ったThreadを実行</span>
        _thread.<span style="color: #004993;">start</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #009900;">// 実行終わるのを待つ</span>
        _thread.<span style="color: #004993;">join</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #009900;">// doenを実行する</span>
        next<span style="color: #000000;">&#40;</span>done<span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> done<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #009900;">// Event.COMPLETEを送出する</span>
        _dispatcher.<span style="color: #004993;">dispatchEvent</span><span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Event</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">Event</span>.<span style="color: #004993;">COMPLETE</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #3f5fbf;">/**
     * 引数でThreadを受け取る
     * @param    thread
     */</span>
    <span style="color: #339966; font-weight: bold;">function</span> TestThread<span style="color: #000000;">&#40;</span>thread<span style="color: #000000; font-weight: bold;">:</span>Thread<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
    <span style="color: #000000;">&#123;</span>
        _dispatcher = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">EventDispatcher</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        _thread = thread;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<p>まず、TestThreadを作っておきます。TestThreadは、run()メソッドを実行すると以下のような動作をします。</p>
<ul>
<li>コンストラクタで受け取ったThreadを実行(start)して待機(join)します。</li>
<li>受け取ったThreadが完了したら、dispatcherからEvent.COMPLETEを送出します。</li>
</ul>
<p>testコードでは、testしたいThreadをTestThredに渡して、async()メソッドでイベントを待機します。</p>
<p>このようなTestThreadみたいなのって実はネイティブでどこかにあったりするんでしょうか。<br />
みなさん、どのようにThreadのtestを書いているのでしょう？このライブラリのtestに良い例があるよ！とかあったら教えて欲しいですよ！</p>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/526/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>as3paintoco出来たかも</title>
		<link>http://fla.la/archives/371</link>
		<comments>http://fla.la/archives/371#comments</comments>
		<pubDate>Wed, 09 Sep 2009 14:40:34 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[as3paintoco]]></category>
		<category><![CDATA[library swc]]></category>

		<guid isPermaLink="false">http://fla.la/?p=371</guid>
		<description><![CDATA[今年の３月くらいからまったりと開発して来ました、お絵描きライブラリ。
とりあえず、それなりに動くようなりました。
そこで、こっそりとGoogle Codeにて公開してみました。
その名も、as3paintoco(ぺいんとこ)と言います。
機能
主に、以下のような機能を持っています。

undo, redo機能
replay機能
お絵描きした画像の保存機能


使い方
as3paintoco(ぺいんとこ)はFlash Player10.0.32以降に対応しております。ただし、開発中ステータスのため予期しない動作をするかも知れません。その点ご了承下さい。
ライブラリの準備

このライブラリは、as3corelibを使用しているので、as3corelib.swcをライブラリパスに通します。
as3paintoco_alpha4.swcをダウンロードして、ライブラリパスに通します。

サンプルコード
コンテキストメニューからツールを選んで、キャンバスにお絵描きするサンプルです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
package 
&#123;
    import flash.display.Sprite;
    import flash.events.ContextMenuEvent;
    import flash.ui.ContextMenu;
    import flash.ui.ContextMenuItem;
    import jp.wxd.as3paintoco.AS3Paintoco;
    import jp.wxd.as3paintoco.tools.CircleTool;
    import jp.wxd.as3paintoco.tools.ITool;
    import jp.wxd.as3paintoco.tools.LineTool;
    import jp.wxd.as3paintoco.tools.PenTool;
    import jp.wxd.as3paintoco.tools.SelectTool;
 [...]]]></description>
			<content:encoded><![CDATA[<p>今年の３月くらいからまったりと開発して来ました、お絵描きライブラリ。</p>
<p>とりあえず、それなりに動くようなりました。<br />
そこで、こっそりと<a href="http://code.google.com/p/as3paintoco/">Google Codeにて公開</a>してみました。</p>
<p>その名も、as3paintoco(ぺいんとこ)と言います。</p>
<h3>機能</h3>
<p>主に、以下のような機能を持っています。</p>
<ul>
<li>undo, redo機能</li>
<li>replay機能</li>
<li>お絵描きした画像の保存機能</li>
</ul>
<p><span id="more-371"></span></p>
<h3>使い方</h3>
<p>as3paintoco(ぺいんとこ)はFlash Player10.0.32以降に対応しております。ただし、開発中ステータスのため予期しない動作をするかも知れません。その点ご了承下さい。</p>
<h4>ライブラリの準備</h4>
<ol>
<li>このライブラリは、<a href="http://code.google.com/p/as3corelib/">as3corelib</a>を使用しているので、as3corelib.swcをライブラリパスに通します。</li>
<li><a href="http://as3paintoco.googlecode.com/files/as3paintoco_alpha4.swc">as3paintoco_alpha4.swc</a>をダウンロードして、ライブラリパスに通します。</li>
</ol>
<h4>サンプルコード</h4>
<p>コンテキストメニューからツールを選んで、キャンバスにお絵描きするサンプルです。<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_0" width="465" height="465">
      <param name="movie" value="http://asmple.com/as3paintoco/as3paintoco_work2.swf?v=1" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://asmple.com/as3paintoco/as3paintoco_work2.swf?v=1" width="465" height="465">
      <!--<![endif]-->
        <p>The Flash plugin is required to view this object.</p>
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span> 
<span style="color: #000000;">&#123;</span>
    <span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.<span style="color: #004993;">Sprite</span>;
    <span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.events</span>.<span style="color: #004993;">ContextMenuEvent</span>;
    <span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.ui</span>.<span style="color: #004993;">ContextMenu</span>;
    <span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.ui</span>.<span style="color: #004993;">ContextMenuItem</span>;
    <span style="color: #0033ff; font-weight: bold;">import</span> jp.wxd.as3paintoco.AS3Paintoco;
    <span style="color: #0033ff; font-weight: bold;">import</span> jp.wxd.as3paintoco.tools.CircleTool;
    <span style="color: #0033ff; font-weight: bold;">import</span> jp.wxd.as3paintoco.tools.ITool;
    <span style="color: #0033ff; font-weight: bold;">import</span> jp.wxd.as3paintoco.tools.LineTool;
    <span style="color: #0033ff; font-weight: bold;">import</span> jp.wxd.as3paintoco.tools.PenTool;
    <span style="color: #0033ff; font-weight: bold;">import</span> jp.wxd.as3paintoco.tools.SelectTool;
    <span style="color: #0033ff; font-weight: bold;">import</span> jp.wxd.as3paintoco.tools.SquareTool;
    <span style="color: #0033ff; font-weight: bold;">import</span> jp.wxd.as3paintoco.tools.TextTool;
&nbsp;
    <span style="color: #3f5fbf;">/**
     * as3Paintoco sampleコード2
     * @author Copyright (C) naoto koshikawa, All Rights Reserved.
     */</span>
    <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> PaintocoWork2 extends <span style="color: #004993;">Sprite</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #009900;">//----------------------------------------------------------------------</span>
        <span style="color: #009900;">//  properties</span>
        <span style="color: #009900;">//----------------------------------------------------------------------</span>
        <span style="color: #009900;">//------------------------------</span>
        <span style="color: #009900;">//  private properties</span>
        <span style="color: #009900;">//------------------------------</span>
        <span style="color: #3f5fbf;">/**
         * AS3Paintoco instance
         */</span>
        <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _paint<span style="color: #000000; font-weight: bold;">:</span>AS3Paintoco;
&nbsp;
        <span style="color: #3f5fbf;">/**
         * tools
         */</span>
        <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _tools<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Object</span>;
&nbsp;
        <span style="color: #009900;">//----------------------------------------------------------------------</span>
        <span style="color: #009900;">//  methods</span>
        <span style="color: #009900;">//----------------------------------------------------------------------</span>
        <span style="color: #009900;">//------------------------------</span>
        <span style="color: #009900;">//  public methods</span>
        <span style="color: #009900;">//------------------------------</span>
        <span style="color: #3f5fbf;">/**
         * constructor
         */</span>
        <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> PaintocoWork2<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> 
        <span style="color: #000000;">&#123;</span>
            _tools = <span style="color: #000000;">&#123;</span>
                penTool<span style="color: #000000; font-weight: bold;">:</span> <span style="color: #0033ff; font-weight: bold;">new</span> PenTool<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>,
                lineTool<span style="color: #000000; font-weight: bold;">:</span> <span style="color: #0033ff; font-weight: bold;">new</span> LineTool<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>,
                squareTool<span style="color: #000000; font-weight: bold;">:</span> <span style="color: #0033ff; font-weight: bold;">new</span> SquareTool<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>,
                circleTool<span style="color: #000000; font-weight: bold;">:</span> <span style="color: #0033ff; font-weight: bold;">new</span> CircleTool<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>,
                textTool<span style="color: #000000; font-weight: bold;">:</span> <span style="color: #0033ff; font-weight: bold;">new</span> TextTool<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>,
                selectTool<span style="color: #000000; font-weight: bold;">:</span> <span style="color: #0033ff; font-weight: bold;">new</span> SelectTool<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#125;</span>;
&nbsp;
            _tools.textTool.options = <span style="color: #000000;">&#123;</span>
                <span style="color: #004993;">size</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #000000; font-weight:bold;">24</span>
            <span style="color: #000000;">&#125;</span>;
&nbsp;
            <span style="color: #009900;">// AS3Paintocoのインスタンスを生成します。</span>
            _paint = <span style="color: #0033ff; font-weight: bold;">new</span> AS3Paintoco<span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">this</span>, <span style="color: #000000; font-weight:bold;">465</span>, <span style="color: #000000; font-weight:bold;">465</span><span style="color: #000000;">&#41;</span>;
            _paint.replayable = <span style="color: #0033ff; font-weight: bold;">true</span>;
            initialize<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
            createMenu<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #3f5fbf;">/**
         * initialize 
         */</span>
        <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> initialize<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
        <span style="color: #000000;">&#123;</span>
           _paint.initialize<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
           <span style="color: #009900;">// 初期ツールを設定します。</span>
            _paint.applyTool<span style="color: #000000;">&#40;</span>_tools.penTool<span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #009900;">// キャンバスをアクティブにしお絵描き可能にします。</span>
            _paint.<span style="color: #004993;">activate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #3f5fbf;">/**
         * create context menu
         */</span>
        <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> createMenu<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">contextMenu</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenu</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenu</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">hideBuiltInItems</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #6699cc; font-weight: bold;">var</span> penMenu<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuItem</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;penTool&quot;</span>, <span style="color: #0033ff; font-weight: bold;">true</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #6699cc; font-weight: bold;">var</span> lineMenu<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuItem</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;lineTool&quot;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #6699cc; font-weight: bold;">var</span> squareMenu<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuItem</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;squareTool&quot;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #6699cc; font-weight: bold;">var</span> circleMenu<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuItem</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;circleTool&quot;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #6699cc; font-weight: bold;">var</span> textMenu<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuItem</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;textTool&quot;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #6699cc; font-weight: bold;">var</span> selectMenu<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuItem</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;selectTool&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            penMenu.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ContextMenuEvent</span>.<span style="color: #004993;">MENU_ITEM_SELECT</span>,
                contexToolMenu_menuSelect<span style="color: #000000;">&#41;</span>;
            lineMenu.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ContextMenuEvent</span>.<span style="color: #004993;">MENU_ITEM_SELECT</span>,
                contexToolMenu_menuSelect<span style="color: #000000;">&#41;</span>;
            squareMenu.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ContextMenuEvent</span>.<span style="color: #004993;">MENU_ITEM_SELECT</span>,
                contexToolMenu_menuSelect<span style="color: #000000;">&#41;</span>;
            circleMenu.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ContextMenuEvent</span>.<span style="color: #004993;">MENU_ITEM_SELECT</span>,
                contexToolMenu_menuSelect<span style="color: #000000;">&#41;</span>;
            textMenu.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ContextMenuEvent</span>.<span style="color: #004993;">MENU_ITEM_SELECT</span>,
                contexToolMenu_menuSelect<span style="color: #000000;">&#41;</span>;
            selectMenu.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ContextMenuEvent</span>.<span style="color: #004993;">MENU_ITEM_SELECT</span>,
                contexToolMenu_menuSelect<span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #6699cc; font-weight: bold;">var</span> clearMenu<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuItem</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;clearAction&quot;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #6699cc; font-weight: bold;">var</span> undoMenu<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuItem</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;undoAction&quot;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #6699cc; font-weight: bold;">var</span> redoMenu<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuItem</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;redoAction&quot;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #6699cc; font-weight: bold;">var</span> replayMenu<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuItem</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;replayAction&quot;</span>, <span style="color: #0033ff; font-weight: bold;">true</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #6699cc; font-weight: bold;">var</span> saveMenu<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuItem</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;saveAction&quot;</span>, <span style="color: #0033ff; font-weight: bold;">true</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            clearMenu.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ContextMenuEvent</span>.<span style="color: #004993;">MENU_ITEM_SELECT</span>,
                contexActionMenu_menuSelect<span style="color: #000000;">&#41;</span>;
            undoMenu.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ContextMenuEvent</span>.<span style="color: #004993;">MENU_ITEM_SELECT</span>,
                contexActionMenu_menuSelect<span style="color: #000000;">&#41;</span>;
            redoMenu.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ContextMenuEvent</span>.<span style="color: #004993;">MENU_ITEM_SELECT</span>,
                contexActionMenu_menuSelect<span style="color: #000000;">&#41;</span>;
            replayMenu.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ContextMenuEvent</span>.<span style="color: #004993;">MENU_ITEM_SELECT</span>,
                contexActionMenu_menuSelect<span style="color: #000000;">&#41;</span>;
            saveMenu.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">ContextMenuEvent</span>.<span style="color: #004993;">MENU_ITEM_SELECT</span>,
				contexActionMenu_menuSelect<span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">customItems</span>.<span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>clearMenu<span style="color: #000000;">&#41;</span>;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">customItems</span>.<span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>undoMenu<span style="color: #000000;">&#41;</span>;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">customItems</span>.<span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>redoMenu<span style="color: #000000;">&#41;</span>;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">customItems</span>.<span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>replayMenu<span style="color: #000000;">&#41;</span>;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">customItems</span>.<span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>penMenu<span style="color: #000000;">&#41;</span>;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">customItems</span>.<span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>lineMenu<span style="color: #000000;">&#41;</span>;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">customItems</span>.<span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>squareMenu<span style="color: #000000;">&#41;</span>;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">customItems</span>.<span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>circleMenu<span style="color: #000000;">&#41;</span>;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">customItems</span>.<span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>textMenu<span style="color: #000000;">&#41;</span>;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">customItems</span>.<span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>selectMenu<span style="color: #000000;">&#41;</span>;
            <span style="color: #004993;">contextMenu</span>.<span style="color: #004993;">customItems</span>.<span style="color: #004993;">push</span><span style="color: #000000;">&#40;</span>saveMenu<span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #0033ff; font-weight: bold;">this</span>.<span style="color: #004993;">contextMenu</span> = <span style="color: #004993;">contextMenu</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #009900;">//----------------------------------------------------------------------</span>
        <span style="color: #009900;">//  event listener</span>
        <span style="color: #009900;">//----------------------------------------------------------------------</span>
        <span style="color: #3f5fbf;">/**
         * ContextMenuEvent.MENU_SELECT
         * @param    event
         */</span>
        <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> contexToolMenu_menuSelect<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> toolKey<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span>event.<span style="color: #004993;">target</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">caption</span>;
            <span style="color: #009900;">// 選択されたツールを適用します。</span>
            _paint.applyTool<span style="color: #000000;">&#40;</span>_tools<span style="color: #000000;">&#91;</span>toolKey<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #3f5fbf;">/**
         * ContextMenuEvent.MENU_SELECT
         * @param    event
         */</span>
        <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> contexActionMenu_menuSelect<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ContextMenuEvent</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> toolKey<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = <span style="color: #004993;">ContextMenuItem</span><span style="color: #000000;">&#40;</span>event.<span style="color: #004993;">target</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">caption</span>;
            <span style="color: #0033ff; font-weight: bold;">switch</span> <span style="color: #000000;">&#40;</span>toolKey<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0033ff; font-weight: bold;">case</span> <span style="color: #990000;">&quot;clearAction&quot;</span><span style="color: #000000; font-weight: bold;">:</span>
                    <span style="color: #009900;">// 初期化します。</span>
                    initialize<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
                    <span style="color: #0033ff; font-weight: bold;">break</span>;
                <span style="color: #0033ff; font-weight: bold;">case</span> <span style="color: #990000;">&quot;undoAction&quot;</span><span style="color: #000000; font-weight: bold;">:</span>
                    <span style="color: #009900;">// ワンストロークを取り消します。</span>
                    _paint.undo<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
                    <span style="color: #0033ff; font-weight: bold;">break</span>;
                <span style="color: #0033ff; font-weight: bold;">case</span> <span style="color: #990000;">&quot;redoAction&quot;</span><span style="color: #000000; font-weight: bold;">:</span>
                    <span style="color: #009900;">// ワンストロークをやり直します。</span>
                    _paint.redo<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
                    <span style="color: #0033ff; font-weight: bold;">break</span>;
                <span style="color: #0033ff; font-weight: bold;">case</span> <span style="color: #990000;">&quot;replayAction&quot;</span><span style="color: #000000; font-weight: bold;">:</span>
                    <span style="color: #009900;">// 最初からお絵描きを再生します。</span>
                    _paint.replay<span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight:bold;">5.0</span><span style="color: #000000;">&#41;</span>;
                    <span style="color: #0033ff; font-weight: bold;">break</span>;
                <span style="color: #0033ff; font-weight: bold;">case</span> <span style="color: #990000;">&quot;saveAction&quot;</span><span style="color: #000000; font-weight: bold;">:</span>
                    <span style="color: #009900;">// お絵描きしたキャンバスをローカルファイルに保存します。</span>
                    _paint.<span style="color: #004993;">save</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;paint.png&quot;</span><span style="color: #000000;">&#41;</span>;
                    <span style="color: #0033ff; font-weight: bold;">break</span>;
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<h3>その他のサンプル</h3>
<p>as3paintoco(ぺいんとこ)を使って作成したお絵描きツールです。<br />
現状は、UIを作成する手間がかかるので、今後、簡単に各種ツールボタンやオプション設定用のUIやスキンを作成することもぼんやりと考えております。</p>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_1" width="600" height="500">
      <param name="movie" value="http://asmple.com/as3paintoco/sample_simple1.swf?v=3" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://asmple.com/as3paintoco/sample_simple1.swf?v=3" width="600" height="500">
      <!--<![endif]-->
        <p>The Flash plugin is required to view this object.</p>
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<h3>まとめ</h3>
<p>というわけで、今回は簡単な紹介でした。今後も、お絵描きライブラリのas3paintoco(ぺいんとこ)は開発を進めながら追加機能などを紹介していきます。</p>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/371/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Objectのclone</title>
		<link>http://fla.la/archives/503</link>
		<comments>http://fla.la/archives/503#comments</comments>
		<pubDate>Tue, 08 Sep 2009 11:20:48 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[as3tips]]></category>
		<category><![CDATA[clone]]></category>

		<guid isPermaLink="false">http://fla.la/?p=503</guid>
		<description><![CDATA[いつも忘れるんですが、ByteArrayを使うとdeep copyが実現出来ます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package
&#123;
	import flash.utils.ByteArray;
	/**
	 * &#60;p&#62;Objectのdeep copyを実行する関数です。&#60;/p&#62;
	 */
	public function clone&#40;object:Object&#41;:Object
	&#123;
		var byteArray:ByteArray = new ByteArray&#40;&#41;;
		byteArray.writeObject&#40;object&#41;;
		byteArray.position = 0;
		return byteArray.readObject&#40;&#41;;
	&#125;
&#125;


出典
ActionScript3 における deep copy

]]></description>
			<content:encoded><![CDATA[<p>いつも忘れるんですが、ByteArrayを使うとdeep copyが実現出来ます。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.utils</span>.<span style="color: #004993;">ByteArray</span>;
	<span style="color: #3f5fbf;">/**
	 * &lt;p&gt;Objectのdeep copyを実行する関数です。&lt;/p&gt;
	 */</span>
	<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #004993;">clone</span><span style="color: #000000;">&#40;</span>object<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Object</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Object</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #6699cc; font-weight: bold;">var</span> byteArray<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ByteArray</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ByteArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
		byteArray.<span style="color: #004993;">writeObject</span><span style="color: #000000;">&#40;</span>object<span style="color: #000000;">&#41;</span>;
		byteArray.<span style="color: #004993;">position</span> = <span style="color: #000000; font-weight:bold;">0</span>;
		<span style="color: #0033ff; font-weight: bold;">return</span> byteArray.<span style="color: #004993;">readObject</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></td></tr></table></div>

<dl>
<dt>出典</dt>
<dd><cite><a href="http://d.hatena.ne.jp/secondlife/20071127/1196123078">ActionScript3 における deep copy</a></cite></dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/503/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>the Union Procecure Callの仕様を読む</title>
		<link>http://fla.la/archives/490</link>
		<comments>http://fla.la/archives/490#comments</comments>
		<pubDate>Tue, 08 Sep 2009 03:39:48 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>
		<category><![CDATA[specification]]></category>

		<guid isPermaLink="false">http://fla.la/?p=490</guid>
		<description><![CDATA[Unionプラットフォームで使用されるUPCプロトコルの仕様を読んでみました。
ついでに、メモ書き程度に訳してみました。
UPC versionは、1.4.0(2009年09月4日現在)となっております。
UPCとは、the Union Procecure Callの略です。ReactorとUnion Serverとの間で取り交わされる内部的なメッセージフォーマットです。基本的に、Unionを利用する開発者が意識的に操作することはありません。

構造
UPCは簡単なXML形式で表されます。XMLには、メッセージIDと複数の引数のリストが含まれます。
以下がUPCの例です。

&#60;U&#62;
	&#60;M&#62;C2S_CLIENT_HELLO(u65)&#60;/M&#62;
	&#60;L&#62;
		&#60;A&#62;Reactor&#60;/A&#62;
		&#60;A&#62;Flash Player WIN 10,0,32,18 StandAlone (debug, localTrusted); 1.0.0 (Build 252)&#60;/A&#62;
		&#60;A&#62;1.4.0&#60;/A&#62;
	&#60;/L&#62;
&#60;/U&#62;


メッセージID
C2S_CLIENT_HELLO(u65)
引数リスト


Reactor
Flash Player WIN 10,0,32,18 StandAlone (debug, localTrusted); 1.0.0 (Build 252)
1.4.0



メッセージID
メッセージIDは()内のショートコードが一意となっています。L要素内の各A要素が引数のリストとなります。
予約語
完全修飾Room IDには、*(アスタリスク), &#124;(パイプ)を含めることが出来ません。
*(アスタリスク)
*(アスタリスク)はRoom IDの修飾時に、ワイルドカードとして働きます。たとえば、

com.asmple.chat.*

はcom.asmple.chat.fashion, com.asmple.chat.gameなど、com.asmple.chat.で修飾されるRoom IDすべてを指します。
&#124;(パイプ)
&#124;(パイプ)は項目の区切りとして使用します。
以下のようなメッセージで確認できます。

&#60;U&#62;
	&#60;M&#62;C2S_CREATE_ROOM(u24)&#60;/M&#62;
	&#60;L&#62;
		&#60;A&#62;&#60;![CDATA[com.asmple.union.alpha4.test]] &#62;&#60;/A&#62;
		&#60;A&#62;&#60;![CDATA[_DIE_ON_EMPTY&#124;true&#124;_MAX_CLIENTS&#124;-1&#124;_PASSWORD&#124;&#124;_CLIENT_TIMEOUT&#124;-1]] &#62;&#60;/A&#62;
		&#60;A&#62;&#60;/A&#62;
		&#60;A&#62;&#60;/A&#62;
	&#60;/L&#62;
&#60;/U&#62;

上記のUPCメッセージは、以下のコードを実行した際にUnion Serverへ送信されたものです。

// _reactorはReactorEvent.READYイベントを送出済みのReactorインスタンス
var room:Room = _reactor.getRoomManager&#40;&#41;.createRoom&#40;&#34;com.asmple.union.alpha4.test&#34;&#41;;

RoomManagerインスタンスのcreateRoomメソッドの引数を確認すると第二引数はRoomSettingsインスタンスを受け取ることが分かります。
この例では、第二引数以降を省略しているため、内部でデフォルトのRoomSettingsを渡していると思われます。
RoomSettingsのドキュメントを確認すると、デフォルトの値と先ほどのUPCのメッセージの引数として渡されている値が一致していることが分かります。
このようにRoomのセッティングの内容が&#124;(パイプ)区切りで送信されていることが分かります。
この&#124;(パイプ)の文字列は、Tokens.RS定数の値です。
ネイティブUPCメッセージ
UPCで定義されるメッセージ一覧です。とてつもなく長いです。
ReactorからUnion Serverへ送信されるメッセージ
SEND_MESSAGE_TO_ROOMS
Union Serverに対して、Message識別子で識別されるRECEIVE_MESSAGE(u7)メッセージの送信を要求します。Union Serverは指定されたRoom IDリストに含まれるRoomにjoin, observeし、指定されてたフィルター条件に合致するClientへRECEIVE_MESSAGE(u7)メッセージを送信します。

内部コード
u1
引数


Message識別子
Tokens.RS区切りの送信先Room IDリスト
送信先に自身を含むかどうかのフラグ
フィルター
sendMessageの引数(以降、複数指定可能


対応するReactor API


RoomManager.sendMessage()
Room.sendMessage()



SEND_MESSAGE_TO_CLIENTS
Union Serverに対して、Message識別子で識別されるRECEIVE_MESSAGE(u7)メッセージの送信を要求します。Union Serverは指定されたClient IDリストに含まれ、指定されてたフィルター条件に合致するClientへRECEIVE_MESSAGE(u7)メッセージを送信します。ただし、Client.sendMessage()の実装では、フィルターはなし、指定出来るClient IDは固定でClientインスタンスが表すClient ID1つです。

内部コード
u2
引数


Message識別子
Tokens.RS区切りの送信先Client IDリスト
フィルター
sendMessageの引数(以降、複数指定可能)


対応するReactor API


Client.sendMessage()



SEND_MESSAGE_TO_SERVER
Union Serververに対して、Message識別子で識別されるRECEIVE_MESSAGE(u7)メッセージの送信を要求します。Union Serverは指定されたフィルター条件に合致するClientへRECEIVE_MESSAGE(u7)メッセージを送信します。

内部コード
u57
引数


Message識別子
送信先に自身を含むかどうかのフラグ
フィルター
sendMessageの引数(以降、複数指定可能)


対応するReactor API


Server.sendMessage()



SET_CLIENT_ATTR
Union Serverに対して、指定したClientのClient Attributeの設定を要求します。Union [...]]]></description>
			<content:encoded><![CDATA[<p>Unionプラットフォームで使用される<a href="http://unionplatform.com/specs/upc/">UPCプロトコルの仕様</a>を読んでみました。<br />
ついでに、メモ書き程度に訳してみました。</p>
<p>UPC versionは、1.4.0(2009年09月4日現在)となっております。<br />
UPCとは、the Union Procecure Callの略です。ReactorとUnion Serverとの間で取り交わされる内部的なメッセージフォーマットです。基本的に、Unionを利用する開発者が意識的に操作することはありません。</p>
<p><span id="more-490"></span></p>
<h3>構造</h3>
<p>UPCは簡単なXML形式で表されます。XMLには、メッセージIDと複数の引数のリストが含まれます。</p>
<p>以下がUPCの例です。</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>C2S_CLIENT_HELLO(u65)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Reactor<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Flash Player WIN 10,0,32,18 StandAlone (debug, localTrusted); 1.0.0 (Build 252)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1.4.0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/L<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<dl>
<dt>メッセージID</dt>
<dd>C2S_CLIENT_HELLO(u65)</dd>
<dt>引数リスト</dt>
<dd>
<ul>
<li>Reactor</li>
<li>Flash Player WIN 10,0,32,18 StandAlone (debug, localTrusted); 1.0.0 (Build 252)</li>
<li>1.4.0</li>
</ul>
</dd>
</dl>
<h4>メッセージID</h4>
<p>メッセージIDは()内のショートコードが一意となっています。L要素内の各A要素が引数のリストとなります。</p>
<h4>予約語</h4>
<p>完全修飾Room IDには、*(アスタリスク), |(パイプ)を含めることが出来ません。</p>
<h5>*(アスタリスク)</h5>
<p>*(アスタリスク)はRoom IDの修飾時に、ワイルドカードとして働きます。たとえば、</p>
<pre>
com.asmple.chat.*
</pre>
<p>はcom.asmple.chat.fashion, com.asmple.chat.gameなど、com.asmple.chat.で修飾されるRoom IDすべてを指します。</p>
<h5>|(パイプ)</h5>
<p>|(パイプ)は項目の区切りとして使用します。</p>
<p>以下のようなメッセージで確認できます。</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;U<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>C2S_CREATE_ROOM(u24)<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/M<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;L<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;A<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><span style="color: #339933;">&lt;![CDATA[com.asmple.union.alpha4.test]] &gt;&lt;/A&gt;</span>
<span style="color: #339933;">		&lt;A&gt;&lt;![CDATA[_DIE_ON_EMPTY|true|_MAX_CLIENTS|-1|_PASSWORD||_CLIENT_TIMEOUT|-1]] &gt;&lt;/A&gt;</span>
<span style="color: #339933;">		&lt;A&gt;&lt;/A&gt;</span>
<span style="color: #339933;">		&lt;A&gt;&lt;/A&gt;</span>
<span style="color: #339933;">	&lt;/L&gt;</span>
<span style="color: #339933;">&lt;/U&gt;</span></pre></div></div>

<p>上記のUPCメッセージは、以下のコードを実行した際にUnion Serverへ送信されたものです。</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// _reactorはReactorEvent.READYイベントを送出済みのReactorインスタンス</span>
<span style="color: #6699cc; font-weight: bold;">var</span> room<span style="color: #000000; font-weight: bold;">:</span>Room = _reactor.getRoomManager<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.createRoom<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;com.asmple.union.alpha4.test&quot;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

<p><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/RoomManager.html#createRoom%28%29">RoomManagerインスタンスのcreateRoomメソッド</a>の引数を確認すると第二引数はRoomSettingsインスタンスを受け取ることが分かります。</p>
<p>この例では、第二引数以降を省略しているため、内部でデフォルトのRoomSettingsを渡していると思われます。</p>
<p><a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/RoomSettings.html">RoomSettings</a>のドキュメントを確認すると、デフォルトの値と先ほどのUPCのメッセージの引数として渡されている値が一致していることが分かります。</p>
<p>このようにRoomのセッティングの内容が|(パイプ)区切りで送信されていることが分かります。</p>
<p>この|(パイプ)の文字列は、<a href="http://keno.serio.jp/union/docs/reactor/api/net/user1/reactor/Tokens.html#RS">Tokens.RS定数</a>の値です。</p>
<h3>ネイティブUPCメッセージ</h3>
<p>UPCで定義されるメッセージ一覧です。とてつもなく長いです。</p>
<h4>ReactorからUnion Serverへ送信されるメッセージ</h4>
<h5>SEND_MESSAGE_TO_ROOMS</h5>
<p>Union Serverに対して、Message識別子で識別されるRECEIVE_MESSAGE(u7)メッセージの送信を要求します。Union Serverは指定されたRoom IDリストに含まれるRoomにjoin, observeし、指定されてたフィルター条件に合致するClientへRECEIVE_MESSAGE(u7)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u1</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Message識別子</li>
<li>Tokens.RS区切りの送信先Room IDリスト</li>
<li>送信先に自身を含むかどうかのフラグ</li>
<li>フィルター</li>
<li>sendMessageの引数(以降、複数指定可能</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.sendMessage()</li>
<li>Room.sendMessage()</li>
</ul>
</dd>
</dl>
<h5>SEND_MESSAGE_TO_CLIENTS</h5>
<p>Union Serverに対して、Message識別子で識別されるRECEIVE_MESSAGE(u7)メッセージの送信を要求します。Union Serverは指定されたClient IDリストに含まれ、指定されてたフィルター条件に合致するClientへRECEIVE_MESSAGE(u7)メッセージを送信します。ただし、Client.sendMessage()の実装では、フィルターはなし、指定出来るClient IDは固定でClientインスタンスが表すClient ID1つです。</p>
<dl>
<dt>内部コード</dt>
<dd>u2</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Message識別子</li>
<li>Tokens.RS区切りの送信先Client IDリスト</li>
<li>フィルター</li>
<li>sendMessageの引数(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Client.sendMessage()</li>
</ul>
</dd>
</dl>
<h5>SEND_MESSAGE_TO_SERVER</h5>
<p>Union Serververに対して、Message識別子で識別されるRECEIVE_MESSAGE(u7)メッセージの送信を要求します。Union Serverは指定されたフィルター条件に合致するClientへRECEIVE_MESSAGE(u7)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u57</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Message識別子</li>
<li>送信先に自身を含むかどうかのフラグ</li>
<li>フィルター</li>
<li>sendMessageの引数(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Server.sendMessage()</li>
</ul>
</dd>
</dl>
<h5>SET_CLIENT_ATTR</h5>
<p>Union Serverに対して、指定したClientのClient Attributeの設定を要求します。Union Serverは要求の結果をSET_CLIENT_ATTR_RESULT(u73)メッセージで送信します。成功した場合、Union Serverは、CLIENT_ATTR_UPDATE(u8)メッセージも送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u3</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client ID</li>
<li>Client Attribute名</li>
<li>Client Attribute値</li>
<li>スコープ</li>
<li>オプションを8bitで指定</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Client.setAttribute()</li>
</ul>
</dd>
</dl>
<h5>JOIN_ROOM </h5>
<p>Union Serverに対して、指定したRoomへのjoinを要求します。Union Serverは要求の結果をJOIN_ROOM_RESULT(u72)メッセージで送信します。成功した場合、Union Serverは、JOINED_ROOM(u6)メッセージも送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u4</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room パスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.join()</li>
</ul>
</dd>
</dl>
<h5>SET_ROOM_ATTR</h5>
<p>Union Serverに対して、指定したRoomのRoom Attributeの設定を要求します。Union Serverは要求の結果をSET_ROOM_ATTR_RESULT(u74)メッセージで送信します。成功した場合、Union Serverは、ROOM_ATTR_UPDATE(u9)メッセージも送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u5</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room Attribute名</li>
<li>Room Attribute値</li>
<li>オプションを8bitで指定</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.setAttribute()</li>
</ul>
</dd>
</dl>
<h5>LEAVE_ROOM</h5>
<p>Union Serverに対して、送信元のClientを指定したRoomからのleaveを要求します。Union Serverは要求の結果をLEAVE_ROOM_RESULT(u76)メッセージで送信します。成功した場合、Union Serverは、LEFT_ROOM(u44)メッセージも送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u10</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.leave()</li>
</ul>
</dd>
</dl>
<h5>CREATE_PERSISTENT_CLIENT</h5>
<p>Union Serverに対して、送信元のClientをデータベース内の永続化クライアントとしての登録を要求します。</p>
<dl>
<dt>内部コード</dt>
<dd>u11</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client名</li>
<li>Clientパスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>PersistenceManager.createPersistentClient()</li>
</ul>
</dd>
</dl>
<h5>REMOVE_PERSISTENT_CLIENT</h5>
<p>Union Serverに対して、送信元のClientをデータベース内の永続化クライアントとしての解除を要求します。</p>
<dl>
<dt>内部コード</dt>
<dd>u12</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client名</li>
<li>Clientパスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>PersistenceManager.removePersistentClient()</li>
</ul>
</dd>
</dl>
<h5>CHANGE_PERSISTENT_CLIENT</h5>
<p>Union Serverに対して、送信元のClientの永続化クライアントパスワード変更を要求します。</p>
<dl>
<dt>内部コード</dt>
<dd>u13</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client名</li>
<li>Clientの現在のパスワード</li>
<li>Clientの新しいパスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>PersistenceManager.changePersistentClient()</li>
</ul>
</dd>
</dl>
<h5>LOGIN_CLIENT</h5>
<p>Union Serverに対して、送信元のClientに対応した永続化クライアントでのログインを要求します。Union Serverは、永続化クライアントのClient AttributeをCLIENT_ATTR_UPDATE(u8)メッセージで送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u14</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client名</li>
<li>Clientパスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>PersistenceManager.loginClient()</li>
</ul>
</dd>
</dl>
<h5>GET_NUM_CLIENTS</h5>
<p>Union Serverに対して、指定したRoom内のClient数を要求する。Union Serverは要求の結果をGET_NUM_CLIENTS_RESULT(u75)メッセージで送信します。成功した場合、Union ServerはNUM_CLIENTS_UPDATE(u34)メッセージも送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u18</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room IDまたは、Room修飾子</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.getNumClientsInRooms()</li>
<li>Room.synchronizeClientCount()</li>
<li>Server.getNumClientsOnServer()</li>
</ul>
</dd>
</dl>
<h5>SYNC_TIME</h5>
<p>Union Serverに対して、現在の時刻の送信を要求します。Union ServerはSERVER_TIME_UPDATE(u50)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u19</dd>
<dt>引数</dt>
<dd>
<ul>
<li>なし</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Server.syncTime()</li>
</ul>
</dd>
</dl>
<h5>GET_ROOM_LIST</h5>
<p>Union Serverに対して、指定したRoomのリストの取得を要求します。Union ServerはROOM_LIST_UPDATE(u38)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u21</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room 修飾子</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.getRoomListFromServer()</li>
</ul>
</dd>
</dl>
<h5>CREATE_ROOM</h5>
<p>Union Serverに対して、指定したRoom IDのRoom作成を要求します。Union Serverは要求の結果をROOM_ADDED(u39)メッセージで送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u24</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Tokens.RS区切りのRoom Settings項目リスト</li>
<li>Tokens.RS区切りのRoom Attribute項目リスト</li>
<li>Tokens.RS区切りのRooom Module ClassまたはScriptリスト</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.createRoom()</li>
</ul>
</dd>
</dl>
<h5>REMOVE_ROOM</h5>
<p>Union Serverに対して、指定したRoom IDのRoom削除を要求します。Union Serverは要求の結果を、このメッセージを送信したClientに対して、REMOVE_ROOM_RESULT(u33)メッセージを送信します。Union Serverは要求の結果をRoom内の全クライアントにROOM_REMOVED(u40)メッセージで送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u25</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room パスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.removeRoom()</li>
</ul>
</dd>
</dl>
<h5>WATCH_FOR_ROOMS</h5>
<p>Union Serverに対して、指定したRoom 修飾子のRoomが追加、削除された際の通知を要求します。Union Serverは要求の結果をWATCH_FOR_ROOMS_RESULT(u42)メッセージで送信します。その際、1つでも一致するRoomが存在すれば、Union ServerはROOM_LIST_UPDATE(u38)メッセージを送信します。</p>
<p>引き続き、Union Serverは修飾子に一致するRoomが追加されれば、ROOM_ADDED(u39)メッセージを送信します。削除されえば、ROOM_REMOVED(u40)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u26</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room 修飾子</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.watchForRooms()</li>
</ul>
</dd>
</dl>
<h5>STOP_WATCHING_FOR_ROOMS</h5>
<p>Union Serverに対して、指定したRoom 修飾子のRoomが追加、削除された際の通知停止を要求します。Union Serverは要求の結果をSTOP_WATCHING_FOR_ROOMS_RESULT(u43)メッセージで送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u27</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room 修飾子</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>RoomManager.stopWatchingForRooms()</li>
</ul>
</dd>
</dl>
<h5>SYNC_ROOM</h5>
<p>Union Serverに対して、指定したRoomのスナップショットを要求します。Union Serverは要求の結果をSYNC_ROOM_RESULT(u60)メッセージで送信します。成功した場合、Union ServerはROOM_SNAPSHOT(u54)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u55</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room パスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.synchronize()</li>
<li>RoomManager.synchronizeRoom()</li>
</ul>
</dd>
</dl>
<h5>OBSERVE_ROOM</h5>
<p>Union Serverに対して、指定したRoomへのobserveを要求します。Union Serverは要求の結果をOBSERVE_ROOM_RESULT(u77)メッセージで送信します。成功した場合、Union ServerはOBSERVED_ROOM(u59)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u58</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room パスワード</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.observe()</li>
<li>RoomManager.observeRoom()</li>
</ul>
</dd>
</dl>
<h5>STOP_OBSERVING_ROOM</h5>
<p>Union Serverに対して、指定したRoomへのobserve停止を要求します。Union Serverは要求の結果をSTOP_OBSERVING_ROOM_RESULT(u78)メッセージで送信します。成功した場合、Union ServerはJOIN_ROOM_RESULT(u62)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u61</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.stopObserving()</li>
<li>RoomManager.stopObservingRoom()</li>
</ul>
</dd>
</dl>
<h5>SET_ROOM_UPDATE_LEVELS</h5>
<p>Union Serverに対して、指定したRoom内での更新通知レベル設定を要求します。</p>
<dl>
<dt>内部コード</dt>
<dd>u64</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Tokens.RS区切りの入室者更新レベル, Room更新レベル, Message更新レベル</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.setUpdateLevels()</li>
<li>Room.join()</li>
<li>Room.observe()</li>
<li>RoomManager.joinRoom()</li>
<li>RoomManager.observeRoom()</li>
</ul>
</dd>
</dl>
<h5>CLIENT_HELLO</h5>
<p>Union Serverに対して、コネクションを要求します。Union Serverは、SERVER_HELLO(u66)メッセージを送信します。要求が成功した場合、Union Serverは、CLIENT_METADATA(u29)、CLIENT_READY(u63)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u65</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client タイプ</li>
<li>ユーザーエージェント</li>
<li>UPCバージョン</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>ReactorEvent.PROTOCOL_INCOMPATIBLE.</li>
</ul>
</dd>
</dl>
<h5>REMOVE_ROOM_ATTR</h5>
<p>Union Serverに対して、指定したRoomのRoom Attributeの削除を要求します。Union Serverは要求の結果を、REMOVE_ROOM_ATTR_RESULT(u80)メッセージで送信します。要求が成功した場合、Union ServerはROOM_ATTR_REMOVED(u79)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u67</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room Attribute名</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.deleteAttribute()</li>
</ul>
</dd>
</dl>
<h5>REMOVE_CLIENT_ATTR</h5>
<p>Union Serverに対して、Client Attributeの削除を要求します。Union Serverは要求の結果を、REMOVE_CLIENT_ATTR_RESULT(u82)メッセージで送信します。要求が成功した場合、Union ServerはCLIENT_ATTR_REMOVED(u81)メッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u69</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client ID</li>
<li>Client Attribute名</li>
<li>Client Attributeスコープ</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Client.deleteAttribute()</li>
</ul>
</dd>
</dl>
<h5>SEND_ROOMMODULE_MESSAGE</h5>
<p>Union Serverに対して、指定したRoomにモジュールメッセージ識別子で指定したモジュールメッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u70</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>モジュールメッセージ識別子</li>
<li>モジュールメッセージ引数(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Room.sendModuleMessage()</li>
</ul>
</dd>
</dl>
<h5>SEND_SERVERMODULE_MESSAGE</h5>
<p>Union Serverに対して、指定したモジュールにモジュールメッセージ識別子で指定したモジュールメッセージを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u71</dd>
<dt>引数</dt>
<dd>
<ul>
<li>モジュール ID</li>
<li>モジュールメッセージ識別子</li>
<li>モジュールメッセージ引数(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応するReactor API</dt>
<dd>
<ul>
<li>Server.sendModuleMessage()</li>
</ul>
</dd>
</dl>
<h4>Union ServerからReactorへ送信されるメッセージ</h4>
<h5>JOINED_ROOM</h5>
<p>Clientがjoinしたroomの情報を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u6</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
</dl>
<h5>RECEIVE_MESSAGE</h5>
<p>Messageを送信します。</p>
<dl>
<dt>内部コード</dt>
<dd>u7</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Message識別子</li>
<li>ブロードキャストタイプ</li>
<li>送信元Client ID(Union Serverが送信元の場合は空)</li>
<li>送信先Room ID</li>
<li>sendMessageの引数(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>MessageManager.addMessageListener() (直接ではない)</li>
<li>Room.addMessageListener() (直接ではない)</li>
</ul>
</dd>
</dl>
<h6>ブロードキャストタイプ</h6>
<table class="data_table">
<caption>ブロードキャストタイプ</caption>
<thead>
<tr>
<th>値</th>
<th>意味</th>
<th>受け取るClient</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>サーバー宛</td>
<td>全Client</td>
</tr>
<tr>
<td>1</td>
<td>ルーム宛</td>
<td>指定Room全Client</td>
</tr>
<tr>
<td>2</td>
<td>クライアント宛</td>
<td>指定Client</td>
</tr>
</tbody>
</table>
<h5>CLIENT_ATTR_UPDATE</h5>
<p>Client Attributeの更新を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u8</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Client Attribute名</li>
<li>Client Attribute値</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.UPDATE_CLIENT_ATTRIBUTE</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul></ul>
</dd>
</dl>
<h5>ROOM_ATTR_UPDATE</h5>
<dl>
<dt>内部コード</dt>
<dd>u9</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID(Union Serverが更新元の場合は空)</li>
<li>Room Attribute名</li>
<li>Room Attribute値</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.UPDATE_ROOM_ATTRIBUTE</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul></ul>
</dd>
</dl>
<h5>CLIENT_METADATA</h5>
<p>接続元Clientへ初期情報を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u29</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Client ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>なし(UPCが内部的に処理します)</li>
</ul>
</dd>
</dl>
<h5>CREATE_ROOM_RESULT</h5>
<p>ClientのRoom作成試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u32</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.CREATE_ROOM_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_EXISTS</li>
</ul>
</dd>
</dl>
<h5>REMOVE_ROOM_RESULT</h5>
<p>ClientのRoom削除試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u33</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.REMOVE_ROOM_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_NOT_FOUND</li>
<li>AUTHORIZATION_REQUIRED</li>
<li>AUTHORIZATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>NUM_CLIENTS_UPDATE</h5>
<p>特定のスコープ内RoomのClient数を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u34</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Roomのスコープ</li>
<li>総Client数</li>
<li>ユニークClient数</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.CLIENT_COUNT</li>
<li>RoomManagerEvent.CLIENT_COUNT</li>
<li>ServerEvent.CLIENT_COUNT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li></li>
</ul>
</dd>
</dl>
<h5>CLIENT_ADDED</h5>
<p>ClientがRoomにjoinしたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u36</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Tokens.RS区切りのグローバルClient Attribute</li>
<li>Tokens.RS区切りのRoomスコープ Client Attribute</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.ADD_CLIENT</li>
</ul>
</dd>
</dl>
<h5>CLIENT_REMOVED</h5>
<p>ClientがRoomからleaveしたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u37</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.REMOVE_CLIENT</li>
</ul>
</dd>
</dl>
<h5>ROOM_LIST_UPDATE</h5>
<p>特定のRoomスコープのRoom一覧の更新を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u38</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Roomスコープ</li>
<li>Room ID(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.ROOM_ADDED</li>
<li>RoomManagerEvent.ROOM_REMOVED</li>
</ul>
</dd>
</dl>
<h5>ROOM_ADDED</h5>
<p>特定のRoomが追加されたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u39</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.ROOM_ADDED</li>
</ul>
</dd>
</dl>
<h5>ROOM_REMOVED</h5>
<p>特定のRoomが削除されたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u40</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.ROOM_REMOVED</li>
</ul>
</dd>
</dl>
<h5>WATCH_FOR_ROOMS_RESULT</h5>
<p>ClientのWATCH_FOR_ROOMS試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u42</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID修飾子</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.WATCH_FOR_ROOMS_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>INVALID_QUALIFIER</li>
<li>ALREADY_WATCHING</li>
</ul>
</dd>
</dl>
<h5>STOP_WATCHING_FOR_ROOMS_RESULT</h5>
<p>ClientのSTOP_WATCHING_FOR_ROOMS試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u43</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID修飾子</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomManagerEvent.STOP_WATCHING_FOR_ROOMS_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>INVALID_QUALIFIER</li>
<li>NOT_WATCHING_QUALIFIER</li>
</ul>
</dd>
</dl>
<h5>LEFT_ROOM</h5>
<p>ClientがRoomからleaveしたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u44</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.LEAVE</li>
</ul>
</dd>
</dl>
<h5>CHANGE_PERSISTENT_CLIENT_RESULT</h5>
<p>Clientの永続化Clientパスワード変更試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u46</dd>
<dt>引数</dt>
<dd>
<ul>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>PersistenceEvent.CHANGED</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>NAME_NOT_FOUND</li>
<li>AUTHORIZATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>CREATE_PERSISTENT_CLIENT_RESULT</h5>
<p>Clientの永続化Client登録試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u47</dd>
<dt>引数</dt>
<dd>
<ul>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>PersistenceEvent.CREATED</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>NAME_EXISTS</li>
</ul>
</dd>
</dl>
<h5>REMOVE_PERSISTENT_CLIENT_RESULT</h5>
<p>Clientの永続化Client削除試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u48</dd>
<dt>引数</dt>
<dd>
<ul>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>PersistenceEvent.REMOVED</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>NAME_NOT_FOUND</li>
<li>AUTHORIZATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>LOGIN_CLIENT_RESULT</h5>
<p>Clientの永続化Clientログイン試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u49</dd>
<dt>引数</dt>
<dd>
<ul>
<li>ステータス</li>
<li>Tokens.RS区切りのClient Attribute(以降、複数指定可能)</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>PersistenceEvent.LOGIN</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ALREADY_LOGGED_IN</li>
<li>AUTHORIZATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>SERVER_TIME_UPDATE</h5>
<p>Union Serverの現在の時刻を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u50</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Union Serverの時刻</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>ServerEvent.TIME_SYNC</li>
</ul>
</dd>
</dl>
<h5>ROOM_SNAPSHOT</h5>
<p>RoomのRoom AttributeやClientなどの状態を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u54</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Tokens.RS区切りのRoom Attribute</li>
<li>Client ID</li>
<li>Client グローバルCleint Attribute</li>
<li>Client RoomスコープCleint Attribute</li>
<li>以降、Client ID, Client グローバルCleint Attribute, Client RoomスコープCleint Attributeの組で複数指定可能)</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>Room.synchronize()</li>
<li>RoomEvent.SYNCHRONIZE</li>
<li>Room.join()</li>
<li>Room.observe()</li>
</ul>
</dd>
</dl>
<h5>OBSERVED_ROOM</h5>
<p>ClientがRoomをobserveしたことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u59</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.OBSERVE</li>
</ul>
</dd>
</dl>
<h5>SYNC_ROOM_RESULT</h5>
<p>ClientのSYNC_ROOM試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u60</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.SYNCHRONIZE</li>
<li>RoomManagerEvent.SYNC_NONEXISTENT_ROOM</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_NOT_FOUND</li>
<li>AUTHORIZATION_REQUIRED</li>
<li>AUTHORIZATION_FAILED</li>
<li>ALREADY_SYNCHRONIZED</li>
</ul>
</dd>
</dl>
<h5>STOPPED_OBSERVING_ROOM</h5>
<p>ClientがRoomのobserveを停止したことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u62</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.STOP_OBSERVING</li>
</ul>
</dd>
</dl>
<h5>CLIENT_READY</h5>
<p>Clientの初期化処理が完了し準備が出来たことを通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u63</dd>
<dt>引数</dt>
<dd>
<ul>
<li>なし</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>UConnectionEvent.READY</li>
</ul>
</dd>
</dl>
<h5>SERVER_HELLO</h5>
<p>ClientにUnion ServerやUPCプロトコルの情報を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u66</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Union Serverバージョン</li>
<li>セッションID</li>
<li>UPCバージョン</li>
<li>Clientとのプロトコル互換</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>Union Serverバージョン</li>
<li>セッションID</li>
<li>UPCバージョン</li>
<li>protocolCompatible</li>
</ul>
</dd>
</dl>
<h5>JOIN_ROOM_RESULT</h5>
<p>Clientのjoin試行の結果を通知する。</p>
<dl>
<dt>内部コード</dt>
<dd>u72</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.JOIN_RESULT</li>
<li>RoomManagerEvent.JOIN_NONEXISTENT_ROOM
<li>
		</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ALREADY_IN_ROOM</li>
<li>ROOM_NOT_FOUND</li>
<li>ROOM_FULL</li>
<li>AUTHORIZATION_REQUIRED</li>
<li>AUTHORIZATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>SET_CLIENT_ATTR_RESULT</h5>
<p>Client Attribute更新試行の結果</p>
<dl>
<dt>内部コード</dt>
<dd>u73</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Client Attribute名</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.SET_CLIENT_ATTRIBUTE_RESULT</li>
<li>ClientEvent.SET_ATTRIBUTE_RESULT
<li>
		</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>DUPLICATE_VALUE</li>
<li>CLIENT_NOT_FOUND</li>
<li>IMMUTABLE</li>
<li>SERVER_ONLY</li>
<li>EVALUATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>SET_ROOM_ATTR_RESULT</h5>
<p>Room Attribute更新試行の結果</p>
<dl>
<dt>内部コード</dt>
<dd>u74</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room Attribute名</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.SET_ROOM_ATTRIBUTE_RESULT
<li>
		</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>IMMUTABLE</li>
<li>SERVER_ONLY</li>
<li>EVALUATION_FAILED</li>
</ul>
</dd>
</dl>
<h5>GET_NUM_CLIENTS_RESULT</h5>
<p>Clientの数を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u75</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room スコープ</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.GET_NUM_CLIENTS_RESULT
<li>
<li>RoomManagerEvent.GET_NUM_CLIENTS_RESULT</li>
<li>ServerEvent.GET_NUM_CLIENTS_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_NOT_FOUND</li>
</ul>
</dd>
</dl>
<h5>LEAVE_ROOM_RESULT</h5>
<p>特定のRoomへのClientのleave試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u76</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.LEAVE_RESULT</li>
<li>RoomManagerEvent.LEAVE_NONEXISTENT_ROOM</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>NOT_IN_ROOM</li>
<li>ROOM_NOT_FOUND</li>
</ul>
</dd>
</dl>
<h5>OBSERVE_ROOM_RESULT</h5>
<p>特定のRoomへのClientのobserve試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u77</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.OBSERVE_RESULT</li>
<li>RoomManagerEvent.OBSERVE_NONEXISTENT_ROOM</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_NOT_FOUND</li>
<li>AUTHORIZATION_REQUIRED</li>
<li>AUTHORIZATION_FAILED</li>
<li>ALREADY_OBSERVING</li>
</ul>
</dd>
</dl>
<h5>STOP_OBSERVING_ROOM_RESULT</h5>
<p>特定のRoomへのClientのobserve停止試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u78</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.STOP_OBSERVING</li>
<li>RoomManagerEvent.STOP_OBSERVING_NONEXISTENT_ROOM</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>ROOM_NOT_FOUND</li>
<li>NOT_OBSERVING</li>
</ul>
</dd>
</dl>
<h5>ROOM_ATTR_REMOVED</h5>
<p>Room Attributeの削除を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u79/dd></p>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Room Attribute名</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.DELETE_ROOM_ATTRIBUTE</li>
</ul>
</dd>
</dl>
<h5>REMOVE_ROOM_ATTR_RESULT</h5>
<p>Room Attributeの削除試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u80</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Room Attribute名</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.DELETE_ROOM_ATTRIBUTE_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>IMMUTABLE</li>
<li>SERVER_ONLY</li>
<li>ROOM_NOT_FOUND</li>
<li>ATTR_NOT_FOUND</li>
</ul>
</dd>
</dl>
<h5>CLIENT_ATTR_REMOVED</h5>
<p>Client Attributeの削除を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u81</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Client Attribute名</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.DELETE_CLIENT_ATTRIBUTE</li>
</ul>
</dd>
</dl>
<h5>REMOVE_CLIENT_ATTR_RESULT</h5>
<p>Client Attributeの削除試行の結果を通知します。</p>
<dl>
<dt>内部コード</dt>
<dd>u82</dd>
<dt>引数</dt>
<dd>
<ul>
<li>Room ID</li>
<li>Client ID</li>
<li>Client Attribute名</li>
<li>ステータス</li>
</ul>
</dd>
<dt>対応Reactor API</dt>
<dd>
<ul>
<li>RoomEvent.DELETE_ROOM_ATTRIBUTE_RESULT</li>
</ul>
</dd>
<dt>ステータスコード</dt>
<dd>
<ul>
<li>SUCCESS</li>
<li>ERROR (サーバ内部処理で例外発生)</li>
<li>CLIENT_NOT_FOUND</li>
<li>IMMUTABLE</li>
<li>SERVER_ONLY</li>
<li>ATTR_NOT_FOUND</li>
</ul>
</dd>
</dl>
<h3>まとめ</h3>
<p>UPCはUnionを使った開発で直接扱いませんが、ReactorのデバッグログやUnion Serverのログに出力されます。興味がある方はUPCのログを眺めて見てください。</p>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/490/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Union Platform alpha4 released</title>
		<link>http://fla.la/archives/478</link>
		<comments>http://fla.la/archives/478#comments</comments>
		<pubDate>Mon, 07 Sep 2009 01:18:52 +0000</pubDate>
		<dc:creator>naoto koshikawa</dc:creator>
				<category><![CDATA[Union Platform]]></category>

		<guid isPermaLink="false">http://fla.la/?p=478</guid>
		<description><![CDATA[Union alpha4がリリースされたので使ってみました。
tryunion.comを使われている方は、Reactorの更新が必要です。自身でUnion Serverを用意している方はReactor、Union Serverの両方を更新しましょう。
リリースノートは以下から確認出来ます。
Union 1.0 Alpha4 Release Notes
なお、以前のalpha3向けのエントリーは更新する予定です。完了しましたら別途お知らせいたします。
では、変更された点を確認してみます。

UPC仕様の更新
ReactorとUnion Serverとのやりとりで利用されているUPCの仕様が変更されたようです。
詳しくは、UPC変更点を参照して下さい。
ReactorのAPI
ClientクラスのgetAttributeメソッドの引数指定の変更と、細かなバグフィックスが行われたようです。
Reactorドキュメント
主に、以下のクラスのドキュメントが更新されています。

net.user1.reactor.Client
net.user1.reactor.ClientEvent
net.user1.reactor.ClientManager
net.user1.reactor.Reactor
net.user1.reactor.ReactorEvent
net.user1.reactor.RoomEvent
net.user1.reactor.Tokens
net.user1.reactor.UPC
net.user1.reactor.Validator

ここに挙げたクラスのドキュメント以外にも、文言の微調整がいくつかされているようです。
APIの変更
net.user1.reactor.ClientクラスのgetAttributeメソッド
引数の順番が変更になりました。
alpha3

// グローバルスコープ
client.getAttribute&#40;null, &#34;attributeKey&#34;&#41;;
&#160;
// 特定のRoomスコープ
client.getAttribute&#40;&#34;roomID&#34;, &#34;attributeKey&#34;&#41;;

alpha4

// グローバルスコープ
client.getAttribute&#40;&#34;attributeKey&#34;&#41;;
&#160;
// 特定のRoomスコープ
client.getAttribute&#40;&#34;attributeKey&#34;, &#34;roomID&#34;&#41;;

net.user1.reactor.ClientManagerのgetAttributeForClientsメソッド
ClientクラスのgetAttributeメソッドと同様に、引数の順番が変更となりました。
net.user1.reactor.RoomEventの定数
UPCの仕様変更に伴い、RoomEventの定数が増えています。
Union Server
policy.htmlを更新した際に、ポリシーが自動で更新されるようになりました。その他バグフィックスが行われたようです。
クラスの追加
docs/javadocの下を見る限り以下のクラスが追加されたようです。

net.user1.union.core.connection.Connection
net.user1.union.core.def.ConnectionFilterDef
net.user1.union.api.Reauest

Union Server起動時の挙動
windows環境で、startserver.batを実行すると、今まではコマンドプロンプトが開いてログも表示されていたのですが、表示されなくなりました。管理用ツール(UnionAdmin.swf)で見れるようになったので表示されなくなったようです。
その他の更新は、Union Server変更点を参照して下さい。
管理ツール(UnionAdmin.swf)
前述の通り、Union Serverのログを確認できるようになりました。FMS管理コンソールと似てきましたね。正直alpha3まではあまり使っていなかったのですが、Roomの情報も細かく見れるようになったりバグが修正されたようなので、これからは使ってみようと思います。
その他の更新は、管理ツール(UnionAdmin.swf)変更点を参照して下さい。
その他の更新
@keno42さんからの情報です。ClientクラスのsetAttribute()メソッド実行時に、自身のClient Attributeの更新通知は即時反映されるようになりました。
以下のサンプルで試した見たのですが、tryunion.comに接続した状態で、自身のClient Attribute更新時は15msec程度でした。別ClientのClient Attribute更新時は、状況によりりますが100msec以上かかるようです。
Client Attributeの応答時間テスト &#8211; wonderfl build flash online
自身のClient Attributeの更新も他のクライアントと同様のレスポンスを期待する場合には、ClientクラスのsetAttribute()メソッド実行時のevaluateオプションをtrueにすると、サーバでの処理が走るので強制的にUnion Server経由で更新が通信されるようになるそうです。
wonderflの投稿
wonderflのUnionライブラリもalpha4に更新されたようですので、Unionライブラリを使っている投稿は最コンパイルする必要があります。
また、私の以下の2つの投稿では、ClientメソッドのgetAttributeメソッドを使用しておりましたので引数の修正を行いました。

Union Platform avatar chat forked from: colin challenge for professionals
Unionチャットサンプル

まとめ
私がUnionライブラリを本格的に使い始めたのはalpha3からでしたので、初めてのアップデートでした。プロダクトのアップデートは大変ワクワクしますね。Derek Claytonさん、Colin Moockさんありがとうございます。
]]></description>
			<content:encoded><![CDATA[<p>Union alpha4がリリースされたので使ってみました。<br />
tryunion.comを使われている方は、Reactorの更新が必要です。自身でUnion Serverを用意している方はReactor、Union Serverの両方を更新しましょう。</p>
<p>リリースノートは以下から確認出来ます。<br />
<a href="http://www.unionplatform.com/?page_id=729">Union 1.0 Alpha4 Release Notes</a></p>
<p>なお、以前のalpha3向けのエントリーは更新する予定です。完了しましたら別途お知らせいたします。</p>
<p>では、変更された点を確認してみます。</p>
<p><span id="more-478"></span></p>
<h3>UPC仕様の更新</h3>
<p>ReactorとUnion Serverとのやりとりで利用されているUPCの仕様が変更されたようです。</p>
<p>詳しくは、<a href="http://factory.user1.net/issues/show/88">UPC変更点</a>を参照して下さい。</p>
<h3>ReactorのAPI</h3>
<p>ClientクラスのgetAttributeメソッドの引数指定の変更と、細かなバグフィックスが行われたようです。</p>
<h4>Reactorドキュメント</h4>
<p>主に、以下のクラスのドキュメントが更新されています。</p>
<ul>
<li>net.user1.reactor.Client</li>
<li>net.user1.reactor.ClientEvent</li>
<li>net.user1.reactor.ClientManager</li>
<li>net.user1.reactor.Reactor</li>
<li>net.user1.reactor.ReactorEvent</li>
<li>net.user1.reactor.RoomEvent</li>
<li>net.user1.reactor.Tokens</li>
<li>net.user1.reactor.UPC</li>
<li>net.user1.reactor.Validator</li>
</ul>
<p>ここに挙げたクラスのドキュメント以外にも、文言の微調整がいくつかされているようです。</p>
<h4>APIの変更</h4>
<h5>net.user1.reactor.ClientクラスのgetAttributeメソッド</h5>
<p>引数の順番が変更になりました。</p>
<h6>alpha3</h6>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// グローバルスコープ</span>
<span style="color: #004993;">client</span>.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">null</span>, <span style="color: #990000;">&quot;attributeKey&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// 特定のRoomスコープ</span>
<span style="color: #004993;">client</span>.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;roomID&quot;</span>, <span style="color: #990000;">&quot;attributeKey&quot;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

<h6>alpha4</h6>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// グローバルスコープ</span>
<span style="color: #004993;">client</span>.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;attributeKey&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #009900;">// 特定のRoomスコープ</span>
<span style="color: #004993;">client</span>.getAttribute<span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;attributeKey&quot;</span>, <span style="color: #990000;">&quot;roomID&quot;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

<h5>net.user1.reactor.ClientManagerのgetAttributeForClientsメソッド</h5>
<p>ClientクラスのgetAttributeメソッドと同様に、引数の順番が変更となりました。</p>
<h5>net.user1.reactor.RoomEventの定数</h5>
<p>UPCの仕様変更に伴い、RoomEventの定数が増えています。</p>
<h3>Union Server</h3>
<p>policy.htmlを更新した際に、ポリシーが自動で更新されるようになりました。その他バグフィックスが行われたようです。</p>
<h4>クラスの追加</h4>
<p>docs/javadocの下を見る限り以下のクラスが追加されたようです。</p>
<ul>
<li>net.user1.union.core.connection.Connection</li>
<li>net.user1.union.core.def.ConnectionFilterDef</li>
<li>net.user1.union.api.Reauest</li>
</ul>
<h4>Union Server起動時の挙動</h4>
<p>windows環境で、startserver.batを実行すると、今まではコマンドプロンプトが開いてログも表示されていたのですが、表示されなくなりました。管理用ツール(UnionAdmin.swf)で見れるようになったので表示されなくなったようです。</p>
<p>その他の更新は、<a href="http://factory.user1.net/versions/show/19">Union Server変更点</a>を参照して下さい。</p>
<h3>管理ツール(UnionAdmin.swf)</h3>
<p>前述の通り、Union Serverのログを確認できるようになりました。FMS管理コンソールと似てきましたね。正直alpha3まではあまり使っていなかったのですが、Roomの情報も細かく見れるようになったりバグが修正されたようなので、これからは使ってみようと思います。</p>
<p>その他の更新は、<a href="http://factory.user1.net/versions/show/21">管理ツール(UnionAdmin.swf)変更点</a>を参照して下さい。</p>
<h3>その他の更新</h3>
<p>@keno42さんからの情報です。ClientクラスのsetAttribute()メソッド実行時に、自身のClient Attributeの更新通知は即時反映されるようになりました。</p>
<p>以下のサンプルで試した見たのですが、tryunion.comに接続した状態で、自身のClient Attribute更新時は15msec程度でした。別ClientのClient Attribute更新時は、状況によりりますが100msec以上かかるようです。</p>
<div style="text-align:center;width:465px;"><iframe title="Client Attributeの応答時間テスト - wonderfl build flash online" scrolling="no" src="http://wonderfl.net/blogparts/cc689fc0a5451b093d90d8f47ab825dfc39d7630" width="465" height="490" style="border:1px black solid;"></iframe><a href="http://wonderfl.net/code/cc689fc0a5451b093d90d8f47ab825dfc39d7630" title="Client Attributeの応答時間テスト - wonderfl build flash online">Client Attributeの応答時間テスト &#8211; wonderfl build flash online</a></div>
<p>自身のClient Attributeの更新も他のクライアントと同様のレスポンスを期待する場合には、ClientクラスのsetAttribute()メソッド実行時のevaluateオプションをtrueにすると、サーバでの処理が走るので強制的にUnion Server経由で更新が通信されるようになるそうです。</p>
<h3>wonderflの投稿</h3>
<p><a href="http://wonderfl.net/blog/2009/09/library-updates-and-checkmate-vol3.html">wonderflのUnionライブラリもalpha4に更新された</a>ようですので、Unionライブラリを使っている投稿は最コンパイルする必要があります。</p>
<p>また、私の以下の2つの投稿では、ClientメソッドのgetAttributeメソッドを使用しておりましたので引数の修正を行いました。</p>
<ul>
<li><a href="http://wonderfl.net/code/b65e9bddc8c1307ab1ea068414612dad1f6ad093">Union Platform avatar chat forked from: colin challenge for professionals</a></li>
<li><a href="http://wonderfl.net/code/d65724b1c2c161a9bc77b435951d381921961eb9">Unionチャットサンプル</a></li>
</ul>
<h3>まとめ</h3>
<p>私がUnionライブラリを本格的に使い始めたのはalpha3からでしたので、初めてのアップデートでした。プロダクトのアップデートは大変ワクワクしますね。Derek Claytonさん、Colin Moockさんありがとうございます。</p>
]]></content:encoded>
			<wfw:commentRss>http://fla.la/archives/478/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
