XAMPP に含まれる Apache,MySQL,PHP のバージョンの遷移

  今年もまた約一年ぶりに調査。もはやこの情報が役に立つかどうかは不明ですが……

XAMPP      リリース日 Apache 2.x MySQL 4.x MySQL 5.x PHP 4.x    PHP 5.x
0.9        2003-07-22 2.0.47      4.0.14                4.3.3 rc2
1.0        2003-09-03 2.0.47      4.0.14                4.3.3     
1.1        2003-10-13 2.0.47      4.0.16                4.3.3     
1.2        2003-11-04 2.0.48      4.0.16                4.3.4     
1.3        2004-02-10 2.0.49      4.0.18                4.3.6     
1.4        2004-03-25 2.0.49      4.0.18                4.3.4     
1.4.2      2004-04-06 2.0.49      4.0.18                4.3.6     
1.4.3      2004-06-12 2.0.49      4.0.20a               4.3.7     
1.4.4      2004-07-03 2.0.50      4.0.20                4.3.7     
1.4.5      2004-07-14 2.0.50      4.0.20                4.3.8      5.0.0
1.4.6      2004-08-16 2.0.50      4.0.20                4.3.8      5.0.1
1.4.7      2004-09-18 2.0.51      4.0.21                4.3.8      5.0.1
1.4.8      2004-09-25 2.0.51      4.0.21                4.3.9      5.0.2
1.4.9      2004-10-02 2.0.52      4.0.21                4.3.9      5.0.2
1.4.10     2004-12-05 2.0.52      4.1.7                 4.3.9      5.0.2
1.4.11     2004-12-25 2.0.52      4.1.8                 4.3.10     5.0.3
1.4.12     2005-02-20 2.0.53      4.1.9                 4.3.10     5.0.3
1.4.13     2005-04-10 2.0.54      4.1.11                4.3.11     5.0.4
1.4.14     2005-06-19 2.0.54      4.1.12                4.3.11     5.0.4
1.4.15     2005-08-14 2.0.54      4.1.13                4.4.0      5.0.4
1.4.16     2005-10-03 2.0.54      4.1.14                4.4.0      5.0.5
1.5.0      2005-11-06 2.0.55                 5.0.15     4.4.1      5.0.5
1.5.0-pl1 2006-01-08 2.0.55                 5.0.15     4.4.1-pl1 5.0.5
1.5.1      2006-01-08 2.2.0                  5.0.18     4.4.1-pl1 5.1.1
1.5.2      2006-04-26 2.2.0                  5.0.20     4.4.2-pl1 5.1.2
1.5.3      2006-05-28 2.2.2                  5.0.21     4.4.2-pl1 5.1.4
1.5.4      2006-09-10 2.2.3                  5.0.24a    4.4.4      5.1.6
1.5.4a     2006-10-04 2.2.3                  5.0.24a    4.4.4      5.1.6
1.5.5      2006-11-26 2.2.3                  5.0.27     4.4.4      5.2.0
1.6.0      2007-02-18 2.2.4                  5.0.33     4.4.5      5.2.1
1.6.0a     2007-02-21 2.2.4                  5.0.33     4.4.5      5.2.1
1.6.1      2007-04-17 2.2.4                  5.0.37     4.4.6      5.2.1
1.6.2      2007-05-28 2.2.4                  5.0.41     4.4.7      5.2.2
1.6.3      2007-07-22 2.2.4                  5.0.45     4.4.7      5.2.3
1.6.3a     2007-07-26 2.2.4                  5.0.45     4.4.7      5.2.3
1.6.4      2007-10-07 2.2.6                  5.0.45     4.4.7      5.2.4
                                                                    
最新版                 2.2.6       4.1.22     5.0.45     4.4.7      5.2.4


  最新版は,2007-11-04 での各プロダクトの最新バージョン.
  調査対象は XAMPP for Windows.

- XAMPP
  http://sourceforge.net/projects/xampp/
  http://www.apachefriends.org/en/xampp.html

PEAR::Pager で生成されるリンクを並び替える方法

- ウノウラボ Unoh Labs: PEAR::Pagerで生成されるリンクを並び替える
  http://labs.unoh.net/2007/11/pearpager.html

  上記エントリで、PEAR::Pager で生成されるリンクを並び替えるために Pager_Common クラスの Build() メソッドを書き換える方法が紹介されていました。
  そこで、ここでは Build メソッドを書き換えずに、getLinks() メソッドを利用して、リンクを並び替える (任意の項目を任意の順序で表示する) 方法を紹介します。

  上記エントリのように以下の順序で出力する方法です。

前のページ [最初のページ] n ~ m 番目のページ [最後のページ] 次のページ

require_once 'Pager/Pager.php';

$params = array(
    'mode' => 'sliding',
    'delta' => 5,
    'perPage' => 5,
    'prevImg' => '<<',
    'nextImg' => '>>',
    'totalItems' => 1000,
    'spacesBeforeSeparator' => 1,
    'spacesAfterSeparator' => 1,
);

$pager =& Pager::factory($params);
$links = $pager->getLinks();
if ($links['pages'] != '') {
    echo $links['back'], ' ', $links['first'], $links['pages'], $links['last'], ' ', $links['next'];
}


  このようにすることで、以下のような出力が得られます。

  PEAR::Pager

  getLinks() メソッドの戻り値を利用して、任意の順序で出力するだけです。

  getLinks() メソッドは以下のような連想配列を返します。

back      前のページへのリンク
pages     n ~ m 番目のページへのリンク ($pager->links と同じ)
next      次のページへのリンク
first     最初のページへのリンク
last      最後のページへのリンク
linktags サイトナビゲーション用のリンク (参考)


  linktags は以下のようなものが返されます。

<link rel="first" href="./pager.php?pageID=1" title="first page" />
<link rel="previous" href="./pager.php?pageID=7" title="previous page" />
<link rel="next" href="./pager.php?pageID=9" title="next page" />
<link rel="last" href="./pager.php?pageID=200" title="last page" />


  このように getLinks() メソッドの戻り値をうまく使えば、任意の項目を任意の順序で表示することができます。

  ちなみに私が好んで指定するオプションは以下のようなものです。最初/最後のページへのリンクは表示しないことも多いです。

require_once 'Pager/Pager.php';

$params = array(
    'mode' => 'sliding',
    'perPage' => 20,
    'delta' => 5,
    'urlVar' => 'p',
    'separator' => ' |',
    'curPageSpanPre' => '',
    'curPageSpanPost' => '',
    'prevImg' => '&lt;前の20件',
    'nextImg' => '次の20件&gt;',
    'firstPageText' => '最初',
    'firstPagePre' => '[',
    'firstPagePost' => ']',
    'lastPageText' => '最後',
    'lastPagePre' => '[',
    'lastPagePost' => ']',
    'spacesBeforeSeparator' => 0,
    'spacesAfterSeparator' => 1,
    'totalItems' => 1000,
    'altFirst' => '最初のページへ移動',
    'altPrev' => '前のページへ移動',
    'altNext' => '次のページへ移動',
    'altLast' => '最後のページへ移動',
    'altPage' => 'ページ',
);

$pager =& Pager::factory($params);
$links = $pager->getLinks();
if ($links['pages'] != '') {
    echo $links['first'], $links['back'], ' | ', $links['pages'], ' | ', $links['next'], ' ', $links['last'];
}


  出力は次のようになります。

PEAR::Pager

PEAR Log を使って Firebug にログを出力する

  PEAR Log 1.9.11 から Firebug にログを出力することができるようになったみたいなので試してみました。

- PEAR :: Package :: Log
  http://pear.php.net/package/Log

- Firebug - Web Development Evolved
  http://www.getfirebug.com/jp.html

require_once 'Log.php';

$log = &Log::singleton('firebug', '', 'PHP', array('buffering' => true), PEAR_LOG_DEBUG);

$log->log('デバッグレベルのログ', PEAR_LOG_DEBUG);
$log->log('情報レベルのログ', PEAR_LOG_INFO); // この場合は、PEAR_LOG_INFO は省略可
$log->log('警告レベルのログ', PEAR_LOG_WARNING);
$log->log('エラーレベルのログ', PEAR_LOG_ERR);


  コードはこれだけで、log() メソッドでログを出力します。

PEAR Log Firebug

  生成される HTML は以下のようになります。

<script type="text/javascript">
console.debug("PHP [debug] デバッグレベルのログ");
console.info("PHP [info] 情報レベルのログ");
console.warn("PHP [warning] 警告レベルのログ");
console.error("PHP [error] エラーレベルのログ");
</script>


  singleton の第 4 引数はオプションですが、上記の例ではバッファリングを有効にしています。
  バッファリング有効にすると JavaScript が HTML の一番最後に追記されるようになります。
  逆に、バッファリングを有効にしない場合 (デフォルト) は、log() メソッドの場所に JavaScript が生成されるようになります。

  header() で何か出力しているときや、セッションを使う場合はバッファリングが無効だと問題になる場合があるので、そのようなときには、バッファリングを有効にすることで、問題なくログを出力することができる場合があります。

PHP カンファレンス 2007 レポート

  2007-09-01 に PHP カンファレンスが大田区産業プラザ (PiO) で行なわれました。
  自分が見たプログラムの内容をメモしておいたので簡単にまとめます。また、まとめながら調べたことも一緒に記述しています。

  なお、間違いがあるかもしれませんが、その際は教えていただけるとありがたいです。

- PHPカンファレンス2007プログラム概要
  http://www.php.gr.jp/seminar/20070901/prog.php

1. 基調講演「PHP の今とこれから 2007」

PHP 4.3/4.4 の利用率は 75% 程度

PHP 5 について

PHP 5.2 について

PHP 5.3 について

  • 本来は予定にはなかった
  • 2008/01 以降にリリースか?
  • PHP 6 までのつなぎのバージョン
    • Unicode サポート以外の新機能が入るかもしれない
  • ICU (国際化) 拡張
    • IBM が開発している国際化用のライブラリ
  • OpenSSL で OpenID がサポートされる
  • 名前空間も?

PHP 4.4/5.1/5.2/6.0 のベンチマーク

  • php-5.x.x/Zend/bench.php を使用
  • PHP 5.2 が今のところ一番早い

セキュリティーについて

PHP 6.0 について

  • Unicode 対応
    • ICU 3.4 をエンジンとする
    • 内部的には UTF-16
    • echo strlen('日本語'); // -> 3
    • mbstring は不要になるか? (微妙な状況)
    • エンコードの検知の精度がまだ低い
  • レガシーコードの削除
    • register_globals
    • magic_quotes_*
    • safe_mode
    • zend.ze1_compatibility_mode
  • MySQLND (MySQL Native Driver)
    • libmysql の代替ライブラリ
    • PHP 5/6 をサポート (PHP 6.0 には標準バンドル。PHP 5.3 にも?)
    • MySQL 4.1 以上をサポート
  • 新しいガベージコレクタ

Namespace (名前空間)

2. 大規模サイトの構築・運用ノウハウ (仮題)

  • ウノウ、GREE の CTO 対談
  • サーバマシンは統一する
  • テーブルは JOIN しない

ウノウの場合

GREE の場合

  • スライド中に「GREE に入りたい」のサブリミナル効果
  • ページビュー、サーバ台数、ユーザ数など (非公開っぽいので省略)
  • フレームワークはもちろん Ethna
  • TEXT を外に出す

     +-----+----------+
     | UID | 名前     |
     +-----+----------+
     |  7  | すなおか |
     +-----+----------+
        ↑
        ↓
+----+-----+-------------+
| ID | UID | 内容 (TEXT) |
+----+-----+-------------+
|  1 |  7  | ほげほげ... |
+----+-----+-------------+

  • テーブル (DB) を分割する

                            +----+-----+---------+
+-----+----------------+    | ID | UID | 内容    |
| UID | パーティション |    +----+-----+---------+
+-----+----------------+    |  1 |  7  | ...     |
|  7  |              1 | → +----+-----+---------+
+-----+----------------+
|  9  |              2 | → +----+-----+---------+
+-----+----------------+    | ID | UID | 内容    |
                            +----+-----+---------+
                            |  2 |  9  | ...     |
                            +----+-----+---------+

  • JOIN しない
  • 正規化がんばらない
  • 本番機への投入は rsync

3. PHP Framework Update

symfony

1590597869

  • 間もなく 1.1 のベータリリース

CakePHP

Piece Framework

  • ステートフルでセキュアな Web アプリケーションフレームワーク
  • 個別のライブラリだけを使用することもできる
  • Piece IDE のデモ (現在は Eclipse のプラグイン)
    • ウィザード式の画面がビジュアルに作成できる (楽しい)
    • 出力は YAML

Ethna

  • 今後の方向性
  • いろいろ直したいところとか

4. PHP at Yahoo!

Y! について

  • 13 億 3800 万ページビュー
  • 1960 万アクティブユーザ ID
  • 2007/08 現在 140 サービス

Y! と PHP の関係

  • PHP 界隈で有名な人が在籍
  • PHP のバグはまず Y! 社内にレポートされる (PHP に独自のパッチを当てているため)
  • 当初は FreeBSD 2.1 上の独自システムで構築
    • Web サーバ: Filo Server -> Apache (1996 年)
    • DB: フラットファイル -> MySQL (1998 年)
    • yScript -> PHP (2002 年)
  • Oracle も使うよ
  • FreeBSD、Apache、PHP には独自のパッチを当てている
  • C++ で書かれたライブラリを PHP 拡張から呼び出す
  • 日本ではフロントエンドはほとんどが PHP

なぜ PHP を採用したか

  • Web 用の言語
  • 高いパフォーマンス
  • 大きなコミュニティ
  • ライブラリが充実している、拡張性がある
  • ツールが豊富 (IDE、プロファイラ、デバッガ)
  • トレーニングコストが低い

現在の PHP

  • フレームワークはほとんど使っていない
    • HTML ページ: 5% PHP
    • ヘルパー (ヘッダ出力など): 50% PHP
    • ビジネスロジック: 100% PHP
    • コア: C/C++
  • PHP は最低限でビルド

$ ./configure --disable-all

  • 必要なモジュールは共有モジュールとしてインストール
    • 不必要な依存性を下げる
    • メモリの使用量を下げる
    • 再コンパイルが不要
    • しかし、Apache 起動時に若干のオーバーヘッドが

PHP 5 への移行について

  • 日本では 4.4 系がメイン
    • 2007 年末までに 5 系へ
    • 2008 年には 5.2 系へ移行する

セキュリティについて

  • 開発ルール・プラットフォームの整備による開発
  • Scanmus
    • Rasmus が開発した XSS 検出ツール
  • open_basedir を設定
  • allow_url_fopen = Off、allow_url_include = Off
    • 必要があれば libcurl を利用
  • safe_mode = Off
  • display_errors = Off
    • しかし log_errors = On でログには残す
  • error_reporting = E_ALL
  • ユーザからの入力値はフィルタリングする
  • PHP 5.2.0 からのフィルタ拡張を利用する
    • Y! から PHP コミュニティに還元した拡張
    • Y! 社内では PHP 4 でも利用できるように PHP 自体にパッチを当てている
  • CSRF 対策は Crumb (セッション追跡用の秘密情報) を利用

パフォーマンス

  • APC を利用 (Rasmus が携わっているため)
    • xdebug + WinCacheGrind・KCacheGrind
  • PHP 拡張の開発
    • C/C++ に PHP を埋め込んで利用することも (Web アプリではない)
  • セッションの利用を避ける
  • Cookie を利用して画面遷移に必要な情報は POST で (hidden) で埋め込む
  • r3 (テンプレート管理ツール) を開発
    • 日本語の解説がある (どこだろう?)
  • OSS のフレームワークのはあまり利用しない
    • 汎用的すぎてパフォーマンスに問題があるので
  • 実装はエンジニアに委ねる
    • プロダクトに特化した独自のフレームワークを利用している場合も
    • トップページ専用の CMS とか
  • Smarty はオーバーヘッドが Y! では無視できないので利用しない
  • symfony は使い始めた
    • Yahoo! Bookmarks
    • del.icio.us
    • Yahoo! Answers (Yahoo! 知恵袋)
    • いろいろカスタマイズしている
  • CakePHP
    • 検討中
    • ただし、利用実績も予定もなし

まとめ

  • 5 年ほど PHP を使っている
    • いろいろカスタマイズしている
  • PHP 拡張を多用している
  • OSS のフレームワークはあまり使っていない
    • symfony は使い始めた
  • IDE は使っていない
  • CVS を使っている

5. ライトニングトーク

  • 人が多すぎで 6F から 2F に移動

モバイル開発における PHP の利用方法と Tips

  • 資料
  • 携帯サイトと PC サイトの違い
  • PEAR Net_UserAgent_Mobile
  • 文字コード
    • sjis-win、eucjp-win を利用する
    • DB は cp932
  • 絵文字
  • Cookie は使えない

Usagi Project

  • OpenPNE 2.4系の派生プロジェクト
  • PHP ライセンス
  • いっしょに開発しませんか

PEAR DB_DataObject 開発ケーススタディ

  • DB をまたぐテーブルの結合をサポートした
  • テスト重要

PHP で画像処理をしてモテようかなと思って

PHP プログラマのための恋愛術

  • ふつうに恋愛論
  • PHP の話は出ない

code なにがしについて

  • 資料PDF
  • ググれといわれない場を
  • みんな優しい

ケータイキット for Smarty について

  • モバイルサイトに特化した Smarty
  • モバイルサイト開発の問題点を解消
  • 個人利用は無償

PHP でシェルを作る

  • /dev/null T シャツ
  • PHP で書かれた phsh を開発
    • もうじき公開? -> 公開されました
  • ログインシェルにもできる
  • eval で処理してるっぽい
  • シェルは偉大

6. スペシャルセッション

  • Piece IDE のデモのリベンジ
  • 基調講演の続き
    • 開発体制
    • ユーザ会など

以上、大雑把ですがまとめてみました。講師のみなさんありがとうございました。
懇親会にも出席していろいろな方と名刺交換・お話ができて充実した一日でした。

最後に戦利品です。

1. Yahoo! JAPAN さんに頂いたメモパッド

メモパッド

2. Asial さんに頂いた時計

時計

3. アイデアマンズさんに頂いた LED

LED

PHP の変数をトレースする HTTPTrace をちょっと改造してみた

  HTTPTrace とは、Windows アプリケーションと連動して PHP の変数の内容を表示するツールです。
  以下のページにて配布されています。

- 過去と他人はかえられないが、未来と自分はかえられる - [PHP]値を調べたい時に外部に出力するツール(var_dumpするよか便利)
  http://d.hatena.ne.jp/magiwo/20070821

  HTTPTrace は print_r() や var_dump() と異なり、ブラウザなどの画面ではなく Windows アプリケーションに変数の内容を表示するのが特長です。
  面白そうなので少し試してみました。

  まず、HTTPTraceServer.exe を起動して [Start] を選択します。このアプリケーションが PHP から変数の内容を受け取る HTTP サーバになっているようです。

  次にサンプルプログラムを動かします。

// HTTPTrace ライブラリ
require_once 'htrace.php';

// HTTPTraceServer.exe を実行しているマシンの設定
htrace_set('192.168.1.100', 6006);

// 変数の内容を送信
htrace($_SERVER);


  これをブラウザで実行すると HTTPTraceServer.exe は以下のように表示されます。

  

  使い方はいたって簡単ですが、いくつか気づいた点があったので改造してみました。

1. allow_call_time_pass_reference = Off のとき警告がでる。

  php,ini などで allow_call_time_pass_reference が Off (デフォルトは On) の場合は、以下のように警告が表示されます。

Warning: Call-time pass-by-reference has been deprecated

  ソースを見ると fsockopen() の 第 3, 4 引数をリファレンスで渡しているのが原因で、これはリファレンスで渡す必要がないので、修正しました。

// 修正前
$fp = fsockopen($host, $port, &$err_num, &$err_msg, 1);

// 修正後
$fp = fsockopen($host, $port, $err_num, $err_msg, 1);

2. HTTPTraceServer.exe が起動していないとき警告がでる。

  当たり前といえば、当たり前ですが若干気になったのでエラー制御演算子 (@) で警告が出ないようにしました。

// 修正前
$fp = fsockopen($host, $port, $err_num, $err_msg, 1);

// 修正後
$fp = @fsockopen($host, $port, $err_num, $err_msg, 1);

3. ソースファイルのパスが UNIX 環境でうまく区切れていない

  HTTPTraceServer.exe は htrace() されたソースファイルをツリー上に表示してくれて非常に便利なのですが、UNIX 環境ではうまく表示されません。例えば以下のようにツリーではなく一行で表示されます。

%2Fhome%2Fhttpd%2Fpocari%2FHTTPTrace-0.1.0%2Fsample.php

  Windows 環境を想定しているのかパスの分解が \ (バックスラッシュ) になっていたので、DIRECTORY_SEPARATOR (PHP4 >= 4.0.7, PHP 5) を使って、これを修正しました。

// 修正前
$exp = explode('\\', $debug['file']);

// 修正後
$exp = explode(DIRECTORY_SEPARATOR, $debug['file']);


  これで無事にソースがツリー上に表示されるようになりました。

4. 何かしらの定数で htrace() を実行しないようにしたい

  具体的には USE_HTRACE という定数を実装して、これが false の場合は htrace() が無効になるようにしました。

// 修正前
function htrace($vars, $stop=false)
{
    $trace = debug_backtrace();
    $debug = array_shift($trace);
    $exp = explode('\\', $debug['file']);
    $key = '';
    foreach ($exp as $num=>$dt) {
        $key .= rawurlencode($dt).'/';
    }
    $key .= sprintf("%05d", $debug['line']);
    $inc = new HTTPTraceClient();
    $inc->ModeGlobal();
    $inc->SendValue($key, $vars, $stop);
}

function htrace_set($ip='localhost', $port=6006)
{
    $inc = new HTTPTraceClient();
    $inc->ModeGlobal(array('ip'=>$ip, 'port'=>$port));
}

// 修正後
if (!defined('USE_HTRACE')) {
    define('USE_HTRACE', true);
}

if (USE_HTRACE) {
    function htrace($vars, $stop=false)
    {
        $trace = debug_backtrace();
        $debug = array_shift($trace);
        $exp = explode(DIRECTORY_SEPARATOR, $debug['file']);
        $key = '';
        foreach ($exp as $num=>$dt) {
            $key .= rawurlencode($dt).'/';
        }
        $key .= sprintf("%05d", $debug['line']);
        $inc = new HTTPTraceClient();
        $inc->ModeGlobal();
        $inc->SendValue($key, $vars, $stop);
    }

    function htrace_set($ip='localhost', $port=6006)
    {
        $inc = new HTTPTraceClient();
        $inc->ModeGlobal(array('ip'=>$ip, 'port'=>$port));
    }
} else {
    function htrace() {}
    function htrace_set() {}
}


  これを利用することで、htrace.php を require/include する前に USE_HTRACE を false に設定すれば htrace() は何もしなくなって便利です。

// htrace を無効にする
define('USE_HTRACE', false);

require_once 'htrace.php';
htrace_set('192.168.1.100', 6006);

// なにもしない
htrace($_SERVER);


  以上のパッチを以下においておきます。

- HTTPTrace-0.1.0.diff
  http://pocari.org/tools/HTTPTrace/HTTPTrace-0.1.0.diff

  このような PHP のデバッグツールは大変ありがたいです。使いどころによっては大変威力を発揮するツールだと思います。

- 追記 (2007-08-31)
  上記パッチを適用していただきました。ありがとうございます。
  http://d.hatena.ne.jp/magiwo/20070830

phpMyAdmin のテーマを集めてみました

  phpMyAdmin をお使いの人は知っていると思いますが、phpMyAdmin はテーマを変更することができます。
  複数の phpMyAdmin を使い分けているときに、テーマを変えておくことで誤操作を減らすことができます。

  テーマは、SourceForge の phpMyAdmin のプロジェクトからダウンロードできます。

- SourceForge.net: phpMyAdmin
  http://sourceforge.net/project/showfiles.php?group_id=23067

  ところが、テーマのサムネイルなど用意されていないので、どのようなテーマかダウンロードしてみるまでわかりません。

  そこで、上記ページからダウンロードできるテーマを集めて、サムネイルを作成してみました。

  まずは、バンドルされている 2 つのテーマから。

- original
  

- darkblue_orange
  

  次に、追加でダウンロードできるテーマです。

- aqua
  

- aqua_brushed
  

- arctic_ocean
  

- cactica_blues
  

- crimson_gray
  

- darkblue_gray
  

- dark_lime
  

- garv_blue
  

- green_orange
  

- grid
  

- openphpnuke
  

- original_small
  

- paradice
  

- pixeline
  

- silk
  

- very_small
  

- xampp
  

- xp_basic
  

- xp_blue
  

- xp_dirty
  

- xp_green
  

- xp_silver
  

Ethna×PHP LL フレームワーク Books

  4774131393
  http://www.amazon.co.jp/o/ASIN/4774131393/todaysnonsenc-22/ref=nosim/
  藤本 真樹/一井 崇/鶴岡 直也/新井 啓太 (著)
  技術評論社
  ISBN: 4774131393
  2007/6/27
  1,980 円

本書は PHP を利用した Web フレームワーク・Ethna (エスナ) の解説書です。
Web フレームワークとは何か,Ethna を使うために何が必要かなどの基礎知識からはじまり,
開発環境のインストールと設定,Ethna を利用した簡単な Web アプリケーションの作成までを一通り解説します。
Web プログラミングを勉強中の人,PHP による Web アプリケーション開発のスキルを向上させたい人にお勧めできる一冊です。

PHP による JavaScript を書かない Ajax

  4861671752
  http://www.amazon.co.jp/o/ASIN/4861671752/todaysnonsenc-22/ref=nosim/
  佐久嶋 ひろみ (著)
  九天社
  ISBN: 4861671752
  2007/05
  3,150 円

  HTML_AJAX/xajax,CakePHP/symfony の情報など

- サポートページ
  http://sakushima.net/BOOK/AjaxFramework/

PHP の round(0.49999999999) が 1 になるのか実際に試してみた

  以下のサイトにて,PHP の round() の挙動について解説されていました.
  そこで,実際に 1 になるのかどうか試してみました.

- hnwの日記 - PHPの奇妙なround関数
  http://d.hatena.ne.jp/hnw/20070515

  結論から書くと,1 になる場合もならない場合もありました.こういうのが一番困ります.
  分かったことは,バージョンによる差ではなくて,環境による差だろうということです.

  round() を使う前にその環境で確認しておくことが重要ですね.

1 になる環境

$ uname -mrs
Linux 2.4.9-e.9.18mlsmp i686

$ php -v
PHP 4.3.3 (cli) (built: Oct  9 2003 14:50:50)
Copyright (c) 1997-2003 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2003 Zend Technologies

$ php -r 'var_dump(round(0.49999999999));'
float(1)

$ uname -mrs
Linux 2.6.9-42.ELsmp i686

$ php -v
PHP 4.4.7 (cli) (built: May 28 2007 14:26:24)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

$ php -r 'var_dump(round(0.49999999999));'
float(1)

$ uname -mrs
Linux 2.6.17.13-smp i686

$ php -v
PHP 4.4.6 (cli) (built: May  2 2007 16:49:35)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

$ php -r 'var_dump(round(0.49999999999));'
float(1)

1 にならない (0 になる) 環境

$ uname -mrs
Linux 2.4.9-e.9.18mlsmp i686

$ php -v
PHP 4.3.2 (cli) (built: May 10 2004 15:01:20)
Copyright (c) 1997-2003 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2003 Zend Technologies

$ php -r 'var_dump(round(0.49999999999));'
float(0)

$ uname -mrs
SunOS 5.10 i86pc

$ php -v
PHP 4.4.7 (cli) (built: May 13 2007 13:56:00)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

$ php -r 'var_dump(round(0.49999999999));'
float(0)

$ uname -mrs
SunOS 5.10 i86pc

$ php -v
PHP 5.2.2 (cli) (built: May 13 2007 14:15:44)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

$ php -r 'var_dump(round(0.49999999999));'
float(0)

$ uname -mrs
SunOS 5.10 sun4u

$ php -v
PHP 5.2.1 (cli) (built: Feb 28 2007 16:54:38)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

$ php -r 'var_dump(round(0.49999999999));'
float(0)

$ uname -mrs
Linux 2.6.17.13-smp i686

$ php -v
PHP 4.4.4 (cli) (built: Jan  8 2007 00:09:11)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

$ php -r 'var_dump(round(0.49999999999));'
float(0)

$ uname -mrs
Linux 2.4.32 i686

$ php -v
PHP 4.4.4 (cli) (built: Sep  9 2006 10:36:27)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

$ php -r 'var_dump(round(0.49999999999));'
float(0)

$ uname -mrs
Linux 2.6.17.13-smp i686

$ php -v
PHP 5.2.2 (cli) (built: May 25 2007 00:09:33)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

$ php -r 'var_dump(round(0.49999999999));'
float(0)

$ uname -mrs
SunOS 5.8 i86pc

$ php -v
PHP 4.3.4 (cli) (built: Nov 30 2005 06:29:37)
Copyright (c) 1997-2003 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2003 Zend Technologies

$ php -r 'var_dump(round(0.49999999999));'
float(0)

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);
?>