http://docs.opensocial.org/display/OSD/Space+Proposal

MLでは、OpenSocial2.1 に延期ー
と見受けられますが、この仕様はおもしろいなーって思ってます。

  • コミュニティAPIをSpaceとして提供できるかも。 この仕様を中心にSNSを設計すると、コミュニティがウィジェットを持てて、アクティビティストリームもあるっていう状況になるのかな。それは楽しそうだ。
  • 1つのSNSを1つのSpaceにしてしてしまうってのはどうだ。Space自体には parentId を持つことができるので、1つのSNSをSpaceとして、それにぶら下がるコミュニティやらロケーションやら、プロフィールやらをSub-Spaceとして用意してやるといいのかも。(複数SNSの連結に役立つ?)

と、最近はShakai-jinとやらで、なかなか手を動かせぬので、思考実験にとどまってしまうわけです。非常につまらんです。

Shindig 3.0 では、Spaceにお目にかかれるかな。

こんにちは。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 使えってツッコミをう受けそうだが。)

僕の開発サーバには、いろいろ実験した成果というか
残骸的な意味で、PHP5.3 + suhosin patch に加えて suhosin extension
も入っています。

suhosinさんは、PHPのセキュリティ的な問題を解決したり、プログラマーのミスに気づかせてくれるイカしたやつです。”suhosin”は韓国語で、日本語で表すと「守護神」っていうのもなかなかクール。

しかし、ごくごくたまに(開発環境にとって的な意味で)過剰にいろいろやってくれたりもします。

今回は、 symfony-bootstrapper さんを使ってプロジェクト開始しようと思った矢先に発生しました。
こいつの使い方は balibali 先生が解説しておりますので、そちらをご覧いただければと思います。

その中で、 phar を動かす場面があります。
PHP5.3から組み込みとなったモジュールで、 Java でいう jar 的な役割です。

$ php symfony.phar

と、早速実行とやってみたところ、エラーすら出ません。
しょうが無いので syslog を見てみたら

Sep 30 02:14:17 happyturn suhosin[11234]: ALERT - Include filename ('phar:///home/kawahara/dev/symfony.phar/_cli_stub.php') is an URL that is not allowed (attacker 'REMOTE_ADDR not set', file '/home/kawahara/dev/symfony.phar', line 9)

なんかすごく、怒られています。

勘で suhosin extension を off にしてみたところ、このエラーは出ずに正常に動いたようでした。
流石は守護神ですね。

さらに、調べてみたところ

Suhosin PHAR “URL not allowed”

なる記事を発見。

どうやら、 phar は phar というスキームを使って、include するコードがあるらしく
suhosinさんは、include で URI を読み込もうとすると、チェックが働くようです。
“disallows Remote URL inclusion (optional: black-/whitelisting)” とありますね。

というわけで上の記事では phar をホワイトリストに追加しています。

ちなみに、 symfony-bootstrapper にある install_vendors.sh を使うと
console でコケます。理由は、symfony側で名前空間が変っているのに
doctrineのbeta3だと対応できていないというところにあります。