狠狠撸

狠狠撸Share a Scribd company logo
Kay-jpmobile
末永 匡 a.k.a. グニャラくん
       (株)wktk
開発の経緯


?   Kayでとにかく何か作ってみよう
?   掲示板サイトを作ろう
?   携帯に対応したい
?   携帯に対応するなら絵文字も対応したい
Django-bpmobile


?神




? パクろうインスパイアされよう
Kay-jpmobile命名の由来


? Django -> Kay
  ? これはいいけど


? bpmobile-> jpmobile
  ? 苦肉の策
Kay-jpmobileで
は何ができる
の?
Kay-jpmobileでできること (1)


? 推奨文字コードでリクエスト?レスポンスを扱う
  ことができる
 ? DoCoMo / au : cp932
 ? Softbank : utf-8
Kay-jpmobileでできること (2)


? ビューでキャリアの判定を行う ことができる
 ? request.agent.is_docomo() など
? テンプレートでキャリアの判定を行うことができ
  る
 ? {% if agent.is_docomo %} DoCoMo {% endif %}
Kay-jpmobileでできること (3)


? 絵文字を受け取り、保存することができる
 ? 内部文字コードとして、Google絵文字コードを採用
? テンプレートで絵文字を扱うことができる
 ? キャリアごとの絵文字、もしくは<img>タグに変換
   {{ "?U000fe000"|emoji_html_filter }}
 ? 識別名を用いた埋め込み
   {% emoji_html "BLACK SUN WITH RAYS" %}
Kay-jpmobileはスマート!?


? テンプレートでスマートにキャリアの判定を行う
  ことができる
 ? スマート…?
どういうこと?
{% if agent.is_docomo %}
 DoCoMoです。
{% else %}                     {% if agent.is_docomo %}
 {% if agent.is_ezweb %}        DoCoMoです。
  EZWebです。                     {% elif agent.is_ezweb %}
 {% else %}                     EZWebです。
  {% if agent.is_softbank %}   {% elif agent.is_softbank %}
    SoftBankです。                 SoftBankです。
  {% else %}                   {% else %}
    その他です。                      その他です。
  {% endif %}                  {% endif %}
 {% endif %}
{% endif %}


? Jinja2のelifのおかげじゃねーか!
Kay-jpmobileで
は何ができて
ないの?
Kay-jpmobileの実装


? テスト実装という名のもとに、結構ひどい実装




? でも、ないよりも、あったほうがマシだよね
middlewareで何やってるか


? Request
  ? 各携帯の推奨エンコーディングを、utf-8に正規化
  ? 絵文字もGoogle絵文字コードに正規化
? Response
  ? utf-8を、各携帯推奨エンコーディングに変更
  ? (Google絵文字コードを各携帯の絵文字コードに変更)
werkzeug.Request


? Request.args/formはImmutableMultiDict
  ?   Request.charsetをキャリア推奨charsetに変更
  ?   ImmutableMultiDictをコピー
  ?   絵文字コードをGoogle絵文字コードに変換
  ?   新しいImmutableMultiDictを作り、args/formに代入
このアプローチの問題点


? 携帯電話からのアクセス時に、必ず
  request.args/formが評価されてしまう
 ? もともと、request.args/formは遅延評価
 ? 本来は、遅延評価にすべき
解決策の提案


? Kayのsettings.pyで、Requestのクラスを指定できれ
  ばよい?
 ? REQUEST_CLASS = ‘jpmobile.class.Request’

 ? klass =
   import_string(self.app_settings.REQUEST_CLASS)
 ? local.request = request = klass(environ)
DoCoMoでcookieが食えないヤツ


? 基本cookieが食えることを前提
? Cookieが食えないDoCoMoだけ、iモードIDを用いて
  疑似Cookieを作ってあげればOK?
 ? iモードIDをキーとして、Response.cookieを保存。
 ? Request.cookieは、iモードIdをキーとして保存先から
   取得
? やっぱりRequestクラスを指定できるようになると
  いいのかも
まとめ


? DoCoMoの件がなんとかなれば、それなりに実用的
  になるのではないか
? 是非patchを!
? このIssueでマジ困っているので誰か助けて
  http://code.google.com/p/googleappengine/issues/
  detail?id=4388
Jinja2の拡張


? 意外とサンプルが少なく、書き方で悩んだ
 ? のでメモ


? contextに渡っている値の取り出し方
 ? agentの値をfilter内で取り出したかった
 ? parse時にnodes.ContextReference()を埋め込んでおけ
   ばOK

More Related Content

kay-jpmobile