[perl] perlとFLASHで通信してみる。

脈略なくこんなのをはじめてみる。
元ネタは "14歳からはじめるActionScriptオンラインゲームプログラミング教室" より
著者の大槻有一郎氏の本は正直お勧めだ。
自分はこの手のソースが直に本文に書かれている書籍は買わないのだが
明らかに初心者がハマるところを丁寧に書いてあるし、
適当な語句で誤魔化すこともしない。
研修とかにしても格別な素材であると思う。
 
とまぁ本の批評が目的ではないのでこれくらいにして、
題の通り、通信をしてみる。
perlはともかく、ActionScriptなんてものはさっぱり触ったことが無いため
何ができて何ができないのか分からないの若干の不安はあるが
まーなんとかなるさの精神でちょっとやってみようと思う。
 
まず環境設定など
無料でFlashの制作環境が整えられる! FlashDevelopとFlex SDK 3のインストール方法(ビデオ付き) | ClockMaker Blog
http://clockmaker.jp/blog/2009/07/tutorial-install-flashdevelop-flex-sdk/
前回も書いた気がするので略。
 
次、httpサーバーだがLinuxのapache2を使う。
使う理由はエラーログが読めるからと、perlLinux上で動かすから。
ApacheでUserdirを使用できるようにする。 - そ、そんなことないんだから!
http://d.hatena.ne.jp/Fiore/20080310/1205127955
キモは
#AddHandler cgi-script .cgi
コメントアウトだっただろうか。これで30分くらい悩んだ。
 
samba設定で自分のhome以下に public_html ディレクトリを作成し、
その下に以下のような配置でFlashDevelopでプロジェクトを作成する。

$ tree
-- Main.as3proj
-- bin
-- Main.swf
-- cgi-bin
`-- test.cgi
-- expressInstall.swf
-- index.html
`-- js
`-- swfobject.js
-- lib
-- obj
-- MainConfig.old
`-- MainConfig.xml
`-- src `-- Main.as

 
続いて cgi-bin/test.cgi の中身(書籍と一緒)

#!/usr/bin/perl

print "Content-type: text/plain; charset=utf-8\n\n";
print "あなたのメッセージは\n";
$str = $ENV{"QUERY_STRING"};
print "$str\n";

 
FLASHのソース Main.as の中身

package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.text.TextField;
	
	/**
	 * ...
	 * @author hato
	 */
	public class Main extends Sprite 
	{
		public var tf:TextField = new TextField();
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			this.addChild( this.tf );
			this.tf.width           = 200;
			this.tf.background      = true;
			this.tf.backgroundColor = 0xFFEE00;
			
			var request:URLRequest = new URLRequest(
				"/~hato/bin/cgi-bin/test.cgi?What+is+Happens!");//
// IP を含むフルパスでもよいかも
			var loader:URLLoader = new URLLoader();
			loader.addEventListener( Event.COMPLETE, this.completed );
			loader.load(request);
			
		}
		
		private function completed( event:Event ):void
		{
			var loader:URLLoader = URLLoader( event.target );
			this.tf.text = String( loader.data );
		}
	}
}

 
あとは http://*.*.*.*/bin/ を叩けば index.html -> Main.swf -> test.cgi の順で
リクエストが行われる。
今回はGETを用いているがパラメータが多くなることを予想してPOSTにするつもり。
 
以下メモ
FlashDevelopの使い方 (0)まとめ - 独学ActionScript
http://d.hatena.ne.jp/ActionScript/20090505/flash_develop_matome
FlashDevelopの使い方 (5)Flex 4 SDKでtraceを表示する [改訂版] - 独学ActionScript
http://d.hatena.ne.jp/ActionScript/20090320/fd_flex4_sdk_trace
Adobe ActionScript 3.0 * ActionScript 3.0 の概要
http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-8000.html
すべてのパッケージ - ActionScript 3.0 コンポーネントリファレンスガイド
http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/package-summary.html
ステートメント、キーワード、ディレクティブ - ActionScript 3.0 コンポーネントリファレンスガイド
http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/statements.html#try..catch..finally
pragma no-cache - Google 検索
http://www.google.co.jp/search?q=pragma+no-cache&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a