blogPHPでWEB+DBシステムの開発をやっています。2007-042007-04ITmediaでTwitter検索/Twitterで暇つぶしが紹介されました。暇つぶしが紹介されました。昨日ちょうどアクセスログを眺めている時にリファラで知りました。やって取り上げて貰えると嬉しいですね。暇つぶしが取り上げられたのが嬉しかったり。どちらのツールも登録等せずに誰でも使えるので、お暇な時にお試し下さい。1分38秒Model#validates()ですが、「ちょっとどうなの?」な仕様になってます。このメソッドはModel#save()内で自動的に呼ばれるのか、コントローラのアクションメソッド内で呼ばれるのが一般的な使い方だと思います。問題が起こるのは後者の方で、空の配列をvalidates()に渡すと、Userl#$validateで何を定義していてもtrueが返ってきます。下のソースならUserモデルの$validateに入力チェックをいれておけば「ng」が表示されそうですが、実はUser#$validateに関わらず「ok」が表示されてしまいます。}}?>原因はModel#invalidFields()の以下の箇所にあります。{$this->invalidate($field_name);}}?>$dataはvalidates()に渡される連想配列なのですが、$dataに$validateのキーが存在しない場合はpreg_match自体が処理されず、invalidate()にはなりません。コントローラからvalidates()を呼ぶ時は、$dataにModel#$validateのキーに存在するかを確認する必要があります。ちなみにModel#save()ではvalidates()の後の処理でfalseが返るようになっています。これも$dataが空の配列の場合の話で、Model#$validateにキーは無い(入力チェックはしない)が、テーブルにカラムがあるキーのみの配列なら通ってしまいます。下のソースなら「ok」が表示されます。}}?>やはりこちらも入力チェックするキーが$dataに存在するかを確認するしか無いようです。3分48秒PHPのスーパーグローバルの値をどのように参照すれば良いかまとめてみました。Controller#dataやアクションメソッド引数のようにフレームワークで想定された使い方をしている分には特に問題無いのですが、ちょっと他のことをやろうとすると、どこに値が格納されているか分からず困った事がありました。$_GET/$_POSTを使えば値は取れますが、せっかくのフレームワークなのでなるべくその中で値を使いたいものです。$_GET$_GETの値はController#params[‘url’]に格納されます。ちなみに$_GET[‘url’]はURLルーティング(リクエストURIからコントローラ・モデル等を決定)で、$_GET[‘file’]は[app/webroot/js/vendors.php]で参照されています。$_POST$_POSTの値はController#params[‘form’]に格納されます。中でも$_POST[‘data’]は特別で、Controller#data/Controller#params[‘data’]にも格納されます。$_COOKIE$_COOKIEの値を参照する方法は用意されていません。$_COOKIEの値を使用する場合は直接参照するしかないようです。ちなみにフレームワーク側はCakeSessionクラスがこの値を参照しています。$_FILES$_FILESはおおよそ$_POSTと同様にキーによって格納される場所が異なります。$_FILES[‘data’]以外の箇所についてですが、これは$_POSTと同じようにController#params[‘form’]に格納されます。つぎに$_FILES[‘data’]ですが、こちらは$_POST[‘data’]と同じようにController#data/Controller#params[‘data’]に格納されます。ここでは$_FILES[‘data’]がそのまま格納されるわけではなく、下のソースのように[$model][$field][$key]の連想配列に値を格納されます。$value;}}}}$_POST[‘data’]の場合と異なり、$_FILES[‘data’]の値はController#params[‘form’]には格納されません。$_FILESの格納処理は$_POSTの値が格納された後に行われます。$_POSTと$_FILESが同じキーを持つ値は$_FILESの値で上書きされてしまいますのでご注意を。$_ENV/$_SERVER$_ENV/$_SERVERの値は[cake/basics.php]にあるenv()関数で参照できます。どちらの変数にも同じキーで値がある場合は、$_SERVERの値が優先され、次に$_ENVの値になります。双方に該当するキーが無い場合はgetenv()の値が返ります。(全てのキーが無ければnullが返ります。$_REQUEST/$_GLOBALS$_REQUEST/$_REQUESTの値は特に参照する方法は用意されていません。フレームワークでも参照している箇所は見当たりませんでした。0分40秒またまたTwitterネタ。検索が某ネタのおかげで好評でした(@ieiriさん、ありがとうございました)ので、調子に乗ってこんなのも作ってみました。携帯でTwitterのステータス(投稿)を見るだけのサイトです。外出している時に携帯でTwitterを見ていると意外と更新されずに何度もリロードする事ありません?Friendsをバンバン増やせば良いのでしょうけどあまり増やしすぎると今度PCで見るときがつらかったり。知らない人のステータスをただ見るだけなのですが意外と面白かったりします。登録等は一切不要なので「Twitterって聞くけど、何?」な方も一度どうぞ。先日はじめたTwitterですが、なかなか楽しいです。Twitterの仕組み自体ももちろん面白い良いのですが、日々ユーザが増えていき、システムが改良され(今日は日本語入力が改善されたもよう)、どんどん完成度が高まっていくさまが何だか楽しいです。CakePHPで何か作ろうと思っていたので、こんなの作ってみました。PHPで検索Twitterの検索では、既にtwittersearchがあるのですが、それとは違いこちらは日本語ユーザのみの検索ができます。興味のあるキーワードを入れて、Friends探しに使って貰えたら良いかと。超見切り発車気味な公開なので、突然消える可能性もありますが。0分59秒ちまたで話題のTwitterはじめてみました。http://twitter.com/shin1x1当初IMのようなサービスだと思っていたので、登録はしたものの身近でやっている人もいないので2,3日放置していました。今日何気に眺めているとIMとは違うものだと何となく気づきました。(遅)IMというよりはどちらかというとblogの方が近いのかな。ようは相手がいて初めて成り立つものではなく、基本は自分から発信するだけで、あとはそれを見た誰かが反応を返すものだと。(SBMのコメントを書く感覚にも近いような)「Twitter」は「さえずり」だそうです。自分で使った感触では「さえずり」というより、ぼそぼそ言う「一人言」という感じでした。一人言でも何気に面白いので、「相手がいない」と躊躇している方も一度始められてはいかがでしょうか。Twitterキホンのキホン|gihyo.jp」が参考になりますよ。2分27秒CakePHPで発行したSQLをログに記録する方法です。DEBUG>=2にすれば画面下に表示されるSQL文ですが、DB処理後にリダイレクト等で遷移すると消えてしまいます。本番稼働時は画面に表示するわけにはいかないのでやはりログに出力したいところです。フレームワークに手を入れるのが一番簡単なのですが、バージョンが上がると面倒なので既存のDboSourceを継承したクラスにログ記録を追加します。DboSourceを継承dboはフレームワークで用意されているものだけでなく、app/model/dboにあるものもフレームワークで利用する事ができます。ここではPostgreSQLを使うとしてDboPostgresを継承したDboPostgresLogを作ります。ログ出力をON/OFFする定数LOG_SQLは後でcore.phpで定義します。作成したDboPostgresLogを使用するDATABASE_CONFIGのDB設定でdriverを’postgres_log’を指定します。core.phpでLOG_SQLを定義SQLをログに出力するか否かを設定するLOG_SQLをcore.phpで定義します。LOG_SQLがtrueならSQL出力し、LOG_SQLが未定義もしくはfalseの場合は出力しません。true);?>これで実行されたSQL文が[app/tmp/logs/debug.log]に出力されます。この方法はDEBUGの値に関係無くログ出力ができるのは良いのですが、DboSourcesを継承するのがイマイチです。フレームワーク(DboSources自身)で対応して貰えれば一番良いですけどね。0分27秒FirecakeはCakePHPのデバッグ情報をFirebugに表示する便利なHelperです。Bakeryでソースを見ているとコメントにこんな記述が。Shinbara.cakeinfoを参考にして頂いているようです。0分37秒PostgreSQLの仕組みを考えれば「なるほど」な内容なのですが、実際にできるんですね。していなければ、データベースファイル内に残っている可能性があります。削除したデータが再び見えるようにできるかもしれません。データの復旧についてトランザクションIDを戻せばOKなのか。CVSやSubversionでリビジョンを指定する感覚に似ているかも。(そこまで柔軟じゃないか)間違ってDELETE/UPDATEした時は慌てず騒がず、この方法を思いだそ。CakePHPの何か-CakePHPのModelを使うお馴染みyandoさんのプレゼン資料で気になったソースがあったので勝手に添削w。}}?>User#save()の部分ですが、Model#save()メソッド内ではModel#validates()が呼ばれるので、このままだとUser#validates()が2度実行されることになります。このソースのようにsave()の前にvalidates()を実行するならsave()の第2引数にfalseを渡します。これならsave()内でvalidates()は実行されません。}?>あとこの例のようにController#validationErrorsを参照しないのなら、Controller#validateErrors()は呼ばなくても良いです。↓のようにシンプルに書けたりします。}}?>まあ実際は登録完了後はリダイレクトしたりビューテンプレートを変えたりするので結局上のソースのようになるのですが。