睡眠時間

昨日の睡眠時間は、3時間半。
今年に入ってからは、6時間~7時間くらい寝ていたので、半分くらい。

眠くはならないけれど、頭の回転速度が違う。
意識的に集中しないと集中力を保てない。散漫になる。

何か1つの作業に没頭するときは、この状態がプラスに働くかもだけど、
あれこれ考えてプログラムを組むっていうときには、能率が悪い。

もう何年も睡眠時間は、5時間くらいだったので、ここまで違うと思わなかった。
2時間多く寝て、集中力が高まった方が、作業量は多いかもしれない。

メール受信の注意点(Zend_Mail)

例えばPop3でメールを取得する場合、以前書いたこの記事のような方法で取得します。

取得した際、件名などのヘッダー情報は、
$message->subject
としてとりだすことが可能です。

しかし、取り出そうとしたヘッダー情報がない場合は、
nullが返ってくるわけではなく、exceptionが発生します。

そのため、try catchを大きなくくりでしか行っていないと、
大部分の処理が実行されないという結果になります。

件名、本文がないメールも存在するので、ここは注意が必要です。
私もこれで、しばらく作りかけのプログラムが止まっていました。

刹那的なことに気づく

自分の考え方が今を乗り越えればとか、今が楽しければとか、
そういう刹那的な部分の比率が高くなっていたと気づいた。

今やっていることをどう先につなげるのか、今やってることを
これからもやり続けていくことを前提に考えるとか、
そういう今後を踏まえた考え方をしていかないと思った。

人と話をしているときにふと。

とりあえずやってみるっていうのも、何かを得られるかもしれないっていう
先への期待感があるからだと思うし。

ここもバランス。バランス感覚が悪いんだと思う。
昔から、両極端になりがちだ。

Zend_Mail_Storage_Imapのバグ

私が使っているZend Frameworkは、最新のStable版(1.0.3)です。

その中で見つけた不具合。
Zend_Mail_Storage_Imapのメソッド、copyMessage。

第一パラメタにメッセージ番号、第2パラメタにコピー先フォルダの
フォルダクラス(Zend_Mail_Storage_Folder)または、
コピー先フォルダのグローバル名($folder->getGlobalName())を
渡すというコメントが書かれています。

しかし、実際はグローバル名しか渡せません。
通常、こういうコメントが書かれているメソッドは、
処理内でパラメタがフォルダクラスかの判定をして、クラスならば
getGlobalName()メソッドで、グローバル名におきかえてくれるのですが、
なぜかcopyMessageの中では行われていませんでした。

お気をつけください。

悩みどころ

Zendを使ってみて、より意識をするようになったカプセル化。

カプセル化を進めると、再利用性が増すが、ソースの視認性を保つには、
メソッド名、クラス名がわかりやすいことが大前提だと思う。

あと、どういう単位で処理を分けるか。改めてこの辺で悩む。

数値系のValidateの違い

数字系のValidateには、以下があります

・Zend_Validate_Digits
・Zend_Validate_Int
・Zend_Validate_Float
・Zend_Validate_LessThan
・Zend_Validate_GreaterThan
・Zend_Validate_Between

この中で、下の3つはクラス名からのイメージ通りなので割愛します。
Int、Floatもクラス名からイメージ通りなのですが、Digitsも含めて、
どういう風に判定結果が変わるのかを考えると、???となりました。私は。

調べてみたところ、こんな感じです。
・Digitsは、数字のみで構成されていること
・Intは、整数であること
・Floatは、整数または小数点を含む数値であること

これだけでは、まんまだねで終わるので、例で説明します

【例1 : 09022225555】
 Digits⇒○、Int⇒×、Float⇒×

【例2 : 0.01】
 Digits⇒×、Int⇒×、Float⇒○

【例3 : -1】
 Digits⇒×、Int⇒○、Float⇒○

【例4 : 2】
 Digits⇒○、Int⇒○、Float⇒○

Zend_Validate_NotEmptyの注意点

いまさらなんですが、気づいたのでメモしておきます。

Zend_Validate_NotEmptyですが、クラスの中ではphpのemptyメソッドを利用して
判定が行われているので、判定結果もemptyメソッドの処理結果と同様になります。

以前emptyメソッドではまったところなんですが、’0’は空と判定されるのです。
empty(‘0’)は true が判定結果として返されます。

入力チェックで、0 を許容したいところには、Zend_Validate_NotEmptyは使えません。

0 の1文字を許容するところは、数値の入力欄だと思うので、
Zend_Validate_Digitsを利用するといいです。
これは、クラス内で $value === ” という判定を行ってくれますので、
正確に空を判定することができます。

Zend_Db_Tableでのinsert方法の違い

Zend_Db_Tableクラスを使った行のinsert方法は2つ。

1. createRow()を使うもの
2. insertメソッドを使うもの
※$tblは、Zend_Db_Table_Abstractを継承したDbアクセスクラスです

1. はこんな感じ

$row = $tbl->createRow();

$row->password = xxx;
$row->create_on = new Zend_Db_Exp(‘now()’);
$row->save();

2. はこんな感じ

$params = array(
 ’password’ => ‘xxxx’,
 ’create_on’ => new Zend_Db_Exp(‘now()’)
);

$tbl->insert($params);

両者の違いは、設定しなかったカラムの処理方法にあります。
値を設定しなかったカラムに対して、1.はnullを設定し、2.は何も処理をしません。

これはどういうことかというと、1.の場合は、DB設定にてdefault値を設定しても、
行をinsertした後には、カラムの値はnullになっているということです。
これは、結構不便に感じます。

1.は更新時と書き方がほぼ一緒なので覚えやすいのですが、上記default値のことを考慮すると、
insertメソッドを使う方法が、予想外の問題が発生しにくいのではないかと思います。

ログインチェックをプラグインにて行う2

今回の認証クラスでは、DBを使って認証処理を行っています。
サンプルソースは以下になります。

説明を日本語で書くと、余計にわかりづらいくなってしまいましのたで、
コードとコメントを見て理解していただけたらと思います。

Zend_Loader::loadClass('Zend_DB_Table_Abstract');
Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
Zend_Loader::loadClass('Zend_Auth_Storage_Session');

class authModel
{
 private $_authStorage;

 public function __construct()
 {
  $config = new Zend_Config_Ini('config/system.ini', 'default');
  // ログイン情報を格納するセッションを指定
  $this->_authStorage
   = new Zend_Auth_Storage_Session($config->session);
 }

 public function login($post)
 {
  $db = Zend_Db_Table_Abstract::getDefaultAdapter();
  $authAdapter = new Zend_Auth_Adapter_DbTable($db);
  $authAdapter->setTableName('Accounts')
         ->setIdentityColumn('login_id')   // IDカラムを指定
         ->setCredentialColumn('password'); // 認証用カラムを指定

  // 上記で指定したカラムに、認証したい値を設定
  $authAdapter->setIdentity($post['login_id']) 
        ->setCredential($post['password']); 

  // 認証実行
  $result = $authAdapter->authenticate();

  if ($result->isValid()){
   // 認証OKとなったレコードから、login_idとstatusを取りだす
   $row = $authAdapter->getResultRowObject(array(login_id, status));
   // ログイン情報格納用セッションに取得した情報を設定する
   $this->_authStorage->write($row);
  }

  return $result;
 }

 public function logout()
 {
  $this->_authStorage->clear();
 }

 public function isAuth()
 {
  return (isset($this->get()->login_id) && isset($this->get()->status));
 }

 public function get()
 {
  return $this->_authStorage->read();
 }
}

ログイン情報を設定するセッションに、デフォルト(Zend_Auth)を利用したり、
セッションに設定する情報が、認証に利用したID(上記だとlogin_id)だけでいい場合は、
より簡潔に記述することができます。

デフォルトのセッションを利用する場合は、コンストラクタ内の処理は必要ありません。
セッションに設定する情報が、認証に利用したIDのみでいい場合は、
認証処理を実行してOKだった場合に、自動的に設定されていますので、
わざわざ設定する処理を記述する必要はありません。