October 2006
Entries Title
Design Patter by PHP[4]: Factory Method
- Date
- 2006-10-31 (Tue)
- Category
- Design Pattern | php
第四回目は Factory Method です。コードは毎回 Subversion のレポジトリ
にあります。
今回の気づき
- PHP って packaging 機構はないのかなぁ。。PEAR にあるにはあるが、ちょとめんどい。そろそろ class auto load の仕組みをそろそろ覚えるべきかも。
実行結果は
$ php main.php
The card for Takashi will be made.
The card for John will be made.
The card for Carren will be made.
The card for Takashi will be used.
The card for John will be used.
The card for Carren will be used.
でした。
preg_* に関する覚え書き
- Date
- 2006-10-22 (Sun)
- Category
- php
正直言って、しょうもないことですが、ちょっとハマったので書き記しておきます。
PHP の Perl 互換正規表現 (PCRE) を使った関数群、で行頭記号 ( ^ ) を使ってもなんかマッチしないなぁ、とちょと悩みました。よくドキュメントを読みましょう。。
パターン修飾子 -- 正規表現パターンに使用可能な修飾子
現在使用可能な PCRE 修飾子の一覧を以下に示します。 括弧の中の名前は、これらの修飾子に関する PCRE 内部の名前です。 修飾子中での空白文字および改行は無視されます。他の文字はエラーになります。
〜〜 snip 〜〜
m (PCRE_MULTILINE) デフォルトで、PCRE は、検索対象文字列を(実際には複数行からなる 場合でも)単一の行からなるとして処理します。 「行頭」メタ文字 (^) は、対象文字列の最初にしかマッチしません。 一方、「行末」メタ文字 ($) は、文字列の最後、または (D 修飾子が設定されていない場合) 最後にある改行記号の前のみにしかマッチしません。 この動作は Perl と同じです。
だ、そうです。つまり、いわゆる空白行をマッチしたいときは…
preg_match("/^$/m", $haystuck, $match);
とかする必要があります。
Design Patter by PHP[3]: Template Method
- Date
- 2006-10-18 (Wed)
- Category
- Design Pattern | Tech | php
日々是鍛錬。
第三回目は Template Method です。コードは前回に引き続き、Subversion のレポジトリ
をどうぞ。
今回の気づき
- 毎回思っていたけれど、PHP では名前空間の制約が厳しく、標準ライブラリに存在する関数と同じ名前の関数を定義できない。前2回分では、SPL で宣言されているクラス名と当たっていて、今回は標準関数の print だった。特に関数はなんとかしてもらいたい所ではある。だって内側から呼ぶのも $this つけなきゃ行けないわけだし、ambiguity はなさそうだけれども…
- println ってなかったっけ??
- 字数を数えるのにちょっと苦労した。以下 StringDisplay.php より
要するに、mb_strlen と strlen で数えてみて、一致してなかったらマルチバイト文字列と判断して、そうだったら、とりあえず2倍にしてある。ホントは private $is_mb とかつけて、printLine() を工夫すべきか、な。$this->width = mb_strlen($this->str); if ( $this->width != strlen($this->str) ) { $this->width = $this->width * 2; }少し正確に話すと、unicode では(ASCII 互換以外の文字列、いわゆるダブルバイトと呼ばれているもの)1文字3byte消費しているの(だよね?)で、『あ』の1文字で strlen では 3 という返り値、mb_strlen では 1 という返り値を得る。ま〜正確ではあるけど、使いやすくはないのかな〜- 追記 on March 2007: Unicode 、と一緒くたに語っていますが、これは正確じゃない。例えば(日本語の wikipedia によればほとんど使われていないらしいが) UTF-1 は 8-bit (≒ 1byte) コード。ここで語ろうとしている UTF-8 はマルチバイトで可変長 ( 1〜4 byte ) 。『あ』が 3byte だったのは“たまたま”。この実装は間違いですな。
実行結果は
$ php main.php
<<HHHHH>>
+-------------+
|Hello, World.|
|Hello, World.|
|Hello, World.|
|Hello, World.|
|Hello, World.|
+-------------+
+------------+
|こんにちは。|
|こんにちは。|
|こんにちは。|
|こんにちは。|
|こんにちは。|
+------------+
でした。
Design Patter by PHP[2]: Adapter
- Date
- 2006-10-16 (Mon)
- Category
- Design Pattern | Tech | php
前回の イテレータ パターン からはだいぶ時間が空いてしまいました。本を友人に貸していたからなんですが、まぁ言い訳はこのくらいにして。
未だ Chpater 2: Adapter Pattern です。今回からは(昨日から運用開始した)Subversion を使ってレポジトリを公開〜。まだ非常に稚拙なコードですが、興味のある人は、
をどうぞ。
今回の気づき
- Java の super() は PHP で parent:: となる。
- PHP4 では class 名と同じ function がコンストラクタに、いわゆる Java と同じ形式だけだったのに、PHP5 から Object に __construct() という特殊関数ができて、誰が使うんだろーなー、と正直思っていたけれど、なるほど確かに parent::__construct() を呼ぶのに、統一的かつ合理的にするには __construct() を使うべきだと思いました。ちなみにマニュアルにはこう書いてあります。
For backwards compatibility, if PHP 5 cannot find a __construct() function for a given class, it will search for the old-style constructor function, by the name of the class. Effectively, it means that the only case that would have compatibility issues is if the class had a method named __construct() which was used for different semantics.
実際実験してみましたが、__construct() を class 宣言の中に含めなくても parent::__construct() で呼び出すことができています。
- PHP4 では class 名と同じ function がコンストラクタに、いわゆる Java と同じ形式だけだったのに、PHP5 から Object に __construct() という特殊関数ができて、誰が使うんだろーなー、と正直思っていたけれど、なるほど確かに parent::__construct() を呼ぶのに、統一的かつ合理的にするには __construct() を使うべきだと思いました。ちなみにマニュアルにはこう書いてあります。
- PHP とは関係なく、svnX の使い勝手の問題なんですが、Working Copies ウィンドウから開けるところで、Update ボタンを押すと、"Are you sure you want to update this working copy to the latest revision?" って聞いてくれるのだけれども、Yes を押すと、どれが変わるとかは言ってくれないで、黙ってアップデートされてるのがすこし気になった。
Subversion を Dreamhost で使ってみる。
- Date
- 2006-10-15 (Sun)
- Category
- Tech
『え〜今更〜』などの突っ込みは華麗にスルーする予定です。しかも先に結論を言うと Dreamhost にはデフォルトで Subversion がインストールしてあるので、難しいことは何一つしていません。使い初めなのでとりあえず事足りていますが、ま〜将来必要になれば build & install してエントリ書くかもしれませんが。
環境など
- PowerPC G5 dual 2GHz
- Mac OS X 10.4.8
ソフトウェア
手順
- まずは Subversion のソフトウェアをローカルのシステムにインストールする。
自分でビルドするのも悪くないですが、pkg にしてくれている人を発見。Marting Ott: subversion現時点(2006/Oct/15)で最新の Subversion 1.4.0 をダウンロードしてインストール。 - ローカルにレポジトリを作っていくつかテストをしてみて、ちゃんと動くことを確認。
参照: hyuki.com: Subversionの基礎練習
bluegate.org: Subversionによるバージョン管理(日本語訳)
チョとハマったのは svn import かな。結城さんの所で、とあるけれども、これは『カレントディレクトリ以下を新しいモジュールmyprojectとしてリポジトリにインポート』する場合。インポートするディレクトリを選ぶ場合は、svn import file:///C:/home/repos/myproject -m "Initial import."
という感じになる。import 後の第一引数が レポジトリに入れたいフォルダ で、第二引数が レポジトリのパス 。ただし必ずプロトコルを指定しなくてはいけない。例えば HTTP とか SVN とか FILE とか。-m はコメントをつけるし、--username はインポート(コミット)するユーザ名。かな。svn import /LOCAL/FILE/PATH/YOU/WANT/TO/IMPORT PROTOCOL://PATH/TO/REPOSITORY -m "message" --username USERNAME
- 次に Dreamhost 側にレポジトリを作る。通常の管理と一緒で、Web Admin Panel より行う。Goodies -> Subversion を選び、プロジェクトネームなどを登録。
- Mac OS X 上の client ソフトは svnX を使う。
RapidSVNも使ったけれど、wxWidgets を使っている UI の見た目があまり僕にはしっくりこなかったし、svnX の方が、動作が機敏のような気がする。 - svnX の設定。さっきコマンドラインからインポートしてあるので Repositories ウィンドウから設定して、項目をダブルクリックすれば、直ぐに作業中のファイルが確認できるはず。
- svnX で svn checkout ボタンを押せば、レポジトリからのチェックアウトが直ぐに行える。これは Working Copies というローカル作業環境の管理ウィンドウと連携している。
- svnX で作業を commit したいときは、この Working Copiesから行う。設定項目をダブルクリックすると、もう一枚ウィンドウが開き、もし更新されたファイルがあればここに表示される。
とりあえずこんな所でしょうか。ふむ。
CLI と SAPI, あるいは Google Code Search について
- Date
- 2006-10-09 (Mon)
- Category
- php
PHP は Web 専用のプログラミング言語だと誤解されがちですが、実際には、CLI (Command Line Interface) と云って、shell から直接起動できるバイナリも普通は一緒についてくるので、普段の shell script とか、ワンライナーみたいなことをやろうと思えばできます。
僕は結構 cron から立ち上げる php スクリプトを書いたりすることもあるんですが、例えば shell 起動と Web 経由では View 部分を変えるけど、Model/Controller は一緒、みたいなのは技術的には可能ですよね。さてどうしよう?というのが今回の疑問でした。
結論から言うと、
string php_sapi_name ( void )
という関数がありました。戻り値の string は起動した interface を保持しています。CLI 起動だと "cli" とか mod_php 起動なら "apache" で、cgi 起動なら "cgi"。サイトの例にあるように、文字列判別をすればそのまま使えそうです。
これをどうやって見つけたか?この間発表になったばかりの Google Code Search を使ってみました。英語でコードを検索する時、例えば PHP だとひたすら cvs.php.net とか bugs.php.net とかが検索結果上位に来ていてあんまり役に立ってなかったけど(こういう時日本語は便利)、code search なら一発でした。 CLI SAPI branch lang:php 英語の思いついた素直なキーワードですぐ出てきた。これは便利かもしれません。
全く印象の余談ですが、Google Code Search、ちょっと速くなったような?今まで safari で検索結果の code を見ようとすると javascript object かしらん?表示は完了していても何か別項目をひたすらロードし続けていたけれど、今はちゃんとロード完了するし、何となく code 表示が機敏になったような。
Iseki Ratatouille
- Date
- 2006-10-08 (Sun)
- Category
- diary
暫くばたばたしていたので、だいぶ間が空いてしまいました。来月になるまでは整理がつかない予定です。というわけで、脱力系の料理エントリでも挟んでおきます。井関君直伝のラタトゥイユの作り方。今回は以下のレシピにベーコンを少し加えてみました。Wikipedia: ラタトゥイユ によれば、水は足さないらしい。そういえばそんなことを井関君にも言われた気がします。まぁ名前の由来が『ごった煮』ならなんでもありかな、なんて。
材料(4人分)
- ズッキーニ
- 2本
- なす
- 4本
- 玉ねぎ
- 大1個
- パプリカ
- 色違いで2個
- トマト
- 4個
- オリーブオイル
- 大さじ3
- にんにく
- 1かけ
- タイム
- 4〜5本
- 塩
- 適宜
作り方
- ズッキーニとなすは1cmの輪切り、にんにくはみじん切りに。その他の野菜は2cmの角切りにする。
- フライパンを中火にかけオリーブオイル大さじ1とにんにく半量を入れ、トマト以外の野菜を1種類ずつ順番ににんにくとオイルを足しながら、軽く塩を振りつつ炒める。それぞれ半分位火が通ったら、煮込み用の鍋に移す。まとめて炒めるより手間がかかるけど、断然おいしくなる。
- 鍋に移した野菜の上にタイムを乗せ、ふたをして弱火にかける。20分ほど煮たら、トマトと塩を少し加え混ぜ再びふたをし、さらに20分ほど弱火で煮込む。