タイトル募集中3.0

しがないITソルジャーの雑記。

debian etchとlennyにおけるffmpegの違い

ffmepg -i file.mp4 で情報取得したとき,

etchだと
Video: h264
Audio: aac

lennyだと
Video: h264
Audio: mpeg4aac

となる.エンコードの部分でコーデックごとに処理をわけていたので,表記が変わっているとは知らず,aacのままにしたいたので落ちていたようだ.とりあえず,書き直して対応.

うーん,最新版いれとけよって話だが,ffmepgはコンパイルが面倒なのでaptitudeで一発で入るのを選んでしまう.

VirtualBox上のDebianで解像度を変更する

普通にインストールした状態だと,解像度の変更ができなかった(そもそもプルダウンに選択肢がなかった)ので,ググってみた.

tp://d.hatena.ne.jp/a-ya_diary/20090308/1236524901
tp://d.hatena.ne.jp/hipuri/20080513/1210682649
tp://d.hatena.ne.jp/ksaito11/20090217

ありがとうございます.なんとかなりました.

Zend_Rest_Serverについて

ZendFrameworkについてがっつりいろいろやったんだけど,書くのが面倒で更新が滞ってましたが,落ち着いてきたので少し記事を書いていきたいと思います.

まずは,xmlを返すようなシステムを作るために使ったZend_Rest_Serverについて.Content-Typeとかも勝手にtext/xmlにしてくれるので便利なんですが,公式のドキュメント読んでも意味がわからなくてかなり悪戦苦闘しました.(公式:http://framework.zend.com/manual/ja/zend.rest.server.html

書いてる通りやってるのに動かない.どうなってんのって感じだった.だから一生懸命ググったんだけど,ググれどもググれども,いい資料が見つからない.最後は,海外のフォーラムをさまよって,やっとわかりやすいサンプルをみつけることができた.(http://blog.ekini.net/2009/04/17/zend-framework-a-simple-zend_rest_server-example/

以下,http://localhost/zend/123のような感じでアクセスを想定したプログラム.123はidとしてルーティングしてあります.

//indexAction

$params = $this->_getAllParams();
$request = 省略...;

$server = new Zend_Rest_Server();
$server->setClass('XmlServer');
$server->handle($request);

//XmlServer.php
class XmlServer
{
	private $xmlString = '<?xml version="1.0" encoding="UTF-8"?><response></response>';
	public function getById($id)
	{
		$xml = new SimpleXMLElement($this->xmlString);
		//ノード追加処理は省略
		return $xml;
	}
}

受け取ったパラーメタを上のサイトにあるように

Array ( [method] => getById [id] => 123 ) 

のような配列にして$requestを作成.この配列のmethodの部分がsetClassで指定したクラスでよばれることになるようです.さらに,残りのパラメータ(ここでは[id] => 123)の値がそのメソッドの引数として渡されます.受け取る側は,

getById($id)

のようにして受け取ることができます.また,$requestのパラメータが↓こんなかんじで複数あるときは,

Array ( [method] => getById [id] => 123 [name] => hogeo ) 
getById($id, $name)

のようにして受け取ることになります.パラメータの数に合わせて良しなにやってくれるので楽でいいです.存在しないメソッドを呼んだときのエラー処理とかもやってくれます.

ルーティング

この二つ読んだら出来た.

<?php
//index.php
$front = Zend_Controller_Front::getInstance();
	$router=$front->getRouter();
	$router->addRoute(
		'test_router',
		new Zend_Controller_Router_Route(
			'test/:id', //ルートの定義
			array( //デフォルト値
				'controller' => 'test',
				'action' => 'index',
				'id' => '000'
				),
			array(id' => '\d+')
        ));
Zend_Controller_Front::run('./application/controllers');
?>
<?php
//TestController.phpのindexAction
public function indexAction()
{
	$this->view->assign('id', $this->_getParam('id'));
}
?>
<?php
//view:index.phtml
echo $this->escape($this->id);
?>

これで,「http://localhost/test/123」でアクセスすると123って表示される.

ErrorController

とりあえずやり方はわかった.
でも,Viewについての理解が中途半端なのでうまく表示できない.
出来たらまとめる.

とりあえず

Zend_Controller_Plugin_ErrorHandlerの項を参考に,一番簡単な記述の↓を使います.

<?
//index.php
require_once 'Zend/Controller/Front.php';
require_once 'Zend/Controller/Plugin/ErrorHandler.php';

$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());

Zend_Controller_Front::run('./application/controllers');
?>

MVC での例外にある,__call(マジックメソッド?)を使ってもいいだけど,まだ理解してないのでパス(また今度勉強します).

ErrorControllerはサンプルを参考に

<?
require_once 'Zend/Controller/Action.php';

class ErrorController extends Zend_Controller_Action
{        
    public function indexAction() {
        
    }
    
    public function errorAction()
    {
        $this->_helper->viewRenderer->setNoRender();
        $errors = $this->_getParam('error_handler');
        
        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                // 404 エラー -- コントローラあるいはアクションが見つかりません
                $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
                
                $content = "not found.";
                break;
            default:
                // アプリケーションのエラー
                $content = "error.";
                break;
        }
        // 前回の内容を消去します
        $this->getResponse()->clearBody();
        $this->getResponse()->setBody($content);
    }
}
?>

こんな感じに.わざわざviewのファイル作るほど内容がないので(1行しかない),レスポンスオブジェクトを使って出力してやります.
自動レンダリングをONにしてるとindex.phtmlやerror.phtmlを表示してしまうので「$this->_helper->viewRenderer->setNoRender();」を追加して自動レンダリングをOFFにします(これでこのアクションでだけOFFになる).

とりあずこれで.詳しくは追々勉強しよう.

存在しないページ or アクションを呼んだときの処理

ZendFrameworkで存在しないページのURLを開こうとしたときとか,存在しないアクションを呼んだときの対処法を明日調べる.
なんか今,エラーメッセージが丸見えの状態なだけだからなあ.