Zend Frameworkのドキュメントの翻訳

ZFは1.10のリリースが間近に控え、今までのコンポーネント単位でのドキュメントとは別に、
チュートリアルも用意されるようになりました。
http://framework.zend.com/manual/1.10/ja/manual.html
しかしながら、チュートリアルについてもですが新しいドキュメントは翻訳がないのが現状です。
日本語の翻訳状況一覧:
http://mikaelkael.dyndns.org/checker/language/details/lang/ja
では待っていれば勝手に訳がアップデートされるかと言うと、違います。
今は日本語ドキュメントのアクティブユーザーはいません。
http://framework.zend.com/wiki/display/ZFDEV/Japanese+%28Nihongo%29


なので、

#zf Zend Framework1.10のドキュメントもオンラインで参照できるようになりましたね!
http://framework.zend.com/manual/1.10/ja/manual.html
ここ訳がないと思った人は訳せば良いと思うの 6:57 AM Jan 22nd

と思っています。実際に訳したら取り込んでもらえました*1


実際に取り込んでもらえるものを作るかは別として、ZFドキュメントの翻訳ファイルの作り方です。

ZFのドキュメントは、docbook形式で書かれておりtrunkについては以下のリポジトリ先です。
http://framework.zend.com/svn/framework/standard/trunk/documentation/manual/

en/

ja/
のところをチェックアウトします。実際のビルトにはja/README.ja.UTF-8の手順がありますが、
http://blog.lllnorikolll.com/archives/235なども参照)
今はPhDでのビルドの話もあるので、phdで一xmlファイルをhtml化して軽く表示確認すれば良いのかなとは思っています。
(ビルドすることが目的ではないので)
module_specs/配下が今までのコンポーネント単位用のドキュメントです。
en/ディレクトリにあるものでja/ディレクトリに同一のファイルが無い場合は未翻訳です。
ない場合はja/のほうにコピーすることになります。


実際に取り込む場合のお膳立てですが、

#zf Zend_Markup、「bullitリストって何」とかあるけど一応全部訳した。お二人のを参考に日本語でのフォーマットへの落とし込みやんなきゃいけないけども。 http://gist.github.com/260562  8:47 AM Jan 5th

と私のtwitterでの発言に対するyoshidaさんとのリプライをコピペします。

@sasezaki Zend_Markup よろしくお願いします :-) ちなみに半角文字の単語と日本語文の間にスペースを挟んで、「することができます」を「できます」に変えていただくと、さらに助かります。 2:13 PM Jan 5th

@sasezaki 単語の意味が不明な箇所は英語のまま残していただいて、その直前に TODO タグを <!-- TODO : to be translated --> のように入れておいて下さいませ 2:17 PM Jan 5th

@sasezaki 大事なこと忘れてました(笑 翻訳元の英語版の revision を 先頭の <!-- Reviewed: no --> の次行に <!-- EN-Revision: 16845 --> のように追加していただけますと助かります。版の diff で使われます 5:05 PM Jan 5th

で、私はちょっと勘違いしてチェックアウト時のSVNのリビジョンを書いてしまったわけですが、実際には元のxmlのリビジョンを挿入します。
(ちょっと翻訳作る前のこの手順が面倒ではないかと思ってzfコマンド用のプロパイダーも適当なのを作ってみました。http://gist.github.com/275341 *2 )


tutorials/のドキュメントは今のZFを知る最高の教材でしょうし、Zend_Application-*やZend_Cache_Manager、Zend_Validate-*など割と主要なものが翻訳として残ってます。私は今後以下のリポジトリにひとまずは格納しようかと思いますが。。(次はZend_Toolを考えているが微妙)
http://github.com/sasezaki/zf-manual-ja
ここまで読んだ方は未翻訳の箇所に出会った瞬間訳されることをおすすめします。

*1:本来ならhttp://framework.zend.com/wiki/display/ZFDEV/Translator+-+Getting+Started の手順でコミッターになっとくべきだと思いますが、うちにスキャナもプリンタもなくて二の足を踏んでたという(えー 

*2:翻訳チームによるZFCheckerというのがありますがよく分かってない。。。

第47回PHP勉強会

http://events.php.gr.jp/events/show/85
なんか最近は半分ぐらいPHP勉強会の記録ログにしかなってないですが(ezの勉強会とかoscにも行ってはいたんですが。。)11/7に行われたPHP勉強会に行ってきました。場所はトライコーンです。会場提供有難うございます。


上手いタイトルが浮かばなかったんで、まんまなんですが「Queueについての19分」ということで発表&アンケートしてきました。

結果はスライドの一番最後に付してます。あと、スライド2枚目は勉強会中の話を受けてのものです。
ustreamの録画がここにあります。(つながりにくいかも知れません。)
http://www.ustream.tv/recorded/2508515
19分といいながら、25分ぐらい時間とっちゃていましたね。すいません。。時計は見てたのに。。(緊張してて、テンパってたという言い訳。。反省)


個人的な試み的な所として、ミニカンファレンス的に話をいっぽう的にするというのはせっかく30人ぐらいの集まりでやってもおもしろくないというのとバックエンドの話は結局現実的に何人ぐらい必要なのかということで質問をはさんだんですが、その場にいたときの発言いただいても私上手く話広げられてないですなあ。


質問項目と人数を振り返ってみます。Q1はPHP5.3的な話が欲しいよねというのが前回からあったので入れてみました。"絶対存在"というイジワルな書き方をしましたが、SPLは5.3からdisbaleできないということも受けてだったのですけど、それより前に存在自体知らない人が多かったような。。。Q2,Q4はバッチジョブ使う人が会場にいるなかででどのくらい割合を占めるかということで訊いたんですが、手を挙げた方を鑑みると結局仕事としてプログラム使う人は携わることになるという身も蓋もないまとめでいいのでしょうか。。Q3は昔Spring(だっけかな)でストアド叩くシステム触ってたりしてたので、ストアド使いますか?が発端なんですが項目自体は不明瞭さがありましたね。。Q5はperl界隈では有名だけど、というのとPHPマニュアルで登場して来たので使ってるひといるかなという感じで訊きました。1人だったのは想定の範囲内です。。(sanematさん驚いてましたけど)。Q6はQ7はPHPカンファレンスQ4Mの話があったけど本当に何人必要だったのか疑問だったからですが、潜在的に必要な人数と手を挙げてもらった人数は一緒ではないとおもいますけれど、多くなかったですね。Q8はそのあとのデモのための前段階的なものです。もうちょっと知られて欲しいなあという願望もあったのですが。


他のかたの発表ですが、openpear自体については私は知ってる話が多かったですが、やっぱりhaltさんが直に話されると深みと濃くと切れ味が違いますね。(ところで、私の発表中にだしたスパイダーライブラリは色々整理して(パッケージ名は変えたい)からopenpearにあげようと思ってるんですが、まだやれてない。。)。gusagiさんの発表のは写メに関してですが、画像の回転とかexif情報とか必要な考慮点がありますね。すずきさんの(おなじみ?)メールに関する発表は私はてんで弱いので参考になりますというか、恐縮です。sableについては名前だけ知ってたという形だったんですが、2次会でも話伺ってふえーほへーという感じです。(スライドはどこかで出るのかな?)。ところでPHPフレームワークファイトっておわったことになってたんですね。。

第46回PHP勉強会@関東

http://events.php.gr.jp/events/show/84
帰りの電車で初めてケータイでGREEを見てる人を見かけました。偶然すぎる。懇親会の時にPHP5.3の利用者がゼロということで、PHP5.3の話をしました。(constにNOWDOCが書けるのが5.3の最大の利点とかそういう話。)その時のコード↓

<?php

class Template
{
    const TABLE = <<<EOF
<table>
    <tr>%s
    </tr>
</table>
EOF;

    public static function table($var)
    {
        return sprintf(static::TABLE,$var);
    }
}

class Menu extends Template
{
    const TABLE = <<<'EOF'
$a<table>%s</table>
EOF;
}

$table = function ($var) {
    //
    $path = "Menu"; 

    echo $path::table($var);
};

$table("aa");

酒飲んでなかったのに、ヒアドックとNOWDOCが頭こんがらがってしゃべってたと思います。。。。
グリーさん(ichiiさん)会場提供ありがとうございます。

SWFEditorを用いてFlash SWFからJPEGファイルを取り出す

PHPカンファレンス2009での個人的な目玉は、ハタさんの発表yoyaさんの発表でした。


yoyaさんの発表にあったSWF Editor for PHPをEdit以外の用途で使ってみます。
SWFEditorについては以下に記載があります。
http://pwiki.awm.jp/~yoya/?swfed


発表の際にたしか美少女が対応バージョンについて聞いてましたが、現在はPHP5.3には対応しておらず(Zend API的に*1、私のPHP 5.2.6-3ubuntu4.2ではphpizeできました。導入は上記サイトどおりで問題ないと思いますが、私の場合はsvn checkout,phpize, /etc/php5/cli/conf.d/swfed.iniの追加という手順です。


/trunk/sample/*配下にあるものでは一気にswfからjpgを取り出し保存するものがなかったようなので、それ用のコードを元のサンプルをいじって書いてみました。

<?php
if ($argc < 2) {
    fprintf(STDERR, "Usage: swfdump <swf_file>\n");
    exit(1);
}

$swf_filename = $argv[1];
$swfdata = file_get_contents($swf_filename);

$obj = new SWFEditor();
if ($obj->input($swfdata) == false) {
    fprintf(STDERR, "input failed\n");
    exit(1);
}

$tags = $obj->getTagList();

class SWFJpegFilter extends FilterIterator
{  
    public function accept()
    {
        $tag = $this->current();
        if($tag['tagName'] == 'DefineBitsJPEG2')
        {
            return true;
        }
    
        return false;
    }
}

foreach (new SWFJpegFilter(new ArrayIterator($tags)) as $k => $jpeg)
{
    $detail = $obj->getTagDetail($k);
    $imageId = $detail["image_id"];
    file_put_contents($imageId.'.jpg', $obj->getJpegData($imageId));
}

これでtomblooがなくてもjpeg取り出せますね。


参考:Tomblooハックス – Flash SWFからJPEGファイルを取り出す
http://ido.nu/kuma/2008/10/22/pure-javascript-implemented-flash-swf-file-parser/

*1:すいません、5.3でも対応してるようです。http://diary.awm.jp/~yoya/?200909b#200909131

Zend Framework 1.10

6月の発表に関する追記として、実際にリリースされたのは1.8.5ではなく、1.9.0でしたというのすっかり忘れてました。jiraのroadmap*1にはミニリリースと書いてあった気がしますが。


PHP5.3も出たので、ZF2.0の続報も待たれる頃かと思います。(え!?まだいらない?Doctrine2.0はアルファリリースに感極まってる人がいると言うのに)。1系統の次のミニバージョンアップZF1.10.0のロードマップが先ごろ出されました。
http://framework.zend.com/roadmap/1.10.0

この一覧にあるもの全てが実際に1.10.0梱包される気はあまりしないのですが、一覧で一番目を引くのは「Zend_Entity& Zend_Db_Mapper」*2のところでしょう。これは、ZFに関するいくつかのブログ記事でも知られるZFコントリビュータbeberleiにより開発中のものです。githubでのプロポーザル、ユーザブランチを経て現在はincubatorにて最新のコードをチェックできます。


ZF(チーム)のDBに対する設計姿勢については基本的なところではプロジェクトリーダーのMatthewの講演スライド、またZend_Dbに特化したところでは古くは「CakePHPのおいしい食べ方」で取り上げられたリンク先の記事や、現在Zend_DbリードとなったRalph Schindlerの記事で見て取れます。


Zend_Dbでこれまで扱われてきたのは抽象化レイヤ(パターン)です。(なぜかネット上ではZend_DbをORMとして記述されてるのが散見されます。)
ZFとDoctrineの併用についてはすでに様々な試みがされているばかりか、

MatthewのDoctrineのオートローディングに関する記事も出ている最中、Zend_Entity&
Zend_Db_Mapperがどういう立ち位置で扱われていくか注目かと思われます。今週末には、ZF使い&Doctrineの開発者を雇ってることで有名なフランスの方が来日されるのでぜひZFの苦労話について聞きたい所です。


ところでZend_Ical*3はどうなったんでしょう。。

Diggin のロードマップ

0.7での予定


Diggin_RobotRules(仮称)の搭載
robots.txtをメインにREP(Robot Exclusion
Protocol)などのパース・ハンドル(Zend_Http_Clientのインスタンスを渡したら判定など)・書き込み
を目的としたコンポーネント名前空間で、基本的にリクエストを送る側(ロボット側)よりの実装にします。
robots.txtにはRFCそのものが確かなかった訳のため、判定方法はrobotstxt.orgやREP情報や
ほかののモジュール(cpan、jspiderなど)を参考に作ろうとしてます。0.7ではハンドルが一応できる程度に留めます。


なおlaboratoryにパースまでできるものがありますが、これはたぶん捨てます。


Diggin_Service_Wedataの変更
ネタで全部staticにコール可能&プロパティに保持などというひどい実装でしたが、下記のとおり変更します。
http://diggin.googlecode.com/svn/standard/incubator/library/Diggin/Service/Wedata.php
一部メソッドの引数順序も変わります。


ーー 0.8, 0.9, 1.0 ーー

Diggin_Mechanize(仮)の導入をもってversionを1.0とする予定です。(多分あと5年以上はかかる気がするのでPHP使ってないかも知れませんが。。。)
その準備・実験段階として、Scraper_Helper機能導入と、shevron(Zend_Http_Client系の作者、Zend
Serverの開発にも携わっている)が作ったspizerのfork、機能追加を行っています。
http://github.com/sasezaki/spizer/tree/master

Diggin_Siteinfo

Diggin_Scraper_Helper_Simplexml_Pagerizeでは、下記のような単純な多次元配列をプッシュし利用します。(pageElementは現在サポートしていません。)

<?php
array(
     array('url' => '^http://framework.zend.com/code/changelog/Standard_Library/',
           'nextLink' => '//div[@class="changesetList"][last()]/a'),
     array('url' => '^http://musicrider.com/.*',
           'nextLink' => '//a'),
          )
);

wedataから取得したデータではdataキーの中にSiteinfoが格納された構造のため、配列として処理するさいにその違いを吸収するラッパーです。