【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)
カスタムルーティングについての解説を若干足しました

【KtaiLibrary】バージョン0.4.0公開!

お待たせしました、Ktai Libraryのバージョン0.4.0を公開いたします!

基本的にはバグフィックスと機種情報などデータ面の更新がメインだったのですが、一つだけ他の携帯向けライブラリ等には存在しない便利な機能を搭載しました。

高解像度携帯の登場で、画像の大きさがまちまちになって画面レイアウトが崩れる件については先に搭載しています画像のフィット機能で改善する事ができますが、これだけでは完全に解決することができませんでした。何故かというと「フォントの大きさ」もキャリア・機種によって異なるため、同じ文字幅で改行する事が困難だったからです。
そこで、キャリア・機種によって異なるフォントサイズの指定を肩代わりして同じように見せるような機能を搭載しました。簡単に仕組みを説明しますと、まず3キャリアでフォント使用の指定タグが異なるためそれを吸収し、またキャリア毎、あるいはSoftBankの高解像度携帯とdocomoのブラウザ2.0以降、それ以外での文字サイズの差をなくすために一工夫している感じです。

ただ、厳密にフォントの大きさを変える事はできません。携帯内が持っているフォントは固定幅でありアウトラインフォントではないため、1ピクセル単位でなめらかに大きさを変える事ができないからです(docomoのブラウザ2.0以降のみできる)。なので、おおむねそれに近い大きさの出力が可能な「small」「medium」「large」の3つの大きさが指定できます。それ以外の大きさも指定は可能ですが、そのまま出力するため同じ大きさに見えるかどうかは分かりません(というか見えないはず)。
それから本機能はXHTMLのみ有効です。HTMLでは機能しませんのでお気をつけください。

具体的にはこのように使用する事ができます。

■コントローラ(デフォルトのフォントサイズを変更する)


App::import('Controller', 'KtaiApp');
class KtaipagesController extends KtaiAppController {

	var $name = 'Ktaipages';
	var $uses = array();
	var $components = array('Ktai');
	var $helpers = array('Ktai');
	var $layout = 'ktai_default';

	//Sample ktai params
	//
	var $ktai = array(
		'use_img_emoji' => true,
		'input_encoding' => 'UTF8',
		'output_encoding' => 'UTF8',
		'use_xml' => true, 		//XHTMLに(重要)
		'default_font_size' => 'small', 	//デフォルトフォントサイズをsmallに
	);

	//Sample index action
	//
	function index(){
	}

}

■レイアウトファイル(ここが一番やりやすい)


<?php
if(Configure::read('debug') == 0){
	echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
}
?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
"http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<?php if($ktai->is_iphone()){ ?><meta name="viewport" content="width=260"><?php } ?>
<title><?php echo $title_for_layout; ?></title>
</head>
<body>
<?php $ktai->font(); //フォントサイズをデフォルトに指定 ?>
<?php if(!$ktai->is_ktai()){ ?><div style="width: 240px;"><?php } ?>
<?php echo $content_for_layout; ?>
<div align="center">
<hr width="90%" size="1" color="#333333" noshade>
(C)2009-2010 <a href="http://www.ecworks.jp/">ECWorks</a>
</div>
<?php if(!$ktai->is_ktai()){ ?></div><?php } ?>
<?php $ktai->fontend(); //フォントタグの終端 ?>
</body>
</html>

ktai-devのサンプルにもフォント指定がされていますので、お試しいただく事ができます。ただし、FireMobileSimulatorでは正しい文字サイズで表示する事ができませんので注意が必要です。

また、上記サンプルは完全にオプション値を省略していますが、フォント指定を行うタグを変更したり追加のスタイルを与える事もできます。詳しくは添付ドキュメントもしくはソースコード内のコメントを参照してください。

ちなみに本機能はフォントの大きさについてあまりこだわりのない方向けの機能ではないのですが、レイアウトにこだわる必要があるサイト、特に携帯ソーシャルサイトなどに便利にご利用いただけると思います(というか当方の案件で必要だったため制作しました(笑))。

Ktai Libraryの基本的な情報やダウンロードについては こちら をご覧ください。

【CakePHP辞典】Tips第3回:Model::read()

ModelのTipsが続いてしまいますが、今回はModel::read()についての注意事項です。

通常Modelでデータソースからのデータの読み出しはModel::find()/findBy()を用いるのが一般的だと思いますが、ほかの読み出し方法もいくつか存在しています。その中に今回取り上げます「Model::read()」がありますが、こちらは「プライマリIDを指定してレコード取得」を行うことができます。取得フィールドが指定できるため「find(‘first’, array(‘conditions’ => array(‘id’ =>$id), ‘fields’ => $fields));」に近いと思いますが、意味的にはfindById($id)のほうが近いかもしれません。

取り出し方、結果そのものについてはこれらはそれほど差がありませんが、ひとつだけread()には注意点があります。「Model::validationErrors」プロパティにはモデル保存等でバリデーションエラーが存在する場合にそのエラーメッセージが蓄えられるのですが、read()を実行すると問答無用で初期化します

「Model::validationErrors」プロパティを初期化するメソッドは、「Model::read()」のほか「Model::create()」「Model::saveAll()」の合計3メソッドです。おそらくread()はcreate()のように「モデルを初期化するためのメソッド」という位置づけなのでしょう。create()はコードで初期値を与えますが、read()は既存のレコードから初期値を与える、という感じですかね。なのでバリデーションエラーを保持して読み換えるような場合はread()は使うべきではない、ということになります。find()/findById()のほうがよいと思います。

個人的にはread()はほとんど使わないため「フーン」な仕様なのですが、bakeコマンドでコードを作り出している場合にはread()が含まれたコードを生成するそうなので、注意が必要です。@surface0さん情報ありがとうございました!

当メソッドの解説は「Pocket詳解 CakePHP辞典」の55ページに掲載されています。

ほかにも便利な機能が紹介されている「Pocket詳解 CakePHP辞典」を是非よろしくお願いします!

Pocket詳解 CakePHP辞典

Pocket詳解 CakePHP辞典 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2010-09-27 (月)

商品カテゴリー単行本

ページ数672

ISBN4798027456

Supported by amazon Product Advertising API

【CakePHP辞典】Tips第2回:Model::save()の追加説明

Pocket詳解 CakePHP辞典」内で、Modelクラスで主要機能でもある「Model::save()」内の解説について、若干足りない部分がありましたので追加させていただきます。

【書式】

$this->save($data, $validate, $fieldList);

【引数】

変数名 初期値 説明
$data array null 保存するデータの連想配列
$validate mixed true バリデーションを行う場合はtrue。また他のオプションを与えたい場合は連想配列で指定。下記参照
$fieldList array array() 保存するフィールド名の配列。nullの場合は現在の$this->whitelistの保存指定を空にする。array()の場合は現在値で保存する

▼$validateに指定できるオプション値

キー名 初期値 説明
validate array null 保存するデータの連想配列
fieldList array array() $fieldListと同じ値を指定する
callbacks array array() コールバックメソッドを実行する場合にtrue。もしくは「before」でbeforeSave()を、「after」でafterSave()を実行する

$validateは、そのものの値はbooleanですが、連想配列を与えることもでき、一般的な$optionsと同じようにオプション値としてふるまいます。この場合は$fieldListは無視されますので、必要なら$validate内に含めます。また「callbacks」というパラメータを与えることもできます。callbacks は通常trueであり「beforeSave()」「afterSave()」コールバックを通過しますが、falseにすることで通過しません。また 「before」「after」とすることでbeforeSave()だけ、afterSave()だけ通過させることもできます。

なお、このcallbacksオプションは「Model::saveAll()」のオプション値としても有効です。何故ならsaveAll()は内部でsave()をコールしているためです。

各メソッドの解説は「Pocket詳解 CakePHP辞典」の58ページおよび61ページに掲載されています。

ほかにも便利な機能が紹介されている「Pocket詳解 CakePHP辞典」を是非よろしくお願いします!

Pocket詳解 CakePHP辞典

Pocket詳解 CakePHP辞典 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2010-09-27 (月)

商品カテゴリー単行本

ページ数672

ISBN4798027456

Supported by amazon Product Advertising API

【CakePHP辞典】Tips第1回:TimeHelper::dayAsSQL()

不定期ではありますが、「Pocket詳解 CakePHP辞典」をより楽しく便利に使っていただけるよう、本書にて取り上げられているクラス・メソッド等で「あまり知られていないけど便利!」なもの、あるいは説明が不十分なものについてのフォローも合わせて、Tipsとしてご紹介させていただきます。
今回は第1回目として、私自身も1度も使ったことのなかった「Timeヘルパー」内で面白いメソッドがあったので、ご紹介します。

CakePHPの組み込みヘルパーの中に「Timeヘルパー」があります。これは日付に関する便利な機能をまとめたヘルパーなのですが、strtotime()/strftime()をベースにしているため日付フォーマットを選ばずに処理してくれる素晴らしいヘルパーです。1.3からは国際化に対応できるように拡張されていますので、複数ロケールを持つサイトでも大変に役立ちます。

そんなTimeヘルパーなのですが、一部「これ、ヘルパーの役目じゃないだろ??」と言うべき面白いメソッドが存在します。それが今回ご紹介する「Time::dayAsSQL()/Time::daysAsSQL()」メソッドです。メソッド名から容易に分かると思うのですが、なんとヘルパーのくせにSQLを扱います(笑)。
この2つのメソッドは「指定した日、あるいは指定した2つの日付の範囲内であるSQLを生成してくれます。例えば2010/09/29検索条件にしたい場合があると思いますが、その場合に「’conditions’ => array(‘created’ => ‘2010-09-29’)」のように書くことはできません。何故かと言いますと、このように記述した場合は2010/09/29 00:00:00と等しい場合だけしか条件に含まれなくなってしまうからです。
本メソッドは、このような挙動を避けるために、当日(daysAsSQL()の場合は開始日)の0:00:00から23:59:59まで(daysAsSQL()の場合は終了日の23:59:59まで)の範囲をSQL文で返してくれます。これを用いれば日にちで検索することが簡単になるでしょう。

しかしお気づきかと思いますが、本来ヘルパーはViewを補助するためのものですので、Modelに関してあれこれ操作するというのはMVC的に通常ありえません。そもそもTimeヘルパーの機能は汎用的のため、ヘルパーではなくコアライブラリとして存在するほうがしっくりきます。なぜヘルパーになっているのかはわかりません。

しかしなかなか有用な機能かと思いますので、この機能を「ライブラリとして」使ってみましょう。
念を押しておきますが、この手法は裏返せば「ヘルパーをどんなところでも使えてしまう」裏技です。しかし、Cakeのヘルパーは基本的にシステムとの結びつきが大変に強いため、ほとんどがまともに動作しないと思います。たとえばコールバックメソッドで初期化を行っている場合に機能することができません。あくまでも「Timeヘルパーをライブラリ的に呼び出す」用途に限定して利用したほうがいいと思います

たとえばコントローラ内でfindする場合に日付指定をしたい場合は次のようにします。


//hogeアクション
function hoge(){
  //Timeヘルパーの準備
  App::import('Helper', 'Time');
  $time = new TimeHelper();

  //find実行
  $this->data = $this->User->find('all', array(
    'conditions' => array(
      $time->dayAsSQL('2010-09-29', 'created'), 
    ), 
  ));
}

conditionsにフィールド名を指定せず、そのまま突っ込んでいますが、この書き方は有効です。findでは、「(連想)配列内にフィールドを意味するキーを持たない条件はそのままSQLに書き出す」よう作られています。

大事なことなのでもう一度書いておきますが「この使い方はTimeヘルパーのみに限定して利用したほうがいい」です。MVCの枠を飛び出たトリッキーな使い方なので、一般的にはお勧めのできない方法です(過去に私も このような 主張をしたことがあります)。しかしそれを上回ってTimeヘルパーの日時処理機能は便利なものです。このことを十分に理解してご使用ください。

個人的に、Timeヘルパーをコアライブラリにできないか、開発者側に提案してみたいと思います。
ちなみにSessionコンポーネント・Sessionヘルパーは、CakeSessionライブラリをextendsしています。なので、同じような方法ができるのではないかと思います。

なお、本メソッドの解説は「Pocket詳解 CakePHP辞典」の383~384ページに掲載されています。

ほかにも便利な機能が紹介されている「Pocket詳解 CakePHP辞典」を是非よろしくお願いします!

Pocket詳解 CakePHP辞典

Pocket詳解 CakePHP辞典 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2010-09-27 (月)

商品カテゴリー単行本

ページ数672

ISBN4798027456

Supported by amazon Product Advertising API

【CakePHP】「Pocket詳解CakePHP辞典」刊行します!

2013年3月15日に、続編の「詳解 CakePHP辞典」が刊行されました。
詳しくは下記リンクを参照してください。
http://blog.ecworks.jp/archives/1488

今年1月から企画が始まり、いくつかのハードルを超えながら執筆したCakePHPの本が、いよいよ刊行できる運びとなりました!
前回執筆の「PHPで作る携帯サイト デベロッパーズガイド」は、どちらかというとCakePHPの解説というよりはCakePHPを用いたサイト開発手法をメインに書かせていただきましたが、今回は純粋にCakePHPの内部を徹底的に解説した、「CakePHPを使いこなすため」のリファレンスマニュアル本として書かせていただきました。

Pocket詳解CakePHP辞典
【書名】
Pocket詳解CakePHP辞典【出版社名】
秀和システム【著者名】
滝下 真玄

【価格】
2,600円(本体価格)

【ページ数】
672ページ(随一の圧倒的な情報量!!)

【ISBN】
ISBN978-4-7980-2745-6

【発売日】
2010年09月28日より順次販売

前書では600ページ弱もの大作を書いてしまい「もう厚いのは辛いのでやめよう」と思っていましたし、出版社の担当様も相当苦労されていたので、企画時にも「辞書にするのはやめましょうね!」という紳士協定(?)で始めました。しかし、いざ書いているうちにページ数はどんどん増え、気がついてみれば本のみで自立してしまう厚さに(汗)。「Pocket詳解」シリーズに加えていただける事になったのはそれから後の話なのですが、文字通りの辞典になってしまいました(笑)。

この厚さになってしまった最大の理由は「向こう3年間はいつも手元に置いていただける本」というコンセプトがあったためです。CakePHPの関連書籍は幸いな事に他のフレームワーク本と比べてかなりの数があるのですが、ほとんどが初級者向けの本であり、実用的な情報がメインとは言えない状況です。またリファレンス本は1冊存在していますが、1.1~1.2ベータ版だった頃に書かれていた本のため大変に情報が古く、またページ数も抑えられていて主要なものの一部しか解説されていないため、かゆいところに手が届かない感じです。つまり開発現場などで要求に応えられるような本が無い状況であり、この辺を何とかしたいなと思っていました。
私自身も日頃開発をしていく上で「あれっ、あのメソッド何だっけ?」とソースコードを調べ、引数やオプション値を調べて実装する事が多いのですが、この手順が大変に時間を使っていたりしまして、本を開くだけでこれらの値の意味がすぐに分かるような本を熱望していました。Cake本に限らず、ネットの情報、ましてやCookbookやAPIでもオプション値については十分な情報が載っていないため、いつも結局行き着くところはソースコードになってしまうのです。なので「とりあえず全ての引数やオプションの意味が分かるような本があれば便利だよな」と日頃思っていました。

こんな事情もあったため、まず第一にやりたかった事は「オプション値の全てが分かる」事でした。「オプション値を連想配列で渡す」というのがCake流だと思いますが、その肝心のオプションについてよく分からない…そんな事もあるかと思います。一応ソースコード内に記載されているドキュメントでも若干分かるのですが、間違いも多くかなり不正確のため、本書では執筆時に一度ソースを解析してから列挙をしました。
それから「今まであまり知られていない便利な機能の発掘」です。例えばその代表例が「Setクラス」「ClassRegistryクラス」ではないでしょうか。知らない、便利そうなんだけどよく分からないので使わない…みたいになっていませんか? 何を隠そう自分もその一人です(笑)。それだけではありません。日頃モデル・コントローラあるいはコンポーネント・ヘルパー等を作成する際に親クラスでextendsしていると思いますが、その親クラスに有用なメソッドが存在している事をご存じでしょうか。単純にextendsしているだけの方が多いのではないでしょうか? 本書ではその部分についてももれなく解説し、より便利にCakeを使ってもらいたいと考えています。
そして忘れてはならないのが「新機能の解説・従来との比較」です。もちろん本書は「1.2/1.3両対応」です! 紙面の都合上全てを十分に行う事はできませんでしたが、例えば今まで暗闇に閉ざされていた「Jsヘルパー」や「(新)prefixルーティング」「カスタムルーティング」についても理解していただけるかと思います。また、両バージョンそれぞれ固有の指定方法についてもカバーされていますので、1.3へのアップグレードにも役立つかと思います。

紙面の都合上どうしても掲載できなかった情報はやはりあります。
例えばページ数の節約のためにサンプルソースコードはかなり削ってしまいました。このため最初のとっかかりとして買う1冊としてはふさわしくないかもしれません(最低限の記述方法は各章冒頭に一応載っています)。この辺はむしろ初級者向けの本の役割ですので、本書と両方購入していただき、初級本を勉強していく上で分からない引数やオプション値について本書でひいていただくような使い方がベストだと思います。英語の学習に、英語教本と一緒に英和辞典を買うように、本書は辞書として購入していただけると間違いないです
他にも上級者向けの機能(例えばDataSource等)、使用頻度がかなり低そうな機能などについても割愛させていただきました。この辺については別の機会・形で実現できればよいと思いますが。

限られた中でギリギリまで情報を詰め込んだ価値のある1冊になったと思います。Cakeの内側についてここまで解説した本はおそらく今までなく、「世界一CakePHPのことが分かる本!」と自負しています(笑)。カバーの色も大変わかりやすいと思いますので、店頭で見かけましたら是非手にとっていただき、そしてそのままレジに直行していただけますと幸いです(笑)

※09/21時点ではまだAmazon等で予約等はできないのですが、発売情報については後日追記させていただきます

【追記】(2010/09/23)
Amazonに書籍が掲載されました。
下記よりお求めが可能です(是非このページからお願いします(^^;)

Pocket詳解 CakePHP辞典

Pocket詳解 CakePHP辞典 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2010-09-27 (月)

商品カテゴリー単行本

ページ数672

ISBN4798027456

Supported by amazon Product Advertising API

【追記2】(2010/09/25)
見本誌が届きましたので写真を何枚か掲載します。

表紙写真です。見事に自立しています(笑)
本書に収められている内容。ヘルパー編とコアライブラリ編がもの凄い量です!
内容の抜粋。このページはModel::find()。指定できるオプション値が全部載っています

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

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

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