ZendFrameworkをFirePHPでSQLデバッグ

zf1.6でfirephpに対応します。

Firebug へのログ出力のために Zend_Log_Writer_Firebug コンポーネントを提供しています。通信プロトコルは HTTP リクエストヘッダとレスポンスヘッダを使用し、 これによってサーバとクライアントコンポーネントの間の通信を行っています。 ページのコンテンツに何も手を加えなくても、 スクリプト実行時に生成したさまざまなデータをブラウザ側で記録できるのです。 この方式なら、AJAX リクエストのようにクリーンな JSON および XML レスポンスを要求するリクエストのデバッグも行えます。

firefox3 + firephp最新版推奨。

たぶん今現在(2008/08/31)、firephpの "Next Release Preview" ってやつでしか動かない。
http://www.firephp.org/
"Firefox Extension 0.1.1.2 (Aug 25, 2008) "

エラーが出たらたぶんzfのせいじゃなくて firephp のバージョンアップのせいだとおもわれ

firephpに色々流せるみたいだけど一番気になるのは、Zend_Db_Profiler_Firebug。
firebugのコンソールに発行したSQLを全部表示できます。

設定はFrontControllerでやってしまうのが手っ取り早い。

 
$profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
$profiler->setEnabled(true);
$db->setProfiler($profiler);
 
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(Zend_Wildfire_Channel_HttpHeaders::getInstance());
 

こうすると、

firebugのコンソールにこんなのが表示されます。

Zend_Db_Profiler_Firebug

あー便利。

Zend_LoaderはPEARにも使える

ZendFrameworkのコンポーネントの1つ、Zend_LoaderはSPLのautoloadを実装したものです。

PHPファイルの頭で、

 
< ?php
require_once 'Hoge/Fuga/Uhya.php';
require_once 'Unko/Chinko/Pantsu.php';
require_once 'PEAR/Something/Ahya.php';
 

っていうふうに ファイルを1個ずつ呼び出して行くのはめんどくさ過ぎなので autoload を使う。

require_once を書く代わりに、

 
< ?php
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
 

って書いておけば、もう命名規則に沿っている限り require_once はもう書かなくて良い。

Zend_Loaderは中で、アンダーバーに 「 _ 」をスラッシュ「 / 」 に置き換えて他のファイルを読む込む必要がでてきたときに勝手にインクルードしてくれる。

 
< ?php
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
 
$dh = Date_Holidays::factory('Japan', 2008, 'ja_JP');
 
$date = new Date_Holidays();
 

とりあえずPEARは全部命名規則通りだったと思うので、もうrequire_once イラネ。

Ubiquity for Firefox すげぇw

すげえw
Firefox版のQuickSilverっぽいやつかな?
vimperatorでもできるよとかはなしで。

http://labs.mozilla.com/2008/08/introducing-ubiquity/

自分でコマンド書けるし、コマンド書くときもいちいちファイル開いて保存とかしなくてもいい。
"command-editor" ってコマンド呼び出して、テキストエリアにJS書くだけ。どうやって保存するんだって思ってたら、そのままページ閉じるだけで良かった。
簡単すぎ。

チュートリアルには "Hello World"を呼び出す方法とか書いてある。呼び出した結果はMacだとGrowlに渡せる。
Windowsは特に何もインストールしないって書いてあったと思うから、たぶん右下のポップアップ?

設定は help コマンドかアドレスバーに about:ubiquity って打てばでてきます。

↓スクリーンキャスト撮った

転送量制限で見れなくなったらこっち。
http://wozozo.org/movie/2008-08-27_1635.swf

ZendFramework SQL Debug View Helper

cakeとかsymfonyには画面下にSQLログみたいなのが表示されてる。これzfにも欲しい。

と思ってポイものを作った。

svn co http://svn.coderepos.org/share/lang/php/ZendFramework_ext/library/Ex/View/Helper/ShowSQL.php

使い方。

bootstrapで、view helperのディレクトリを指定する。

 
$view = new Zend_View();
$view->addHelperPath(self::$root . '/library/Ex/View/Helper', 'Ex_View_Helper');
 

で、viewの中で

 
< ?php echo $this->showSQL() ?>
 

ってやると、

こんなやつが表示される。

helper内の

 
$this->_db = Zend_Db_Table::getDefaultAdapter();
 

DBに接続する部分は環境にあわせて書き換えてください。
このプラグイン内でjQueryを読み込んでて、それが影響するようならJSの部分だけ消しちゃってください。
テーブルのソートができなくなるぐらいで特に問題はないです。

plugin内で完結させようとしてHTMとかCSSがごちゃまぜになってしまった。

ZendFrameworkでニコりまくる。mylist編

前回 ZendFrameworkでニコる。flv。

mylist の動画を全部落とす。

連続でアクセスしまくるとしばらく(15分ぐらい?)弾かれるみたいなので、1つのflvダウンロードするごとに sleep(30) で30秒待機してます。

 
< ?php
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
 
// create adapter
$client = new Zend_Http_Client();
$client->setConfig(array('keepalive' => true));
 
// Login
$client->setCookieJar()
       ->setUri('https://secure.nicovideo.jp/secure/login?site=niconico')
       ->setParameterPost(array(
            'mail'     => 'mailaddress',
            'password' => 'password',
         ))
       ->request(Zend_Http_Client::POST);
 
// get mylist html
$list = 'http://www.nicovideo.jp/mylist/7446991';
$client->setUri($list)
       ->request(Zend_Http_Client::GET);
$response = $client->getLastResponse();
 
$html = $response->getBody();
 
// get smile video list
$dom = new Zend_Dom_Query($html);
$xpath = "//html/body/div[@id='PAGEBODY']/div[2]/table[@id='mylists']/tr/td[2]/h3/a";
$results = $dom->queryXpath($xpath);
 
// get href
$urlList = array();
foreach ($results as $r) {
    $urlList[] = $r->getAttribute('href');
}
 
// get flv
foreach ($urlList as $url) {
    $video = preg_split('/\//', $url);
    $video_id = $video[1];
 
    $client->setUri("http://www.nicovideo.jp/watch/{$video_id}")
           ->request(Zend_Http_Client::GET);
 
    // for filename
    $title = $client->getLastResponse();
 
    $client->setUri("http://www.nicovideo.jp/api/getflv?v={$video_id}")
           ->request(Zend_Http_Client::GET);
 
    $response = $client->getLastResponse();
 
    // get flv url
    $body = $response->getBody();
    parse_str($body, $query);
    $url = $query['url'];
 
    /**
     * get Title
     */
    $dom = new Zend_Dom_Query($title->getBody());
    $results = $dom->queryXpath('//title');
    foreach ($results as $r) {
        $pageTitle = $r->nodeValue;
    }
 
    /**
     * get flv
     */
    $client->setUri($url)
           ->request(Zend_Http_Client::GET);
    $response = $client->getLastResponse();
    file_put_contents("{$pageTitle}.flv", $response->getBody());
 
    sleep(30);
 
}
 

なんかたまに文字化けする。なんだかよくわからん。