Amazon Campaign

2013年10月6日日曜日

FuelPHP を Google App Engine for PHP で動かす

FuelPHP を GoogleAppEngine for PHP (gae)で動かしてみました。

※2013/10/14 ひとまずデプロイして動作するようになったので記事を更新しました。
※2013/10/16 log出力パッチを公開しました。

環境

GoogleAppEngineLauncher(GAEの開発環境)が Webサーバも兼ねているので Apache は不要です。


  • OSX 10.8.5
  • GoogleAppEngineLauncher 1.8.5
  • PHP 5.4.20
  • FuelPHP 1.6


まずは環境定義をします


GAE にデプロイすると当然 URL がローカルとは異なりますので、とりあえずローカルとデプロイ先で環境を切り替えるように定義しておきます。ここではローカルを "development" デプロイ先を "production" とします。Fuel はサーバ変数 "FUEL_ENV"  の値で切り替えられます。GAE の場合は app.yaml で定義可能です。

env_variables:
  FUEL_ENV: 'production'
#  FUEL_ENV: 'development'


app.yaml でリクエストをハンドルする


FuelPHP は全てのリクエストを /public/index.php に処理させる仕組みとなっているので、/public/assets 配下へのアクセスは静的ファイルとしてアクセスさせる必要があります。
そのハンドリングを標準では Apache の .htaccess で行いますが Google App Engine では、それをアプリケーション設定ファイルである app.yaml の handlers で指定してあげます。同様に favicon.ico についても静的ファイルとして設定します。


handlers:
 
# assets dir
- url: /assets
  static_dir: public/assets
 
# favicon file
- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico
 
# php files
- url: /.*
  script: public/index.php


ローカル環境ではこれだけで動いてくれるのですが、GAE に上げると色々あり、以降の設定が必要です。

localでの起動画面
ローカルでは動くのですが。。。


base_url を設定する



GAE に上げた際の URL を定義します。production 環境でのみ有効となるように、production 用の設定ファイルである下記ファイルへ定義します。必要な項目のみ差分で定義できます。


/fuel/app/config/production/config.php

'base_url' => 'http://{your_app_id}.appspot.com/',


logファイルは出力できないのでパッチを作りました


GAE 上ではlogファイルの出力は行えませんので、下記設定で出力しないようにすることで回避は可能です。

/fuel/app/config/production/config.php

'log_threshold'    => Fuel::L_NONE,


ただ、これでは実用的ではありませんので Fuel の Logクラスを改修して、GAE でログ出力を行うためのパッチを作成しました。単純に /fuel/core/classes/log.php のファイル出力部分を syslog() に置き換えただけです。GitHub に公開しましたので自由に使ってください。

https://github.com/isatan/FuelPHP4Gae_patch


/fuel/core/classes/log.php を置き換えるだけで下記のように GAE のコンソールに出力されるようになります。

log をファイル出力すると 500 エラーにもかかわらず何も出力されません。

パッチをあててもらうと Fuel の log 出力も debug log も出力できます。

locale を指定する


Fuel のデフォルト locale は "en_US" ですが、GAE では指定できないようです。いくつか試したところ、Cロケールは認識してくれました。

/fuel/app/config/production/config.php
'locale' => 'C',


assets 関連ファイルは絶対 URL で指定する


どういうわけか、base_url を指定しているのもかかわらず assetes 関連のファイルを見つけてくれず、bootstrap.css の読み込みでエラーになってしまいます。assets 用の設定ファイルに下記の設定することでエラー時に強制実行させることができますが、それでは link タグを出力してくれません。

 /fuel/app/config/production/asset.php


'fail_silently' => true,


仕方がないので view ファイルでの assets 関連ファイルの指定は絶対 URL で指定することにします。

/fuel/app/views/welcome/index.php

echo Asset::css('http://{your app id}.appspot.com/assets/css/bootstrap.css');



動きました

これで FuelPHP の welcome 画面は表示できるようになりました。ここで修正した app.yaml, config.php, log.php は GitHub に上げてありますので自由に使ってください。

https://github.com/isatan/FuelPHP4Gae_patch

ただ、assets ファイルの指定はいただけないので今後なんとかしたいですね。


ようやく appspot.com 上でも Welcome! が拝めました。


2013年10月5日土曜日

FuelPHP まとめ

仕事で利用したPHPのフレームワーク「FuelPHP」がとても便利だったのでコツをまとめておきます。順次以下を項目を予定。




2013年10月4日金曜日

FuelPHP 実行したSQLクエリをdebugログに出力する

FuelPHPで実行したSQLをログに出力する場合、DB::last_query() を使います。最後に実行したSQLが取得できるので、Model内のクエリメソッド内で出力させるといいですね。
$result = DB::query("select * from productusers where product_id = $product_id", DB::SELECT)->as_object('Model_Productuser')->execute();
Log::debug('[sql:'.get_called_class().']'.DB::last_query());

2013年9月7日土曜日

グアテマラ戦 ドン引き相手で得るものはあるのか?

2013年9月6日のグアレマラ戦。
ドン引きな相手との試合はつまらないと改めて思う。敵陣で長い間パスを回してはフィニッシュの際にブロックされるか精度を欠いてゴールを外すことの繰り返し。

完全に引いてしまっている相手に対して、押し込んで同じペースで攻めているのではこなることは当然せす。
あえて相手にボールを持たせて攻めさせるとか、大きなサイドチェンジを徹底するとかチームとしての戦術が必要で、そういうことを監督が授けなかればんらないと思うのですが、ザッケローニにはそういうことは期待できそうもありません。
改めてザッケローニの監督としての資質に疑問を持たずにはいられません。

ザッケローニの選手選考に注目が集っていますが、一方的な展開で変化のない試合において、はたしてどれだけ選手の評価が行えるのか疑問です。そもそも、これだけ力の差がある相手とホームで試合をする価値は収益以外にあるのでしょうか。

いちサッカーファンとしてもう少し楽しめる試合を観たいと切に思います。

2013年8月15日木曜日

豊田を投入したものの意図持たぬザック ウルグアイ戦

ウルグアイ戦、「融合」と言いつつ招集していない前田の代わりに柿谷がトップに入っただけで、それ以外は何も変わっていないスタメンに少なからず驚かされました。問題視されていたディフェンス陣すらも。ある意味ザックらしいといえばその通りなのですが。

また、選手交代で何らかの意図が見えないのも相変わらず。特に後半、せっかく豊田を投入したにもかかわらず、選手たちはそこを意識して使おうとする意図は全く見えず、監督から何の指示も与えられていないことは明白でした。
そうなると残念ながら、どこかのサッカー番長が言っているように「引き出しの少ない」「交代がことごとく下手」な監督としてしか観れません。

「ここはらは世界モードへのシフトだ!」と言って出し惜しんでいた引き出しの中身をドーンと見せてくれるような、ボクらの期待を裏切るようなことは。。。ありそうもないですね。
せめて田中さんを呼んでくれるぐらいはして欲しいと淡い期待を抱きつつ、9月の試合を楽しみにしたいと思います。

2013年8月8日木曜日

2013年8月14日 ウルグアイ戦予想スタメン

楽しみな8月14日 ウルグアイ戦のスタメンを予想してみたいと思います。
ボクはドーハの悲劇から今まで、20年あまりサッカーを観てきましたが正直あまり語ることが出来ません。
せっかく好きで毎回観戦しているのだから「多少はウンチクを語れるようになりたい!」そんな思いで少しずつ記事を書いてみようと思います。

ウルグアイ戦 予想スタメン
注目はもちろんCFの豊田です。今回前田が選出されていない以上、柿谷か豊田になります。世論的には柿谷なのでしょうが、ここはかなりの確率で豊田と読みます。やはりザック・ジャパンは香川、本田、岡ちゃんの超攻撃的OMが一番の売りです。その3人を生かすためには、前線で体を張ってなおかつスペースも作れるというのが条件となり、その能力を備えた前田が点を取れていなくても今まで使われ続けてきました。
その能力を備えて、なおかつ自分で点も取りにいける強くて泥臭い(褒めてます!)豊田がうってつけ!
正直、いまのザック・ジャパンには残念ながらジーニアスのポジションはありません。今回の選出は世論向けの選出、協会からの強い要望が影響していると読みました。

MFの東アジア組は残念ながら会見でもザックが「若い選手にはこの代表に入ってすぐに活躍どうこうというよりも」と言っているので同じ時間を過ごさせて代表に慣れさせるのが目的でしょう。

CBの森重はコンフィデの吉田があまりにも頼りなかったからきっと換えたいのでは。

個人的には田中さんを熱望しているのと、東アジア組でかなり効いていた徳永が呼ばれていないのが非常に残念です。ボクは東アジアカップでの徳永の活躍に誰も触れていないのが納得できておりません。

さて実際のスタメンを乞うご期待。

2013年7月24日水曜日

Java屋が日曜プログラミングでiPhoneアプリを開発してわかったこと

ネイティブに使える言語はJavaだけのボクがiPhoneアプリを開発してみてわかったこと。

開発にはお金が掛かる

開発にはお金が掛かります。皆さんご存知の通り Appleの開発者登録 "Apple Developer Program" への登録に年間 8,400円(2013年7月現在)、それに加えて開発環境であるIDEの "Xcode" は最新版でないとAppleへのアプリの申請が行えません。
"Xcode" 自体は無料ですが、最新バージョンを動かすためには基本 MacOS も最新版である必要があるので OS のバージョンアップ費用が掛かります。
さらには最新版の OS を使うためにはあまりに古い Mac では辛くなるので比較的早いサイクルでの Mac の買い替えが必要になります。

開発は短く

ボクの物覚えの悪さも手伝ってダラダラと開発してしまい結局開発を始めて1年以上掛かってリリースにこぎ着けたのですが、その間に利用している EvernoteAPI が 認証方式を OAuth に対応させたため大きくバージョンアップしました。その影響で大きなブログラムの改変を余儀なくされました。

また、アプリにおける UDID (端末識別ID)の扱いについての Apple の審査基準が変更になり、それまでアプリ広告で利用されていたものが利用できなくなってしまいました。
そのため導入していた広告用 SDK もバージョンアップが必要となり新たに組み込み作業が必要となりました。

さらには Xcode もバージョンアップし、それまで UI を実装するためのツールだった InterfaceBuilder が Xcode に統合されるなどし、インターフェースが大きく変更されたために慣れるのに手こずりました。

その他にもアプリによっては iOS のバージョンアップが影響します。
こういったアプリに関連するライブラリや開発ツールのバージョンアップが頻繁に発生するため、開発期間が長くなればなるほど本質ではない部分で余計な作業が発生してしまいます。開発期間は短くした方が効率的です。

やっぱりメモリ管理は意識が必要

Java のメモリ管理はガーベージコレクションがやってくれますが、iOS での Objective-C はやってくれません。キチンと意識して実装していなかったボクは当然のことながらデバッグ時にクラッシュ頻発で苦労させられました。
初めてアプリ開発を行う際は Objective-C の参照カウント方式のメモリ管理をキチンと勉強してから実装しましょう。

MacBookAir2010でも開発できる

当然ですが "MacBook Air" でも開発できます。しかもボクのは 2010 モデル、最低スペックのメモリ 2G です。
パフォーマンスについては開発したアプリがシンプルだったということもありますが実端末向けに最適化ビルドする際に多少時間が掛かる以外は特にストレスはありませんでした。

また、ディスプレイの解像度については MacBookAir は特に縦の解像度が 900pixel しかないので Retina の場合は iPhone4 (960pixel)でも足りません。ですが、エミュレータの設定で表示倍率を指定できるので精細な表示確認を必要としない限りは問題ありません。

表示倍率を 50% にすれば iPhone5 での表示でも収まります。

やっぱり楽しい

日曜プログラムで開発するには色々と手間やコストが掛かりますが、リリースできれば、たとえ使ってくれるユーザが少なくても自分で好きなように作ったアプリを使ってもらえるのは楽しいです。当然、アプリを育てて多くのユーザに使ってもらえるようになれば収入になるという野望も持てますしね。

以上のような苦労をして作成した「Vocablary Cards」をぜひ使ってみてください。
Evernote上のノートを単語帳として表示できるアプリです。
何かの勉強をテキストファイルにまとめているような方であれば、ほんの少しの手間で単語帳にすることができます。

Vocabulary Cards - Evernoteで単語帳 - Isao Tanji






Amazon_ad