Main menu:

2008年 11月
« 10月    
 12
3456789
10111213141516
17181920212223
24252627282930

サイト検索

カテゴリ

PR

QRコード

AX

アーカイブ

ちいたんとフレームワークファイト

phpのフレームワークを調査していて見つけた軽量のフレームワーク。

http://php.cheetan.net/

あるひとつのテーマについて、いろいろな(と言っても覚えるのが面倒なので、簡単な)PHPフレームワークで記述し、どのような違いがあるかについて調べる予定。テーマとしては、小遣い帳もしくは公開エクセルを予定。小遣い帳とは、単式簿記のうちキャッシュフローについて記録するもので、現金残高が基準となる。毎月自動的に〆られるので、〆た数字と銀行口座の残高を毎月確認すれば良い。

ビジネスロジックは共通にして(どうせフレームワークの範囲外なので)、共通利用したい。

対応する予定のフレームワークはCI, Kohana, cheetan。
対応する予定のデータベースはMySQLのみ。
使用予定の機能は

ログイン認証
CRUD処理
(ビジネスロジック=会計処理)
テーブル表示

PHPフレームワークファイト

PHPフレームワークファイトというものがある。
http://d.hatena.ne.jp/sotarok/20080422/php_framework_fight
かなりgdgdのようだが、いくつかは実装が完了したものがあるようだ。いずれにせよ、あるテーマについて、いろいろなフレームワークで実装を競争するのは非常に参考になる。

過去にpublic_excelというテーマについて、素のphpとCodeIgniterで実装した経験あり。このアプリケーションにはビジネスロジックはほとんど無く、「公開エクセル」機能とでもいうべき、ネットワーク上でひとつのデータベースを共有し、CRUDするアプリケーションである。従って、CRUDが中心となる。

CIにより開発したコード量
controllers/framework.php 275行
libraries/Fm_table.php 458行
libraries/Fm_insert.php 289行
libraries/Fm_update.php 294行
views/framework.php 66行
計1382行

PHPによる従来手法のコード量
config.php 33行  初期値
include.php 605行 実行処理
index.php 44行 初期画面
update.php 74行  編集画面
計736行

CIの方が多いが、これはCRUDフレームワークを開発したため。今後このCRUDフレームワークを再利用すれば、341行となる。

trouble shoot

発端

homepage builderのftp設定を行ったが、うまく転送ができないため、いろいろと調査。以下のような質問文を投げたが、そもそもpassiveの動作に疑問があったため、一旦撤回し、調査を継続。

ホームページビルダ内でアップロードのためにftpを行っています。

クライアントはXPないしはVistaでルータ越しにサーバと接続されています。ftpのパスワードが平文で流れるのが嫌なので、両側でzebedeeで暗号化&トンネリングしています。このときftpは複数のポートを使用するのと逆方向のコネクションがあるため、ホームページビルダの設定でpassiveモードにしており、さらにサーバ側でftpサーバに渡す前にftpgw.tclで受けています。ややこしいので図示すると、

クライアント:ホームページビルダ(ftp) passive mode
       ↓ (localhost:21)
       zebedeeクライアント
       ↓ (server_address:port1)
サーバ:   zebedeeサーバ
       ↓ (localhost:port2)
       ftpgw.tcl
       ↓ (localhost:21)
       ftpd

従来PCのOSがXPだったときはこれで正常に動作していました。が、Vistaに移行したら動作しなくなりました。

サーバ側でftpgw.tclのログを表示しながら動作すると、Vistaではユーザ名、パスワードはOK、PASVコマンドが正常に受け付けられた後に動作がとまります。一方XPではPASVコマンドサーバに受け付けられた後、別コネクションが張られ、動作が継続します。

zebedee+ftpgw.tclの組み合わせでftpを使用されている方はおられますでしょうか?windowsのftpコマンドはPASVをサポートしていないようで、XPとVistaの違いかどうかも定かではありませんが、下記ホームページビルダ体験版(無償)をインストールして試したところ、OSの違いとしか思えませんでした。

何かおわかりになりましたらヒントでもいただけたら幸いです。

zebedee&ftpgw.tcl:?http://www.winton.org.uk/zebedee/?
ホームページビルダ体験版:?http://www-06.ibm.com/jp/software/internet/hpb/down/12/taiken.html?

PASVの調査

passiveの時はクライアント側からコネクションを張るが、その範囲を設定できる。というか、zebedeeでその範囲の転送を設定しておかないと動作しないはず(じゃあなぜXPではそれが無いのに動作したんだろう?)。
範囲をつけて試したが、XPでは動作した。zebedeeの転送範囲の追加と、ftpgw.tclのポート範囲の設定を合わせる必要がある。

おかしいのは、ftp側はこの範囲のことは知らないので、任意のポートに対してコネクションを張ろうとする。それをftpgwで書き換えるようなのだが、そもそもzebedeeが間に入っているので、そのポートのリダイレクトが設定されていないとおかしいはず。やはりどこか変。

コンフィグファイルを書き換えようとしたが、パーミッションの関係で書き換えられない

ftpgw.tclのマニュアルを熟読していたところ、ホスト名がlocalhostや127.0.0.1ではだめという記述を発見。ftpの設定項目をPCの名前に変えたところ動作!

どつぼに嵌る

バックアップから戻そうとして、一旦C:\program files\zebedeeを消去。このあとVistaのバックアップから書き戻そうとしたが、なんと全て取られているわけではないことが判明!ショック!

元々zebedeeフォルダは別のXP PCのフォルダをコピーしただけなので、別のPCから上書きコピー

ファイアウオールが悪さしているかと思い、ファイアウオールの設定をいじる。

調子が悪いため、リブート

zebedeeのバイナリが古いのかと思い、本家からダウンロード&インストール。不具合がかわらず。

telnetで調査しようと思ったがtelnetが無い。そのため、XP PCのC:\windows\i386\telnet.exeをコピーして使用する。

最悪⇒ワークアラウンド発見

メールも動作しなくなった。メール設定をダイレクトにしても動作しない!これは予想外。

telnetで調査したところ、同じサブネット内にあるLinux PCにはコネクションが張れるもよう。しめたと思って、Linux PCのiptablesをいじって10025, 10110のポートを2つ空け、さらにstoneをインストールし、パケットリピータを搭載。

これによりようやく、ダイレクトモードながら、メールが送受信できるようになった。

当初から比べるとzebedeeが動作しなくなったので、レベルダウン。じっくり調査して直す必要がある。これが直らないとftpは動作しない。

Pthreadの詳細

Pthreadを調査しているが、非常にためになるソースコード付きチュートリアルを発見したので、魚拓をとっておいた。

http://s03.megalodon.jp/2008-1117-1114-54/codezine.jp/article/detail/1892?p=1

pthreadは単一スレッドのプログラムをマルチスレッド化するライブラリである。ただし、単一プロセッサの場合は空間を共有し、スタックのみが個別となるため非常に効率的であるものの、マルチプロセッサ環境の場合はforkし、マルチプロセスとしても効率的に大差ない気がする。pthreadのほうがdetach、joinによりコントロールしやすいのかもしれないが。これは諸刃の剣であり、static/global等を不用意に使用していると、スレッド間での依存が起こり、またチェックもされないため、デバッグが非常に困難な障害を引き起こす可能性もある。

Wordファイルの変更

背景

wordファイルの文字を置換したいことがある。例えば共通仕様書を作成しておき、製品名は%product%としておく。一方、製品AA, BB, CCの個別仕様書中ではそこをAA, BB, CCと変えた、3種のwordファイルが欲しい。テキストやTexであれば何ということもないが、wordの場合はやや面倒。

準備

activestateに行き、active perlをダウンロード&インストール。activeperlはフリーでありながらwindowsアプリケーションへのAPIを持っているため、大変便利。

実行

以下のようなプログラムをテキストエディタで作成し、change.plとでもしてセーブ。
use strict;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Word';
 
my $word = Win32::OLE->GetActiveObject('Word.Application')
|| Win32::OLE->new('Word.Application', 'Quit');
my $doc = $word->Documents->Open('C:\Perl\コピー ~ testbunsho.doc') || die;
my $paras = $doc->Paragraphs;
 
foreach (in $paras) {
my $bu = $_;
$_ = $_->Range->{'Text'};
 
if (/%product%/) {
s/%product%/AAA/;
$bu->Range->{'Text'} = $_;
}
$_ = $bu;
}
$doc->Close();

参考URL

http://msdn.microsoft.com/en-us/library/78whx7s6(VS.80).aspx

wnlib中の制約付き非線形最適化パッケージのマニュアル(和訳)

wnlib中の制約付き非線形最適化パッケージのマニュアルhttp://www.willnaylor.com/mantext/wnnlp.txtを和訳した(機械翻訳を修正)。

名称
wnnlp — 制約つき非線形最適化パッケージ

文法
#include “wnnlp.h”

#define WN_EQ_COMPARISON 1
#define WN_GT_COMPARISON 2
#define WN_LT_COMPARISON 3

typedef struct wn_linear_constraint_type_struct
{

int size;
int *vars;
int comparison_type;

double *weights;
double rhs;
} *wn_linear_constraint_type;

typedef struct wn_nonlinear_constraint_type_struct
{

int size;
int *vars;
int comparison_type;
double offset;

ptr client_data;
double (*pfunction)(int size,double *values,ptr client_data);
void (*pgradient)(double *grad,int size,double *values,ptr client_data);
} *wn_nonlinear_constraint_type;

void wn_nlp_conj_method
(
int &code,
double &val_min,
double solution_vect[],
double delta_vect[],
wn_nonlinear_constraint_type objective,
wn_sll constraint_list,
int num_vars,
int conj_iterations,
int offset_iterations,
double offset_adjust_rate
)

void wn_make_linear_constraint
(
wn_linear_constraint_type &constraint,
int size,double rhs,int comparison_type
)

void wn_make_nonlinear_constraint
(
wn_nonlinear_constraint_type &constraint,
int size,int comparison_type
)

extern int wn_nlp_verbose;

説明
このパッケージは一般制約を条件として多変数に関する一般関数の最適化に役に立ちます。最小にする関数と制約条件は、線形かまたは非線形です。非線型の場合は、連続していてかつ微分可能でなくてはなりません。制約条件は、等式かまたは不等式が可能です。

最適化アルゴリズムはおよそ以下の通りです。制約条件と目的関数は、制約なしマスタ目的関数を作成するために結合されます。制約条件は、違反される各制約条件のためのマスタ目的関数に二次のペナルティ関数を追加することによって、扱われます。マスタ目的関数は、共役勾配山登りアルゴリズムを使用することで最適化されています(wnconjを見てく
ださい)。結果として起こるソリューションはたぶん制約条件のいくつかに違反します。違反された制約条件を条件に合うようにソリューションを押すため、違反された制約条件にオフセットが追加されます。共役勾配手続きは繰り返されます。この全体のサイクルは収束するまで繰り返されます。

すべてがうまく行くなら、アルゴリズムは局所的な最小値に一点に集まります。この局所的最小値は、大域的な最小値であるとは限らず、また良い局所的最小値とも限りません。目的関数か制約関数のどちらかが微分可能でないなら、アルゴリズムはまさしくそのサブ最適解でしばしば立ち往生します、そして、この場合は警告はされません。

目的関数と制約関数の適切なスケーリングは、アルゴリズムの速くて正確な収束を確実にするために重要です。関数と変数がスケーリングされるべきであるので、ソリューションの領域のすべての変数に関するすべての関数の偏微分がほぼ+1と-1にあります。いつも非常に大きいか、またはいつも非常に小さい部分は、この領域にあるようにスケーリング
されるべきです。

「wn_nlp_conj_method」は制約つき非線型最小化問題を解決します。「objective」は最小にするための線形か非線形目的関数を指定します。「constrain_list」は線形、そして非線形制約条件の単独で繋がっているリストです。「objective」と一緒に「constrain_list」は解決すべき課題を包括します。タイプ「wn_linear_constrain_type」と「wn_nonlinear_constrain_type」のオブジェクトでそれらを構成しなければなりません。「num_vars」は問題の変数の数です。「objective」はwn_linear_constrain_type型であることができます。その場合はキャストを使用してlint警告を避けてください。
「solution_vect」は呼び出し側がソリューションに可能な限り近いベクトルを含むように初期化するべきであるベクトルです。終了の後に、「solution_vect」はソリューションを含みます。「val_min」は「solution_vect」に関する目的関数の値に設定されます。
「code」は実行のリターンステータスを含んでいます。「code」の潜在値に関する詳細に関しては「診断」というセクションを見てください。
「conj_iterations」は共役勾配アルゴリズムでの繰返し数を指定します。それを小さくし過ぎると、一貫性のない行動と非収束がもたらされます。それを大きくし過ぎると、CPU時間が浪費されます。しばしば「len」と同じ値に「conj_iterations」を設定するとうまくいきます。「offset_iterations」は制約条件オフセットを調整するために繰返し数を指定します。しばしば、10や20のような数はうまくいきます。「offset_adjust_rate」は、制約条件オフセットがどれくらい積極的に調整されるかを指定します。1は最も多く積極的に、0が調整を全く意味しないということです。「offset_adjust_rate」は(0,1]の範囲に常にあるべきです。線形問題やまたは非線形でも「穏やかに」非線形の問題では1は通常うまくいきます。大きすぎる値を使用すると不安定な非収束をもたらします。あまりに小さな値を使用すると、CPU時間を浪費します。「delta_vect」は呼び出し側が非線型制約条件のすべてのためのシンボリックな勾配を提供しない場合に、数値勾配を計算するためのデルタ値のベクトルです。すべての非線型制約条件にシンボリックな勾配があるなら、「delta_vect」をNULLに設定してください。数値微分関数はあなたのマシンのdouble型の数値精度の中で区別可能であるように、「delta_vect」に割り当てる値は十分大きくすべきです。が、微分中に高次のテーラー展開項が引き起こすエラーを最小にするため、限りなく小さくすべきです。

「wn_make_linear_constraint」は以下の形式の線形制約か目的関数を作ります。

weights[0]*solution_vector[vars[0]]+
weights[1]*solution_vector[vars[1]]+

weights[size-1]*solution_vector[vars[size-1]] 「rhs」

「size」は制約条件にかかわる変数の数を指定します。「rhs」は制約条件右手側です。制約条件が目的関数として使用されるなら「rhs」は無視されます。「comparison_type」はWN_EQ_COMPARISON、WN_GT_COMPARISON、またはWN_LT_COMPARISONのうちのひとつでなければなりません。目的関数が作成された場合は「comparison_type」の値はWN_EQ_COMPARISONでなければなりません。線形制約を作成した後に、呼び出し側は線形制約のベクトル「weights」と「vars」を設定しなければなりません。「vars」はサイズ「size」の整数アレイです。各エントリは制約条件に含まれている変数のインデックスを指定します。「weights」はサイズ「size」の2倍のアレイです。各エントリは「vars」の対応する変数に係数を指定します。
「wn_make_nonlinear_constraint」が非線型制約条件か目的を作ります。「size」は制約条件にかかわる変数の数を指定します。「comparison_type」はWN_EQ_COMPARISON、WN_GT_COMPARISON、WN_LT_COMPARISONのうちのひとつでなければなりません。目的関数が作成された場合は「comparison_type」の値はWN_EQ_COMPARISONでなければなりません。非線型制約条件を作成した後は、呼び出し側は「vars」、”pfunction”、ことによると”pgradient”、および「client_data」を設定しなければなりません。
「vars」はサイズ「size」の整数アレイです。各エントリは制約条件に含まれている変数のインデックスを指定します。”pfunction”は「vars」における、変数の非線型関数へのポインタです。実装された制約条件は以下のどれかです。

(*pfunction)(…) >= 0

(*pfunction)(…) < = 0

(*pfunction)(…) == 0

これは「comparison_type」の値に依存します。
“pgradient”は”pfunction”の勾配を「grad」に置きます。”pfunction”の勾配を理解するのに煩わされたくないなら、”pgradient”を設定しないでください。ドメイン値を「delta_vect」の量だけ差分をとるため”pfunction”を呼び出すことで、勾配は数値的に計算されます。これは遅い場合があります。「client_data」は制約条件で関連するべきユーザによって定義されたデータへのポインタです。

「wn_nlp_verbose」は「wn_nlp_conj_method」で出力する状態情報の量を制御します。0は全く出力しません。1はいくらか出力します。2はさらに出力します。 3は最も出力します。

収束問題

あなたが、最適化機構によって見つけられたソリューションが制約的なスペースの外にあるのを観測しているなら、目的関数を変更するのが必要であるかもしれません。基本的な考え方が目的関数を変更することであるので、それは碁の無限制約的な領域のどんな外部もしません。この変更は、2次ペナルティ関数であることを容認します。(各制約条件のために、加えられます) その結果、効くのに、最適化機構が制約的な領域の中でソリューションを見つけるので、それは、より簡単になります。

変更された目的関数は以下の性質を満たさなければなりません:
1) 変更された目的関数は制約的な領域の外の無限まで行きません。
2) 変更された目的関数は制約的な領域の境界で連続しています。
3) 変更された目的のスロープは制約的な領域の境界で連続しています。
目的関数が制約的な領域の境界に値+無限を持っているとき、この規則へのただ一つの例外は起こります。

例えば、F(x)がxがある目的関数であると仮定してください、> 0 制約条件とあなたが新しいFnew(x)を作成したがっているのに従って、それはF(x)よりよく一点に集まります。 x=0でs0がF(x)(dF/dx)のスロープの値であることをさせてください。そして、
定義

Fnew(x) = (x > 0.0) ? F(x) : ((x > -1.0) ? (s0*x) : (-s0))

は、あなたの収束問題を改良するかもしれません。

乗法、分割、log()、pow()を使用する複雑な目的関数によって、制約条件限界におけるこれらの演算子と関数の振る舞いの分析が収束を改良するのに必要であるかもしれません。以下に、これらの演算子と関数がどうそれらへの収束問題を避けるのを助けることができる収束問題と変更を引き起こす場合があるかに関するいくつかの簡単な例があります。

除算演算子の例

目的関数を

F(x, ….) = … + 1/x

とする。制約は、

x > 0

「1/x」項がFにある収束問題はxが反対側から0に近づくのに応じてFが無限まで行くということです。 xがプラス面から0に近づくのに応じてFが+ 無限まで行くのを観測してください。したがって、私たちは1/xを以下の関数に取り替えるべきです。

double my_reciprical(double x)
{
if(x > 0.0)
{
/* 強制的な領域の中で */
return(1.0/x);
}
else
{
/* 強制的な領域の外で: マッチ
強制的な領域の境界の関数値 */
return(FLT_MAX);
}
}

乗算演算子の例

目的関数は

F(x, y, ….) = …. + x*y

とする。制約は

x > 0
y > 0

とする。収束問題は以下の通りです。

1) いつ、x> 0とy手法無限、Fは無限まで行きます。
2) いつ、y> 0とx手法無限、Fは無限まで行きます。

乗算結果がマイナス無限まで行くのを防ぐために、そして、境界における関数値とスロープを保存するために、私たちは乗算関数を本関数に取り替えます。

double my_multiply(double x,double y)
{
double prod;

prod = x*y;

/* この判断命令は外で実施します。
領域だけを抑制して、制約的な領域の境界における
目的関数値とスロープを変わりがないままにします。*/
if(!(prod >= -1.0))
{
prod = -1.0;
}

return(prod);
}

除算演算子の例

目的関数を

F(x, y, …) = …. + x/y

とする。制約を

x > 0
y > 0

「x/y」項がある2収束冊がFにあります:

1) そして、yがプラス面から0に近づくのに従って、Fは+ 無限まで行きます(x>0であるなら)。
2) いつ、y> 無限Fが無限まで行かせる0とx手法

注意してください

x/y = x*(1/y)

私たちが分割に取って代わる上記の例を使用できるように

double my_divide(double x,double y)
{
return(my_multiply(x,my_reciprical(y)))
}

LOG関数の例

目的関数を

F(x,….) = …. + log(x)

とし、制約を

x > 1

とするとき、収束問題は以下の通りです。

1) log関数はx< =0のために定義されません。
2) xがプラス面のために0に近づくとき、Fは無限まで行きます。

制約条件xの限界=1において、log(x)が0とdlog(x)/d x=1と等しいのを観測してください。私たちがlog(x)を本関数に置き換えることによって、より良い収束性Fを作成できるように

double my_log(double x)
{
if(x > 1.0)
{
return(log(x))
}
else if(x > 0.0)
{
/* 関数値にマッチしてください、そして、境界で坂になってください。
制約的な領域について */
return(1.0*(x-1.0));
}
else
{
/* x=0で関数値にマッチしなさい、ただし、無限まで行くのを止めてください。*/
return(-1.0);
}
}

POW関数例

目的関数を

F(x,y,….) = …. + pow(x,y)

とし、制約を

x > 0
y > 0

とすると、収束問題は以下の通りです。

1. x<0、Fは虚数(むしろC言語では未定義)
2. y<0とx–>0、Fが+ 無限か-無限まで行くか、または未定義であるときに

したがって、私たちはpow(…)を本関数に取り替えます。

double my_pow(double x,double y)
{
if(x > 0.0)
{
return(pow(x,y));
}
else
{
/* 強制的な領域の境界で関数値にマッチしてください。
スロープがx=0で+ 無限と等しいので、スロープにマッチするのは
不可能です。
*/
return(0.0);
}
}

資源
wn_nlp_conj_method runs with

time = conj_iterations*offset_iterations*
stack memory = 1
dynamic memory = len

もちろん、この数字はおよそ時間の無は良い収束を達成するのが必要でないと言います。これは大いに解決されていることにおける問題、適切に「conj_iterations」、「offset_iterations」、および「offset_adjust_rate」を調整することにおけるユーザの技能、および問題の規模に依存します。

問題が合理的に振る舞って、よくスケーリングされるなら、1つは、通常、変数”len”の数の注文について何かに「conj_iterations」を設定して、「offset_iterations」を10や20のような何らかの数に設定できます。

作者は、ワークステーション時間の数時間後に1万の変数と5万の制約条件に関する非線型問題を解決するのにこのルーチンを使用し成功しました。また、このルーチンが大きい線形計画問題を解決できますが、数字の精度は、より専門化しているLPアルゴリズムのものほど良くはありません。

診断
コード=WN_SUCCESSは、最適条件が見つかり、正常終了したことを意味します。
コード=WN_SUBOPTIMALは、最適条件の前に終了したことを意味します。
コード=WN_UNBOUNDEDは、関数の制限がないことを意味します。

例題
「wnlib/acc/conjdir/examples.c.nlp」というファイルは、最小領域バッファリング問題を解決するために”wnnlp”という非線型制約つき最適化パッケージを使用します。以下に問題定式化があります。

問題の定式化:

選択せよ w[i] (1 < = i <= num_vars) 以下を最小化する目的で。
sum_over(i){ w[i] }
以下の制約条件を満足しながら。
for_all(i) { w[i] >= 0 }
sum_over(0< =i<=NUM_VARIABLE_BUFFERS){ w[i+1]/w[i] } <= MAX_DELAY
w[0] == DRIVER_BUFFER_SIZE
w[NUM_VARIABLE_BUFFERS+1] == RECEIVER_BUFFER_SIZE

バグ

他に参照すべき
wnconj, wnsplx, wnsll

著者
Will Naylor

phpへの関数組み込み法

基本的に「(・∀・)イイ!!Memo」様からのコピペ。

スナップショットの入手

http://snaps.php.net/からphp5.2のスナップショットを入手する。

プロトタイプの作成

ファイル名をsample_funcs.protoとし、以下を記述。
void omikuji() Return Fortune Telling result.
string orz([bool isCapital]) Return orz.

スケルトンの作成

解凍したら以下のように行う

$ cd ./ext
$ ./ext_skel –extname=sample_funcs –proto=sample_funcs.proto

79行目でエラーが出る場合にはext_skelスクリプトの79行目について、
skel_dir=`cd $skel_dir && pwd`

skel_dir=`cd $skel_dir`
に修正する。エコーバックが悪さしている模様。

sample_funcsディレクトリとコードが自動生成される。

各種ファイルの修正

$cd sample_funcs
$emacs config.m4
と行い16と18行目の先頭のdhlを削除する。

コンパイル準備

$cd ../
$./buildconf

関数コーディング

sample_funcs.cを編集し、中身をコーディング。

#include
#include

if (isCapital) {
RETVAL_STRING(”Orz”, 1);
} else {
RETVAL_STRING(”orz”, 1);
}
を挿入

コンパイル

$ cd ../..
$ ./configure –enable-sample_funcs
$ make

wnlibのインストール

wnlibのコンパイルは
http://mocapapa.press9.net/eoathaca2/
ここにあるように面倒だったため、正規(っぽい)場所にインストール。

まずヘッダファイルはacc/hにあるため、まず/usr/include/wnを作成し、その場所へコピー

# mkdir /usr/include/wn
# cp acc/h/*.h !$

次にライブラリ自体をリネームしてコピー

# mv acc/text.a /usr/lib/libwn.a
# ranlib !$

これによりコンパイル&リンクが以下のように簡単になる。

$ gcc -O -g example.c -o example -lwn -lm

ただし、ソース中のインクルードファイルの位置を以下のように変更する必要あり。

#include “wn/wnlib.h”

障害曲線の自動推定と表示

システムを3つに分解する。
(1)cronにより起動される部分。デイリーに障害数をデータベースから抽出し、ファイルに出力する。
(2)ファイルから検出日、障害個数を読み取り、logistic curveへのフィッティングを行い、パラメータを出力する。
(3)ユーザの起動による部分。logistic curveパラメータからグラフを作成し、表示する。

上記、(2)は(1)の後段に置いても良く、また(3)の前段に置いても良い。一般にカーブフィッティングは非線形方程式の最小二乗法による数値的な解法でありコスト高(時間がかかる)。そのため、(1)と組み合わせたほうが得。

つまり、システムは
cronにより起動される部分(1)+(2)と、ユーザにより起動される部分(3)の2つに大別される。

(1)障害数の抽出

データベースには障害の検出日、障害の原因その他が登録されているものとする。抽出には以下のSQLを使用する。

select to_days(`検出日`)-to_days('2008-01-16'), count(`検出日`) from incident where `解析結果` = `RTL障害` group by `検出日`;

なお2008-01-16は最初の障害検出日である。

以下はデータの一部to_days(`検出日`)-to_days('2008-01-16') count(`検出日`)
0 5
6 1
7 1
9 5
13 1
14 2
15 4
16 4
:

(2)カーブフィッティング

非線形最適化ソルバであるwnlibによるlogistic curveへのカーブフィッティングプログラムを開発した。logistic curveについては以下の記事を参照。
http://mocapapa.press9.net/logistic-curve/

以下の関数fは誤差の2乗和であり、fを最小化するようなパラメータa,b,cを求める。

object.jpg

ソルバからa, b, cのパラメータをファイルに出力する。以下に実行例を示す。
376.910824 -1.152615 0.011174

(3)表示

phpにより、ファイルからパラメータa,b,cを読み込み、logistic-curveのグラフを作成する。グラフはチャート作成ライブラリを用いる。以下に参考記事。
http://mocapapa.press9.net/phpeeeyayayee/

これでようやく手作業から開放され、障害曲線の自動推定と表示が可能となった。

保護されている記事:新築マンション

この記事はパスワードにより保護されています。閲覧するにはパスワードを入力してください: