birdsarge 移行(1)

sarge 移行(1)

いよいよ sarge へ移行してみました。いい加減 woody ではちゃんと動かないソフトが出始めてきていたこと、IPA フォント公開を機にフォント環境を Xft1 から Xft2 へ移行したかったこと、などがその理由です。

いつものように /etc/apt/sources.list をごっそり sarge 用に切替え1、dselect から update、select を実行、更新されるパッケージを調べます。日頃使っている大事なパッケージが削除されないか、僕の場合は KDE3 関連パッケージがきちんと入るかどうかなどを確認しました。

一通り依存関係の解決が終わると、後は install するだけです。今回更新されるパッケージは総計 700Mbytes 超となりました。

install 中にいろいろ設定を要求するパッケージは適当にあしらって、とりあえず install はさっくり終了。さあとりあえずいったんリブート、と思って再起動してみると、なんと「LI」で止まってしまってブートしない。どうも僕がずっと使ってきていた lilo.conf の記述が古かったようで、それをベースに新しい lilo を実行した結果ブートローダーが壊れてしまったようです。

しょうがないのでエマージェンシーパーティション2から古い kernel を使いシングルユーザーモードでブート、lilo.conf を書き換えて再度インストールすることでなんとかブート出来るようになりました。

さて、Xft2 環境に移行したはよいのですが、Xft1 の時に使えていたフォントが軒並み見えない。Xft1 は /etc/X11/XftConfig でいろいろ設定しますが、Xft2 では /etc/fonts/fonts.conf、local.conf で行います。/etc/fonts/local.conf に下記のようにフォントパスを追加することで今まで通りのフォントが見えるようになりました。

 :  
 <dir>/usr/local/lib/X11/fonts/DynaLab</dir>  
 <dir>/usr/local/lib/X11/fonts/java2-awt</dir>  
 <dir>/usr/local/lib/X11/fonts/jim-mac</dir>  
 <dir>/usr/local/lib/X11/fonts/Xft</dir>  
 <dir>/usr/local/lib/X11/fonts/motoya</dir>  
 <dir>/usr/local/lib/X11/fonts/ipa</dir>  
 :  

Xft2 では、こちらのパッチを使うことで、一般的な日本語フォントのように bold や italic の字形が明示的に提供されていないような場合でも、擬似的にボールドやイタリックとすることが可能になっています。パッチ済みバイナリを deb として提供してくださっている方がいらっしゃいますので、sources.list に下記2行を追加後、update、install します。

deb http://ftp.arege.jp/debian-arege unstable xft fontconfig  
deb-src http://ftp.arege.jp/debian-arege unstable xft fontconfig  

次に、/etc/fonts/local.conf に下記を追加します。

 <match target="font">  
  <test name="weight" compare="less_eq">  
   <const>medium</const>  
  </test>  
  <test target="pattern" name="weight" compare="more">  
   <const>medium</const>  
  </test>  
  <edit name="weight" mode="assign">  
   <const>bold</const>  
  </edit>  
 </match>  

これでとりあえずボールドが表示されるようになりました。

その他いろいろありましたが、今日はもう遅いのでとりあえずここまで。

birdIPA フォント

IPA フォント

IPA フォントサンプル 各所で話題のフリーで再配布も可能な IPA フォントですが、僕も持ってきて少し使ってみました。噂に違わぬハイ・クオリティに驚き。デフォルトフォントとしてもなんの問題もないくらいの品質です。僕の場合は full screen antialias 環境なので、埋め込みビットマップなどは見てないですけど…。

bird最近、「剣」が面白くなった理由, 「すばらしい新世界」, 「バグズ・ライフ」

最近、「剣」が面白くなった理由

をよーく考えてみたら、みゆきさん望美ちゃんが出てくるようになったからかも…と思った。

「すばらしい新世界」

すばらしい新世界 風力発電用の風車を設計している一人のエンジニアが、ふとしたきっかけでヒマラヤの奥地にある貧しい村のための小さな風車を作ることになり、その出来事を中心に、家族のこと、信仰のこと、援助とは何か、ボランティアについてなどさまざまなことを考えるお話1。池澤夏樹さんの本です。

池澤夏樹さんと言えば、高校生の頃にすごく好きでよく歌った「ティオの夜の旅」という曲の詩が池澤さんでした。「夏の朝の成層圏」にある詩なのでしょうか (このタイトルと同じ歌詞も出てきます)、その詩は男性的で非常にスケールの大きい感じだったので、小説もそんな感じなのかなぁと思っていたのですが、この話はどちらかというと僕のようなまだ若い技術系エンジニアの身の丈視点で書かれていて、その点は少し意外でした。でも面白かった。

ちょっとテーマが散漫な感じだったりストーリー的にはいろいろ唐突だったりもしますが2、全体のトーンはとても優しく、理系的素養を持ちつつも、人間自身、さらに霊的なものにも健全な共感を感じる主人公に、僕もすっかり共感してしまいました。これまでの都市集中、中央集権的な流れから、風力発電は必然的に分散を要求する (自然エネルギーは密度が低いので分散させざるを得ないのです)、という話もよかった。そろそろそういうパラダイム・シフトが起こってもいい頃合いだと思うんですよね。

「バグズ・ライフ」

バグズ・ライフ 弟に、子供達用のプレゼントとしてもらった DVD をみんなで見ました。面白かった!

見終ってから考えたんですが、この映画の主張ってまさにガンジーさんの主張なのですね。フリックの「困るのはアリじゃない、バッタだ」とか「アリの方が本当はずっと力がある」というようなセリフも、ガンジーさんがインドの人達に言っていたことそのままのように思います。鳥作りの時もその後ホッパーに痛めつけられていた時も、フリックやアリたちは暴力に訴えませんでしたし… (脅すようなしぐさはしていましたが)。←思いっきりみんなで追いたててましたね(^^;。ガンジーさんはそういう性急な行動は戒めていましたが (実際の話でもそういう行動に出る若い人は後を立たなかったのだそうです)、まぁそこは映画なので劇的な展開の方を優先したんでしょうね。

子供達としては「虫から見ると雨つぶはすごく大きいものだ」という点がすごく新鮮だったようで、それ以降雨を見るたびに「ほんとにアリさん溺れちゃいそうだねぇ」と感心しています。あと、特典映像として入っている「ゲーリーじいさんのチェス」も何故かみんな大好き。

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時間くらい。しかしこの程度のちょっと調べれば分かる知識をありがたがって囲い込んでると、本当に価値のあるモノが見えなくなっちゃうぞ>誰となく。

bird次世代 PS は年度内発表、来年の E3 で実機公開, 先週のデカレンジャー, PSX アップデート延期

次世代 PS は年度内発表、来年の E3 で実機公開

だそうな。PS2 の時と同じようなスケジュールですね。来年の年末商戦に間に合うか、また春に延びるか。

先週のデカレンジャー

は、なんだかいつもよりも特撮のクオリティが高かったような。監督の違いでしょうか。それにしても、ジャスミンの回はどうも切ない展開になりがちですね。今回もジャスミンファンは必見!な内容だった…。ヘヴィメタしょって登場する悪役、ってのも素晴らしい。
そういや仮面ライダー剣 (ブレイド) も、睦月と上級アンデッドのみゆきさんが現れてからちょっと面白い感じ。みゆきさんはもうすぐ死んじゃう (封印されちゃう) 予感がぷんぷんしますが、個人的にはもっと活躍して欲しいなぁ。

PSX アップデート延期

7/15 から 8/3 へ3週間の延期。がっくし。

birdインフォ・マイカ続報

インフォ・マイカ続報

うーん、NTT 本気だ。しかし NTT 自身がデバイスまで作るわけじゃないだろうし、どこが製造を担当するんだろう。ここは絶対味方にしておいた方がいいと思うんだけど>Sony 他製造メーカー各社。Blu-ray vs HD-DVD とかやってる場合じゃないですよ。「光ディスク」という概念自体が古くなっちゃうかもしれないんだから…。

bird「ブラッド・ミュージック」

「ブラッド・ミュージック」

ブラッド・ミュージック 珍しく再読。最初に読んだのはエヴァンゲリオンの13話「使徒、侵入」の元ネタはコレかもね、なんて話を fj (!) で読んだのがきっかけでしたから、1996 年頃でしょうか。ストーリーの大まかな流れは覚えていたんですが1、その他の細かい部分はほとんど忘れていたので結構楽しめてしまった。こんなパニック小説だったっけなぁ。今読むとこないだ読んだ「ダーウィンの使者」はまさにコレの焼き直しであることがよく分かる (とはいえ僕は「ダーウィン」の方が好きだな)。シモンズベアさん的には「ダブル・クラウンの夢よ再び」的な面もあったんだろうか…(←やな奴)。

情報力学とか、宇宙の法則のくだりなんかはちょっとイーガンとの類似を見たりしました。しかしまー最近の物理学の動向を聞きかじってると2、宇宙に対する絶対的なイメージは持ちにくくなってきてますよね…。

2006/1/14 追記。この本の作者はグレッグ・ベアさんであってダン・シモンズさんではないではないぞ>過去の俺。これを書いたときの俺は目ぇ開けて寝ぼけてたのか。

birdUDP Reflector 改め DP Reflector

UDP Reflector 改め DP Reflector

結局、再送処理等に関していろいろ考えているのが面倒になってきたので1、UDP/TCP を混在させて利用可能な形にすることにしました。クライアントはアプリケーション側の要求やいろいろな制約を鑑みてどちらのプロトコルでも好きなように利用できます。DP Reflector の DP は Dual Protocol の DP なのだ(笑。
つまり、完全性や順序性が欲しいアプリケーション (または個々の通信要求) は TCP を使えばいいし、そういったものはいらないのでもっと性能が欲しい場合は UDP を使えば良いと。DP Reflector 側では UDP 時には完全性や順序性を一切保証しませんので、もし UDP を使いつつそういったものが (多少なりとも) 欲しい場合はアプリケーションレイヤーで作りこむ必要があります。
TCP でのやりとりのために追加になったコードと、再送処理が必要なくなったために削除したコードの分量はほとんど同じくらいか、多少前者の方が多いかな、という程度。UDP 版、TCP 版のテストクライアントも含めてありますが、かなりシンプルになったように思うのですがどうでしょうか?
再送処理がなくなった関係で、パケットフォーマットが少し変更されています (シーケンス番号フィールドがなくなった)。また、TCP ストリーム上へのパケットの乗せ方の仕様も追加になりました。さらにチャネルに参加しているクライアントのリストを得る LIST コマンドも追加になっています。
今回も www.digitune.org の 15315 番ポート (TCP/UDP とも) で動かしておきますので、テストにでも使ってくれい>かぴのすけ。
ナチュラルに inner-inner-class を使ってしまった…。うひょー。

birdreferer spam(2)

referer spam(2)

referer bomb じゃなくて referer spam というのですね。apache のアクセス制御を使って弾く努力をしてみることにしました。<Directory /> の設定に下記を追加しました。

# antispam.  
    SetEnvIf User-Agent "Netscape/Mozilla compatible" Spammer  
  
    Order deny,allow  
    Deny from 63.81.44.2  
    Deny from env=Spammer  

いちおう User-Agent と IP アドレス双方で。また別のアドレスから来たら追加していこう。いたちごっこだけど、地道に対処するしかないよね。

birdプロトコル解説, referer bomb

プロトコル解説

昨日の UDP Reflector のプロトコル解説をざっと書いてみました。かぴのすけへの返事でも書きましたが、このページにあるアーカイブには .class、.java 両方とも含まれていますので、実際のソースコードを読んで動きを確認したい方はそちらをご参照ください。

下記プログラム1を実行して www.digitune.org の 15315 番ポート宛に UDP パケットを送信してくれる人募集(笑2。出来ればそのときの送受信パケットダンプもあると助かるんですが…。

#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <sys/uio.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <netdb.h>  
#include <arpa/inet.h>  
#include <sys/errno.h>  
  
extern int h_errno;  
  
int main(int argc, char *argv[])
{  
	int sd;  
	char buf[256];  
	int messagelength;  
	struct sockaddr_in server;  
	struct hostent *he;  
  
	/* 引数のエラー処理 */  
	if(argc != 4){  
		fprintf(stderr, "usage: %s SERVER_NAME SERVER_PORT MESSAGE\n", argv[0]);  
		exit(1);  
	}  
  
	/* socketの生成。SOCK_DGRAMがudp用 */  
	sd = socket(AF_INET, SOCK_DGRAM, 0) ;  
	if(sd < 0){  
		perror("socket: ");  
		exit(1);  
	}  
  
	memset((char *)&server, 0, sizeof(server));  
	server.sin_family = AF_INET;  
	server.sin_port  = htons(atoi(argv[2]));  
  
	/* gethostbyname による名前引き */  
	he = gethostbyname(argv[1]);  
	if(he == NULL){  
		fprintf(stderr, "gethostbyname() failed: %s\n", hstrerror(h_errno));  
		exit(1);  
	}  
	memcpy((void *) &(server.sin_addr), (void *) he->h_addr, he->h_length);  
  
	/* バッファの初期化 */  
	memset(buf,0,sizeof(buf));  
	strncpy(buf, argv[3], sizeof(buf) - 1);  
	messagelength = strlen(buf);  
  
	/* サーバーへの送信 */  
	if(sendto(sd, buf, messagelength, 0,  
			(struct sockaddr *) &server, sizeof(server)) == -1){  
		perror("sendto");  
		exit(1);  
	}  
  
	memset(buf,0,sizeof(buf));  
	buf[1] = 0x10;  
  
	/* サーバーへの送信 (2) */  
	if(sendto(sd, buf, 3, 0,  
			(struct sockaddr *) &server, sizeof(server)) == -1){  
		perror("sendto");  
		exit(1);  
	}  
  
	close(sd);  
	exit(0);  
}  

referer bomb

昨日の日記の referer がエッチサイトで山盛りになってますね(笑。なんだかなぁ。

First | Prev | 432 | 433 | 434 | 435 | 436 | Next | Last