PHPMatsuriの楽しさは参加者自身です
10月 19, 2011 by yandod · Leave a Comment
参加者の写真やブログも公開されてきてまだまだ熱気が醒めやらない感じですが今年のPHP Matsuriが無事に終りました。あまりにも多くの事が頭を巡っているのですが、特に大きいものをいくつかまとめて書こうと思います。
Epic Sax Guy

参加された方で来日したGarrettの人柄とEpic Sax Guyが印象に残っていない人は皆無なのではないでしょうか。強烈に明るくオープンでひょうきんな彼のキャラクターはハッカソンの空気を支配していましたね。前回はLithiumの機能についての評判を多く耳にしましたが、今回は逆にLithiumをGarrettの人柄の話題が食っていた気がします。最新のフレームワークの機能やツールは確かに魅力的ですがそれ以上に魅力的なのはその人自身なのではと彼に会ってから感じています。そして毎日数時間はEpic Sax Guyを聞いてしまうわけです。
言葉では伝わらない体験

今年は昨年よりもさらに増えて総勢で90名を越える規模でのハッカソンになりました。初めての参加者の方も居ましたが多くの方から聞いたのが「どういうイベントなのかよくわからなかった」というものです。2年連続の参加となるSioさんも誤解していたようにハッカソンとはどういう雰囲気なのかを言葉で伝えるのは難しい所があります。
朝のあいさつでも話しましたがPHPMatsuriはヤフーが開催しているOpen Hack Day(現在は Hack Uに改名された模様)をコピーしたイベントです。画像やビデオ、文章などのさまざまな手段では伝わらない楽しさを伝える為に自分たちで開催してしまおうと思ったのがきっかけです。
実際にスタッフの1人である@shin1x1さんも「2日目のデモ発表の時間になってみてこういうイベントだったのかとわかった」と言っていました。参加者のレポートから漂う謎の熱気を理解したい方は実際に参加する事が唯一の方法なのだと思います。
参加者の力

豪華ゲストによる講演や忍者軍団、スイーツ、ワークショップと企画が目白押しですが、PHPMatsuriの本当の目玉コンテンツは参加者の皆さん自身です。参加した方それぞれが感じた楽しさは参加者が実際に開発した発表した体験そのものが中心になっていると思います。参加したけれど発表をしなかった方が「次回は発表する」と強く思う人が多いのも周囲を見ていてそれを感じているからではないでしょうか。
今年も@sizuhikoさんをはじめとしたスタッフの献身的な努力で無事にイベントを終える事ができました。まだ余韻に浸っている段階ですが今後も参加者自身の活動が中心となるハッカソン形式のイベントをさらに幅を広げて行って行きたいと思います。
参加者の皆さん、スタッフの皆さんお疲れさまでした!
※写真は@koyhogeさんと@suzukiさんのFlickrから引用しています。素晴らしい写真をありがとうございます!
Lithiumの開発がgithubに移行しそう
5月 30, 2011 by yandod · Leave a Comment
http://dev.lithify.me/lithium/tickets/view/374
独自のプロジェクト管理ツール上で開発が行われて来たLithiumですがここにきて開発をgithubに移すという提案がNateから出ています。理由としては下記の点が挙げられています。
- Lithiumを露出するいい機会になる
- 新しいデベロッパが参加しやすい
- メンテナンスしなければいけないコードが減る
CakePHPはかつては必要なプロジェクト管理やコード公開システムなどを自前で実装していましたが既存のオープンなツールに移行していっています。それと同じ流れの1つなのですが、おそらく実際にフレームワークを使って実装されたサイトの例などが増えて来たのでわざわざ例を示す必要が無くなって来たのかもしれませんね。先日のMongoDBのmeetupで発表されたようにLithiumとMongoDBを使ったサイトとしてrevjam.comやtotsy、gimmebarなど商用のものも出て来ています。
ちなみに最近は国際化とリレーションシップのブランチの開発が活発そうです。
CakePHP新春勉強会を開催しました&俳句コンテスト
1月 25, 2011 by yandod · Leave a Comment

去る2011年1月17日、渋谷のジンガジャパンさんのオフィスにてCakePHP新春勉強会を開催しました。告知から開催まで一週間弱というスケジュールでしたが50人以上の参加登録があり盛況のうちイベントを終える事が出来ました。会場を提供して頂いたジンガジャパン様に感謝したいと思います。また参加した方はご存知かと思いますが、CakePHPの勉強会は「黙ってイスに座っているだけなんてもったいない」という方針の元、会の途中から軽食+ビールが入ってグダグダになってからが本番です。
すこし映像を撮ったのですが、みなさんパーティからとてもにぎやかです。発表者、参加者の皆さんお疲れさまでした。
動画
発表
オープニング
CakePHP 2.0
Livlis
From 福岡
LT
参加者の方のレポート等
裏方をやっていると実は勉強会の内容が全然頭に入らないのですが、参加者の皆さんのブログなどでかなりフォローされていますね。
Knockin’on TechLog » Blog Archive » 「CakePHP新春勉強会 東京」参加ログ
【CakePHP】「CakePHP新春勉強会」に行ってきました | ECWorks Blog
CakePHP新春勉強会に参加した #cakephpstudy – 130単位
CakePHP新春勉強会東京でLivlisの事例をプレゼンしました …
[勉強会]CakePHP新春勉強会に参加してきました
CakePHP 新春勉強会 東京 に参加した #cakephpstudy
CakePHP新春勉強会で発表してきました – 24時間CakePHP
一日一歩 : CakePHP新春勉強会 東京に参加してきたよ!
CakePHP新春勉強会に参加してきた « hideichi.com
俳句コンテスト結果
また今回はジンガジャパンさんで開催ということでCityVilleでも使えるジンガゲームカードが当たる俳句コンテストも突発的に開催していました。俳句コンテストは以前、NYで開催されたBoxeeのイベントでやっていたのを見てパクって見ましたが、動画で見ている人も参加できてまたやってみたい企画ですね。
いくつか話題になっていた作品を紹介します。まずは@mon_satさんの作品。
もうプレゼンとかいいからビールを飲むのがメインの#cake_beerのハッシュタグが付いています。きっと近々開催されそうですね。次はビールを飲むのをがんばって我慢していた@ken_b4uさんの作品。
LTの発表も行った@ecworks_masapさんは若干やんちゃなネタ。
しかしながら圧倒的な支持を得たのはハイペースでネタを投下し続けたジェダイアイコンでおなじみの@slywalkerさんです。
公式RT、非公式RTを多数獲得していた@slywalkerさんにはジンガのゲームカード20ドル分を進呈します。おめでとうございます!
このエントリ内でのツイートの引用はTwitter Blackbird Pie WordPress Pluginを使ってみました。凄く便利なのでツイートを引用するブログを書く時にはおすすめです!
[和訳]Lithium0.9.9リリースノート
11月 8, 2010 by yandod · Leave a Comment
PHP Matsuri以降、実は一度ブログの更新がありましたが、自分の事が書いてあったので照れくさくて翻訳していません。そして立て続けにLithiumの新しいリリースの知らせがありましたので和訳を作成しました。文中に出てくるスタートアップにはセキュリティの権威、Chris ShiflettさんやPHPのUnicode実装に奮戦していたAndrei Zmievskiさんが在籍し、さらにはSean Coatesさんが。またTostyのCTOのMitch Pirtleさんは有名CMS Joomlaの作者です。PHP界のビッグネームがこぞってLithiumを実際に使い始めているというエキサイティングな様子が見て取れます。ではどうぞ。
原文
http://dev.lithify.me/lithium/wiki/blog/Lithium-0-9-9-99-Problems-But-a-Framework-Aint-One
Lithium 0.9.9: 99 Problems But a Framework Ain’t One
ワオ、しばらくこのブログを不在にしてました。僕の時間は何処に行ったんだろう?夏の間はしようとしていた事が全て減速していました。僕自身や他のチームメンバーは新しい仕事やスタートアップの立ち上げで多忙でした。我らがプロジェクトマネージャー、GarretはSourceForge内でプロダクトリーダーにポジションに就きました。我々もこれをとても嬉しく思います。これについては近いうちにもう少しわかると思います。
また前回触れたようにいくつかのイベントを開催したり、参加してきたのでここ数ヶ月は忙しかったです。なんにせよはっきり言うと長いリリースをしないで時間が過ぎてしまいました。こういった事はもう起こしたくないとはっきり思っています。ええ、本当に済みませんでした。
それはさておき、今日は思いがけないリリース日です。ちょうど二日前にプロジェクト公開の記念日を迎えました。(以前からアナウンスはしていましたがコードとサイトが公開されたのは11月3日でした)また今日はRemember Rememberの日です。(訳注 映画Vフォーバンデッタの台詞 “Remember Remeber The 5th of November” )
また色々な事がありましたが特に前回のリリース以降、将来的には高品質なアプリケーションの為のデファクトフレームワークになる為にがんばってきました。こんな事や、こんな事やヤクの毛狩りが無いように。
立ち上げ
この8月にMongoDBを利用したトラフィックの多いプライベートセールEコマースサイト、Tosty.comが開始しました。そしてこのサイトはLithiumで構築されています。Tosty.comのCTOによるこのケーススタディの発表のビデオを見る事もできます。
また個人的に喜ばしい事として今から2週間にBrooklyn Betaというカンファレンスに参加しました。多くの人がこれについて既に記事を書いています。ここでカンファレンスについてはまとめない事にします。このイベントはAnalogとFictive Kinのジョイントベンチャーで、彼ら一人一人を個人に敬意を持っています。なのでかれらが立ち上げたいくつかのベータ版のプロダクトMapalongとGimme Barにはわくわくしました。しかも彼らは両方ともLithiumを使っているんです!
彼らのフレームワーク上での実践と優れたアプリケーションを見るのはエキサイティングでした。そしてついに完成したわけです。これらのチームからのフィードバックは今のLithiumには不可欠でした。みなさんありがとうございました。
リリースハイライト
今回のリリースは予定したものではありませんでしたが、クオリティをさらに向上させています。約400のコミットが12人の有志によって行われました。これは過去2回のリリースの3倍以上です。また過去4回のリリースの合計に匹敵するくらいの大きさです。
全ての変更を説明しても実用的ではないでしょう。ここに変更のハイライトをリストします。特にコアアーキテクチャとのやり取りに注目してみます。
Filters::apply(): Filters クラスはLithiumでメソッドに対してレイジーにフィルタ処理を行う為の新しい機構です。この新しいメソッドはまだ読み込まれていないスタティックなクラスへフィルタを適用します。例としてPOSTモデルがあり、クエリのログを取る場合はこうなります。:
use app\models\Posts; use lithium\analysis\Logger; Posts::applyFilter("find", function($self, $params, $chain) { Logger::info(json_encode(array("posts" => $params))); return$chain->next($self, $params, $chain); });
このフィルタはブートストラップ処理の中で適用されています。よってPOSTクラスはリクエスト中で使われているかどうかに関わらず常にロードされます。このフィルターをレイジーに適用すると以下のようになります。:
use lithium\analysis\Logger; use lithium\util\collection\Filters; Filters::apply('app\models\Posts', 'find', function($self, $params, $chain) { Logger::info(json_encode(array("posts" => $params))); return$chain->next($self, $params, $chain); }); </code>
このフィルタの効果は1つ上の例と同じです。ですが、Filtersクラスを通しているため、このフィルタはPostクラスが既に読み込まれていない場合はすぐには適用されません。この場合はPostsクラスのFindメソッドが呼びだされるまではフィルタは適用されません。
Object::_instance() と Libraries::instance(): Lithiumは当初からクラス間の依存を定義する際に$_classes属性を使う規約を持っています。これらの依存関係を個別にコンストラクタで上書きする事ができます。
しかしこのインスタンス化のプロセスは少々ぎこちないものでした。クラスの名前を$_classes配列から取得し、 new $class() としていました。現在はObjectとStaticObjectをワンライナーでそれぞれの依存のキーに設定できます。また好きなパラメータも下記のように指定できます。:
class Foo { protected$_classes = array("renderer" => "app\extensions\template\Custom"); publicfunction render() { $renderer = $this->_instance("renderer", array("path" => "views/")); // ... } }
Libraries::instance() もよく似た動きをします。クラス型か Libraries::locate()のような名前を受け取り、見つかったクラスを指定されたパラメーターでインスタンス化します。
Request::accepts()によるコンテンツ認証 : Request オブジェクトはコンテンツ認証をサポートしました。認証にはHTTP Acceptedパラメーターを使います。アプリケーションの中で使われるコンテンツのタイプをMedia クラスで設定された設定をもとに返します。.
Model::update() と Model::remove(): Model クラスに2つのメソッドが追加されました。これは複数のドキュメントやレコードを一度に操作できます。
MongoDBスキーマサポート: このリリースではMongoDBのスキーマサポートが改良されました。Mongoオブジェクトを簡単に記録するだけではなく、 $_schema プロパティを使ってLithiumに期待するフィールドの情報を伝えることできます。MongoIDを文字列で渡す事で自動的にMongoIDオブジェクトを生成し問い合わせや更新に使います。
APIドキュメンテーション: その他の機能の為にこのリリースには多くのAPIドキュメントがf組まれます。これらは間もなく docs pageで公開されます。(訳注、反映済み)さらにドキュメントは新しいli3_docsで提供されます。
HTTPメタデータによるルーティング: これまではルーティングはURL内のパターンでのみマッチしていました。現在は全てのRequestオブジェクトのプロパティに拡大されました。これはおなじみのRouter APIで指定します:
// Only allow POST requests to FooController::create(): Router::connect("/create", array("Foo::create", "http:method" => "POST")); // Allow POST or PUT:: Router::connect("/update", array("Foo::update", "http:method" => array("POST", "PUT"))); // Only match if on the dev server: Router::connect("/secret", array("Secret::index", "http:host" => "dev.application.com")); // Only match if request is over HTTPS: Router::connect("/admin", array("Foo::index", "env:https" => true));
次のリリースのいくつかの変更もハイライトしようと思います。UUIDジェネレーターを再実装したDenis de Bernardy,に感謝します。これにより複雑なコードを明らかに減らす事ができました。これによりパスワードのセキュリティに使われるコアの暗号化を改良できます。また透過的なCSRF対策もフレームワーク上に間もなく実装されます。
さらに彼と何人かの才能ある日本の開発者がそれぞれPostgreSQLのサポートを実装しました。これも次回のリリースでデビューします。
最期に TextMate pluginに小さな改良がありました。アプリケーションで使いテストを実行した後、エラーが発生した場所にTextMate上でジャンプできます。Macユーザなら試してみてください。
API changes
大きなリリースなのでいくつかの後方互換性の無い変更があります。幸いにも小さな変更なので簡単に修正できます。
- $this->render(‘foo’) の呼び出しはコントローラー内で動かなくなります。代わりにこの呼び出しは$this->render(array(‘template’ => ‘foo’))に変更してください。
- Inflector::camelize() は “_” と “-” を置換します。 (以前は “_” だけを置換していました).
- データベース設定にカスタムポートを使う場合、 “port” キーはサポートしなくなります。その代わりに “host” キーのフォーマットを “host:port”としてください。
- Model::_connection() をバックエンドを直接呼び出すのに使っている場合、このメソッドが廃止予定である事に注意してください。かわりに新しい実装である Model::connection()を利用できます。
- LithiumのG11n機構を使っている場合、CatalogAPIの2つの変更に注意してください。: read() と write() メソッドの最初のパラメータは反映したい設定の名前です。 read() の場合、 true をいつでも指定できます。こうすれば以前の実装と同じです。
簡単に移行する場合は全ての read() の呼び出しをCatalog::read(…) から Catalog::read(true, …)としてください。
write() を置き換える場合は動揺ですがやや自動的ではありません。 以前の呼び出しが: Catalog::write(‘message’, ‘en’, $data, array(‘name’ => ‘runtime’)), の場合、現在は:Catalog::write(‘runtime’, ‘message’, ‘en’, $data)となります。
What’s next?
このリリースが表に出ると、チームは次のリリースに向けて動く事に興奮しています。僕らはあと2つの大きな機能を安定版のリリース前に実装します。またいくつかの優れたプラグインがリリースの準備ができています。メーリングリストやフォーラムで沢山の質問を受けているのが、Lithiumの全てが集まっている所を探すことの難しさです。ブログやポッドキャスト、ビデオにプレゼンテーションです。僕らはちゃんと聞いています。来週のアナウンスを楽しみにしてください。
それじゃ、”remember, remember the 5th of November!” (訳注:台詞です。)
~ nate ~
-訳ここまで
久々のリリースという事で情報量が多く、3時間強も掛かってしまいました。十分に集中していたとは言えないのですが。個人的にはNateの持っている交友関係の広さや彼がPHPのコミュニティでアクティブな様子が伺えます。また彼のポストには洋楽や洋画の引用がよくありますので、理解を深めるにはこういったものも嗜むと良さそうですね。近日中の次のアナウンスを楽しみにしましょう。
Lithium0.9.5リリースノート(和訳)
5月 23, 2010 by yandod · Leave a Comment
順調に進化を続けるLithiumから例外的に0.9.5がリリースされました。今回も多くの新機能がアナウンスされています。
原文
http://rad-dev.org/lithium/wiki/blog/Lithium-0-9-5-Dont-Stop-Till-You-Get-Enough
Lithium0.9.5:止まるにはまだ早い
0.9から1週間半が経ち、Lithiumチームはバージョン0.9.5をアナウンスします。本来のリリーススケジュールに予定されていませんが、今週非常に多くの事を達成したので中間のリリースを行うことにしました。これによりコミュニティの開発者は以下の優れた機能を試す事ができます。
HTTP Auth Adapter:HTTP認証を検証できるようにする`Auth`アダプタが追加されました。`Form`アダプタと同時に利用する事もできます。標準的なログインによる同一の資格情報を持ったWEBサービスへのリクエストを認証できます。(Twitterのクライアントのような例を想定してください)
再設計されたロガーAPI:我々の最初の(そしておそらく最後の)メジャーな後方互換性の無い変更です。より直感的なインターフェースを提供する為にロガーAPIを再設計しました。設定名の代わりに優先度を指定し、それぞれの優先度に対して一つのアダプタを指定します。それぞれの設定は任意の名前を付ける事ができ、priorityキーでどの優先度にアダプタが応答するかを指定します。この柔軟性により重要度の高いメッセージを複数のログに残せます。[Logger APIドキュメント]をご覧ください。
Growlロガーアダプタ:再設計されたロガーAPIともにMax OSXでポピュラーな通知システム、Growlへのアダプタもリリースされました。(オリジナルの実装者はSean Coates)。リリースされたバージョンは、最初から外部に依存関係が無いように書き直され、高速開発に大きな助けになります。
モデル初期化処理のリファクタリング:モデルクラスの初期化処理がリファクタリングされ、大幅に合理化されました。これによりモデルクラスは`lithium\data\Model`を継承したいくつかの基底クラスを継承できます。またクラスは任意のプロパティを継承します。
リードスルーキャッシュ:通常のキャッシュ処理は2つのステップで行われます。指定されたキーを元にキャッシュが存在するかを確認し、存在しない場合はキャッシュする為の処理を行い結果をキャッシュに書き込みます。リードスルーキャッシュはこのプロセスをより直感的にします。次のコードを例を考えます:
1 2 3 4 | $id = $this->request->id; $user = Cache::read("storage", "user.{$id}", array('write' => function() use ($id) { return array('+2 days' => serialize(User::find($id)->data())); })); |
キャッシュキーが存在しない場合は、渡された関数が呼び出され返されたデータは、キーに保存され、返す値のarrayのキーキャッシュの有効期限として使用します。このインターフェイスを使用して、キャッシュのチェックとセットを1度の処理で行えます。
ベンダライブラリのための新しいソース管理:我々は、デフォルト配布用に2つのディレクトリを追加しました:`libraries/ _source`と`app/libraries/_source`です。これらのディレクトリはあなたが外部のライブラリをコピーするかチェックアウトし、より簡単にアプリケーションと同期させる為に作られました。外部ライブラリを`_source`ディレクトリに配置した後、実際にソースコードを含むディレクトリを`libraries`ディレクトリとしてsymlinkできます。
たとえば、私はアプリケーション内でいくつかのPEARクラスを利用しています。私の現在の設定は次のようになります:
1 2 3 4 5 6 | Libraries::add("PEAR", array( "prefix" => false, "includePath" => true, 'path' => LITHIUM_LIBRARY_PATH . "/PEAR/pear/php", "transform" => function($class) { return str_replace("_", "/", $class) . ".php"; } )); |
実際のPEARのソースコードは`PEAR/pear/php`内にネストされています。これは醜いです。その代わりに、`PEAR`ディレクトリを`app/libraries/_source`の中に移動し、`app/libraries/_source/PEAR/pear/php`から`app/libraries/PEAR`へのsymlinkを追加しました。これで設定を下記のようにシンプルに変更できます:
1 2 3 4 5 | Libraries::add("PEAR", array( "prefix" => false, "includePath" => true, "transform" => function($class) { return str_replace("_", "/", $class) . ".php"; } )); |
PHP 5.3の標準的なネーミングに従っているライブラリの場合は、その差はさらに歴然です。例えば、PEAR2の場合はシンプルに
Libraries::add('PEAR2');
とするだけでインポートできます。
この規約によって複数のバージョンのライブラリをsymlinkの切り替えだけで透過的に変更できるというメリットもあります。この規約は、Paul M. JonesのSolarPHPプロジェクトに触発されました。
MongoDB条件演算子:我々はMongoDBのネイティブなクエリ演算子を常にサポートしてきました。さらにSQLスタイルのクエリ演算子のサポートを追加しました。標準クエリの構文を使用する例:
1 2 3 | Article::find('all', array('conditions' => array( 'expires' => array('>' => time()) ))); |
これは自動的にネイティブなMongoDBのクエリ演算子に変換されます。これはMongoの(素晴らしい)構文を単に置き換えるものではなく、プラグインの開発者に対して様々なデータソースで動く抽象的なクエリを書く手段を提供する事と新たに非リレーショナルデータベースに興味を持つ開発者や既存のアプリケーションの移植へのバリアフリーも目的にしています。
最後に全てのチームメンバーに感謝しています。特にジョンアンダーソンに、我々のドキュメントリードは、我々は、新しいAPIドキュメントを大量に追加してAPIを100%カバーするという目標の目前にまで来ています。変更履歴、または新しいAPIドキュメントを閲覧するか、新しいリリースをダウンロードしてお楽しみください!
~Nate~
–翻訳ここまで
1週間半で大きな進展が会ったことが伺えます。特にNoSQLなデータベースを透過的に扱う技術は多くの人にとって有益ですし、キャッシュの実装をクロージャを使って簡単にする例などは示唆に富んでいますね。ログをGrowlにながすというアイデアも秀逸です!
Lithium0.9リリースノート(和訳)
5月 23, 2010 by yandod · Leave a Comment
ちょっと作業時間が取れなかったので大幅に遅れてしまいましたが、Lithiumの0.9のリリースノートの和訳です。すでに0.9.5が出ていますのでそちらも追って和訳している所です。また末尾で触れられているTekXでのセッションも見てきました。同じ内容のセッションを近日中にustreamで中継する事を相談しているので近々お目にかけられるかもしれません。
原文
http://rad-dev.org/lithium/wiki/blog/Lithium-0-9-The-Lambdas-are-awesome-Edition
Lithium0.9 ラムダは素晴らしいエディション
私はLithium0.9を迅速にリリースできた事にとても興奮しています。[今すぐダウンロード!]。0.8からの3週間で、私たちに1.0にかなり近いところまで来ました。いくつかの新機能が含まれます:
ErrorHandler:`ErrorHandler`クラスは、アプリケーション全体のPHPのエラーと例外をキャプチャして処理するための高度な設定を提供します。その革新的なデザインは、エラーを型(エラーまたは例外)を含む様々なパラメータ/例外を捕捉することができます。エラーコード、例外クラス名(継承関係を含む)、エラー発生元のクラス名メソッド名のバックトレースも含まれます。
あなたは0.9にアプリケーションを更新する場合は、今すぐ次の例を試すことができます:
アプリケーション内に新しい設定ファイルを作成します。`config/bootstrap/error.php`をブートストラップからincludeしてから以下を追加します:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | /** * First, import the relevant Lithium core classes. */ use \lithium\core\ErrorHandler; use \lithium\analysis\Logger; use \lithium\template\View; /** * Then, set up a basic logging configuration that will write to a file. */ Logger::config(array('error' => array('adapter' => 'File'))); /** * Configure an error page renderer function that we can use to render 404 and 500 error pages (for * this part to work, you need to create errors/404.html.php and errors/500.html.php in your views/ * directory). */ $render = function($template, $content) { $view = new View(array( 'paths' => array( 'template' => '{:library}/views/{:controller}/{:template}.{:type}.php', 'layout' => '{:library}/views/layouts/{:layout}.{:type}.php', ) )); echo $view->render('all', compact('content'), compact('template') + array( 'controller' => 'errors', 'layout' => 'default', 'type' => 'html' )); }; /** * Finally, wire up the error configuration. The first rule captures any exceptions where the * message matches one of the given regular expressions: eitheer a template or controller wasn't * found. In either case, render a 404. * * For all other exceptions, log them to the error log, and show the user a 500 error. */ ErrorHandler::config(array( array( 'type' => 'Exception', 'message' => '/(^Template not found|^Controller \w+ not found)/', 'handler' => function($info) use ($render) { $render('404', $info); } ), array( 'type' => 'Exception', 'handler' => function($info) use ($render) { Logger::write('error', "{$info['file']} : {$info['line']} : {$info['message']}"); $render('500', $info); } ) )); /** * Last but not least, tell the ErrorHandler to start capturing errors. */ ErrorHandler::run(); |
これで、あなたは完全にカスタマイズ可能なエラー管理ソリューションを即座に利用できます。ハンドラはエラーに対して独自に対応を行えるようにします。通常これは、それらをロギングしエラーページをレンダリングするという事になるでしょう。
永続的パラメータ:多くの拡張機能の中で永続的なパラメータを追加しルーティングします。新しいルートを設置すると、あなたはルートがマッチした際の引数のリストを指定することができ、このリクエストの間は永続的に利用され後続のリンクでも使用されます。これらの2つのルートを考えてみましょう:
1 2 3 4 | Router::connect('/admin/{:controller}/{:action}', array('admin' => true), array('persist' => array( 'admin', 'controller' ))); Router::connect('/{:controller}/{:action}'); |
さて、サイトのadminセクションを参照すると、生成された全てのリンクが永続化したプロパティを継承しています:
1 | <?=$this->html->link('Add post', array('controller' => 'posts', 'action' => 'add')); // links to /admin/posts/add ?> |
パラメータを無効するには、単に`null`を対応するキーの値に渡す:
1 2 3 | <?=$this->html->link( 'Add post', array('controller' => 'posts', 'action' => 'add', 'admin' => null )); // links to /posts/add ?> |
ルートハンドラ:最も重要な新機能、ルートハンドラを使用すると、アプリケーションから直接のルートにコントローラロジックを実装することができます。これにより、いくつかのクールな実装や、小型で高速マイクロアプリケーションを実現できます。以前このプラグインはフレームワークの外部でしたが、この機能はコアに移動されているアプリケーションから直接利用できるようになりました。この単純な例を考えてみましょう:
1 2 3 4 5 6 7 8 9 10 11 | use lithium\action\Response; use \lithium\net\http\Router; Router::connect('/hello/{:name}', array('name' => null), function($request) { $name = $request->name ?: 'World'; return new Response(array('body' => "Hello {$name}!")); }); Router::connect('/redirect', array('name' => null), function($request) { return new Response(array('location' => '/')); }); |
このルーティングでまず注意する点はルートハンドラーは全てのフレームワークの処理をバイパスして直接、Responseオブジェクトを返してレンダリングする事です。またハンドラは$requestパラメータを返し、処理を通常どおり継続することもできます。最初の例では /hello にアクセスした際に誰かわからないユーザへのあいさつ、”Hello World!” を画面に書いています。または`/hello/Nate`にアクセスし `{:name}`パラメータがURLで指定されたな会いは”Hello Nate!”と表示します。
2番目の例では`/redirect`へのリクエストをキャプチャし、ハンドラはブラウザを別ページへリダイレクトするResponseオブジェクトを返しています。Responseオブジェクト(また、コントローラのプロパティとしても使用可能なオブジェクトです)では、レスポンスがブラウザに返される方法を直接コントロールします。
テンプレート変数展開:コミュニティの一部の開発者が明示のテンプレートを作成したいので、テンプレート変数をアクセスするための代替構文を実装しました。また $titleというテンプレート変数は $this['title']としてアクセスすることも出来るようになりました。
また、このテンプレート変数の展開を無効にするオプションもあります。設定に`extract`パラメータを追加することによって、我々は簡単に通常のテンプレート変数を無効にすることができます:
1 2 3 4 5 6 7 8 | Media::type('html', 'text/html', array( 'view' => '\lithium\template\View', 'extract' => false, 'paths' => array( 'template' => '{:library}/views/{:controller}/{:template}.{:type}.php', 'layout' => '{:library}/views/layouts/{:layout}.{:type}.php', ) )); |
この設定を適用すると、 $this['title']は引き続き動きますが、 $titleは動かなくなります。
最後に、Joelと私は一カ月後のTEK・Xのカンファレンスで講演する予定です。我々はLithiumについての合同セッションと、それぞれコードの品質やソーシャルグラフについての講演をする予定です。今すぐ登録して、会場で会ったら声をかけてください。シカゴでお会いしましょう。
~nate~
–翻訳ここまで
機能の断片を紹介しているのでちょっとピンと来にくいかもしれません。セッションでも語られていましたが、Lithiumはアスペクト指向を実装に取り入れている部分があり、従来のスタイルのフレームワークの知識を前提にして考えると分かりづらい所があります。これらの例は全体の継承関係や処理のフローを考慮することなく、断片的な修正をクロージャなどを使って実現できるという点がすごい所と言えるでしょう。
安定版まであと2つ Lithium0.8リリース(和訳)
4月 1, 2010 by yandod · Leave a Comment
安定版のリリースに向けて着実に歩を進めているLithiumのバージョン0.8がリリースされました。
Nateから出ているリリースノートを訳してみました。
原文
http://rad-dev.org/lithium/wiki/blog/Lithium-0-8-And-then-there-were-2
Lithium 0.8 – And then there were 2
我々は最終的な安定版APIのLithiumフレームワークまで残すところ2つのリリースという所に差し掛かりました。まもなく、企業が開発に自信を持って利用できる固定されたAPIが提供されます。
しかし、我々はすでに非常に高度なアーリーアダプターを見て興奮している。リチウムの最初の(未発表の)プロジェクトを開発している由緒ある[アナログ]がそうだ。我々は彼らのインプットと専門知識の受益者であることを誇りに思う。
このリリースには多くの新機能が含まれます:
- 完全にリファクタリングされたテストスイート。テストスイートは、より柔軟な自動化ツールのサポートを改善しています。
- `Adaptable` ストラテジの完全な再実装`。ストラテジのシステムは非常に強力であり、すべての入力およびアプリケーションの出力などを広範囲に制御できます。
- 新たな戦略システムによってデータの最も安全なストレージメカニズムHMACのセッションとクッキーのデータ格納をサポートします。
- `Form`ヘルパーのHTML5のフォーム要素のサポート。
- 他の多くの小規模な機能とパフォーマンスの最適化。
API の変更
- `lithium\storage\cache::write()`のパラメータのリストは変更されました。詳細については、APIをご参照ください。
- より良い内部APIの整合性、`lithium\data\model::__init()`はパラメータを受け付けなくなります。同じ挙動をさせるには `config()`を使用するようにコードを変更してください。
現在、我々は開発者が強力なツールセットについてみることに興味を持っています。私たちは、APIを現在から1.0の間で変更しないと約束することはできませんが、我々は自信を持っているAPIのコアのほとんどは現在かなり安定して利用の準備ができています。以前のポイントリリースでは、全ての互換性の無い変更と関連するすべての移行手順と同様に完全にリリースノートに記載されます。
wikiの完全な変更のリストをチェックしたら、次にそれをダウンロードして試してみてください!
~nate
–訳ここまで
大きな変更が少なくなり、安定版のリリースが近付いている事が感じられます。またデバッグを容易にするためのツールなどの機能の実装が行われるとのことで挙動が分かりやすくなりさらに利用しやすい形になっていきそうです。今後も注目ですね。
Lithium0.7がリリースされました(和訳)
3月 10, 2010 by yandod · Leave a Comment
PHP5.3専用のもっとも革新的なフレームワークLithiumの最新版である0.7が2010年3月8日にリリースされました。今回はMySQLサポートの正式対応が追加され従来型のアプリケーションの開発が飛躍的に向上しました。またコードの再利用を進める為の内部の最適化も引き続き行われています。詳細はいつものようにリリースノートの和訳を作りましたのでそちらをご覧ください。
またGwooがOrange Countyで行ったプレゼンテーションの資料と音声も公開されているので要チェックです。
原文
http://rad-dev.org/lithium/wiki/blog/Lithium-0-7-luck-of-the-irish
Lithium0.7 Luck-of-the-irish
私たちは近づいてきたセントパトリックデーのお祝いに夢中になる前に、最新版のLithiumのリリースを準備できました。Lithium0.7は170のコミットを6人の開発者から受け取り、私たちはまた一歩の安定版のリリースに近づきました。
当初よりLithiumはドキュメント指向のデータベースをサポートし、高い比重を置いていました。私たちは依然として高速にパフォーマンスに配慮し、かつ柔軟なアプリケーションの構築と柔軟なアプリケーションの開発にはデータストレージに新しいアプローチを使用する事が大きな利益になると考えています。しかし、我々はまだ従来のリレーショナルデータベースが多くのアプリケーションに有益な事もわかっています。この目的のために、これらの機能を統合しリレーショナルデータベースを使用するために必要な大規模なサブセットをLithium0.7に実装しました。現時点ではMySQLがテストに合格した唯一のデータベース(`SourceTest`)ですが、基盤部分はSQLite3、PostgreSQLなどのその他のデータベースにも適用できます。すでにMSSQLの作業は進行中で、[li3_mssqlプラグインとして進行中](http://rad-dev.org/li3_mssql/wiki)、もちろんこのデータベースや他のデータベース実装へのコントリビューションは大歓迎です。
また、SQLをサポートする為に`Adaptable`クラスに計画的な実装をLithium0.7で追加しました。計画はどのようにデータが転送され、アダプタに適用される変更を抽象化して提供します。たとえば、あなたが`Cache::write()`を使用してデータを保存し、`Cache::read()`てデータを取り出したいとします。この機能は、コアに含まれている`Serializer`という計画を通じて簡単に実現できます。`Cache`アダプタに対するインターフェイスは`Base64`、`Json`、`Serializer`が実装済みです。また`Adaptable`のそのほかのサブクラスに対するストラテジーは実装中です。
ChangeLogを見てもらえれば(http://rad-dev.org/lithium/wiki/releases/0_7)、g11nのいくつかの大きな改善とテストのカバレッジの向上がした事がわかるでしょう。
いくつかの名前空間とブートストラップのプロセスは、アプリケーションのコア機能を委任しやすいように改良されました。いくつかの変更は、以前のリリースとの互換性がありません:
- Dispatcher::run() `Request`オブジェクトが最初のパラメータとして必要になりました。`webroot/index.php`を見てください。
- プラグインをすぐに他のライブラリと同じようにできます。app/libraries内の”plugins”ディレクトリが削除されています。現在はプラグインの追加はライブラリの追加と同じように行います。例 `Libraries::add(‘li3=docs’);`
- 新しいBootstrapファイルと`bootstrap/action.php`の代替の`switchboard.php`の除去。
- bootstrap/libraries.php内の `Libraries::Add(‘app’, array(‘default’ => true));` はあなたのアプリケーションを ‘default’ ライブラリとして提供します。
- `Connections` はconnections.phpを読み込まなくなりました。有効にするには`config/bootstrap.php`で設定してください。
- `Connections::add()の`は現在2つのパラメータを受け取ります。`config/bootstrap/connections.php`を参照してください。
PHP 5.3およびLithiumに関する2時間のプレゼンテーションをここで読めます。(音声あり):http://lithify.me/presents
我々は、高速開発のスケジュールをイテレーションフライデーと共に進めてきました。私たちは減速するつもりはありません。予定どおり安定版は2010の初夏にリリースできるでしょう。
うまくいけば、このプロジェクトの成功はプロジェクトに関わる全ての人にとってエキサイティングなニュースになるでしょう。いつものように、われわれはどんな形のコントリビューションも大歓迎で待っています。
〜gwoo
–翻訳ここまで
MySQLなどの従来型のデータベースがサポートされましたが、ドキュメント指向データベースこそが高速で柔軟なアプリケーション開発をもたらすという強い意志が伝わってきます。かつてCakePHPなどが流行り始めた際はDRYなフレームワークこそが高速開発を実現する事を世の中に示したと言えますが、時代は次のステップに向かっていますね。Lithiumは単なる新しいフレームワークではなく、こういったパラダイムシフトを提唱しようとしている事が特に大事な点だと個人的には考えています。
またCakeやsymfonyなどの近代的なフレームワークではプラグインなどを利用した拡張が提供されていますが、なかなか共通部分をプラグインに切り出せないという問題にはまりがちです。その点を考慮してか次世代のフレームワークでは実装そのものとプラグインの境界線が薄くなる方向へと進んでいます。アプリケーション自体をプラグインとして実装するとイメージすると近いかもしれません。
なんにせよこのパラダイムを体感するには実際に試してみるのが一番でしょう!
Lithium0.6リリースノート 和訳
2月 17, 2010 by yandod · Leave a Comment
PHP5.3以降専用の先進的フレームワーク、Lithiumの0.6がリリースされました。(Lithiumの基本情報はこちらの記事をどうぞ)
良好な開発体制に支えられて安定版のリリースに向けて着実にプロジェクトが進行しているようです。
いつものようにリリースノートを和訳しました。
今回は2009年10月に来日したJoelがリリースノートを記述していますね。
原文
http://rad-dev.org/lithium/wiki/blog/Lithium_0_6_Big_Improvements_A_Brewin
Lithium0.6:大きな改良の醸造
過去3週間のタイムラインをご覧になっていたのであれば、安定版にむけたLithiumの活動が押し寄せている事にお気付きでしょう。
Lithium-0.6 では後方互換性のないいくつかの変更があります。:
- 新しい最上位レベルの名前空間、`\lithium\net` が作成され、`\lithium\util\Socket`、`\lithium\util\Socket\*`、`\lithium\http` がこの新しい名前空間の下に移動しました。
- アプリケーションレベルのブートストラップ設定ディレクトリを `\app\ config\bootstrap` に作成。これはあなたにあなたのブートストラップシーケンスをより小さく、論理的な塊に分割することができます。そしてこれらはすべて、自動的にロードされます。
- すべてのプラットフォーム用のコンソール出力にカラー表示をサポート。POSIX互換性のあるエスケープ文字をサポートします。
- ほとんどの`li3`コマンド(`test` コマンドも含まれ、、テスト結果を緑赤で表現)で重要な情報をハイライトされカラーで出力されます。
- テンプレート層の完全な見直しを行いました。カスタムストリームクラスは今後はレンダリングに使用されません。APCとうまく動作するテンプレート層の為です。ビューテンプレートはコンパイルされて `app/resources/tmp/cache/templates/`に格納されるようになりました。古いバージョンからアップデートを行う場合は、このフォルダパスが存在している事を確認してください。
- マイナーなキャッシュの愛をLibrariesを `app/config/bootstrap\cache.php`。(ロスのないフィルタとして)
- 適切なロケールをアクション、コンソールへのリクエストから検出する機能の追加
- G11nの環境設定を一元的および世界的に有効なロケールの切り替えの導入。
- g11nのいくつかの名前とメソッドのシグネチャを、より合理的なAPIに変更しました。
- `Cache`アダプタのほとんどのAPIの変更:
- MemcaceとAPCキャッシュアダプタでのマルチキーのサポート(どのメソッドがこの機能をサポートするかはドキュメントを見てください)。
- `Cache::write()`からのキー生成時の不要な’\_expires’キーの削除。今後はキャッシュキーを汚染しません。
- 改善されたドキュメントとテストなど。
Lithiumのハッキングから離れて、我々はいくつかの非常に有用なフィルタシステムのユースケースを管理しました:
上記のような基本的な変更がありましたが、Lithiumのコア部分は確かな状態です。さらに新たな機能は毎日のように追加されています。われわれはフィニッシュライン中間地点より先を通過し、勢いはさらに増しています。
*[変更履歴](http://rad-dev.org/lithium/wiki/releases/0_6)
*[ダウンロード 0.6](http://rad-dev.org/lithium/versions)
最新の開発状況は[Rad-Dev](http://rad-dev.org/lithium)をご覧ください。[APIドキュメント](http://lithify.me/docs)、IRCチャンネルは`irc.freenode.net`上の`#li3`と`#li3-core`です。
〜jperras
—訳ここまで
国際化対応やビュー、コンソールのカラー表示など出力系の変更が多く入っているようですね。ビュー層の変更がどのようにAPCを考慮しているかなどは実際に動かしてみながらみるのがよいでしょうか。次回のリリース(3/8)ではMySQLやキュー、初期画面などが追加・改良されるようです。ますます楽しみですね。
Lithium0.5がリリースされました!(和訳)
2月 1, 2010 by yandod · Leave a Comment
最も軽量で拡張性に優れたフレームワーク、Lithiumのバージョン0.5がリリースされました。1.0リリースに向けて折り返し地点と言った所ですね。リリースの速度が速すぎて翻訳する方もちょっと大変ですが、喜ばしいニュースですのでお伝えしたいと思います。
原文
http://rad-dev.org/lithium/wiki/blog/Lithium_0_5_half_way_there
Lithium 0.5, half way there.
Lithiumチームはバージョン0.5のリリースを喜んでお知らせします
バージョン番号から見ると、我々はLithiumの最初の安定版に向けた折り返し地点にいます。Lithiumチームは着実な3週間毎のリリースを続けます。またイテレーション・フライデーが助けになるでしょう。
このリリースにはいくつかの新機能が含まれます:
- apps/plugins/extensions を管理するライブラリコマンド
- モデル、コントローラー、テストをコード生成する為のコマンド
- 一般的な利用の為の国際化されたバリデータ
- 柔軟性とメンテナンス性向上の為のブートストラップの整理
- アダプタ化可能な認証API
- ビューエレメントのレンダリング
- 更なるドキュメント
- 更なるテスト
Lithiumは実際のところかなり安定していていくつかのエキサイティングな機能を含んでいます。MongoDBかCouchDBを使ってアプリケーションを開発する準備は出来ています。しかしあなたがORマッパを必要としているなら、Doctrine用のプラグインがあります。あるいはLithium上で実装されるリリースまで待たなければいけません。エクステンションやヘルパーの作成は本当にシンプルで他のフレームワークからの移植すらも簡単にできます。createコマンドを使ってコード生成をすれば開発を素早く立ち上げられるでしょう。
Lithiumチームは0.5と合わせてその他の更新をお知らせします
- 私たちは新居を見つけました: http://lithify.me
- lab.lithify.meのプレリリース。LaboratoryとLibraryコマンドはLithiumをプラグインを通じて拡張するという目的の一部です。 li3_lab プラグインによってサーバーから提供されるプラグイン・エクステンションを統合し、アプリケーション間でのコードの再利用と共有を容易にします。Libraryコマンドはアプリケーションやプラグインを圧縮・展開出来ます。またプロジェクトを始める為の基本となるアーカイブも添付しました。詳細は li3 help Library でご覧ください。
Lithiumワールドの動きは速く、さらに力強くなっていきます。お見逃しなく!
~gwoo
—訳ここまで
Lithiumのリリースが3週間毎であることが明言されました。これは前回紹介したイテレーション・フライデーで開発が着実に進んでいるとみてよいでしょう。RDBを利用するのであればDoctrineを利用するのが良いですが、MongoDBやCouchDBを使ってアプリケーションを開発するのであれば問題はないようです。実際に開発チームが運用しているアプリケーションはMongoDBやCouchDBばかりなので安定度が高まるのも当然と言えます。コードの圧縮展開などを実現するコマンドラインの進歩も目覚ましいですね。
次回のリリースは2/15ということで、試すのであればお早目に!











