メモの日々


2005年11月01日(火) [長年日記]

[soft][howto] Tracのリポジトリブラウザで日本語が文字化け

バージョンは0.8.4。conf/trac.iniの[trac]セクション内に

default_charset = euc_jp

と書いて解決。

[soft][howto] Subversionのdiffでリビジョン表示部分が文字化け

$ svn diff
Index: nantoka
===================================================================
--- nantoka   (文字化け
+++ nantoka   (文字化け
……

のようになる。svnコマンドのバージョンは1.1.4。

未解決。リビジョン番号は見えなくてもあまり困らないかも。見たいときは

$ svn diff | lv

とか。でもこれだと差分内に日本語があるとそちらが化けてしまうか。そのときは

$ env LANG=C svn diff

とすればよい。

[unix][howto] sedでファイルの置換

「-i」オプションを付ければファイルの内容を置換できる。「-i」はJMにある日本語マニュアルには載っていないけど、英語のマニュアルには載っていた。

-i[SUFFIX], --in-place[=SUFFIX]

edit files in place (makes backup if extension supplied)

sedのマニュアルはMeadow/Emacs memoで詳しいものが訳されていた。

(追記)

「-i」オプションを使って、あるディレクトリ配下の全てのファイルの対して一括置換を行う例をメモしとく。

grep -lr 置換前 * | grep -v '.svn/' | xargs sed -i 's/置換前/置換後/g'

忘れないように自分のために補足しておくと、

  • 置換に無関係なファイルのタイムスタンプは変えたくないので事前にgrepを実行した。grepの「-l」オプションはマッチしたファイル名だけを出力する。
  • Subversionで管理していると「.svn」ディレクトリ配下のファイルもマッチしてしまうのでそれは取り除く。(ちょっといいかげん)
  • で、sedを使って置換。

[unix][howto] findでマッチしなかったものを出力する

「-prune」というオプションを使えばいいみたい。マニュアルの「-path」の説明に例が載っていた。

ディレクトリツリー全体を無視するためには、一つ一つのファイルをチェックするより -prune を用いる方が良い。たとえば `src/emacs' ディレクトリおよびそれ以下のファイルをすべて無視し、他のファイルを表示したいような場合には、以下のようにする。

find . -path './src/emacs' -prune -o -print

「-o」ってのはorの働きをする。findムヅカシイ。

(追記)

findの解説ページがあったのでメモ。pruneの話はないみたいだけれど。

[life] 図書館へ行く

週末に行って、

  • 宮本武蔵(四) (吉川英治)
  • 父の威厳 数学者の意地 (藤原正彦)
  • サッカーマガジン 2005.10.11 「中村俊輔が好きだ」

を借りた。

[life] totoGOAL3当選した!

2等だからたった2750円だけど。4通り賭けてて購入金額は400円。

totoの売り場が生活圏に無くなってしまい今年はずっと買えずにいたが、インターネット販売が始まったので手続きをして最近やっと買いだしたのだ。購入2度目で当たった。totoGOAL3楽勝。

が、totoGOAL3じゃ億万長者にはなれないので、やっぱり普通のtotoも買おう。

[game] Flashのゲーム

最近Flashでできたゲームばかりしている。Proximityというのがやめられなくて困っている。

やること

  • 蛍光灯を捨てる
  • 家賃
  • 請書

2005年11月07日(月) [長年日記]

[unix] Linuxのflock(2)でNFS上にあるファイルをロックする

flock(2)を使う

flock(2)のマニュアルには

flock(2) は NFS 上のファイルのロックをしない。代わりに fcntl(2) を使用すること。これにより、十分に新しいバージョンの Linux と、ロック機能をサポートした NFS サーバを使用することにより、NFS 上でロックができる。

とある。が、

Linux NFS faqのD.10に、

The NFS client in 2.6.12 provides support for flock()/BSD locks on NFS files by emulating the BSD-style locks in terms of POSIX byte range locks. Other NFS clients that use the same emulation mechanism, or that use fcntl()/POSIX locks, will then see the same locks that the Linux NFS client sees.

とあり、よく分からんがLinuxのカーネル2.6.12からはflock(2)を使ってもNFS上のファイルをロックできるように読めたのでFedora Core 3のカーネル2.6.12-1.1381_FC3で試してみた。プログラムは次の通り。

#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>

void lock_flock(int fd)
{
	if (flock(fd, LOCK_EX)) {
		perror("flock");
		exit(1);
	}
}

void unlock_flock(fd)
{
	if (flock(fd, LOCK_UN)) {
		perror("flock");
		exit(1);
	}
}

void lock_fcntl(int fd)
{
	struct flock lock;

	lock.l_type = F_WRLCK;
	lock.l_whence = SEEK_SET;
	lock.l_start = 0;
	lock.l_len = 0;

	if (fcntl(fd, F_SETLKW, &lock)) {
		perror("fcntl");
		exit(1);
	}
}

void unlock_fcntl(int fd)
{
	struct flock lock;

	lock.l_type = F_WRLCK;
	lock.l_whence = SEEK_SET;
	lock.l_start = 0;
	lock.l_len = 0;

	if (fcntl(fd, F_UNLCK, &lock)) {
		perror("fcntl");
		exit(1);
	}
}

int main(int argc, char *argv[])
{
	FILE *fp;
	int fd;
	pid_t pid;
	time_t start;

	if (argc < 2) {
		exit(1);
	}

	/* ファイルをオープンして */
	fp = fopen(argv[1], "r+");
	if (fp == NULL) {
		perror("fopen");
		exit(1);
	}

	start = time(NULL);
	pid = getpid();
	fd = fileno(fp);

	/* ロックして */
	printf("[%d] %ld: before locking.\n", pid, time(NULL) - start);
	lock_flock(fd);
//	lock_fcntl(fd);
	printf("[%d] %ld: file was locked. sleeping...\n", pid, time(NULL) - start);

	/* 2秒スリープして */
	sleep(2);

	/* アンロックする */
	unlock_flock(fd);
//	unlock_fcntl(fd);
	printf("[%d] %ld: file was unlocked\n", pid, time(NULL) - start);

	fclose(fp);
	return 0;
}

これをコンパイルしてできたプログラム「locker」を、次のシェルスクリプト

#!/bin/sh
./locker $1 &
./locker $1 &
./locker $1 &

を使って2台のNFSクライアントで同時に実行する($1にNFS上のファイルを指定)と、次のように出力された。

PC1

[3886] 0: before locking.
[3888] 0: before locking.
[3887] 0: before locking.
[3886] 0: file was locked. sleeping...
[3886] 2: file was unlocked
[3887] 2: file was locked. sleeping...
[3887] 4: file was unlocked
[3888] 4: file was locked. sleeping...
[3888] 6: file was unlocked

PC2

[3892] 0: before locking.
[3894] 0: before locking.
[3893] 0: before locking.
[3892] 6: file was locked. sleeping...
[3892] 8: file was unlocked
[3893] 8: file was locked. sleeping...
[3893] 10: file was unlocked
[3894] 10: file was locked. sleeping...
[3894] 12: file was unlocked

うん、うまくロックできているようだ。

が、同じプログラムをNFSクライアントとNFSサーバの2台で同時に実行したら、それぞれ独立にロックを獲得してしまった。flock(2)を使った場合、NFSサーバ上のプロセスは特別扱いされてしまうようだ(もっと新しいカーネルなら改善されているのかもしれないけど)。

また、カーネルを2.6.11-1.35_FC3にして試すと、NFSクライアント間でも独立にロックを獲得してしまった(単一PC内のプロセス間では正しくロックできていた)。確かに2.6.12から挙動が変わっているようだ。

fcntl(2)を使う

上のプログラムでコメントアウトしている所を生かし、fcntlだとどうなるかも試した。

結果、こちらだとNFSクライアント間、NFSクライアント〜NFSサーバ間共に、きちんとロックできているようだった。なので、NFSサーバ上でもプログラムが動く場合はfcntlを使う方がよさそう。

また、flockを使うプログラムとfcntlを使うプログラムを同時に起動してみると、NFSクライアント間であればきちんとロックできていた。

[unix] fcntl(2)がアンロックを検出しない

上のプログラムを最初に試したときは思惑通りに動かず、

[4154] 0: before locking.
[4155] 0: before locking.
[4156] 0: before locking.
[4154] 0: file was locked. sleeping...
[4154] 2: file was unlocked
[4155] 30: file was locked. sleeping...
[4155] 32: file was unlocked
[4156] 60: file was locked. sleeping...
[4156] 62: file was unlocked

のような出力になっていた。最初のプロセスがロックを解放しても次のプロセスがなかなかロックを獲得してくれなかった(獲得するのは30秒後)。

iptablesをまず疑い、確かにフィルタリングが掛かっていたのでiptablesを止めてみたが改善せず。その後何をどうしても原因がわからず、もうそういう仕様なのだと結論付けていたのだが、ふと気付き、NFSサーバのhostsファイルにNFSクライアントのエントリを追加したら治った。

tcpdumpの出力を眺めていてふと気付いたので、困ったらパケットキャプチャしろ、というのが教訓。

やること

  • 蛍光灯を捨てる
  • 請書
  • 宛名シール
  • 収入印紙

2005年11月08日(火) [長年日記]

  • 久しぶりに打ち合わせした。このペースで終われるとは思えん。
  • 最近毎日夜更かししてたけど、今日は早く寝る。

[life] 歯医者へ行く (7)

久々。今日も歯科衛生士が担当。前回歯茎の奥の方の歯石を取ると書いたが、取られなかった。軽く歯石を取っただけ。左の上下の奥歯の所に深い歯周ポケットができているらしい。親知らずを抜く方がいいかもと言われた。支払いは1200円くらい。

次回こそ歯茎の奥の方の歯石を取ることになるだろう。恐ろしい。もう歯に痛みは無いので、歯医者行くのやめたい。

やること

  • 蛍光灯を捨てる
  • 宛名シール
  • 収入印紙

2005年11月09日(水) [長年日記]

  • 昨日早く寝たので今日は早めに起きられた。が、昼間やたら眠い。

[db] mysqldumpした結果のリストア時にエラー

ERROR 1005 at line 11: Can't create table './nantoka/kantoka.frm' (errno: 150)

というエラーになった。

IT革命〜などに説明があるが、外部キーを使用している場合にこのエラーが出る。対策は、mysqldumpの結果ファイルの先頭に「SET FOREIGN_KEY_CHECKS=0;」を付与すること。

また、mysqldumpのマニュアルのUser Comments欄に

After adding "SET FOREIGN_KEY_CHECKS=0;" remember to append the "SET FOREIGN_KEY_CHECKS=1;" at the end of the import file. The potential problem is that any data inconsistency that would've made the foreign key failed during import would have made it into the database even after the forieng keys are turned back on. This is especially true if the foreign keys aren't turned back on after a long period of time which can happen if the "SET FOREIGN_KEY_CHECKS=1;" was not appended to the import file in the first place.

とあり、ファイルの最後に「SET FOREIGN_KEY_CHECKS=1;」というのも付与した方がよさそう。

やること

  • 蛍光灯を捨てる
  • 宛名シール
  • 収入印紙

2005年11月10日(木) [長年日記]

[unix][vim] 「Stray Penguin」

Stray Penguinに気になるドキュメントが色々あるのでメモしておく。

[java] 「All-In-One Eclipse」

Eclipse 3.1をインストールしてみたいけど今はまだしないので、便利そうなAll-In-One Eclipseを忘れないようにメモ。

All-In-One EclipseとはEclipse v3.1.1をベースとして、その他便利だと思われるプラグイン(主にEclipseサブプロジェクトのもの)を追加し、日本語パックとフィーチャーオーバレイを適用したものを簡単にインストールできるインストーラのことです。(インストーラにはNSISを使用)

やること

  • 蛍光灯を捨てる
  • 宛名シール
  • 収入印紙
  • 800円返してもらう
  • Microsoft Update

2005年11月14日(月) [長年日記]

[dream] サッカーの審判をする夢

夢を見た。はじめは副審で、選手交代の札を両手に高く掲げ、交代選手をチェックする。なんだか選手がたくさんいて、誰が誰だかよくわからない。副審も大変だ。

試合は延長戦になり、何故かおれが主審をやることに。できるのだろうか。試合開始のホイッスルを吹くがうまく吹けず「ふぃー」っと間抜けな音がでてしまった。延長戦開始。選手をよく見なきゃと思うのだが、場所が学校の教室のような所で、机や柱が邪魔になりよく見えない。その見えない所で反則がなされているような気がする。なんだかみんなダラダラして真面目に試合に取り組んでいない。素人主審のおれをなめてるな。試合をコントロールせねばとヒステリックに笛を吹いてしまう。イエローカードだ!選手から文句を言われる。興奮して回りが見えなくなり、気がつくと隣のコンビニにいた。早く試合に戻らないとと焦っているところで目覚めた。

[db] 「階層化されたデータをMySQLで 扱う (Managing Hierarchical Data in MySQL)」 (mysql-ja ML)

SSKくんに教えてもらったページをメモ。リレーショナルデータベースでツリー構造のようなものを扱う方法の話。MySQLには依存しない。オリジナルの英語版だけに図があるのでこちらも合わせて見た方がよい。

「Adjacency Listモデル」と「Nested Setモデル」が紹介されている。前者は普通に親子関係をリレーションで表現したモデル、後者はリレーションは使わず区間を表すカラムで包含関係を表現するモデル。後者の方が検索は簡単で速く、更新は重そう。

今日書けなかった漢字

  • 隠蔽

やること

  • 蛍光灯を捨てる
  • 宛名シール
  • 収入印紙
  • 800円返してもらう
  • Microsoft Update
本日のツッコミ(全1件) [ツッコミを入れる]

TrackBack [http://taka.no32.tk/diary/20051115.html#p03 32nd diary [WE..]


2005年11月28日(月) [長年日記]

  • 最近ゲームばかりしていてウェブをほとんど見ないので書くことが無い。いけませんね。
  • 仕事の方はダメコードの改造を再開している。苛々する。

[book] JavaScriptビジュアル・リファレンス (シーズ)

JavaScriptビジュアル・リファレンス(シーズ/著 シーズ(1992年)/著) JavaScriptの本が欲しいなと思っていたら、最速インターフェース研究会にこの本がいいと書かれていたので忘れないようにメモ。立ち読みしてから買うかどうかを決めたい。

あー、Amazonプラグインが動かないや。バージョンアップしないと。

(追記)

この本買った。各所で話題だったけど、個人的にはそれほどいいとは思わない。ふつーのリファレンス本だ。カラフルな所がちょっと見難いと感じた。

最近書けなかった漢字

  • 適宜

やること

  • 蛍光灯を捨てる
  • 宛名シール
  • 収入印紙
  • 800円返してもらう
  • 蛍光灯を買う
  • tDiaryのバージョンアップ
  • 家賃
  • 健康保険

2005年11月30日(水) [長年日記]

  • 東急ストアで蛍光灯2本セットを買ったが、そのうち1本はチカチカしてしまいちゃんと点かなかった。振るとシャカシャカ音がする。蛍光灯を買うときは音をチェックしてから買う方がよさそう。

[java][mobile] 「携帯 Java」 (Tech Cradle)

ソフィア・クレイドルという会社サイトにあるMIDP関連のページをメモ。BREWの方がメインみたいだけど。JavaNews.jpから辿った。

[java] 「JUnitテストコードとテストデータを分離 - JTestCase 3.1.0 公開」 (MYCOM PC WEB)

JTestCase 3.1.0はテストケースユニットからテストケースデータを分離するためのJavaフレームワーク。おもにJUnitとともに併用される。 JTestCase 3.1.0を使用すると、JUnitで使用するテストデータを別途XMLファイルに分離して管理することができるようになる。ただし、JTestCase 3.1.0自身はJUnitに依存するものではなく、それ単体で独立したフレームワーク。

JTestCaseというのがあるのね。ずっと以前からあるツールのようだ。JavaNews.jpより。

[web][howto][unix] FreeBSDのApache2でリバースプロキシ

リバースプロキシの設定方法は以前調べた。が、FreeBSDで設定しようとしたらmod_proxyが有効になっておらずすぐには使えなかった。以下のようにして使えるようにした。

mod_proxyを使えるようにする

/usr/local/libexec/apache2 に mod_proxy.so が無いので、ビルドからやり直さねばならない。どうやら、make時に「WITH_PROXY_MODULES=yes」というオプションを追加する必要があるようだ。Apache2のmake時のオプションについては /usr/ports/www/apache2/Makefile.doc に色々書かれていた。

でも make ではビルドせず portupgrade を使いたい。

portupgrade でビルドのオプションを指定する

/usr/local/etc/pkgtools.conf で portupgrade の挙動を設定できるみたい。Apache2のビルド時に上のオプションを指定するようにするには、このファイルの中の MAKE_ARGS の部分に

  MAKE_ARGS = {
    'www/apache2' => "WITH_PROXY_MODULES=yes",
  }

のように書けばいいようだ。

こうしてから

# portupgrade -vf apache

を実行したらうまく再コンパイルされた模様。

Apache2の設定

httpd.confに

LoadModule proxy_module libexec/apache2/mod_proxy.so
LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so

とProxyPass、ProxyPassReverseの設定を追加し、Apacheを再起動しておしまい。

やること

  • 蛍光灯を捨てる
  • 収入印紙
  • 蛍光灯を買う
  • tDiaryのバージョンアップ
  • 家賃
  • 健康保険