Zend_DateとZend_Localeの罠

罠というほどではないのかもしれないが、今回は罠ってことにさせてもらう。
このために、3時間くらいの時間を使ってしまったから。

Zend_Dateクラスを引数なしで生成した場合、つまり
$date = new Zend_Date();
って記述した場合。

この場合は、内部でZend_Localeが呼び出され、
ブラウザ->サーバ設定->フレームワーク設定の順で、Locale設定を検索する。
Locale設定とは、日付に関する表現方法が各地で違うため、どの地域表現方法で、
表示するかを決める設定。日本語だと、1月、2月だけど、英語では、Jan、Febみたいな。
そして、現在時刻を設定したZend_Dateクラスが作成される。

今回罠に落ちたのはバッチ処理用のphpプログラムにZend_Dateコンポーネントを
利用して作成しようとして起こったのです。
バッチってことは、主にcronで呼び出され、ブラウザ経由では起動されません。
サーバ設定からLocale設定が取得できればいいのですが、試した結果、
サーバによっては、設定されていなくて、取得できない場合があるようです。
hetemlは、phpがcgi版のためか取得できてませんでした。
(ブラウザでphpのsetlocale関数の戻り値をdumpして確認しました)
フレームワーク設定は、デフォルト状態では、何も設定されていません。

Zendのソースをおったり、ネットで調べたりしてたどり着いた解決策は2つ。

メールの送信(Zend_Mail)

hetemlのメールサーバを使ってメールを送信してみた。
プログラムのサンプルはこんな感じ。

require_once('Zend/Loader.php');
Zend_Loader::loadClass('Zend_Mail');
Zend_Loader::loadClass('Zend_Mail_Transport_Smtp');
Zend_Loader::loadClass('Zend_Date');

$date = new Zend_date();

$config = array('auth'     => 'login',
       'username' => 'ユーザ名',
       'password' => 'パスワード');

$transport = new Zend_Mail_Transport_Smtp('メールサーバ名', $config);

$mailSmtp = new Zend_Mail('UTF-8');
$mailSmtp->setBodyText('本文');
$mailSmtp->setSubject('件名');
$mailSmtp->setFrom('Fromアドレス', 'From名');
$mailSmtp->addTo('Toアドレス');
$mailSmtp->addHeader('Date', $date->now()->get(Zend_Date::RFC_2822));
$mailSmtp->send($transport);

ほとんど、ドキュメントのサンプルソースを参考にしたら動いたが、ひっかかった点が以下の2点。
・日本語の文字化け
・送信日時が設定されない

日本語の文字化けは、使用している文字コードを Zend_Mailの生成時に
パラメタとして渡すことで化けなくなった。
生成時にISO-2022-JPをパラメタとし、本文と件名をmb_convert_encodingで、
ISO-2022-JPにエンコードしてから渡しても文字化けしないことも確認しました。
UTF-8としたのは、プログラムファイルの文字コードをUTF-8としているためです。

あと、なぜかわかりませんが、普通に送信したら、送信日時が空欄で届きました。
そのため、メールヘッダの Date(送信日時)を自力で設定しています。
Zend_Dateを使って、現在日時を取得し、メールヘッダに利用される
Zend_Date::RFC_2822という型に変形したものを設定しています。

メールの受信(Zend_Mail)

Zend/Mail/Storage/Pop3クラスを使って、メールを受信してみた。
受信自体は、意外と簡単に受信できたが、fromアドレスを取るのに一工夫必要。

メーラーで、メールアドレスに名前を設定されている場合、
その名前とメールアドレスの両方が、”from”情報に設定されているため、
メールアドレスだけを抜き出す必要があります。

調べてみたところ、Pearのモジュールでありました。
Mail_RFC822::parseAddressList()
という関数です。

使い方は、以下です。

require_once('Zend/Mail/Storage/Pop3.php');
require_once('Mail/RFC822.php'); 

$config = array('host'      => 'メールホスト名',
       'user'      => 'ユーザ名',
        'password'  => 'パスワード');

$mail = new Zend_Mail_Storage_Pop3($config);

foreach ($mail as $num => $message){
  $tmp = Mail_RFC822::parseAddressList($message->from);
  $mail_address = $tmp[0]->mailbox . '@' . $tmp[0]->host;
  var_dump($mail_address);
}

私が使っているサーバ heteml なら、pearにパスが通してあるので、
ZendFrameworkさえ、自分で設置すれば、pearは requireするだけで使えました。

今日まで、初期費用無料キャンペーンをやってるので、
正月休みに、いろいろ実験してみようって方は、申し込んでみてはいかかでしょう。



htaccessに苦戦した

ZendFrameworをhetemlに設置した。

.htaccessをほとんど使ったことなかったので、そこでやたら手間取ったけど、
それ以外は特につまづくこともなく、”Hello World!!”が出力された。

http://co-hey.com/xxx/に設置したことで、RewriteBaseの正しい書き方がわからず、
ネットで検索しながら、1時間くらいかかってやっと正常に表示された。

書いた .htaccess はこれだけなのに。


AddHandler php5-script .php
RewriteEngine on
RewriteBase /xxx/
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

http://xxx.co-hey.com というサブドメインを作成して、
http://co-hey.com/xxx/を参照するようにしたら、マニュアル通り


AddHandler php5-script .php
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

でOKだった。

あー、サブドメインは設定するつもりだったから、最初から設定しておけば、
あの1時間は、他のことできていたのにーと思ったけど、これで、
.htacessを使ったmod_rewriteが多少理解できたからいいかとも思う。

さて、Zend_Mailコンポーネントの使い方を試したら、次はSmartyとの連携だ。

そういえば、使っているサーバ hetemlが2周年キャンペーンをやっている。
20日までの予定が、25日(クリスマス)まで延長されたみたい。
初期費用の4000円くらいが、無料になるからサーバ借りようかなーって人は、
これを機会に使ってみては?今のところ特に問題なく使えてますから、安心です。



zend framework

サポートが今後も期待できると言われている「zend framework」
今もっとも話題になっている「cakePHP」
どちらもPHPでシステム構築する際に用いるフレームワークです。

仕事でも、プライベートでもPHPでプログラムを作成していますが、
既存のフレームワークや、PEARもあまり使っていませんでした。

前職の経験から、何かあったときにブラックボックスな部分があると、
痛い目にあうというイメージがあったからです。

ですが、今の会社に転職して、初めて仕事でPHPを使うようになり、
前職よりシステム構築までの時間を短くすることが要求されていることを感じていました。

そこに着目すると、フレームワークはとても有意義なものに思えて、早速この本を買ったのです。

一通り目を通しましたが、使ってみようって気になります。
使い方のイメージもつかみやすく書いてありました。
個人的にはプログラム例がRSSリーダーだったのがイマイチでしたが。
ここは好き嫌いの問題なので、気にしないで下さい。
Chapter5を先に読んでから、Chapter4を読んだ方が分かりやすいです。

モッツァレラチーズが食べたい

中目黒にある聖林館で食べたモッツァレラチーズと生ハムの盛り合わせがうますぎた。
あの絶妙な塩味、モッツァレラチーズの歯ごたえ、うまいと連呼してました。

でも、モッツァレラチーズも生ハムも買ったことない。。。
近所のスーパーにあるのか??

そんなこと考えながらネットで検索したら、うまそうなチーズを売っている
ところを見つけたので、忘れないうちにメモ。

今度発注してみようかと思う。



中目黒HANEYA

友達のバー店長においしいとお勧めされ、ご近所友達も行きたいって言ってた
中目黒HANEYA行ってきました。

口コミサイトで印象に残っていた書き込みは、
”それなりの雰囲気で、それなりの料理を食べれる居酒屋です。
 でも最近そういうところが少ないので、貴重なお店です。”
というものでした。

私はこれを好意的に受け取ったのですが、みなさんはどうですか?
肩肘はらず、週に何回も行ってもいいなと思えるような
適度なうまさの料理を出すお店なんじゃないかというイメージを受けました。

実際に食べた感じは、上品な居酒屋さん。
梅酒がすきなので、あらごし梅酒があったのはGOOD!!
料理も食べた後に物足りなさも、くどさも感じることなくいいと思います。
鳥の竜田揚げだけは、鳥がやわらかすぎて、油が多かったのが私の好みじゃなかたけど。
お肉はめちゃやわらかいよりも、ある程度しっかり噛みたい派です。

このお店で最初に食べた、魚の南蛮漬けにもついてたんですが、パプリカがうまい。
野菜の甘み、酸味のあるソースと一緒に食べると、さらによく感じます。
しゃくっとした歯ざわりも好き。野菜はホクホクもシャクも好き。

このお店のウリである鍋を今回食べなかったので、次回は鍋をつつくぞー。

使って便利と思えるもの

そんなものを、1つ自分でも作ってみたいなと思っていた。
身の回りの人達が、あれあって助かってるよーとか、楽しんでるよーって思ってくれるもの。

何があったら日々の何かが楽になるとか、楽しくなるとか、便利になるとか。

ここ一ヶ月くらい、ぼんやりと考えてたんだけど、ヒントが見つかったと思う。
年末の休みに向けて準備して、作成していきたい。
その前に、やるべきことを全部終らせてから。

これで、cakePHPに初挑戦する。今さらかもしれないけど、興味あるところからとっかかる。
フォトショップとかイラストレーターも、もっと使えるようになりたい。

アイデアが浮かんだこと、身近な人に話をしたら、それ便利かも!!っていってくれたこと。
これのことを考えて作っていくことで、楽しさも知識も増えていきそうだ。

フットワークの軽さ

先日、ふと自分のフットワークが重いことに気づいた。
これをやろうって決めてから、開始するまでのタイムラグが長い。
自分が苦手な分野の場合は、それが強まる。

苦手な分野こそ、まずはやってみるということが必要だと思っているのに。
自分に必要ないと心のどこかで思っているのか、まだ早いと思っているのか、
失敗するのが怖いのか、そんな理由で開始が遅れる。

考えてみると、実にバカらしい。ようは怠慢だ。

やると決めたら即実行。これができるように心がけていきたいなと思う。