2008年12月15日(Mon)
■[php]LOCAL PHP部 札幌勉強会02

で喋ってきました。
今回はフレームワーク特集ということだったので、いろいろフレームワークを並べてどうこうと話したかったのですが、ちゃんとつっこんだ話をしようとするとどれか1項目でも結構な長さになってしまうので、とりあえず単語だけ並べて後は調べてね☆ミみたいな方法にしました。
内容は薄くなってしまいましたが、きっかけになってくれれば成功だと思います。
LOCAL PHP部は、北海道でPHPに関する活動を積極的に行っているようです。北海道在住の方はもちろん、東京集中が気にくわない人、地方ITを盛り上げたい人は是非参加してみてください。
ちなみに他の方の発表はメモしてないです。ごめんなさい。面白かったのですが自分がてんぱってたので…
2008年12月05日(Fri)
■[php][yii]Yiiを使う

なにそれ
Yii Framework(イーと読むらしい)
なんかPRADOの人あたりが作ってるsymfonyをインスパイアしたPHPフレームワーク
12/3に1.0がリリースされた
ダウンロード
http://www.yiiframework.com/download/
インストール
どっかに置く。
誰かPEAR Channel作って!openpearに勝手に入れちゃう?それライセンス的にいいの?
プロジェクト作成
/path/to/yii/framework/yiic webapp [アプリケーション名]
アプリケーション名のフォルダが作られ、その下に各ファイルが展開される。
設定
基本的にprotected以下のファイルを編集する。以降特に注意書きがなければprotected以下のファイルである。
<?php ... return array( 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', 'name'=>'アプリケーション名', // autoloading model and component classes 'import'=>array( 'application.models.*', 'application.components.*', ), // application components 'components'=>array( 'user'=>array( // enable cookie-based authentication 'allowAutoLogin'=>true, ), // uncomment the following to set up database 'db'=>array( 'connectionString'=>'mysql:dbname=testapp;hostname=localhost;', 'username'=>'testuser', 'password'=>'testpass', ), ), );
Modelを書く
create table Post ( id integer not null auto_increment, title varchar(128) not null, content text not null, create_time datetime not null, primary key(id) );
というテーブルを作る。
アプリケーション直下(protectedの上)で、
$ protected/yiic shell
Yii Interactive Tool v1.0
Please type 'help' for help. Type 'exit' to quit.
>>model Post
generate Post.php
The 'Post' class has been successfully created in the following file:
/path/to/app/protected/models/Post.php
If you have a 'db' database connection, you can test it now with:
$model=Post::model()->find();
print_r($model);
これで雛形が作成される。
ちなみにテーブル名に無いmodelを作ろうとすると警告が出るがそのまま作ることはできる。テーブル名とクラス名の対応を変えたい場合は、先に生成してから、生成されたファイルのtableNameが返す値を変えればいい。
とりあえずScaffold
Yii Interactive Tool v1.0
Please type 'help' for help. Type 'exit' to quit.
>> crud Post
generate PostController.php
generate create.php
mkdir /path/to/app/protected/views/post
generate update.php
generate list.php
generate show.php
generate admin.php
Crud 'post' has been successfully created. You may access it via:
http://hostname/path/to/index.php?r=post
デフォルトだとユーザ認証が有効になるので、controllers/PostController.phpのfiltersからaccessControlを外すなりaccessRulesを変えるなりするといいかもしれない。
create_timeを入れないとエラーなんだけど何なの?死ぬの?
テーブル定義側でやれよ
beforeSave()で入れればいいんじゃね?
<?php ... public function beforeSave() { if ($this->isNewRecord) { if (empty($this->create_time)) { $this->create_time = date('Y-m-d H:i:s', YII_BEGIN_TIME); } } return true; }
titleとかcontentとかNOT NULLのはずなのに空欄でも入るんだけど馬鹿なの?死ぬの?
空欄って普通''の扱いだから正しくね?
validation書くといいよ
<?php ... public function rules() { return array( array('title', 'length', 'max'=>128), array('title', 'required'), array('content', 'required'), ); }
てかもうcreate_timeとか表示されてる意味なくない?入力欄消したいんだけど
views/post/のcreate.phpとupdate.phpからフォーム消せ
scaffoldそろそろ飽きたんだけど実際の画面はどうやって組むの
なぜか途中で口調が悪くなってるけど気にしない
controllerを生成する。
>> controller blog
generate BlogController.php
generate index.php
mkdir /path/to/app/protected/views/blog
Controller 'blog' has been created in the following file:
/path/to/app/protected/controllers/BlogController.php
You may access it in the browser using the following URL:
http://hostname/path/to/index.php?r=blog
このへんっていちいちshellに入らないといけないのかな…
ところでURLださいんだけど2008年のフレームワークとしてこれは(略
config/main.phpを書き足す
<?php ... 'components'=>array( 'urlManager'=>array( 'urlFormat'=>'path', ), ...
これでhttp://.../index.php/controller/actionみたいなのでアクセスできる
実装
controllers/BlogController.php
<?php ... public function actionIndex() { $posts = Post::model()->findAll(); $this->render('index', array('posts'=>$posts)); }
<?php foreach($posts as $post): ?> <div> <h1><?php echo $post->title ?></h1> <div><?php echo nl2br($post->content) ?></div> </div> <?php endforeach ?>
おいこれXSSし放題だぞ!まさかhtmlspecialcharsとかめんどくさくて書いてられねー
CHtml::encodeってものがあるよ!
<?php foreach($posts as $post): ?> <div> <h1><?php echo CHtml::encode($post->title) ?></h1> <div><?php echo nl2br(CHtml::encode($post->content)) ?></div> </div> <?php endforeach ?>
なんか余計面倒な気が…
ってかもう<?php echoとか長くてだるいんだけど
CPradoViewRendererとかあるよ!
config/main.phpを書き足す
<?php ... 'components'=>array( 'viewRenderer'=>array( 'class'=>'CPradoViewRenderer', ), ...
テンプレートを書き換える
<?php foreach($posts as $post): ?> <div> <h1><?= CHtml::encode($post->title) ?></h1> <div><?= nl2br(CHtml::encode($post->content)) ?></div> </div> <?php endforeach ?>
short_open_tag=Offでもテンプレートだけshort_open_tagが使えるようになるよ!
ついでに自動エスケープもしてくれないのかなぁ
ところでこのままだとレコードが100件とかになったらやばくね?
findAllでlimit指定すればいいんじゃね?
<?php ... public function actionIndex() { $posts = Post::model()->findAll(array('limit'=>10)); $this->render('index', array('posts'=>$posts)); }
おいそれだと過去のデータ見れないだろ!paginationとかないの!
ちゃんとあるから落ち着け
<?php ... public function actionIndex() { $pages = $this->paginate(Post::model()->count(), 2); $conditions = array( 'limit'=>$pages->pageSize, 'offset'=>$pages->currentPage*$pages->pageSize, ); $posts = Post::model()->findAll($conditions); $this->render('index', array('posts'=>$posts, 'pages'=>$pages)); }
<?php $this->widget('CLinkPager',array('pages'=>$pages)); ?> <?php foreach($posts as $post): ?> <div> <h1><?= CHtml::encode($post->title) ?></h1> <div><?= CHtml::encode($post->content) ?></div> </div> <?php endforeach ?> <?php $this->widget('CLinkPager',array('pages'=>$pages)); ?>
とりあえずここまで
詳しくは公式のドキュメントを見てね!
若干怪しい部分があるけど、使いやすそうなので期待
2008年06月30日(Mon)
■CakePHP勉強会に行ってきたよ

第3回CakePHP勉強会に行ってきました。最近あまりレポート書いてないけど真面目に書きます。
haltさんがすごく的確な意見を書いているので、これ以上言うことはないんじゃないかとか思ってしまうけど、ちょっと違う視点で書くと、フレームワーク的に無茶をしてる人が少ない気がした。
これがRails界隈だと多分変態的なプラグインを作ったので公開したみたいな発表とか、内部実装について調べるような発表が多くなる(偏見多め)んだろうけど、Cakeはそんなことはなくて、多分CakePHP勉強会でそれをやってもあまり興味のある人はいなくて、むしろ実用的な使い方のほうが面白いというか、そんな難しいことを考えなくても使えるっていう感じがした。
勉強会自体で少し気になったのが、アンケート書く時間ないよ!いつ書けばいいんだよ!みたいな。ちょっと詰め込みすぎた感。
懇親会はずっとrhaco=変態って言ってた気がする。
以下落書き(発表内容丸写しではないので注意)
フェイス女学園
- スパイスボックス
- 最初デザイン地味→派手→女性向け雑誌に載った
- →王様のブランチ(300万PV)
- CakePHP
- システム
- LAMP
- 顔判定はOpenCV
- 敢えて「診断中」というメッセージを出している
- モバイル
- /etc/aliasesからcakeconsoleを叩いている
- テンプレートだけキャリア別に分割
- CakePHPでよかった点
- 反省点
- 他の人がわからない
- Dreamweaverでのctpの設定が面倒
- メール詰まり
- Modelを有効利用できなかった
- デバッグモードの切り替えがしにくい
- (テスト環境の問題じゃね?)
- その他
- OpenCVはコンソールを直接叩いてる(?)
CakePHPの失敗談
- AppController#beforeFilterにログインチェックを書く
- ログイン不要ページを別に除外する必要ある
- 派生クラスでbeforFilter()を実装する場合にparent::beforeFilter()を呼ぶ必要がある
- Authコンポーネントで解決
- 関連するモデルにアソシエーションを動的設定する
- 多すぎるアソシエーションは重い?
- bindModel()を実行してもアソシエーションが変更されない不具合
- hasManyしてる場合 ×$this->Review->bindModel() ○$this->User->Review->bindModel()
- 関連するモデルの取得順を動的に設定する
- データの表示で取得順とかを変更したい
- bindModel()でアソシエーションを上書きできる(一度find系を呼ぶと戻る)
- 自作ビヘイビアの設定値をインスタンスへ保存する
- ビヘイビアのインスタンスはアプリケーションで1つのみ
- $this->__settings[$model->alias][〜]で解決
- コンポーネントのメンバ変数をstartup()で初期化する
- startup()で初期化したら未定義値になってしまった
- クローンが実行するために消えてしまう
- コンポーネント側にメンバ変数を持たない
- 契約プログラミングを導入
- assertだらけになってしまった
- テストを使おう
- Setクラスを使おう(配列操作)
- 車輪の再発明
ホッテントリメーカー
- まわりがCakePHP使っていた
- CakePHP勉強会に出てみた→わからん
- チュートリアルやってみたらできた
- ホッテントリメーカーを作ってみた
- 実際にタイトルに悩んだ経験から
- 30万PV
- 実際に書かれたエントリはトラックバック
- はてなしりとり2
- はてなダイアリーキーワードでふりがなを取得
- 3万PV
- よかったこと→楽
- 参考にしたもの
- あきやんさんの連載
- IDEA*IDEAの連載
- 「どうにかなるBLOG」のfindAllの記事
- 英語資料はあまり見てない
CakePHPゆとり開発環境
- CakePHPの不満
- stableがstableじゃない
- cake自体を社内で共有
- betaを使える
- 開発用プラグイン
- MVCの各ファイルを簡単に移動
- cake.el
- cakephp.vim
- CakePHPに特化した環境作ろう
AuthComponentをOpenID対応
CakeでTest
- 1.1は書き方がわからない
- 1.2でcake本体のテスト同梱
- SimpleTest
- 1.2でfixture実装
- テストしやすいところ
- modelのvalidation
- オーバーライドの挙動
- ビジネスロジック
- 出力タグ
- テストしにくいところ
- controller
- actionにはロジックは書かない
- controllerへの依存関係は極力書かない
- MockObject
- 失敗するテストを添付してticketを投げる
CakePHPとsymfony
2008年06月17日(Tue)
■[flex]flex2のドキュメントがリンク切れ

http://www.adobe.com/support/documentation/jp/flex/documentation.html
の一番下のリンクをクリックしてもNOT FOUNDな上にURLをよく見ると3.0っぽい感じになってるしどういうことだ!
というわけで
http://download.macromedia.com/pub/documentation/jp/flex/2/flex2_documentation.zip
ここにあるよ!
paginationまで含めた良く使う部分の一連の流れが分かりやすくて凄く感謝です。
バージョン1.0.0r322で試したらyiicがvalidationも自動でVARCHAR(128)なんかもmax=>128付きでやってくれました。
Yiiはイイですね〜
随時修正されてるっぽいので次のリリースに期待ですね