<?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>func09 &#187; actionscript3.0</title>
	<atom:link href="http://www.func09.com/wordpress/archives/category/flash/actionscript30/feed" rel="self" type="application/rss+xml" />
	<link>http://www.func09.com/wordpress</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 06 Feb 2012 04:25:55 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>mixiアプリでの外部通信のあれこれを調べた</title>
		<link>http://www.func09.com/wordpress/archives/721</link>
		<comments>http://www.func09.com/wordpress/archives/721#comments</comments>
		<pubDate>Thu, 19 Nov 2009 07:14:25 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript3.0]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mixi]]></category>
		<category><![CDATA[OpenSocial]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=721</guid>
		<description><![CDATA[久しぶりにmixiアプリの事を調査したよ。 多分日頃からOpenSocial開発をしてる人には当たり前のことなんだろうけど ぐぐってもわからなかったので。。 iframeで外部ページを埋め込めるか？ mixiアプリはそも [...]]]></description>
			<content:encoded><![CDATA[<p>久しぶりにmixiアプリの事を調査したよ。</p>

<p>多分日頃からOpenSocial開発をしてる人には当たり前のことなんだろうけど<br />
ぐぐってもわからなかったので。。</p>

<h2>iframeで外部ページを埋め込めるか？</h2>

<p>mixiアプリはそもそもiframe内にgadget.xmlをキャッシュされた状態で起動する。</p>

<p>つまり、mixi.jp内のページにmixi-platform.comにキャッシュされたコンテンツを表示していて<br />
さらにその中で別ドメインなコンテンツを表示できるのか？</p>

<p>結論としてはできる。
ただ外部ページからではOpenSocialAPIに接触しようがないから、不便は不便。</p>

<p>iframeの中にfacebookアプリを埋め込んだりもできたよ。<br />
でもmixiアプリ上で認証させるのは多分規約違反。</p>

<p>iframeで外部コンテンツを表示するっていう作法も、外部サイトへの遷移の規約に従ってない気がするのでアウトかな？</p>

<p>どうでしょう？</p>

<h2>Flashから外部コンテンツとの通信</h2>

<p>OpenSocialのFlash埋め込みAPIを使って、配置したSWFから<br />
URLLoaderなんかを使って普通にクロスドメインな通信ができるかチェック。</p>

<p>これもできる。相手のサーバから拒否されてなければ。</p>

<p>JavaScriptはXHRを使えないから（ひょっとして使える？）、makeRequestするわけだけど<br />
Flashは普通に通信できるなら、mixiアプリは開発しやすさで言えばFlashで作るに限るってことかなぁ。</p>

<p>makeRequestはoAuthの署名リクエストが使えるので、通信にセキュリティを保証したい場合は有効だと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/721/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flashが埋め込まれているURLを調べる</title>
		<link>http://www.func09.com/wordpress/archives/231</link>
		<comments>http://www.func09.com/wordpress/archives/231#comments</comments>
		<pubDate>Sat, 30 Aug 2008 13:21:59 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript2.0]]></category>
		<category><![CDATA[actionscript3.0]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/231</guid>
		<description><![CDATA[ブログパーツのようなFlashで、いろいろなサイトに埋め込まれるSWFの 埋め込まれているページのURLを取得する方法。 import flash.external.*; var locationHref:String  [...]]]></description>
			<content:encoded><![CDATA[<p>ブログパーツのようなFlashで、いろいろなサイトに埋め込まれるSWFの
埋め込まれているページのURLを取得する方法。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">import flash.external.*;<br />
var locationHref:String = String(ExternalInterface.call(&quot;function(){return location.href}&quot;));</div></div>

<p>ExternalInterface.callの１番目の引数は、呼び出すJavaScriptのメソッド名という事になっていますが</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ExternalInterface.call(&quot;myMethod&quot;,&quot;args1&quot;,&quot;args2&quot;);</div></div>

<p>は単純に以下のようなJSが実行されているものと考えられるので</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">eval(&quot;myMethod&quot;).apply(window,[&quot;args1&quot;,&quot;args2&quot;]);</div></div>

<p>まぁ、ようするに無名関数をFlash側で引数としてあげればいいと。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/231/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>コリン・ムック「今から始めるActionScript 3.0」に行ってきました</title>
		<link>http://www.func09.com/wordpress/archives/176</link>
		<comments>http://www.func09.com/wordpress/archives/176#comments</comments>
		<pubDate>Tue, 15 Jan 2008 13:20:14 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript3.0]]></category>
		<category><![CDATA[日記]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/176</guid>
		<description><![CDATA[※2008/01/24に一部加筆しました。 この記事の値のコピーについて誤った記述がありましたので 文字列変数コピーは参照コピーである:福井プログラマー生活向上委員会 しかし、この説明では一つ問題があります。 なぜなら、 [...]]]></description>
			<content:encoded><![CDATA[<p>※2008/01/24に一部加筆しました。
<strong>この記事の値のコピーについて誤った記述がありました</strong>ので
<a href="http://chikura.fprog.com/index.php?UID=1200647817">文字列変数コピーは参照コピーである:福井プログラマー生活向上委員会</a></p>

<blockquote>しかし、この説明では一つ問題があります。
なぜなら、JavaScriptやActionScript3のString型は、プリミティブ型ではあるものの、変数のコピーは値コピーではなく参照コピーになるからです。それどころか、ActionScript3では全てのプリミティブ型のコピーは参照コピーになるようです</blockquote>

<p>こちらの記事を是非合わせてお読みいただくことをおすすめします！！</p>

<p>コリン・ムック「今から始めるActionScript 3.0」に行ってきました。</p>

<p><a href="http://www.event-web.net/as3/">http://www.event-web.net/as3/</a>
今コリン・ムックのレクチャーから帰ってきました。</p>

<p>初心者向けのレクチャーではありましたが、９時間の長丁場。
内容の方は、ビギナー向けということもあり易しめで、難しいところもありませんでした。
コリン節を堪能してきましたよ。</p>

<p>僕はAS2.0の時に、コリン氏の<a href="http://www.moock.org/lectures/mvc/">MVC Clock</a>のソースを穴があくほど読んで、初めてMVCという概念を勉強したので師匠を拝むような気持ちでした。</p>

<p>で、基本的には「ActionScript3でどうやってアプリケーションを開発していくか」という課題をひとつのサンプルアプリを通して、疎結合に作っていく大切さを表現していました。</p>

<p>前半はAS3の言語的な部分に多く触れ、後半はMVCやディスプレイオブジェクト、イベントなどの実装寄りな話。</p>

<p>コリン氏は「変数」と「オブジェクト」の関係を正しく理解してもらいたいと何度か言っておりました。</p>

<p>そのわかりやすさに衝撃を受けたので、メモします。</p>

<ul>
<li>「変数には値そのものが格納されているわけじゃない。変数は値の参照を持っているだけ」</li>
<li>「変数はコンテナではない。参照を持つ事のみ可能。本来のコンテナはシステムメモリ」</li>
</ul>

<p>と同じことを何度もいっていたので、よほど覚えて帰ってほしかったのでしょう。</p>

<p>例えばプリミティブ型（NumberやString）では</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var a = &quot;dog&quot;;<br />
var b = a;</div></div>

<p>としたとき、「dog」というオブジェクトがコピーされています。</p>

<p><img id="image175" src="http://www.func09.com/wordpress/wp-content/uploads/2008/01/object_1.gif" alt="object_1.gif" /></p>

<p>追記：
<a href="http://chikura.fprog.com/index.php?UID=1200647817">文字列変数コピーは参照コピーである:福井プログラマー生活向上委員会</a>の記事を参照してください。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">a = &quot;cat&quot;;<br />
trace(a); // output 'cat'<br />
trace(b); // output 'dog'</div></div>

<p>この時２つの変数の間でオブジェクトは共有されていません。</p>

<p>では、複合データ型の場合</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var a = [0,1,2,3];<br />
var b = a;<br />
<br />
a[0] = 10;<br />
trace(a); // output '[10,1,2,3]'<br />
trace(b); // output '[10,1,2,3]'</div></div>

<p><img id="image180" src="http://www.func09.com/wordpress/wp-content/uploads/2008/01/object31.gif" alt="object31.gif" /></p>

<p>２つの変数は同じオブジェクトを参照しています。
ここまでは問題ないかと。</p>

<p>ではさらに突っ込んで、「参照」とは何かを説明すると</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">a = null;<br />
trace(b); // output '10,1,2,3'</div></div>

<p>これはちょっと変だと思う人もいるかも。
nullはオブジェクトを捨てる事ではなく、参照を切るだけ</p>

<p><img id="image178" src="http://www.func09.com/wordpress/wp-content/uploads/2008/01/object3.gif" alt="object3.gif" /></p>

<p>図を見ると、「変数a」と「配列[10,1,2,3]」を繋ぐ線が消えただけだということが良くわかる。変数が持っているのは、この「線」の部分だけだということ。</p>

<p>では</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">b = null;</div></div>

<p>とすると、オブジェクト[10,1,2,3]は消えたのでしょうか？
答えはノーです。</p>

<p><img id="image179" src="http://www.func09.com/wordpress/wp-content/uploads/2008/01/object4.gif" alt="object4.gif" /></p>

<p>どの変数からも参照されなくなったオブジェクトはやがてメモリから捨てられます。
これをガベッジコレクションといいますが、どの変数からも参照されなくなった時点で削除されるのではなく、捨てる準備。捨ててもいいよというマークがされて適当な時にGCされます。</p>

<p>その適当な時とは？
コリン氏がいうには、ロードをやめたり、重い処理をストップさせたりした場合らしいです。</p>

<p>AS3ではビルトインではないけれど、強制的にガベッジコレクションを実行するハックもあるので
それを使うのもありですかね。</p>

<p><a href="http://www.gskinner.com/blog/archives/2006/08/as3_resource_ma_2.html">http://www.gskinner.com/blog/archives/2006/08/as3_resource_ma_2.html</a></p>

<p>個人的にこのオブジェクトの話は、わかってはいても人に説明しづらい。理解したつもりでも、なんかずれていた。という経験があるので、この参照を矢印で表現する図解はためになりました。</p>

<p>今日のレクチャーの内容は
<a href="http://moock.org/lectures/groundUpAS3/">http://moock.org/lectures/groundUpAS3/</a>にあります。</p>

<p>&#8211;</p>

<p>追記：
コリン・モック氏本人がレクチャーで使っていた図解は
<a href="http://moock.org/lectures/groundUpAS3/">http://moock.org/lectures/groundUpAS3/</a>の
・copies and references
・multiple references to the same object
にありました。
SWFなのでクリックして紙芝居的に挙動が確認できます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/176/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[flex]Flex2でFLVプレイヤーのシークバーを作ってみる</title>
		<link>http://www.func09.com/wordpress/archives/171</link>
		<comments>http://www.func09.com/wordpress/archives/171#comments</comments>
		<pubDate>Thu, 27 Dec 2007 07:29:17 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript3.0]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[日記]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/171</guid>
		<description><![CDATA[Flvプレーヤーにシーク機能を付けたいのですが・・ このフォーラムで、シーク機能について質問が投げられていたので作ってみた。 Flex2でFLVプレイヤーを作ろうと思ったら、ボタンなどの標準コンポーネントを使って 簡単に [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fxug.net/modules/xhnewbb/viewtopic.php?viewmode=thread&#038;topic_id=1473&#038;forum=16">Flvプレーヤーにシーク機能を付けたいのですが・・</a></p>

<p>このフォーラムで、シーク機能について質問が投げられていたので作ってみた。</p>

<p>Flex2でFLVプレイヤーを作ろうと思ったら、ボタンなどの標準コンポーネントを使って
簡単に実装できちゃうんですが、シークバーはちょっとポイントが要ります。
でもだからといって、コンポーネントを作らないといけないわけじゃなくて、
HSliderとスクリプトだけでなんとかできちゃいます。</p>

<p><img id="image170" src="http://www.func09.com/wordpress/wp-content/uploads/2007/12/flvplayer_cap.jpg" alt="flvplayer_cap.jpg" /></p>

<p>こんな感じになる。それっぽいでしょ？</p>

<h3>コントローラを配置</h3>

<p>まずはFLVを表示するためのVideoDisplayクラスと
シークするためのHSliderクラスを準備</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot;&gt;<br />
&nbsp; &lt;mx:VBox width=&quot;100%&quot; height=&quot;100%&quot;&gt;<br />
&nbsp; &nbsp; &lt;mx:VideoDisplay id=&quot;myVD&quot; width=&quot;100%&quot; height=&quot;100%&quot; source=&quot;your.flv&quot; /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;mx:HSlider id=&quot;myHS&quot; width=&quot;100%&quot; /&gt;<br />
&nbsp; &lt;/mx:VBox&gt;<br />
&lt;/mx:Application&gt;</div></div>

<h3>FLVの再生位置とシークバーを同期させる</h3>

<p>これだけでもFLVは再生されるので、再生されている位置とシークバーを同期させてみます。
ここからは基本的に編集するのは</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">HSlider</div></div>

<p>のみ</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;mx:HSlider id=&quot;myHS&quot;<br />
&nbsp; width=&quot;100%&quot;<br />
&nbsp; minimum=&quot;0&quot;<br />
&nbsp; maximum=&quot;{myVD.totalTime}&quot;<br />
&nbsp; value=&quot;{myVD.playheadTime}&quot;<br />
/&gt;</div></div>

<p>スライダーの最小値と最大値を決定します。
最大値にビデオの総時間をバインディングされるようにしておき
さらにビデオの再生位置に変更があるたびに、スライダーの値とビデオの再生時間が同期するように仕込む。
これで、再生時間 / 総再生時間みたいなことを気にしないでも、スライダーが勝手に計算してくれます。</p>

<h3>スライダーからの変更をビデオに反映する</h3>

<p>次にスライダーからビデオの再生位置を変更できるようにします。
HSliderに次の行を追加します。
[xml]
change=&#8221;{ if(myVD.stateResponsive) myVD.playheadTime = myHS.value }&#8221;
[/xml]</p>

<p>VideoDisplay#stateResponsiveはビデオが応答可能かどうかの判定メソッドです。
まだ動画がロードされていなかったり、ビジーな状況を回避しつつ
スライダーのvalueをそのままビデオの再生位置時間に代入します。
これはスライダーとビデオの扱う単位を「秒」で揃えているから可能になっています。
Flexでは往々にして、コントロール間で扱う単位を揃えたり
中間に変換するアダプターメソッドを噛ますと、生産性があがりますね。</p>

<h3>見た目や精度を向上する</h3>

<p>さて、ここまでで一応実装完了しているのですが
使ってみると、ドラッグ中はビデオに再生位置が反映されなかったり
再生位置をスライダーのつまみの位置だけで確認しなければならなかったり
ちょっと不親切です。</p>

<p>HSliderにさらに、下の処理を追加。
[xml]
liveDragging=&#8221;true&#8221;
showTrackHighlight=&#8221;true&#8221;
[/xml]</p>

<p>Slider#liveDraggingは、つまみのドラッグ中にもchangeイベントを発行しつづけるためのフラグです。
Slider#showTrackHighlightは、スライダーの始点からつまみまでを色つけするスタイルプロパティ。</p>

<h3>完成</h3>

<p>以下は全コードです。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />
&lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot; layout=&quot;absolute&quot;&gt;<br />
&nbsp; &lt;mx:VBox width=&quot;100%&quot; height=&quot;100%&quot;&gt;<br />
&nbsp; &nbsp; &lt;mx:VideoDisplay id=&quot;myVD&quot;<br />
&nbsp; &nbsp; &nbsp; source=&quot;your.flv&quot;<br />
&nbsp; &nbsp; &nbsp; width=&quot;100%&quot; height=&quot;100%&quot;<br />
&nbsp; &nbsp; /&gt;<br />
&nbsp; &nbsp; &lt;mx:HSlider id=&quot;myHS&quot;<br />
&nbsp; &nbsp; &nbsp; width=&quot;100%&quot;<br />
&nbsp; &nbsp; &nbsp; maximum=&quot;{myVD.totalTime}&quot;<br />
&nbsp; &nbsp; &nbsp; minimum=&quot;0&quot;<br />
&nbsp; &nbsp; &nbsp; value=&quot;{myVD.playheadTime}&quot;<br />
&nbsp; &nbsp; &nbsp; change=&quot;{ if(myVD.stateResponsive) myVD.playheadTime = myHS.value }&quot;<br />
&nbsp; &nbsp; &nbsp; liveDragging=&quot;true&quot;<br />
&nbsp; &nbsp; &nbsp; showTrackHighlight=&quot;true&quot;<br />
&nbsp; &nbsp; /&gt;<br />
&nbsp; &lt;/mx:VBox&gt;<br />
&lt;/mx:Application&gt;</div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/171/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ruby][flex] Socketサーバを書いてみた</title>
		<link>http://www.func09.com/wordpress/archives/154</link>
		<comments>http://www.func09.com/wordpress/archives/154#comments</comments>
		<pubDate>Tue, 30 Oct 2007 13:57:13 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript3.0]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[日記]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/154</guid>
		<description><![CDATA[FlexでXMLSocketする必要があったので、テスト用にサーバを書いてみたよ。 自信はないので、1%も保証はないけど一応動く。 ソースファイル まずはRubyのソース server_client.rb [ruby]  [...]]]></description>
			<content:encoded><![CDATA[<p>FlexでXMLSocketする必要があったので、テスト用にサーバを書いてみたよ。
自信はないので、1%も保証はないけど一応動く。</p>

<p><img id="image155" src="http://www.func09.com/wordpress/wp-content/uploads/2007/10/sockettest1pnf.png" alt="sockettest1pnf.png" /></p>

<p><img id="image156" src="http://www.func09.com/wordpress/wp-content/uploads/2007/10/sockettest2.png" alt="sockettest2.png" /></p>

<p><a id="p157" href="http://www.func09.com/wordpress/wp-content/uploads/2007/10/sockettest.zip" title="sockettest.zip">ソースファイル</a></p>

<p>まずはRubyのソース</p>

<p><span id="more-154"></span></p>

<p>server_client.rb
[ruby]
require &#8220;socket_server&#8221;
server = SocketServer.new
server.open 8001
[/ruby]</p>

<p>ソケットサーバを8001番ポートでオープン</p>

<p>socket_server.rb
[ruby]
class SocketServer</p>

<p>def initialize( port=nil )
    puts &#8220;create server..&#8221;
    @port = port || 8001;
  end</p>

<p>def open( port=nil )
    @port = port if( !port.nil? )
    @gs = TCPServer.open @port
    @clients = []
    puts &#8220;open server #{@port}&#8221;</p>

<pre><code>while true
  Thread.start( @gs.accept ) do |s|
    open_client s
    while ( message = s.gets )
      send_message_all( message )
    end
    close_client s
  end
end
</code></pre>

<p>end</p>

<p>def open_client( client )
    puts &#8220;#{client} is connected.&#8221;
    @clients &lt;&lt; client
  end</p>

<p>def close_client( client )
    puts &#8220;#{client} is closed.&#8221;
    @clients.delete client
  end</p>

<p>def send_message_all( message )
    puts &#8220;[message all] #{message}&#8221;
    @clients.each do |client|
      send_message( client, message )
    end
  end</p>

<p># send message to IOSocket
  def send_message( target, message )
    message.chomp!
    target.write( message &lt;&lt; &#8220;\n&#8221; )
  end</p>

<p>end
[/ruby]</p>

<p>そしてFlex2のソース</p>

<p>Socketクラスを使ってます。
XMLSocketクラスを使ったら、メッセージのタイミングが１個ずれました。</p>

<p>SocketTest.mxml
[html]
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
  xmlns:mx="http://www.adobe.com/2006/mxml"
  xmlns:views="views.*"
  creationComplete="{handleCreateComplete()}"
  ></p>

<p><mx:Script>
    &lt;![CDATA[
      import flash.net.Socket;</p>

<pre><code>  [Bindable]
  public var sock:Socket;

  private function handleCreateComplete():void
  {
    sock = new Socket();
    sock.addEventListener(ProgressEvent.SOCKET_DATA,handleSocketData);
    sock.addEventListener(Event.CONNECT,handleSocketConnect);
    sock.addEventListener(Event.CLOSE,handleSocketClose);
    //sock.addEventListener(DataEvent.DATA,handleSocketData);
    sock.addEventListener(IOErrorEvent.IO_ERROR,handleSocketIOError);
  }

  private function handleSocketConnect(e:Event):void
  {
    debugger.text += &#8220;Connection Success.\n&#8221;;
    formViewStack.selectedChild = connectedForm;
    sock.removeEventListener(Event.CONNECT,arguments.callee);
  }

  private function handleSocketClose(e:Event):void
  {
    debugger.text += &#8220;Connection Close.\n&#8221;;
    formViewStack.selectedChild = connectForm;
    sock.removeEventListener(Event.CLOSE,arguments.callee);
  }

  private function handleSocketData(e:ProgressEvent):void
  {
    debugger.text += e.target.readUTF();
  }

  private function handleSocketIOError(e:IOError):void
  {
    trace(e);
  }

]]&gt;
</code></pre>

<p></mx:Script></p>

<p><mx:Panel x="58" y="57" width="300" height="300" title="Socket Client"></p>

<pre><code>&lt;mx:VDividedBox width="100%" height="100%"&gt;

  &lt;mx:ViewStack id="formViewStack" width="100%" height="200"&gt;

    &lt;views:ConnectForm id="connectForm" sock="{sock}" /&gt;
    &lt;views:ConnectionForm id="connectedForm" sock="{sock}" /&gt;

  &lt;/mx:ViewStack&gt;

  &lt;mx:TextArea width="100%" id="debugger"/&gt;

&lt;/mx:VDividedBox&gt;
</code></pre>

<p></mx:Panel></p>

<p></mx:Application></p>

<p>[/html]</p>

<p>views.ConnectForm.mxml
[html]
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
    &lt;![CDATA[
      public var sock:Socket;</p>

<pre><code>  private function handleConnectButtonClick(e:MouseEvent):void
  {
    sock.connect( formdata.host, formdata.port );
  }

]]&gt;
</code></pre>

<p></mx:Script></p>

<p><mx:Model id="formdata">
    <root>
      <host>{txtHost.text}</host>
      <port>{int(txtPort.text)}</port>
    </root>
  </mx:Model></p>

<p><mx:Form>
    <mx:FormItem label="host">
      <mx:TextInput id="txtHost" text="localhost"/>
    </mx:FormItem>
    <mx:FormItem label="port">
      <mx:TextInput id="txtPort" text="8001"/>
    </mx:FormItem>
    <mx:FormItem>
      <mx:Button label="接続" click="{handleConnectButtonClick(event)}"/>
    </mx:FormItem>
  </mx:Form></p>

<p></mx:Canvas>
[/html]</p>

<p>views.ConnectionForm.mxml
[html]
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
    &lt;![CDATA[</p>

<pre><code>  public var sock:Socket;

  private function handleSendButtonClidk(e:MouseEvent):void
  {
    if( sock.connected )
    {
      XML.prettyPrinting = false;
      sock.writeUTF( sendXML.toXMLString() + "\n" );
      sock.flush();
    }
  }

]]&gt;
</code></pre>

<p></mx:Script></p>

<p><mx:XML id="sendXML" xmlns="">
    <root>
      <message>{txtMessage.text}</message>
    </root>
  </mx:XML></p>

<p><mx:Form>
    <mx:FormItem label="Message">
      <mx:TextInput id="txtMessage" />
    </mx:FormItem>
    <mx:FormItem>
      <mx:Button label="send" click="{handleSendButtonClidk(event)}"/>
    </mx:FormItem>
  </mx:Form>
</mx:Canvas></p>

<p>[/html]</p>

<p>とりあえず、ここまで</p>

<p>最終的には、mx.rpc.AbstractInvokaを継承したSocketServiceコンポーネントを作るところまでしたい。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/154/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Flex]ログを取る</title>
		<link>http://www.func09.com/wordpress/archives/153</link>
		<comments>http://www.func09.com/wordpress/archives/153#comments</comments>
		<pubDate>Wed, 24 Oct 2007 11:34:23 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript3.0]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[日記]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/153</guid>
		<description><![CDATA[[js] import mx.logging.ILogger; import mx.logging.Log; var logCategoryName:String = &#8220;ConnectionLog&#8221 [...]]]></description>
			<content:encoded><![CDATA[<p>[js]
import mx.logging.ILogger;
import mx.logging.Log;</p>

<p>var logCategoryName:String = &#8220;ConnectionLog&#8221;</p>

<p>var logger:ILogger = Log.getLogger(logCategoryName);
logger.info(&#8216;connect..&#8217;);
logger.error(&#8216;connect error..&#8217;);
logger.worn(&#8216;connect worn&#8217;);
logger.fatal(&#8216;connect fatal&#8217;);
[/js]</p>

<p>こんな感じ？</p>

<p>ログレベルは
fatal &lt; worn &lt; error &lt; info</p>

<p>僕は各クラスごとにログカテゴリを設定してるんで、全エントリーを使って
コンストラクタん中で、こんな感じに。</p>

<p>[js]
var logger:ILogger = Log.getLogger( describeType(this).@name.toString().match(/::(.*)/)[1] );
[/js]</p>

<p>あとは、環境によって、TraceとかLocalConnectionとか、ログの出力方法を切り替えたいなと。</p>

<p>mx.logging.targetsあたりを弄るのかな？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/153/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AS3]オブジェクトからクラス名を取得する</title>
		<link>http://www.func09.com/wordpress/archives/152</link>
		<comments>http://www.func09.com/wordpress/archives/152#comments</comments>
		<pubDate>Wed, 24 Oct 2007 11:23:24 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript3.0]]></category>
		<category><![CDATA[日記]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/152</guid>
		<description><![CDATA[こんな感じ？ [js] import flash.utils.describeType; String(describeType(this).@name).match(/::(.*)/)[1]; [/js]]]></description>
			<content:encoded><![CDATA[<p>こんな感じ？</p>

<p>[js]
import flash.utils.describeType;
String(describeType(this).@name).match(/::(.*)/)[1];
[/js]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/152/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FlashCS3でお絵かきツール</title>
		<link>http://www.func09.com/wordpress/archives/149</link>
		<comments>http://www.func09.com/wordpress/archives/149#comments</comments>
		<pubDate>Thu, 04 Oct 2007 13:49:15 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript3.0]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[日記]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/149</guid>
		<description><![CDATA[ActionScript3.0 Animation Making Things Move!を読み始めました。 英語よめねー。 で、読んでいるうちに何か作りたくなったので 簡単にこさえてみた。お絵かきツール。 実はFlas [...]]]></description>
			<content:encoded><![CDATA[<p>ActionScript3.0 Animation Making Things Move!を読み始めました。
英語よめねー。</p>

<p>で、読んでいるうちに何か作りたくなったので
簡単にこさえてみた。お絵かきツール。
実はFlashでお絵かきツールって作ったこと無かったのよねぇ。</p>

<p>下の灰色四角の中でマウスをクリックすると線が描けます。</p>

<div><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="300" height="300" id="Objects" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="http://www.func09.com/wordpress/wp-content/uploads/2007/10/paint.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#FFFFFF" />
<embed src="http://www.func09.com/wordpress/wp-content/uploads/2007/10/paint.swf" quality="high" bgcolor="#FFFFFF" width="300" height="300" name="Objects" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object></div>

<h3>概要</h3>

<ol>
<li>マウスを押したら、描画開始</li>
<li>マウスを放すまで、描画しつづける</li>
<li>マウスを放したら、描画終了</li>
</ol>

<p>と、誰が作ってもこんな感じだと思います。
1時間くらいで作れるように、あまり機能は求めません。</p>

<p>作ったクラスは</p>

<p><strong>paint.Paint</strong>
お絵かきツールのメインクラス</p>

<p><strong>paint.Background</strong>
背景</p>

<p><strong>paint.Canvas</strong>
絵を描くカンバス</p>

<p><strong>paint.Brush</strong>
ブラシ。サイズとか色とか</p>

<p>本当は背景クラスはカンバスを継承した方がいいような気がしますが
それは今後追求したくなったら、やろう。</p>

<h3>おソース</h3>

<p>[js]
/**
* お絵かきツールのメインクラス
* @author mitsuru.haga@gmail.com
* @version 0.1
*/</p>

<p>package paint {</p>

<pre><code>import paint.*;
import flash.display.Sprite;
import flash.events.*;

public class Paint extends Sprite{

    //  ブラシ
    protected var brush:Brush;

    //  ブラシコレクション
    protected var brushCollection:Array = [];

    //  カンバス
    protected var canvas:Canvas;

    //  背景
    protected var background:Background;

    /**
    * コンストラクタ
    */
    public function Paint(){
        initialize();
    }

    /**
    * 初期化
    * @return
    */
    protected function initialize():void{

        //  ブラシを配列にどんどん追加
        brushCollection.push( new Brush( 'Red', 5, 0xFF0000 ) );
        brushCollection.push( new Brush( 'Blue', 5, 0x0000FF ) );
        brushCollection.push( new Brush( 'Green', 5, 0x00FF00 ) );

        //  ランダムにブラシを決定する
        brush = brushCollection[ uint( Math.random()*brushCollection.length ) ];

        //  背景を作る
        background = new Background();
        background.buttonMode = true;
        background.width = stage.stageWidth;
        background.height = stage.stageHeight;
        background.addEventListener( MouseEvent.MOUSE_DOWN, onCanvasMouseDownHandler );
        background.addEventListener( MouseEvent.MOUSE_UP, onCanvasMouseUpHandler );
        addChild( background );

        //  カンバスを作る
        canvas = new Canvas();
        canvas.addEventListener( MouseEvent.MOUSE_DOWN, onCanvasMouseDownHandler );
        canvas.addEventListener( MouseEvent.MOUSE_UP, onCanvasMouseUpHandler );
        addChild( canvas );

    }

    /**
    * マウスを押した場合
    * 線を描く準備
    * @param    e
    * @return
    */
    protected function onCanvasMouseDownHandler( e:MouseEvent ):void {
        trace( 'draw start' );
        brush = brushCollection[ uint( Math.random()*brushCollection.length ) ];
        canvas.graphics.lineStyle( brush.thickness, brush.color, 1 );
        canvas.graphics.moveTo( mouseX, mouseY );
        canvas.addEventListener( Event.ENTER_FRAME, drawingHandler );
    }

    /**
    * マウスを放した場合
    * 線を描くの終わり
    * @param    e
    * @return
    */
    protected function onCanvasMouseUpHandler( e:MouseEvent ):void {
        trace('draw finish');
        canvas.graphics.endFill();
        canvas.removeEventListener( Event.ENTER_FRAME, drawingHandler );
    }

    /**
    * マウスを押している間
    * 線を描き続ける
    * @param    e
    * @return
    */
    protected function drawingHandler( e:Event ):void{
        trace('drawing');
        canvas.graphics.lineTo( mouseX, mouseY );
    }
}
</code></pre>

<p>}
[/js]</p>

<h3>感想</h3>

<p>ふーん、実に簡単。
気分が乗ったら、Flexのコンポーネントにするくらいの事をしてみたい。
最近Flexばかりだったけど、素のActionScript3ってのも漢らしくていいなと最近思う。</p>

<h3>ダウソ</h3>

<p><a id="p151" href="http://www.func09.com/wordpress/wp-content/uploads/2007/10/painttool.zip" title="ソースファイル">ソースファイル</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/149/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>FlashCS3で埋め込みフォントが上手くいかない時の対処法</title>
		<link>http://www.func09.com/wordpress/archives/145</link>
		<comments>http://www.func09.com/wordpress/archives/145#comments</comments>
		<pubDate>Wed, 03 Oct 2007 06:29:36 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript3.0]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[日記]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/145</guid>
		<description><![CDATA[FlashCS3のIDE上で、フォントシンボルを使った埋め込みフォントが、全く上手く行かなかったので 対処法を探しました。いやーハマった。 まず何も考えずに僕が試した方法は、以下の通り。 Flash8の感覚でやると、こう [...]]]></description>
			<content:encoded><![CDATA[<p>FlashCS3のIDE上で、フォントシンボルを使った埋め込みフォントが、全く上手く行かなかったので
対処法を探しました。いやーハマった。</p>

<p>まず何も考えずに僕が試した方法は、以下の通り。
Flash8の感覚でやると、こうではなかろうか？</p>

<h3>間違った方法</h3>

<p>[js]
import flash.text.*;</p>

<p>//  テキストフォーマットを作成
var format:TextFormat = new TextFormat();
format.size = 30;
//フォントをリンケージ名で指定する
format.font = &#8216;MyFont&#8217;;</p>

<p>//  テキストフィールドを作成
var field:TextField = new TextField();
field.defaultTextFormat = format;
field.embedFonts = true;
field.antiAliasType = AntiAliasType.ADVANCED;
field.text = &#8216;テスト&#8217;;</p>

<p>//  ステージに配置
addChild( field );
[/js]</p>

<p>そして、ライブラリに「新しいフォント」シンボルを作る、
埋め込むフォントを指定して、リンケージを設定だ。</p>

<p><img id="image146" src="http://www.func09.com/wordpress/wp-content/uploads/2007/10/fontsymbol1.png" alt="fontsymbol1.png" /></p>

<p><img id="image147" src="http://www.func09.com/wordpress/wp-content/uploads/2007/10/fontsymbol2.png" alt="fontsymbol2.png" /></p>

<p>これでコンパイルすると、フォントが表示されません。。</p>

<h3>調べた</h3>

<p>で、調べてみるとあった。</p>

<p><a href="http://www.nivas.hr/blog/2007/06/06/font-embedding-problems-in-flash-cs3-ide/">Font embedding problems in Flash CS3 IDE</a></p>

<p>ざっくりと呼んでみると
Font.enumerateFonts()で埋め込んだフォントを調べてみると
フォントの名前がリンケージ名じゃないから
TextFormat.fontでリンケージ名を指定しても、フォントが見つからないって寸法だ。</p>

<h3>やってみた</h3>

<p>それを回避するための方法が以下</p>

<p>[js]
//FontクラスのサブクラスMyFontからフォント名を取得
format.font = new MyFont().fontName;
[/js]</p>

<p><img id="image148" src="http://www.func09.com/wordpress/wp-content/uploads/2007/10/fontsymbol3.png" alt="fontsymbol3.png" />
できた！</p>

<p>ライブラリにフォントシンボルを作って、リンケージを指定するときに
ベースクラスがflash.text.Fontだった事に気づいていると思う。
CS3では、リンケージ名=クラス名だから、クラスのインスタンスプロパティを使ってあげれば良いという事になる。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/145/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AIR x RoR</title>
		<link>http://www.func09.com/wordpress/archives/142</link>
		<comments>http://www.func09.com/wordpress/archives/142#comments</comments>
		<pubDate>Thu, 06 Sep 2007 06:17:55 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript3.0]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[日記]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/142</guid>
		<description><![CDATA[Ruby on RailsとAdobe AIRでデスクトップアプリを作る 第１回：付箋紙アプリケーションを作ろう！ http://www.thinkit.co.jp/free/article/0709/3/1/ はてブで [...]]]></description>
			<content:encoded><![CDATA[<p>Ruby on RailsとAdobe AIRでデスクトップアプリを作る
第１回：付箋紙アプリケーションを作ろう！
<a href="http://www.thinkit.co.jp/free/article/0709/3/1/">http://www.thinkit.co.jp/free/article/0709/3/1/</a></p>

<p>はてブで注目エントリーになってた。
僕が登録した時にはまだ１桁だったのだが、RailsとAIRのお手軽な組み合わせに注目している人が多いという事の表れか？</p>

<p>scaffold_resourceなんて知らなかったなぁ。</p>

<p>そろそろAIRとRoRでなんか作っておかないと時代に乗り遅れると思いつつ。
おもしろいもん作ろうと思って、始める前から挫折している自分ガイル。</p>

<p>やっぱ付箋くらいが妥当だよな。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/142/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

