« 2007年07月28日 | メイン | 2007年07月30日 »

2007年07月29日

一部のキーワードを入力すると CEEK.JP が表示されない不都合を修正

CEEK.JP に検索キーワードとして、マルチバイト文字の一部(0x82 etc...)を与えると、タグが崩れ、ページが正常に表示されないバグが存在した。起因するセキュリティ上の問題を発見することは出来なかったが、アプリケーションのバグなので修正した。報告者は、前回の脆弱性(XSS)を発見した方だと思う(IPA セキュリティーセンター経由で連絡があった)。

検索用のアドレス書き換えなくとも、キーワード欄に %82 を入力するだけで再現できる(現在は修正済み)。CEEK.JP の仕様であるのだが、文字を組み立てるときに % を無視しているのである。この仕様は、外部からリンクされる際に、二重に URL エンコードされている場合が多いという現状に対処するためである。

Encode::from_to($value, 'euc-jp', 'euc-jp');

pack で文字を組み立てた後に、Encode.pm を利用して不正な文字を ? に置き換えるようにした。別の対処方法としては、変数を HTML に展開する際、必ず後方にスペースを付加するというのもあるだろう(実際にやってた方を知ってる)。

また、何か不都合が見つかりそうだ…。

【関連情報】
・CEEK.JP - 統合型メタサーチエンジン
 http://www.ceek.jp/
・第10回 マルチバイトの落とし穴 - @IT
 http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino02.html

23:31 | コメント (0) | トラックバック | Development

第20回参議院議員通常選挙

投票所

有権者なので、投票してきました。メディアが騒いでいますが、いつも通りバーター投票です。

22:12 | コメント (0) | トラックバック | Life

COUNT(*) の代わりに FOUND_ROWS() を利用する

MySQL データベースからデータを取得するとき、オフセット(LIMIT)を利用する場合が多いと思う。同時に、条件に合致するデータの件数を知りたい場合も多いだろう。そのような時、そのようなクエリを投げれば良いのだろうか?

・データ取得

SELECT
  *
FROM
  table
WHERE
  field = 5
LIMIT 0, 10

・件数取得

SELECT
  COUNT(*)
FROM
  table
WHERE
  field = 5;

LIMIT を利用してデータを取得した後、別途 COUNT() 関数を利用したクエリを投げる事により、合致するデータの件数を知ることが出来る。このような単純なクエリの場合、各句をそれぞれ変数に格納していれば、特に件数取得用のクエリ文生成が面倒になることは無いだろう。

$select_data =
  'SELECT '.
  '  * ';
$select_count =
  'SELECT '.
  '  (*) ';
$from =
  'FROM '.
  '  table ';
$where =
  'WHERE '.
  '  field = 5 ';
$limit =
  'LIMIT 0, 5 ';
$sql_data = $select_data . $from . $where . $limit;
$sql_count = $select_count . $from . $where;

単純なクエリの場合は、この方法でも良いのだが、複雑になったらどうだろうか?

・データ取得

SELECT
  COUNT(*), field2
FROM
  table
WHERE
  field1 = 5
GROUP BY
  field2
LIMIT 0, 10

・件数取得

SELECT
  COUNT(DISTINCT field2)
FROM
  table
WHERE
  field1 = 5

GROUP BY 句がデータ取得のクエリ文に入る場合、前記のように各句を変数に格納していても、単純に件数取得用のクエリ文を生成することが出来ない。なぜなら、件数をカウントする COUNT(*) が GROUP BY でまとめた結果をカウントしてしまうからだ。正常にカウントするためには、GROUP BY を外す必要があり、データ取得用のクエリ文と、件数取得用のクエリ文は大きく異なる事になる。これでは、保守性が非常に悪い。今回の場合は DISTINCT 関数を用いれば解決できるが、複数のテーブルを結合したり HAVING が含まれたりする場合は、そう単純じゃない(はず)。

MySQL 4 から、新たに FOUND_ROWS() という関数が追加された。この関数を利用すると、簡単に合致するデータの件数を取得することが出来る。

・データ取得

SELECT SQL_CALC_FOUND_ROWS
  COUNT(*), field2
FROM
  table
WHERE
  field1 = 5
GROUP BY
  field2
LIMIT 0, 10

・件数取得

SELECT
  FOUND_ROWS();

データ取得用のクエリ文に SQL_CALC_FOUND_ROWS を付加していれば、次のクエリ文で FOUND_ROWS を呼び出すだけで、合致する件数を取得することが出来る。

SELECT SQL_CALC_FOUND_ROWS を使用している場合、MySQL は完全な結果セットにいくつ行があるか計算する必要があります。しかし、結果セットをクライアントに送る必要がないため、LIMIT なしでクエリを再度実行するより速く行えます。

結果セットを送る必要の無い COUNT() との比較については、リファレンスマニュアルには書かれていない。しかし、オープンソース情報データベース OSS iPedia での検証によれば、約 70% のパフォーマンス向上が確認できたとの事(InnoDB によるものなので MyISAM は未検証)。

検索エンジンの類を MySQL で開発している場合、この FOUND_ROWS, SQL_CALC_FOUND_ROWS の利用は必須であろう。クエリのキャッシュ(SQL_CACHE)を利用している場合も、正常に作動する。

ま。アプリケーションから MySQL にアクセスする際に、クエリ文をべた書きしているケースは少なくなってきていると思うけど。僕は、未だに DBI を利用して、べた書き…。

【関連情報】
・11.10.3. 情報関数 - MySQL 5.1 リファレンスマニュアル
 http://dev.mysql.com/doc/refman/5.1/ja/information-functions.html
・4.13.1. クエリ キャッシュの動作 - MySQL 5.1 リファレンスマニュアル
 http://dev.mysql.com/doc/refman/5.1/ja/query-cache-how.html
・MySQL 行カウント SQL_CALC_FOUND_ROWS の効果 - OSS iPedia
 http://ossipedia.ipa.go.jp/capacity/EV0603280115/

17:05 | コメント (1) | トラックバック | Programming

mylo(マイロ)が欲しい!

日記に書いておけば、天から降ってくるかもしれないので。

スケジューラ機能が付いていれば、サクッと購入していただろう。コミュニケーションするには、スケジュールの共有は必須!購入には踏み切れないけど、欲しいという中途半端な状況…。

Good

・音楽が聴ける
・動画が観られる
・Wi-Fi 機能が搭載

Bad

・スケジューラ機能が無い
・Windows Live Messenger が無い
・タッチパネル未搭載
・メモリースティック
・ブラウザで Gmail が閲覧できない(?)
・追加ソフトウェアのインストール不可

       |
   \  __  /
   _ (m) _ピコーン
      |ミ|
   /  .`´  \
     ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    (・∀・∩< スケジュール管理をする Skype のボットを作れば良い!
    (つ  丿 \_________
    ⊂_ ノ
      (_)

ダメだ。オフラインで確認できない。

【関連情報】
・パーソナルコミュニケーター“mylo(マイロ)”
 http://www.sony.jp/products/Consumer/Mylo/

14:39 | コメント (6) | トラックバック | Etc

キサラギ

邦画では珍しい(洋画でも珍しい?)、ワンシチュエーション・サスペンスということで観てきた。

一部で有名なアイドル如月ミキが自殺してから1年が経ち、家元の呼びかけでファンサイトの常連たちで一周忌追悼会を開く事にした。5人の男が集まった追悼会では、思い出話で盛り上がるはずだったのだが、オダ・ユージの「彼女は殺された」という言葉を引き金に、自殺の真相を推理するのだが…。

自殺したアイドル、如月ミキの一周忌 男、5人 この部屋で事件は起こる―

久しぶりの邦画であるが、満足できた。時間を忘れて最後まで観たのも久しぶりだし、スタッフロールが終わるまで観客が1人も席を立たなかった珍しい映画である。

映画というよりは、舞台向けの脚本と感じたが、回想シーンが作品を面白くするスパイスでもあるので、映像作品にしたのは正解だと思う。回想シーンは、現在のシーンと区別するために CG を交えてデフォルメしているのも良かった。

ワンシチュエーション・サスペンスなので、脚本と役者の演技力によって作品の出来が大きく左右される。飽きさせない脚本もそうだが、個々の役者の個性あふれる演技が良かった。ただ、ユースケ・サンタマリアの演技がいまいち…。本作品には、あまり合致しないかも。

B 級アイドルの追っかけに理解があり、映画特有の壮大さに期待しなければ、楽しめる作品だと思う。僕の場合は、身近に「本当の追っかけ」が居るので問題ないし(本日も東京に出ていると思う)、ソウや CUBE のような作品も好きなので…。自殺を題材にしているが、大いに笑える映画だと思うので、映画館に足を運んでみてはいかがでしょうか?

【関連情報】
・キサラギ
 http://www.kisaragi-movie.com/

11:00 | コメント (0) | トラックバック | Movies

少し気持ち悪いというかなんと言うか

飲むからこんな事に。ということで、昨日(28日)の食事内容です。

牛タン

夜は、備長扇屋に行ってみました。飲み屋なのですが、食べ物も出る。なかなか美味しい。最初に間違えて日本酒を飲んでしまったあたりから、少し酔い気味。今も残ってる気がしないでもない。

酔ったときは、足を冷やせばマシになると思う。後は、アルコールそのものよりも、食べたものが消化しないあたりが気持ち悪い原因ではないかな。

備長扇屋 (夜)
 いろいろ

10:52 | コメント (0) | トラックバック | Meal