【CakePHP】「第1回CakePHPオフ会@関東」追加情報

cake-logo現在企画されていますCakePHPオフ会ですが、追加情報を公開しました。

▼第1回 CakePHPオフ会@関東
http://atnd.org/events/1101

以下抜粋です

当日の予定
当日は簡単な発表(LT)をする予定です。乾杯して、自己紹介して、ワイワイ歓談しながらLTするという感じです。

  • LT1: cakephper「写真で見るCakeFEST参加報告」
  • LT2: kaz_29「smartydbview plugin作ってます」
  • LT3: MASA-P「すごいぞ! Media Plugin for CakePHP1.2」

参加者の方も何か話したいことがありましたら、当日飛び入りで是非お願いします!

基本的には、懇親会のように参加者同士の交流を深めていただく趣旨のイベントですが、LT等でさらに盛り上がっていただければと思い、私の方からは、他記事で紹介させていただきました「Media Plugin」の実際の使い方について解説させていただきたいと思います。ほか、cakephperさんからは、先日参加された「CakeFestベルリン」の報告(写真付き!)が、そしてkaz_29さんからは、これも他記事で紹介させていただきました「SmartyViewをDBと組み合わせて使用する」アイデアを現在Plugin化されているようで、その発表があるようですよ。

定員が少なくて申し訳ございませんが、既に7名の参加表明となり、予定枠はあと3つとなってしまいました。是非お早めの参加表明をしていただけますと幸いです。なお、仮に埋まってしまいましても、こちらの方で調整いたしますので、受付ページ内のコメント欄に是非その旨お書きください。

今月来月はイベントが目白押しですが、是非CakePHPオフ会の参加をお待ちしております。

【CakePHP】CakeFestで発表された「Media Plugin for CakePHP」のスライドを翻訳してみました

cake-logoyandodさんCake Festのレポートの中に興味深いセッションが紹介されていました。
「Media Plugin for CakePHP」というものなのですが、これはこれからやろうとしていた制作物にまさに搭載しようとしていた機能で、作るのが面倒なのでどうしようかと考えていたところでした!

で、とりあえずソースを落としてきたのですが、それと一緒にセッション中で使われた(と思われる)スライド(PDF)も公開されていましたので、超ダメ翻訳をしてみました。変な翻訳が間違いなくあると思いますが、その辺ご容赦ください(^^;;;。

————————————————————

CakePHP メディア・プラグイン

Marius Wilms (David Persson)

2009/7/12

————————————————–
【イントロダクション】
————————————————–

自己紹介

■Braunschweig芸術大学の学生です
■PHP歴は8年です
■CakePHP歴は2年半です
■3月から、CakePHPのコアデベロッパーをしています

—————————————-

このトークは…

■アップロードファイルのハンドリング
■異なったバージョンのファイル生成
■埋め込みのためのマークアップの作成
■いくつかの上級向けの使い方

—————————————-

このプラグインは?

23通りの、ファイルの「転送」「操作」「埋め込み」を可能にするCakePHPプラグイン。

■なぜ?
■安定版:0.50 / 開発版 : 0.60alpha
■CakePHP 1.2.x.x とPHP5.2以上に対応
■ソース : https://github.com/davidpersson/media/tree
■ドキュメント : http://wiki.github.com/davidpersson/media

—————————————-

セットアップ

最新版の一式を入手

git clone git ://github.com/davidpersson/media.git app/plugins/media

「app/config/bootstrap.php」にてコンフィグレーションの読み込み


require APP . ’plugins/media/config/core.php’;

ディレクトリの初期化

cake/console/cake media init
chmod -R a+rwX app/webroot/media/{transfer,filter}

————————————————–
【転送】
————————————————–

導入

■沢山のコンポーネント・ビヘイビア・ライブラリ
■正しく処理がされなかったら:潜在的なセキュリティホール
■(他の人が)考えるよりも巧妙

HTMLフォームとアップロード

テンプレートの編集

app/views/movies/add.ctp


echo $form.>create(’Movie’, array(’type’ => ’file ’ )) ;
// ...
echo $form.>input(’file’ , array( ’type’ => ’file ’ )) ;
// ...

—————————————-

リクエスト例

POST /movies/add

Header:
Content-Type: multipart/form-data; boundary=12591
Content-Length: 32888
Body:
–12591
Content-Disposition: form-data; name=”‘_method”’
POST
–12591
Content-Disposition: form-data; name=”‘data[Movie][title]”’
Demo
–12591
Content-Disposition: form-data; name=”‘data[Movie][file]”’ ; filename=”‘clipboard . jpg”’
Content-Type: image/jpeg
… data …
–12591–
200 OK

—————————————-

データのリザルト

MoviesController::$data


Array
(
[Movie] => Array
(
[ title ] => Demo
[ file ] => Array
(
[name] => clipboard.jpg
[type] => image/jpeg
[tmp_name] => /private/var/tmp/php4zN7BY
[ error ] => 0
[ size ] => 32405
)
)
)

—————————————-

バリデーション

(下記を)信用するべきではない

■元のファイル名(変な文字列)
■元のファイル拡張子
■送信MIMEタイプ

—————————————-

実行可能ファイルのアップロード : リクエスト

POST /movies/add

Header:
Content-Type: multipart/form.data; boundary=cAkePhPrUlEz
Content-Length: 32888
Body:
–cAkePhPrUlEz
Content-Disposition: form-data; name=”‘_method”’
POST
–cAkePhPrUlEz
Content-Disposition: form-data; name=”‘data[Movie][title]”’
Fake
–cAkePhPrUlEz
Content-Disposition: form-data; name=”‘data[Movie][file]”’ ; filename=”‘ex.php”’
Content-Type: image/jpeg
<?php echo “‘Hello PHP.”’ ?>
–cAkePhPrUlEz–
200 OK

—————————————-

実行可能ファイルのアップロード : 結果データ

MoviesController::$data


Array
(
[Movie] => Array
(
[ title ] => Fake
[ file ] => Array
(
[name] => ex.php
[type] => image/jpeg
[tmp_name] => /private/var/tmp/phpn4BPKr
[ error ] => 0
[ size ] => 26
)
)
)

—————————————-

レッスンで学んだこと

■送信データを信じるな。バリデート!
■アップロードファイルをwebrootの外側に保存
■応答限定。言い換えれば「リサイズした画像」
■推測不可能な場所へのアップロードの作成。言い換えれば「UUIDの使用」

—————————————-

転送ビヘイビア

私に何をしてくれる?

■いくつもの種類のアップロードを処理
■HTTP POST
■HTTP経由のリモートファイル
■ローカルファイル
■転送のバリデート(8つの新しいバリデーションルール)

—————————————-

使い方

モデルの編集

app/models/movie.php


class Movie extends AppModel {
var $actsAs = array(’Media.Transfer’ ) ;
}

—————————————-

転送ディレクトリの再設置

設定のアップデート

app/config/bootstrap.php


define( ’MEDIA_TRANSFER’, APP . ’transfer’ . DS);
define( ’MEDIA_TRANSFER_URL’, false);
require APP . ’plugins/media/config/core.php’;

ディレクトリの再初期化

cake/console/cake media init
chmod -R a+rwX app/transfer

—————————————-

バリデーション

種類
■location
■size
■pixels
■extension
■MIME type
■あと3つ(それほど興味深くないもの)…

—————————————-

ルールの追加

app/models/movie.php


class Movie extends AppModel {
var $actsAs = array(’Media.Transfer’ ) ;
var $validate = array(
’ file ’ => array(
’mimeType’ => array(
’rule ’ => array(’checkMimeType’, false, array( ’image/jpeg’, ’image/png’))
) ,
’size ’ => array(
’rule ’ => array(’checkSize’ , ’5M’)
)
)) ;
}

—————————————-

Reloca Transfer デモ

(省略)

————————————————–
【バージョン生成】
————————————————–

導入

■共通タスク
■一般的なインターフェースの無い複数ライブラリを必要とする
■セキュアな転送ファイルの手助けをする(言い換えれば コメントタグの除去)

—————————————-

メディアビヘイビア

何をしてくれる?

■改作ファイルの作成
■見透かしたファイルメタデータの回収(カバーできない)
■データベースレコードを用いてファイルの組(後ほど)

—————————————-

使い方

ビヘイビアの追加(連結)

app/models/movie.php


class Movie extends AppModel {
var $actsAs = array(
’Media.Transfer’ ,
’Media.Media’
) ;
// ...
}

—————————————-

デフォルトフィルター設定の上書き

app/config/bootstrap.php


define( ’MEDIA_TRANSFER’, APP . ’transfer’ . DS);
define( ’MEDIA_TRANSFER_URL’, false);
require APP . ’plugins ’ . DS . ’media’ . DS . ’ config ’ . DS . ’ core .php’;
Configure :: write ( ’Media. filter .image’, array(
’s ’ => array(’convert’ => ’image/png’, ’fitCrop ’ => array(100, 100)),
’m’ => array(’convert’ => ’image/png’, ’ fit ’ => array(300, 300)),
)) ;
Configure :: write ( ’Media. filter . video ’ , array(
’s ’ => array(’convert’ => ’image/png’, ’fitCrop ’ => array(100, 100)),
’m’ => array(’convert’ => ’video/ogg’, ’ fit ’ => array(300, 300)),
)) ;

—————————————-

媒体クラス

単一の媒体ファイルの提供インスタンス

■Manipulation
■Information

有効なアダプター

■Gd
■Imagick (ネイティブ & シェル)
■Ffmpeg (ネイティブ)
■GetId3
■PearMp3 & -Text

他のアダプターを提案してください!

—————————————-

Manipulation

…高機能です

なぜ?

■同期(アップロードに)
■非同期
■混合

可能な特徴

■バージョン
■メディアタイプ
■ファイルサイズ

—————————————-

更に他のコールバック:beforeMake

■いつ生成したものかのバージョン入手のコントロール
■代理世代の利用。言い換えればメッセージキュー
■カスタムManipulationメソッドの利用

—————————————-

モデルの更新

app/models/movie.php


class Movie extends AppModel {
// ...
function beforeMake( $file , $process) {
extract($process) ;
if ( $version == ’m’) {
return ClassRegistry :: init ( ’Queue.Job’)->put(compact(’file’, ’process ’ )) ;
}
}
}

戻り値
true: ハンドル済み, バージョンは既に作られている
false or null: 未ハンドル, ビヘイビアがバージョンを作りました

————————————————–
【マークアップ】
————————————————–

導入

■複数のメディアタイプ
■似通ったニーズの異なったマークアップ
■長いパス

—————————————-

何をしてくれる?

■簡単な埋め込みとリンク用の統合されたインターフェース
■部分、あるいは絶対パス
■転送ディレクトリの保護を守る

—————————————-

部分パスのサポート

■全てのヘルパーメソッドのための仕組み
■ダイナミックな拡張

css/cake.generic    /full/path/to/static/css/cake.generic.css
s/img/logo            /full/path/to/filter/s/static/img/logo.png
transfer/img/cern    /full/path/to/transfer/img/cern.jpg
m/transfer/img/cern    /full/path/to/filter/m/transfer/img/cern.png

—————————————-

収集マークアップの作成

ヘルパーを追加


class MoviesController extends AppController {
var $helpers = array(’Media.Medium’);
// ...
}

—————————————-

テンプレートの編集

app/views/movies/view.ctp


<h2>Movie</h2>
<dl>
<dt>Id</dt>
<dd><?php echo $movie[’Movie’][’id’]; ?></dd>
<dt>Title</dt>
<dd><?php echo $movie[’Movie’][’title’ ]; ?></dd>
<dt>File</dt>
<dd><?php echo $medium->file($movie[’Movie’]); ?></dd>
<dt>Preview</dt>
<dd><?php echo $medium->embed($medium.>file(’filter/s’, $movie[’Movie’])); ?></dd>
</dl>

————————————————–
【拡張】
————————————————–

導入

全てのことが一緒にやってきます

—————————————-

添付モデル

何を与えてくれる?

■添付ファイルのための中央場所
■データベースレコードを用いてファイルの組
■バリデーションルールを既に用意
■他の(複数)モデルが結合できる(多型)

—————————————-

使い方

モデルを供給

app/plugins/media/models/attachment.php


class Attachment extends AppModel {
var $actsAs = array(
// ...
’Media.Transfer’ => array(
’ trustClient ’ => false,
’ baseDirectory ’ => MEDIA_TRANSFER,
’ destinationFile ’ => ’:Medium.short::DS::Source.basename:’,
’ createDirectory ’ => true,
) ,
’Media.Media’ => array(
’metadataLevel’ => 2,
’makeVersions’ => true,
’ filterDirectory ’ => MEDIA_FILTER,
) ,
) ;
// ...
}

cake schema run create -path app/plugins/media/config/sql/ -name Media

—————————————-

結合(アソシエーション)

app/models/movie.php


class Movie extends AppModel {
var $hasMany = array(
’Attachment’ => array(
’className’ => ’Media.Attachment’,
’ foreignKey’ => ’foreign_key’,
’ conditions ’ => array(’model’ => ’Movie’),
’dependent’ => true,
)) ;
}

—————————————-

コントローラ・アクションの編集

app/controllers/movies_controller.php


class MoviesController extends AppController {
// ...
function add() {
if (!empty($this->data)) {
$this.>Movie->create();
if ( $this->Movie->saveAll($this->data, array(’validate’ => ’first’))) {
$this->flash(’Movie saved.’, array( ’ action ’=>’index’));
// ...
}

—————————————-

添付エレメント

何?

■HTMLオンリーのソリューション
■ファイルの添付と取り外しのためのフォームフィールド
■あなた独自のソリューションを構築するためのプロトタイプ(もっと言えばflashベース)
■ヘルパーの内部構造を利用

—————————————-

使い方

テンプレートの編集

app/views/movies/add.ctp


echo $form->create(’Movie’, array(’type’ => ’file ’ )) ;
// ...
echo $this->element(’attachments’, array(’plugin ’ => ’media’));
// ...

—————————————-

拡張デモ

(省略)

————————————————–
【終わり】
————————————————–

将来

■新しいCakePHPのリリースについて行く
■安定版にする
■いくつかの新しい特徴

—————————————-

これで終わりです、みなさん。

ご質問は?

————————————————————

実際に動かしていないのでよく分からないのですが、「version」というのはソースコードで言う世代管理みたいなものというよりは、画像サイズの大中小等、1要素中の複数の異なるメディアを管理できるような仕組みにも感じます(解説中に「m」「s」と書かれているので)。gdとかが出てくるので1ファイルのフォーム入力で勝手に生成するような機能であれば、まさにやりたいことが出来そう!
とりあえずテストがてら組み込んでみて、簡単に動くようであれば是非本番にも組み込みたいと思います。ちょっと忙しいのでレポートは詳細に出来ないかもしれませんが、ご紹介できたら、ということで。

現地にいるcakephperさんと少しSkypeしましたが、う~ん…お金と時間があったら行きたかったなぁ。とっても楽しそうでした。次回は是非チャレンジしたいと思います。

【CakePHP】第4回CakePHP勉強会@Tokyo無事終了!

cake-logo勉強会参加の皆様、本当にお疲れ様でした。
また、当方の「つまらない話」に耳を傾けていただいた皆様、本当にありがとうございました。
そして、懇親会にてお声がけいただいた皆様、そして会場を提供していただいたGREE様、スタッフの皆様、yandodさんをはじめとする発表者の皆様、本当にありがとうございました。

さて、勉強会報告の前にまずは自分の反省会なのですが…
まあ前回カンファレンス東京のLTよりはマシになったかもしれませんが、でもまだ全然でしたね。
内容はだいぶ削ったのですが、やっぱり早口でした(^^;;;
早口ですから皆さんもついて行くのに必死だったのではないでしょうか?
本当にすみません…

また、LTの時はは時間が絶対的に足りなかった(つまり扱うネタを間違えた)という反省点がありました。今回は時間は(個人的には足りないのですが)まあよしとして、別の点で改める必要がありそうです。いまいちターゲットを絞れていなかったというのか、初めて聞く方と、ある程度触っている方のネタを両方とも同じくらい入れてしまったのが反省すべき点…というか難しかったです。あとは話慣れていない点ですね。この辺は経験値だと思いますので、ご迷惑かもしれませんが回数を重ねさせていただいて改善したいと思います。

さて、自分の反省はこのくらいにしておいて、他の皆さんの発表に対しての自分の考え等をつらつらと書いていきたいと思います。

■candycane:yandodさん

私にとっては大注目だったテーマで、これは成功したら大変なことになると前から考えていました。実は、2回目の勉強会で知り合った方々と、「redmine移植したら凄いよね」的なところでやる企画はあったのですが、それが立ち消えしてしまったのです。Pukiwiki機能他オリジナル機能も搭載されるとのことなのでとても良いツールになりそうな予感です。コード公開されたら、是非Ktai LibraryのBTSをこれにさせていただきます(笑)。

■「Ktai Library」で携帯サイトを高速開発:MASA-P

「Ktai Library」スライドダウンロード
「Ktai Library」スライドダウンロード(PDF形式)

内容については、上記スライドの方をご覧ください。

■極めるroutes.php:akiyanさん

素晴らしいドキュメントです。
スライドを公開されるそうなので、routesを詳しく使いたい方には良い教材になると思います。
でも、個人的に言わせてもらうと、まだ極められていない!(笑)
是非Routes::connectNamed()に関する記述を入れて欲しいところです。

クエリパラメータ(「?~」「#~」)に関しては、私もKtai Libraryの開発時に、ソースを追っていって気がつきました。確かにマニュアル等、何処にも記述がないんですよね。

■CakePHP 1.3:cakephperさん

デプロイとJsHelperは大変興味があります!
それからSQL Exprainは「つくかも」とのことですが、便利なので標準になって欲しいですね。
他にどんな機能がついていくんでしょうね。
また、IRCはいつもありがとうございます。私も非力ながらお手伝いできることがあったらさせてください。

■phpUnderControl:miauさん

内容の前に、まず「見せ方」が大変に面白かった!
今までにない発想で楽しかったです。
ただ、時間がない影響でやはり早口で進行してしまっているところがあり、また割と上級向けの内容だったためについて行くのがやっとだった印象です。私の前回のLTを見ているようだったので、自分は人のことが言えないですが、でも是非改善いただければと思います。

で、内容なのですが、これはなかなか面白いツールですね!
グラフでいろんな履歴が丸わかりというのか、プロジェクトの健全性分析に威力を発揮するなと感じました。
また、テスト関連の自動化は素晴らしいというのか、こりゃー楽だみたいな。
自分の会社がもしでかくなったら、こういうツールも是非検討したいと思います。

■ImageGraph:s-yo-koさん

私は、同様のグラフ作成として、Google Chart APIを考えていました。
何故かというと、ImageGraphだとたぶんGDがいると思うのですが、レンタル鯖でGDが入っていない不届きものがいたりするので、こちらの方が一般化しやすいかな、と。
でも、グラフなどによる情報の可視化は私もこれからのテーマになりそうです。

■Behavior:matsuuraさん

Bakeryに、お宝は結構ありそうですね。
ソフトデリートは、今まで律儀に毎度書いていたので、ビヘイビア使用に切り替えても良いかなと思いました。
また、slugも便利そう。
私的にもビヘイビアはあまり触っていない方なので、これからは積極使用したいです。

■プラグイン三段活用:slywalkerさん

エンターテイナーだなぁ(笑)。
うらやましい発表でした。
内容も素晴らしい! マジでKtai Libraryをプラグインで出した方が良さそうな気がしてきました。
問題点は…多少手書きでおのおののカスタマイズが必要になり、簡単インストールで無くなってしまいそうな点ですね。
ここを解決できれば、とてもウマーになりそうです。

■10分でできるApp::import:shinさん

この話については、いろいろと物申すところがあります(笑)。
いろいろ使っていくとですね、やはりApp::import()はキャッシュが効いていたとしても重い!
こちらの記事で書きましたが、tree()を軽くしないと、やはりApp::import()はまだまだ小悪魔です。
せめて、Coreを更にいくつか分けてサーチの最適化をして欲しいところ。
ちなみにKtai Libraryでは、ライブラリ本体は独自の方式でスタティックで実体のインスタンスを管理し、コンポーネントなどではその参照を受け取るようにすることでムダを省いています(まあこれはこれで欠点もあるでしょうけど)。

あと、某関西自虐ネタな写真は最高でした!
あり得ないですw

~・~・~・~・~・~・~・~・~・~・~

いろいろ書いてしまいましたが、どれも大変に有用でためになるものばかりでした。
そして、懇親会も含め、大変に楽しいイベントだったと思います(まあ毎度ですが)。
今回も出て良かったです。
また是非参加したいと思います。

【追記】
スライドは別途公開予定です。
準備中なのでもうしばらくお待ちください

公開しました

【CakePHP/Tplcutter】LTで紹介できなかった実演などを紹介したスライドを公開します(cakecon)

「CakePHPカンファレンス東京」のライトニングトークで、実演できなかった部分について、加筆してスライド化したものが出来ましたので公開いたします。とりあえずのTplcutterの便利な点が一通り分かるかと思いますので、是非ご覧ください。

ちょっと画面が小さいため、拡大できるバージョンを見た方が良いかもしれません。ちなみに下記URLでご覧いただけます。
http://www.slideboom.com/presentations/24747/Tplcutter%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E8%B6%85%E9%AB%98%E9%80%9F%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E9%96%8B%E7%99%BA%28%E4%BD%BF%E3%81%84%E6%96%B9%E7%B7%A8%29

もしよろしければご感想などいただければ。
ツッコミどころ満載だと思いますので。
そもそもこのボリュームをやるつもりだったのか? とか(激汗)。

【CakePHP/Tplcutter】カンファレンス中のスライド公開します(cakecon)

お待たせしました。
LT中で使いましたスライドを公開します。

なんと、未公開映像付きです(笑)。
というか、後半を表示できなかったんですよね。
それでははじまりはじまり…

こちらで見ていただくと、フルスクリーンになったりします。
http://www.slideboom.com/presentations/24080/Tplcutter%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E8%B6%85%E9%AB%98%E9%80%9F%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E9%96%8B%E7%99%BA 

詳細版スライドは、ちょっと調整した後にアップしてみます。

※言いたいことにそれほど差がなかったので、今回はやめることにしました。
後日新規で作ってみたいと思います。

【余談】
最初、フォントが崩れてしまい「こりゃ公開無理だ…(;-;)」と思っていました。
「フォントを埋め込む」でppt作っていないといけなかったんですね。
こういったことも今回初めてだったので、今回はとても勉強になりました。
今後も発表はやっていきたいですね。

【関連サイト】
http://conference.cakephp.jp/
http://events.php.gr.jp/events/show/55

【Tplcutter】Tplcutterの今後とカンファレンス後での私の決意(cakecon)

昨日のカンファレンスであまりにも疲れてしまったため、カンファレンス関連のブログを物色しながらゆっくりしています。

昨晩ざっくりとカンファレンスの感想等を書いたのですが、肝心なことを書き忘れていたのでちょっと紹介したいと思います。

それは、Tplcutterの今後についてです。

現在バージョン0.2.0で、バージョンコードからも分かるように完成型の仕組みではありません。
自分自身、何処でバージョン1.0とするかはまだ決めかねているのですが、おそらく「全ての人がViewの高速実装に関して満足が得られるようになった」ときが1.0かな、と思っています。

前置きはこれくらいにして、とりあえず現在考えている「直近のバージョン」について、アイデアを書いてみたいと思います。

●(CakePHP)「プリフィックス」の対応
 CakePHPでは、以前に「webservice」という機能が搭載されていて、Tplcutterはこれに対応しているのですが、これが改新されて「プリフィックス」という機能に置き換わりました。プリフィックスに関するViewの実装はwebserviceと全く変わってしまったため、現在のTplcutterでは対応しておりません。
 とりあえずTplcutterは0.2.0で、「基本機能としてはまあおおむね使えるものになった」と思っているので、やっとプリフィックス対応に取りかかれるかな、という感じです。

●(CakePHP)img等のタグをhelperに置き換える?
現在のTplcutterでは、相対パスを絶対パスに置き換えることで、helperを用いないでビューが作れる、つまり可視性に優れている利点があります。ところが、この点が後に問題を引き起こす可能性があり、出来ることなら変換後はヘルパーに置き換わっていた方がよいのではないか、と考えています。それは「いずれ、Cakeの管理下にないパスが使えなくなってしまうのではないか」という点です。

実はあまりふれていないのですが、ベースパスが「/」である環境については全く問題なく動くのですが、たとえば「http://www.hoge.com/~user/cake/app/webroot/」なんかで運営されていて、ベースパスを「/cake/app/webroot/」なんかにしている場合、現在動かないのではないかと思います。何故なら、Tplcutterでこれを考慮していないからです。おそらくbasepathとかオプションを作って指定してやれば出来るようになるのではないかと思いますので次のバージョンではそうしようと思っていますが、これを超える考慮が必要になるときがいずれ来るのではないか、という予言めいた思いがあります。
Cakeに限らず、どのフレームワークにも言えることなんですが、この辺の制御を完璧にフレームワークに任せてしまった方が安心感があるんですね、当方としては(^^;;;。

 
ただ、これに関しては弊害もあって、結局パスをhelperにしても、helper内でまた同じURLに戻すわけで、オーバーヘッドを増やすだけのように思います。そんなわけで、現在心が揺れている状態です。

【追記】

一晩考えてみたのですが、やはりこれはそのままにしておいた方が良いと判断しました。
よくよく考えてみたら、全てのフレームワークについて考慮しなければならなくなりますし、それに「問題が起きたときにやればよい」わけで、先取りしすぎた機能かな、と。
オプションでそのようなものを作っても良いかもしれませんが、とりあえずやめておきます。

●layoutファイル生成の抑制と別名指定
現在の仕様では、layoutファイルは必ず作られ、またレイアウトファイル名はコントローラ名と同一で生成されます。この縛りをなくす仕組みを入れたいと考えています。

●定数の宣言と挿入
「ピース」機能で、指定ボックスを記憶して他のテンプレートに挿入できる機能を0.2.0で搭載したのですが、この技術を応用して、決められた値をあとでテンプレートに挿入できる機能を考えています。これはどう行った場所で使えるかというと、たとえばAmazonのアソシエーションIDを一カ所に指定しておくだけで全部を変換できるとか、URLがちょくちょく変わる状況で、一発変換させたいとか、そういった使い方が出来るような仕組みです。
こういったことはPHPのdefineで出来ますが、あくまでも設定するのは「デザイナー側」である点が考え方として異なります。また、defineすら呼び出さずにテキスト化されるため、オーバーヘッドになりません。

 
【追記】
 
●コマンドライン上の制御オプション(ある意味復活)
一時的に制御を変えたいようなオプションを、コマンドラインから与えられる仕組みはやはり必要とのことで、コマンドライン解析を復活させようと思っています。その理由は下記に。

●ファイルコピーの抑止オプション
●ファイルコピーの強制オプション
●テンプレート書き出しの抑止オプション
「画像だけ更新したい」「画像はそのままにしておきたい」「タイムスタンプが古くても上書きしたい」という場合の強制力オプションを付けようと思います。 

※上記の機能は「あくまでもアイデア」ですので、実際にこれらが次のバージョンがつくかどうかは分かりません。必要なものから順番にやっていくつもりではいます。

 

もし他に「こんなのが欲しい」というような要望がありましたら、是非お寄せください。
ちなみに次のバージョンがでるまでには時間が結構空くと思うので、ダウンロード控えはされない方が良いと思います(笑)。いまのTplcutterを是非ご活用いただければ!

 

それから、CakePHPプロジェクトマネージャーのGarrett氏と交流して、「やはり国際化は必要だ」と感じています。氏自身が最後に語ってくれたと思うのですが、「もっと英語で発信して欲しい。そうすればこのような素晴らしいアイデアが世界中の皆で活用できる」ということで、それについては私も実感しました。

ただ、私自身が英語が苦手であり、いつも翻訳ソフトに頼っているというのも事実でして…
Garrett氏にTplcutterのスライドの英訳を渡したのですが、中身は翻訳ソフトの成果みたいなものです。英語のテキストを打つ時間より、調べたり考えたりする時間の方が100倍は長かった気がします。この年になって恥ずかしいのですが、やはり英語をきちんと使えるようになりたい。そうすればもっといろんな人とディスカッションできるのに…と思います。

なので、今後の活動として「国際化」もテーマの一つに入れたいかなと思います。
ちなみに、カンファレンス後の帰路で本屋に立ち寄り、英語の本を物色していた恥ずかしい私です(^^;;;。

さいごに…
スライドの方はもう少しかかります。
提供方法をどうしようか悩んでいるからです。
pptを直接さらしても良いのですが、見ることが出来ない人もきっといるでしょうから。
全部の中身を分解するか、スライドを公開できる場所を借りるかのどちらかにしようとも考えています。
新原さんのサイトに、スライドが公開されているのを見たのですが、これにしてみようかな。

【CakePHP/Tplcutter】「CakePHPカンファレンス東京」が終わって(cakecon)

カンファレンスに参加された皆様、お疲れ様でした。
また、私のLTに耳を傾けていただきまして、ありがとうございました。

もう少しまともなスピーチがしたかったのですが、場慣れしていないというスキル不足と、あまりにもボリュームに対して時間がなさ過ぎた題材を選んだという点でとても反省しております。個人的に、出来は100点中10点です(大汗)。次回こういった機会がありましたら、100点を提供できるように頑張りたいと思います。

というわけで、私の発表しました「「Tplcutter」を用いた超高速ウェブサイト開発」について、補足事項というか、いいわけめいたものを書きつつ、他の方のスピーチに対して私の思いをつらつらと書いていきたいと思います。

まず、補足事項というか言い訳なのですが、実際に発表できた内容は用意していた20%ほどで、すべてを5分で語るのはとてもとても無理でした(大汗)。とりあえず、Tplcutterの優れている点を絞り込み、今回は一撃で空のサイトにビューを生成して放り込む部分をかろうじて実演をしたのですが、本当に実演したかったところは別のところにもありました。

カンファレンス終了後や、懇親会中で、予想以上に多くの方から「これはおもしろい・興味あるツールだ」とおっしゃっていただけました。皆さんに話を聞くと、おおむね同じような悩みを抱えていらっしゃっていて、つまるところ「デザイナーとのやりとりでアップデートが大変に楽になる(可能性を秘めている)」とのことでした。私の一番主張したかったところはここであり、実装よりはむしろ更新の部分でしたので、このような感想をいただけたということは、このツールの方向性は正しかったと胸をなで下ろしています。

特にびっくりしたのはCakePHPプロジェクトマネージャーのGarrett氏で、懇親会中、英訳した資料を渡すついでに少しだけお話しできたのですが、開口一番「Oh, Tplcutter! It is VERY COOL!!」とお言葉をいただけました。まさかこのような評価をしてくれるとは思っていませんでしたので、とてもとても光栄です。

実はGarrett氏と話す前に、今回は通訳を担当されていた、堂園さんにご挨拶させていただいたのですが、そのときも「いや、Garrettはかなりクールだといっていた」といわれてまして、何かの間違いだと思っていました。もともとTplcutterは、ホビーユース・大規模開発の方をターゲットとしていなくて、「実務でフレームワークを使って制作している中小向けのツール」のつもりだった…つまりメジャー路線ではないと思っていたのです。LTも「東大に記念受験する出来の悪い学生」のような気持ちで臨んでいたので、自分的にはウケが悪い筈だったのです。Garrett氏も、現在のフレームワーク、とりわけCakePHPの「高速開発」のコンセプト内で、ビューの実装に関する、何か「もや」のようなものを感じていたんでしょうかねぇ。

繰り返しになりますが、デモンストレーションがあまりにも未完成のため、100%の利点を伝えることが出来なかったのですが、機会ありましたら別の形で紹介できればと思っています。もしお望みでしたら、出張講演(???)等も全然OKですので(笑。

発表に使ったスライドは、後日アップさせていただきます。
また、更に詳細に書いたスライドもありますので、そちらもチェックの後にアップさせていただきます。

個人的には、全く笑いの取れなかった点も残念に思っています。
他の方は皆さん面白い話を織り交ぜられていましたが、私の方はもうそれどころではなく、時間内にデモまでいくのに精一杯で、終わってみたら超つまらない内容でした(大汗)。デモの中に笑いを用意していたのですが、完全に予定外でしたね(;^;)。

まあ、とりあえず一部の方ではありますがそれなりの評価をいただいて手応えもありましたので、今回に関してはこれで良しとしたいと思います。

さて、他の方のスピーチに私なりの思いを語ってみたいと思います。

【安藤さん;国内でのCakePHPの利用状況について】

スピーチ内で「高速開発フレームワーク」という、CakePHPのコンセプトを強調されていましたが、私もその考え方に乗っているクチでして実際その通りだと思っています。
また、「フレームワークは生産性と保守性の向上である」というのもその通りで、私もそれを切実に感じてフレームワークを検討し、現在に至ります。丁度1年前の話になります。

【岸田さん:Agileな開発現場での実践例】

「テストケース」の使い方についてご説明いただき「あとあと役立つ」的な説明をされていました。この「あとあと」の重要性というのは、開発内容でとても左右されるのではないかと思います。パッケージソフトや、業務ソフトなどについてはかなり重要だと思います。

ちなみに私はwebプログラミングを本職としたのは比較的に新しく、以前はゲームの開発をやっておりました(最初はプログラマーとしてでしたが、プランナーが本職でした)。当時はテストケースという考え方はなく、ひたすら「人の手によって発生した不具合」を集計し、反映させる作業を繰り返していました。ただ現在考えてみると、ゲームのようなコンテンツアプリは、かなりイレギュラーな場合の不具合が圧倒的に多く、今回のようなテストケースが仮に組み込めるにしても、本当に価値のあるデバッグは人の手によるものでしか分からない点があったりします。ゲームの話は結構極端かもしれませんが、インターフェース部分、とりわけフロントエンド開発では、ページ遷移などの影響でテストケースに支障が出る可能性が多分にあるのではないかと考えます。

極端な話、私は「いくらテストケースをしようが、人の手によるエラーのチェックは省くことが出来ない」と考えていて、このことはテストケースを含むデバッグプロセスを想定する上で念頭に置いた方がよいのではないかなと思います。

【Garrett氏招待講演】

CakePHP開発のテーマはとして「State of Nature(ありのままに出来る自由)」と「Social Contract(ルール作り)」他があるそうで、特に「ルール作りをすることで、(皆が)より自由な発想が出来る」という思想のようです。
つまり「面倒なところはプログラム任せ。自分はよりやらなければならないところに特化する」という私のテーマと合致しているところがあり、とても嬉しく思っています(そういえば岸田さんも同じようなことをスピーチ内でおっしゃっていましたね)。
Garrett氏の説明を受け、やっぱりCakeは全体のシステム(プログラム、というわけではなくて、プロジェクト全体の意味)が良くできているなと改めて思いました。

ちなみに、Cakeの未来としては、とりあえずRC4が出るそうです。また、近いうちに1.3が始まり、2.0でPHP5オンリー化を目指すそうです。
そして、チケットを出す際には「テストケースとパッチを一緒に上げる」を是非しましょう、とのことです(笑)。

【鶴岡さん:XoopsCubeなのにCakePHPを使う】

XoopsCubeは実は使ったことがなかったのですが、私も実は同じようなコンセプトのCMSを作り、それを現在も商売として運営していますので、「中小向けのCMS市場」というのは需要があることはよく分かります。ただ、実際に運営してみて思ったことは「HP作りたいけどやり方が分からない」という方の多くは「PCも分からない」というくらいのスキルギャップがあり、いくら便利なCMSを作っても使ってくれないという事を身にしみていたりします。つまり、サービス運営側がCMSを使うことは何ら問題がないのですが、エンドユーザに提供するまでをやってしまうとカオス入りしかねないと思っています。そういった意味で「中小の市場は、想像よりは意外に狭い、でもやり方次第で顧客を獲得できる可能性は高い」という感じですかね。

【青木さん:旅行代理店様向けチケット予約をCake+Ajaxで】

Ajaxは私も結構注目している技術で、それでいてなかなか難しい技術だったりすると思っています。あおきさんの目指した「ユーザインタフェースの向上」は代表的なAjaxの使用例なのですが、私はもう一つのテーマを最近追求していたりします。
じつは、最近「連想くん」を紹介させていただいているのですが、こちらもAjaxは当たり前のように使っているのですが、実はAjax化は苦肉の策だったんです。「連想くん」での採用理由は、なんと「不可分散(というか時間短縮)」で、クライアント側に処理を肩代わりしてもらうことで、サーバ側の硬直時間を作らない仕組みになっています。
少し奇妙に思われるかもしれないのですが、これはPHPがシングルタスクである点から由来しています。例えばGoogleやアマゾンへいくつかのリクエストを送るのですが、個数が増えると順番に実行していかなければなりませんので、終了するのに時間がかかってしまうのです。そこで、Ajaxで複数のリクエストを同時に発行し、効率よく結果が得られるようになっています。
連想くんの例はあくまでも一例なのですが、UIとしてのAjaxはもう過渡期かなと思いますが、そのほかの使い方も出来るのではないか、という可能性みたいなものを感じています。

【青木さん:連想検索】

実は、全く同じコンセプトが当方の「連想くん」だったりするのです。
ただし、連想くんの連想エンジンは、全く違うもので、青木さんのところはかなり本格的なアルゴリズムのもとで行っているようですが、当方のものはかなり「エセ」だったりします(^^;
これからは連想検索の時代だと思います。
「検索のコンシェルジュ」的な存在だと思います。
間違いなく、今後の主流になるのではないかと予感があります。
本当はちゃんとご挨拶して連想検索について熱く語りたかったのですが、タイムアウトでその夢は叶いませんでした(涙。

【梶原さん:CakePHPerのためのBDDのすすめ】

SpecというツールやBDDという技術は実はよく知らないのですが、こういった考え方は必要かなと思います。考え方のフレームワークを実現するツール、という印象を受けました。あまりにも知識がなさ過ぎてコメントが難しいのですが、今後勉強が必要と感じました。

以上、ざっと書かせていただきましたが、私はまだ小さなところでやっているなぁと感じました。
また機会がありましたら発言させていただきますが、この次はもっとホット&クールなネタを用意しないとですね。

長文失礼いたしました。
ごめんなさい、昨日今日ほとんど寝ていないので超眠いです。
今日のところはもう寝ます。

【追記】
ねねとまつさん(赤がすきさん)、捕捉ありがとうございます。
トラバ張っていただけているみたいなのですが、何故か管理画面上では出ているのに、公開画面に出てきてないのです(涙)すみません…出てきましたー
Tplcutter期待されていたそうで、大変に嬉しく思います。資料をなる早で公開させていただきます。

【追記2】
ご紹介いただいてありがとうございます。
以下Tplcutter関連のコメントを捕捉です。

creazy photograph :  CakePHPカンファレンス東京:参加レポート
ラボブログ : CakePHP カンファレンス東京で「フェイス女学園」が紹介されました!
看招 血染東方一片紅 : CakePHPカンファレンス東京に行ってきた
本を読む : CakePHPカンファレンス東京」にオンライン参加
WEBで地域活性化~岐阜県中津川市加子母から発信☆WEBシステム屋の日記~ : CakePHPカンファレンス東京に行ってきましたよー
d.tosh10の日記 : 10/25 CakePHPカンファレンスに行って
パンプキンスパイスラテ : CakePHPカンファレンス東京にいってきた!
/halt/Snapshot : CakePHPカンファレンス 東京は最高のイベントでした
tdoiの日記 : CakePHP カンファレンス Tokyo
Think Twice : カンファレンス振り返り
わすれないように. : cakePHPカンファレンス@tokyo に参加してきた