というわけで、急にですが始めました。

http://ex.bucyou.net/op36/

技術系のアドベントカレンダーです!チュートリアル形式24回をやりたいと思っていましたが、卒論まわりでそれどころではないので最初の数回の除けばTIPS形式で24回乗り切ろうかと思います!
書きたい!!という意欲があればぜひともご連絡下さい。

で、OpenPNE3の情報を追っている人はご存知のこととは思いますが、人不足の状態が続いております。
OpenPNE 3.6.0 のリリースを 2011 年 1 月末以降に延期します

バグ修正周りを見直すだけでなく、テストなどに多くの時間を費やしていています。しかし、実際にバグ修正が出来る人がなかなかいない問題で上手くプロジェクトが進んでいません。修正したりパッチを作ってくれる人は極々限られてしまっているわけです。

この原因って、ユーザが上手く育てられていないのも1つあるんじゃないかな。これが正しい解決法になるかというのは、わかりませんが、まずはアウトプットすることにします。

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

Wikimedia Conference Japan 2010 の Tech Talk に参加してきましたよというお話。

まずは、なんと旅費なしで来日公演してくれたという、Wikimedia Foundation の Ryan Lane さんをはじめとして、楽しいテーマを取り扱ってくれた、森さん・中山さん、そして開催するにあたって活動していた方々にお礼を申し上げたい。
Thank you for the great conference!

とりあえず、気になったトピックをいろいろ述べてみます。

森さん・中山さんの講演

森さんはHadoopを使ってWikipediaのデータを解析しちゃうぜ、というお話。Hadoop初心者なので、いきなりあわわなレベルで来てしまったら理解出来ないだろうな…と思いきやすごく、分かりやすい説明でした。

Wikipediaのテキストをそのまま解析するので、複雑な記法になると解釈ができなくなる問題はありそうです。

一方、中山さんはMediaWikiの方にあるクラス群やテーブル構造を使った解析をやっていました。

双方とも、共通してデータを構造化してみるという部分がありましたが、MediaWiki自体にはデータを構造化する仕組みは現状そろっていないので、どうしても苦しいような気がしました。仮に構造化されるのであれば、新たな記法や強制的に何かを入力させるということになっていきそうですが、一方で簡単に参入できるというメリットを失うことになるかもしれません。

Ryanさんの講演

印象深いことがいろいろあったので、先にこちらをまとめる。
テーマは、「MediaWiki開発者コミュニティに参加するには」という
ことでMediaWiki開発者コミュニティにどんどん参加してくれー
っていうことを中心に話しておられた。

英語リスニングがダメダメなので、たまに聞こえるというレベルでしたが
無料イベントなのに逐次の翻訳があるという豪華な状態で助けられました。

おもにOpenPNEというOSSにかかわってしまっているという状態のため
ほかのプロジェクトのOSSに対する考え方というのは聞けてよかったです。

OSS参加についてのトピックをまとめ

  • 指導すること、されること。
  • 取り込みは素早く、リリースはどんどんやるスタイルである。(伽藍とバザールで読んだような内容だ。)
  • 議論のメインストリームはML。
  • レポジトリの取り込みは素早いが、コードチェックは慎重。
  • コミュニケーションは重要。
  • 言語の壁を恐れず参加して欲しい。

門戸は空いているので、どんどん来てくれ!!っていうのをアピールしておられました。その上で、もしやるとするならば一番深刻な脆弱性に気をつけてくれってことで、幾つかの脆弱性の紹介(SQL Injection, XSS, CSRF)をされていた。

後の質問で、テスト体制 (UnitTestなど)が質問に挙がっていて、PHPUnit や Selenium を使っているようでしたが、完全ではないです。「難しいし、大変だから助けて欲しい」ということを言っていました。
今回Ryanさんは旅費なしで日本に来てくださった上に、普段からMediaWikiにお世話になっている身としては、全然日本語化されていないコーディングルールの翻訳も含めてサポートしていきたいと感じました。 * 自分がメンテナーやっているOSSのほうも大事だけどね 🙂