<?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; flash</title>
	<atom:link href="http://www.func09.com/wordpress/archives/category/flash/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>[sinatra for flasher] 大量のダミーデータを返すAPIを作る</title>
		<link>http://www.func09.com/wordpress/archives/801</link>
		<comments>http://www.func09.com/wordpress/archives/801#comments</comments>
		<pubDate>Wed, 17 Feb 2010 04:30:41 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sinatra]]></category>
		<category><![CDATA[未分類]]></category>
		<category><![CDATA[haml]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=801</guid>
		<description><![CDATA[FLASHer のためのSinatra入門 [導入編] 前回の続きです。 今回は大量のダミーデータを返すAPIを作ってみます。 要件としては 住所録を返すAPI 本番サーバはPHPなので、URLもそれに合わせる 100件 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.func09.com/wordpress/archives/764">FLASHer のためのSinatra入門 [導入編]</a></p>

<p>前回の続きです。</p>

<p>今回は大量のダミーデータを返すAPIを作ってみます。<br />
要件としては</p>

<ul>
<li>住所録を返すAPI</li>
<li>本番サーバはPHPなので、URLもそれに合わせる</li>
<li>100件程度、ランダムで返す</li>
<li>XMLの内容は、名前、メール、メッセージ、性別、国</li>
</ul>

<p>という感じです。</p>

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

<h2>Haml</h2>

<p>今回はテンプレート言語に<a href="http://haml-lang.com/">Haml</a>を使っていきます。<br />
タグ構造をインデントと簡略構文でガシガシ書いていけるので、慣れると気持ちいいです。</p>

<p>日本Hamlの会<br />
<a href="http://haml.ursm.jp/">http://haml.ursm.jp/</a></p>

<p>Getting Started Haml<br />
<a href="http://haml.ursm.jp/getting-started">http://haml.ursm.jp/getting-started</a></p>

<p>ざっくりと説明すると</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">!!! XML<br />
<span style="color:#006600; font-weight:bold;">%</span>items<br />
&nbsp; <span style="color:#006600; font-weight:bold;">%</span>item<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#996600;">&quot;1&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> こんにちは<br />
&nbsp; <span style="color:#006600; font-weight:bold;">%</span>item<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#996600;">&quot;2&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> さようなら</div></div>

<p>というHamlマークアップが</p>

<div class="codecolorer-container xml blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">'1.0'</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">'utf-8'</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;items<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;1&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>こんにちは<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;2&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>さようなら<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/items<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>

<p>に変換されます。<br />
雰囲気だけ掴んでもらって、詳しくは<a href="http://haml-lang.com/tutorial.html">チュートリアル</a>や<a href="http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html">ドキュメント</a>を御覧下さい。</p>

<h2>Forgeryでサンプルデータの作成から解放される</h2>

<p><a href="http://github.com/sevenwire/forgery">forgeryというgemライブラリ</a>で、煩瑣なサンプルデータ作成とはおさらばできる。</p>

<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> forgery</div></div>

<p>でインストールして、使い方は</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'forgery'</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:internet</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">email_address</span> <span style="color:#008000; font-style:italic;">#=&gt; tmccoy@topiclounge.biz</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:internet</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">email_address</span> <span style="color:#008000; font-style:italic;">#=&gt; charper@voolia.net</span></div></div>

<p>こんな感じ。標準でサンプルデータの辞書がいろいろ入っていて、上記のコードはメールアドレスのサンプルデータをランダムに生成している。</p>

<p>今回はForgeryを積極的に使う。</p>

<h2>コード</h2>

<p>いきなりですが最終型のコード</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'sinatra'</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'forgery'</span><br />
<br />
before <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; content_type <span style="color:#996600;">'xml'</span> <span style="color:#008000; font-style:italic;"># 常にContent-Typeを 'application/xml'に</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
get <span style="color:#996600;">'/api/getFriends.php'</span> <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; haml <span style="color:#ff3333; font-weight:bold;">:get_friends_php</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
__END__<br />
<br />
@@ layout<br />
!!! XML<br />
= <span style="color:#9966CC; font-weight:bold;">yield</span><br />
<br />
@@ get_friends_php<br />
<span style="color:#006600; font-weight:bold;">%</span>friends<br />
&nbsp; <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">times</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>friend<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#996600;">&quot;#{i}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>first_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first_name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>last_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">last_name</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>email= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:internet</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">email_address</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>message= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:lorem_ipsum</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">paragraph</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>gender= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:personal</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">gender</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>country= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:address</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">country</span></div></div>

<p>今回は1ファイルで完結させてみた。</p>

<p>ブラウザで http://localhost:9393/api/getFriends.php （ポートはshotgunデフォルト）にアクセスすると、下みたいなXMLが取得できる。</p>

<p><img src="http://www.func09.com/wordpress/wp-content/uploads/16ff47c99cb3e8cd7ed0b7054cfbbdb8.jpg" alt="" title="次のソース_ http___localhost_9393_api_getFriends.php" width="550" height="464" class="alignnone size-full wp-image-805" /></p>

<h3>beforeフィルター</h3>

<p>常にXMLを返すAPIなので、リクエストを受け付けて処理する前にContent-Typeを&#8217;application/xml&#8217;にするように設定。<a href="http://www.sinatrarb.com/book.html#filters">Sinatraのbeforeフィルター</a>という機能で実現。</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">before <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; content_type <span style="color:#996600;">'xml'</span> <span style="color:#008000; font-style:italic;"># 常にContent-Typeを 'application/xml'に</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>

<h3>URLに対する処理</h3>

<p>/api/getFriends.phpというパスに対して処理したい場合、Sinatraのgetメソッドに続いて、そのパスを定義する。 do ~ end ブロックの中に処理を記述。</p>

<p>この場合Hamlでget_friends_phpテンプレートを出力する処理のみだね。</p>

<p>パスに普通に「.php」とか使えているところに注目してもらいたい。要するにマッチすればなんでも良いので「.pl」でも「.cgi」でも「.do」でも本番と同じパスを表現できるはずだ。</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">get <span style="color:#996600;">'/api/getFriends.php'</span> <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; haml <span style="color:#ff3333; font-weight:bold;">:get_friends_php</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>

<h3>Hamlによるテンプレート</h3>

<p>Sinatraには「ファイル内テンプレート」という機能があって、テンプレートをわざわざ別ファイルとして用意しなくても、ソースファイルの最後（<strong>END</strong>以降）に テンプレートを書いても良いことになっている。</p>

<p>テンプレート名は「@@index」とか「@@layout」とか先頭に「＠＠」を付けて置くこと。</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">__END__<br />
<br />
@@ layout<br />
!!! XML<br />
= <span style="color:#9966CC; font-weight:bold;">yield</span><br />
<br />
@@ get_friends_php<br />
<span style="color:#006600; font-weight:bold;">%</span>friends<br />
&nbsp; <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">times</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>friend<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#996600;">&quot;#{i}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>first_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first_name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>last_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">last_name</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>email= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:internet</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">email_address</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>message= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:lorem_ipsum</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">paragraph</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>gender= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:personal</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">gender</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>country= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:address</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">country</span></div></div>

<h4>レイアウト</h4>

<p>layout という名前のテンプレートがあれば、Sinatraはすべてのテンプレートのレイアウト、つまり枠として利用する。</p>

<p>「!!! XML」はXMLのドキュタイプ宣言を簡略表現で、「= yield」は、ここにメインテンプレートの内容を流し込むよーという処理。</p>

<h4>get_friends_php テンプレート</h4>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@@ get_friends_php<br />
<span style="color:#006600; font-weight:bold;">%</span>friends<br />
&nbsp; <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">times</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>friend<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#996600;">&quot;#{i}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>first_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first_name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>last_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">last_name</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>email= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:internet</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">email_address</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>message= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:lorem_ipsum</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">paragraph</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>gender= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:personal</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">gender</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>country= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:address</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">country</span></div></div>

<p>XMLのタグ表現を「%タグ名」とインデント階層でマークアップしていく。<br />
「- rand(100).times do |i|」は、以降の下層インデントの部分をランダムで100件まで繰り返させている。</p>

<p>あとはForgeryの住所辞書や名前辞書を使ってサンプルデータを埋め込むよ。</p>

<h2>さいごに</h2>

<p>今回はFlashで使えそうな大量のダミーデータAPIをさくっと作ってみたよ。慣れれば10分もあれば作れるので、下手に実データを作るより楽なはず。</p>

<p>今後は</p>

<ul>
<li>HTTP POSTでデータを送信するような場合</li>
<li>JSONの場合</li>
</ul>

<p>など書いてみようかと。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/801/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FLASHer のためのSinatra入門 [導入編]</title>
		<link>http://www.func09.com/wordpress/archives/764</link>
		<comments>http://www.func09.com/wordpress/archives/764#comments</comments>
		<pubDate>Tue, 16 Feb 2010 08:33:01 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sinatra]]></category>
		<category><![CDATA[未分類]]></category>
		<category><![CDATA[erb]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=764</guid>
		<description><![CDATA[はじめに こんにちはーFlasherのみなさん。 すっかりRuby記事ばっかりなのに、いまだにブログ訪問者の大半はFlasherらしいこのブログ。 久しぶりにFLASHerのための記事を書けそうです。 今日とりあげるのは [...]]]></description>
			<content:encoded><![CDATA[<h2>はじめに</h2>

<p>こんにちはーFlasherのみなさん。<br />
すっかりRuby記事ばっかりなのに、いまだにブログ訪問者の大半はFlasherらしいこのブログ。<br />
久しぶりにFLASHerのための記事を書けそうです。</p>

<p>今日とりあげるのは<a href="http://www.sinatrarb.com/">Sinatra</a>というRubyで作られた超シンプルなフレームワークです。<br /></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">require 'rubygems'<br />
require 'sinatra'<br />
get '/hi' do<br />
&nbsp; &quot;Hello World!&quot;<br />
end</div></div>

<p>このたった5行で、http://localhost:4567/hi にアクセスすると「Hello World!」というテキストを返すAPIサーバがローカルPC上に完成するんだ。</p>

<p>Rubyがわからなくたって、どんなプログラムなのか一目瞭然だ。シンプルだと思わないかい？<br />
<strong>今回はこのシンプルなSinatraを使って、あなたのFlash案件に使える、より本番に近いモックAPIサーバを作ろうというお話です。</strong></p>

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

<h2>この記事の対象者</h2>

<ul>
<li>サーバ連携なFlash案件が多いFlash開発者</li>
<li>Macユーザー（Windowsの人もインストール編以外は共通だと思う）</li>
<li>ターミナル.appが少しは触れる人（達人じゃなくてよい）</li>
</ul>

<h2>今回のシチュエーション</h2>

<p>FlashでToDo管理アプリを作ることになった。
まずはToDoの一覧をサーバからXMLで取得して、それが表示できるようにしたい。</p>

<p>APIのURLと、どんなXMLが返ってくるかは決まっているんだけど、肝心なサーバ側は完成していないどころかリリース前日には出来上がるスケジュールらしい。
こうなったら自分でダミーAPIを用意しながら開発するしかない。</p>

<p>ToDo一覧を取得するAPIと返ってくるXMLのサンプル<br />
<strong>http://example.jp/api/todolist</strong></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;todos&gt;<br />
&nbsp; &lt;todo id=‘1’&gt;<br />
&nbsp; &nbsp; &lt;title&gt;牛乳を買って帰る&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;todo id=‘2’&gt;<br />
&nbsp; &nbsp; &lt;title&gt;企画書を提出する&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&lt;/todos&gt;</div></div>

<h2>効率よく開発を進めるためのFlashの設計</h2>

<p>さて、上記のようなシチュエーションの場合、ローカルにダミーXMLを配置して、それを読み込むというのが一番てっとり早い開発手法なんだと思う。
しかしAPIの種類が100種類とか膨大だったり、同じAPIでもパラメーターで返却のバリエーションが変わるとか想定すると、<strong>本番により近いAPIモックを用意できるのがベスト</strong>だ。</p>

<p>例えば本番APIとドメイン以外まったくURLが同じという構成があったら、Flashの設計も随分綺麗になると思うよ。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">import flash.events.*;<br />
import flash.net.*;<br />
<br />
// 実行環境をSWF起動時に設定する<br />
var environment:String = 'development';<br />
<br />
// 設定<br />
var setting:Object = {<br />
&nbsp; production: { // 本番用<br />
&nbsp; &nbsp; host: 'http://example.jp'<br />
&nbsp; },<br />
&nbsp; development: { // 開発用<br />
&nbsp; &nbsp; host: 'http://localhost:4567'<br />
&nbsp; }<br />
};<br />
<br />
// ローダー<br />
var request:URLRequest = new URLRequest(setting[environment].host.concat('/api/todolist'));<br />
var loader:URLLoader = new URLLoader();<br />
loader.addEventListener(Event.COMPLETE, function(e:Event) {<br />
&nbsp; trace(URLLoader(e.target).data);&nbsp; &nbsp; &nbsp; &nbsp;<br />
});<br />
loader.load(request);</div></div>

<p>上のコードでは、「environment」変数の中身がdevelopmentなら開発環境用のAPIを、productionなら本番環境用のAPIをリクエストする。</p>

<h2>インストール編</h2>

<p>ここからはSinatraをインストールする話</p>

<p>Sinatraでモックサーバを作るには最低でも以下のようなものが要求されるよ、がんばれ！</p>

<ul>
<li>ターミナル.appの操作</li>
<li>ruby</li>
<li>rubygems</li>
<li>sinatra</li>
</ul>

<p>まずはターミナル.appを起動しよう。Macの「/アプリケーション/ユーティリティ/」に入っている。これを機会にターミナルをDockに入れておいたら周りの同僚に一目おかれるかもね。</p>

<p>起動したらRubyが入っているか確認だ。MacOS10.4くらいからRubyは最初から入っているはず。最新の10.6ならRubyのバージョンは1.8.7のはずだ。</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">% ruby -v<br />
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]</div></div>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/b6a800e18860f12ebd76a523990cf2c6.jpeg"><img src="http://www.func09.com/wordpress/wp-content/uploads/b6a800e18860f12ebd76a523990cf2c6.jpeg" alt="" title="b6a800e18860f12ebd76a523990cf2c6" width="555" height="383" class="alignnone size-full wp-image-777" /></a></p>

<p>次にrubygemsのバージョン確認。rubygemsはrubyのサードアプリをインストールしたりするための管理ツールだよ。
今回のSinatraもそうだし、有名なRuby on Railsもrubygemsでインストールできるんだ。</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">% gem -v<br />
1.3.5</div></div>

<p>ひょっとしたらバージョンは1.3.5より低いかも。そのままでも大丈夫だと思うけどアップグレードするなら。</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">% sudo gem update —system</div></div>

<p>でアップグレードしよう。</p>

<h2>Sinatraのインストール</h2>

<p>さて、RubyGemでお目当てのSinatraをインストールする。ついでに他にも使えそうなライブラリをいれておくよ。</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">sudo gem install sinatra haml rack shotgun</div></div>

<p>パスワードを要求されるので、自分のアカウントのパスワードを入力しよう。するとインストールが始まる。</p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/970982c1dd8150caf002aac66b4a67b6.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/970982c1dd8150caf002aac66b4a67b6.jpg" alt="" title="ターミナル — zsh — 65×19-1" width="559" height="385" class="alignnone size-full wp-image-780" /></a></p>

<p>お疲れ様でした！あとはダミーサーバを書くだけだ。</p>

<h2>さぁ、SinatraでダミーAPIを書くんだ！</h2>

<p>ここまで準備ができたら、Flashプロジェクトの中にでもsinatra用のディレクトリ「mock」を作る。全体の構成はこんな感じにしたよ。</p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/mytodos.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/mytodos.jpg" alt="" title="mytodos" width="505" height="203" class="alignnone size-full wp-image-782" /></a></p>

<p>mockディレクトリの中にapp.rbというテキストファイルを作成して、エディタで以下のように書く。</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">require 'rubygems'<br />
require 'sinatra'<br />
get '/api/todolist' do<br />
&nbsp; 'Hello World!'<br />
end</div></div>

<p>そして、ターミナルでプロジェクトのmockディレクトリまで移動してサーバを起動しよう。
え？ターミナルでmockディレクトリまで移動ができない？
デスクトップにmytodosプロジェクトフォルダがあるなら</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">% cd ~/Desktop/mytodos/mock</div></div>

<p>と入力してエンターだ。</p>

<p>それでもわからなかったら、「cd 」とだけ書いて、移動したいフォルダをターミナルへドラッグドロップでもオッケー。</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">% ruby app.rb</div></div>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/4db5c451888a5a100ff25f52c3556d17.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/4db5c451888a5a100ff25f52c3556d17.jpg" alt="" title="ターミナル — ruby — 65×19" width="556" height="386" class="alignnone size-full wp-image-784" /></a></p>

<p>こんな感じになってるかな？</p>

<p>なっていれば、君による君だけのAPIサーバが起動した。おめでとう！
そうそう、サーバを止めたい時はCTRL+Cを押すんだよ。</p>

<p>ブラウザで <a href="http://localhost:4567/api/todolist">http://localhost:4567/api/todolist</a>アクセスしてみよう。</p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/http___localhost_4567_api_todolist.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/http___localhost_4567_api_todolist.jpg" alt="" title="http___localhost_4567_api_todolist" width="518" height="318" class="alignnone size-full wp-image-786" /></a></p>

<p>すごい！完璧だ！サーバサイドエンジニアになれるんじゃないか？！</p>

<h2>モックAPIを作る</h2>

<p>僕らの目的は「Hello World」を表示することじゃない。XMLを返すサーバを作ることだから先を急ぐよ。</p>

<p>mock/app.rbをちょっと変更してきちんとXMLを返すようにしてみるよ</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">require 'rubygems'<br />
require 'sinatra'<br />
get '/api/todolist' do<br />
&nbsp; content_type 'xml'<br />
&nbsp; erb :api_todolist<br />
end</div></div>

<p>そして、mock/views/api_todolist.erb というファイルを作成して</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;todos&gt;<br />
&nbsp; &lt;todo id='1'&gt;<br />
&nbsp; &nbsp; &lt;title&gt;牛乳を買って帰る&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;todo id='2'&gt;<br />
&nbsp; &nbsp; &lt;title&gt;企画書を提出する&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&lt;/todos&gt;</div></div>

<p>としよう。</p>

<p>ブラウザでアクセスすれば、今度はXMLが返ってくるようになったはずだ。</p>

<p>簡単に説明すると、「content_type ‘xml’」でXMLとしてレスポンスを返すように定義して、
「erb :api_todolist」で views/api_todolist.erbというテンプレートファイルを出力してね。</p>

<p>ということになる。ERBというのはRubyでスタンダードなテンプレートシステムだ。<br />
参考：<a href="http://www.druby.org/ilikeruby/erb.html">http://www.druby.org/ilikeruby/erb.html</a></p>

<h2>もうちょっと高度なことをする</h2>

<p>これじゃローカルにXMLを置くのと変わらないよドラえもーん、と嘆いている、そこののび太くん。
ERBを使えば繰り返しが可能なので、例えば999件のXMLを返したい時はこうだ。</p>

<p>mock/views/api_todolist を修正</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;todos&gt;<br />
&nbsp; &lt;% 999.times do |id| %&gt;<br />
&nbsp; &lt;todo id='&lt;%= id %&gt;'&gt;<br />
&nbsp; &nbsp; &lt;title&gt;牛乳を買って帰る &lt;%= id %&gt;&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;% end %&gt;<br />
&lt;/todos&gt;</div></div>

<p>数値.times do ~ end で数値分繰り返し処理されるのはRuby独特の書き方だ。</p>

<h2>さらに高度なことをする</h2>

<p>単純な繰り返しじゃいやだ！自分でレコードを作りたい！でもデータベースは嫌だ！
OK。ならこうだ。</p>

<p>mock/app.rb修正</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">require 'rubygems'<br />
require 'sinatra'<br />
get '/api/todolist' do<br />
&nbsp; # TODOの配列を作る %w はRubyの配列式<br />
&nbsp; @todos = %w{<br />
&nbsp; &nbsp; コンビニに寄る<br />
&nbsp; &nbsp; ジャンプを立ち読みする<br />
&nbsp; &nbsp; 牛乳をレジへ持っていく<br />
&nbsp; &nbsp; 178円払う<br />
&nbsp; &nbsp; 店員さんにありがとうと言う<br />
&nbsp; &nbsp; 牛乳を買って帰る<br />
&nbsp; &nbsp; 牛乳を冷蔵庫へしまう<br />
&nbsp; }<br />
&nbsp; content_type 'xml'<br />
&nbsp; erb :api_todolist<br />
end</div></div>

<p>mock/views/api_todolist.erb修正</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;todos&gt;<br />
&nbsp; &lt;% @todos.each_with_index do |todo, id| %&gt;<br />
&nbsp; &lt;todo id='&lt;%= id %&gt;'&gt;<br />
&nbsp; &nbsp; &lt;title&gt;&lt;%= todo %&gt;&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;% end %&gt;<br />
&lt;/todos&gt;</div></div>

<p>app.rbで設定した@todosをテンプレートからアクセスしている。<br />
@todos.each_with_index do |element, index| ~ end という形もRubyでは日常茶飯事に使われる配列の繰り返し方。</p>

<h2>さいごに</h2>

<p>ざっとFLASHerがSinatraを使ってモックサーバを用意する方法を書いてみた。</p>

<p>Sinatra側のコードは書き換える度にサーバを再起動する必要があるから注意してね。
それがめんどくさい場合はshotgunコマンドを使うと、再起動の心配は必要無くなる。</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">% shotgun app.rb</div></div>

<p>駆け足だったので、もっと具体的なことをしたいとか、これはどーやって実現するんだ？という質問があったら、コメントなりメールなり<a href="http://twitter.com/func09">@func09</a>なりへどうぞ。</p>

<p>それから、モックサーバを作るためにRubyにハマりすぎると、僕みたいにFlasherを引退してまでRubyを書くことになっちゃうからほどほどにね。</p>

<p>enjoy flash and ruby!</p>

<p>参考URL: <a href="http://d.hatena.ne.jp/seiunsky/20091108/1257695951">AS3でちょっとしたサーバサイドのプログラムが必要になる時に毎回書くのが面倒なので、適当に sinatra で書いた</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/764/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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アニメで賞金を荒稼ぎしている件</title>
		<link>http://www.func09.com/wordpress/archives/596</link>
		<comments>http://www.func09.com/wordpress/archives/596#comments</comments>
		<pubDate>Tue, 26 May 2009 03:05:58 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[日記]]></category>
		<category><![CDATA[anime]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=596</guid>
		<description><![CDATA[filmoというCM作成サイトがあって うちの嫁さんが出す作品出す作品必ず賞を取っている http://filmo.tv/brief/works/?brief_id=2009032401 http://filmo.tv/ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://filmo.tv/">filmo</a>というCM作成サイトがあって</p>

<p>うちの<a href="http://gaya-gaya-gaya.blogspot.com/">嫁さん</a>が出す作品出す作品必ず賞を取っている</p>

<ul>
<li><a href="http://filmo.tv/brief/works/?brief_id=2009032401">http://filmo.tv/brief/works/?brief_id=2009032401</a></li>
<li><a href="http://filmo.tv/brief/works/?brief_id=2009031201">http://filmo.tv/brief/works/?brief_id=2009031201</a></li>
<li><a href="http://filmo.tv/brief/works/?brief_id=2009021601">http://filmo.tv/brief/works/?brief_id=2009021601</a></li>
<li><a href="http://filmo.tv/brief/works/?brief_id=2009022001">http://filmo.tv/brief/works/?brief_id=2009022001</a></li>
</ul>

<p><a href="http://twitter.com/ai1017">嫁（@ai1017）</a>・・恐ろしい子・・</p>

<hr />

<p>追記：2011/12/20<br />
嫁はお仕事募集中です。<br />
<a href="http://gaya-anime.com/works">http://gaya-anime.com/works</a><br />
是非<a href="mailto:mitsuru.haga@gmail.com">ご相談を</a></p>

<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/ISDkLwtp0Xk&#038;hl=ja&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ISDkLwtp0Xk&#038;hl=ja&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>

<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/0RxE9IxSGPE&#038;hl=ja&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/0RxE9IxSGPE&#038;hl=ja&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>

<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/ROeSY1tj52E&#038;hl=ja&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ROeSY1tj52E&#038;hl=ja&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>

<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/OeJZsLBprEU&#038;hl=ja&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/OeJZsLBprEU&#038;hl=ja&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/596/feed</wfw:commentRss>
		<slash:comments>9</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>[works] eyeVioがHDビデオに対応</title>
		<link>http://www.func09.com/wordpress/archives/227</link>
		<comments>http://www.func09.com/wordpress/archives/227#comments</comments>
		<pubDate>Mon, 30 Jun 2008 12:41:09 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript2.0]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[works]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/227</guid>
		<description><![CDATA[eyeVioがHD動画に対応してます。 http://eyevio.jp/ 今回もいつも通り、動画のプレイヤーと、JavaScriptあたりをやりました。 FlashPlayerは7で作っているのでExternalInt [...]]]></description>
			<content:encoded><![CDATA[<p>eyeVioがHD動画に対応してます。</p>

<p><a href="http://eyevio.jp/">http://eyevio.jp/</a></p>

<p>今回もいつも通り、動画のプレイヤーと、JavaScriptあたりをやりました。</p>

<p>FlashPlayerは7で作っているのでExternalInterfaceクラスが使えないわけですが、
それでも一生懸命JavaScriptと連携しています。</p>

<p>SWFからダイナミックにHTMLのレイアウトを弄ったりして、なかなか楽しいです。</p>

<p>今回途中で非同期処理の管理に嫌気がさしたのでAS2用のスレッドライブラリを作りました。</p>

<p>AS3ではSparkの「そうめん」のような素晴らしいライブラリがあるんですが、AS2向けでシンプルなのは見つからなかったので
自作で</p>

<p>[js]
new Sequence(
  new Wait(1),
  new XMLLoad(&#8216;hoge.xml&#8217;),
  new Wait(1),
  new FunctionJob(this,this.normalfunc)
).start();
[/js]</p>

<p>こんな感じで書けるように。</p>

<p>もともとのソースコードのコールバック関数をそのまま弄らずシーケンス処理に組み込めるように
関数をひとつのスレッドとして利用できるようにしたのが正解でした。</p>

<p>非同期の整理のつもりでスレッドライブラリを作りましたが、メソッドが集中しやすいコントローラー系クラスの処理分散にも効果を発揮してウハウハ。</p>

<p>時代遅れのAS2なので、気合いをいれて拡張していくつもりはサラサラないけど、
気が向いたら公開したいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/227/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[works]eyeVioのリニューアル</title>
		<link>http://www.func09.com/wordpress/archives/210</link>
		<comments>http://www.func09.com/wordpress/archives/210#comments</comments>
		<pubDate>Wed, 12 Mar 2008 12:00:59 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript2.0]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[works]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/210</guid>
		<description><![CDATA[ソニーの動画共有サイト「eyeVio」がリニューアルされました。 動画のプレイヤー部分を引き続き担当しています。 それからHTMLコーディングとCSSも、ベース段階でやっています。 今回のリリースから、フリーランスでやっ [...]]]></description>
			<content:encoded><![CDATA[<p>ソニーの動画共有サイト「<a href="http://eyevio.jp/">eyeVio</a>」がリニューアルされました。
動画のプレイヤー部分を引き続き担当しています。
それからHTMLコーディングとCSSも、ベース段階でやっています。</p>

<p>今回のリリースから、フリーランスでやってます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/210/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wmodeとallowFullScreen</title>
		<link>http://www.func09.com/wordpress/archives/207</link>
		<comments>http://www.func09.com/wordpress/archives/207#comments</comments>
		<pubDate>Wed, 27 Feb 2008 16:16:34 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[flash]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/207</guid>
		<description><![CDATA[Flashの話。 Flashでフルスクリーンを使いたい場合は埋め込み用のEmbed of Objectタグに allowFullScreen='true' を追加しておく必要がありますよね。 さらに、FlashにHTML [...]]]></description>
			<content:encoded><![CDATA[<p>Flashの話。</p>

<p>Flashでフルスクリーンを使いたい場合は埋め込み用のEmbed of Objectタグに</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">allowFullScreen='true'</div></div>

<p>を追加しておく必要がありますよね。</p>

<p>さらに、FlashにHTMLのdivなんかをオーバレイさせたい場合は</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">wmode='transparent'</div></div>

<p>にしますよね。</p>

<p>でも、wmodeに何か設定がされているとフルスクリーンにできないみたいなんです・・・。</p>

<p>つまり、Flashの上にオーバレイさせたりするコンテンツで、フルスクリーンモードは使えないってわけ。
週明けにリリースなのに、まじ勘弁ですよ・・・。</p>

<p>&#8211;</p>

<p>ちなみに、JavaScriptで動的にwmodeを切り替えるというのも当然考えた。
けどIE以外のブラウザでは、embedタグを弄ろうものなら、容赦なくSWFがリロードされるよ。
SWFのリロードとかクリティカルすぎて問題外だよ。</p>

<p>Flash純正のフルスクリーンは諦めて、すでに使っているブラウザいっぱいにFlashを広げる手法でいく。
これメンドイんだよなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/207/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[flash]俺のやり方</title>
		<link>http://www.func09.com/wordpress/archives/202</link>
		<comments>http://www.func09.com/wordpress/archives/202#comments</comments>
		<pubDate>Wed, 20 Feb 2008 11:33:14 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[actionscript2.0]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[日記]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/202</guid>
		<description><![CDATA[ActionScript2での開発の話だけど、 大抵どんなプロジェクトでもディレクトリ構造が同じになってきた。 ちょっと晒してみる。 他の人はどういう風なのかな？ com func09 event(イベント系の親クラスが [...]]]></description>
			<content:encoded><![CDATA[<p>ActionScript2での開発の話だけど、
大抵どんなプロジェクトでもディレクトリ構造が同じになってきた。
ちょっと晒してみる。</p>

<p>他の人はどういう風なのかな？</p>

<ul>
<li>com
<ul>
<li>func09
<ul>
<li>event(イベント系の親クラスが入ってる)</li>
<li>logging(俺ロギングAPI)</li>
<li>utils(俺便利クラス群)</li>
<li>:myproject(プロジェクト名)
<ul>
<li>bussines(共通で使うロジックをここに)</li>
<li>compornents(UICompornentを継承したUIはここに)</li>
<li>model（モデル系）</li>
<li>service（外部とのインターフェイスクラス。大抵シングルトンで実装）</li>
<li>views(作ったコンポーネントをがっちゃんこするクラス。コンポーネント同士のメディエイターの役割だとか、リサイズ時の制御だとか)</li>
Main.as（コントローラークラス。モデルとビューをつなぐ部分だったり、外部向けのAPIを持つ）
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>

<p>僕はあんまりモーションモーションした案件がないので、CairnGormなんかを参考にしてます。
UIパーツはほぼ全てUICompornentを継承してコンパイルしておきます。
こうするとテストもしやすいし、おのずと結合が緩くなりますので。
バイディングもできるしね。
いいことばかりじゃないけどね。</p>

<p>さて仕事仕事。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/202/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>
	</channel>
</rss>

