pirka-mobileによるGAEのモバイル対応

1月に入ってからGoogle App Engine/Javaで必要最低限の実装でモバイル対応をするためのライブラリを書いてました。
やれることとしてはシンプルに次の3点。

  • 絵文字の出力
  • キャリア判定
  • UID/GUIDの取得

機能てんこ盛りにすることもできますが、それならば既存のライブラリを使えば良いわけです。GAEで使いたいので、spin-upへの影響を最小限にすることを狙っています。

ライブラリの追加

piraka-mobile.jarは他のライブラリに依存しません。
AppEngine のプロジェクトの war/WEB-INF/lib に追加して、クラスパスを設定します。

web.xmlへFilterの追加

JSPで使用する場合は、オレオレCharsetを指定できないので、ServletFilterの設定が必要です。

  <!-- Mobile Filter -->
  <filter>
    <filter-name>MobileFilter</filter-name>
    <filter-class>org.pirkaengine.mobile.filter.MobileFilter
    </filter-class>
  </filter>
  <!-- MobileFilter -->
  <filter-mapping>
    <filter-name>MobileFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
  </filter-mapping>

絵文字のデコードも対応するならばFORWARDだけでは不十分ですが、現時点では対応していません*1

JSPで絵文字を使う

絵文字は列挙体Emojiに定義されており、toStringで対応するUnicodeを返します。なので、JSPEnumを埋め込むだけです。
pirka-mobileで定義されたCharsetはUnicode6.0から正式に組み込まれた、Unicode <-> 絵文字の変換を行います。この仕組みによりキャリア毎にCharsetを自動判定し、適切なSJISバイトコードを吐き出します。

<%@page import="org.pirkaengine.mobile.Emoji" %>
<%=Emoji.CLOUD%>

JSPの完全なサンプルはこうなります。

<?xml version="1.0" encoding="Shift_JIS"?>
<%@page pageEncoding="Windows-31J" contentType="application/xhtml+xml;charset=Shift_JIS" isELIgnored="false" session="false"%>
<%@page import="org.pirkaengine.mobile.*" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@taglib prefix="f" uri="http://www.slim3.org/functions"%>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=Shift_JIS" />
<title>Index</title>
</head>
<body>
<%
  Device d = (Device) request.getAttribute(Device.KEY);
%>
  <p>Carrier: <%=d.getCarrier()%></p>
  <p>UID: <%=d.getUid()%></p>
  <p>GUID: <%=d.getGuid()%></p>
  <p>Charset: <%=d.getCharset()%></p>
  <p>CLOUD: <%=Emoji.CLOUD%></p>
  <p>SUN_BEHIND_CLOUD: <%=Emoji.SUN_BEHIND_CLOUD%></p>
  <h2>Emoji</h2>
  <table>
<% for(Emoji e: Emoji.values()) { %>
    <tr><td><%=e.name()%></td><td><%=e%></td></tr>
<% } %>
  </table>
</body>
</html>

こちらで動いていますので、MobileSimulator等で確認してみてください。

spin-up

3回づつ計測してみました。

# Slim3 + JSP + pirka-mobile
/ 200 991ms 1376cpu_ms
/ 200 980ms 1376cpu_ms
/ 200 967ms 1286cpu_ms
# Slim3 + JSP
/ 200 684ms 1143cpu_ms
/ 200 691ms 1215cpu_ms
/ 200 692ms 1186cpu_ms

もう少し頑張れるかな?

*1:必要そうになったらやる予定