birdTALK MAN, referer spam(3), prefork の仕組み

TALK MAN

携帯機で動作する音声認識による通訳ソフト、っていうのはなかなか魅力的かもしれない1。当初は認識率も低いだろうし認識語彙も少ないだろうけど、着実に成長 (TALK MAN 2 『帰ってきたアホウドリ』、TALK MAN 3 『アホウドリの逆襲』、etc…) させていったら結構面白い存在になるような。今までそれほど PSP 欲しくなかったんですが、これのために買ってもいいかも、と思わせるソフトです。個人的期待大。

referer spam(3)

またやってきていますが、フィルタルールを下記のように変更してみました。

# antispam.  
    SetEnvIf Referer "pussy" Spammer  
    SetEnvIf Referer "sex" Spammer  
    SetEnvIf Referer "porn" Spammer  
    SetEnvIf Referer "bestiality" Spammer  
    SetEnvIf Referer "beastiality" Spammer  
  
    Order deny,allow  
    Deny from env=Spammer  

「sex」や「porn」が含まれたドメインからはリンクが張れなくなりますが、まぁ実害はないでしょう。

prefork の仕組み

apache 等の prefork daemon の基本的な仕組みって、

  • socket を listen するところまで親が行って、
  • だだだと fork して、
  • みんなで一斉に accept する。

って感じなんですね。細かいところではいろいろと気を付けなくてはいけないポイントがあるのかもしれないけど…2

動作確認に使った簡単なプログラムは下記の通り。

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
  
#define PORT_NUM 10000 /* 10000 番ポートで待ち受け */  
  
int main(int argc, char *argv[]) {  
    struct sockaddr_in me;  
    struct sockaddr from;  
    socklen_t fromlen;  
    int sd, opt, fork_count, fd;  
    int ret, i;  
    char buf[8192];  
  
    if (argc < 2) {  
        fprintf(stderr, "usage: %s FORK_COUNT\n", argv[0]);  
        exit(1);  
    }  
  
    fork_count = atoi(argv[1]);  
  
    /* socket を準備 */  
    sd = socket(AF_INET, SOCK_STREAM, 0);  
    if (sd < 0) {  
        perror("socket");  
        exit(1);  
    }  
    opt = 1; // 'true'  
    ret = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));  
    if (ret != 0) {  
        perror("setsockopt");  
        exit(1);  
    }  
    memset(&me, 0, sizeof(me));  
    me.sin_family = AF_INET;  
    me.sin_addr.s_addr = htonl(INADDR_ANY);  
    me.sin_port = htons(PORT_NUM);  
    ret = bind(sd, (struct sockaddr *) &me, sizeof(me));  
    if (ret == -1) {  
        perror("bind");  
        exit(1);  
    }  
    ret = listen(sd, SOMAXCONN);  
    if (ret == -1) {  
        perror("listen");  
        exit(1);  
    }  
  
    /* 指定された回数だけ fork */  
    for (i = 0; i < fork_count; i++) {  
        ret = fork();  
        if (ret < 0) {  
            perror("fork");  
            exit(1);  
        } else if (ret > 0) {  
            break;  
        }  
    }  
  
    /* main loop */  
    for (;;) {  
        memset(&from, 0, sizeof(from));  
        memset(&fromlen, 0, sizeof(fromlen));  
        fd = accept(sd, &from, &fromlen);  
        if (fd < 0) {  
            perror("accept");  
            exit(1);  
        }  
        for (i = 0; i < 3; i++) { /* 3回だけ recv */  
            memset(buf, 0, sizeof(buf));  
            ret = recv(fd, buf, sizeof(buf), 0);  
            if (ret < 0) {  
                perror("recv");  
                exit(1);  
            }  
            printf("pid=%d, msg=%s\n", getpid(), buf);  
        }  
        close(fd);  
    }  
  
    return 0;  
}  

調査&コーディングで1時間くらい。しかしこの程度のちょっと調べれば分かる知識をありがたがって囲い込んでると、本当に価値のあるモノが見えなくなっちゃうぞ>誰となく。

コメント

しゅどう (Wed, 14 Jul 2004 10:49:07)
携帯電話機に付いて欲しい機能です>通訳
SAK (Wed, 14 Jul 2004 11:52:15)
海外行った事のないでじつね氏が、なぜコレに興味を示すのだろう?
Digitune (Wed, 14 Jul 2004 12:03:22)
元々「電話」ですからね。昔の「未来予想図」には必ず登場してましたし…>自動翻訳機能付電話。

ただ、現状の技術ではまだ携帯に載せるにはアプリケーションとして重過ぎるのかも。携帯はなんだかんだいって制約多いですからね。体積/重量は言うに及ばず、身体に接するものなので熱的な制約もかなりきつい、という話には目から鱗でした。
Digitune (Wed, 14 Jul 2004 12:04:04)
「過去海外に行ったことがあるか」はこの文脈ではまったく関係ないと思うが…>SAK

  1. アホウドリかわいい。 ↩︎

  2. ツッコミ大歓迎(笑。PostgreSQL のコネクションプールサーバ、pgpool でもほとんど同じようにやっていたのでそれほど大外しはしてないと思いますが…(select の有無は本質的な違いじゃないですよね?)。 ↩︎