| 1 | 2 | 3 | 4 | Next»

2005-06-26

「知らぬ存ぜぬは許しません」

奥崎謙三氏死去 - 不謹慎ですが、まだ生きておられたんですか? とっくに亡くなられたと思っていました。 ともあれご冥福をお祈りいたします。合掌。
22:43:33 - Permalink

2005-03-06

CppUnit のメイン関数を作成する

次に示すソースが Cookbook などに記載されているものとほぼ同等の 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
        &registry = 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
        &registry = 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
        &registry = 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;
}
まだまだ改善の余地がありそうですが、今日のところはこのくらいで勘弁してく ださい。
18:47:42 - Permalink

2005-01-30

透明になりたい

X.orgComposite Extension でちょっとだけ遊んでみました。 とりあえずは楽しめましたが、まるでスーパースロー映像を見て いるかのような遅さです orz。 実用には、NVIDIA とか のビデオカードを使わないとだめかしらん。
12:43:05 - Permalink

2005-01-18

さよなら mod_jk2

新年明けましておめでとうございます…って今日は何日ですか。

しばらく Java から遠ざかっていましたが、最近、徐々に復活です。

で、いろいろ調べていて目に止まったのがこの mod_jk2 が開発中止 というニュースです。 えらい古い話ですみません。 ニュースの内容を要約すると 「作ってても、おもろないし、ユーザさんからも評判がようないので、もう 止めや。 後継は、Apache 2.1/2.2 の mod_proxy_ajp モジュールや。 他のウェブサーバについては、mod_jk の方を使うてや。 mod_jk2 のコードの多くは、mod_jk に移植したったさかいに」 という感じでしょうか。

mod_jk2 については、ちょっと調査した ので、 感慨深いです。

22:48:05 - Permalink

2004-12-30

Clam AntiVirus でウィルススキャン

年末なので、メールのウィルススキャンを行うことにしました。 Postfix + amavisd-new + clamav というよくある構成です。 ついでに SpamAssassinamavisd-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 なウィルスメール?が頻繁に捕獲されるよ うになりました。

13:53:06 - Permalink

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 だけで通信しているような のですが…。 これは、どうゆうことなんでしょう? 教えて、えらいひと。

16:49:40 - Permalink

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!]
19:29:10 - Permalink

2004-12-19

[Gentoo Linux] シングルユーザモードでブートする

Gentoo くんをシングルユーザモードで起動しようと、カーネルパラメータに single を指定してブートしました。 起動画面を見ながらコーヒーをすすっていると、あらら、なぜかマルチユーザモードで起動されてしまいました。

Geontoo の Forum を検索すると、同様の悩みを持った方が、何人か居られるようです。 解決方法は見付けられませんでしたが、 genkernel でカーネルを構築した時に、この現象が発生することがわかりました。

そこで、 man genkernel しました。基本ですね。

INITRD OPTIONS
The 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!]
15:45:18 - Permalink

2004-12-17

体重であそぼ

「ふっふっふ、また減った」

私は、以前、太っていた。 ふとしたきっかけで、食事を減らすことにした。 それからというもの、計るたびに体重がどんどん減っていった。 これは面白い。 計ることがこんなに楽しいことだとは思わなかった。

「また一緒だ」

しかし、そんな楽しい日々も長くは続かなかった。 ちょうど50kgになったころから、まったく減らなくなった。 この何ヶ月もの間、50kg前後を行ったり来たり。 項垂れる毎日。 計る楽しみがすっかりなくなってしまった。

「今日の予想は49.8kg…」

計る楽しみを取り戻そうと、事前に予想してから計ることにした。 しかし、当たっても大してうれしくないし、外れてもさほど悔しくない。 苦悩の日々が続く。 計る楽しみは、永遠に失われてしまったのであろうか。

22:04:43 - Permalink

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 用スクリプトを修正しました。

22:56:06 - Permalink

2004-11-28

regionsetを使って輸入版のDVDを観る

安さにつられて、さして考えもせずに、輸入版のDVDを買いました。 昨日、届いたので、さっそく観ようとしたところ、我が家のDVDプレイヤー君が「このDVDは、観れましぇん」とおっしゃられる。 改めて、amazonの購入ページを見ると、「日本国内(リージョン 2)用のDVDプレーヤーでは 再生できません」と、ちゃんと書いてあります。 私が馬鹿でした、ごめんなさい。

しかし、せっかくお金を出して買ったものを、あきらめてしまってはもったいないです。 自慢ではないですが、私はせこい人間です。 regionsetを使ってPCのDVDドライブのリージョン番号を変更して、PCで観ることにしました。 PCでは、さすがに音はいまいちですが、無事に観れたのでよしとします。 うん、今日は、このくらいで勘弁してやろう。

23:01:59 - Permalink

2004-11-27

ロボットキャラ占い

スター○ォーズのC3P○ … C-3POは、600万を超す宇宙言語や暗号などの通信手段に精通しています。 http://www.asahi.com/ad/clients/starwars/sasaki2.html の「科学の目」によると、C-3POに必要なメモリーは、約1000テラバイト、DVD 20万枚分だそうです。 英和辞書を約100メガバイトと仮定して、英和・和英で1言語につき200メガバイト、その600万倍から弾き出した数字のようです。 なんか「世界まるごとHOW MATCH?」を思い出しました。 これが「科学の目」ですか、本当にそれでいいんですか、朝日新聞社さん。いや別にいいんですが。
23:26:31 - Permalink

2004-11-22

アニメキャラ占い

ル○ン三世 … ルパン三世の足は細い。トイレットペーパーの芯よりも細い。俺の運も細い。カッペリーニよりも細い。そして、○ンコも細い。
23:15:48 - Permalink

2004-11-14

[music] 『おうちが火事だよ! ロマンポルシェ。

みかじめ料は、ちゃんと払わないとね。安心して商売を続けていくためにも。お礼参りとかも恐いし、痛いのはやだな。払わないとラジカセとか持って家に乱入されそうだし、枕元でエコー音とか聞かされたら、もっと嫌だよな。
22:30:39 - Permalink

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 がバージョンアップされないようにしました。

12:19:07 - Permalink

| 1 | 2 | 3 | 4 | Next»