昨日の睡眠時間は、3時間半。
今年に入ってからは、6時間~7時間くらい寝ていたので、半分くらい。
眠くはならないけれど、頭の回転速度が違う。
意識的に集中しないと集中力を保てない。散漫になる。
何か1つの作業に没頭するときは、この状態がプラスに働くかもだけど、
あれこれ考えてプログラムを組むっていうときには、能率が悪い。
もう何年も睡眠時間は、5時間くらいだったので、ここまで違うと思わなかった。
2時間多く寝て、集中力が高まった方が、作業量は多いかもしれない。
昨日の睡眠時間は、3時間半。
今年に入ってからは、6時間~7時間くらい寝ていたので、半分くらい。
眠くはならないけれど、頭の回転速度が違う。
意識的に集中しないと集中力を保てない。散漫になる。
何か1つの作業に没頭するときは、この状態がプラスに働くかもだけど、
あれこれ考えてプログラムを組むっていうときには、能率が悪い。
もう何年も睡眠時間は、5時間くらいだったので、ここまで違うと思わなかった。
2時間多く寝て、集中力が高まった方が、作業量は多いかもしれない。
例えばPop3でメールを取得する場合、以前書いたこの記事のような方法で取得します。
取得した際、件名などのヘッダー情報は、
$message->subject
としてとりだすことが可能です。
しかし、取り出そうとしたヘッダー情報がない場合は、
nullが返ってくるわけではなく、exceptionが発生します。
そのため、try catchを大きなくくりでしか行っていないと、
大部分の処理が実行されないという結果になります。
件名、本文がないメールも存在するので、ここは注意が必要です。
私もこれで、しばらく作りかけのプログラムが止まっていました。
自分の考え方が今を乗り越えればとか、今が楽しければとか、
そういう刹那的な部分の比率が高くなっていたと気づいた。
今やっていることをどう先につなげるのか、今やってることを
これからもやり続けていくことを前提に考えるとか、
そういう今後を踏まえた考え方をしていかないと思った。
人と話をしているときにふと。
とりあえずやってみるっていうのも、何かを得られるかもしれないっていう
先への期待感があるからだと思うし。
ここもバランス。バランス感覚が悪いんだと思う。
昔から、両極端になりがちだ。
私が使っているZend Frameworkは、最新のStable版(1.0.3)です。
その中で見つけた不具合。
Zend_Mail_Storage_Imapのメソッド、copyMessage。
第一パラメタにメッセージ番号、第2パラメタにコピー先フォルダの
フォルダクラス(Zend_Mail_Storage_Folder)または、
コピー先フォルダのグローバル名($folder->getGlobalName())を
渡すというコメントが書かれています。
しかし、実際はグローバル名しか渡せません。
通常、こういうコメントが書かれているメソッドは、
処理内でパラメタがフォルダクラスかの判定をして、クラスならば
getGlobalName()メソッドで、グローバル名におきかえてくれるのですが、
なぜかcopyMessageの中では行われていませんでした。
お気をつけください。
友人がすすめてくれた2冊の本。
http://www.amazon.co.jp/dp/4062562928/
http://www.amazon.co.jp/dp/4532313023/
心とか気持ちはうまくコントロールできない方だと自覚しているので、
この本から、1つでも何かはっとすることが見出せたらラッキーだ。
Zendを使ってみて、より意識をするようになったカプセル化。
カプセル化を進めると、再利用性が増すが、ソースの視認性を保つには、
メソッド名、クラス名がわかりやすいことが大前提だと思う。
あと、どういう単位で処理を分けるか。改めてこの辺で悩む。
数字系の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ですが、クラスの中ではphpのemptyメソッドを利用して
判定が行われているので、判定結果もemptyメソッドの処理結果と同様になります。
以前emptyメソッドではまったところなんですが、’0’は空と判定されるのです。
empty(‘0’)は true が判定結果として返されます。
入力チェックで、0 を許容したいところには、Zend_Validate_NotEmptyは使えません。
0 の1文字を許容するところは、数値の入力欄だと思うので、
Zend_Validate_Digitsを利用するといいです。
これは、クラス内で $value === ” という判定を行ってくれますので、
正確に空を判定することができます。
Zend_Db_Tableクラスを使った行のinsert方法は2つ。
1. createRow()を使うもの
2. insertメソッドを使うもの
※$tblは、Zend_Db_Table_Abstractを継承したDbアクセスクラスです
1. はこんな感じ
$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メソッドを使う方法が、予想外の問題が発生しにくいのではないかと思います。
今回の認証クラスでは、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だった場合に、自動的に設定されていますので、
わざわざ設定する処理を記述する必要はありません。