« 2008年03月 | メイン | 2008年05月 »

2008年04月18日

C++ テンプレートを使って高速な高機能サーバを書く方法

 「C++ のメンバ関数ポインタって何のためにあるの」という質問を耳にすることがあります。実際は、たとえばステートマシンを書くのに便利なのですが、ちょうどサイボウズ・ラボの C++ 熱が盛り上がっていることもあり、昔の作ったサーバフレームワークを再実装してみました。ちなみにもともとは、1990年代に東京大学駒場キャンパスで使われていた friends というサービスのバックエンドだった、finger プロキシ用に書いたコードです。ソースコードは /lang/cplusplus/friends_framework - CodeRepos::Share - Trac においてあります。特徴は以下のとおり:

  • シングルスレッド、select(2) ベースによる実装
  • C++ テンプレートとメンバ関数ポインタによるステートマシン化
  • タイムアウト処理の容易な組み込み

 実際の処理をどのように書くかは、test/proxy.cpp をご覧いただければいいと思います。これは TCP の L4 Proxy を実装したものですが、関数ポインタとフラグの切り替えによって、転送処理とタイムアウト処理を実装しています。

続きを読む "C++ テンプレートを使って高速な高機能サーバを書く方法"

投稿者 kazuho : 2008年04月18日 16:39 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年04月17日

C++ テンプレートで(いまさら)FizzBuzz

re C++テンプレートでFizzBuzz - おびなたのはてな日記

 C++ テンプレートで if を定義しているのは面白いと思いましたが、一方で FizzBuzz を実現するためのコードとして見た場合は冗長じゃないかと思ったので、自分でも書いてみました。こんな感じ。

#include <iostream>

using namespace std;

template<int N, int Mod3=N%3, int Mod5=N%5> struct Print {
  Print() {
    cout << N << endl;
  }
};

template<int N> struct Print<N, 0, 0> {
  Print() {
    cout << "FizzBuzz" << endl;
  }
};

template<int N, int Mod5> struct Print<N, 0, Mod5> {
  Print() {
    cout << "Fizz" << endl;
  }
};

template<int N, int Mod3> struct Print <N, Mod3, 0> {
  Print() {
    cout << "Buzz" << endl;
  }
};

template<int N> struct FizzBuzz {
  FizzBuzz() {
    FizzBuzz<N-1>();
    Print<N>();
  }
};

template<> struct FizzBuzz<0> {
  FizzBuzz() {}
};

int main()
{
  FizzBuzz<100>();
}

投稿者 kazuho : 2008年04月17日 18:55 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

Filter::SQL を使って掲示板を書いてみました

必要最小限、見た目無視です。動作確認は Filter::SQL 0.05 で行いました。

続きを読む "Filter::SQL を使って掲示板を書いてみました"

投稿者 kazuho : 2008年04月17日 16:43 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年04月16日

Perl で埋め込み SQL を使って楽をする話

 DSL (ドメイン固有言語) は、プログラム開発の生産性を向上させる有力な手段です。そして、よく使われる DSL の代表例が正規表現と SQL だと思うのですが、前者に比して後者を嫌いな人が多いようです。なぜだろうと思ってつぶやいたところ、「SQL はリテラルじゃないから!」という答えが tokuhirom さんから返ってきました。そういえば例えば Pro*C のように C で Embedded SQL というのは良く聞く話なのに、Perl では同様の例がないような感じだったので、作ってみました。Perl で埋め込み SQL を実現するソースフィルター Filter::SQL です。

 Filter::SQL を使えば、以下のように、SQL と perl が混在するプログラムを簡単に書くことができます。EXEC, SELECT, SELECT ROW, INSERT, UPDATE, DELETE からセミコロンまでの間が SQL 文として解釈されます。

続きを読む "Perl で埋め込み SQL を使って楽をする話"

投稿者 kazuho : 2008年04月16日 10:33 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年04月09日

Japanize for IE バージョンアップのおしらせ

 昨日4月8日、Japanize の Internet Explorer 用プラグインをバージョンアップいたしました。今回公開したバージョン 1.03 では、高速化と安定性の向上が計られています。以前のバージョンをお使いの場合は、バージョンアップのご案内が表示されますので、指示にしたがって更新していただければ幸いです。また、この機会に、まだ Japanize をご存知でない Internet Explorer ユーザーの皆様にも、お試しいただければうれしく思います。

 バージョンアップの詳細な情報につきましては、中島のブログ記事 (Japanize for Internet Explorer Version 1.03 (Neutral Scent)) をご覧ください。

投稿者 kazuho : 2008年04月09日 15:36 | トラックバック (1) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年04月07日

Q4M Version 0.4 で高速なクローラを書いてみた

 本日、MySQL 5.1 のプラガブルストレージエンジンとして動作するメッセージキューQ4M のバージョン 0.4 をリリースしました。本バージョンでは、条件付購読 (conditional subscription) という、特定の条件を満たす行だけをメッセージキューから読み込む機能に対応したのですが、これを使って、クローラを書いてみました。

ソースコードを表示

 使い方は以下のとおりです。

続きを読む "Q4M Version 0.4 で高速なクローラを書いてみた"

投稿者 kazuho : 2008年04月07日 17:43 | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

2008年04月04日

Parallel::Prefork - Perl でマルチプロセスなサーバを書く方法

 Perl でマルチプロセス処理を行う場合は Parallel::ForkManager を使うというのが定番かと思います。しかし、このモジュールはシグナル処理を前提とした作りになっていない注1ため、シグナルを受信するまで動き続けるようなサーバを書きづらい、という問題がありました。

 そこで、Parallel::ForkManager の API は、ほぼそのままに、シグナル処理が可能なプロセス管理モジュールを作ることにしました。それが Parallel::Prefork です。Parallel::Prefork を使うことで、Graceful Shutdown や動的再構成に対応したマルチプロセス型のサーバを簡単に書くことができるようになります。

 たとえば、Apache の prefork MPM のようなサーバは、以下のように書くことができます。

続きを読む "Parallel::Prefork - Perl でマルチプロセスなサーバを書く方法"

投稿者 kazuho : 2008年04月04日 17:31 | コメント (1) | トラックバック (0) このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク