2011年8月29日月曜日

RtmpClientをつかったJmeterのRtmpSamplerつくってます。

Rtmpをつかったサーバーをつくってる・・・特に規模が大きくなってくると欲しくなるのが接続プロファイルツール。

WowzaMediaSystemsでは、プロファイル用のツールを提供してるといった記述がありますが、それ以外に適当なのがないので、Jmeterの勉強がてらプラグインをつくっています。
こんな感じ。

動作は10スレッド5回ループ、接続先サーバーはsakuraのVPSサーバーにおいてあるRed5サーバー。クライアントはRtmpClientを利用して実装。
コネクトの動作はこんな感じ
おもしろかったのは、invoke処理(サーバーサイドの関数呼び出し処理)
同じ命令を2度実行するようにしたのですが、1度目より2度目の方が明らかにスコアがあがっている。
1度目のデータ

 2度目のデータ
なんなんだろう、これは・・・
サーバー起因かクライアント起因か・・・
うーん気になる。

追記 publisher.html(サーブレット応答)を呼び出してみた。
内部処理を実行しないから比べるのはかわいそうだけど
こんな感じに。
2回目の関数呼び出しと同じくらいの動作速度になりました。
いかにRtmpのコネクション動作が重いかわかりますね。

Junitテストが面倒なので、補助プログラム書いてみた。その3

では、Junitの動作ができましたので、今度はテストを書いてみようと思います。
junitTestはこちら

まず基本的なテスト。このコードにテストを追加してみたいとおもいます。
Junitのアノーテーションをつけて、テストするメソッドに指定します。
次にTestのアノーテーションをつけて、テスト用のパラメーターを指定します。
全体ではこんな感じ、アノーテーションが着いただけです。
では、実行その1で作成したクラスを実行します。
setRtmpUrlのメソッドをテストしました。
問題なくpassしました。

メソッドを動作させるときのクラスはデフォルトコンストラクタを呼び出します(引数のないコンストラクタ)。あらかじめテストのときには、特定のデータで初期化するようにしたいときがあるとおもいます。
そういうときにはInitアノーテーションを利用します。
まず、ほかから利用されるとこまるので今回はprivateアクセスでコンストラクタをつくってみました。引数はクラスメンバー変数。
ここにInitアノーテーションをつけておきます。
クラスにデータが付いていないとエラーになるgetterのメソッドにテストをつけてみます。
そして実行結果はこちら。
rtmpUrlに設定したrtmp://localhost/liveのliveの部分が抽出されて応答されました。

Junitテストが面倒なので、補助プログラム書いてみた。その2

せっかくプログラムをつくったので、解説の記事をかいてみようと思う。
junitTestはこちら

とりあえずこのライブラリをつかって、EclipseでJunitを動作させるまで。

まずプロジェクトのプロパティーを開く
Java Build Pathからライブラリを追加する。junitTest.jarと
Junitを追加する。
アノーテーションを使うので選択はJunit4で・・・


2つのライブラリが追加されました。

では続いてプログラムにテスト用のエントリークラスをつくる。
Junitとして動作開始。
EclipseのJunitランチャーを選択
無事に起動して、コンソール出力とJunitの緑のバーが表示されました。

次の記事で実際にJunitの動作を仕込んでみようと思います。

2011年8月26日金曜日

Junitテストが面倒なので、補助プログラム書いてみた。

Junitは便利なんですが、プログラムの記述が非常にめんどくさい。

そのプログラムを書くだけでプロジェクトを1つつくるくらい書き込みをしないといけなくてめんどくさいなぁとおもっていたので、補助プログラム書いてみた。

とりあえずソース。
https://github.com/taktod/junitTest

eclipseのjunitサポートで実行するとする場合。
junitTestのリポジトリを取得して、利用したいプロジェクトと関係づける。

EntryTestのテスト動作実体のpackagePath変数をテストしたいパッケージの名前に変更する。

テストしたいMethodの頭にJunitアノーテーションをつけておく。
@Junit({
    @Test(params={"test", "15"}, assume="test15"),
    @Test(params={"135", "135"}, assume="270")
})
public String testTarget(String a, int b) {
    return a + b;
}

EntryTestを実行すると標準出力にテスト結果がでてくる。

check for class:com.ttProject.junit.TestTarget method:testTarget
param : test 15 
assume : test15 result : test15
...passed...
param : 135 135 
assume : 270 result : 135135
value is corrupted...

まだまだ適当なところが多いので、動作向上させていきたいところ・・・
こうあってほしいというところがあれば、知らせてもらえればうれしいです。

2011年8月20日土曜日

UDPホールパンチング、その3、システムを作成中

Red5のGUI化はある程度めどがついた。Appletにサーバー動作させるのもできた。

そろそろUDPホールパンチングのライブラリを作成しようと思っています。
というか思っていて、ずっとプログラムを書いているのですが、なかなか難しい。

開発につかっているiMacでがんばっているとしんどいので、プロジェクトをPC間で共有してネットブックでねっころがりながら気が向いたときにすこしずつコードを書きたいとおもったので、完成してないけどGithubにあげてみた。

https://github.com/taktod/UDPP2p

つなぐだけならすぐできるけど、システム化となるとまた別のむずかしさがあるね

2011年8月3日水曜日

red5をapplet化してみる。その6、Application化

Red5をappletで動作させ、他のユーザーとの通信はP2Pで済ませる。
こんなことを夢見てます。できたら中央サーバーなしでライブチャットつくれるかも。

とりあえずApplication → Applet → P2Pロジック導入
といった3ステップを想像していましたが、今回Applicationの仮バージョンがそこそこ動作するようになったのでgithubにリポジトリいれておきました。
https://github.com/taktod/red5Application
ドキュメントとかはまだ準備していませんが、概要は次のとおり。

試し方
・Javaが使える環境を準備しておく。
・red5を取得して解凍しておく。
・gitリポジトリのデータをcloneする。
・red5Application.jarをダブルクリック
もしくは以下のコマンドで起動
$ java -jar red5Application.jar
・Red5の解凍ディレクトリを選択して準備をする。
・「起動する」ボタンをクリックして、Red5サーバー起動。

いらなくなったときの削除方法
・リポジトリを削除。
・jarを起動したところに.rtmpApplication.propertiesがあるので消す(設定タブで状態を保存した場合)
・ユーザーのルートディレクトリに.java-skin.propertiesがあるので消す
これで完全に削除できます。

開発途上のテストイベント発行用ボタン(テストGo)というのがあり、いまのところこのボタンをクリックすると、動作中のRed5のRtmp監視ポートを1935から11935に変更するということをするようにしてあります。
どうやら基本的な設定は結構いじれるようなので、動作中の設定変更から可能ならApplicationAdapterのリロード等いろんな機能盛り込みたいと思います。

2011年8月1日月曜日

Propertiesファイルについて

Red5のアプリケーション、何度もデバッグしてるわけですが、毎回ディレクトリを設定するのがメンドクサイ・・・
設定ファイルを保存しておけるようにしようかなとおもい、いい方法がないかなと探していました。

そこで見つけたのがProperties。
これ便利ですね。
key=valueの形式でファイルを書いておけばそれをMapの形で読み込み書き出しできます。

やり方はこんな感じ
// 読み込み
Properties prop = new Properties();
prop.load(new FileInputStream("ファイル名"));

// 書き込み
OutputStream stream = new FileOutputStream("ファイル名");
prop.store(stream, "tekitou");

これだけ。非常に簡単ですね。

なお、Systemプロパティーなんで
System.getProperties().store(stream, "system");

とすれば


#system
#Mon Aug 01 19:31:48 JST 2011
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Libraries
java.vm.version=20.1-b02-384
awt.nativeDoubleBuffering=true
gopherProxySet=false
mrj.build=10M3425
java.vm.vendor=Apple Inc.
・・・


となります。
いままで自力で読み書きするクラス書いていたのですが、こんな簡単にできるんですね・・・しらなかったよ。