2005-06-26
「知らぬ存ぜぬは許しません」
2005-03-06
CppUnit のメイン関数を作成する
#include <cstdlib>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
int main(int argc, char *argv[]) {
CppUnit::TextUi::TestRunner runner;
CppUnit::TestFactoryRegistry
®istry = CppUnit::TestFactoryRegistry::getRegistry();
runner.addTest(registry.makeTest());
bool wasSucessful = runner.run("", false);
return wasSucessful ? EXIT_SUCCESS : EXIT_FAILURE;
}
コマンドライン引数で実施するテストを指定できるようにしたのが、次のソース
です。
コマンドライン引数を指定しないと、通常通り、すべてのテストが実施されます。
また、存在しないテスト名称をコマンドライン引数に指定すると、テスト名称の
一覧が表示されます。
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <cppunit/Test.h>
#include <cppunit/TestSuite.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
void printTests(CppUnit::Test *test, std::string indent = std::string()) {
std::cerr << indent << test->getName() << std::endl;
CppUnit::TestSuite *suite = dynamic_cast<CppUnit::TestSuite *>(test);
if (suite) {
for_each(suite->getTests().begin(),
suite->getTests().end(),
bind2nd(ptr_fun(printTests), indent + " "));
}
}
CppUnit::Test *findTest(CppUnit::Test *test, const std::string &name) {
if (name == test->getName()) {
return test;
}
CppUnit::TestSuite *suite = dynamic_cast<CppUnit::TestSuite *>(test);
if (suite) {
for (std::vector<CppUnit::Test *>::const_iterator
iterator = suite->getTests().begin();
iterator != suite->getTests().end();
++iterator) {
CppUnit::Test *found = findTest(*iterator, name);
if (found) {
return found;
}
}
}
return NULL;
}
int main(int argc, char *argv[]) {
CppUnit::TextUi::TestRunner runner;
CppUnit::TestFactoryRegistry
®istry = CppUnit::TestFactoryRegistry::getRegistry();
CppUnit::Test *allTests = registry.makeTest();
if (argc > 1) {
for (char **namePtr = &argv[1]; namePtr < &argv[argc]; namePtr++) {
CppUnit::Test *test = findTest(allTests, *namePtr);
if (test) {
runner.addTest(test);
} else {
printTests(allTests);
return EXIT_FAILURE;
}
}
} else {
runner.addTest(allTests);
}
bool wasSucessful = runner.run("", false);
return wasSucessful ? EXIT_SUCCESS : EXIT_FAILURE;
}
さらに、テスト名称を glob(7) のワイルドカードパターンで指定できるように
したのが、次のソースです。
赤色の部分が、直前のソースからの変更部分です。
#include <fnmatch.h>
#include <cstdlib>
#include <memory>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <cppunit/Test.h>
#include <cppunit/TestSuite.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
void printTests(CppUnit::Test *test, std::string indent = std::string()) {
std::cerr << indent << test->getName() << std::endl;
CppUnit::TestSuite *suite = dynamic_cast<CppUnit::TestSuite *>(test);
if (suite) {
for_each(suite->getTests().begin(),
suite->getTests().end(),
bind2nd(ptr_fun(printTests), indent + " "));
}
}
CppUnit::Test *findTest(CppUnit::Test *test, const std::string &name) {
if (fnmatch(name.c_str(), test->getName().c_str(), FNM_CASEFOLD) == 0) {
return test;
}
CppUnit::TestSuite *suite = dynamic_cast<CppUnit::TestSuite *>(test);
if (suite) {
std::auto_ptr<CppUnit::TestSuite> result(new CppUnit::TestSuite());
for (std::vector<CppUnit::Test *>::const_iterator
iterator = suite->getTests().begin();
iterator != suite->getTests().end();
++iterator) {
CppUnit::Test *found = findTest(*iterator, name);
if (found) {
result->addTest(found);
}
}
if (result->countTestCases() > 0) {
return result.release();
}
}
return NULL;
}
int main(int argc, char *argv[]) {
CppUnit::TextUi::TestRunner runner;
CppUnit::TestFactoryRegistry
®istry = CppUnit::TestFactoryRegistry::getRegistry();
CppUnit::Test *allTests = registry.makeTest();
if (argc > 1) {
for (char **namePtr = &argv[1]; namePtr < &argv[argc]; namePtr++) {
CppUnit::Test *test = findTest(allTests, *namePtr);
if (test) {
runner.addTest(test);
} else {
printTests(allTests);
return EXIT_FAILURE;
}
}
} else {
runner.addTest(allTests);
}
bool wasSucessful = runner.run("", false);
return wasSucessful ? EXIT_SUCCESS : EXIT_FAILURE;
}
まだまだ改善の余地がありそうですが、今日のところはこのくらいで勘弁してく
ださい。
2005-01-30
透明になりたい
2005-01-18
さよなら mod_jk2
新年明けましておめでとうございます…って今日は何日ですか。
しばらく Java から遠ざかっていましたが、最近、徐々に復活です。
で、いろいろ調べていて目に止まったのがこの mod_jk2 が開発中止 というニュースです。 えらい古い話ですみません。 ニュースの内容を要約すると 「作ってても、おもろないし、ユーザさんからも評判がようないので、もう 止めや。 後継は、Apache 2.1/2.2 の mod_proxy_ajp モジュールや。 他のウェブサーバについては、mod_jk の方を使うてや。 mod_jk2 のコードの多くは、mod_jk に移植したったさかいに」 という感じでしょうか。
2004-12-30
Clam AntiVirus でウィルススキャン
年末なので、メールのウィルススキャンを行うことにしました。 Postfix + amavisd-new + clamav というよくある構成です。 ついでに SpamAssassin も amavisd-new から起動させることにしました。 procmail から起動させるよりは軽いと 思ったからです。 これもありがちですね。
検知したウィルスメールやスパムメールは、 amavisd-new で隔離・廃棄させずに procmail で 振り分けをおこなうことにしました。 使うのは自分一人だけだし、この方が、ウィルス/スパムメールの確認と削除が 簡単だからです。
ソフトのインストールは、すべて gentoo の Portage を使って実施しました。 現時点での関係するソフトウェアのバージョンは、以下の通りです。
- postfix-2.1.5
- amavisd-new-20040701
- clamav-0.80
- spamassassin-3.0.2
- procmail-3.22
以下は、/etc/amavisd.conf をデフォルトから変更した部分です。
$mydomain = 'うちのサブドメイン';
$hdr_encoding = 'iso-2022-jp';
$bdy_encoding = 'iso-2022-jp';
# 検出したウィルスやスパムメールを廃棄しない
$final_virus_destiny = D_PASS;
$final_banned_destiny = D_PASS;
$final_spam_destiny = D_PASS;
$final_bad_header_destiny = D_PASS;
# コメントにしてウィルスメールを保存しないようにする。
#$QUARANTINEDIR = "$MYHOME/quarantine";
# spamassassin の AWL を使用する。
$sa_auto_whitelist = 1;
# 以下を設定しないと、clamd でなく、clamscan コマンドが使用されてしまう。
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/tmp/clamd"],
qr/\bOK$/, qr/\bFOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
2005.12 追記: "/tmp/clamd" が "/var/run/clamav/clamd.sock" に変更されるなど、この設定は今では古いものになっています。
Postfix の設定などは、 amavisd-new 付属のドキュメント(README.postfixなど) の通りに実施しました。
以下は、~/.procmailrc の関係する部分です。
MAILDIR=$HOME/Maildir INFECTED=$MAILDIR/infected/ BANNED=$MAILDIR/banned/ SPAM=$MAILDIR/spam/ DOUBT=$MAILDIR/doubt/ :0: * ^X-Amavis-Alert: INFECTED $INFECTED :0: * ^X-Amavis-Alert: BANNED $BANNED :0: * ^X-Spam-Level: \*\*\*\*\*\*\*\*\*\*\*\*\*\*\* $SPAM :0: * ^X-Spam-Status: Yes $DOUBT
そんなこんなで、HTML.Phishing.Bank なウィルスメール?が頻繁に捕獲されるよ うになりました。
2004-12-27
Pyzor の不思議
以前、ペンディングにしていた Pyzor をインストールしてみま した。
ファイアウォールの UDP 24441 ポートを開けてから、Pyzor をインストールし ます。 私は、今、gentoo 君を使っているので、 Portage からインストールしました。 その後、まず最初に、以下を実行してサーバとの接続を確認します。
$ pyzor ping downloading servers from http://pyzor.sourceforge.net/cgi-bin/inform-servers-0-3-x 217.160.253.84:24441 (200, 'OK')最初の downloading で始まるメッセージが HTTP GET リクエストを発行してサー バのアドレスを取得していることを示しています。 この時点で、ファイル ~/.pyzor/servers が作成されます。 OK とのことなので、サーバとの接続は、問題ないようです。
それから、以下を実行して Pyzor の動作を確認します。
$ pyzor check < 適当なスパムメールファイル 217.160.253.84:24441 (200, 'OK') 12286 0上記で出力されている 12286 が spam としてレポートされている数、その後の 0 が whitelist としてレポートされている数です。 ちゃんと動いているようです。
SpamAssassin は、デフォル トの設定で Pyzor を自動認識して使用するようになっているので、 SpamAssassin から Pyzor を利用するのに、特別な設定は必要ありません。
$ spamassassin -t < スパムメールファイルと、先程のスパムメールを喰わせてみて、出力されるレポートに PYZOR_CHECK が記載されていることを確認しました。
最後に、念のために、pyzor discover コマンドを cron で定期的に動かすよう にしておきました。
ところで、Pyzor について調べていて気になったのが、「Pyzor は UDP と TCP の両方の 24441 ポートを使用する」と記述されれいるサイトがいくつかある ことです。 例えば、 ここ には、クライアントからサーバへの接続は UDP で行い、サーバからクライアン トへの応答は TCP コネクションを使う、という摩訶不思議なことが記述されて います。 Pyzor のソースをざっと見た限りでは、普通に UDP だけで通信しているような のですが…。 これは、どうゆうことなんでしょう? 教えて、えらいひと。
2004-12-24
mrxvt へ乗り換え
私は、ここ何年もの間、X端末エミュレータには rxvt を使い続けてきました。 その間、他の多機能な端末をいくつか試して見て、中には一時的に(一週間ぐら い)使って見たものもありますが、いくつかの理由で結局 rxvt に戻っていました。
そんな私が、ようやく乗り換えようと思った端末エミュレータがあります。 mrxvt です。 この端末エミュレータ、タブ機能が特徴ですが、
mrxvt -tnum 2 \
-vt0.tt hogehoge -vt0.ss "slogin hogehoge" \
-vt1.tt fugafuga -vt1.ss "slogin fugafuga"
とかで、起動時にセッションを指定できることや、キー操作でタブの切替えやタ
ブのタイトル変更が容易にできるところが特に気に入りました。
もちろん、このあたりの機能は、gnome-terminal とかの方が上でしょうが、
gnome-terminal に比べると
mrxvt は断然、軽いです。
それに些細なことですが、 gnome-terminal など最近の端末エミュレータは、
コンソール出力の機能(伝統的な
xterm の -C オプショ
ン)をサポートしていないのがいただけません。
[Read More!]
2004-12-19
[Gentoo Linux] シングルユーザモードでブートする
Gentoo くんをシングルユーザモードで起動しようと、カーネルパラメータに single を指定してブートしました。 起動画面を見ながらコーヒーをすすっていると、あらら、なぜかマルチユーザモードで起動されてしまいました。
Geontoo の Forum を検索すると、同様の悩みを持った方が、何人か居られるようです。 解決方法は見付けられませんでしたが、 genkernel でカーネルを構築した時に、この現象が発生することがわかりました。そこで、 man genkernel しました。基本ですね。
INITRD OPTIONSThe following options can be passed as kernel parameters from the boot-
loader, which the initrd scripts would recognize.
....
real_init=<...>
Passes arguments to init on bootup.
そのものズバリが記述されていました。
シャットダウンして、カーネルパラメータに real_init=single を指定してブートすると、無事、シングルユーザモードで起動されました。
2005.12 追記: いつのころからか real_init=single を指定してもシングルユーザモードでブートしなくなっていました。 real_init=1 とかだとうまくいくみたいですが、深くは追求していません。
せっかくなので、Geontoo の Forum にリプライをポストしてみました。英語はメチャクチャですが、Please forgive my poor English ってことで。
起動手順をまとめておきます。
[Read More!]2004-12-17
体重であそぼ
「ふっふっふ、また減った」
私は、以前、太っていた。 ふとしたきっかけで、食事を減らすことにした。 それからというもの、計るたびに体重がどんどん減っていった。 これは面白い。 計ることがこんなに楽しいことだとは思わなかった。
「また一緒だ」
しかし、そんな楽しい日々も長くは続かなかった。 ちょうど50kgになったころから、まったく減らなくなった。 この何ヶ月もの間、50kg前後を行ったり来たり。 項垂れる毎日。 計る楽しみがすっかりなくなってしまった。
「今日の予想は49.8kg…」
計る楽しみを取り戻そうと、事前に予想してから計ることにした。 しかし、当たっても大してうれしくないし、外れてもさほど悔しくない。 苦悩の日々が続く。 計る楽しみは、永遠に失われてしまったのであろうか。
2004-12-10
[Gentoo Linux] esync を cron で動かす(その3)
esearch が 0.6.2 から 0.7 にバージョンアップされました。
esync コマンドに新しいオプション --nospinner (-s) が追加されています。 これを指定すると、esync コマンドが eupdatedb コマンドを呼び出すときに --quiet (-q) オプションを付けるようになります。
これまで esync を cron で動かして、実行結果をメールで受け取るために、 sed を使って esync スクリプトの eupdatedb コマンド起動部分に -q オプションを 付けるように改変して実行していたのですが、こんな小細工は不要になりました (以前、作成した cron 用スクリプトは、動作しなくなりました)。
ということで、esync コマンドを普通に -n -s オプションを付けて呼び出すように、 cron 用スクリプトを修正しました。
2004-11-28
regionsetを使って輸入版のDVDを観る
安さにつられて、さして考えもせずに、輸入版のDVDを買いました。 昨日、届いたので、さっそく観ようとしたところ、我が家のDVDプレイヤー君が「このDVDは、観れましぇん」とおっしゃられる。 改めて、amazonの購入ページを見ると、「日本国内(リージョン 2)用のDVDプレーヤーでは 再生できません」と、ちゃんと書いてあります。 私が馬鹿でした、ごめんなさい。
しかし、せっかくお金を出して買ったものを、あきらめてしまってはもったいないです。 自慢ではないですが、私はせこい人間です。 regionsetを使ってPCのDVDドライブのリージョン番号を変更して、PCで観ることにしました。 PCでは、さすがに音はいまいちですが、無事に観れたのでよしとします。 うん、今日は、このくらいで勘弁してやろう。
2004-11-27
ロボットキャラ占い
2004-11-22
アニメキャラ占い
2004-11-14
[music] 『おうちが火事だよ! ロマンポルシェ。 』
2004-11-07
[Gentoo Linux] sys-apps/groff
sys-apps/groff を 1.18.1-r4 から 1.19.1-r2 にバージョンアップしたところ、日本語のマニュアルページが表示されなくなってしまいました。 /usr/portage/app-i18n/manpages-ja/manpages-ja-20040915.ebuild を見ると、
DEPEND="!>=sys-apps/groff-1.19
=sys-apps/groff-1.18*
sys-apps/man"
とあるので、sys-apps/groff-1.19 は、今のところ日本語未対応のようです。
とりあえず、 sys-apps/groff を 1.18.1-r4 に戻して、/etc/portage/package.mask に
=sys-apps/groff-1.19.1-r1 =sys-apps/groff-1.19.1-r2と記述して、emerge -u system などで sys-apps/groff がバージョンアップされないようにしました。

