2010年9月28日火曜日

zendのgetParam()はデフォルト値を取れる

使い始めのころは知らなかった。
いちいち空チェックをやってた。

たとえばページ番号なんかをpageパラメータから取得するときに
$page = $this->getRequest()->getParam('page', 1);
とかやれば、pageパラメータにデフォルトで1が入る。


まぁ普通にソース見てもいいし、ドキュメントにも書いてあるので、
とりあえず、API Documentationは一通り見ようと思った。

Zend Framework API Documentation

Zend FrameworkのMimeType Validatorがうまく動かない。

Zendを使っていて、
Zend_File_Transfer_Adapter_Httpでファイルをアップロードするとき、
$adapter->addValidator('MimeType', false, array('image/gif', 'image/png', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/x-png')); // jpg, png, gif
こんなんとか、
$adapter->addValidator('IsImage', false);
こんなんとかを使ってMimeTypeのチェックをしようと思ったが、なぜかうまくいかない。

見ると、
Zend_Validate_File_IsImage::NOT_DETECTED
のエラーを吐いてる。

どうやらmimetypeが取得できないみたい。

コードに問題はなさそうだし、なんか挙動がよくわからないので、Zend/Validate/File/MimeType.php の中身を見る。

追っていくと、途中の

} else if (!(class_exists('finfo', false))) {

に引っかかって Exceptionが飛んでる。

どうやらfinfoがないみたい。
調べると pecl経由でfileinfoを入れればよさそう。
(自分の環境はCentOS 5.5)

一応チェック
$ php -i | grep fileinfo
(何も出ない)

なので、やっぱり入ってないみたい。
うーむ、しかし内部的に finfo_open()を使ってるんだなー。。。

というわけで、fileinfoをインストール。

peclでphpizeを使うため、手始めにphp-develをインストール。
$ sudo yum install php-devel

.....

Installed:
  php-devel.x86_64 0:5.2.10-1.el5.centos

Complete!

続いて、peclコマンドでfileinfoをインストール。
$ sudo pecl install fileinfo

.....

Build process completed successfully
Installing '/usr/lib64/php/modules/fileinfo.so'
install ok: channel://pear.php.net/Fileinfo-1.0.4

これでOK。
あとは設定ファイルに書いてモジュールをロードする。

$ sudo vim /etc/php.d/fileinfo.ini

extension=fileinfo.so

で再起動。

$ sudo /etc/init.d/httpd restart
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]

$ php -i | grep fileinfo
/etc/php.d/fileinfo.ini,
fileinfo
fileinfo support => enabled

enabledになってればOK


これでMimeTypeのチェックがちゃんと動いた。

2010年9月21日火曜日

jqueryでエンターを押したときにsubmitさせる

formなどで、enterを押した段階でsubmitさせたい時がある。
それをjqueryで。
$('#password').keypress(function (e) {
    if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
        // sumit action
    }
});


参考
- Default html button submit on enter with JQuery - GreatWebGuy

phpでHTMLをパースする

前まではtidyを使ってたのだけど少々めんどかった印象があるので他のパーサライブラリを使ってみる。

かるく調べたところこのあたりが有名なのかな。
- Snoopy
- htmlSQL
- PHP Simple HTML DOM Parser
- Zend_Dom_Query

ひととおり全部使ってみた印象では(どれも一長一短あるけど)PHP Simple HTML DOM Parserが楽そう。

「タイトルだけ抜き出す」、「リンクだけ抜き出す」とかは大体どれも使い勝手は変わらないけど、もうちょっと凝ったことをやろうとするとどれもなかなか難しい部分がある。

というわけでもうちょっと使ってみる。

参考
- PHP×Snoopy×スクレイピング - 生涯未熟
- Webスクレイピングを可能にするPHPライブラリ・htmlSQL - かちびと.net
- ITキヲスク | htmlSQLよりアツい!?jQueryみたいにセレクタでHTMLをparse(解析)する「PHP Simple HTML DOM Parser」
- PHPアプリからCSSセレクタでHTML/XML文書を解析する - Zend_Dom -(1/4):CodeZine
- Zend_Dom_Query - noopな日々

javascriptでphpのisset()的な振る舞い

var hash = {a:'hoge', b:'piyo', c:'huga'}
if (hash[a]) {
    //exsist a
}
これだけでいいらしい。

PHPからTwitter APIのOAuthを使って投稿

OAuthを使ってtwitterで投稿するためには、consumer_key、consumer_secret、auth_token、token_secretの4つが必要になる。


consumer_key、consumer_secretを取得

これは、twitterのアプリを登録してkeyをもらう感じ。

Twitter / アプリケーション
にアクセスして、アプリケーションを登録。

登録すると、登録したアプリ用の「consumer_key」と「consumer_secret」が表示されるのでそれをメモっておく。


auth_token、token_secretを取得

上のアプリを使うアカウントのkeyを取得する感じ。

2010-01-24 - hirokan55の日記のサイトを参考に、
Downloads for abraham's twitteroauth - GitHubからabraham-twitteroauth-XXXXX.zipを落としてきて、
どこか自分のサーバにファイル群を置き、
config.phpのCONSUMER_KEY、CONSUMER_SECRETを上のアプリのkeyに、OAUTH_CALLBACKをおいたcallback.phpのURLとして修正する。

そのあと、index.phpにアクセスし、twitter側に認可を求めて、OAuth tokenとOAuth token secretを発行してもらう。

で、表示されたOAuth tokenとOAuth token secretをメモっておく。


ここまでで、consumer_key、consumer_secret、auth_token、token_secretの4つがわかったので、あとはこれを使って投稿するだけ。


投稿のやり方はたくさんあるけど、今回はpearのservices_twitterとHTTP_OAuthを使った。


まずインストール

services_twitterを入れる
$ sudo pear install --force services_twitter
.....
Starting to download Net_URL2-0.3.1.tgz (8,488 bytes)
...done: 8,488 bytes
install ok: channel://pear.php.net/Net_URL2-0.3.1
install ok: channel://pear.php.net/HTTP_Request2-0.5.2
install ok: channel://pear.php.net/Services_Twitter-0.6.2

HTTP_OAuthを入れる(stableがないので今回は0.1.18のバージョン指定で入れる)
$ sudo pear install HTTP_OAuth-0.1.18
.....
downloading HTTP_OAuth-0.1.18.tgz ...
Starting to download HTTP_OAuth-0.1.18.tgz (51,237 bytes)
.............done: 51,237 bytes
install ok: channel://pear.php.net/HTTP_OAuth-0.1.18


サンプルコード
require_once 'Services/Twitter.php';
require_once 'HTTP/OAuth/Consumer.php';

try {
    $twitter = new Services_Twitter();
    $oauth   = new HTTP_OAuth_Consumer(
       'メモったconsumer_key',
       'メモったconsumer_secret',
       'メモったauth_token',
       'メモったtoken_secret'
    );
    $twitter->setOAuth($oauth);
    $msg = $twitter->statuses->update("OAuth経由でTwitterに投稿するよ。");
} catch (Services_Twitter_Exception $e) {
    echo $e->getMessage();
}


参考
- 2010-01-24 - hirokan55の日記
- PHPでTwitter APIのOAuthを使う方法 - memo.xight.org

2010年9月9日木曜日

Setup Time Capsule

・Time CapsuleとモデムをLANでつなぐ
・Time CapsuleとMacをLANでつなぐ
・Macの中でTime Capsuleの設定画面が出る
・あとはTime Capsule内部の設定(ネットへの接続設定など)をするだけ
・WindowsからつなぐときはIP \\***.***.***.***\で


- Mac OS X(Leopard) + Time -Capsule + rsyncによる遠隔地ミラーバックアップ(コロケーション)環境の構築 - Object Design Blog
- 構想雑文 : TimeCapsuleで自宅サーバを行う場合の設定 - livedoor Blog(ブログ)
- Time CapsuleでMobileMeを利用する設定 | appling weblog
- Time Capsuleの設定と使い方 - [Mac OSの使い方] All About
- Time Capsuleに外出先からアクセス出来るんですか? | OKWave
- iTunesのデータをTime Capsuleに保存 « Fukigen blog
- おかゆ MacBook  Time Capsule 上のiTunesライブラリをFront Rowで読む方法
- iPhotoの写真やiTunesのライブラリをNAS上に置いて共有する - shygirlsの日記
- 1TBのNASを買ってiTunesの曲とか移動させてみた - 使いやすさとバイオリン

Zend_Logを使ってファイルにログを吐く

Zend_Logを使ってファイルにログを吐くときの個人的な定型
require_once("Zend/Log.php");
require_once("Zend/Log/Writer/Stream.php");
require_once("Zend/Log/Filter/Priority.php");
require_once("Zend/Log/Formatter/Simple.php");

// output format
$time = date('Y/m/d H:i:s');
$format = "{$time} %priorityName% (%priority%): %message%" . PHP_EOL;
$formatter = new Zend_Log_Formatter_Simple($format);
$writer = new Zend_Log_Writer_Stream('/****/****/****/logs/error_log'); // set log file path
$writer->setFormatter($formatter);

// setting log level
$filter = new Zend_Log_Filter_Priority(Zend_Log::DEBUG);
$log = new Zend_Log();
$log->addWriter($writer);
$log->addFilter($filter);

// write log
$log->debug('hogehoge');

PHP Fatal error: Class 'DOMDocument' not found

こんなんでた
PHP Fatal error:  Class 'DOMDocument' not found in /****/app/zf/library/Zend/Gdata/App/Base.php on line 210

これをいれる
$ sudo yum install php-xml

- Fatal error: Class ‘DOMDocument’ not foundと出たら: PHPの種 ブログ