2007-04-01 (日)
■ Zend_Auth のチュートリアル
Zend Framework 0.9.0 で Zend_Auth_Adapter_DbTable クラスというのが追加されて、 データベースを用いた認証処理ができるようになったが、 そのチュートリアルを Rob Allen 氏が公開している。
これを読んで、なんとなく使い方が分かったので、 自作のアプリでも Zend_Auth クラスを使うことを検討してみた。
しばらく試行錯誤してみて思ったが、 Zend_Auth クラスを使う際は、以下の2つを分けて考えた方が良いと思う。
- 認証処理
- 認証後のセッションの管理
どういうことかというと、Zend Framework のマニュアルに2通りの使い方が載っていて、
<?php
$authAdapter = new MyAuthAdapter($username, $password);
$result = Zend_Auth::getInstance()->authenticate($authAdapter);
if ($result->isValid()) {
……
}
のように Zend_Auth クラス経由で使うと、 認証に成功した後に username だけが自動的にセッションに保存されて、 それはそれで便利なのだが、
<?php
$authAdapter = new MyAuthAdapter($username, $password);
$result = $authAdapter->authenticate();
if ($result->isValid()) {
$data = new stdClass;
$data->username = $username;
$data->realname = $realname;
Zend_Auth::getInstance()->getStorage()->write($data);
……
}
のようにアダプタの authenticate() メソッドを直接使えば、 セッションに保存するユーザー情報をより細かく制御でき、 しかも前半の認証処理と、後半のセッションへの保存の処理を独立させることができる。
結局、自作のアプリケーションでも、 認証の部分はとりあえずそのまま DB を叩くようにしておいて、 セッション管理の部分だけ Zend_Auth クラスを用いるように書き換えてみた。 Zend_Session_Namespace なんかを使ってゴチャゴチャしていたコードが、 すっきりとしていい感じになった。
2007-04-03 (火)
■ google-code-prettify を試してみた
HsbtDiary さん経由で面白い記事を発見。
へぇ、google-code-prettify かぁ。 JavaScript によるシンタックスハイライタだが、 特定の言語にだけ対応しているのではなく、汎用的に使えるというのが興味深い。
で、試してみた。見た目は結構良いし、 pre タグで囲むだけでハイライトしてくれるのは非常に便利。 ただ IE で表示してコピペすると、 改行コードが全て除去されて1行になってしまうのはちょっと困る。 いや、ちょっとじゃないな、かなり困る。
なんとかならないものかと思い、コードをいじってもみたが、 JavaScript で innerHtml を使って加工する場合、 これはどうしようもないみたい。 ということで、個人的にはこれはボツ。
みんな、そういうことは気にしないのかねぇ、と思って検索してみたら、 ソースを表示してそこからコピペすればいい、 と書かれているのを見つけた。そういうもんなの?
2007-04-04 (水)
■ mb_ereg と mbereg
調べものをしていて、mbregex_encoding という表記を見かけた。 mb_regex_encoding の間違いじゃないの? と思ったが、 調べてみると、昔の PHP だとそういう関数があったらしい。 へぇ、そうだったのか。
さらに調べてみると、 そもそも mb_ereg 系の関数は PHP 4.2.0 以降でないと使えないことが判明。 そうか、そうすると、 PukiWiki の自作プラグインで mb_ereg を使っているものは、 PHP 4.2.0 以上必須ということになってしまうんだなぁ。
ちなみに現在の PukiWiki は、 Q&A/動作環境 によると PHP 4.1.2 以上で動くことになっている。 PukiWiki 本体が mb_ereg でなく preg を使ってごまかしているのは、 この辺が背景にあるのかね? でもなぁ。 dev:BugTrack/529 にあるように、ラッパーかませば済む話だと思うんだけど。
2007-04-07 (土)
■ Zend Framework 0.9.2 がリリース
変更点は こちら を参照。 バグフィックス中心なので特に言うこともないが、 メソッド名の変更がまたなされていて、 Zend_Config::asArray() が Zend_Config::toArray() に変わっている。 互換性維持の為に asArray() もまだ残ってはいるが、 今までのコードをまた書き換えないといけない。あーあ。
それと、 このページ に今後のリリーススケジュールが書かれているが、 自分用に書き写しておく。
| 0.9.3 | 2007/04/20 | Beta Release, bug fixes |
| 1.0.0 RC1 | 2007/04/27 | Release Candidate 1 |
| 1.0 GA | 2007/05/10 | Production release |
正式版まで、あと1ヶ月くらいか。
(追記)
あれ? 1.0.0 RC1 以降のリリース予定日が消されてしまった。 延期か? (2007/04/10)
2007-04-09 (月)
■ Debian 4.0 (Etch) がリリース
とりあえず netinst 用の CD をダウンロードしてきただけで、 まだ触っていないが、リリースノートを見ての個人的な感想。
- GUI のインストーラは苦心作なんだろうけど、個人的には要らないなぁ。
- パッケージ一覧の更新は、差分の分だけダウンロードするようになったらしい。それはいいな。
- AMD64 版が公式にサポートされるようになった。嬉しい。
- げっ、Apache 2.2 が標準なのか。移行に苦労するかも。
- UTF-8 が標準のエンコードに。あー、これも移行の際に何かトラブりそう。
自分が Debian を使い始めたのは Debian 3.1 (Sarge) からなので、 一応今回がメジャーバージョンアップ初体験、ということになる。 (昔、玄箱の Sarge 化はやった。) そのため、何をどうすればいいのかがあまり良く分かっていない。 apt-line に stable って書いてあるけど、 たしかこれも Sarge でなく Etch の方を指すようになっちゃうんだよな。
しばらく Sarge のまま使い続ける方が楽そうな気もするし、 テスト用に Sarge の環境も残しておこうと思うが、 まぁ、dist-upgrade するにしても VMware 上で実験してみてからだな。 週末辺りにやってみますか。
2007-04-12 (木)
■ strtotime のサポートする日付の範囲
アプリケーションのテストでかなり未来の日付を与えたところ、 strtotime() を使っている箇所で動作がおかしくなった。 多分 2038 年までしかサポートしていないんだろうと思いつつ、念のため strtotime() 関数のマニュアル で確認してみる。
注意: タイムスタンプの有効な範囲は、通常、Fri, 13 Dec 1901 20:45:54 GMT から Tue, 19 Jan 2038 03:14:07 GMT までです
strtotime() というより UNIX タイムスタンプの制限だな。 確か、この辺を回避するためのクラスが PEAR にあった気がする。 なんだったっけ?
検索してみた。これか。
まぁ、必要になったら使わせてもらいましょう。
あと strtotime() のマニュアルを読んでいたら、知らない関数を発見。
いつの間にこんな怪しい関数が。
2007-04-14 (土)
■ SMARTY_DIR の設定
Smarty のマニュアルを読んでいて気付いたが、 include_path の通っていないところに Smarty がインストールされている場合は、 SMARTY_DIR という定数を指定すればいいらしい。
- http://smarty.php.net/manual/en/installing.smarty.basic.php
- http://smarty.php.net/manual/en/smarty.constants.php
ということは、Zend Framework の Zend/View/Smarty.php も この定数を利用するようにした方がいいんじゃないかな? こんな風に。
if (defined('SMARTY_DIR')) {
require_once SMARTY_DIR . 'Smarty.class.php';
} else {
require_once 'Smarty.class.php';
}
class Zend_View_Smarty implements Zend_View_Interface
{
......
}
2007-04-15 (日)
■ Debian 4.0 (Etch) のインストールの練習
Debian 4.0 (Etch) を、 とりあえず1回練習ということで VMware 上に最小インストールしてみた。 いくつか気付いたことを書いておく。
デフォルトのインストーラはキャラクタベース
CD から起動したら、今までと同じ見た目のインストーラ画面が出てきた。 あれ? GUI のインストーラになったって言ってなかったっけ?
http://www.debian.org/releases/stable/i386/apds06.html.ja のマニュアルを読んで分かったが、
Press F1 for help, or ENTER to boot: installgui
のように起動時のパラメータとして installgui と入力しないと、 グラフィカル版のインストーラにはならなかった。
インストールの途中で再起動しなくて済むようになった
Debian 3.1 (Sarge) の時は、インストールの作業が2段階に分かれていて、 インストールの途中で1回再起動していたが、そういうことが無くなった。 たしか、Ubuntu のインストーラは前からそうなっていたと思うので、 ようやく、という気がしなくもない。
ディスクの消費量が増えている
VMware 上で最小インストールした時に、 Debian 3.1 の時はディスクの消費量が 300 MB くらいで済んでいたのに、 Debian 4.0 は 500 MB 以上消費している。ちょっと多すぎないか?
http://www.debian.org/releases/stable/i386/apds02.html.ja を読むと、こんなことが書かれていた。
英語以外の言語でインストールする場合、 その言語が有効なら tasksel は 地域化タスク を、自動的にインストールします。 必要な容量は言語によって異なりますが、 ダウンロードとインストールで最大 350MB 必要となります。
ふむ、なるほど。 確かに Anthy とか manpages-ja とか、 日本語用のパッケージがインストールされてしまっている。 それが原因か。
2007-04-17 (火)
■ Debian 4.0 (Etch) 最小インストール時のパッケージ
VMware のテンプレートとして使う目的で、 Debian Etch を最小インストールした仮想マシンを作りたいのだが、 前回試したように、普通に最小インストールすると、 500 MB 以上のディスク容量を消費してしまう。
そこで、インストールの途中の質問に対して、
- ネットワークミラーを使いますか
- いいえ
- インストールするソフトウェアの選択
- 全てチェックを外す
のように答えると、 インストールされるパッケージがさらに削られて、 ディスクの消費量が 360 MB くらいになった。 何のパッケージが削られているのか比較してみる。
- anthy
- doc-linux-ja-text
- im-switch
- jfbterm
- language-env
- libanthy0
- libedit2
- libuim-data
- libuim3
- lv
- manpages-ja
- manpages-ja-dev
- nkf
- perl
- perl-modules
- uim-anthy
- uim-common
- uim-fep
- uim-utils
- unifont
やはり、ほとんどが日本語関係のパッケージだね。 サーバ用途なら Anthy とかは別に要らないから、 こうやって最小インストールする方がいいかな。
ただ、lv や manpages-ja は自分的には必須なので、 そういうパッケージだけ追加でインストールするということで。
あぁ、そういえば、 Sarge の時は exim4 がデフォルトでインストールされたが、 Etch では最小インストールならメールサーバはインストールされないみたい。
2007-04-20 (金)
■ データのバイト数の求め方
PHP でバイナリデータのサイズを調べたい場合、 基本的には strlen 関数を使えばいいのだが、設定によってはうまくいかない場合がある。 環境によらず正しくバイト数を得るためには、こういう書き方をしなければならない。
if (ini_get('mbstring.func_overload') & 2 && function_exists('mb_strlen')) {
$size = mb_strlen($data, 'ASCII');
} else {
$size = strlen($data);
}
なぜこれでいいのかは、この辺のマニュアルを参照。
2007-04-24 (火)
■ Web Forum の投稿キーが表示されない
当サイトでは掲示板に Web Forum という CGI を使っているが、 海外からのスパムが増えてきたので、投稿キーの入力を必須にすることにした。 いわゆる CAPTCHA の簡易版みたいなもんです。
まず手元の環境で設定をいじって動作確認し、その後でサーバにアップロードしたが、 よく見ると肝心の投稿キーの画像が表示されていない orz
ちょっとあせったが、 しばらく考えてみて XREA の自動広告挿入が原因だろうと思いあたった。 掲示板は /bbs というディレクトリに設置しているので、 /bbs/.htaccess に以下のように書いてみた。
LayoutIgnoreURI /bbs/registkey.cgi
これで投稿キーの画像が表示されるようになった。
ただ、前から疑問に思っているのだが、このパスの部分を、 registkey.cgi とか ./registkey.cgi のように書いてもうまくいかない。 この部分はどう書くのが正しいのだろう?
2007-04-25 (水)
■ Debian Etch の仮想マシンでネットワークが使用不能に
なんだか最近、こんなトラブルばっかり (T_T) 。経緯としてはこうだ。
- VMware の仮想マシンに Debian Etch を最小インストール
- テンプレートとして使うためにスナップショットを取る
- スナップショットから仮想マシンのクローンを作成
- クローンを起動
こうやると、仮想マシンからネットワークになぜか接続できなくなる orz。 ifconfig とか ifup eth0 とかやっても、 eth0 というデバイスが見つからないと言われる始末。 さて問題です。何がいけないのでしょう?
最初に考えたのは、インストール時に MAC アドレスをどこかに保存しているんじゃないかということ。 仮想マシンのクローンを作ると、 NIC の MAC アドレスは重複しないよう自動的に変更される。 その結果、Debian 君は MAC アドレスの不整合に悩み、 デバイスが見つからないとか言ってきているんじゃないだろうか?
そういう予想を立てて調べてみたところ、結局それで正解。
- /etc/udev/rules.d/z25_persistent-net.rules
というファイルに、インストール時の MAC アドレスが保存されていた。 対処法はいろいろと考えられるが、 自分は、スナップショットを取る直前(インストール後の設定作業の一番最後)に このファイルを削除することにした。 そうすれば、次回起動時にこのファイルが作り直されるので、問題は解決する。
ちなみに Ubuntu でも、
- /etc/udev/rules.d/25-iftab.rules
- /etc/iftab
辺りのファイルが原因で同じようなことが起こるらしい。 そのうち VMware に Ubuntu をインストールする予定なので、 とりあえずメモしておく。
2007-04-26 (木)
■ Debian Etch 用 Dotdeb 版パッケージ
Dotdeb 版の Etch 用パッケージが出ている。 最初に気が付いた時は AMD64 版のパッケージだけが置かれていたが、 徐々に i386 版のパッケージも含めてそろってきた。
公式のパッケージを利用する方が、 細かい問題点が fix されているという点では良いと思うが、 Dotdeb 版のパッケージは、PHP や MySQL の最新版に早く追従してくれるのが良い。 これで最新版の PHP + Suhosin パッチという環境が Etch でもお手軽に作れる。
まぁ、普通に自分でソースからビルドしてもいいんだけどさ。 できたら aptitude コマンドでパッケージ管理したいもんで。
2007-04-30 (月)
■ favicon をつけてみた
どんなのにしようか迷ったが、緑の星のマークに決定。 一応、理由というか元ネタがあるのだが、デザイン的にも結構いいかな、ということで。
で、肝心のアイコンの画像ファイルだが、 ライセンスフリーの適当なものが見つからなかったので、自分で描いてみた。 どうやって描いたかというと、
- 100×100 ドットくらいで元絵を描く
- GIMP で 14×14 ドットの大きさにキュービック補間で縮小し、16x16 ドットのキャンバスの真ん中に配置
- GIMP で Sharpen のフィルタを強めにかける
- Yukari で16色に減色
- @icon変換 で ico フォーマットに変換
と、たしかこんな感じ。
