こんにちは。MA6に作品を出したよ。今年は、応募作品が500作品以上もあるらしい!すごい!!

で、僕の作品。
TabeRoulette
飯に迷った時に、ランダムに決定するための恐ろしいWebアプリです。70%くらいはネタです。
飯屋密集地帯じゃないと苦しいかもしれないです。
僕のように、優柔不断な人間が使います。

それは、さておき副産物は結構考えて作ってます。

副産知識

このアプリは symfony1.4 をフレームワークとして作られているわけです。
JavaScript のフレームワークとしては Prototype.js と script.aculo.us を使っている
ワケですが、いちいち Prototype.js やらをコピーしてバージョン管理してっていうのが
面倒なので、Google Libraries API を大活用しています。

載せてないけど、ある意味マッシュアップ。

これの利用にはAPIキーが必要なのですが、 view.yml にAPIをべた書きしてしまうのは気が引けます。

そこで、config/ProjectConfiguration.class.php
setup() で

sfConfig::set('sf_google_libraries_api_key', 'hogehoge');

などとして、view.yml では

  javascripts:
    - http://www.google.com/jsapi?key=%SF_GOOGLE_LIBRARIES_API_KEY%

としたよというお話。

なぜ、コレが出来るの??ってなるかもしれませんが、
http://www.symfony-project.org/reference/1_4/en/03-Configuration-Files-Principlesには
%XXXX% は予め定義された値に置き換えられ、setting.yml で定義された値が使える。ということになっています。setting.yml では定義しませんでしたが、sfConfigHandler は、 %XXXX% が来たときに sfConfig::has(‘xxxx’) が正なら、 sfConfig::get(‘xxxx’) に置き換えるという処理を行なっているため、sfConfig::set() をするタイミングを間違えなければ利用できます。

副産物1 – SlotColumn

このWebアプリの特徴とも言える、回るUIです。
http://jsdo.it/ooharabucyou/5oOh
誰得。

副産物2 – sfSmartphoneViewPlugin

奇跡的に、ちゃんと役に立つ可能性のあるsymfonyプラグインです。


https://github.com/kawahara/sfSmartphoneViewPlugin

スマートフォン向けテンプレートとPC向けテンプレートをスムーズに切り替える為のものです。
完全オリジナルのアイデアというわけではなく、
ウノウラボの中村さんが書いた記事「携帯とスマートフォンでsymfonyのテンプレートを切り替える 」の影響を強烈にうけています。

オリジナルの要素としては、iPhone向けとAndroid向けについて別々のテンプレートにできたり(使わなかったけど)、view.yml にスマートフォン用の設定を書く事が出来るようになることです。
そして、なによりプラグインとして用意したため、symfony(1.4)のプロジェクトに設置して、有効にした瞬間から
この機能は有効になります。

チュートリアル

独自の view クラス、 view.yml の ConfigHandler を利用していないという前提です。独自のviewクラスだったりする場合は、ちょっと弄る必要があるかもしれませんが、Apache License 2.0 で晒しておりますので、どうぞどうぞ。

また、事前に frontend というアプリが作られているという前提のお話をします。

plugins/ に sfSmartphoneViewPlugin を clone してきます

スマートフォンのテンプレート利用時は、それ専用の stylesheet と layout を使いたいので
default に stylesheets, has_layout, layout の設定行があったら削除しておきましょう。


apps/frontend/config/view.yml
に以下を追加

# スマートフォン向け設定
_smartphone:
  stylesheets: [smartphone.css]
  metas:
    viewport: width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no
  has_layout: true
  layout: smartphone

# スマートフォン以外だったときの設定
_another: 
  stylesheets: [main.css]
  has_layout: true
  layout: layout

スマートフォンだった時の設定としてある、 smartphone.css や レイアウトの smartphone.php は予めつくっておきましょう。

普通の symfony プロジェクトの場合は、 apps/*/modules/*/templates/には indexSuccess.php のようなテンプレートがあるのですが、スマートフォン向けのテンプレートを用意するときは indexSuccessSmartphone.php のようなサフィックスを付けます。
このようにすると、スマートフォンからのアクセスの場合、 indexSuccessSmartphone.php があった場合にテンプレートとして利用し、view.ymlの設定として _smartphone を事前に読みます。このため、view.yml の _smartphone に スマートフォン向けしか使わないライブラリをロードしたり meta を追加したりということが出来ます。(上の例では viewport を追加している)

テンプレートのファイルに IPhone というサフィックスを付けておくと、 iPhone/iPod からのアクセスからのときだけそれをテンプレートとして利用し、view.yml の設定として、 _i_phone および _smartphone を読みます。
Androidも同様です。
UA的には定義したスマートフォンだったけど、テンプレートファイルが無かったときは Smartphone のサフィックスがつくテンプレートファイルがあるかを確認し、あったら view.yml の _smartphone を読みます。
最終的にスマートフォンでないか、スマートフォン向けテンプレが無かった場合は view.yml の _another の設定を読みます。

今回は、 スマートフォンアクセスの場合は view.yml の _smartphone の設定は読んでもらいたいのだけど、indexSuccess.php はそのまま使いたいというシチュエーションが産まれたので、それ用の設定を用意しました。
indexSuccess のみに適用する場合は、 モジュールの view.yml で以下のような設定を追加します。

indexSuccess:
  use_smartphone_view: true

なお、パーシャルでも同様の事ができるようになってます。
スマートフォンからのアクセス時に include_partial(‘hoge’); とした場合、_hogeSmartphone.php のようなファイルがあると、それを使います。

課題としては、本当にsmartphoneというサフィックスは適当なのかってことで迷っているのと、
現状ハードコーディングで、 iPhone/iPod/Android を定義してしまっているので、
ここらへんは設定できるようにしたりしたいと思いますよ。これだけでスマートフォン対応とか言うのはあんまりなので。

とりあえず、TabeRouletteは、このプラグインがbalibali動いているので、UAをiPhoneとして偽装すれば微妙に違うコンテンツが見えるっていうことがわかると思います。

(CSS Media Queries 使えってツッコミをう受けそうだが。)

phpmatsuriの激闘から既に一週間たってしまいましたがまとめ。

Stomachache

2日目は、なぜか腹痛と戦っていました。
とはいえ、何があろうがクオリティが低かろうがLTで何かやる
ということは心に強く決めていたので、
前々から興味があった symfony-bootstrapper の話題についてやりました。

内容は、過去にブログで戦ってきた内容に symfony-bootstrapper を弄って
phar を作成するときの、詰まりポイントなどについてを話すようなものでした。

4分LTの反省としては、

  • More impact!!
  • 自己紹介とかは後のほうでよかった
  • 3分クッキング式に、これが完成物ですとかを多用
  • I should have made slide of English only.

短いながらもきっぱり伝える力を養いたいと思ったわけです。

参加してよかった

僕の中にどういう問題があって、どういう行動をするべきか
っていうのが多く見つかりつつも
楽しいイベントでした。

次回はあるのだろうか。あるのであれば、次回は発表や事後ブログも含めて
English で作成して、日本にはこんなステキイベントがあるんだぜ!
ってことを広めたいものである。逆に、素敵イベントを収集したい。

延長ハッカソン

延長ハッカソンとして、腹痛によりできなかった Symfony2 のBundle開発
を継続してやっています。
Request ・ Response の書き換えといった Tips もたまってきていますので
ちょくちょくブログでお知らせしたいと思います。

Posted in PHP.

その(2) 参加前→1日目あたり

phpmatsuri を知ったのは、PHP勉強会でした。
その中で、安藤さんがNYからSkypeでLithiumについてをやったときでした。

その時是非出てみようと思ったのです。
しかし、参加費は¥22,000と安くない上、最近卒論ばっかりで Part-time job にいっていないので、もしかしたらかなりの負担かもしれないなぁ。
というのを、一瞬思ったものの、HAHAHA参加しちゃったぜ!!もう逃げられん。
という心の中での格闘がありました。

結果的には、参加費なんぞ忘れるくらい素晴らしい経験ができました。

1日目

体調も完全でないせいか寝坊してしまい、phpmatsuriならぬ、1人phpundou-kai (PHP Sports day)
をやっている気分でした。
しかも、逆方向に走ったりで、予定よりもずっと遅れて基調講演を途中から聴くという醜態を晒してしまいました。

が、よしおかさんの講演の重要な部分は聞き逃さずに済んだかなと。
事前にTwitterでも言っていたとおり、英語と日本を両方で発表しておりました。
個人的には、下手くそでも、Simple English でもいいから英語で何か質問してやろうという気分になるような
そういう基調講演でした。 → ( http://d.hatena.ne.jp/hyoshiok/ )

正直な所、僕の英語は酷いものですが、部分部分で使い始めています。(失敗前提で)

Symfony2 Work Shop (Kris Wallsmith)

Symfony2 界隈で活躍している、KrisさんからのWork Shop ということで
翻訳なしなので、頑張って聴きつつソースコードを見つつ Symfony2 の世界を味わいました。
(途中から @mackstar が翻訳してくれましたが…)

ここで、LTでもお話した、 symfony-bootstrapper について英語で頑張って聞いてみましたが、
どうやら Kris さんはまだ知らないようでした。
しかし、なんとか伝わった…。なんとかなるもんだ…。
(結論として、何かプロジェクトを作って遊ぶとしたら Sandbox を使うべき。)

(3) へつづく

Posted in PHP.