« 2007年09月 | メイン | 2007年11月 »

2007年10月31日

●[SWX] XMLを読み込んでFlash変数に変換した感想

ソースについてはエントリー分けました。

[SWX] XMLを読み込んでFlash変数に変換するソース
http://www.1ft-seabass.jp/blog/2007/11/swx_xmlflash_1.html

ほとんどPEARのライブラリに頼ったものですがXMLを読み込んでFlash変数に変換するやつができました。

正直、早いし便利です。

なによりもクライアント側が解析しないからフレーム止まらないし、こころなしか再生も安定。


250アイテムくらいの読み込みはPHPの解析速度も速くてほぼ1~2秒で帰ってきます。
ただ2500アイテムくらいになるとさすがにPHPとサーバーがヘタるらしく、レスポンスが遅い。5~10秒。
Flashが直で叩いて待つんだとサーバーの処理速度依存になるのが少しイタイなぁ。

ちなみに、こんなXMLです。

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <item>
    <A>AAAAAAAAAAAAAAAA</A>
    <B>BBBBBBBBBBBBBBBB</B>
    <C>CCCCCCCCCCCCCCCC</C>
    <D>DDDDDDDDDDDDDDDD</D>
    <E>EEEEEEEEEEEEEEEE</E>
    <F>FFFFFFFFFFFFFFFF</F>
    <G>GGGGGGGGGGGGGGGG</G>
    <H>HHHHHHHHHHHHHHHH</H>
    <I>IIIIIIIIIIIIIIII</I>
  </item>
  <!-- これが250とか2500連なるってこと -->
</root>

回避策としては、swx.phpが吐いたdata.swfをどこかにコピーして、それを読めば純粋にコピーしたswfの容量を読むだけになって素敵ですね。もしも2500アイテムが静的に置ける限定だけど。

ちなみに、250アイテムで6KBくらい、2500アイテムで25KBくらいになります。
swfはアスキーなXMLよりバイナリだから圧縮されるんだよね。

2500アイテムで25KBっていうのは、XMLファイルだと500KBくらいだったんで、数値上で95%減ることになる!
とはいえ、まあXMLの構成によって増減はあれど80%減くらいは堅いんじゃないだろうか。

すげー。

使いどころは注意すべきだけど、すげー。

ソースについてはエントリー分けました。

[SWX] XMLを読み込んでFlash変数に変換するソース
http://www.1ft-seabass.jp/blog/2007/11/swx_xmlflash_1.html

2007年10月28日

●[SWX] PHP内の変数の型を引き継いでくれます。

TestDataTypesいじって気づいたのですが、SWX PHPでは、PHP内の変数の型を引き継いでくれます。

Number・String・Floatあたりは当たり前。

なんとArrayも対応。連想配列なArrayはObjectに変換される優れもの。

TestDataTypesのtest~をもろもろを扱ってみるとそのすごさが分かります。

僕が感動したのが連想配列を変えるtestAssociativeArrayでした。

これでXMLをPHPで変換できたら即Flash内で使えるんですね。


●lolipop ロリポップ でUnserializer.phpが素直に使えない。

lolipop ロリポップ でUnserializer.phpが素直に使えない。

SWXでPHP上でXMLを多元配列として読み込む(アンシリアライズ)Unserializer.phpを使おうとしたら見事にエラー。

こんなんでましたorz

Fatal error: Call to undefined method: xml_parser->sethandlerobj() in /home/sites/lolipop.jp/users/lolipop.jp-**********/web/***/***/Unserializer.php on line 852

どうやら、ネットの情報を色々調べると、ロリポップではPEARパッケージが全部はインストールされてないみたい。

で、今回のUnserializerを使うには、XML_Parserのsethandlerobjがうまく動いてないと。もしかしたらParserはあるんだけど古くてUnserializerのバージョンとあわないのかもしれない。

で、回避方法としてはiniを書き換えて?追加インストールするようです。

まず、ダウンロードしてきます。

XML_Parserをダウンロード
http://pear.php.net/package/XML_Parser

XML_UnSerializerをダウンロード(Serializerとペアです。)
http://pear.php.net/package/XML_Serializer

僕はルートのlibフォルダを作ってライブラリを入れました。さらに、XML_ParserはPEARライブラリではXML::XML_Parserなので、lib/XML以下に入れました。

こんな構造です。

/lib
 /XML
  Parser.php
  Serializer.php
  Unserializer.php
  /Parser
   Simple.php

ざっくりPHPソースは以下の通り。


// 追加インストール記述
// FTP(FFFTP)上では「/」でlibフォルダを新規作成した場所。
ini_set("include_path","/home/sites/lolipop.jp/users/lolipop.jp-**********/web/lib/" . ini_get("include_path"));

// クラスを読み込む
// /home/sites/lolipop.jp/users/lolipop.jp-**********/web/lib/XML/Unserializer.phpってこと
require_once('XML/Unserializer.php');

// 変換設定→オブジェクトに変換する
$param = array( 'complexType' => 'object' );

// XMLを読み込む
$xml = new XML_Unserializer( $param );

// data.xmlを読み込む
$xml->unserialize( 'data.xml' , TRUE );

// $datasに読み込まれたXML変数群を入れる。
$datas = $xml->getUnserializedData()

これでうまく行きました。

ようやくSWXでのXML吐き出しに挑戦できる!!

わーい。

[参考資料]

lolipop(ロリポップ)でPEARパッケージ (こまちドーナツ)
http://koz.lolipop.jp/2006/09/lolipoppear.html

ini_setについて
http://php.benscom.com/manual/ja/function.ini-set.php

XML_Parserをダウンロード
http://pear.php.net/package/XML_Parser

XML_UnSerializerをダウンロード(Serializerとペアです。)
http://pear.php.net/package/XML_Serializer

●[SWX]自分のところでインストール(ロリポップ)

とりあえず、ロリポップ使ってるんで、インストールしてみました。

まず、http://www.myserver.jp/swxにインストールすると仮定しましょう。

http://swxformat.org/download

の「SWX PHP」のタイトルの「Download SWX PHP 1.01 (7.16MB)」からダウンロードします。

とりあえず、展開すると色々出てくるけど全部アップしなくていいみたい。

「php」フォルダごとをhttp://www.myserver.jp/swxにFTPソフトでアップします。

これですべてアップロードされれば、SWF PHP自体は機能します。

自分のロリポップサーバーではこれでhttp://www.myserver.jp/swx/php/swx.phpで機能しました。

※swx/php/swxってなんだか気持ち悪いのであれば、swfフォルダに「php」フォルダごと入れずに、「php」フォルダの中身を入れればいいです。

あと便利なのは、http://www.myserver.jp/swx/php/explorerの中。

これは前述の「SWX Service Explorer」なのでなにかと便利です。てゆーかこれがないと細かいでバックが出来ない!

で、とりあえずこれでロリポップで使えるようになりました。

公式サイトでは

http://swxformat.org/documentation/swx-php/#79

にあるようにXAMMPが使えればいいみたいです。

僕はXAMMPが何を意味しているか分からなかったので、一瞬引きましたが、調べてみたらXAMPPで引っかかりました。

http://ja.wikipedia.org/wiki/XAMPP

のとおりで、要はPHPが使える環境であれば大丈夫だよってとこみたいです。

まあ僕は特攻してみたらうまくいっただけなんでスイマセン。

●[SWX]とりあえず試してみる

とりあえず、試してみました。

まず既にインストールされた公式のゲートウェイがあります。

http://swxformat.org/php/swx.php/

好き勝手使っていいけど、Dos攻撃見たいのは作者涙目になってしまうようです。注意して使いましょう。

とはいっても、どうやっていいんだか分かりませんよね。

SWX Service Explorer
http://swxformat.org/php/explorer/

を見ながら指定のサービス(CGI)を叩いてみましょう。

今回は左欄の「ServiceClasses」から右欄プルダウンの「testArrays」をやってみてます。

SWF PHP は引数も与えることが出来ますが、今回はただArrayが帰ってくるだけなので気にしません。

とりあえず、Flashのサンプル作ってみました。

使い方はLoadSWXボタンをクリックするとtraceで内容が表示されます。
ソースについては1フレーム目に書いてあります。

swx_publicgw_test.zip

公式サンプルではLoadMovieが多いですがMovieClipLoaderでやっています。

ソースは以下のような感じです。普通のSWF読み込みですね。

続きを読む "[SWX]とりあえず試してみる"

●[SWX]具体的に制作に役立ちそうなシチュエーション

具体的に制作に役立ちそうなシチュエーションとしては、自分の場合XMLの再帰で回す感じで独自Parseするときかな。

100くらいなら余裕なのですが、もう2000くらいのアイテムがあると、読み込み直後にParseすると目も当てられないくらい重い・・・。

当たり前なんですが、これってParseをクライアント側で激しく再帰ループ処理をしているからなんですよね。

で、こんなシチュエーションに効くのがSWX。

これを使えば、サーバー側でXMLを解析してSWFの変数として突っ込めば多次元配列になった変数として読み込める。

クライアントではParseの必要なし!!!!(正確にはサーバー上で事前にパースされている)

●[SWX]SWX( SWF Data Format )に出会いました。

久々の更新です。1.5ヶ月も経過したのかー。

さて、最近SWXというフォーマットにはまっています。

http://swxformat.org/

正式名はSWFDataFormatといって、サーバー上で値を突っ込んだSWFを作ってリクエストを返してやり取りしてしまえという話。しかも、PHPで作れるから素敵!

詳しいお話はこちら・・・英語ですが。

http://swxformat.org/documentation/#73

僕の英語読解力が乏しく、正直うまくつかめませんでした。なのでうまく説明が出来ない。

ここは技術者は技術者らしくフィーリングで特攻しようと思います。

とりあえず、突っ込んで言えば、まず親SWF(例:main.swf)から子SWF(例:data.swf)をLoadMovieやMovieClipLoader.loadClipで読み込む状況を想像してください。

子SWFに変数で突っ込んでると親SWFから自在に引き出せるじゃないですか。(AllowDomainが通ってれば)

要は SWF DataFormat っていうのは、この変数入り子SWF(例:data.swf)をサーバーから返してやって、しかもFlash内ですぐに使えるようにする概念って感じです。

僕の制作の場合、あるシチュエーションでとても役に立ちそうなので早速追ってみようと思います。