運命のポケモン診断 ☆ キミに決めた!

運命のポケモン診断 ☆ キミに決めた! をつくった。

運命のポケモン診断

まぁやってることはただのフォーム遷移だが。

ポケモンの画像と名前をとってくるスクリプトを書いたりもした。
少し前に作ったCakePHPをjQueryMobileで拡張した、スマホページ用のフレームワークを再利用してUIはスマホ向けにしてみた。

PHP v5.3.8
CakePHP v2.0.4
jQuery Mobile v1.0.0

小ネタ

現時点でポケモンは645匹いるわけだが、性別+生年月日でユニークな一匹を導きだすロジックを考えるのはなんかパっと思い使わなかったので乱数を使った。
といっても、アクセス毎に結果が変わらないようにしたかったので、乱数だけど結果は変わらないということをした。

こうするとランダムだけど、ある一定の値下では常に同じ結果を出すことができる。
ちなみにmt_srandだと完全ランダムになってしまう。

Pocket

Posted in PHP, ポケモン, 日記.

CakePHP2.0の初期設定とcakeをbakeで焼きましょう

CakePHP Advent Calendar 2011に触発されたので、「勝手にCakePHP Advent Calendar 2011」ということにして記事を書いてみます。

お題は「CakePHP2.0の初期設定とcakeをbakeで焼きましょう」です。

CakePHPをインストール

とりあえずCakePHPを落とします。
2.0系を使いたかったので、僕がやったときの最新の安定版である2.0.4にしました。

必要なさそうなファイルは削除しておきます。

今回は http://tnnsst35.me/cakephp/ にアクセスすることを前提に話を進めていきます。
作ったcakephp直下に http://tnnsst35.me/cakephp/ でアクセスできるように移動しておきます。
※なお、実際にこのURLにアクセスしてもなにも出てきません。自分用に置き換えてください。

CakePHPの初期設定

ブラウザからアクセスするときっとエラーが続出するので直していきます。


※緑が正常。黄は警告。赤はエラーです。黄と赤がなくなればOKです。

Please change the value of ‘Security.salt’ in app/Config/core.php to a salt value specific to your application
187行目 app/Config/core.php

Please change the value of ‘Security.cipherSeed’ in app/Config/core.php to a numeric (digits only) seed value specific to your application
192行目 app/Config/core.php

Your tmp directory is NOT writable.

Your database configuration file is NOT present. Rename APP/Config/database.php.default to APP/Config/database.php
言われた通りにdatabase.php.defaultをdatabase.phpにする。

ファイルの中のDATABASE_CONFIGクラスの$defaultに利用するデータベースの情報を入れる。

エラーはすっきり消えて、セットアップ完了となる(はずです)。
もし、まだ何かエラー出ていたら調べましょう。

ページをつくってみる

アプリケーションのホームになる画面をつくります。

http://tnnsst35.me/cakephp/home/

このURLでアクセスできるようにしてみます。

何をどう書き始めたらよいかわからない人でも心配はいりません。
CakePHPにはbakeというコードのひな形を生成してくれるプログラムがついているので、bakeを使うと便利です。

これで app/Controller/HomeController.php が出来上がっています。

ただコレだけでは動かないので、HomeControllerにindexメソッドを追加してやります。

これでひとまずControllerはできたので次はViewを作ります。

もちろんbakeを使います。

View/Home/index.ctp が焼き上がりました。
と言っても中身は空なので、確認用に何か入れておきます。

ここまで終わったらブラウザからhttp://tnnsst35.me/cakephp/home/を確認してみます。
きっと「Homeだお」という文字が表示されていると思います。

ルートを変更する

アプリケーションのホームができましたね。
ただ、ホームというからには / でも /home と同じ内容を表示したいですよね。
なので / でアクセスされたときの制御を変更します。
ルーティングの設定は app/Config/routes.php の中にあります。
28行目を変更します。

http://tnnsst35.me/cakephp/ にブラウザからアクセスしてみます。
http://tnnsst35.me/cakephp/home と同じ内容が表示されるようになりました。

とりあえずこれでCakePHPを使い始めることはできるようになりました。
あとは好きにアプリケーションを作っていきましょう。

まとめ

・CakePHPのインストールと設定は簡単
・コードのひな形はbakeを使うのがオススメ
・ケーキを食べたくなる

今回やったようにCakePHPは「サーバの設定」などが特に必要なく簡単に導入できるという利点があります。

学習コストも低めだと思います。
僕自身、初めて触ったフレームワークはCakePHPでしたが、「MVC」という単語を知らなくても簡単にMVCが理解できて、コードを書くのも簡単なので初心者にはオススメのフレームワークです。
完全初心者の頃にsymfonyをやって難しすぎて気が狂いそうになった思い出があります。

巷でも「はやい」と噂のCodeigniterやFuelPHPに比べれば遅いという欠点もありますが、それなりに大規模プロジェクトでも使えると思っています。
機能がいろいろ詰め込まれているsymfonyに比べれば役不足かもしれませんが、その分無駄なものは少ないので学習コスト低めでシンプルに扱えます。
Pluginを公開してる人も結構います。

あとはアイコンがケーキなので甘党の人にもオススメです。
ケーキが食べたくなります。

おまけ

CakePHP関連のTipsといえば、元CakePHP開発者の人が立ち上げたLithiumがあったりします。
LithiumもMVCフレームワークで、以前少し試したことがあります。
PHP5.3で登場した「名前空間」がバリバリ使われていて、\hoge\foo\bar(); みたいな記述が山のようにあります。
個人的には「ちょっと見づらいな」と思ってしまって、そっと「:q!」を打ってしまいました。
※まぁこれは名前空間の恩恵をまだわかっていないから思うだけかもしれませんが。

次回はCakePHPでスマートフォン向けのページを作るのをやってみようと思う。
おわり。

Pocket

Posted in CakePHP, PHP.

PHPでCUIすごろくをつくるの巻

今年の上半期は「すごろく」のソーシャルゲームを作っていました。
特に意味はないけれど、PHPを忘れないための復習と今年の成果のひとつとしてすごろくを作ってみた。
ただし、あまり時間もないのでCUI && データベースは使わない簡易版で。

すごろくの要素を考える

すごろくにはどういった人物やオブジェクトが出てくるかを考える。
今回考えるのはシンプルに1人プレイ用だ。
・プレイヤー
・盤面
・マス
・サイコロ

すごろくの処理を考える

すごろくはすごくシンプルなゲームで、以下の感じの流れで進んでいく。
1. サイコロをふる。
2. 出た目の数だけ盤面の駒を進める。
3. 止まったマスのイベントをこなす。
ゴールするまで1〜3を繰り返す
4. ゴールする。

今回作るすごろく

・1人プレイ用。
・マスは「チェックマス(スタートとゴール)」「普通のマス(特になにも起きない)」「ラッキーマス(1マス進む)」「バッドマス(はじめに戻る)」の4種類とする。
・インタラクティブにして、それっぽいメッセージを出す。

じゃあ実際に作ってみる

今回は以下のように分けてみた。
・Sugorokuクラス 駒の現在の位置を記録して、「サイコロをふる」インターフェースを提供する。
・Boardクラス 盤面にマスがどのように配置されているかを管理する。
・Massクラス マス情報の管理とマスに止まったときのイベントを処理する。

ソーシャルゲームですごろくを作ったときもこんな構成で作っていたけど、駒の現在位置の情報はユーザーに紐づけてデータベースで管理していた。
盤面の情報やマスの情報もデータベースに入れて管理していたが、不変的な性質のデータなのでわざわざデータベースに入れておく必要なかったなを思っている。

おまけ

データベースで現在の位置を管理する場合を考える。

Usersテーブル

カラム名 その他
id int primary key, auto increment

UserPositionsテーブル

カラム名 その他
id int primary key, auto increment
user_id int
position int

UPDATE戦略

現在位置のデータをUPDATEするやりかた。
UserPositionsテーブルのuser_idにUnique制約をつけておきます。

INSERT戦略

現在位置のデータをどんどんINSERTするやりかた。
今回はUnique制約は必要ないです。

実際この2つを思いついてINSERTを採用した。
特に不自由は感じなかったし、「UserPositionsをある条件で集計してランキングにする」みたいなことをしていたので、別途ログテーブルが必要なくて楽ではあった。
こういうのはどっちが良いとか断言できるほど経験していないので、ソーシャルゲームみたいな大規模なサービスに携わる機会をつくりたいとは思っている。

Pocket

Posted in PHP.