【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辞典」を是非よろしくお願いします!

アマゾンのサーバでエラーが起こっているかもしれません。一度ページを再読み込みしてみてください。

【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辞典」を是非よろしくお願いします!

アマゾンのサーバでエラーが起こっているかもしれません。一度ページを再読み込みしてみてください。

【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に書籍が掲載されました。
下記よりお求めが可能です(是非このページからお願いします(^^;)

アマゾンのサーバでエラーが起こっているかもしれません。一度ページを再読み込みしてみてください。

【追記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

「CakePHP勉強会@東京5」報告

昨日は1年越しの「CakePHP勉強会@東京5」が開催されました。
簡単ですがイベントの内容の報告と、当方で発表しました「Ktai Library on Cakephp1.3の資料を公開させていただきます。

ご覧の通り満員御礼!

今回は、前回の勉強会から丸1年、途中であったCakeMatsuriからも半年以上大きなイベントがなかったこともあるかもしれませんが、50名以上がひしめき合うイベントとなりました。セッション内でアンケートを採ったところ、そのうちの半分以上はこれらイベントを未経験ということで、なかなかフレッシュな集まりでした(笑)。

そして今回は、「福岡」「名古屋」「札幌」のサテライト会場、そして「ニューヨーク」からのセッションといった、今までになかった試みが行われました。凄いですね!遠くで同じイベントを共有できるなんて、時代の進歩というのか、とうとう勉強会もここまできたか!という感じでした。まあ装備や通信環境といった負担があるのでなかなか全部とは言えないですが、こういう仕組みは今後もやっていきたいですね!サテライトに名乗りを上げていただいた福岡の@k1LoWさん、札幌の@nazoさん、名古屋の@a24lovewebさん、ありがとうございました! 時差を乗り越えて発表された@yandoさんお疲れ様でした!

セッション時はこんな感じ

最初のうちは厳かに、というかちょっと堅い雰囲気でのスタートでした。

途中で茶菓子などが出たり、サテライト会場の中継とかが入って若干堅さが和らいだところで、いよいよ当方の発表とあいなったのですが… ちょっと外しましたね(^^;

というわけで、当方で発表しましたスライドを上げておきます。

「Ktai Library on CakePHP1.3」スライドの閲覧は画像をクリック

各セッション、LTの内容は今回もとっても濃かったですね。
特に、@takamunetaniiさんの「教えてこの子twitterツイート君」の事例紹介は、Twitterサービスをはじめとする「ヒットしたらドカンとアクセスが来ちゃう系サイト」を考えている方の励みになるものではないかと思います。何を隠そう、自分もとっても参考になりました!
それから、@hiromi2424さんのCakePHPハックもとても参考になりました。特に初期化周りに関してはテストコードを書く際にとっても参考になると思います。自分もはまりました(笑)。

Cakeマシュマロ配布なう

前回の勉強会は、「Cakeまんじゅう」なるものが配布されましたが、今回は「Cakeマシュマロ」が参加者全員に配布されました。これがなかなかかわいくて、食べるのがもったいない! そう思った人も多いはず(笑)。

立ち飲み形式で懇親会。#cake_beer!

勉強会が終わり、同会場で懇親会。ビールやサンドウィッチを片手に参加者との交流です。

今回とっても感じたことは、Ktai Libraryは既に業務レベルで活躍している点。そして皆さんに「とっても便利だ!」といっていただけている点にとても嬉しく思いました。本を出させていただいた点もある程度認知度の向上に役立ったかと思いますが、Ktai Libraryユーザーが確実に増えているんだなと実感できました。本当にありがとうございます!

また、今回はゲーム関連の業務をされている方にも何名かお会いしました。以前そのようなところで仕事をしていましたのでとても懐かしかったです(しかも昔おつきあいのあった会社さんだったり!)

これは懇親会開始直前の記念写真。「はい、Cake!」

それからこれも大変に驚いたのですが、なんとあの「セカイカメラ」もCakePHPで動いているそうです!
いやー、これは凄いことです!
懇親会の終わり間際に中の人とご挨拶させていただいたのですが、このあと付近の和民で2次会が行われたのですが、席をご一緒させていただけたのでずっといろいろなお話をさせていただきました。ありがとうございました。
とてもためになりました。

自分はそのあと終電の関係で先に上がらせていただいたのですが、日が変わって4次会くらいまで行われたみたいで、しかもそのあと「オクトーバーフェスト」で#cake_beerされていたみたいです。ちなみに当方は結局終電に乗れず、一人寂しく途中駅付近のマックで執筆活動をしてました(でも酔いが回っていてそれほど進みませんでしたが)。

次のCake関連のイベントは、勉強会内でもありましたとおり10/2~3に開催される「PHP Matsuri」です。海外からPHPに関連するゲストを招いてのセッションがある他、開発合宿→コンテスト等もあったり、2日間を「夜通しで」楽しめる大変に濃いイベントを現在計画しています。日頃業務以外での開発は難しいでしょうし、他の人との共同作業とかもなかなかできないと思いますので、なかなか新鮮な体験が出来るのではないでしょうか。また、それ以外にも楽しい催しも企画していますので、祭りとして楽しんでいただけますと幸いです。こちらの方も是非宜しくお願いします!

USTREAMの録画はこちら

http://www.ustream.tv/channel/cakephpstudy

他の発表者のスライドのリンクはこちら(発表順)

▼特報目玉イベント2010(@yando)
http://www.slideshare.net/yandod/20100529-phpday

CakePHP1.3 stable(@cakephper)
http://www.slideshare.net/ichikaway/cakephp-tokyo5

Ktai Library on CakePHP1.3(@ecworks_masap)
(上記にあります)

▼コアライブラリのエレガントなハック(@hiromi2424)
http://www.slideshare.net/hiromi2424/cakephpstudy5-hacks-jp

▼twitterとcloud serverとcakeで新規サービス(@takamunetanii)
http://docs.google.com/present/view?id=d4b7q8p_21cq5hkjg8

▼WordPressとCakePHP連携(@kara_d)
http://www.slideshare.net/karadweb/cakephp-and-wordpress

▼CakePHPでjQueryを使ってみた(@nano_eight)
http://www.slideshare.net/nanoeight/cakephpjquery-4357936

▼Cakephp tips for my next project(@evertOn)
http://www.notreve.com/cakephp_study-2010-05-29.pdf

▼あのCMS eZ publishをCakePHPのModelにしちゃう(@leebenny)
http://prezi.com/ugsu8hwgypud/datasource-for-ez-publish-in-cakephp/

実”戦”CakePHP Plugin(@k1LoW)
http://www.slideshare.net/k1LoW/cakephp-plugin-4364102

イベントの感想記事はこちら

▼「第5回CakePHP勉強会@Tokyo 東海サテライト」に行ってきました(@longkey1)
http://blog.longkey1.net/archives/902

▼東京のCakePHP勉強会を札幌でUst参加する会まとめ(@nazo)
http://d.hatena.ne.jp/nazone/20100529/p1

▼第 5回CakePHP勉強会 まとめ ~CakePHPへ貢献編~(@nycom)
http://d.hatena.ne.jp/nycom/20100529/1275116447

第5回CakePHP勉強会 まとめ ~発表された方のTwitter ID~(@nycom)
http://d.hatena.ne.jp/nycom/20100601/1275389287

▼第五回CakePHP勉強会に行ってきた(@tikitikipoo)
http://blog.cypher-works.com/?p=1159

▼第五回CakePHP勉強会Tokyoに行ってきました。(@hamichamp)
http://blog.livedoor.jp/hamichamp/archives/51445403.html

▼第5回 CakePHP勉強会@Tokyoに参加してきましたw(@leebenny)
http://d.hatena.ne.jp/bennylee/20100602

▼第5回CakePHP勉強会に参加してきました(@tkykmw)
http://wp.serpere.info/archives/1251

▼第5回CakePHP勉強会@Tokyoに参加してきました(@kazukichop)
http://d.hatena.ne.jp/kazukichop/20100602/1275493956

▼第5回CakePHP勉強会に参加いたしました。(@yashio)
http://yashio.wordpress.com/2010/06/03/%E7%AC%AC5%E5%9B%9Ecakephp%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%84%E3%81%9F%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82/

▼CakePHP 勉強会@東京(2010年5月)(@mon_sat)
http://text.tklabo.net/blog/18/cakephp-study-2010-05

▼第5回CakePHP勉強会@Tokyoに参加・発表してきました。(@hiromi2424)
http://d.hatena.ne.jp/hiromi2424/20100603/1275558884

▼第5回CakePHP勉強会メモリスト
http://pub.studio15.jp/archives/2655

▼第5回 CakePHP勉強会@Tokyo 東海サテライトを開催しました(@a24loveweb)
http://as.blog16.jp/index.php/2010/06/03/p1330

▼第5回CakePHP勉強会@Tokyoに参加してきました(@nano_eight)
http://d.hatena.ne.jp/nano-eight/20100531/1275307253

【追記】(2010/05/31)
発表者スライドのリンクを追加しました(未公開分を除く)

【追記2】(2010/05/31)
ブログ感想のリンクも追加しました

【追記3】(2010/05/31)
若干記事を修正し、ブログ感想のリンクを追加しました

【追記4】(2010/06/01)
発表者スライドのリンクを追加しました

【追記5】(2010/06/02)
ブログ感想のリンクを追加しました

【追記6】(2010/06/03)
ブログ感想のリンクを追加しました

【追記7】(2010/06/03)
スライドのリンクを修正し、ブログ感想のリンクを追加しました

【追記8】(2010/06/04)
ブログ感想のリンクを追加しました

【サーバ関連】Ktai Libraryのリポジトリ周りと公開方法を晒してみる

当方はgitの扱いに関してはまだまだど素人でして、至らない部分はあるのですが、それでも「コードを公開する」という点で興味をお持ちの方が少なからずいらっしゃると思いますし、他のご意見も聞きたかったりするので、今回「Ktai Library」周りで整備をした、ソースコードの公開方法について晒してみようと思います。

「Ktai Library」は少々特殊かもしれませんが「主にCakePHP内で利用されているライブラリ」ではありますが一応PHP全般で利用が可能な携帯サイト向けライブラリです。また、それぞれのCakePHP環境に「上書きコピー」で適用していただく方が利便性が高いと思い、CakePHPに実装した形ではなく、必要なファイルのみをアーカイブにまとめて公開していました。
ところが、当方では基本的にCakePHP内に実装した形で開発を行い、そこから必要なものを抜き出して公開イメージを作っていました。この作業が非常に面倒で、そのうちバージョン管理ミス等も起きるだろうと考え、なんとかしたい要因の一つとして前々から方法を模索していました。

それとは別に、Ktai Libraryの開発そのものもオープン化したいと考えていましたので、「ktai-dev」というプロジェクトも公開し、その複製物からKtai Libraryを生成するような仕組みが必要になってきました。共にgithabにて公開するつもりでしたので、つまりgitでバージョン管理されたものについて、いくつかの操作を行って連携していく必要があります。

そんなわけで、どうしようかとずっと悩んでいた開発環境とリポジトリ周りの構築についてようやく実用的なものが出来たので、「ktai-dev」のリリースと共に運用を始めた次第です。
まずは簡単に図にしたものをご覧ください。

ご覧の通り、gitリポジトリがた~くさんあるのですが、分散管理できるgitならではという感じかもしれません(笑)。

まず一番左はローカル環境です。自宅のデスクトップと持ち運びようのノートPCに、それぞれVMWareServerを稼働させ、VMでFedora11を動かしています。それぞれでgit によるktai-devの作業ディレクトリがあり、その右側にある非公開サーバ内にあるktai-devリポジトリに対してのみコミットしています。
ここについては、最初は非公開サーバにリポジトリを置かずにUSBメモリで作業ディレクトリを共有していたこともあるのですが、何か事故があってはいけないと思いやめてそれぞれでcloneするようにしました。また他の作業者が増えた場合にも対応に困る場合もあるので。
欠点もあり、「作業途中で続きをデスクトップとノートで行き来できない」点でUSBメモリ方式と比べて使い勝手が悪い点があります。当方は「電車開発」を常時行っていて、作業が未完のまま帰宅するのが当たり前なので。途中のままコミットするのが気持ち悪いので、仕方がないのでノートで作業を完結するようにしています(笑)。

次に非公開サーバなのですが、これは外にある専用サーバです。sshにてやりとりしています。例えば

git clone ssh://user@mydomain.com/home/user/git/ktai-dev

のように取得しておけば、次からここに対して更新を行えます。
git操作時(push/pull等)では、sshのパスワードを聞かれます。ここが面倒ですが、共有リポジトリを作るにはとても面倒な設定作業が必要になるのでとりあえずそのままです。

ここで注意するのは、サーバ内でリポジトリを作成する際、git initで「–bare」を付けないことです。何故かというと、ここに集められたコードを「KtaiLibrary」リポジトリに反映させる必要があるからです。このために、仮の作業ディレクトリを展開して実ファイルを取り出すことを行っています。
そして、必要なファイルを抜き出してKtaiLibraryリポジトリに反映させるための「デプロイツール」があります。これは単純なrmやらcpが列挙されているコマンドスクリプトです。これを叩いてファイルをKtaiLibrary作業ディレクトリに反映させます。その内容でgit commitを行い、その右のgithubリポジトリにpushします。また、ktai-devはそれで別途pushします。

ここの部分についてはもう一つポイントがあります。それは「ktai-devの作業ディレクトリを定期的に最新のものにする」必要があるのですが、自分のmasterに対してコミットが進んできたものに対して、自分に対して普通にgit checkout masterをすると、作業ファイル内に更新されたファイルがあると見なされてcheckoutがされないのです。ここで相当はまりました。結論から言いますと

git checkout -f master

で、作業ディレクトリの内容を問わずに最新のファイルが展開されます。ググってもなかなかこの情報が出てきませんでしたので、気づくのが遅すぎました(^^;。

そしてgithubですが…github内は特に何も行ってなくて、純粋な公開窓口です。多くを語ることもないでしょう。

リポジトリ公開はここまでですが、それとは別にBTSをRedmineにて行っていて、その中でgitリポジトリ(のリスト)を公開しています。これをやるためにはRedmine内にcloneをfetchする必要があり、さらにリポジトリを作っています。そして、cronでリポジトリを定期的にfetchしています(ちなみに、現在fetchを行っているのはKtaiLibraryリポジトリの方であり、図とはちょっと違います。kta-devに対して行うように修正予定です)。

現在非公開サーバ側からgithubにpushする行程は全て手動で行っています。ktai-devのpushについては当面ため込んでから行いたいというのもあるので非公開サーバ側でコマンドを叩く方式でいいのですが、KtaiLibraryに対しては、前述のktai-devに対してのcheckoutや、githubへのpushもデプロイツールに入れてしまおうと考えています。
また、Redmine側のリポジトリもある意味無駄なので、なんとか出来ないかなと思っています。github側にフックできる仕組みがあるみたいなのでそれを活用するか、そもそもgithubを見ずに非公開サーバ側で解決するべきかなとも考えています。

こんな感じで多少他のプロジェクトと比べて複雑かもしれませんが、このように別のリポジトリからの複製物に対してgit管理が出来るとか、間接的にgithub公開できるとか、多少なりともノウハウがお見せできたかなと思います。
何か他におもしろいアイデアがあるようでしたら是非教えてください!

追記(2010.05.01)
Twitterでいくつかアイデアをいただきました!
ありがとうございます。

●非公開サーバ側の.ssh/authorized_keysに公開鍵を登録すればパスワードは聞かれなくなる(@nojimageさん)
これは常識的なものでしたね。当方の技術力のなさが露呈しました(^^;;;

●「git remote add github (githubのURL)」とかすれば、サーバのコンソールからでなくてもgithubにpushできる(@kaz_29さん)
確かにその通りです。早速設定しました!