[Zend Framework]Zend_Db_Tableのメタキャッシュ時の不具合について

メタ情報をキャッシュする為によく、

PHP:
  1. Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);

とかで一括で全テーブルのメタキャッシュを有効にすると思います。

ですが、この方法で利用するとバージョン(再現したのは1.10.1)にもよるのかもしれませんが、以下のようなエラーが出力されてしまいます。

Failed saving metadata to metadataCache

将来すぐに修正していただけると思いますが、今回はZend_Db_Tableは元々継承させて使っていましたので、問題になっているメソッドを上書きして修正しました。

PHP:
  1. class My_Db_Table extends Zend_Db_Table_Abstract
  2. {
  3.     protected function _setupMetadata()
  4.     {
  5.         try {
  6.             return parent::_setupMetadata();
  7.         } catch (Exception $e) {
  8.             // Unable to save metadata
  9.             $this->_metadataCache = null// 2010-03-13追記
  10.             return self::_setupMetadata();     // 2010-03-13追記
  11.         }
  12.     }
  13. }

これで今のところ安定しています。

訂正 2010-03-13

 ご指摘いただきまして例外発生時に、_metadataCacheを初期化後リトライするように修正しました。この処理を入れないと、その後必要なメタ情報がないので結局エラーになっておりました。
 そもそもなぜこのようなエラーが出るかは原因が不明なのですが、同じような症状に悩まれている方のご助力になれば幸いです。

[ZendFramework] ZFDebugを使ってみる

ZFDebugというのはメモリ、キャッシュ、ファイル、実行時間などを画面に出力してくれると言うことでとにかく使ってみました。

参考

ZFDebug - Joakim Nygård

使ってみる

zfdebug - Project Hosting on Google Code
googlecodeで管理されており、上のURLからダウンロードできます。現在はver1.5が最新ですのでこれを利用してみます。

ZFDebugはZend_Controller_Pluginで出来ていますので簡単に実装することが出来ます。
Bootstrapを利用している場合の実装サンプルも用意されていました。

PHP:
  1. protected function _initZFDebug()
  2. {
  3.     $autoloader = Zend_Loader_Autoloader::getInstance();
  4.     $autoloader->registerNamespace('ZFDebug');
  5.  
  6.     $options = array(
  7.         'plugins' => array('Variables',
  8.                            'Database' => array('adapter' => $db),
  9.                            'File' => array('basePath' => '/path/to/project'),
  10.                            'Memory',
  11.                            'Time',
  12.                            'Registry',
  13.                            'Cache' => array('backend' => $cache->getBackend()),
  14.                            'Exception')
  15.     );
  16.     $debug = new ZFDebug_Controller_Plugin_Debug($options);
  17.  
  18.     $this->bootstrap('frontController');
  19.     $frontController = $this->getResource('frontController');
  20.     $frontController->registerPlugin($debug);
  21. }

ZFDebug専用にプラグインが用意されています。

Auth
Cache
Database
Exception
File
Html
Memory
Registry
Text
Time
Variables

これらの中から利用したいデバッグを選びインスタンスを作成するときに設定する訳です。
プラグインを追加することも簡単ですので、必要に応じて自作してみてもよいかもしれません。

プラグインを実行するとページの下部にデバッグ結果が表示されます。
2009-scienta_debugbar
クリックすると詳細が表示されますので、使い易くなっています。

[jQuery] GoogleAPIsで用意されているCSSフレームワーク一覧

jQueryのテーマを簡単に変えることができるCSSフレームワークは、googleのapisでも管理されているので、手軽に色々なテーマで確認できてとても便利だったので、使えるリンクを一覧にしてみた。
※ ちなみに、バージョンは1.7.2です。

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/start/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/start/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/ui-darkness/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/ui-lightness/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/redmond/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/sunny/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/overcast/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/le-frog/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/flick/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/pepper-grinder/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/eggplant/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/dark-hive/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/cupertino/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/south-street/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/blitzer/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/humanity/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/hot-sneaks/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/excite-bike/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/vader/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/mint-choc/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/black-tie/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/trontastic/jquery-ui.css

http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/swanky-purse/jquery-ui.css

標準的なものを一覧にしたので、もしかしたらもっと他のテーマもあるかもしれない。

[ZendFramework] Zend_Layoutを無効にする

すぐ忘れるのでメモ。
コントローラヘルパーのレイアウトにdisableLayoutというのがあるのがそれです。

PHP:
  1. /* レイアウトを無効にする */   
  2. $this->_helper->layout->disableLayout();

こんな感じです。

[Zend Framework] コントローラープラグインで使えるインターフェース

直ぐに忘れるのでプラグインのテンプレをメモ。

調べもので流れ着いた方はこちらもどうぞ。
Zend Framework: Documentation: プラグイン - Zend Framework Manual

PHP:
  1. <?php
  2.  
  3. class My_Plugin_Test extends Zend_Controller_Plugin_Abstract
  4. {   
  5.     public function routeStartup(Zend_Controller_Request_Abstract $request)
  6.     {
  7.        
  8.     }
  9.    
  10.     public function routeShutdown(Zend_Controller_Request_Abstract $request)
  11.     {
  12.        
  13.     }
  14.    
  15.     public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
  16.     {
  17.        
  18.     }
  19.    
  20.     public function preDispatch(Zend_Controller_Request_Abstract $request)
  21.     {
  22.        
  23.     }
  24.    
  25.     public function postDispatch(Zend_Controller_Request_Abstract $request)
  26.     {
  27.  
  28.     }
  29.    
  30.     public function dispatchLoopShutdown()
  31.     {
  32.        
  33.     }
  34. }

こんな感じです。基本上から順番に処理されます。で用途にあった場所に処理を書けばOKなわけです。
今まであまりコントローラプラグインは使わなかったけど、Zend_Aplicationと組み合わせるとかなり扱い易かった。
これからはドンドン使おう。

[Zend Framework] Zend_View_Helper_HeadTitleの内要をクリア

簡単に出来ると思ったら、以外と難しかったのでメモ。
※これが正しいかかなり怪しいです!

/* clear */
    $headKeys = $this->view->headTitle()->getKeys();
    if (count($headKeys) > 0) {
    	foreach ($headKeys as $headKey) {
    	        $this->view->headTitle()->__unset($headKey);
    	}
    }

一括で初期化してくれるようなメソッドは、探したけど無かった。
AllayObjectを利用しているので簡単には出来ないのかな?とも思った。
とりあえず、上記のコードでクリアできたので良しとしよう。
 
でも、きっとクリアしないといけないような使い方をしているのが、そもそも違うような気がする。

[Mac] Pomodoroで時間管理

最近時間を節約するにはどうしたら良いだろうかと悩んでいて、丁度良さそうなアプリがあったので入れてみた。
 

Pomodoro - 時間管理へのアジャイル的アプローチ

 
このアプリはストップウォッチであって、自分で決めた時間がきたら任意のコマンドを実行することができる。タスク管理にストップウォッチ機能がついた感じかな。
インストールはダウンロードして任意の場所にアプリを配置して終了。
 
基本的な使い方は

command+opt+ctrl+↑:作業開始
command+opt+ctrl+↓:クリア
command+opt+ctrl+←:一時停止
command+opt+ctrl+→:再開

 
ツイッターとも連携して、アクションがある毎にかってにつぶやいてくれる。
使っているアカウントでタスクをつぶやいてしまうのは恥ずかしい気がするけど、
その恥ずかしさが作業効率をあげるのかもしれない。
 

追記

私が使っているmax osx10.6でこのアプリを起動すると、マシン性能が著しく低下しているので、利用するのは辞めてます。たぶん何かのアプリと競合しちゃってるっぽい。
 

 

[Ubuntu] Operaで日本語入力

必要があったのでUbuntuにOperaをインストールしたのですが、日本語入力が出来なかったのでメモ。
 

sudo apt-get install scim-bridge-client-qt

これでqtを扱うプログラムをインストール。
後、ショートカット「ctr + space」にホームが割当てされてますので、それも解除。
最後にOperaを再起動すれば旨くいきました。

[PostgreSQL] サイトが重くなった時の対処

重いSQLを発行してサイトが重くなっている場合の対処。
ここでは運用中のサイトが重すぎてみれないとクレームが来てしまって、サイト表示が最優先の場合です。

1. プロセスを確認する

select * from pg_stat_activity;

2. そのプロセスの重要度を確認する
先ほどのSQLで発行中のSQLを見てどの処理か確認する。

3. プロセスを停止する
更新系のプロセスでない場合は切ってしまった方が早い。

select pg_cancel_backend(pid);

4. SQL文を解析してチューニングする
SQLを参考に遅くなっている箇所を修正する。

[Linux] 実行ファイルがどこにあるか確認するコマンド

知らないコマンドを見つけたのでメモ。
 
PHPの実行ファイルを探す場合は

which php

となります。