【CakePHP】「CakePHP新春勉強会」に行ってきました

CakePHPの勉強会が久々にありましたので参加しました。
大規模なイベントは昨年10月のPHP Matsuri以来となりますが、当方は顔を出したものの完全参加はできなかったので、実質昨年5月以来です。

さて、今回はいつもの「Ktai Library」ではなく、CakePHPで製作されたCMSアプリケーション「BaserCMS」をLTでご紹介させていただきました。スライド(をPDF化したもの)を公開いたします。


クリックするとpdfを参照できます

Cake界隈では「Croogo」あるいはかなり前から存在している「Wildflower」などがありますが、これらは日本向けのCMSではないため、かなりカスタマイズをしないと難しい点がありました。しかしBaserCMSは日本で開発されているため作りも日本向けであり、サポートもされやすいてんがメリットです。また「コーポレートサイト」が簡単に作れるよう機能的にも的を絞っており、他の(Cake以外の)CMSと比べてもコーポレートサイト向けなら導入する価値が大変にあると思います。

当方も開発メンバーでありますが、本業が忙しくてなかなか出来ないところがあります。しかし今年はちょっとてこ入れをしていくつかプラグイン等を作っていきたいと思っています。何故なら本業でも売っていきたいので(笑)。ネタはいくつか考えていますが、一般向けのものについては是非公開していきたいと思います。

で、BaserCMSは福岡では勉強会も回数をこなしており、普及を促している方もたくさんいらっしゃるため盛り上がっているのですが、残念なことに関東では情報がやってこないためなかなか認知度がありません。なのでまずはこの便利なCMSを知っていただきたいと思い、今回勉強会を開催してみようと思っています。Cakeを日頃お使いの方はもちろんですが、特にデザイナーの方にも知っていただきたいと思っております。是非デザイナーさんをお誘いのうえ参加していただけますと大変に嬉しいです。
現時点ではとりあえず「やる」と表明しただけで、何も決まっていない状態です。現実的になってきましたら改めて告知させていただきます。また手伝っていただける方、会場をお貸しいただける方(企業)も絶賛大募集です。まずは小さくと思っておりますが、関東でも是非盛り上げていきたいと思いますのでよろしくお願いします。

…と告知が長くなってしまいましたが(汗)、勉強会そのものも大変に楽しかったです。
内容については他の方がレポートされていますし、ちょっとまとめる時間もなさそうなので今回は割愛させていただきますが、CakePHP2.0は今年の大注目になりそうですね。

2次会はカラオケボックス内でLT大会になりました(笑)。しかもそれがUstされたり!
こんな事をするのはCakeメンバーくらいかもしれません。
第2回CakePHP温泉部」をはじめ、私もいろいろと企画したいと思います。

【Ustreamによる発表録画はこちら】

http://www.ustream.tv/channel/cakephpstudy#utm_campaign=unknown&utm_source=712880&utm_medium=social

【参加された方のブログなど】

http://techlog.knocking.co.jp/archives/190
http://d.hatena.ne.jp/deeeki/20110118/cakephp_newyear_study
http://blog.livedoor.jp/hamichamp/archives/51564338.html

【CakePHP温泉部】第2回開催のご案内と受付開始!

cakephp_spaお待たせいたしました。第2回のCakePHP温泉部の開催について、ようやくご案内できる運びとなりましたのでお知らせいたします。
基本的に、おいしいものを食べつつ温泉にゆったりとつかり、Cake話で盛り上がるといったかなりゆるい内容です(笑)。気軽に参加が可能なイベントですので、是非ご検討の上お申し込みいただけますと幸いです。皆さん日頃激務かと思いますので、のんびりと時間を過ごしましょう!

場所についてはいろいろ検討していたのですが、今回も箱根にするとずっと箱根になってしまいそうでしたので、都度温泉地を変えるという趣旨で今後場所選定する事にしました。今回は箱根のお隣になる熱海にしました。

【日時】 2011年2月26日~27日(土日・1泊2日)
【場所】 静岡県熱海市中央町14番9号
山木旅館
http://www.yamakiryokan.co.jp/

(アクセス)
・電車&バスの場合
新幹線東京-熱海間 50分
JR東海道線[熱海駅]下車
バス(バスターミナル2番のりば) 10分 or タクシー 5分

・車の場合
東名高速~厚木IC~東名厚木ICから小田原厚木道路~真鶴道路~国道135号線経由60分

※電車の場合の集合場所、もしくは車での参加は後日希望を伺います。

【日程】 1日目:
12:50 集合
13:00 チェックイン
13:30~ 温泉部オリエンテーション(自己紹介など)
~16:30 活動1
17:00~18:00 温泉Time(は~と)
18:00~20:00 食事・休憩
20:00~23:00 活動2
23:00~ 自主活動(ほどほどに)・就寝

2日目:
~ 9:00 起床・食事・片付け
9:30~ 活動3
~11:30 クロージング
12:00 チェックアウト
12:20 解散

※日程は状況に応じて適宜変更になる場合があります

【活動内容】 今回も基本的に、CakePHPについての自分の考えや、日頃の業務での出来事などをざっくばらんに話しつつ、「温泉に入って日頃の疲れを癒す(ここが重要!!)」ことが主な活動になります。
また当日は「CakePHP温泉部的ベストプラクティス(仮)」と称して、日頃疑問に思っているCakePHPにまつわるコーディングテクニック・サイト構築・運営などを1人1つだけ持ち寄っていただいて、それについて話し合っていきたいと思います。
何か発表したい人も大歓迎です。

具体的な活動内容については、後日追記させていただきます。

【参加資格】 CakePHPを好きな方ならどなたでも参加できます。
(Welcome all of people LOVING CakePHP!)
女性の参加もOKです。今回は大部屋に宿泊する予定ですが、個室等出来る限り配慮いたします。
【費用】 およそ20,000円程度(当日現金にて徴収します)。
別途、交通費がかかります。
【定員】 10名(先着順)。
定員になり次第受付を終了させていただきます。
キャンセル待ちは可能ですが、あまり期待はしないでください。
【申し込み方法】 上記「お問い合わせ」より、題名を「温泉部参加希望」と明記の上、ご連絡ください。
お問い合わせ時のメールアドレスに「google groups」の招待メールを送信します。受信しましたら一度アクセスいただき、自己紹介欄に参加表明をお願いします。なお詳細情報やご連絡についてもこちらで全て行います。
また、運営者より直接ご連絡させていただく場合もありますのでご了承ください。

申し込み締め切りは「2011年1月10日」までです。 締め切りました!

【注意事項】 ・キャンセルは1週前までにお願いいたします。過ぎますとキャンセル料がかかってしまいますのでご注意ください(10日前に最終確認のメールをさせていただきます。1週前までに返事がない場合はキャンセル扱いになります)。
・お部屋は大部屋になります。
・部屋には有線のLAN回線あります。ハブ等はこちらで用意いたします。
お車の方は、あまりお酒を飲み過ぎないように!(笑)
【twitter】 @cakespa
こちらでも随時情報をつぶやきます

会場となる室内。かなり広い!
温泉その1。大浴場。気持ちよさそう!
温泉その2。檜のお風呂。趣あってイイ!
温泉その3。露天風呂。なおこれら温泉は時間によって入れるところが違うので注意!
お打ち合わせの際に、温泉まんじゅうをいただきました!うまい!

【前回の様子はこちら】
【CakePHP温泉部】第一回活動報告デス!
第1回cakePHP温泉部に参加した

【現在の参加表明】
MASA-P(@ecworks_masap)[言い出しっぺ:スタッフ]
T.FUJIWARA(@tfmagician)[スタッフ]
konsan(@konsan)
kara_d(@kara_d)
hiromi(@hiromi2424)
hidetoshing(@hidetoshing)
bin(@binbin4649)
871_(@871_)
8nohe(@8nohe)

_

【PHP/CakePHP】phpadvent2010 Day21「ピュアPHPでも便利なCakePHPを使おう」

PHP Advent Calendar jp 2010 21日目担当のMASA-Pです。
CakePHP界隈ではいろいろとやらせていただいていますが、PHPコミュニティの方はなかなか日程等があわない関係もあって不参加状態ですので、もしかしたら初めましての方もいらっしゃるかもしれません。一応こんなものなんかを公開させていただいております。またこんな本とかこんな本なんかを執筆させていただだいておりますので、もし興味がありましたら是非よろしくお願いします。できれば買って!(笑)

さて、今回はPHP Tipsという事なのですが、非常にお恥ずかしい話ですが当方は既にCakePHPがないと生きていけない体になっております(笑)。当方としましてもそういう道連れ的な方を一人でも多く製造したい次第ですので(笑)、布教活動がてら「CakePHPに存在している超便利な機能をライブラリとして使ってしまおう!」ということで記事を書いてみたいと思います。実例としては前日のomoonさんの記事とネタが被っているかもしれませんが、まあ続編と思ってもらっても全然構いませんです(^^;。

さて、CakePHPのフレームワークの機能についてここで多くを語るのはやめるとして、CakePHP内には「便利クラス」なるものがいくつか存在します。
特に一押しなのが、今回取り上げさせていただく「Setクラス」です。このクラスは、配列の操作をより便利にする機能を持っています。PHPは標準でも他の言語と比べて配列を自在に操れる方だとは思いますが、かゆいところに手が届かないものもいくつかあります。しかしこのSetクラスを使うと、その辺が簡単に解決できたりする場合があります。
ちなみにどんな機能を持っているのかといいますと…

  • Set::merge()
    配列を再帰的に結合する
  • Set::filter()
    空の要素を取り除く
  • Set::pushDiff()
    配列の差分を付加する
  • Set::map()
    配列をオブジェクトにマッピングする
  • Set::numeric()
    配列内の要素が全て数字かをチェックする
  • Set::enum()
    指定するキーの値を見つける
  • Set::extract()
    配列から指定キーの値を抽出
  • Set::format()
    フォーマットに従って値を抽出・生成する
  • Set::matches()
    配列内の値が条件にマッチしているかを調べる
  • Set::insert()
    配列内に値を挿入する
  • Set::remove()
    配列から指定要素を削除
  • Set::check()
    指定パスの存在をチェック
  • Set::diff()
    配列の差分を抽出する
  • Set::isEqual()
    2つの配列の内容が一致しているかをチェックする
  • Set::contains()
    配列の値が内包されているかをチェックする
  • Set::countDim()
    配列の次元数を調べる
  • Set::normalize()
    配列内の値を正規化する
  • Set::combine()
    2つ以上のパスから新たな連想配列を生成する
  • Set::reverse()
    オブジェクトを連想配列に戻す
  • Set::flatten()
    連想配列の構造をフラット化する
  • Set::sort()
    パスで示した要素を対象にソートする
  • Set::apply()
    抽出結果をコールバック処理

上記メソッドについての詳細はここでは説明しきれませんので、こちらをご覧いただくか「ポケット詳解 CakePHP辞典」を参照してください。できれば買って!(笑) 今回はこの中のSet::extract()とSet::combine()を動作サンプルとして掲載します。

さて前置きはこのくらいにして、さっそくピュアPHPコード内でCakePHPのコードを使用する方法をご紹介しましょう。

1:CakePHPのコードを配置する

先でも後でも良いのですが、とりあえずCakePHPコードを配置してしまう事にします。
今回は、ドキュメントルート内に利用元のピュアPHPコードを展開し、「includes/」内に利用したいCakePHPコードのファイルのみをを入れます。ドキュメントルートとは別の一にCakeのパッケージを丸ごとインストールして、そこを参照したりしても良いかもしれません。
CakePHPはこちらからアーカイブを入手し、その中の「cake/libs/set.php」をincludesにコピーします。また、Setクラス内では同じくCakePHPライブラリである「Stringクラス」も呼び出していますので、「cake/libs/string.php」もコピーします。その他にもクラスを呼び出しているものがありますがそれは次のステップで。

2:ダミークラスを作成する

CakePHPのコードを使うための、超最低限の機能(?)を有するコードを作成します。
includes内に「cake.php」ファイルを作成します。内容は次のようにします。


<?php
define('DS', DIRECTORY_SEPARATOR);

//CakePHP内での基底クラスのダミー
//
class Object {
}

//CakePHPのAppクラスの代替メソッド
//
class App extends Object {

	//ファイル読み込み(App::import()の代替メソッド)
	//
	function import($type, $class){
		include(dirname(__FILE__).DS.strtolower($class).'.php');
	}
}

Objectクラスは、CakePHPのほとんどのクラスが継承している基底クラスで、ライブラリでも使用している場合があります。ダミークラスを作成して問題を起きにくくしておきます。
App::import()はCakePHP内で自在にincludeするための便利メソッドで、これもライブラリ内で用いられています。SetクラスでもStringクラスを呼び出すために使用しています。本来は$typeでクラスの種類(ControllerとかModelとか)を指定するのですが、今回の実装ではincludesディレクトリに全て突っ込んでしまうため、無視します。$classはupperキャメルケースで表現されていますのでアンダースコア形式に変換する必要がありますが、今回はインチキしてstrtolower()してしまっています。厳密にやるのなら「cake/libs/inflector.php」内のメソッドを用いるとできると思います。

3:目的のピュアPHPコードの作成

最後に目的のコードを記述します。今回は次のようなコードで実験する事にします。


<?php
//Includes
//
require_once('includes/cake.php');
require_once('includes/set.php');

//Example : CakePHPのSetクラスをピュアPHPでも便利に使ってみる!
//

//データ
//
$results = array(
	array(
		'User' => array(
			'id' => '1',
			'loginname' => 'saito',
			'password' => '0123',
		),
		'UserProfile' => array(
			'id' => '101',
			'name' => '斉藤',
			'type' => 'baseball',
		),
	),
	array(
		'User' => array(
			'id' => '5',
			'loginname' => 'honda',
			'password' => '0123',
		),
		'UserProfile' => array(
			'id' => '102',
			'name' => '本田△',
			'type' => 'soccer',
		),
	),
	array(
		'User' => array(
			'id' => '10',
			'loginname' => 'ishikawa',
			'password' => '0123',
		),
		'UserProfile' => array(
			'id' => '103',
			'name' => '石川',
			'type' => 'golf',
		),
	),
);

//処理1:名前だけを抜き出す
//
$arr = Set::extract('/UserProfile/name', $results);
var_dump($arr);
echo"<br />\n";

//処理2:User.id = 5の名前だけを抜き出す
//
$arr = Set::extract('/User[id=5]/../UserProfile/name', $results);
var_dump($arr);
echo"<br />\n";

//処理3:(User.id) => (UserProfile.name)の連想配列を入手する(select文生成などで利用)
//
$arr = Set::combine($results, '{n}.User.id', '{n}.UserProfile.name');
var_dump($arr);

実行結果は次のようになります。

array(3) {   [0]=>   string(6) "斉藤"   [1]=>   string(6) "本田△"   [2]=>   string(6) "石川" }
array(1) {   [0]=>   string(6) "本田△" }
array(3) {   [1]=>   string(6) "斉藤"   [5]=>   string(6) "本田△"   [10]=>   string(6) "石川" }

SetクラスはCakePHPユーザでもあまり使われていないかもしれないのですが、この便利さは魔力を秘めているというのか使い出したら止まりません(^^;。上記2つはデータベーステーブルから特定の値を抜き出したりする場合に威力を発揮すると思います。また、今回触れてはいませんが、Set::merge()やSet::sort()なんかもかなり便利です。array_merge()は1次元目の配列要素に対してのみマージが行われますが、これは多階層の配列に対して再帰的にマージが可能です。またsortについても、特定のパスの値に対してソートをかける事ができるので、例えばとりあえず取ってきた複数レコードのデータをid順に並べ直したりといったことが簡単にできます。
しかしSetクラスは少々CPU%を使う仕組みだと思うので、peclかなんかでモジュールを利用する形で作ったりすると良いのかもしれませんね。いや、できればPHPで標準化されて欲しいものばかり!(笑)

ぱっと見なのですが、Setクラスだけでなく次のクラスライブラリもたぶん同様の方法で使えると思います。

  • Inflectorクラス
    アルファベッド表記の名前を単数形←→複数形変換したりキャメルケース←→アンダースコアに変換したりできるクラス
  • Stringクラス
    UUIDを生成したり、テンプレート文字列に要素を挿入したりできる機能のあるクラス
  • NumberHelperクラス
    通貨など数値関連のフォーマッティングをしてくれるクラス。なおAppHelperクラスを上記のObjectクラスのようにダミー化する必要があります
  • TImeHelperクラス
    時間に関するフォーマッティングをしてくれるクラス。strtotime()等の機能をより便利に拡張します

他のクラスにも有用なものがありますが、ちょっと大がかりな工夫をする必要がありそうなので、興味があったらチャレンジしてみてください(Validationクラスくらいなら比較的簡単にけるかもしれない)。

Pocket詳解 CakePHP辞典

Pocket詳解 CakePHP辞典 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2010-09-27 (月)

商品カテゴリー単行本

ページ数672

ISBN4798027456

Supported by amazon Product Advertising API

明日は kashioka さんの担当です。よろしくお願いします!
それではMerry Xmas!!

【CakePHP】CakePHP Advent Calendar2010(day 7) : Tips for Routes

CakePHP Advent Calendar2010 の当番が回ってきました。
本来はもっとかる~い内容でいくつもりでしたが、皆さんがっつりとやられているので、慌てて秘蔵のネタ(?)を引っ張り出すことにしました。まあとはいえ実際はそんなでもないので軽く読んでいただければ(笑)。

さて、Modelにまつわる話が多いようなので今回も違う話題にしましょう。Modelは今までTipsが出にくい仕組みの一つだったのかもしれないのですが、同じくなかなか情報として出回らないRoutes関連でも取り上げてみようと思います。

CakePHPであることを隠蔽する (CakePHP Advent Calendar 2010 2日目) でも取り上げられていましたが、CakeぽくないURLを作成するためにはRouteを変更することで自由なURLにコントローラとアクションを振り分けることができます。しかし多くの場合「/:controller/:action/*」という標準のルート指定で問題がないため、修正する機会はなかなかないのではないかと思います。そこで2ステップでRoutes活用法をご紹介します。

ステップ1:パラメータチェックをRoutesで済ませてしまう

Routesの設定は上記のようにURL変更というのも活用法のひとつかもしれませんが、もう一つとても便利な使い方があります。それは、URL中にパラメータを含む場合に、そのパラメータチェックをRoutes内で行うことができる点です。
たとえば

http://www.example.com/foo/hoge/0123456789

というURLを想定するとしましょう。fooコントローラ内のhogeアクションで1つの値を入手したい場合です。この場合、デフォルトですとコントローラ内の「$this->params[‘pass’][‘0’]」に値が入ります。そこで一般的に、次のようなコントローラを書くでしょう。


class FooController extends AppController {
	var $name = 'Foo';
	var $uses = array();
	function hoge(){
		//まずパラメータチェック
		//
		if(!preg_match('/^[0-9A-Za-z]+$/', $this->params['pass'][0])){
			$this->flash('正しくないURLです', '/');
			return;
		}
		//以下、必要な処理
		//
	}
}

しかし、Routesを活用することで、コントローラにチェックを書かずにチェックを行うことができます。「app/config/routes.php」に次のように記述します。


Router::connect('/foo/hoge/:viewerId', array('controller' => 'foo', 'action' => 'hoge'), array('viewerId' => '[0-9A-Za-z]+'));
Router::connect('/foo/hoge/*', array('controller' => 'foo', 'action' => 'error'));

この場合は$this->params[‘viewerId’]にて値を受け取ることができます。条件に満たさない「/foo/hoge」はすべてerrorアクションに流れます。Router::connect()は先着順でルーティングを決定しますので、一番最後に条件を満たさない場合のルートを書いておけば、デフォルトである「/:controller/:action/*」に流れることはありません。

メリットとしては、まずアクション内でパラメータチェックが要らなくなる点で、fat controllerのスリム化に貢献できると思います。そして不要なアクションがコントローラ内に渡ってこない点にあります。そもそもURLから渡されるパラメータはコントローラに渡ってくる時点で正しいものであるべきかと思いますので、Routesでチェックすることは理にかなっていると言えます。

ステップ2:正規表現で表せないルーティングはどうするか?

上記ルーティングは、あくまでも正規表現で表される場合であり、複雑な条件分岐を伴ったりモデルを参照したい場合などはうまく表現できません。
しかしCakePHP1.3からは「カスタムルーティング」という機能が備わり、その中でチェックしたりデフォルト値を追加したりすることができます
たとえば、既にモデルに登録されている値のみをルーティングし、登録されていない値はアクセスできないようなルーティングを表現してみましょう。まず、カスタムルーティングのコードを「app/libs」に記述します。コードを置く場所はどこでもよいのですが、Cake用のコードなのでvendorsではなくlibsがいいでしょう。ここでは「app/libs/viewer_route.php」とします。


class ViewerRoute extends CakeRoute {

	//Userモデル内のviewerIdをチェックし、userIdを返す
	//
	function __checkViewerId($id){

		$model =& ClassRegistry::init('User');
		$result = $model->find('first', array(
			'conditions' => array(
				'viewerid' => $id,
			),
		));
		if(empty($result)){
			return false;
		}
		return $result[$model->alias]['id'];
	}

	//パース処理(URL => array())
	//
	function parse($url){

		//ここはお決まりの処理
		//
		$result = parent::parse($url);
		if(empty($result)){
			return false;
		}

		//viewerIdが登録されているかをチェック
		//userIdをルーティングパラメータとして追加
		//
		if(isset($result['viewerId'])){
			$userId = $this->__checkViewerId(h($result['viewerId']));
			if($userId === false){
				return false;
			}
			$result['userId'] = $userId;
		}else{
			return false;
		}

		return $result;
	}

	//マッチ処理(array() => URL)
	//
	function match($url){

		//ここに、URL生成に必要な処理を記述する(今回はなし)
		//

		//以下お決まりの処理
		//
		$result = parent::match($url);

		return $result;
	}
}

カスタムルーティングでは、parse()とmatch()を記述する事で、それぞれ正引き(Router::connect())と逆引き(Router::url())で独自の処理を行う事ができます。それ以外のコード(上記では__checkViewerId())は独自メソッドです。
ClassRegistry::init()を用いると、ルーティング処理内でもモデルを扱うことができます。ただし、parse()の段階ではまだコントローラ等は初期化が済んでいませんから、その範囲内での処理しかできないことを留意しておきます。match()は逆引きで用いられるので、タイミング的にcontrollerの初期化が終わっているのでこの限りではありません。
次に、「app/config/routes.php」にカスタムルーティングを適用します。第3引数の連想配列の中にある「routeClass」パラメータに作成したカスタムルート名を指定します。また、このクラスは自動的に読み込まれないので、事前に「App::import()」等で読み込んでおきます。


	App::import('Lib', 'ViewerRoute');
	Router::connect('/foo/hoge/:viewerId', array('controller' => 'foo', 'action' => 'hoge'), array('viewerId' => '[0-9A-Za-z]+', 'routeClass' => 'ViewerRoute'));
	Router::connect('/foo/hoge/*', array('controller' => 'foo', 'action' => 'error'));

これで、viewerIdというパラメータで特定ユーザのみを許可するルーティングが実現できます。また、「ルーティングパラメータに存在しないパラメータを後から追加できる」ことも注目したい点です。上記サンプルでは、モデルから取得したuserIdを追加しています。このパラメータはコントローラ内で「$this->params[‘userId’]」として受け取ることができます。

CakePHPは1.2でも十分に実用的ですが、1.3になってよりいろいろなことができるようになりました。今回の「カスタムルーティング」も使い方次第では大変に便利な機能といえます。また1.2を含めて、まだまだ便利な機能がCakePHPには備わっています。当方の執筆しました「Pocket詳解 CakePHP辞典」では、1.2/1.3の違いを含めコアクラス内に収録されているプロパティ・メソッドを盛りだくさんで紹介しています。こちらのほうもぜひご利用いただけますと幸いです。

Pocket詳解 CakePHP辞典

Pocket詳解 CakePHP辞典 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2010-09-27 (月)

商品カテゴリー単行本

ページ数672

ISBN4798027456

Supported by amazon Product Advertising API

次の担当は kanonji さんです。
どんなCake話が聞けるか楽しみですね!:D
ちょっと気が早いかもしれませんがMerry Xmas!!

【追記】(2010.12.07)
カスタムルーティングについての解説を若干足しました

【戯れ言】近況報告とか今後の予定とか

すっかりブログをサボってしまっていてすみませんでした。しばらくきつい作業をしていたのでこちらをやっている暇は全くありませんでした(^^;。というわけで近況報告や今後の当方の予定なんかを。

Twitterをフォローされている皆さんはご存じかもしれませんが、今まで進めていた執筆作業がようやく一段落しまして、現在は用意した原稿から実際の製本に向けての作業に入りました。発売スケジュールもほぼ確定し、それに向けてがんばっていくところです。
前回は「携帯+CakePHP」というテーマで こちら を執筆させていただきましたが、今回は携帯からは離れ、純粋に「CakePHPの詳細を解説」したリファレンス本になります。Cake本はほとんどが「入門書」しかないためにある一定レベルに達するとこれらは卒業する事になるかと思いますが、その次の段階で参考になる本が無く、また作業時にちょっと知りたいような辞書的なものがないため、その隙間をまた埋めさせていただいた感じです。
競合する本は1冊あり、おそらくは誰もが持っていると思われますが(笑) こちら は1.2ベータ版の情報で大変古く、かといってこれしか使えるものがないため、現行バージョンのものが切望されていました。そこで今回は(まあ当たり前かもしれませんが)1.3に対応し、またまだ現役で使用されている1.2でも使えるよう両対応しました。
そしてここからが重要ですが「引数で与えるオプション値」についても詳細に解説した点が今までの本との大きな違いになります。Cakeのクラスメソッドは大抵$options等で連想配列を渡す仕組みになっていますが、その中身に何を記述して良いかわからない場合が多かったと思います。またCookbookに書かれていない内容が多く、そしてそれが意外に大事だったりする事もあり、この辺は是非やりたい…いやこれをやらなければ価値がないとさえ思っていました。
今回のコンセプトとしては「今Cakeに詳しくない人が使い始め、習得しても向こう3年は使える本」を目指しました。チュートリアルや多の入門書籍を参考にCakeで簡単なサイトが作れるようになってきて、じゃあ今度はオリジナルだ!という段階になり、そこからずっとそばに…という感じです(笑)。3年というのはその頃に2.0がちらほら出始めるでしょうから、そこで寿命になるのかなという感じです。その間、いつも机のそばに置いといてもらえればうれしいです。本の大きさも現実的なものを目指し、一回り小さいサイズにしてページ数も辞書にはならないものを想定をしています(まだページ数が確定していないのでアレですが、これに関してはちょっと自信がなくなってきました)。
それによる弊害もあり、限りあるページ数でたくさんの情報を詰め込む必要があるため、サンプルソースコードは必要な部分以外は極力省かせていただきました。その代わり極限までメソッドを掲載しました。このためちょっと初級者向けの内容ではないかもしれません。この辺はコンセプトとして割り切りました。また触れる事のできなかった内容もありますが、普段使いを最優先にした内容になっています。唯一残念なのはテストケースの解説がページ数の都合でできなかった事です。この辺については こちら のような大変に参考になる本がありますので、そちらにお任せする事にしました(笑)。
発売日・書籍案内についてはまだ確定していないためにお知らせできませんが、だいたい9月末を予定しています。PHP Matsuriには間に合う予定です(笑)。
そんなわけで長らくお待たせしましたが、もう少しですのでお待ちいただけますと幸いです。

執筆の話が長くなってしまいました。ごめんなさい(^^;;;

で、とりあえず本の方は一段落しましたが、休み無く次の案件について現在取り組み始めている段階です。何をやっているかはちょっと言えないのですが、いまはやりどころの仕事でしかも結構大がかりな事をやっています。ちょっとこの辺に関してノウハウがなかったので、大変に良い経験になっていますが、その代償として休みがほとんどありませんorz。10月末までは正直何もできない状況です。

合間に、今まで放置されていたKtai Libraryのバージョンアップ作業に取り組む予定です。「時間がない」のにと思われるかもしれませんが、上記の案件で使わなければならないので(笑)。でも正直言いますと、本来は正式版を出すつもりでいましたが、その前段階のバージョンをリリースする事になるかもしれません。
目玉は「キャリア間での絵文字の相互変換」についていよいよ取り組みます。あとプラグイン化をする予定です。今までは上書きでOKだったと思いますが、次のバージョンはちょっといろいろ直してもらう必要が出ます。

そして10月はじめに開催される「PHP Matsuri」ですが、上記の件もあり表だった参加はできない予定です。何とか当日ひょこっと顔を出す可能性はあるかもしれませんが、時期的にデスマーチ期間だと思いますので(^^;。そして関係者の皆様、人員の頭数になれなくてごめんなさいm(__)m。

その代わりといってはなんですが、11月台に、これも今まで放置されていましたが「CakePHP温泉部」の2回目を開催予定でいます。10月に開発イベントをやる関係で、予定していた開発系の内容についてはまだ揺れているところですが、何かしら結果が得られるようなものにしたいとは思っています。アイデアありましたら募集しています。場所に関しても情報募集中。広いので前回のところでもまあいいのですが(笑)。

長文になってしまい申し訳ございません。
他にも書きたい事がありますがこの辺で。
刊行の正式案内は後日させていただきます。

【KtaiLibrary】Ktai Library勉強会@東海に行ってきました!

先週土曜日は「Ktai Library勉強会@東海」ということで、行ってきました。
同勉強会は東京では2回行われていますが、それ以外の地域では初めての開催でした。

東海のCakePHP関連のイベントについては@a24lovewebさんのほうで主に開催されていらっしゃるのですが、以前から「何かやりたいよね」という話をしていまして、今回はかなり題材を絞ったイベントを開催するという目的で、Ktai Libraryを題材としたCakePHP勉強会としました。「どうせみんな集まってくれないだろう」と思っていたのですが、合計14名の参加ということで、会場になった つくる人株式会社様の部屋は人でいっぱいになりました!

参加者全員で記念撮影

内容については、前半30分程度で「入門編」として当方からKtai Libraryの概要について説明させていただき、後半の2時間で実際に使っていただく、という流れで行いました。東京では完全に書籍ベースで静かに黙々と行う形式であったのに対し、名古屋では内容についてはフリーではありましたが基本的に当方からの解説に沿っていく形式であったため、ちょっと一方的に当方から話してしまった感がありました。最後の時間でディスカッション的なものを用意していたのですが、いろいろトラブル等もあって時間がなくなってしまったので、この辺は残念だったです。

トラブルというのは、まあ以前からこの手のワークショップにはありがちですが、いわゆる「環境構築にてまどう」系です。Cakeではcakeフォルダとappフォルダを別の階層のディレクトリに配置したり、webroot内のものをいろんな場所に配置したりするとあまり良く動きません。まあそういうこともあっての「事前にCakeを動かして参加してもらう」だったのですが、まあこの辺は難しいですね。

具体的な内容についてはスライドをご覧ください。

1:入門「Ktai Library」

2:実践「Ktai Library」

「実践~」の方には、先週の「第5回CakePHP勉強会@東京」にて発表しました「Ktai Library on CakePHP1.3」にて触れた「「なう」な使い方」の実践編として、そしてCakePHP1.3の新機能を用いた「PCサイトとモバイルサイトを1システムで制作する新しい方法」としてTipsを紹介させていただきました。簡単に説明すると、CakepPHP1.3からの新機能のApp::build()でのパスの登録を、モバイル時のパスを登録することでビューファイルを整理することができるというものです。本当はコントローラについてもPC用とモバイル用とで振り分けることができればなお良かったのですが、残念なことにdebug=0の時にうまく動かないなどの数々の問題点が出てしまい、結局骨抜きになってしまいました(^^;。自分としても少々消化不良ですので、良い方法を思いついたらまた研究してみたいと思いますが、まあ早い話が「Ktai Libraryのサブクラスを直接呼ぶことでもっといろいろなことができるよ」というのが言いたかったです。

参加者のレベルは本当にまちまちで、「PHPを使い始めた」方から「実際にKtai Libraryを業務で使ったことがある」方までいろいろでした。京都や東京から遠路はるばる参加された方、そして@evertOnさんは日本語が得意ではないにもかかわらず、がんばって聞いてくれました(今度携帯サイトを作る案件があるので参加してみた、とのことです)。しかし、皆なんらかの得るものがあったみたいでその辺はほっとしました。
あつさんがおっしゃるには「名古屋ではそもそも勉強会が少ないので、もっといろいろやって参加者が増えるといいな」ということでした。東京ではほぼ毎日何らかの勉強会があるんじゃないかと言うくらいインフレ状態ですけど、名古屋でももっと盛り上がってくれたらいいなと思いました。私もこれに限らずまた参加してみたいと思います。

勉強会後は懇親会でいろいろなお話を聞くことができました。
そしてSymfonyユーザ会でご活躍されています@hidenorigotoさんが途中参加され、いろいろお話を伺うことができました。
あっという間に時間が過ぎてしまいましたが本当に楽しかったです。

夜はあつさんのところにお邪魔をして、今後のこととかをいろいろお話ししました。
そして「何かやりたいね」的なお話も。

帰りはふと好奇心からJR高速バスで帰ることに。
行きはN700系できたのですが、思ったよりも居心地が悪く、またバスの方は「スーパーシート」なるものがあり、ゆったりできるかなと思ったからです。

帰り間際は、名古屋で有名な味噌カツ屋である「矢場とん」に。
1.5倍サイズのある「わらじとんかつ」を食したのですが、うまかった!

矢場とんの「わらじとんかつ」。でかいがうまい!

JR高速バスは、ここでは東名高速の昼行路線バスを指していますが、スーパーシート席のある「スーパーライナー」というのがあり、超特急便で主要バス停しか止まりません。といっても夜行バスなどの直行便と比べて停車回数も多く、それと比べるとゆっくりですが。13時に名古屋を出発して19時に到着予定「でした」。

座席は一般席と比べて若干ふかふかで、ヘッドレストが枕みたいで気持ちいい!

高速バスは何度か経験していますが、このスーパーシートはなかなか座り心地が良く快適です。
強いて問題点を挙げれば、シートピッチは普通席とあまり変わらないらしく、若干足下が狭いです。

最前席の見晴らしは最高!

またスーパーシート席は2階席の最前列から3列くらいまであり、私は運良く先頭列のど真ん中。見晴らしは最高で、ゲームみたいな見下ろしの視点で楽しく過ごすことできました。

しかし…東名で事故渋滞に遭遇し、御殿場-厚木間で40km!
ちょっと疲れました。
渋滞がなければとても満足度は高かったです。
まあこの辺は仕方がないですかね。

まあハプニングも含めてとても楽しかったです。
また名古屋に行きたいと思います。

参加者の皆様、会場を提供していただいた「つくる人株式会社」の皆様、そして主催のあつさん、どうもありがとうございました!

ほかのイベントレポートはこちら

▼Ktai Library for CakePHP勉強会@東海に参加してきた。(@mick0124)
http://mick.blog16.jp/index.php/main/2010/06/05/ktailibrary_1

▼Ktai Library for CakePHP勉強会@東海を開催しました(@a24loveweb)
http://as.blog16.jp/index.php/2010/06/06/p1332

【戯れ言】花見OFFを来週末頃に開きたい

寒い冬もようやく終わりお花見シーズンになりましたので、軽~いOFF会でもどうかと思い提案します(笑)。
4/2頃都内では満開になりそうですので、その付近の夜、仕事が終わったあとにどこかに集まって缶ビール片手にIT話等で盛り上がれればと。気軽に集まってもらいたいのと運営の手間も無くしたいので、基本飲食物は各自好きなものを持ってきてもらって適当にやってもらう趣向です。

ただ、金曜日の夜(4/2)かなーと思っていたのですが、会社行事などで休日の方が都合がよい方もいらっしゃるみたいですので、いくつか候補立てすることにしました。都合の良い日程をコメント欄などでお知らせいただけますと幸いです(複数解答OK)。

  • 4/2(金) 20時頃~
  • 4/3(土)10時頃~
  • 4/3(土)17時頃~
  • 4/4(日)10時頃~
  • 4/4(日)17時頃~
  • 4/5(月) 20時頃~
  • その他

休日午前中からですと、花を見ながら開発とかも良いかもしれませんね。逆に午後からですと場所取りが難しいかもしれません。
また、CakePHP縛りはとりあえずしない方向ですので、お友達やご家族ご一緒にというのも大歓迎です。
あと場所については都内のどこかで。平日なら新宿か渋谷のどこかですかね。休日なら少し離れていても良いかもしれませんが。おすすめの場所がありましたらそれも教えていただけると助かります。

それでは宜しくお願いします!

【KtaiLibrary】Ktai Library勉強会楽しかった!

昨晩、「Ktai Library勉強会@関東」がE2さんにて行われました。
まずはお集まりいただいた皆様&スタッフの皆様どうもお疲れ様&ありがとうございました!

CakePHP関連のイベントは色々ありましたが、1冊の本がベースで、しかもそれに準じて開発していく形式のイベントは今回初めてだったため、大変におもしろかったです。なんというか、従来のカンファレンス形式は「聞くだけ」なのに対し、自分で手を動かす「ワークショップ」形式は達成感のようなものが得られる点、そして本をベースにすることにより、解説を聞くことで作業が中断してしまうことが無く自分主導で進捗が得られる点にメリットがあるかなーと感じました。逆に、開催中は大変に静かになるため、個人的には全く落ち着かないのですが(笑)。

誤植関係が良く見つかってまあお恥ずかしい限りですが、それとは別に、また例によって環境依存系のトラブルが多発しまして、進捗がなかなか得られなかった方もいらっしゃいました。そのトラブルとは、「Firefox3.6 & FireMobileSimulator1.1.10でdocomo・au表示の際にバイナリ絵文字が表示されない」というもので、Windows, Mac関係なしに出ていました。バイナリではなくて数値表現にすると出てくるため、ブラウザ内で表示トラブルだと思うのですが…

まあ2時間では限界があり、結局セットアップで終わってしまった方が多かったのではないかと思いますが、とりあえず皆さん絵文字が表示できていたみたいなのでホッと胸をなで下ろした感じです。

後半は懇親会というか、ピザ&ビール片手に雑談会でした。
CakePHP1.3の新機能系の話や、symfonyやCodeIgniterとCakeとの思想の違いのような話、Cakeの未来はどうなる?的な話等々で盛り上がりました。
そして、当方でざっくりと「Ktai Libraryの今後について」をご紹介。
詳細についてはまたブログの方で書かせていただきますが、現在開発を進めている0.3の話などをさせていただきました。
そしてkaz_29さんの方から、現在目下制作中の「ExtJSプラグイン」ですがこれが大変に素晴らしい!ブラウザOSっぽいことが出来たりするのですが、Cakeのアプリのユーザインターフェースががらりと変わりそうなイノベーションを感じる!

気がつけば終電を気にしなければならない時間まで経過してしまいましたが、最後に記念撮影をして終わりました。

参加メンバー全員で記念撮影

まあ運営側にはいくつか課題点はあるのですが、こういった勉強会スタイルはもっと数が増えたらいいなと思いました。普通にCakePHP勉強会をやっても「さて何を勉強しよう」みたいになっちゃうと思いますが、ある程度的が絞れるので。スタッフ間で「Model勉強会、とかみたいにしても十分需要あるかもね」みたいな話とかもしました。まあ今回もたくさんある手法の1つだと思うのですが、いろいろなものを試してみたいと思います。

まあそんなわけで次もあると思うので、今回参加された方、逃した方も是非宜しくお願いします。

【KtaiLibrary】「Ktai Library勉強会」が開催されます!

当方で執筆しました「PHPで作る携帯サイト デベロッパーズガイド」をお手本にCakePHPで携帯サイトを制作するための勉強会が、来週月曜日(3/8)の19:30から開催されます!

▼Ktai Library for cakephp 勉強会@関東やります
http://yashio.wordpress.com/2010/03/02/ktai-library-for-cakephp-%E5%8B%89%E5%BC%B7%E4%BC%9A%E9%96%A2%E6%9D%B1%E3%82%84%E3%82%8A%E3%81%BE%E3%81%99/

▼Ktai Library for cakephp 勉強会@関東(申し込みはこちら)
http://atnd.org/events/3413

私の方からは、今後のKtai Libraryについて少ししゃべらせていただきます。
また進行にかかわらず、もし本書もしくはKtai Library、その他全般で分からない点等がありましたらご質問いただいて構いません。

Cakeの勉強会で、書籍をベースに勉強会を開催するのは初めてだと思いますが、携帯に限らずCakePHPを始めて間もない初心者の方でもお気軽に参加できる内容だと思います(一応参加条件としてCakeでの実装経験が必要ですが)。
是非ご参加いただけますと幸いです。

なお、勉強会の性質上、当書籍が必要になります。
お持ちでない方は、是非こちらからお買い上げいただけますと幸いです(宣伝)。

PHPで作る携帯サイト デベロッパーズガイド

PHPで作る携帯サイト デベロッパーズガイド [書籍]

著者滝下 真玄

出版社秀和システム

出版日2009-12-22 (火)

商品カテゴリー単行本

ページ数556

ISBN4798024767

Supported by amazon Product Advertising API

【WordPress/CakePHP】福岡遠征Day2

福岡2日目です。
本日はWordCampFUKUOKA2010ということで、WordPressイベント初参戦なのですが、大変にためになったイベントでした!
まずは運営スタッフ様、スピーカーの皆様、それから参加された皆様、お疲れ様でした!
おそらく参加された方にとって、かなり場違い感たっぷりのレポートかもしれませんが、こういった視点もあるということでご了承いただけますと幸いです(^^;;;

さて、全体的な感想としては、福岡の皆さんは熱いな-みたいな(笑)。ノリ違いますね。盛り上がりかたがだいぶ違うというか。1日目の飲みでも感じたのですが、見ていて楽しいというか、こういう雰囲気大好きです。
イベントそのものの雰囲気もだいぶ違うというか、CakePHPのイベントはいかにもプログラマーチックな方がたくさん集まるのに対して、デザイナーチックな方が断然多そう。内容もかなり操作系の説明が多かったというか、ソースコードはあまりでないイベントでした。まあこれが普通なのかな(^^;。
会場は「西南大学」という大学の一角にあるコミュニティ施設の1Fをまるまる借りてやったという感じで、大学でやるのはなかなか良いなと思いました。でかいホールがあって、その中がメイン会場。周りにある多目的室2部屋で別セッションが行われていて、そのほか「ジーニアスバー」を「茶室」でやっていたらしいです。

会場の受付。この奥にメインホールがある。ちなみにメインホールに入るのに1000円かかり、その他は無料。フリーミアムだ(笑)

今回はかなりてんこ盛りの内容だったらしく、その結果昼開始を朝開始にし、さらに合計4会場にした背景があったそうですが、これについては見る側にとっては少し残念だったかも。見たい内容がかち合った場合にきついですね。私もイベントはどちらかというと開く側なのでいろいろやりたい気持ちは出てくるのですが、やはり的は絞った方が良いかなと思いました(でもこれに関しては難しい。スポンサーの関係とかもあるので…)。

私的に大ホームランだったというか、一番の収穫だったのは「Cacoo」というWebベースのコラボレーションツール。リアルタイムで図画を操作でき、それが全員に反映されるので、ホワイトボードがいらなくなる!

Cacooのコラボレーション画面。参加者の画面にリアルタイムで更新される

勉強会などでustでスライド等をon airすることが多いと思うのですが、スライドの内容がはっきりと分からなくて伝わりにくいところがあるので、こういったツールでみんなで見てもらった方が分かるかも。また、多会場でセッションしたりするのに、ホワイトボード的な使い方をすることでコミュニケーションがとれるのがイイ! 仕事とかで使えるかもしれませんね。

Cacooをサービスしているヌーラボの縣(あがた)さん。このツールが新たなコミュニケーションツールのスタンダードに発展するといいな

次のトピックとしては、コマースツール2本。
まず1つは「CS-Cart」という商用ツール。これは自分「WordPressベース」なものかと勘違いしていたのですが、中は完全のオリジナルアプリ。ただ「WordPress並にお手軽に設定ができる」、かなりサイト構築が簡単なツールで、基本的にアーカイブを丸ごと展開してインストーラを起動させ、少しの設定項目を入れるだけで動いちゃう系です。テンプレートは40くらい用意されていて、カスタムすることはもちろん(しかもwebベースで編集できるらしい)、アドオンでプログラム開発もできるらしい。某CUBEなツールでちょっと苦い経験をされた方には救世主になる(かもしれない)、かなり便利なものだと思います。
そしてLTで発表された「Welcart」というWordPressプラグイン。WordPressがショッピングサイトになる、すばらしいプラグインです。仕組みもおもしろくて、データベース・テーブルを新しく作ってその中にデータを別管理するのではなく、通常の記事データ内に情報を持っておくことで余分なデータを作らないらしいです。つまりDBやテーブルに依存させないでWordPress内で完結できる仕組みになっているので、何かと小回りがきくのではないかと。小規模向けには良い仕組みかもしれませんね。

この2つのツールは、内容的には同じベクトルなのですが、売り方(広め方)については180度違う点にも注目です。CS-Cartが「しっかりとした製品をお金を払って買ってもらう」のに対し、Welcartは「無料で幅広く使ってもらって認知度を高めたい」という方向で進んでいる点。前者はユーザ数の獲得が困難になり、後者は幅広く使ってもらうまでには金銭面(つまり維持するための費用を捻出する)で苦労する点。コマースツールは、どちらかというとニッチツールなので、数が稼げるかは分からないし、かといって有料は使ってもらうまでが大変なので、ここのところがうまく解決できるかがポイントになるんじゃないですかね。

どちらのサービス提供者の方にもお話を伺いましたが、私もCakeでショッピングツールを作りたいと思っている方の人間ですし(そういや「PHPで作る携帯サイト デベロッパーズガイド」でもショッピングツールを作っていましたね(笑))、もし何かできることがあったら協力したいなと思いました。とにかく現在、満足に使えるショッピングツールがないので(^^;。

その他、ジーニアスバーという交流スペースがあったのですが、その場所がなんと「茶室」で畳の部屋!
実は私たちが入ろうとしたときはすでに終わっていまして、無理矢理見せてもらったのですが(ゴメンナサイ)、おもしろいな-と思いました。CakePHPイベントも、懇親会とは別に交流スペースを常時開設するのも良いかもですね。前回のCakeMatsuriは昼食を会食形式にしましたが、アレも良かったですね。

そうだ、Cakeがらみの話題を書かないと。

まず、福岡ではBaserCMSはかなり盛り上がっています!
WordPressのイベントなのに、スピーカーの皆さんがプッシュしていたのはおもしろかったです(笑)。

例えばこちらは、CGFMの金内さん(@Garyuten)のセッション「サイト運営マニュアル」の風景。
人が通路にまであふれてしまい全然やっていることが分からなかったのですが、なんとかがんばって撮影しました。
懇親会ではなかなか話すタイミングがつかめなくて、帰り際にちょろっとしかできなかったのが大変に残念!

大人気のセッション風景。WordPressイベントなのにBaserCMSの文字が!(笑)

それから、ロリポップの中の人にも数人お話をさせていただきました。
ロリポといえば、Cakeの設置マニュアルが公開されているところで有名!
「なんかフレームワークのマニュアルを入れなければと思っていて、Cakeはまず入れた」的なことを話されていました(笑)。
ちなみに参加者の皆さんに配布されたものの中にロリポのサーバ3ヶ月無料お試しクーポンが入っていた!太っ腹!!(笑)
WordPressはなんと1行の設定と1クリックでインストールされるそうです。すごいよ!

最後に懇親会での出来事ですが…

ケーキ登場!
なんだか見覚えあるシーンですよ(笑)。

マクラケンさんに聞いたところ、CakePHPにインスパイあったそうです(笑)。
これは負けていられませんね!

というわけで、伝えきれなかったところがたくさんありすぎなのですが、とても有意義なイベントでした。
運営面もしっかりしていて、事故も特になく素晴らしかったです。
これだけの人数を回すのは大変だったと思いますが、関係者の皆様本当にお疲れ様でした!

私の方も、今後はWordPress関連でもいろいろやっていきたいです。
特にCakePHP + WordPressな何かを提供できれば。
ネタはありますので(つぶやいたので分かる人は分かると思う)、後はやるだけという感じですけど、ちょっと時間がない状況なので大変ですが。でも自分でも必要になってきているので急ぎたい…

というわけで2日目も無事に終了。
3日目はほぼ帰るのみなので記事はないと思いますが、まーとりあえず気をつけて帰ってきたいと思います。