2008年02月

2008年02月27日

FMS(FCS)とサーバー通信について

 FMSから別サーバーのPHPなりを叩いて、
 データを取得する方法は2種類ある。

 簡単なのは、
 FMS2以降で使える「LoadVarsクラス」。
 書き方もAS2ライクで、以下のようになる。

var myLoadVars = new LoadVars();
myLoadVars.onData = function(src) {
  trace(src);
}
myLoadVars.onLoad = function(result){
  trace("myLoadVars load success is " + result);
}
myLoadVars.load("http://coelacanth.heteml.jp/test.php");


 ただし、FMS2以降で使える関数なので、
 FCSではこの方法は使えない。

 FCSで使えるのが、
 FlashServerではお馴染み「Netconnectionクラス」を用いる方法。
 リファレンスを参考に以下のようなコードを書いてみる。

var resObject = new Object();
resObject.onResult = function(res) {
  trace(res);
}

var nc = new NetConnection();
nc.connect("http://coelacanth.heteml.jp/test2.php");
nc.onStatus = function(infoObj) {
  trace(infoObj.code);
}

nc.call("no_function", resObject);


 こちらも、コード自体は、
 よくあるNetConnectionのサンプルコード然としているのだけど、
 実行してみると、

 Client.Header.BadVersion

 というinfoObj.codeがtraceされる。
 codeで検索してみるが、英語のサイトがわずかヒットするのみで、
 そこにもなかなか情報が無い。

 Headerがよろしく無いような文面としばらく格闘していて、
 FMSがRTMPという独自プロトコルを用いて、
 AS3以前のサーバーに接続するさいに、

 nc.objectEncoding = ObjectEncoding.AMF0;

 なんて、指定を入れる必要があったのを思い出す。

 調べてみると、
 PHP側でもAMFでエンコードした文字を出力する必要があるようで、

 http://www.fontimages.org.uk/flash/amfdata_php.html

 にライブラリのコードがありました。
 これを使えば、いけそう。

 上記サイトのコードを、
 amfdata.phpというファイルに保存し、
 PHP側では、

<?php
require_once 'amfdata.php';
$amfdata = new amfdata();
$amfdata->sendResult("hogehoge");
?>


 と記述すると、
 うまくhogehogeを取得することができました。

 FMS2以降で統一できている環境なら、
 LoadVardを使うのが素直だと思いますが、
 二つの関数の性能比較などもやってみたいと思います。

2008年02月26日

FMS接続周りでリファレンスだとわかりづらいTipsその2

 ActionScript版SharedObjectの使い方。
 FMS2とSWFで情報を共有する場合。


public function initSO():void {
  this._so = SharedObject.getRemote("test", this._nc.uri);
  this._so.addEventListener(SyncEvent.SYNC, syncEventHandler);
  this._so.connect(this._nc);
}

public function syncEventHandler(event:SyncEvent):void {
  trace("so_changed");
  for (var i:int = 0; i < event.changeList.length; i++) {
    for (var key:String in event.changeList[i]) {
      trace(event.changeList[i][key]);
    }
  }
  trace(event.target.data.count);
}


 initSO内がSharedObjectクラスを生成しています。
 最後のthis._so.connect(this._nc)のコードが抜けていてしばらく悩みました。

 syncEventHandlerがSharedObjectの内容が変更されたときに呼び出されるコールバック関数で、
 event.targetでSharedObjectの参照を、
 event.changeListには配列で、変更されたデータ情報が入っています。


event.changeList[0]["name"] // 変更された変数
event.changeList[0]["code"] // 変更か、削除か等の情報
event.changeList[0]["oldValue"] // 変更前のデータ


 こんな感じで変更情報にアクセスすることができます。

FMS接続周りでリファレンスだとわかりづらいTips

 ActionScript3だと、
 NetConnectionオブジェクトが拡張できない(ダイナミックでない)ため、
 旧来のような、


nc.hogeFunc = function() {
  // hogeFuncの処理
}


 というようなコードは書けません。
 その対応策として、最初はNetConnectionクラスを継承したクラスに関数を追加していましたが、
 NetConnection.clientにオブジェクトを代入することで、
 そのオブジェクトの関数がコールバックとして使えました。
 コードは以下のような感じ、


 public function Test() {
  this._rtmp = "rtmp:/test";

  this._nc = new NetConnection();
  this._nc.objectEncoding = ObjectEncoding.AMF0;
  this._nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
  this._nc.client = new TestCustomClass();
  this._nc.connect(this._rtmp);
 }


 上記TestCustomClasssは簡単に、


package
{
 public class TestCustomClass
 {
  public function test():void {
   trace("呼び出し");
  }
 }
}


 でOK。

 FMS側のコードで、


var timerID;

application.onAppStart = function()
{
 trace("start");
 timerID = setInterval(test, 15 * 1000);
}

application.onConnect = function(client)
{
 trace("connect");
 return true;
}

function test() {
 trace("call");
 var count = application.clients.length;
 for (var i = 0; i < count; i++) {
  application.clients[i].call("test");
 }
}


 とcall("test");
 してあげると、見事呼び出し成功。
 常識なのかな? とも思いましたが、FMSとの接続コードがあまりリファレンスに載っていないので、紹介してみました。

2008年02月25日

どうやればコードを共有できるだろうか?

 CVS管理してコードを共有するとか、
 週次のミーティングでコードレビューするというのは基本として、

 もうちょっと恒常的に、
 他人のコードを読む機会を増やせないかと思う。

 ミーティングや勉強会を増やして、
 コードレビューの回数を増やすというのも良いが、
 こういう場では、レビューやレビューされることがより必要な新人さんは積極的に参加しずらい気がする。

 プリントアウトしたコードに添削しあうという試行も、
 あまり好評ではなかったし、なかなか難しいものだ。

 次はペアプログラミングの効果を測定してみようと思うが、
 さて、どうなるだろう。

2008年02月24日

カンブリア紀の魅力?

 カンブリア紀という、恐竜時代(白亜紀とか)よりもっと昔の時代についてのお話。

 グールドの「ワンダフル・ライフ」のおかげで、カンブリア紀の奇妙な生き物達は、そこそこの知名度を獲得した。

 中井 拓志の第4回日本ホラー小説大賞長編賞受賞作「レフトハンド 」という怪作でも、科学的な説明(胡散臭い響きだ)を与えるのに役立っている。

 あくまで科学的なので、
 そのジャンルに造詣の深い人にとっては、
 信憑性を落とすことになってしまう可能性もある諸刃の剣。

 小説としてのレフトハンドは、
 荒削りだけど、非常に面白い作品なので、
 興味のある方は、ワンダフルライフも読まず、
 カンブリア紀についても良く知らない状態で読むことをお奨め。

 小説とオカルト(UFOとか心霊とか)は、
 科学的な権威付け部分に揚げ足とってツッコミを入れるか、
 さらっと流して雰囲気を楽しむのが、作法だと思うが、

 この前テレビで見たホラー映画の「ザ・グリード」は、
 ツッコミを入れる気にもならない適当さで「カンブリア」を使っていたので、呆れを通り越した今、思い出したようにツッコミ。

 いわゆる怪物映画なのだが、
 この手の映画に欠かせない「博士」的なアクターがおらず、
 生物学の造詣の無いはずの(いや、あるのかもしれないが)キャラクター達が、普通に、

 「深海からやってきたカンブリア紀の生き残りに違いない」

 なんて高説をのたまい、
 誰も疑問を挟むことなく、
 とても似つかない怪物が、カンブリア認定を受けてしまう。

 実は軍の実験だったり、狂気の科学者だったりという驚きの真相(もう慣れて驚かないんだけど)発表のくだりは、簡略した一言「カンブリアだ」で終了。

 B級映画ってのは、
 お約束があって、
 「おっ、博士が語る、無駄に説明的な台詞!」とか、
 「あー、でました軍の秘密実験という驚きの真実!!」とか、
 「序盤でやっつけたのは子供で、その後真打登場」とか、
 「このカップル絶対ホッケーマスクにやられるなー」というのを、
 観るほうも暖かく受け入れて、お互いの信頼の元低予算ながらの楽しみを提供するものだと思っていたのに・・・。

 何がいいたいのかというと、
 カンブリア紀というのはそういうケレンミたっぷりの魅力があって、
 B級ホラーが好きで、
 ザ・グリードはお約束を破られて、ちょっぴり悲しかったということなのだきっと。
 
 ワンダフル・ライフ―バージェス頁岩と生物進化の物語 (ハヤカワ文庫NF)


2008年02月22日

MySQLのベンチマークソフトsuper-smackを試してみる

 明日、DBテストの報告をすることになっていたのを忘れていたので、
 一夜漬けでsuper-smackを試し見る。
 MySQLには標準でsql-benchなるものが付属しているらしいのですが、
 ウチのFreeBSDのMySQLにはそのようなもの(入っているらしいディレクトリ)が無かったので、super-smackを選択。

 (ちなみにXAMPPでWindowsにインストールしたMySQLにはしっかり、
 sql-benchディレクトリと、それらしいファイルがありました。)

 http://vegan.net/tony/supersmack/

 ↑より「Super Smack 1.3 source」をダウンロード、
 FreeBSDのどこか任意のディレクトリに解凍、

# ./configure --prefix=/usr/super-smack --with-mysql --with-mysql-lib=/us r/local/lib --with-mysql-include=/usr/local/include
(lib, mysql-includeの値は自分がインストールしたディレクトリ)
# make
# make install


 まずは、
 解凍したディレクトリのsmacks/にselect-key.smack等のテンプレートがあるので、眺めてみる。

client "admin"
{
user "root";
host "localhost";
db "test";
pass "";
socket "/tmp/mysql.sock"; // this only applies to MySQL and is
// ignored for PostgreSQL
}


 ここにCREATE TABLEできるようなAdmin権限の設定を記述するのかな?

 table "http_auth"
{
client "admin"; // connect with this client
// if the table is not found or does not pass the checks, create it
// with the following, dropping the old one if needed
create "create table http_auth
(username char(25) not null primary key,
pass char(25),
uid integer not null,
gid integer not null
)";
min_rows "90000"; // the table must have at least that many rows
data_file "words.dat"; // if the table is empty, load the data from
//this file
gen_data_file "gen-data -n 90000 -f %12-12s%n,%25-25s,%n,%d";
// if the file above does not exist, generate it with the above shell command
// you can replace this command with anything that prints comma-delimited
// data to stdout, just make sure you have the right number of columns
}


 作成するテーブルの形と、
 ダミーデータの生成方法が書いてあるよう(当方英語力0です)。

 query "select_by_username"
{
query "select * from http_auth where username = '$word'";
// $word will be substitute with the read from the 'word' dictionary
type "select_index";
// query stats will be grouped by type
has_result_set "y";
// the query is expected to return a result set
parsed "y";
// the query string should be first processed by super-smack to do
// dictionary substitution
}


 なんとなく実行するクエリ文だなーという気がします。

 あとはデータをぶち込んでテスト実行してみるのみですが、下記のサイトがやくに立ちました。

http://www.thinkit.co.jp/cert/article/0707/2/2/2.htm

 自分の場合、

 
file /var/smack-data/words.dat failed to stat


 なんてエラーが出たので、
 実行文を

/usr/super-smack/bin/super-smack -D /tmp/smack-data ./select-key.smack 100 100

 というように変更しダミーデータの場所を指定。
 結果は、

/usr/super-smack/bin/super-smack -D /tmp/smack-data ./select-key.smack 100 100
Query Barrel Report for client smacker1
connect: max=418ms min=13ms avg= 109ms from 100 clients
Query_type num_queries max_time min_time q_per_s
select_index 20000 71 0 2499.23


 うーん、なんとなくわかるような、わからないような・・・。
 後は実際に色々試して、自分でものさしを作っていくしかないですね。

 (参考書籍)
 WEB+DB PRESS vol.39
 現場で使えるMySQL

Eclipse用FlashMediaServerのエディタしてのだめっぷり

 例えばFlexのIDE上で、

 
application.rejectConnection();


 という文字をダブルクリックすると、

 Flexでダブルクリック


 と上画像(クリックで拡大)のとおり当然のように一文字選択してくれますが、

 これをFlashMediaServerプラグインで行うと・・・。

 FlashMediaServerIDEでダブルクリック


 
 どんな基準でその範囲を選択したんですか・・・。

IE7スタンドアローン版玉砕と、FMS3(Dev版)で不吉なコネクションエラー

 何度か言及しました、
 FlashMediaServer開発用のEclipseプラグインですが、
 IEのバージョンが6だとコンソールが使えない(魅力半減)のに、
 サイトでは、

 Windows Users: If your using IE6 upgrade to IE7 or the console will not work correctly.
 (訳自信なし:IE6からアップデートしたらIE7だと動かないかもしれないぜコンチクショー)

 と書いてあり、
 Vistaユーザー限定かよっ、Microsoftの手先かよ、
 なんて毒づきながら、会社で、

 「IE7必要なんだけど、IE6も保持したいんだよねぇ」

 なんて話していると、IE7のスタンドアロン版があると紹介される。
 よくわかる解説は下記サイトで、

 http://coliss.com/articles/browser/ie/68.html
 このページ以外でもIE7にIE6スタンドアロン版をインストールする方法なども書いてありますので、ページ下部のRelatedを見てみてください。

 アップデートしない形のIE7というわけで、
 願ったり叶ったりだったのですが、
 実際にインストールするとEclipse上ではIE6と判定されてコンソールが使えませんでした。

 次の作戦は、
 IE7をインストールはするけど、
 マイクロソフトからDLしてきたIE7をインストールする作戦。

 結果はアップデートだけど、新規インストールになるんじゃないかと期待。ただし、IE6には戻れないというリスクもあります。
 予めIE6に別れを告げておいて、
 IE7をインストール。Eclipseを立ち上げると見事コンソールが利用できるようになりました!!
 スタンドアロン版を入れたり消したりしていたので、
 マイクロソフトからDLしたインストーラーだけでこの結果が得られたのかわかりませんが、FMSのIDEを使ってみたいかはぜひ。

 コード補間とか、ダブルクリックの単語選択がダメダメですが、
 それでも徒手空拳よりはマシです。

 今日は接続したユーザーを条件によって、
 application.rejectConnectionで切断する部分を書いていたのですが、
 FMS3のDeveloper版(無償)で2回ほど、接続が無いのにMax Connectionで以降の接続が不可能になる状態が確認されました。

 Eclipseプラグインからコンソールを利用していたせいとか、
 Developer版だからとか、
 何かの思い違いということも考えられますが、
 FMS3でもこの前のような障害が残っているとするとFMS3の導入は考えものです。

 FMS2も最新の2.0.5が出ましたが、
 2.0.1で安定させておくのが利口なのかもしれませんね。

 FMS3の帯域、制限数無制限とか、
 クラスタリングが容易で安価なところとかは非常に魅力ですが・・・。
 いい機会なんで、Developer版を使い倒して確認しようと思います。
 


2008年02月21日

FMSのコードもActionScriptでした

 AdobeからFlashMediaServer2のリファレンスを落としてきて眺めていたら、
 サーバーサイドスクリプトを、サーバーサイドASと表記していることを発見。

 FlashMediaServer2のコードもActionScriptなんですね。
 どちらかというとJavaScriptなんですが・・・。

 それはさておき、
 FlashMediaServer2のコーディングにはβ版ながら、
 Eclipseプラグインが非常に便利です。

 色々制約があって、
 Flex2にはインストールできないので、Eclipse+Flexといういびつな起動を余儀なくされたり、コンソールが使えるのが家のPC環境だけだったりと問題もありますが、
 ローカルのFMS3のアプリケーション名とあわせて指定してあげれば、
 直接そのコードを編集できること、
 仮想FMSだと思っていたコンソールが、ローカルの(指定によってはサーバーも)FMSのAdminコンソールとリンクしていて、実際のswfによる接続のログやアプリケーションのリロードがEclipse上で操作できることがわかり、開発が非常に楽になりました。

 Eclipse版のFlex+FMSプラグインを使うか、
 Flex3にFMSプラグインをインストールすればEclipseとFlexを同時に立ち上げるような苦労をする必要はなさそうですが、Flexって1つのPCに1ライセンスでEclipseプラグイン版とスタンドアロン版はインストールできるのだろうか・・・。

 追伸:Flex2のパブリッシュはF11でFlashCS3のパブリッシュはF12なのは何かの嫌がらせでしょうかAdobeさん。

 

2008年02月20日

セキュリティサンドボックス終幕


org\papervision3d\materials\VideoStreamMaterial.asの一部抜粋

  public override function updateBitmap ():void
{
// copies the scale properties of the video
var myMatrix:Matrix = new Matrix();
myMatrix.scale( this.video.scaleX, this.video.scaleY );

// Fills the rectangle with a background color
this.bitmap.fillRect ( this.bitmap.rect, this.fillColor );

// Due to security reasons the BitmapData cannot access RTMP content like a NetStream using a FMS server.
// The next three lines are a simple but effective workaround to get pass Flash its security sandbox.
this.video.attachNetStream ( null );
this.bitmap.draw( this.video, myMatrix, this.video.transform.colorTransform );
this.video.attachNetStream ( this.stream );
}


 どうやらこの箇所の、最後のあたりが問題だということが判明。
 この日本語記事や、
 この記事の情報からして、

 FlashPlayerのVersion9のある段階から、
 セキュリティの関係でNetStreamからの映像をBitmapに変換することができないようになったらしい。

 AdobeのサイトでFlashPlayerのバージョンを確認すると、
 家のPCは9,0,28,0、debugPlayerなのが幸いして、バージョンが低いらしい。会社のもdebugPlayerだけど一度新規に入れなおしたので、バージョンが上がっているのかもしれない。

 以前に掲載した、flv付き3DFlashは古いバージョンのFlashPlayerでないと再生できないという結論のようです。

Profile

シーラカンス

Recent Comments
QRコード
QRコード
livedoor Readerに登録
RSS
livedoor Blog(ブログ)