携帯機で動作する音声認識による通訳ソフト、っていうのはなかなか魅力的かもしれない。当初は認識率も低いだろうし認識語彙も少ないだろうけど、着実に成長 (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 する。
って感じなんですね。細かいところではいろいろと気を付けなくてはいけないポイントがあるのかもしれないけど…。
動作確認に使った簡単なプログラムは下記の通り。
#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時間くらい。しかしこの程度のちょっと調べれば分かる知識をありがたがって囲い込んでると、本当に価値のあるモノが見えなくなっちゃうぞ>誰となく。