tech.kayac.com

tag: tutorial

外で着るには恥ずかしいTシャツが溜まってきました。こんにちは、kondoです。

PICTのお話後編は、実際のサイトをモデルにテストの組み合わせを出す演習をしてみましょう。

「PICTって何?」という方は、前編をご覧ください。

モデルサイトはこちら、art-meterです。

絵をサイトから注文できるのですが、日本国内ですと地域によって送料が変わります。

今回は、国内配送の場合に、都道府県によってちゃんと正常な送料が出せているかを確認してみましょう。

その前に

送料についてはこちらをご覧ください。

http://www.art-meter.com/guide/customer/#sg5

さぁ、やってみよう

まずは、項目と値を考えて見ます。

1.第一の条件として「総面積が1200cm2未満」「総面積が1200cm2以上」というのがあります。

境界値は1200cm2なので、総面積は「1200cm2より小さい」「1200cm2」「1200cm2より大きい」としましょう。

2.続いて、都道府県ですね。国内配送の場合は47都道府県から選べますので、項目はそのまま都道府県でいいでしょう。

ただし、送料は地域ごとに決められています。都道府県と地域をマッピングして、送料は地域で出すようにすることが必要です。

これには「条件付き制約」を活用します。

注意点として、PICTではif文の入れ子はできません。if文の条件式が若干冗長になりますが、そこは我慢我慢。

3.art-meterでは、プラス300円でオプショナルメニューとしてギフトラッピングをしてくれるサービスもあります。

せっかくなので、このオプションの使用有無も項目に入れてみましょう。

4.代引き払いにも対応しています。300円の代引き手数料がかかるので、使用有無を入れておきましょう。

これらの条件をまとめたのがこちらの内容になります。でもこれ、実はおかしくなります。

# 1
面積: 1200cm2より小さい,1200cm2,1200cm2より大きい
# 2
都道府県: 北海道, 青森県, 岩手県, 宮城県, 秋田県, 山形県, 福島県, 茨城県, 栃木県, 群馬県, 埼玉県, 千葉県, 東京都, 神奈川県, 新潟県, 富山県, 石川県, 福井県, 山梨県, 長野県, 岐阜県, 静岡県, 愛知県, 三重県, 滋賀県, 京都府, 大阪府, 兵庫県, 奈良県, 和歌山県, 鳥取県, 島根県, 岡山県, 広島県, 山口県, 徳島県, 香川県, 愛媛県, 高知県, 福岡県, 佐賀県, 長崎県, 熊本県, 大分県, 宮崎県, 鹿児島県, 沖縄県
地域: 北海道, 東北, 関東, 北陸, 信越中部, 近畿, 中国, 四国, 九州, 沖縄
送料: 700, 1500, 1600, 1700, 1800, 2000
# 3
ギフトラッピング: 有, 無
# 4
代引き: 有, 無

####################
# 条件付き制約
# 
# 都道府県と地域のマッピング
if [都道府県] IN {"北海道"}
    then [地域] = "北海道";
if [都道府県] IN {"青森県","岩手県","宮城県","秋田県","山形県","福島県"}
    then [地域] = "東北";
if [都道府県] IN {"茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県"}
    then [地域] = "関東";
if [都道府県] IN {"新潟県","富山県","石川県","福井県"}
    then [地域] = "北陸";
if [都道府県] IN {"山梨県","長野県","岐阜県","静岡県","愛知県","三重県"}
    then [地域] = "信越中部";
if [都道府県] IN {"滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県"}
    then [地域] = "近畿";
if [都道府県] IN {"鳥取県","島根県","岡山県","広島県","山口県"}
    then [地域] = "中国";
if [都道府県] IN {"徳島県","香川県","愛媛県","高知県"}
    then [地域] = "四国";
if [都道府県] IN {"福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県"}
    then [地域] = "九州";
if [都道府県] IN {"沖縄県"}
    then [地域] = "沖縄";

# 総面積と送料のマッピング
# 総面積が1200cm2より小さいの場合は一律700円
if [面積] = "1200cm2より小さい"
    then [送料] = 700;
# 総面積が1200cm2より大きいの場合は地域によって送料が変わる
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [地域] IN {"北海道","九州"}
    then [送料] = 1800;
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [地域] IN {"東北","近畿"}
    then [送料] = 1600;
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [地域] IN {"関東","信越中部","北陸"}
    then [送料] = 1500;
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [地域] IN {"中国","四国"}
    then [送料] = 1700;
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [地域] IN {"沖縄"}
    then [送料] = 2000;

そうは問屋が卸さない

搭載メモリ1GBの私のマシンで上記を通すと、フイーンと呻りだして、一向に結果を出してくれませんでした。恐らく、記述内容が悪くて無限ループのような状態になったのでしょう。

ここは都道府県、地域と送料のマッピング方法を変えることで対処していきます。柔軟に臨機応変、七変化が勝ち。

よくよく考えると、ユーザーが設定するのは「地域」ではなく「都道府県」です。別にいちいち「地域」に変換しなくてもよいですね。

都道府県から直接送料を出すようにしてしまいましょう。若干泥臭く見えますが、処理的にはシンプルになるはず。

ついでに、「決済手数料(300円)」を結果に含んでおきましょう。

そして、「ギフトラッピング」「代引き」の項目も「有,無」ではなく「300,0」と、金額で表記しておきます。

こうすることで、結果をエクセルに貼り付けた後に合計金額がセル同士の計算で簡単に出せるようになります。

さて、改良版がこちら。

# 1
面積: 1200cm2より小さい,1200cm2,1200cm2より大きい
# 2
都道府県: 北海道, 青森県, 岩手県, 宮城県, 秋田県, 山形県, 福島県, 茨城県, 栃木県, 群馬県, 埼玉県, 千葉県, 東京都, 神奈川県, 新潟県, 富山県, 石川県, 福井県, 山梨県, 長野県, 岐阜県, 静岡県, 愛知県, 三重県, 滋賀県, 京都府, 大阪府, 兵庫県, 奈良県, 和歌山県, 鳥取県, 島根県, 岡山県, 広島県, 山口県, 徳島県, 香川県, 愛媛県, 高知県, 福岡県, 佐賀県, 長崎県, 熊本県, 大分県, 宮崎県, 鹿児島県, 沖縄県
送料: 700, 1500, 1600, 1700, 1800, 2000
# 3
ギフトラッピング: 300,0
# 4
代引き: 300,0
# 必須の項目は値を一つだけにする
決済手数料: 300

####################
# 条件付き制約
# 
# 総面積、都道府県と送料のマッピング
# 総面積が1200cm2より小さいの場合は一律700円
if [面積] = "1200cm2より小さい"
    then [送料] = 700;
# 総面積が1200cm2より大きいの場合は地域によって送料が変わる
# 北海道地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"北海道"}
    then [送料] = 1800;
# 東北地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"青森県","岩手県","宮城県","秋田県","山形県","福島県"}
    then [送料] = 1600;
# 関東地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県"}
    then [送料] = 1500;
# 北陸地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"新潟県","富山県","石川県","福井県"}
    then [送料] = 1500;
# 信越中部地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"山梨県","長野県","岐阜県","静岡県","愛知県","三重県"}
    then [送料] = 1500;
# 近畿地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県"}
    then [送料] = 1600;
# 中国地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"鳥取県","島根県","岡山県","広島県","山口県"}
    then [送料] = 1700;
# 四国地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"徳島県","香川県","愛媛県","高知県"}
    then [送料] = 1700;
# 九州地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県"}
    then [送料] = 1800;
# 沖縄地域
if [面積] IN {"1200cm2","1200cm2より大きい"} AND [都道府県] IN {"沖縄県"}
    then [送料] = 2000;

直りました

結果は141行にもなったので全ては載せられませんが、こんな感じになりました。

面積  都道府県    送料  ギフトラッピング    代引き   決済手数料
1200cm2 神奈川県    1500    300 300 300
1200cm2より小さい  島根県   700 0   0   300
1200cm2より大きい  岩手県   1600    300 0   300

送料、ギフトラッピング、代引き、決済手数料を足し合わせれば、合計の送料が出ます。そこはエクセルにやってもらえば簡単。

そして伝説へ

結果がこのように定型のテキストになっていれば、Seleniumのテストケースを書いたりするときにちょっと楽になりますよ。

総面積が指定の通りになるように作品を選び、指定の都道府県、ギフトラッピング、代引きを選ぶと送料合計になるかどうか、というテスト。

実際に結果テキスト→Seleniumのテストケースに変換しようとすると、正規表現等の知識も必要になってきますが、今回は割愛します。

さぁみんなも、レッツエンジョイど根性テストライフ!

カヤックでは、いろんなツールを使いこなすことに快感を覚えるエンジニアを募集しています!

こんにちは、kondoです。カラオケ、漫画喫茶、バッティングセンターと、一人遊びが充実してきました。

テストエンジニアらしくテストの話も書けよとプレッシャーをかけられたので、今回はテストする値の組み合わせを算出するのに便利なツールをご紹介します。

PICTとは

PICT(Pairwise Independent Combinatorial Testing tool)とは、とっても単純に言うと組み合わせを自動で生成してくれるツールです。

Microsoft社が開発し、実際にMicrosoft社でもテストに使われているそうです。

こちらのサイトからダウンロードできますので、まずはインストールしてみましょう。

Pairwise Testing(Available Toolsからダウンロードできます)

ダウンロードしたらダブルクリックで簡単に展開されます。PATHを通しておくと後で楽ちんですよ(筆者の場合はC:\Program Files\PICT\)

また、gihyo.jp様で組み合わせテストやPICTについて詳しく解説された記事が掲載されていますので、そちらもご覧になることをオススメします。

特集:組み合わせテストをオールペア法でスピーディに!|gihyo.jp … 技術評論社

動かしてみる

まずは使い方を見てみるために、簡単なところでツイスターゲームの手足と色の組み合わせを出してみましょう。

テキストファイルに「[項目名]: 値, 値, 値」という項目を書いて保存します。 日本語が含まれる際は文字コードをEUCにしないと化けるので気をつけてください。

sample_1.txt

どこを: 右手, 左手, 右足, 左足
何色に: 赤, 黄, 緑, 青

そしてコマンドプロンプトからおもむろに以下のコマンドをたたきます。

sample_1.txtが上記のファイル名

1>sample_1_result.txtは結果を保存するファイル名(省略すると成功時にそのまま垂れ流しで表示されます)

2>sample_1_error.txtはエラー時の出力を保存するファイル名です(省略するとエラー時にそのまま垂れ流しで表示されます)

pict sample_1.txt 1>sample_1_result.txt 2>sample_1_error.txt

出力されたsample_1_result.txtを開いてみると

sample_1_result.txt

どこを   何色に
右足  黄
右足  緑
右手  赤
右手  緑
左足  青
左足  黄
左手  緑
左足  赤
右手  黄
右足  赤
右手  青
左手  赤
左手  青
右足  青
左足  緑
左手  黄

おおー。見事にツイスターゲームの手足と色の組み合わせが表示されました。

結果のパターンは文字コードをShift-JISにしてからExcel等で開くと、並び替え等編集しやすいです。

ここで、次世代のツイスターゲームとして、色が6色に増えたものがあるとします。

その組み合わせを出す場合、先ほどのsample_1.txtの方を書き換えます。

sample_2.txt

どこを: 右手, 左手, 右足, 左足
何色に: 赤, 黄, 緑, 青, 紫, 茶

そして実行、出てきた結果は。。。

pict sample_2.txt 1>sample_2_result.txt 2>sample_2_error.txt

sample_2_result.txt

どこを   何色に
右足  青
左足  青
右手  緑
左手  赤
左足  紫
右足  茶
左手  紫
左足  赤
右手  黄
右手  茶
右足  赤
右手  青
右足  黄
左手  青
右足  紫
右手  赤
左足  黄
左手  黄
右手  紫
左手  緑
右足  緑
左手  茶
左足  茶
左足  緑

色を6色に増やすことができました。組み合わせは4*6で24個。バッチリです。

こうやって、値や項目を調整しつつ、組み合わせを作っていくことになります。

絞り込んでみる

ただ全パターン出すだけではなく、条件によって組み合わせを絞り込むことも出来ますが、絞込みの方法には「条件付き制約」「無条件制約」があります。

制約条件はSQLと似ており、「=, <>, <, <=, >, >=」「NOT, AND, OR」「IN」「LIKE *,?」といった比較演算が使えます。

A = B           AとBは等しい
A <> B          AとBは等しくない
A < B           AはBよりも小さい
A <= B          AはB以下
A > B           AはBよりも大きい
A >= B          AはB以上
NOT(式)            式の真偽を反対にする
(式) AND (式) どちらも真の場合に真とする
(式) OR (式)  どちらか片方でも真の場合に真とする
A IN (B, C, D)  AがB,C,Dのいずれかと等しければ真
A LIKE "hoge*"  Aがhogeで始まる文字列であれば真(*はワイルドカード)
A LIKE "hoge?"  Aがhogeで始まる5文字の文字列であれば真(?は任意の1文字)

比較対象の値は以下の様に表現します。

項目名   [どこを]
文字列   "右足"
数値  123

ここでは以下の問題に答えるために、制約条件を用いてみたいと思います。

問題1:一条, 二ノ宮, 三島, 四元, 五木の五人で競走をしました。1着と2着の組み合わせを全通り挙げてください。

問題2:問題1の中で、四元と五木は仲良しでいつも一緒なので、四元が1着の時は五木が2着、五木が1着の時は四元が2着になるとします。その場合の1着と2着の組み合わせを全通り挙げてください。

無条件制約

問題1のポイントは、全員一人ずつなので「1着と2着が同じではいけない」ですね。このようなパターンでは、「無条件制約」を用いると便利です。

「無条件制約」は、項目の後に制約文を記述します。

sample_3_1.txt

1着: 一条, 二ノ宮, 三島, 四元, 五木
2着: 一条, 二ノ宮, 三島, 四元, 五木

####################
# 無条件制約
# 
# 1着と2着は別の人
[1着] <> [2着];

さあレースのスタートです。

pict sample_3_1.txt 1>sample_3_1_result.txt 2>sample_3_1_error.txt

答えはこちら。全部で5*4の20通りになるはずです。

sample_3_1_result.txt

1着  2着
三島  五木
三島  二ノ宮
二ノ宮   五木
五木  二ノ宮
二ノ宮   三島
四元  三島
五木  三島
一条  三島
一条  五木
四元  五木
五木  一条
四元  一条
三島  四元
三島  一条
五木  四元
一条  二ノ宮
四元  二ノ宮
二ノ宮   四元
一条  四元
二ノ宮   一条
条件付き制約

問題2のように「○○は(○○の場合は)△△になる」という場合は、「条件付き制約」の出番です。

条件付き制約は、おなじみのif文を用います。

if 条件
    then 結果;

こんな感じで。

sample_3_2.txt

1着: 一条, 二ノ宮, 三島, 四元, 五木
2着: 一条, 二ノ宮, 三島, 四元, 五木

####################
# 無条件制約
# 
# 1着と2着は別の人
[1着] <> [2着];

####################
# 条件付き制約
# 
# 四元が1着の場合は五木が2着
if [1着] = "四元"
    then [2着] = "五木";
# 五木が1着の場合は四元が2着
if [1着] = "五木"
    then [2着] = "四元";

さて実行。

pict sample_3_2.txt 1>sample_3_2_result.txt 2>sample_3_2_error.txt

結果は以下のとおり。四元が1着+五木が1着+他の三人が1着で3*4通り=全部で14通りになります。

sample_3_2_result.txt

1着  2着
一条  五木
二ノ宮   五木
三島  五木
一条  四元
二ノ宮   三島
五木  四元
二ノ宮   四元
三島  一条
三島  四元
三島  二ノ宮
一条  二ノ宮
四元  五木
二ノ宮   一条
一条  三島

さーて、次回のkondoさんは

次回は実際のサイトをモデルにして、PICTでテストの組み合わせを出してみます。お楽しみに!

※記事中に出てくる人名は全てフィクションであり、実在の人物名とは一切関係ありません。

ども、カブセネタ大好きアラガです。 Red5熱再加熱中でゴザイマス!

Wowza Media ServerでSWFVerification(っぽいこと)をする方法 - blog.katsuma.tv

unknownplace.org - URLベースでのACLをkamaitachiにもつけた

弊社のtypesterが、kamaitachでURL ベースでのアクセスコントロールをつけることができるようにしたってことですが、それならRed5でもできるよって話です。

それではさっそくコードです。

acl.AclApplication.java

package acl;

import java.util.List;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AclApplication extends ApplicationAdapter {
    protected static Logger log = LoggerFactory.getLogger(AclApplication.class);

    private List<String> aclList;

    public void setAclList(List<String> aclList) {
        this.aclList = aclList;
    }

    @Override
    public synchronized boolean connect(IConnection conn, IScope scope, Object[] params) 
    {
        if (this.accessControlBySwfUrl(conn)) 
            return super.connect(conn, scope, params);

        return false;
    }

    protected boolean accessControlBySwfUrl(IConnection conn)
    {
        String swfUrl = (String) conn.getConnectParams().get("swfUrl");

        for (int i = 0; i < aclList.size(); i++) {
            String acceptUrl = (String) aclList.get(i);
            if (swfUrl.equals(acceptUrl) || swfUrl.matches(acceptUrl)) return true;
        }
        return false;
    }
}

red5-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:lang="http://www.springframework.org/schema/lang"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                         http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.0.xsd">

    <bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="/WEB-INF/red5-web.properties" />
    </bean>

    <bean id="web.context" class="org.red5.server.Context" autowire="byType" />

    <bean id="web.scope" class="org.red5.server.WebScope" init-method="register">
        <property name="server" ref="red5.server" />
        <property name="parent" ref="global.scope" />
        <property name="context" ref="web.context" />
        <property name="handler" ref="web.handler" />
        <property name="contextPath" value="${webapp.contextPath}" />
        <property name="virtualHosts" value="${webapp.virtualHosts}" />
    </bean>

    <!-- Red5 Handler -->
    <bean id="web.handler" class="acl.AclApplication">
        <property name="aclList">
            <list>
                <!-- ここに許可するSWFURL -->
                <value>http://localhost:5080/demos/BallControl.swf</value>
                <value>http://localhost:5080/demos/.*</value>
            </list>
        </property>
    </bean>

</beans>

利用方法

  1. 上記のAclApplication.javaをコピペか継承してApplicationを作成

  2. red5-web.xmlのweb.handlerの設定でaclListに許可するswfのURLを設定

  3. Red5再起動

これで設定したURL以外のアクセスをリジェクトします。

URLを追加するたびに再起動は必要ですが、xmlの編集のみでコンパイルは不要なので便利ですね。

Perlが得意な方には激しくkamaitachiがおすすめだし、WOWZAのFMS越えとも思える高機能にはビビりますが、まだまだRed5も出来る子です。

それでは良いストリーミングライフを!

カヤックでは、FMSやkamaitachをはじめとするインタラクティブな技術に興味のあるエンジニアを募集しています!

ども、出来ることなら楽したい、めんどくさいことはしたくない、手抜きが大好き!でおなじみアラガです。

先日、FMS勉強会でネタのつもりで僕の手抜きRed5環境構築法を紹介したのですが、意外と役に立つ部分もありそうだったので紹介します。

まず、Red5とはJavaで作られているオープンソースのFMS(Flash Media Server)クローンです。弊社でも、今日の緑さん超能力ラボ等、FMSではなく無料で使えるRed5を採用しているプロジェクトも数多く存在しています。

僕はこのRed5のインストールを何度かしていますが、バージョンが上がったりした際に一発でインストールできなかったり、いろいろと苦戦をしてきました。

しかし、最近ある方法を使って超速に環境をさくっと作れるようになってきました。

以下で紹介します。

超速インストール方法

1.Java6をインストールする

実はこれが一番敷居が高いのですが、方法はググれば沢山出てくるので省略いたします。

2.自分のマシンにred5をインストーラを使ってインストール

これがポイントです。red5のサイトから最新のインストーラ付きred5をインストーラを使ってインストールします。

3.red5をまるまるscpでサーバーにアップロード

windowsでもmacでもokでした。

  1. red5を起動
./red5.sh

この方法のメリットは、依存関係も何もかも1発で出来ることです。コマンドじゃなくてローカルでGUIを使うなんてダサイと思うかもしれませんが、本当に楽でおすすめです。

ただし、antのインストール等をすっとばしているのでサーバーでビルドし直しとかすると、一瞬で壊れるので要注意です。

また、各アプリケーションは自分の環境で(僕はeclipse)でコンパイルしてwebapps以下に放り込みred5を再起動すると動きます。

アクセスログを出す

正直、ストリームサーバーでアクセスログの必要性がよくわからないのですが、(webページで十分)出せとよく言われるので出すことが多いです。こんなときは以下の方法がらくだと思います。

以下のクラスを作成

AccessLog.java

package hoge; // パッケージはアプリケーションごとに作成
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AccessLog 
{
    protected static Logger log =                                   
         LoggerFactory.getLogger(AccessLog.class);
    public void put(String message) {
        log.info(message);
    }
}

メインのクラス(たいていはApplication.java)に必要に応じた出力を書く

Application.java

public class Application extends ApplicationAdapter {
    private AccessLog accessLog;    

    @Override
    public boolean appStart(IScope app) {
        accessLog = new AccessLog();
        return super.appStart(app);
    }

    // connectだとroom利用時に2回動いてしまいます
    @Override
    public boolean appConnect(IConnection conn, Object[] params) {
        putAccessLog(conn);
        return supper.appConnect();
    }
    // AccessLogに書いても良いと思いますが、Applicationのほうが多くの情報をとれます
    protected void putAccessLog(IConnection conn) {
        String cid = getStrCid(conn.getClient()); // Red5が生成するクライアントの一意のID
        String refererUrl = (String) conn.getConnectParams().get("swfUrl"); // アクセスもとSWFのURL
        String access = (String) conn.getConnectParams().get("app"); // application/room
        String userIP = conn.getRemoteAddress(); // クライアントのIP
        String flashVer = (String) conn.getConnectParams().get("flashVer"); //フラッシュバージョン

        accessLog.put("ACCESS=" + access + ", STATUS=" + status
                + ", CLIENTID=" + cid + ", IP=" + userIP + ", REFERER="
                + refererUrl + ", FLASH-VERSION=" + flashVer);
    }
}

アクセスログに限らずred5でログを出すためにはslfjの設定をしないといけません。注いでにアプリケーションの設定も晒します

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="APP"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>log/hoge/app.log</file>
        <append>true</append>
        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>log/hoge/sys.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <encoding>UTF-8</encoding>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %date [%thread] %-5level %logger{35} - %msg%n
            </Pattern>
        </layout>
    </appender>

    <appender name="ACCESS_LOG"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>log/hoge/access.log</File>
        <append>true</append>
        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>log/hoge/access.log.%d{yyyyMMdd}</FileNamePattern>
        </rollingPolicy>
        <encoding>UTF-8</encoding>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%date %msg%n</Pattern>
        </layout>
    </appender>

    <!-- 全体はINFOレベルでまとめて出力 -->
    <root>
        <level value="INFO" />
        <appender-ref ref="APP"/>
    </root>
    <!-- アクセスログは単体で別ファイルに出力 -->
    <logger name="hoge.AccessLog">
        <level value="INFO" />
        <appender-ref ref="ACCESS_LOG" />
    </logger>

</configuration>

勉強会では無かった箇所も晒しました。あんまりらくではないかも。。。

(追記 2008-12-08) logbackを使用するときはlog4jのときとは違って、webapps/myapp/WEB-INF/libいかに書きの.jarを入れないと動きません。

  • logback-classic-0.9.8.jar
  • logback-core-0.9.8.jar
  • slf4j-api-1.4.3.jar

javaはよくわかりませんが、slf4jは設定ファイルではなく、クラスパスにあるjarでロガーを切り替えるみたいです。

同一サーバーに開発環境を作る

cp ?R red5 red5_dev
vi red5_dev/conf/red5.properties

hoge.portを片っ端から変更する。

例えば+100とすると、開発環境へはrtmp://path.to.red5:2035/appでアクセス可能になります。

本来は別サーバーをたてるのが理想ですが、もったいないので同一サーバーにRed5をもう一つたてるという方法です。

以上、ざっくりでしたが何かのお役に立てば幸いです。

そうそう、red5はjavaだからなーというそこのあなた!kamaitachiを使えばPerlでもrtmpサーバーが作成できますよ!

カヤックではRTMP等を使用したインタラクティブなサイト制作に興味のあるエンジニアや、手抜きをするために苦労をいとわないエンジニアを募集しています!