MySQL 5.1 のサーバログテーブル機能について

  MySQL 5.1 で my.cnf に log を設定しても,デフォルトではファイルにログが書き込まれません.

  これは,サーバログテーブルという MySQL 5.1 からの新機能が影響しています.
  サーバログテーブル機能により,デフォルトでは mysql テーブルの general_log と slow_log テーブルに書き出されます.

サーバログテーブル:MySQL 5.1以前では、サーバはログファイルに一般クエリログやスロークエリログエントリーを書き込みます。MySQL 5.1以降では、サーバのこういったログ書き込み機能はより柔軟性のあるものとなります。ログエントリーは、以前のようにログファイルに書き込まれるか、もしくはmysqlデータベース上のgeneral_logとslow_logテーブルに書き込まれます。ログ収集が可能な場合、いずれかもしくは両方の宛先が選べます。--log-outputオプションは、宛先やログ出力の宛先をコントロールします。詳しくはをご確認ください。(執筆: Petr Chardin)
(http://dev.mysql.com/doc/refman/5.1/ja/mysql-5-1-nutshell.html)

  5.0 以前のようにファイルに書き出すには,my.cnf に log-output=FILE を設定します.
  mysqld に --log-output=FILE オプションをつけて起動しても大丈夫なようです.

  log-output=TABLE,FILE のようにすると,テーブルとファイルの両方にログを出力します.
  もちろん,log-output=TABLE でテーブルのみにログを出力するようになります.

- MySQL AB :: MySQL 5.1 Reference Manual :: 5.11.1 Selecting General Query and Slow Query Log Output Destinations
  http://dev.mysql.com/doc/refman/5.1/en/log-tables.html

Subversion + WebDAV で複数のリポジトリを扱う方法

  Subversion + WebDAV で単純に一つのリポジトリを扱う場合は,以下のような設定をします.

<Location "/repos/foo">
    DAV svn
    SVNPath /path/to/repos/foo
</Location>


  これに,/path/to/repos/bar のようなリポジトリを追加して使いたい場面が出てきます.
  その場合は,以下のように SVNParentPath を使って共通の親ディレクトリを指定してあげると便利です.

<Location "/repos">
    DAV svn
    SVNParentPath /path/to/repos
</Location>


  こうすることで,リポジトリを追加するたびに Apache の設定をする必要がなくなります.

- ref.: httpd, Apache HTTP サーバ
  http://subversion.bluegate.org/doc/ch06s04.html

PHP の apache_setenv と virtual を利用して,ファイルへの直リンクを防止する

  ファイルへの直リンクを防止する方法としては,例えば Referer ヘッダ参照する方法とかがあると思います.
  Apache クックブック のレシピ 6.5 に載っているのもその方法ですが,Referer ヘッダを送信しないクライアントはどうするかという問題があります.

  そこで,PHP の apache_setenv と virtual を利用する方法を紹介します.

- apache_setenv
  Apache サブプロセスの環境変数を設定する
  http://php.net/apache-setenv

- virtual
  Apache サブリクエストを実行する
  http://php.net/virtual

  ダウンロードするファイルがあるディレクトリを /var/www/html/data とします.
  このディレクトリに .htaccess を置いて,以下のように記述します.

Order Allow,Deny
Allow from env=ACCESS_ALLOW


  この時点で,/var/www/html/data 以下のファイルにアクセスできなくなります.具体的には 403 Forbidden が返されます.
  これは,ACCESS_ALLOW という環境変数があれば,アクセスできますよと指定しているためです.

  次に以下のような PHP スクリプトを記述します.サンプルなのでファイル名は固定にしてあります.
  これを /var/www/html/foo.php として配置し,ブラウザからアクセスしてみてください.

<?php

// コンテンツタイプ
header('Content-type: image/jpeg');

// Apache 環境変数を設定
apache_setenv('ACCESS_ALLOW', '1');

// Apache にサブリクエストを投げる
// このスクリプトからの相対パスを指定する必要がある
virtual('data/foo.jpg');
?>


  この foo.php にアクセスすると,今度は data/foo.jpg が表示されると思います.
  つまり,環境変数 ACCESS_ALLOW を指定してアクセスしているわけです.

  この foo.php のファイル名を時間によって変えるなどすれば,まあ,直リンクを防止することができる……のかな?ちと強引ですが.

  パフォーマンスとか調査していないのですが,このような方法もあるということで紹介しておきます.


  参考までに,上記スクリプトを以下のように改造してあげると,filename で指定されたファイルをダウンロードすることができます.

<?php

define('DATA_DIR', 'data' . DIRECTORY_SEPARATOR);

if (!isset($_GET['filename']) || $_GET['filename'] == '') {
    exit;
}

$filepath = DATA_DIR . basename($_GET['filename']);

if (!is_readable($filepath)) {
    exit;
}

$info = getimagesize($filepath);

// コンテンツタイプ
header('Content-type: ' . $info['mime']);

// Apache 環境変数を設定
apache_setenv('ACCESS_ALLOW', '1');

// Apache にサブリクエストを投げる
virtual($filepath);
?>

CSS をパースするダウンロードツール pavuk を試す

  サイトのミラーリングなどに wget -m とか使う場合がありますが,wget ではどうしても対応できない場合があります.
  それは,CSS をパースしてくれないことです.

  例えば,以下のような CSS はパースしてくれません.

@import(foo.css);
background-image: url(foo.png);

<h1 style="background-image: url(foo.png);">foo</h1>


  つまり,foo.css や foo.png をダウンロードしてくれないのです.

  これはどうしようもないと諦めていたのですが,pavuk というツールを見つけました.
  pavuk を使うと,上記のような CSS をパースして,foo.css や foo.png もダウンロードしてくれます.

- Pavuk - Home
  http://www.pavuk.org/

$ pavuk -mode mirror \
        -base_level 1 \
        -index_name index.html \
        -noRelocate \
        -adomain example.com \
        http://example.com/

  これで,example.com_80 というディレクトリにミラーリングされます.

  それでは,オプションをちょっと解説.オプションは,これでもかっていうくらい沢山あります.詳しくは pavuk --help か man pavuk をご覧ください.

- -mode mirror
  ミラーリングするオプションです.他に,sync,dontstore などがあります.

- -base_level 1
  作成するディレクトリの階層を省略するレベルを指定します.
  何も指定しないと上記の場合は

http/example.com_80/foo/bar/

  のように,ディレクトリが作成されます.

  ですので,1 を指定して,以下のようにディレクトリが作られるようにします.

example.com_80/foo/bar/

- -index_name index.html
  インデックスファイル名を指定します.指定しないと _._.html というファイル名になります.

- -noRelocate
  ダウンロードしたファイルのリンクをローカルに合わせて (相対パスに) 書き換えないオプションです.
  つまり,これを指定しないと,相対パスに書き換えます.

- -adomain
  許可するドメインです.

  サイトを見ると GUI でしか使えないような気がしたのですが,CUI でも問題なく使えます.

  一応,Solaris 10 でのインストールメモ.GUI は使いませんので GTK とかは無効にしました.

$ ./configure --disable-gtk --disable-gtk2
$ make
$ sudo make install

  なんてことはありませんね.いわゆる configure 一発モノです.

実際にタモさんカレーを作ってみた

  ほぼ日刊イトイ新聞主催による「カレー部例会」でタモリさんが作ったカレーのレシピが公開されていたので,先日の 3 連休を利用して,実際に作ってみました.

- ほぼ日刊イトイ新聞 - カレー部 例会@電力館
  http://www.1101.com/curry_club/

- [N] タモさんのカレーレシピ「プレーンタモリ」
  http://netafull.net/diary/019835.html

- ドレッシングのような - プレーンタモリのレシピ (テキスト版)
  http://d.hatena.ne.jp/mrkn/20070429/plain_tamori

- 材料一覧
  材料一覧

  左上から,牛乳,ホールトマト,マンゴーチャツネ,
  カレー粉,ターメリック,カレー粉 (予備),クミン,ヨーグルト,
  鶏モモ肉,とろけるチーズ,
  ニンニク,しょうがとなっています.写真にはありませんが,これにあと赤ワインが必要です.

  では,早速,調理開始.レシピは 4 人分です.

1. バットにカレー粉,ターメリック,クミンを合わせ,一口大に切った鶏肉をもみこみます.

  • カレー粉 大さじ 1
  • ターメリック 小さじ 1 弱
  • クミン 小さじ 1 弱
  • 鶏モモ肉 500g (お好みで皮をとってください)

  鶏肉をもみこむ

  特に難しいことはありません.鶏モモ肉を切って,香辛料をもみこむだけ.

2. フライパンにサラダ油をひき,鶏肉の表面に軽く火が通るくらい焼きます.

  • サラダ油 大さじ 1

  鶏肉を焼く

  表面に焼き色が付くくらい焼きました.

3. 鍋にお湯を沸かし,2 で炒めた鶏肉を入れます.

  • お湯 1 リットル

  鶏肉を鍋に入れる

4. 3 の鍋にマンゴーチャツネ,赤ワイン,ミキサーにかけたホールトマトを加え煮込みます.

   (中火.蓋はせず,ふきこぼれないよう,アクを取りながら煮込みます)

  • マンゴーチャツネ 大さじ 1/2
  • 赤ワイン 75cc
  • ホールトマト 75g

  煮込む

  我が家には,ミキサーは無いので,ザルにホールトマトを入れて,裏ごししました.

5. 弱火のフライパンに,炒め玉葱,ニンニク,しょうがを加え混ぜ合わせながら炒めます.

   ニンニク,しょうがの香りが立ってきたら,カレー粉,ターメリック,クミンを加え,
   さらに,牛乳,ヨーグルトを加え,ペースト状になるまでよく混ぜ合わせます.

  • 炒め玉葱 1/4 瓶
  • ニンニク (すりおろし) 小さじ 2
  • しょうが (すりおろし) 小さじ 2
  • カレー粉 (インデラ缶) 大さじ 1
  • ターメリック 小さじ 1
  • クミン 小さじ 1 弱
  • 牛乳 1/4 カップ
  • ヨーグルト 大さじ 1 強

  ペーストを作る
  ペーストを作る

  炒め玉葱の 1/4 瓶というのが良くわからなかったので,300g ほど使いました.
  このペーストがルーのような役割のようです.

6. 4 の鍋に 5 のペースト,醤油,砂糖,とろけるチーズ,塩を加え,半蓋で煮込みます.

  • 醤油 少々
  • 砂糖 ひとつまみ
  • とろけるチーズ 30g
  • 塩 小さじ 1

  煮込む

  この時点では,まだ水気が多くてちょっと不安な感じなります.
  でも,大丈夫です.とろ火で煮込み始めました.

7. 煮込み開始から 2 時間強煮込んだら塩で味を調え,最後に 15 分強火で煮込み,完成です!


  完成

  我が家の場合は,煮込み始めて 1 時間半位でいい感じになったので,ここで煮込むのをやめました.

- 完成!
  実際お皿に盛った様子は,こんな感じです.

  完成

  感想は,かなりおいしいです!
  肝心の手間はというと,実際は全然大変ではなくて,煮込むまで 30 分くらいで終わります.

  材料も一度揃えてしまえば,その後も使えるものが多いので,一度試してみてはいかがでしょうか.