cakePHP

最近取り組み始めたフレームワークcakePHPについての話題。cake1.2を使った内容を取り扱っていく予定。

2011年4月12日

CacheをMemcachedにするとエラーとなる

Memcachedをインストールしたうえで、cakePHPのcore.php設定ファイルにあるcache設定をengine => 'File' から engine=>'Memcache'に変更すると以下のエラーメッセージが表示されてしまう。

Warning (512): Cache not configured properly. Please check Cache::config(); in APP/config/core.php

デバッグして原因を調査したところ、php.ini に
extension=memcache.so
の設定がないためにMemcacheクラスが呼べなかったためだった。
エラーメッセージが適切?ではないために小一時間はまってしまった。

なお、memcache.soはphp-pecl-memcacheパッケージをインストールする必要がある。

2010年9月20日

pageTitleが利用できない

新しいアプリケーション「oh-toilet.com」をcakePHP+Ktai Libraryで作成していたら、なぜかタイトルが編集できない。

いつも通り
$this->pageTitle = 'タイトル';
にしているのに。。。。

原因を探してみると、Ver.1.3から廃止になっているじゃないですか。。。

View::$pageTitleは削除されました。代わりに$this->set('title_for_layout', $var);を使用してください。

セキュリティ要件でない限りは、マイナバージョンアップ時に下位互換性をなくすのはやめてほしいと思うのは僕だけでしょうか?

下位互換性がなくなるということは、cakePHPのバージョンアップをするときには、前ページの動作確認をしなければならないことを意味しています。(もちろんドキュメントに書いてあることがすべてならばキーワードだけで探して対象を絞り込むだけでよいのかもしれませんが。。。)

2010年5月30日

携帯サイトをキャッシュする

財テク.jpのモバイルサイトは、CakePHPにKtai Libraryを使って動かしているのだが、Viewキャッシュをしてしまうと、キャリアごとの絵文字に対応できないことと、PCサイトがUTF-8だった場合に、headerでのcharset指定がUTF-8となってしまうため、キャッシュされたページは文字化けしてしまう可能性がある。

前者については絵文字を利用しない方法で対応可能だが、後者についてはキャッシュ済みの場合には、controllerすら通らず、エンコード指定を切り換える対応方法が分からなかったため、しばらくキャッシュさせないようにしていたが、データが多くなってくるとレスポンスが悪くなってきているため、キャッシュの方法を考えてみた。

Viewキャッシュが無理な場合には、modelキャッシュということで、CakePHP1.2 Behaviorでモデルのメソッドキャッシュを行うを使って、modelでキャッシュさせることにした。

結果的には、携帯サイトはmodelキャッシュ、PCサイトはmodelキャッシュ+ビューキャッシュとなりキャッシュによる効果は高くなったように思う。

2009年12月26日

logrotate

ログを出力するプログラムはたくさんあるが、1ファイルに書き出し続けると不要な過去のログを保持し続けて容量不足になってしまったりすることがある。

logrotateを使えば、出力側のプログラムを変更することなく、きめられたタイミングで現在のファイルをリネームしたうえで、新しいログファイルを作成してくれる。

Fedora Coreであれば、
/etc/logrotate.d/ の下にファイルを作成して、
/var/www/XXX/logs/*log {
daily
missingok
}
とすれば、cakePHPで出力されるdebug_logとerror_logを1日単位でローテートしてくれる。
create (パーミッション) (ユーザー名) (グループ名)のオプションを付ければ、空のファイルを作成してくれるし、apacheプロセスのようにログ出力プログラムがログファイルが無くなってしまうとそれ以降ログを書き出さないような仕組みなのであれば、postrotateオプションをつかってプロセスを再起動させることもできる。

詳しいオプションは@ITが参考になる。

2009年10月26日

ShellとControllerで処理を共有する

cakePHPでCronなどでタスク処理をしたい場合やコマンドライン実行をしたい場合にロジック部分を提供するShellクラスとWebアプリケーションのロジック部分を提供するController。いずれも同じロジック部分だけに、共有したいことが多い。

しかしながら、いずれもクラスはObjectから継承されたものであり、Objectクラスにゴリゴリ書かない限りは共有できないが、バージョンアップ時のメンテナンス負荷が高くなってしまう。

そしたら多重継承だ!という考えもPHPでは残念ながらできず、代わりにPHPにはinterfaceという仕組みが用意されているが、残念ながらcakePHPで使う方法がよくわからなかった(おそらくrequireするとか強引な手法であればできるはず)。

実はcakePHPにはコンポーネントという方法で対応することができる。しかし、このコンポーネントも癖があって、通常なら、
var $components = array('コンポート名');
とすれば
$this->コンポート名
で使えるようになるのだが、Shell側はそうはいかない。

App::import('Component', 'コンポート名');
と定義したうえで、
function startup(){
  $this->コンポート名 = new コンポート名Component();
}
を定義しなければ、Controllerと同等には使えない。

ただ標準で用意されているEmailコンポーネントなどは、上記手法を使う必要がなく、$components変数に突っ込めば使えるようになっている。もう少し調べてみる必要がありそうだ。

2009年10月12日

Prefix利用時のPaginatorHelperが吐くURLが正しく表示されない

財テク.jp 価格比較サイトモバイルサイトをPrefixを使って実現しようとしたのだが、Prefix利用時のPaginatorHelperが吐くURLが正しく表示されないにて指摘されているようにURLが正しく設定されない。そのため、このスレ主が情報提供していただいていると思われるブログを元に同様にURL置換を行うことで対応した。

ビューで置換するのは根本的な対応とは言えないが、逆にビューで置換するので、routes.phpで変更を加えるより、影響が(想定)限定されるともいえる。

今回もKtai Libraryを使って非常に簡単に作成することができた。バージョンが0.2.0になっており、cakeHPでモバイルサイトを作るならKtai Libraryとなりつつあり、今後もますます注目度が高いライブラリである。

2009年9月23日

サブディレクトリにcakePHPを構築する

もしサブドメインに構築する場合には、.htaccessの設定に追記が必要となる。
具体的には、RewriteBaseをきちんと設定にあるような

app/webroot/.htaccess にあるmod_rewriteの設定において
RewriteBase /(サブディレクトリ名)

を追加する必要がある。

もし、追加し忘れると、500 Internal Server Errorが表示され、Apacheのログには、
Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
というメッセージが記録される。

今までDocumentRoot上にしか構築したことがなかったので、少しハマってしまった。

2009年7月10日

ビューをキャッシュする

cakePHP 1.2のキャッシュ機能を使ってみた。
データベースに問い合わせするシステムにおいて、頻繁にデータが変わらないような場合にはキャッシュを利用すると応答時間が改善するだけでなく、データベースへの問い合わせをしなくて済むようになるので、DBサーバーの負荷が軽減される。

キャッシュ機能を有効にするには、いくつか設定が必要なようで、Viewをキャッシュする場合に設定をした部分は次の通り。

core.phpの
Configure::write('Cache.check', true);
を有効にした。

Viewのキャッシュを有効にしたいControllerにおいて
var $helpers = array('Cache');
var $cacheAction = 28800; //8H
とした。通常、$helpers には他にもHTMLなどを指定する必要があるだろう。
[cakephp]1.2でviewをchacheするにはで詳しく説明されている。

キャッシュには、Fileキャッシュのほか、APC、XCace、Memcacheが利用できるが、FileキャッシュとAPCキャッシュの違いがよくわからなかった。

ちなみにベンチマークの結果は次の通り。
ab http://price.zaiteku.jp/products/detail/B002ANRN1E

キャッシュ前 Requests per second: 2.28 [#/sec] (mean)
キャッシュ後 Requests per second: 12.03 [#/sec] (mean)

約5.3倍速くなったことが分かる。

2009年7月 9日

CakePHPのAjaxな問い合わせフォーム用プラグイン

YARE TOKOにて公開されており、非常に有用なプラグインです。
財テク.jp(掲載内容に関するお問い合わせのリンク)でも使用させていただきました。

ところで、contact_forms_controller.phpの51、52行目においてfromメソッドとtoメソッドにセットされるべき値が異なっているように思えました。

誤っていると思われるコード

$this->Qdmail->to($this->data['Form']['mail'], $this->data['Form']['name'] . '様');
$this->Qdmail->from($this->admin_mail, $this->admin_mail);

正しいと思われるコード
$this->Qdmail->from($this->data['Form']['mail'], $this->data['Form']['name'] . '様');
$this->Qdmail->to($this->admin_mail, $this->admin_mail);

2009年7月 8日

なぜか一部のフィールドがsave()で保存できない!

debugレベルを0にしてリリースしているサイトで機能拡張のためにカラムを追加したが、なぜかsaveメソッドを呼び出しているところで追加したカラムが追加並びに更新対象にならない。

追加したカラムの名前がよくないのかと思って、いろいろ調べていたところ、CakePHP のおいしい食べ方で同じ現象が説明されていた。

debugレベルを0にしているとモデルがキャッシュされていることが原因で、データベースの構造が変わっていても反映されないようだ。通常はリリース後に機能拡張するときには、debugレベルを変更することが多いので、このような現象に悩まされることは少ないかもしれないが、cakePHPでアプリを開発している場合には、頭の片隅に入れておいてもよさそうだ。

2009年6月23日

AuthComponentでセッション切れが発生する

CakePHPのアプリケーションでAuthコンポーネントを利用して認証システムを作っていると時々セッション切れになってログイン画面に誘導されることがある。

こづかいつけーる for WebではOpenIDによる認証システムを使っていることもあるのかなぜかしらセッション切れが多いと感じていたところ、スパイスラボのブログにて有益な情報を発見した。

Security.level が high のときに起きるいろいろなことということで事例が紹介がされており、なかでもリダイレクトが書き換えられるというところが気になった。実際、こづかいつけーる for Webでのcore.phpのSecurity.levelがhighになっていたところ、mediumにしたらセッション切れは起こらなくなった。

おそらくセッションの保持範囲が設定レベルに応じて変わってくるところがポイントになっていると考えられる。

2009年6月22日

複数の入力項目をチェックする

モデルに実装するバリデーションの例には、メールアドレスを2回入力して、一致しているかどうかを比較したりするような複数の入力項目をチェックする例が残念ながら記載されていない。

モデルの中で何とかやってみた例なので、クレバーな方法ではないかもしれないが、DBへデータを登録する前のチェックをコントローラーで実装しようとすると面倒なので、困っている方がいらっしゃれば参考にしていただきたいと思う。

var $validate = array(
 'mailaddrss1' => array(
  'rule' => array('checkAddrss'),
  'message' => 'メールアドレス1とメールアドレス2の入力内容が異なります',
 ),
);

//$dataはmailaddress1の内容がセットされる
function checkAddrss($data){
 $check_data= $this->data;
 return $data != $check_data['ModelName']['mailaddress2'];
}

2009年6月19日

debugレベルに応じてエラー表示が変わってしまう

app/config/core.phpの
Configure::write('debug', N);
のN=0とN>0では、コントローラーもしくはアクションなどが存在しない場合に表示されるエラーメッセージが変わってしまう。

具体的には、N>0ならば、app/views/missing_controller.ctp、app/views/missing_action.ctpが呼ばれるのに対して、N=0ならば、app/views/error404.ctpが呼ばれる仕組みだ。

これは、cake/libs/error.phpの110行目あたりにある
if ($method !== 'error') {
 if (Configure::read() == 0) {
  $method = 'error404';
  if (isset($code) && $code == 500) {
   $method = 'error500';
  }
 }
}
によるものである。

debugレベルを0にしてリリースする場合には、意図したエラーメッセージが出るか確認したほうがよさそうだ。

2009年6月10日

CakePHPで作成したアプリケーション

CakePHPで作成したWebアプリケーション「こづかいつけーる for Web」をリリースしました。
アカウントの作成が不要で、mixi、Yahoo、Googleのアカウントがあればすぐ利用ができる家計簿サービスです。

CakePHPと携帯ライブラリ「lib3gk」&CakePHP1.2用ヘルパー/コンポーネントのおかげでコーディング量を大幅に減らすことができました。

2009年6月 6日

flushをするとメッセージの後に1が出力される

iphloxの情報整理ノートに対処方法が紹介されている。今回の対処の方法に従い、
cake/libs/view/helpers/session.phpをapp/view/helpers/session.phpにコピーし、

echo($out);
parent::del('Message.' . $key);
return true;

//echo($out);
parent::del('Message.' . $key);
//return true;
return $out;

とすると表示されなくなる。不具合なのかどうかはまた別の機会に検証してみたい。

2009年5月16日

携帯に対応させる

cakePHPで作成したサイトを携帯に対応させるためには、文字コードの問題に対応していかなければならないし、また、デフォルトのレイアウトも変更する必要ある。

CakePHPクッキングのページに有用な情報が掲載されていたので紹介したい。
CakePHPガイドブックでは、ヘルパーを使って対応していたが、うまくいかなかったので、紹介されている情報のようにappControllerで対応するとうまくいった。バージョンが1.1から1.2になって実装が一部異なっていることが原因だろうと思う。

cakePHPでPCと携帯で出力文字コードを変更する方法は1.1対応のサイトになっているが、入力データの文字変換の点は参考になる。1.2では次の通りとなる。

function beforeFilter(){
 if (isset($this->params['prefix']) && $this->params['prefix'] == 'mobile'){
  if (!empty($this->data)){
   mb_convert_variables('UTF-8', 'Shift_JIS', $this->data);
  }
 }
}
※ソースコードのスペースは全角スペースになっています。

2009年5月 9日

tagErrorMsgに相当するバリデーション

cakePHP 1.1ではバリデーションの結果に対するエラーメッセージをhtmlヘルパーのtagErrorMsgメソッドにて場所を指定することができた。

cakePHP 1.2ではtagErrorMsgメソッドが利用できなくなっている代わりに、formヘルパーのerrorメソッドを利用して、エラー出力場所を定義できるようになった。ただし、inputメソッドの場所にデフォルトで出力されるため、errorメソッドでエラーを出力する場合には、メッセージを抑止するようにしなければならない。

詳しくは、CakePHP 1.2 Form ヘルパーで input タグとエラーメッセージを別々に表示する方法に詳しいので、参照してみてください。

ajaxのAutoCompleteを実現する

とりぷる ぷぅさんのサイトが参考になりましたので、紹介しておきます。

cakePHPだとさほどコードを書かなくてもオートコンプリートが割と簡単に実現できるのがすごいですね。
それにしてもAjaxのヘルパーに関する情報やバリデーションに関する情報がまだまだ少ないように感じるのは気のせいでしょうか??このブログでどんどん有用なサイトをご紹介していきたいと思います。

2009年5月 7日

findメソッドに指定可能なパラメータ

CakePHP Noteに詳しい。

fields:取得列
condition:条件指定
group:グループ指定
order:ソート指定
limit:取得行数

CakePHPガイドブック

cakePHPの少ない書籍のうちの一つです。基本的な部分から押さえていきたい場合には、お勧めの一冊になると思います。cakephp.jpg

2008年11月17日

エラーページに対応する

cakePHPではコントローラー名がURLの一部となるために、存在しないコントローラーに対するリクエストがあるとMissing Controller表示がされてしまう。

blog.katsuma.tvではそのための対応として、app/views/errorにmissing_action.ctp、missing_controller.ctp、missing_view.ctpを配置すればよいことが書かれているが、どのようにコードを記述すればよいかはわからない。

関数を一切設定せずにファイルを作成したところエラーは表示されなくなったが、missing_view.ctpに記載されているメッセージも出なかった。おそらくcontrollerへの記載が必要なんだろうけれど、そのドキュメントが見当たらない。

他のドキュメントも探したが、cake/dispatcher.phpを改造するものなどちょっと強引なものがあったので、もう少しよさそうな方法を探したい。

2008年11月 3日

SELECT文で条件にあった一覧を取得したい

たとえば、SELECT * FROM users WHERE id=3; を実行したければ、
$this->User->findAll(array('id' => 3));
とすればよい。別のテーブルをSELECTしようとするとUserなんて知らないと怒られるので、
var $uses = array('(自モデル)', 'User');
としなければならない。

なお、このSQLを実行するには、findAllByUserId(3)というのも使えるが、汎用性にかけるので、原則findAllメソッドを利用するとよいと思う。(ただ、公式マニュアルによればfindAllメソッドは非推奨となっており、find('all')を使えとある。)

また、SELECT * FROM users WHERE id=3 AND nickname IS NOU NULL; を実行したければ
$this->User->findAll(array('id' => 3, 'not' => array('nickname' => null)));
となる。

参考:findAll で IS NOT NULL

2008年11月 2日

Cannot access empty property

Fatal error: Cannot access empty property in /(path)/cake/libs/view/view.php on line 753
というエラーが実行時に出てしまった。

原因は、cake bakeしたときに
Would you like this controller to use any components? (y/n)
[n] > y
Please provide a comma separated list of the component names you'd like to use.
Example: 'Acl, Security, RequestHandler'
で何も入力しないでEnterを押して元に戻った上でnを押したためにcontrollerに以下のようなコードができてしまったことだった。

var $helpers = array('Html', 'Form', '');

テンプレートを変更する

常にヘッダーとフッターにいつものcakePHPのものが表示されるので、自分なりにカスタマイズしたくなる。snapzに詳細は記載があるが、app\views\layouts\default.ctp (cakePHP 1.2ではctpに変更されている)に記述をすればよい。

$title_for_layout
$content_for_layout
がそれぞれタイトル部、各アクションにおいてテンプレートが出力する部分である。

2008年11月 1日

cakePHPでOpenID対応サイトを作る

【CakePHP】OpenIDをAuthComponentにトッピングしてみる を参考にcakePHPでOpenID対応サイトを作ってみた。

詳しい説明は上記サイトに記載があるので、説明が省略されているところを中心に記載してみたい。

1.
cakePHPをダウンロードする。まだ開発途中である1.2をダウンロード。

2.
コンテンツを展開したいフォルダに解凍して、config にある database.php.default を database.php に変更して内容を編集する。

3.
chmod -R 777 app/tmp/
で権限付与を行う。

4.
app/config/core.php にある
Configure::write('Security.salt', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
のXXの部分をランダムな値に変更する。

5.
以下のSQLを実行してテーブルを作成する。

CREATE TABLE `users` (
`id` int(10) NOT NULL auto_increment,
`nickname` varchar(50) NOT NULL,
`username` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`flag` int(1) NOT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

6.
OpenID component for CakePHP
を参考にしてOpenIDコンポーネントとPHP Open ID Library、EAUT libraryをダウンロードして設定する。

7.
cake/console/cake bake
を実行する

Welcome to CakePHP v1.2.0.7692 RC3 Console
---------------------------------------------------------------
App : app
Path: /(pathname)/app
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> M
---------------------------------------------------------------
Bake Model
Path: /(pathname)/app/models/
---------------------------------------------------------------
Possible Models based on your current database:
1. User
Enter a number from the list above, type in the name of another model, or 'q' to exit
[q] >1
Would you like to supply validation criteria for the fields in your model? (y/n)
[y] > n
Would you like to define model associations (hasMany, hasOne, belongsTo, etc.)? (y/n)
[y] > n

---------------------------------------------------------------
The following Model will be created:
---------------------------------------------------------------
Name: User
Associations:
---------------------------------------------------------------
Look okay? (y/n)
[y] > y

Baking model class for User...

Creating file /(pathname)/app/models/user.php
Wrote /(pathname)/app/models/user.php
Cake test suite not installed. Do you want to bake unit test files anyway? (y/n)
[y] > n
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> C
---------------------------------------------------------------
Bake Controller
Path: /(pathname)/app/controllers/
---------------------------------------------------------------
Possible Controllers based on your current database:
1. Users
Enter a number from the list above, type in the name of another controller, or 'q' to exit
[q] > 1
---------------------------------------------------------------
Baking UsersController
---------------------------------------------------------------
Would you like to build your controller interactively? (y/n)
[y] > y
Would you like to use scaffolding? (y/n)
[n] > n
Would you like to include some basic class methods (index(), add(), view(), edit())? (y/n)
[n] > y
Would you like to create the methods for admin routing? (y/n)
[n] > n
Would you like this controller to use other helpers besides HtmlHelper and FormHelper? (y/n)
[n] > n
Would you like this controller to use any components? (y/n)
[n] > y
Please provide a comma separated list of the component names you'd like to use.
Example: 'Acl, Security, RequestHandler'
> Auth,Openid
Would you like to use Sessions? (y/n)
[y] > y

---------------------------------------------------------------
The following controller will be created:
---------------------------------------------------------------
Controller Name: Users
Components: Auth, Openid
---------------------------------------------------------------
Look okay? (y/n)
[y] > y

Creating file /(pathname)/app/controllers/users_controller.php
Wrote /(pathname)/app/controllers/users_controller.php
Cake test suite not installed. Do you want to bake unit test files anyway? (y/n)
[y] > n
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> V
---------------------------------------------------------------
Bake View
Path: /(pathname)/app/views/
---------------------------------------------------------------
Possible Controllers based on your current database:
1. Users
Enter a number from the list above, type in the name of another controller, or 'q' to exit
[q] > 1
Would you like to create some scaffolded views (index, add, view, edit) for this controller?
NOTE: Before doing so, you'll need to create your controller and model classes (including associated models). (y/n)
[n] > y
Would you like to create the views for admin routing? (y/n)
[y] > n

Creating file /(pathname)/app/views/users/index.ctp
Wrote /(pathname)/app/views/users/index.ctp

Creating file /(pathname)/app/views/users/view.ctp
Wrote /(pathname)/app/views/users/view.ctp

Creating file /(pathname)/app/views/users/add.ctp
Wrote /(pathname)/app/views/users/add.ctp

Creating file /(pathname)/app/views/users/edit.ctp
Wrote /(pathname)/app/views/users/edit.ctp
---------------------------------------------------------------

View Scaffolding Complete.

app/views/users/login.ctpを追加して以下のように記述する。

<?php
if (isset($message)) {
echo '

'.$message.'

';
}
echo $form->create('User', array('type' => 'post', 'action' => 'login'));
echo $form->input('OpenidUrl.openid', array('label' => false));
echo $form->end('Login');
?>

8.
以降のコードは【CakePHP】OpenIDをAuthComponentにトッピングしてみる を参考にするとできる。

【動作確認】
http://(cakePHPを配置したパスに到達するためのURL)/users/login
でログインページを出すことができるので、たとえば、
mixi.jp
yahoo.co.jp
www.google.com/accounts/o8/id
などを入力するとそれぞれのサイトのOpenID認証サイトに遷移して、そこで認証がOKだとニックネーム登録画面に遷移して、登録を続けるとDBにユーザー情報が登録できる。

http://(cakePHPを配置したパスに到達するためのURL)/users/
とアクセスすると登録状況を照会できる。

ユーザー認証の画面を作るのは結構面倒だけれど、cakecPHPを使えばここまで簡単にできる。

cakePHPに関するリンク

1.2のマニュアル

さむい

さむいさむい。
朝は車のフロントガラスが結露し始めるし、夜は寒いし、もう冬はそこですなぁ。

でも最近熱いこと。
それは、「cakePHP」でもWebアプリをバリバリ開発している人にとっては、いまさらって感じかもね。転職してからWebアプリ開発はご無沙汰で、別のフレームワークを触るだけでワクワクしてしまう。

そして「OpenID」。これからサイトごとにアカウントを覚える必要はないかもね。OpenIDを利用したcakePHPのサンプルアプリを作ってみたんだけど、mixiのOpenIDと連携してみたらとっても便利だった。(Yahooはセキュリティポリシー上IPアドレスからのアクセスは不正アクセスとみなしてしまうので、テスト可能な環境を選んでしまう)

LDAPのようにIDとパスワードを入力する際に問い合わせするサイトを自サイトではなくOpenIDのサイトにするという仕組みかと思ったらそうじゃないんですね。まぁその方が安全ちゃぁ安全なんですけど、OpenIDが普及するまでは利用者の戸惑いも多いかもしれませんね。