ホーム

CakePHPの「OrderedBehavior」と「TreeBehavior」はマジで使うべき

posted 2011-12-20 |
このエントリーをはてなブックマークに追加

あまり知られてなさそうだけど、マジで便利に使えるCakePHPのビヘイビアを2つ紹介します。

OrderedBehavior

OrderedBehavior (2.1) | The Bakery, Everything CakePHP
http://bakery.cakephp.org/articles/alkemann/2008/09/21/orderedbehavior-2-1

順序を管理するビヘイビアです。Webアプリケーションを作っていると、多くの局面で、

「順序を自由に入れ替えたいんだけど...」

という機能要望が上がります。DBの仕様としては順序を振ってソートするだけでよいのですが、愚直にDBを操作しようとするとすごくめんどくさいです。順序番号の振りなおしとか、うわーやってらんねー、ってなります。

そんなめんどくさい実装も、OrderedBehaviorを使えば、超簡単にできます。

例えば「ある行を1つ上に上げる」という操作。これなら、メソッド1発です。

$this->Model->moveup($id);

もうひとつ、「ある条件でソートし直す」という操作。例えば作成日とかで一括で振りなおしとか。これも、メソッド一発です。

$this->Model->sortby('Model.created DESC', $group_id);

もちろん行が追加(save)されたときや削除(del)されたときも自動でよしなに振ってくれます。いやー便利ですね。

TreeBehavior

Tree :: Core Behaviors :: The Manual :: 1.3 Collection
http://book.cakephp.org/view/1339/Tree

ツリー構造を管理するビヘイビアです。CakePHP本体に搭載されてます。

このビヘイビア、実装内容を知るまでは、「親IDを持たせて再帰する、遅そうなビヘイビアなんでしょ…?」と思ってたのですが、ところがどっこい、再帰不要なアルゴリズムを使用した実装でした。

この実装はピンとこないときは理解するのに苦しむのですが、理解してしまえば「はっはーーなるほどー、これならインデックスが効きやすくて、MySQLでも速いわこれ!」って思います。ってか思いました。

僕の知る限りで最もわかりやすい説明が「ウノウラボ by Zynga Japan: RDBで階層構造を扱うには?」ですので、実装内容を知りたい方は、読んでみてください。

で、肝心の使用例ですが、これもまたシンプルです。

ツリー要素の追加自体は、親IDを指定して保存するだけです。

$this->Model->save(array('name' => 'new record', 'parent_id' => $parent_id));

ある要素の子孫一覧を取り出したり。

$this->Model->children($id);

ツリー内の兄弟要素での順序も操作したり。(OrderedBehavior不要)

$this->Model->moveup($id);

他にも様々な形式で一覧を取り出せたりして、便利です。

ビヘイビアを沢山知っておくとコントローラやモデルのコードがかなりすっきりするので、CakePHPに慣れてきたらいろいろ物色してみるとよいです。ビヘイビア同士の相性問題もちらほらありますが、どれか1つ使うだけなら大抵うまく動作してくれますよ。

( このエントリはCakePHP Advent Calendar 2011の19日目の参加記事です。他の方の記事もぜひどうぞ )

2011-12-20 16:13:56 | カテゴリー: 記事 | 固定リンク

iOS設定アプリショートカットアイコンサイトのまとめ

posted 2011-12-05 |
このエントリーをはてなブックマークに追加

iPhoneのWiFi設定の切り替えは、バッテリーの節約や、電界強度の弱いアクセスポイントに繋がらないようにするためにちょくちょくオンオフしたりします。でも標準の設定アプリではWiFi設定までの手数が多く、面倒でした。

そこでiOS5からは、設定アプリの画面へのショートカットをホーム画面に作成できるようになりました。ショートカットはアプリ等を利用して自作することもできますが、ショートカットを配布しているサイトも沢山あります。アイコンの種類やショートカットタイプなど様々なので、まとめてみました。

1 Click Config | ショートカットタイプ選択可、アイコン4種類

20111206183135 20111206183859
ショートカットタイプが選べる

20111206183140 20111206183149 20111206183152 20111206183154
アイコンは4種類

ショートカットタイプを自由に選択でき、アイコンデザインが4種類から選べます。設定の種類も豊富です(2011-12-06時点)。僕はこちらのサイトを使ってます。

ショートカットタイプについては以下の通り。

  • 標準:ショートカットがアプリ履歴に残ります。
  • Safari経由:Safariを経由して開きます。アプリ履歴に残りませんが、開くまでのタイムラグが大きいです。
  • プロファイル式:アプリ履歴に残らず、タイムラグは最も小さいです。ただしiOSのプロファイルとしてインストールする必要があり、多少のセキュリティリスクがあります。プロファイルについて知識をつけてから利用することをお勧めします。

iPhone Settings Shortcuts by Jeff Broderick | 設定が豊富

IMG_1590 IMG_1591

ショートカットタイプはプロファイル式(アプリ履歴が残らず、速い)で、アイコンデザインは選べるものとそうでないものがあります。設定の種類が豊富です。プロファイルに署名がされているので、ちょっと安心感があります。

iPhone Settings Short cut App | 5色のアイコン

IMG_1597 20111206184055

ショートカットタイプは標準(アプリ履歴が残るタイプ)で、アイコンデザインが5色から選べます。設定の種類は少なめで、厳選されている感じです。

Local IconSettings solution | 設定以外のショートカットも

IMG_1598

ショーットカットタイプはSafari経由(アプリ履歴が残らない)で、アイコンデザインは1種類。。設定アプリ以外(電話等)へのショートカットも豊富にあります。

JJWorkshop iOS ToyBox

IMG_1599

ショートカットタイプは標準(アプリ履歴が残るタイプ)で、アイコンデザインは1種類。設定の種類は普通です。

理想はWiFiのオンオフなどは1タップで行えるようになることですが、設定アプリへのショートカットを用意するだけでも大分手間は軽減されますよ。

更新履歴

2011-12-05 16:09:59 | カテゴリー: レビュー, 記事 | 固定リンク

GREEの探検ドリランドで強烈なサンクコスト体験をした

posted 2011-10-26 |
このエントリーをはてなブックマークに追加

探検ドリランドをやってみた

ソーシャルゲームをまともにやったことが無かったのですが、CMバンバン出てるし周りでもやってみたという人が多かったので、GREEの探検ドリランドをやってみました。

IMG_1240

無料でどこまで楽しめるのか試したかったので、簡単には課金しないユーザーとしてやってみたのですが、ある時点でどうしても課金したくなった話です。

時間制限のあるボス戦

ゲームを進めていると「キング」というボスが頻繁に登場します。自分だけで倒せる強さのキングもいれば、仲間の助けを借りたりアイテムを駆使しないと倒せないキングもいます。(というか無料ユーザーとしてやってると後者の場合がほとんどになります)

IMG_1243

キングには何度も挑戦でき、キングへのダメージは蓄積されます。ただし時間制限があります。2時間とか、短い時は40分とか。こちらの体力も戦うたびに減るのですが、時間によって自動回復します。この自動回復量と、仲間からの協力を計算して、時間制限内に倒せそうかどうかを考えるのが、結構、楽しいです。

倒せるかどうか微妙なラインのボス

そして、ちょっと制限時間内に倒せるかどうか微妙だなーみたいなキングと遭遇したときのことです。挑戦してみたところ、時間内ではとても倒せそうにありません。仲間からの協力もありません。そこで、体力を回復するアイテムを使うことにしました。

アイテムを使って倒そうとしてみるが...

このアイテムはゲームを始めるとすぐにいくつか貰えます。でも、進めていくとランダムではほとんど貰えなくなるので、結構貴重です。そして、このアイテムは課金アイテムとしても販売されています。1個で100円です。

IMG_1244

手持ちのぶんでなんとか倒せそうだったので、アイテムを使って体力を回復し、再挑戦します。しかし、あと一歩のところで倒せず、手持ちも尽きてしまいました。計算ミスです。

実は、キングはダメージを受ければ受けるほどこちらへの攻撃が強くなっていくので、倒せそうと思っても意外に倒せなかったりして、計算することが難しいのです。この仕組み、すごくうまいですねぇ。

倒せなかったら損…?

アタマを使い、時間をかけ、課金アイテムとして販売されているものを使ったことで、もしこれで倒せなかったときを想像すると、すごく損した気分になるだろうなあ、、、と思いました。キングを倒せなかったときは何も残りません。

ですが一旦立ち止まって考えてみると、「これって本当はサンクコスト(埋没費用)で、分けて考えないといけないよなあ」と思いました。

でもこれはゲームなので、サンクコストを意識する必要があるかは人それぞれですけどね。「ひゃー、損しちゃうー!」って感情もゲーム要素として楽しんじゃえばそれまでですし。

そして課金ユーザーへ

これまで課金しないユーザーとしてやってきましたが、ああこれが課金どきかーと思ったので、体力回復アイテムを購入し、キングを倒すことができました。たいしたカードを手に入れることはできませんでしたが、なぜだかホッとしました。

人は得るものよりも失うものへの執着が強いので、この手法は課金への動線としてとてもうまいと思いました。他にもいろいろと課金したくなる要素はあると思いますが、きっとどれもうまくできているのだろうなあ…。

2011-10-26 13:21:10 | カテゴリー: 記事 | 固定リンク