[2012/04/ - Version0.0.3 - リリース]
・-dbport追加
  内部DBの起動ポート番号を動的に変更


・-masterport追加
  Setsunaを複数代起動した場合に、既に起動しているSetsunaの内部DBを後発で起動したSetsunaは利用する
  動きをするため、そのDBの起動ポート番号が-dbportで変更されていた場合このオプションで合わせてやる必要がある。


・-queryで指定するSQL内でAdapterから投入された直近のデータを条件として利用できる機能を追加
  利用イメージはSQL内のAdapterからのデータで置き換えたい箇所にカラム名を特定のフォーマット(%カラム名%)で
  指定するとその部分がSQL実行時には、Adapterからの直近のデータで置換されて実行される。
  1つのSQL内でいくつでも指定可能。

  指定及び、実行イメージは以下となる
   1.Adapterから以下のデータが来た場合
    Reply from 192.168.11.1: bytes=32 time=1ms TTL=64
   2.内部には以下のテーブル定義で自動的に格納される。
    ※DBテーブル内のデータを"カラム名:データ"のフォーマットで以下に表す   
     COLUMN0:Reply
     COLUMN1:from
     COLUMN2:192.168.11.1:
     COLUMN3:bytes=32
     COLUMN4:time=1ms
     COLUMN5:TTL=64
   3.以下のSQLを指定(Where句の指定の部分に%Column4%を指定
     -query "select * from pipe where to_number(column4) > to_number(%Column4%)"
   4.実際には以下のSQLが実行される
     select * from pipe where to_number(column4) > to_number('time=1ms')
   5.%Column4%の部分が実際にはAdapterからのデータの'time=1ms'に置換されている


・-easyqueyを追加
  SQLを直接記述せずに関数を呼び出し、SQLでの確認と同等のことを行う。
  -queryと同時指定は不可となる。
  現在利用可能な関数とその機能は以下
  ※特殊オプションとしてavg_over、avg_below、over_value、below_value、time_range_in_avg_over、time_range_in_avg_below、time_range_in_value_multi_existこれらの関数の
    最後の引き数である'条件指定の値'部分は自由に特定のテーブルのカラムの値に置換して実行可能となっています。
    これは常に最新の値が適応されて実行されるため、別のテーブルにパラメータを投入し続けておけば、関数にあたえる引き数を動的に
    変動させれることになります。つまり'avg_over'関数であれば、あるカラムの平均値が別のテーブルのあるカラムの最新値よりも
    大きければ、イベント実行のようなことが可能です。
    指定方法は'テーブル名:カラム名'のフォーマットで引き数部分に指定します。最後の実行例の部分にも例があるので、合わせて
    参照してください。
  [関数一覧]");
  'avg_over':特定のテーブルの特定のカラムの全てのデータの平均が指定値以上か調べる
             オプションでの表記方= -easyquery "avg_over(対象Table名, 対象Column名, 条件指定の値)"

  'avg_below':特定のテーブルの特定のカラムの平均が指定値以下か調べる
             オプションでの表記方= -easyquery "avg_below(対象Table名, 対象Column名, 条件指定の値)"

  'over_value':特定のテーブルの特定のカラムの最大値が指定値以上か調べる
              オプションでの表記方= -easyquery "over_value(対象Table名, 対象Column名, 条件指定の値)"

  'below_value':特定のテーブルの特定のカラムの最小値が指定値以下か調べる
                オプションでの表記方= -easyquery "below_value(対象Table名, 対象Column名, 条件指定の値)"

  'avg_more_over':特定のテーブルの特定のカラムの平均の指定倍以上の値が存在するか調べる
                  オプションでの表記方= -easyquery "avg_more_over(対象Table名, 対象Column名, 条件指定の値)"

  'last_time_avg_more_over':特定のテーブルの特定のカラムの直近特定秒以内のデータの平均値を特定倍以上超えるデータがあるか調べる
                            オプションでの表記方= -easyquery "last_time_avg_more_over(対象Table名, 対象Column名, 直近の特定秒, 特定倍)"

  'count_last_time_avg_more_over':上記の条件のデータが特定件数以上ある
                                  オプションでの表記方= -easyquery "count_last_time_avg_more_over(対象Table名, 対象Column名, 直近の特定秒, 特定倍, 特定件数)"

  'time_range_in_avg_over':直近からの過去指定値秒間の特定のテーブルの特定カラムの平均値が指定値以上である
                           オプションでの表記方= -easyquery "time_range_in_avg_over(対象Table名, 対象Column名, 直近から過去指定秒, 指定値)"

  'time_range_in_avg_below':直近からの過去指定値秒間の特定のテーブルの特定カラムの平均値が指定値以下である
                            オプションでの表記方= -easyquery "time_range_in_avg_below(対象Table名, 対象Column名, 直近から過去指定秒, 指定値)"

  'time_range_in_value_multi_exist':特定のテーブルの特定のカラムの値が同じ値が直近からの過去指定秒間以内に指定値回登場する
                                    オプションでの表記方= -easyquery "time_range_in_value_multi_exist(対象Table名, 対象Column名, 直近から過去指定秒, 指定回数)"

  'last_range_avg_over':特定のテーブルの特定のカラムの値の一定時間前の一定期間の平均値と現在も一定期間の平均値を比べ指定した倍数分現在の平均値が大きいかを判定
                        現在が2時だとした場合、24時間前の1時から2時までの間のあるカラムの値の平均値と現在の1時から2時までの間のあるカラムの値の平均値を比べて現在の方が24時間前の平均値の2倍になっていたらイベント実行などに使う
                        上記の場合、指定方法は以下のようになる。(ロードアベレージをtopコマンドで流し込んで-streamでloadaveragetableという名前にして、loadaverageというカラムを-columnで指定した想定場合の想定
                        last_range_avg_over(loadaveragetable, loadaverage, 3600, 86400, 2) <=先頭から-streamで指定した値、カラム名、1時〜2時を表す3600秒、24時間前を表す86400秒、2倍を表す2)
                        オプションでの表記方= -easyquery "last_range_avg_over(対象Table名, 対象Column名, 指定一定期間(秒/単位), 一定時間前(秒/単位), 指定倍)"

  [指定例]");
   -easyquery avg_over(pipe, column4, 3) 
   -easyquery avg_over(pipe, column4, parametertable:column1) <=パラメータに他のテーブルにあるカラムの値を用いた場合
   ※内部で実際に実行されているSQLは-debug onで確認可能


・-trigger及び、-query、-easyqueryを複数個指定可能とした。
  指定方法は複数個-triggerや-query、-easyqueryを指定するのみ。
  先頭から-tirggerから実行され、指定した全ての条件をクリア後、-query or -easyqueryが同じように
  先頭から実行される。
  [指定例]
  -trigger "column1 > 2" -trigger "column3 like test"


・HTTPサーバモードを追加
  HTTPプロトコルでの入力を受け付ける、HTTPサーバモードを追加。
  外部のサーバからHTTP通信でデータを流し込むことが可能となります。
  デフォトではポート番号8080番で起動しています。コンテキストは全てが対象となります。
  内部のHTTPサーバにはJetty(http://jetty.codehaus.org/jetty/)を利用しています。
  リリース物はsetsuna-0.0.3リリース時のJetty7の最新バージョンである7.6.3で稼動確認を行っています。
  またlib/jetty/配下にコンパイル、実行時に必要なJerttyのjarファイルを同梱しているが、常に最新を利用することを
  推奨します。最新版のJettyに変更してビルドする際はbuild.xmlの"project.class.path"要素ないのパスを変更してください。


  (起動方法) !!注意!! 従来の-jar指定での利用はできません。
  $java -classpath ./:./setsuna.jar:./lib/jetty/* setsuna.core.SetsunaMain -httpserver true

  (データを流し込むスクリプトをwgetで記述した場合)
  $wget "http://localhost:8080/?column1=00001&column2=data1&column3=type00001"

  下記はオプションの詳しい利用方法となる
  -httpserver:HTTPサーバモードの起動指定
              HTTPサーバで起動した場合はデフォルト8080番ポートでHTTPプロトコルでAdapter入力を待ち受ける
              待ち受けるコンテキストは指定なくルート直下全てが対象となる。つまり「http://setsunaexample.org/」のように指定することになる
              待ち受けるコンテキストを指定したい場合は-httpcontextオプションを利用する
              HTTP通信で1リクエスト1データとして入力が可能
              ・入力のHTTPパラメータのフォーマットはKey=Valueとする。このKeyの部分がSetsunaの内部DBのカラム名となり、
                Valueの部分はデータとなる。-columnを指定している場合は、指定した名前でHTTPパラメータ内を探索するため、
                指定したKeyが無ければパラメータが作れずエラーとなる。
                Getでのリクエストを例にすると以下は4つのカラムデータを投入している
                http://setsunaexample.org/?column1=XXX1&column2=20120501120000&column3=testdata1&column4=exampledata1
              入力後、返却される値はHTTPステータスコードだけとなり、bodyの返却はない
              ・HTTPステータスコードの対応は以下となる
                200 : 入力成功
                400 : 入力データが最初にSetsunaに投入された場合と入力パラメータ数が異なる。正しいからメータ数にすれば復旧可能
                500 : Setsuna側でなんだかのサーバエラーが発生している。クライアントによる復旧不可
              -serverと同時に指定すると-serverで起動するMessagePack-RPCでのサーバが優先されこちらは起動しない
              本モードで起動した場合に-query等で利用するテーブル名は-streamを指定しない場合、'server'というテーブル名になる
              **省略可能**
              ※省略した場合はパイプ入力となる
              [指定例]
                -httpserver true
   
   
  -httpbindaddr:HTTPサーバモードの起動時のサーバがバインドするアドレス
                HTTPサーバモードで起動した場合のみ有効
                **省略可能**
                ※省略した場合は0.0.0.0にバインドされる
                [指定例]
                 -httpbindaddr 192.168.1.1
   
   
  -httpbindport:HTTPサーバモードの起動時のサーバが待ち受けるポート番号
                RHEL系のOSの場合、root権限意外では80番を指定することは出来ない場合があるため注意が必要である
                HTTPサーバモードで起動した場合のみ有効
                **省略可能**
                ※省略した場合は8080番で起動する
                [指定例]
                -httpbindport 9090
   
   
  -httpcontext:HTTPサーバモードの起動時のコンテキストを限定したい場合に利用する
               HTTPサーバモードで起動した場合のみ有効
               **省略可能**
               ※省略した場合は全てのコンテキストが1入力になる
               [指定例]
               -httpcontext setsuna
                上記の場合の入力URLは以下となる
                http://setsunaexample.org/setsuna


------------------------------------------------------------------------------------------------
[2012/03/24 - Version0.0.2 - リリース]
※今回のリリース機能は全て-helpでも確認できます。


■追加機能[1]
  Setsuna起動時にサーバモードで起動するオプションを追加

  以下の起動方法で起動することでサーバモードで起動し、従来のパイプではなく
  NetWork越しにデータを投入することが可能です。

  (事前準備)
  Setsunaのサーバモードは内部的にMessagePack-RPCのJava版を利用しています。
  そのため、起動するにはMessagePack-RPCとそれが依存するライブラリが必要になります。
  リリース時点で利用したライブラリを配布物のlibディレクトリ配下のmsgpackの下に全て同梱しています。
  ただ、最新の関連するライブラリを配布元から取得して利用することをおすすめします。

  [サーバ側の説明]
   (起動方法) !!注意!! 従来の-jar指定での利用はできません。
    java -classpath ./:./lib/msgpack/*:setsuna.jar setsuna.core.SetsunaMain -server true

    ※Linux想定 
    ※リリース物展開ディレクトリでの操作想定 
    ※従来のパイプ入力の場合は従来通りの起動方法です。(java -jar setsuna.jar)
   (利用する起動パラメータ
    ・-server   :trueを指定することで、サーバモードで起動します。
                 (例) -server true

    ・-bindaddr :サーバモードの起動時のサーバがバインドするアドレス
                 省略した場合0.0.0.0アドレスにバンドされることになる
                 (例) -bindaddr 192.168.1.1

    ・-bindport :サーバモードの起動時のサーバが待ち受けるポート番号
                 省略した場合10028で起動することになる
                 (例) -bindport 10222

   (説明)
    1."-server true"を指定することでサーバモードになりNWサーバ型になる。
      作成されるテーブル名指定(-stream)を省略すると"SERVER"というテーブル名でデータベース上に作成されます。
    2.データを投入する部分以外は従来と全て同じ利用方法ですが、-sep、-sept、-dstオプションは無効になります。
      カラム定義に関しては-column指定でサーバ起動時に決定するか、クライアント側から最初に送られたデータで自動作成されます。

  [クライアント側の説明]
   (サーバ側に定義されているメソッド)
    サーバ側のデータ投入に呼び出すメソッドは以下のようにサーバに定義されています。
    [定義メソッド]
     int next (String[] sendData)
      @引数  ：Setsunaに投入したい1レコードのデータColumn数分のデータの配列
      @戻り値：Setsuna側の登録結果 0=登録成功、-9=カラム定義と送られたデータ配列の数が合わないエラー、-9=サーバ内部エラー

   (サンプル実装)
    ./test/ServerClientSample配下のSetsunaServerModeClientSample.javaを参考にしてください。



■追加機能[2]
  Setsuna自身のエラー出力をファイルに出力できる機能を追加

  従来Setsunaは内部で発生したエラー出力も全てコンソールに出力されていたが、これをファイルに出力する機能です。
  起動オプションに以下を指定
  [オプション文字列]
   -errorlog
  [指定する値]
   ファイルパス
  [指定例]
   -errorlog "/var/log/setsuna_error.log"



■追加機能[3]
  デバッグモードの追加

  Adapter、Query、UserEventでどのようなインプットデータ、Trigger、Query、UserEventコマンドを扱ったかを
  標準出力にプリントアウトする機能を追加

  それぞれの箇所で以下のようなフォーマットで出力される。
  [Adapter]
   パイプ入力時:"Debug : Fri Mar 23 23:40:53 JST 2012 - - Pipe Input=[入力されたデータ]"
   Serverモード時:"Debug : Fri Mar 23 23:37:20 JST 2012 - - Server Input=[[0]="送信されたデータ配列の1番目のデータ",[1]="送信されたデータ配列の2番目のデータ"・・・以降同じ]"
  [Query]
   -trigger : "Debug : Fri Mar 23 23:45:06 JST 2012 - - -trigger Query=[入力データ 検証記号 ユーザ指定値]"
              (例) Debug : Fri Mar 23 23:45:06 JST 2012 - - -trigger Query=[=32 > 100]
   -query : "Debug : Fri Mar 23 23:47:35 JST 2012 - - -query SQL=[指定したSQL文]"
  [UserEvent]
   -event : "Debug : Fri Mar 23 23:52:58 JST 2012 - - -event=[実行されたコマンド文字列]"
   -eventquery: "Debug : Fri Mar 23 23:54:01 JST 2012 - - -eventquery=[実行されたSQL]"

  デバッグモードには2種類モードが存在し、
  1つはデバッグ文字列とSetsunaの標準出力(データ文字列など)混在モードと
  デバッグ文字列のみ出力するモードがある。

  起動オプションに以下を指定
  [オプション文字列]
   -debug
  [指定する値]
   on       (混在)
   only     (デバッグ文字のみ)
  [指定例]
   -debug on
   -debug only



■追加機能[4]
  入力データ読み込み開始位置の設定機能

  標準入力モード時や、サーバモード時に送り込まれたデータを指定されたデータ数;
  スキップ(読み込まない)してから初めて内部DBへの格納を開始する機能

  利用イメージは読み込ませるデータの最初のレコードに空白や、本来読み込みたい
  データと異なるフォーマットが存在した場合に利用する。
  このオプションを利用する場合は必ず-columnオプションも設定する必要がある
  これはデータを格納するテーブル定義を作成する必要があるためである

  起動オプションに以下を指定
  [オプション文字列]
   -offset
  [指定する値]
   数値 (取り込みを開始したいレコード数を指定)
  [指定例]
   -offset 3 -column "col1 col2 col3"
   ※上記の場合、パイプなどで送り込まれたデータの3レコード目から初めて取り込まれだす。
     ただし、-column指定を必ず設定する必要がある



■追加機能[5]
  カラム定義と異なるフォーマットのデータが入力された場合に無視して取り込まない機能

  従来はカラム定義と異なるデータが入力された場合、正しく取り込まれずExceptionを
  発行していたが、この機能を利用することでそういった入力データをスキップするようになる

  例えばカラム定義や、Setsunaが取り込んだ1レコード目が以下のフォーマットの場合
  ┌────────────────────┐
  │ "XXXXX YYYYY ZZZZZ"                    │
  └────────────────────┘
  カラムは3つとなる。この状態で入力データの2レコード目以降に以下のようなデータが入力されると
  ┌────────────────────┐
  │ "AAAAA BBBBB"                          │
  └────────────────────┘
  1レコード目のカラム数に対して異なるためExceptionが発行されSetsunaが終了していた。
  こういった場合に本機能を使うと異なるデータは取り込まなくなる。

  起動オプションに以下を指定
  [オプション文字列]
   -skiperror
  [指定する値]
   true
  [指定例]
   -skiperror true

