ふわふわな毎日 RSSフィード

2008年12月15日(Mon)

[]LOCAL PHP部 札幌勉強会02 LOCAL PHP部 札幌勉強会02 - ふわふわな毎日 を含むブックマーク はてなブックマーク - LOCAL PHP部 札幌勉強会02 - ふわふわな毎日

喋ってきました

今回はフレームワーク特集ということだったので、いろいろフレームワークを並べてどうこうと話したかったのですが、ちゃんとつっこんだ話をしようとするとどれか1項目でも結構な長さになってしまうので、とりあえず単語だけ並べて後は調べてね☆ミみたいな方法にしました。

内容は薄くなってしまいましたが、きっかけになってくれれば成功だと思います。

LOCAL PHP部は、北海道でPHPに関する活動を積極的に行っているようです。北海道在住の方はもちろん、東京集中が気にくわない人、地方ITを盛り上げたい人は是非参加してみてください。

ちなみに他の方の発表はメモしてないです。ごめんなさい。面白かったのですが自分がてんぱってたので…

2008年12月05日(Fri)

[][]Yiiを使う 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を書く

ActiveRecordパターンで書ける。

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を変えるなりするといいかもしれない。

↑に書いてあるURLを参考にしてアクセスする

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));
	}

views/blog/index.php

<?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)); ?>

とりあえずここまで

詳しくは公式のドキュメントを見てね!

若干怪しい部分があるけど、使いやすそうなので期待

arrayarray 2008/12/28 02:38 はじめまして。
paginationまで含めた良く使う部分の一連の流れが分かりやすくて凄く感謝です。
バージョン1.0.0r322で試したらyiicがvalidationも自動でVARCHAR(128)なんかもmax=>128付きでやってくれました。
Yiiはイイですね〜

nazonenazone 2008/12/30 18:55 バグっぽい部分がもう少し減ればいいんですけどねー
随時修正されてるっぽいので次のリリースに期待ですね

2008年11月20日(Thu)

highfreq.net移転しました highfreq.net移転しました - ふわふわな毎日 を含むブックマーク はてなブックマーク - highfreq.net移転しました - ふわふわな毎日

ここ数日サーバが止められてアクセスできないようになっていたので、coreserverのほうに全部移しました。URLそのままで大体アクセスできます。(一部消えてるのもあるけど)

どうせ誰も見てないだろって思ってたけど意外と需要があるものがあるらしいですね。

相変わらず会社のブログがメインでこっちに書く暇がないです。ごめんなさい。

2008年06月30日(Mon)

CakePHP勉強会に行ってきたよ CakePHP勉強会に行ってきたよ - ふわふわな毎日 を含むブックマーク はてなブックマーク - CakePHP勉強会に行ってきたよ - ふわふわな毎日

第3回CakePHP勉強会に行ってきました。最近あまりレポート書いてないけど真面目に書きます。

haltさんがすごく的確な意見を書いているので、これ以上言うことはないんじゃないかとか思ってしまうけど、ちょっと違う視点で書くと、フレームワーク的に無茶をしてる人が少ない気がした。

これがRails界隈だと多分変態的なプラグインを作ったので公開したみたいな発表とか、内部実装について調べるような発表が多くなる(偏見多め)んだろうけど、Cakeはそんなことはなくて、多分CakePHP勉強会でそれをやってもあまり興味のある人はいなくて、むしろ実用的な使い方のほうが面白いというか、そんな難しいことを考えなくても使えるっていう感じがした。

勉強会自体で少し気になったのが、アンケート書く時間ないよ!いつ書けばいいんだよ!みたいな。ちょっと詰め込みすぎた感。

懇親会はずっとrhaco=変態って言ってた気がする。

以下落書き(発表内容丸写しではないので注意)

フェイス女学園

  • スパイスボックス
  • 最初デザイン地味→派手→女性向け雑誌に載った
    • →王様のブランチ(300万PV)
  • CakePHP
    • フレームワーク初めて
    • サンプリングしたデータに手で入力して近似判定
    • CakePHPはRailsっぽいけどPHPの良さが残っている
    • PHP4と5どっちでもOKだったのが決め手
    • 実戦投入する気は最初はなかった
  • システム
    • LAMP
    • 顔判定はOpenCV
    • 敢えて「診断中」というメッセージを出している
  • モバイル
    • /etc/aliasesからcakeconsoleを叩いている
    • テンプレートだけキャリア別に分割
  • CakePHPでよかった点
    • モデル操作が楽(FindAll、FindBy)
    • レイアウトテンプレート便利
    • PHPなので修正が楽
  • 反省点
    • 他の人がわからない
    • 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対応

  • 認証後はAuthComponentで
  • php-openid
  • ソース公開中

CakeでTest

  • 1.1は書き方がわからない
  • 1.2でcake本体のテスト同梱
  • SimpleTest
  • 1.2でfixture実装
  • テストしやすいところ
    • modelのvalidation
    • オーバーライドの挙動
    • ビジネスロジック
    • 出力タグ
  • テストしにくいところ
    • controller
  • actionにはロジックは書かない
  • controllerへの依存関係は極力書かない
  • MockObject
  • 失敗するテストを添付してticketを投げる

CakePHPとsymfony

  • askeetをCakePHPに移植してみた
    • Cakeで複合PKは扱えない
    • Cakeはフラットなフォルダ構成、symfonyは階層構造
    • resultsetが配列なCake、オブジェクトなsymfony
    • helperはクラスメソッドなCake、グローバル関数なsymfony
    • 細かいクエリを投げるCake、JOINするPropel

2008年06月17日(Tue)

[]flex2のドキュメントがリンク切れ flex2のドキュメントがリンク切れ - ふわふわな毎日 を含むブックマーク はてなブックマーク - 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

ここにあるよ!

何に使うの?

http://d.hatena.ne.jp/gan2/20071210/1197279022