スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。

DocTest(@PHP)

いやー旅行前ってのはダメですねー、全然寝れないorz

と言うわけで、朝までする事が無い状態なのでブログを更新更新(ブログがこんな位置づけでいいのか俺…)

今日は最近会社の方のサーバに実装してみて、それなりに使えるなーと思った

DocTest(for Maple4)

のご紹介。

まずDocTestとはなんぞや?と言うと、

『Unit Testを気軽に簡単に行えるもの』

と言うイメージです。

Unit Testって、関数単位で細かくホワイトボックステストを実施できる分、

やる気があればある程精度も上がっていきますし、バグを早期発見できると言う意味もあるので、エンジニアなら大体の人がお世話になっているかなと思います。

んで、そのUnit Testを気軽に行えると言うのがこの

『DocTest』

です。(要はPythonのアレです)

んで、

どこら辺が気軽なの?

と思うかもしれませんが、例えば以下のソースを見て下さい。

 
/**
* @file sample.php
* @brief サンプルです。
* @vertion
*/
class SampleClass
{
/**
* @brief hoge
* @param $val
* @return true
*/
function hoge($val)
{
return true;
}
}


上記のような、本当に何もしないクラス(&関数)があります。

んで、DocTestを適用した際のソースが以下

  
/**
* @file sample.php
* @brief サンプルです。
* @vertion
*/
class SampleClass
{
/**
* # hoge test
*
* #true(#f(123));
*

*
* @brief hoge
* @param $val
* @return true
*/
function hoge($val)
{
return true;
}
}


こんな感じで、Docコメントにテストケースを記述することによって、Unit Testが行えるものです。

上記の意味は、

  
# hoge test

テストケースタイトルみたいなものです、はしょってもOKです。



この中にテストケースを記述します。

#true(#f(123));

この関数(#f)に、引数(123)を与えた場合の期待値(true)をテストします。



このように、システムを開発して、その場ですぐにUnit Testを実施できるって言うのは、かなり助かりますよね。

また、上記の例では一つのテストケースのみでしたが、複数個テストケースを記述できます。

さてさて、これの実装方法ですが(このブログは実環境整備の説明は相当荒っぽいです、あしからず)

DocTestに必要な環境は、以下の通りです。

 

PHP 5.1.4以上

PEAR 1.4.3以上

PHPUnit3 以上



んではざっくり環境実装してみましょう。

  
# PEAR upgrade
$cd ~/
$mkdir temp
$cd temp
$sudo pear chanel-update pear.php.net
$sudo upgrade PEAR

# PHPUnit3 install
$sudo pear chanel-discover pear.phpunit.de
$sudo pear install phpunit/PHPUnit

# Maple4_DocTest install
$sudo pear install http://kunit.jp/maple4/Maple4_DocTest-0.2.0.tgz

(足りないものは適宜追加してください)
最後に

$pear list

で、正常にインストールされたか確認します。



さてさて、使い方ですが、

DocTestを行う際に必要なのは、コンパイルディレクトリと、クラスファイル、そして__BASEDIR__ファイルとなります。

DocTestは__BASEDIR__が指定されたディレクトリパスに存在していれば実行します。

(存在しなければ実行しません)

sampleとして、以下の様な構成をローカルに作成します。

 
/{home_dir}
┗sample/
┣src/
┃ ┣__BASEDIR__
┃ ┗SampleClass.php
┗test/
┣doc_test.php
┗doc_test_conf.php
┗compile/
┗__BASEDIR__

つわけで、それぞれのディレクトリ・ファイルを作成します。
 
$cd ~/
$mkdir -p sample/src/
$mkdir sample/test/compile/
$touch sample/src/{__BASEDIR__SampleClass.php}
$touch sample/test/doc_test.php
$touch sample/test/doc_test_conf.php
$touch sample/test/compile/__BASEDIR__

では、次にそれぞれのディレクトリ、ファイルの説明。

 
test/doc_test.php

DocTestの実行(トリガー)スクリプトを作成します。

(それぞれのソース内でDocTestを呼び出しても問題ないですが、トリガーを作っておくことで後ほど便利になったりしますんで)

(後、test/以下はsampleとして用意したものです。
実際に会社で他のプロジェクトメンバーに提供した形(だいぶはしょってますが)なので、
人によってはスクリプト実行時に引数を与える等、他にもトリガーの方法はあります。

あくまでこれは、一例として。。。)

/**
* @file doc_test.php
* @brief DocTestトリガースクリプト
* @vertion
*/
// Maple4へのPath(include pathを貼ってあること前提にしています)
require_once ('Maple4/DocTest.php');
require_once (dirname(_FILE_) . '/doc_test_conf.php');

if (strlen($lib_file) <= 0) {
error_log('ERR : faild lib path');
exit;
}

$options =array(
'compileDir' => dirname(_FILE_) . '/compile',
'color' => false,
'report' => null,
'forceCompile' => true,
'notify' => null
);

Maple4_DocTest::create()->run($lib_path, $options);
exit;
?>

/**
* @file doc_test_conf.php
* @brief doc_test.phpの設定ファイル
* @vertion
*/
// ライブラリファイルへのPath
$lib_file = '/*クラスファイルがあるディレクトリPath*/';

/* 省略 */
?>

設定ファイルのdoc_test_conf.phpに、Unit Testを行いたいclassがあるファイルへのPathを指定し、

$cd ~/
$php sample/test/doc_test.php

で、スクリプトを実行する事で、DocTestを走らせることが出来ます。

(まだこの段階では準備不足なので、errorになりますが)

次に、compile/以下に、__BASEDIR__の空ファイルを用意します。

そして、src/以下にも同様に、__BASEDIR__ファイルを用意し、ここにUnit Testを実行するclassを設置します。

/**
* @file sample.php
* @brief サンプルです。
* @vertion
*/
class SampleClass
{
/**
* # hoge test
*
* #true(#f(123));
*

*
* @brief hoge
* @param $val
* @return true
*/
function hoge($val)
{
return true;
}
}


これで、準備が整いました。

それでは、doc_test.php実行してみましょう。

  
PHPUnit 3.2.21 by Sebastian Bergmann.

.

Time: 0 seconds


OK (1 test)

上記みたいな感じになっていれば成功です。

UnitTestの結果、負であるならば、FAILURESが返却されます。

後は、なんか色々と細かいお作法みたいなのがあるっぽいんで、そこら辺は開発者ブログ辺りをあさって下さい。


注意:書くだけ書いて試してません(自宅のサーバには積んでいないので。上記で動かなかったら申し訳ありません。)

C#によるソケット通信(その2)

以前C#によるソケットを用いた非同期通信についての記事を書いたんですが、
書いてから(書いたのは3年程前ですかね?)今までの間、毎日の様にGoogleとかでC#による非同期通信の検索が行われ、何故かこのサイトが上位に来てしまっているというのもあり、

さすがにあの説明ではかわいそすぎるかなーというくらいお粗末なものだったんで、実際に俺がC#のソケットを用いた非同期通信の勉強をしている最中に作成したPGMをアップすることにします^^;

と言うか、メールとかで結構な頻度でもっと詳しく説明が欲しいと言う要望もずっとあがっていましたしね。。。

結構大きなシステムを勉強がてら作っていたんで、今回アップするのはそのシステムの中の非同期通信を行っている、client側のPGMとserver側のPGMだけをUPしています。

以下にアップしたPGMをそのまま貼り付けても、動かないのであしからず…

一応以下のPGMがシステム上どんな位置づけであるかと言うと、

client並びにserver側でシステム全てを制御する親Formが存在して、その親が通信を行う際に下記PGMを子Formとして呼び出しているものです。
(なので、以下のPGMにも親Formを呼び出している部分がありますのであしからず…

どんな感じで組むのかな?と言う足がかりになれば幸いだと思います。

つわけでPGM紹介

※client側PGM
http://blog-imgs-40.fc2.com/c/h/i/chindoutyuzakki/connectToExpertServer.txt

※server側PGM
http://blog-imgs-40.fc2.com/c/h/i/chindoutyuzakki/clientConnectServer.txt


中身の説明はちょいっと今日は時間が無いのでご勘弁を。。。

また、時間ができた時気が向いたらやろうかなーなんて思います。

どうしてもすぐ知りたいんだーって方はメッセージなりメールなりくださいまし。

以上、今日は本当に簡単ですがここまででorz

PHPでDebug(PEAR::Log)

職業がWebエンジニアと言うのと、メインで使っている言語がPHPなので、今日はPHPで何か話題がないかな〜と模索してみたところ、そういえばPHPのDebugって職場の周り見ても結構力技的なことやっていたので、あまりしらないのかな?と言うのもあり細々と紹介しますb

PHPで開発をしている人にお聞きしますが、Debugってどんな方法でやってたりしますか?

案外 print関数や、print_r関数、error_log関数でDebugしている人って多いんじゃないでしょうか?
(実際俺も結構最近までprintとか使って地道にDebugしていました。

もちろんprint関数とかは一番てっとり早くDebugできるので俺大好きですよb

さて、本題ですが、print以外のDebugの方法の一つで今日はPEAR::Logって言うPEARのライブラリを使ったDebug方法をば

PEAR::LogってPHPでログファイルを吐き出すときに結構用いられたりするものなのですが、このPEAR::Logクラス、なんとFirebugsにログを出力することができちゃったりするんです。
(Firebugsにログを出力できるようになったのは、つい最近のver1.9.11からですけどね)

んでゎ、実際にやりかたなのですが、
Firebugsと言うのもあるので、まずはFirefoxのアドオンであるFirebugsを入手しましょ〜(リンクは適当にぐぐってね

んで、次はPEAR::Logですが、

PEARを積んでいるのであるなら

pear install Log

あたりで取得してくださいまし、

後はopen_basedirを張ってあげれば準備OK

(ありとあらゆるところで不親切なのはこのサイトの特徴ということでw

んで、準備が整ったら以下の用に記述すればFirebugsにログを吐き出すことができます。

以下のソースはFirebugsでログを吐き出すところをピックアップしています、このソースをモジュール化してDebugする時だけ呼び出すのもよし、そのままペタペタと貼り付けるもよしお好きにb

---- 以下sample ----

<?php
require_once 'Log.php';
$fire_bug = &Log::singleton('firebug', 'test', 'PHP LOG', array('buffering' => true), PEAR_LOG_DEBUG);

// ワーニングレベル
$fire_bug->log('WARNING', PEAR_LOG_WARNING);
$fire_bug->warning('WARNING');
// いんふぉ
$fire_bug->info('INFO')
// でばっぐ
$fire_bug->debug('DEBUG');
// えらー
$fire_bug->err('ERROR');
// くりてぃかる
$fire_bug->crit('CRT');

$fire_bug->debug($_SERVER);

?>

---- sampleここまで ----

上記ソースをPHPが実行できる環境に貼り付けて、firefoxのfirebugsアドオンのコンソールを有効にして試してみてください。
(俺は最初感動しましたw

最初にsingleton(この名前見るとデザインパターンしか思い浮かばない俺。。。)関数でインスタンスを作成し、引数にぺこぺこと色々指定します。

第1引数 --- 出力ログの種類
第2引数 --- 名前
第3引数 --- 識別子
第4引数 --- ログオプション
第5引数 --- ログレベルの下限

後はその下にあるようにlog関数でログを出力させることができます。

こいつの便利なところは、Debug情報をいちいち実行結果としてページ出力しないでFirebugのコンソール上で確認することができ、ログレベルの下限を設定しておけば、Debugのレベルに応じて設定することでテスト効率が上がったりします。

以上うだうだと説明してきましたが、べんりそーだなーと思ったらつかってくださいまし〜

次時間があればFirePHPあたりの説明もしたいかなーと…(どーせ更新頻度が亀より遅いのであてになりませんがw

AjaxとPHP結合の初歩の初歩

最近忙しすぎる生活を送っていて、ついに不眠症になってしまい…

寝る事もできない状態で布団に入っているのももったいないから、久々に更新更新w

(つぶれてなかったんだって突っ込みはすんなよb

さてさて、今回の御代はAjax。

最近はやりのAjax。

プログラマを激しく泣かせるAjax。

俺の職業がWebエンジニアなだけに、避けては通れないAjax。

今日はそんなAjaxとPHPを連動させた、初歩の初歩な所のお話。

まずAjaxとはなんぞな?と言う方はサイドメニューにIT用語辞典のところ参照。

今回のお話はAjaxとPHPを連動させたいんだけど、ど〜やれば良いのかわかんNE!って言う、

駆け出しプログラマの支援的なお話なんで、興味ない人は無視でb

(ちなみに、サンプルで動くものを用意しようと思ったんだけど、

用意するのがめんどかったんで、ソースのサンプルしかのせません)

AjaxとPHPとを結合させるのは、結構お決まりなパターンとなっているので、

最初にやり方さえ覚えれば後はコピペでいけるものです。

簡単な解説をつけながらいきます

んでゎ、まず、Ajaxと言うのはJavaScriptの派生(厳密に言うと大きく違うけど)なので、JSの方式で記述します。

そしてAjaxは非同期通信に寄るページの動的変化を指すので、JavaScriptでHttpオブジェクトを生成しないといけません。

以下はHttpオブジェクトを作成するサンプルです。

function getHttpObject()
{
 var xml_http;
 if (window.ActiveXObject) {
  try {
   xml_http = new ActiveXObject("Msxml2.XMLHTTP");
  } catch(e) {
   try {
    xml_http = new ActiveXObject("Microsoft.XMLHTTP");
    } catch(e) {
     xml_http = false;
    }
   }
  } else if (window.XMLHttpRequest) {
   try {
    xml_http = new XMLHttpRequest();
   } catch(e) {
    xml_http = false;
   }
  }
 return xml_http;
}

(うーん、Webに乗せるとインデントがぐちゃぐちゃですな。。。

さてさて、上記でやたらと if を使って条件を分けてなにやらしていますが、

これは、ブラウザを判定してやって、そのブラウザにあった、Httpオブジェクトを作成しています。

それぞれの関数の意味に関しては別途調べてやってください、ここでは解説しません。

これで、非同期通信用のHttpオブジェクトの生成が完了しました。

次は、このHttpオブジェクトを使って、実際に非同期通信を行います。

以下はサンプル

function editPictureMain(id)
{
 var http_obj = getHttpObject();
 var file_st = {$local_url};
 openFile(file_st, http_obj);
 http_obj.setRequestHeader('Content-Type', 'utf-8');
 http_obj.setRequestHeader("If-Modified-Since", "01 Jan 1970 00:00:00 GMT");
 http_obj.onreadystatechange = function()
 {
  if (http_obj.readyState == 4 && http_obj.status == 200) {
   document.getElementById("edit_window").innerHTML = measureGarbleText(http_obj);
  }
 }
 http_obj.send(null);
}

function openFile(open_file_st, http_obj)
{
 http_obj.open("GET", open_file_st, true);
}

function measureGarbleText(http_obj)
{
 var response_text = http_obj.responseText;
 if (navigator.appVersion.indexOf("KHTML") > -1) {
  var esc = escape(response_text);
  if (esc.indexOf("%u") < 0 && esc.indexOf("%") > - 1) {
   response_text = decodeURIComponent(esc);
  }
 }
 return response_text;
}

ぉぉ、、、これを全部解説するのか・・・めんどくせーwww

てなわけで、詳しく解説しませんwww(マテ

ここでメインなお話になるのは、AjaxとPHPとの結合な訳なんで、

そこだけかいつまんで説明します。

上記プログラムから、

 var file_st = {$local_url};

と書かれている部分を探してみてください。

ここは、何をしているのか?というと、開きたいURLのPathを書きます。

段々お分かりになってきたと思いますが、ここで出している例は、

非同期通信にて、{$local_url}、つまり、指定したURLを取得し、表示しようとしています。

つまり、{$local_url}がPHPで構成されたページであれば、そこからPHPを呼び出します。

んで、実際にURLを呼んでいるところが

http_obj.open("GET", open_file_st, true);
(openFile関数)

です。

ここで、ページのオープンを行って、

http_obj.onreadystatechange = function()

ここで通信を見ます。

最後に、受け取った結果を javascriptの innerHTMLで画面に出力すると言う流れです。

ちなみに、何をinnerHTMLで出すのか?と言うと、

PHP側(開いたページのURL)で出力する値です。

PHPが、smartyを出力していれば、smartyの内容を。

PHPでechoしていれば、echoの内容も含め、ページに表示すべきもの全てをinnerHTMLで書き出すサンプルとなっています。

ああ、、、だんだん眠くなってきた・・・(ぉぃ

てなわけで、実際のソースのところのサンプルは記述したんで、後は読み取ってくださぇw

もし、詳しく解説してくれーってのがあったらご一報願いますv

んでゎ、今日はここまでw

んー…暇があればスパムつぶしでもしてみっかな

さてさて、めさくさ久々な日記更新。。。(どんだけさぼってんだ俺…。

毎日毎日、プロとしてプログラマーな仕事(SEも両方こなすけど)をやってると、どうも自分の時間がもてなくてブログとかおざなりになってしまっていて、久々に自分のブログを見て見たら・・・

あるゎあるゎ、スパムの数数…

ん〜なんでスパムの類は『エロ』と言う言葉を武器にやってくるんでしょーね?

んなわけで、勝手にコメント欄を汚されたんで、こっちも勝手にあっちのサイトに攻撃をしかけ・・・・

ある程度の嫌がらせを・・・と(笑

さて、攻撃方法といっても色々あるんですよね。

最近スクリプトキディなるものが多すぎるせいで、色々と俺のパソにも侵入してくるつわものもおりますが…。

んで、webにあんまりこういう話をするのはご法度な気がしますが、簡単なサイト攻撃方法でも

まず一番簡単な方法といえばF5アタックでしょうか。やりかたは簡単。サイトを開いてF5を連続で押すだけ。

サイトってのはサーバ上に乗っかっているんで、利用者がページを見るときにこのページが見たいですよーとサーバにメッセージを送ります。(これをリクエストと言う

ソレに対し、それじゃこのページを見てくださいとサーバが利用者側に返し、初めてブラウザ上でサイトを見ることが出来ます(これをレスポンスと言う

んで、基本サーバもコンピュータな訳ですから限界があります、大量のリクエストがあればそれにあったレスポンスを大量に返さなければなりません。

んで、その大量のレスポンスが発生する際に、コンピュータがクラッシュしてしまうという現象が起きます。

F5アタックはそれを引き起こす感じですね(とはいっても一人の人間がサーバをF5アタックだけで落とすなんて至難の業ですが

あんま聞いても実感がわかないと思いますが、例えばニュース系のサイトで個人のページにリンクが張ってあってそれを見に行くとやたら重かったり、

最近ではよく芸能人のブログが炎上してて、それを見に行こうとしたときやたら重かった経験とかないですか?

その重い原因がまさにリクエスト-レスポンスが大量に発生してサーバクラッシュが起きてしまったのです。

んじゃG○○gleやYah○○は大量のアクセスがあるのになんで落ちないか?と言うとそれはVPNとかロードバランサを駆使しているからですね(この話はまたおいおいにでも



後、簡単にやれることとしてはping攻撃ですかね

コマンドプロンプトを開いて

ping www,yahoo,co,jp

とかでも入力して見てください(ヤリスギ注意)

なんか、Reply from ○○○ とか出てきましたよね?

これは上記であげたリクエストみたいなもんです(厳密にはかなり違いますがそーおもっとけば良いです

これも大量にやられると、サーバがリクエストを抱えすぎてクラッシュしちゃいます。

(とはいってもやっぱり個人がやるには無理がありますがね

んじゃ個人で攻撃するにはどーすりゃいいんだよ!ってなるかもしれませんが…(てかこういうこと語っていいのだろうか。

まぁ、ありふれたやり方、簡単に攻撃を防げるやり方をかいておくと

たとえば、以下のようなコードを書けば簡単に大量にリクエストを投げれます

for (;;;) {
print {ping文}
}

(細かくは書きません、調べるもやるも自己責任で)

まぁ、こんなことやれば直ぐにアクセス禁止にあったり、身元割り出されちゃいますがね。。

最近のスクリプトキディは少しは力をつけているみたいで、もっともっとひねったやり方をしているみたいです。(手口は簡単なもんですが

って、俺久々に更新しといてなんて記事を書いてるんだ…
そろそろ自粛のためやめやめ。
カレンダー
04 | 2012/05 | 06
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
最近の記事
最近のコメント
最近のトラックバック
カテゴリー
月別アーカイブ
ブログ内検索
リンク
ご意見・ご感想

名前:
メール:
件名:
本文:

記事に出てきたIT用語

カウンター

プロフィール

Author:YUW
とある、某大手でてきと〜にWebエンジニアやってたりする。
口癖は
『仕様書に落ちてませんが何か?』
『今日も適当に華麗にスルーするぜぃ』
『そのコード綺麗だねぃ』
『なんで俺はこんな汚いコードしかかけねーんどぅぁぁぁぁ』

日々積み重なるストレスから開放される為に、掃き溜めとしてサイドコンテンツであるこの【雑記な珍導駐】を開設する。

暇があれば一票どぞ!

FC2 Blog Ranking

ブロとも申請フォーム

この人とブロともになる