CakePHPのドキュメントにpull requestした

まだ勝手がよく分からないので、とりあえずwarningつぶすのと左のメニューの並びを直すのをやりました。

https://github.com/cakephp/docs/pull/329
https://github.com/cakephp/docs/pull/330

どちらも無事に取り込まれてまずはよかったです。

もうひとつ、トップページのダウンロードリンクの追加もpull reqしたんですが、

https://github.com/cakephp/docs/pull/332

「日本語のPDFが無いよ」てツッコミが入ってしまいました。
@cakephperさんにアドバイスいただいて、いったん英語版のPDFにリンク先を切り替えました。



どうなるかなー。

CakePHPのログシステムを理解する

Cakeのログまわりはあまり使ってなかったので、調べてまとめてみました。
CakePHP 2.0のコードを元に書いていますが、1.3とか2.1とかでもだいたい同じみたいです。

ログシステムの構成

  • CakeLog
  • CakeLogInterface

の二つのクラスで構成されています。
「CakeLogInterface」は長いし意味が分かりにくいので、以降は「LogEngine」と呼ぶことにします。

基本的なログ出力方法

  1. Object::log($msg, $type)
  2. CakeLog::write($type, $message)

どちらかを使います。
Object::log()はCakeLog::write()を呼び出しているだけなので、どちらでもいいと思います。

<?php
// Object::log()
$this->log('message', 'debug');

// CakeLog::write()
CakeLog::write('debug', 'message');

ログ出力の流れ

  1. Object::log($msg, $type)
  2. CakeLog::write($type, $message)
  3. CakeLogInterface::write($type, $message)

の流れで処理が進みます。

LogEngine

CakeLogはLogEngineに処理を委譲するのみで、実際のログ出力は各LogEngineが行います。
LogEngineは、CakeLogから受け取ったログメッセージとログタイプをもとに、どこにどういうログを出力するかを判断し実行します。

デフォルトでは、ログメッセージをファイルに出力するFileLogが用意されています。

type ≠ level

CakePHPのログシステムは、ログの出力レベルについては関知しません。
ログ出力のメソッドの引数で"debug"とか"error"とかを渡せるので、デバッグレベルと連動してログ出力レベルを切り替えてくれそうな気がしますが、あくまでもただの分類(type)なのでとくになにもしてくれません。
ログを出力するかどうかの判断は基本的にはユーザーにゆだねられているみたいです。

複数のLogEngineを設定できることの意味

CakeLogにはLogEngineを複数設定できます。
しかし、CakeLogは設定されているすべてのLogEngineに対して等しくログ出力を委譲するので、特定のログタイプだけ特定のLogEngineで出力する、というような機能は、CakePHPのログシステムにはありません。
呼び出し側でも、ログ出力時にLogEngineを指定することはできません。

CakeLogとLogEngineの関係は、イベントディスパッチャーとイベントリスナーのような雰囲気になっています。

まとめ

  • CakePHPのログシステムはCakeLogとLogEngineで構成される
  • ログタイプはログレベルではない
  • LogEngineはイベントリスナーみたいな雰囲気

感想

CakePHPのログシステムはわりと簡素な作りで、デフォルトではメッセージをログファイルに書き出すだけです。
でもLogEngineでそれなりに自由に拡張できるので、もの足りないときは自分でLogEngineつくるのがいいのかなーという感じです。

なにか間違ってたり足りないことがありましたらツッコミよろしくお願いします!

気になるプロダクトなど

ChiliProject
Redmineから派生したやつ。アップデートが早そう?

CandyCane
RedminePHP移植。設置が簡単なのが魅力。REST API対応したらいろいろ夢が広がりそう。

Pivotal Tracker
タスク管理するやつ?iPhoneとかにも対応してるらしい。

Amon2
PerlのWEBアプリケーションフレームワーク。なんとなくとっつきやすそうな雰囲気。

enchant.js
JavaScriptのゲームライブラリ。ライトなゲーム作成ならネイティブアプリでやるより効率よさそう。

fluent
イベントログ収集ツール。ソーシャルゲームとかでユーザーの行動ログとるのにいいかも。

WebSocket
なにやらいろいろ夢が広がるらしいけど、あまりよくわかってない。

PhpStorm
PHPのIDE。いいらしい。

Travis CI
githubのリポジトリでCIしてくれる。

Sismo
シンプルなCIサーバ。


なんとなく「Redmineの次」というのがそろそろ来るのかなーとか思ったりしますが、どうなんでしょう。
そのへんの話を今度のRxTstudyで聴けるのかな。
個人的には手元に簡単に設置できるようなタスク管理ツールがほしくて、その点でCandyCaneには期待しています。

5.2でprivateとかprotectedなプロパティを取得する方法

5.3ならReflectionProperty::setAccessible()でいけるけど、5.2では定義されてない。

PHP Manualの下のコメントに解決方法がかいてあったので、参考にしてやってみた。
http://jp2.php.net/manual/ja/reflectionproperty.setaccessible.php#98383

対象のクラスを継承した、非公開プロパティへのアクセサを持った子クラスを生成する方法。
でもこれだと子クラスのインスタンスを毎回生成するので、対象の内部状態が変わってた場合うまく取れないと思う。

どうしようかと思ってたら、その上のコメントで「arrayにキャストしたらいいよ」みたいなこと書いてあった。
http://jp2.php.net/manual/ja/reflectionproperty.setaccessible.php#100441

こちらの記事を参考にやってみた。
http://d.hatena.ne.jp/shimooka/20090608/1244428241

いいんじゃないかと。

HomebrewでPHP 5.3.8をインストール

HomebrewでMacにPHP 5.3.8をインストールした。
このまえとちょっと手順が違っているので改めてメモ。

https://github.com/adamv/homebrew-altで本家Homebrewには含まれていないソフトのFomulaが公開されてて、PHPもある。

まずオプションの確認。

$ brew options https://raw.github.com/adamv/homebrew-alt/master/duplicates/php.rb
######################################################################## 100.0%
php
--with-mysql
        Include MySQL support
--with-pgsql
        Include PostgreSQL support
--with-mssql
        Include MSSQL-DB support
--with-fpm
        Enable building of the fpm SAPI executable (implies --without-apache)
--without-apache
        Build without shared Apache 2.0 Handler module
--with-intl
        Include internationalization support
--without-readline
        Build without readline support

続いてインストール。

$ brew install https://raw.github.com/adamv/homebrew-alt/master/duplicates/php.rb --with-mysql --with-pgsql --with-intl

CLIのPHPを切り替え。
~/.zshenv

export PATH=/usr/local/Cellar/php/5.3.8/bin:$PATH

ApachePHPも切り替え。

#LoadModule php5_module        libexec/apache2/libphp5.so
LoadModule php5_module        /usr/local/Cellar/php/5.3.8/libexec/apache2/libphp5.so
$ sudo apachectl restart

出来上がり。
PEARのパッケージとかはまた入れなおしみたい。

emo-framework日記 #2

emo-framework用のプロジェクトをXcodeで作ってみる。

プロジェクト作成

Xcodeの新規プロジェクト作成画面で、emo-frameworkの「An Application」という雛形があるのでそれを選ぶ。

次にプロジェクトの情報を入力する画面になるので、以下のようにした。

Product Name
hello-emo
Company Identifier
jp.ne.sakura.okonomi

最後に、プロジェクトを保存するディレクトリを聞かれるので、今回は ~/work/emo を指定。
そしたらXcodeのプロジェクトができた。
そのままビルドして実行したら、タッチした座標がデバッグログにてろてろ出力されるアプリができた。とりあえず動いてるみたい。

明日はSquirrelのコードをいじってみよう。

emo-framework日記 #1

iOS/Android両対応で2D特化のフレームワークを探してて、ニーズにぴったりだったので試してみることにした。

Squirrelでプログラムを記述するのが珍しい感じ。

検証項目としては

  • メモリ使用量とか
    • リソース管理の方法
  • 動作速度とか
  • テストの書き方どうやるのか
  • アプリ内課金できるのか

というところ。

インストール

サイトからアーカイブを落としてきて、適当なところに解凍。今回は ~/local/lib に置いてみた。

$ ls -l ~/local/lib
total 0
drwxr-xr-x@ 12 okonomi  staff  408  8 11 08:56 emo-framework-0.1.3-source

まずはXcode用を、インストールガイドに従ってインストール。

$ cd ~/local/lib/emo-framework-0.1.3-source
$ ./install-templates-Xcode4.sh
emo-framework template installer for Xcode 4
...creating emo-framework template directory

Installing emo-framework template
...creating destination directory: /Users/okonomi/Library/Developer/Xcode/Templates/emo-framework/libemo.xctemplate/
...copying template files
...copying runtime scripts
...copying framework files
...copying box2d files
...copying squirrel files
...copying libpng files
done!

Xcodeを起動して、File > New > New Project で新規プロジェクト作成画面を出すと「emo-framework」という選択肢が増えてる。

今日はここまで。