Top Banner
ケータイサイト 30 分クッキング Seasar Conference 2009 Autumn Shin Takeuchi
42

mobylet ケータイサイト30分クッキング

Jul 05, 2015

Download

Technology

Shin Takeuchi

mobyletを作って、ケータイサイトを30分で作ってみましょう。
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: mobylet ケータイサイト30分クッキング

ケータイサイト 30分クッキング

Seasar Conference 2009 AutumnShin Takeuchi

Page 2: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.2

プロフィール

竹内真( TAKEUCHI SHIN ) id:stakeuchi

株式会社レイハウオリ 代表取締役 CTOmobylet 作ってます。

事業立案や、たまにちょっとしたデザインやったり。

経営と財務管理もやります。

株式会社ビズリーチ  Chief ArchitectHigh-Class 求人サイト「ビズリーチ」を 1 人で制作中。

株式会社リクルート パートナー共通化を推進したり、フレームワークを作ったり。

セキュリティ /SEO/ モバイルも担当しています。

Page 3: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.3

このセッションでは何やるの?

ケータイサイトを実際に作ってみます。「 mobytter 」を作ってみましょう。

「 Twitter 」みたいにつぶやけるサイト

3 キャリア携帯対応します。

Google App Engine にアップして、公開させます。

T2-Framework を使います。

もちろん mobylet は使います。

時間がある限りリッチなサイトにしてみます。

Page 4: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.4

作る前に。。。

ちょっとお勉強しましょう。mobylet とは?

T2-Framework とは?

Google App Engine とは?

Page 5: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.5

mobylet (モビレット)とは?

携帯 Web アプリを作るためのフレームワーク

色々な FW や DI コンテナと一緒に使える    (確認済: Seasar2 ( SAStruts )、 T2等)最小設定は Filter を仕掛けるだけ外部ライブラリにほぼ非依存(※)Google App Engine for Java に対応している

mobylet に出来ること絵文字の入出力に「勝手に対応」キャリアや機種を「勝手に判別」携帯サイトに便利な機能が「勝手に標準搭載」

Page 6: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.6

T2-Framework とは?

とってもシンプルな Web フレームワーク極めて小さなフレームワーク

REST ライクな綺麗な URL を簡単に使える

拡張性が高く、色んな DI コンテナを使える

Google App Engine for Java に対応している

もっと詳しく言うと。。。この後のセッションを聞いて下さい!

Page 7: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.7

Google App Engine とは?

Google のインフラが使えるクラウドサービス

Google のミニ環境が無料で使える(※)

今年の 4 月 7 日から Java が利用可能になった

Eclipse と親和性が高く、 Java エンジニアに優しい

色々な制限もありますRDBMS が使えない( Bigtable が利用可能)

Thread が使えない

ファイルの書き込みが出来ない

その他( Mail 等も)色々制限がある ▼

Page 8: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.8

mobylet+T2 / Google App Engine

これまでの悩み携帯サイトはインターネット上に公開しなければ実機で見れないけど、 Java インフラは高価!

ちょっとしたサイトを作るだけなのに、やたらと大規模な構成( FW 等)になりがち!

そもそも Java で作ると携帯依存の問題が膨大!

mobylet+T2 / Google App Engine の場合全部解決!!!超 Easy !!

Page 9: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.9

それではそろそろ作り始めましょうか

準備Eclipse のインストール(デモは Version 3.3 )

流石にこれはデモしません。。。

Google App Engine のアカウント取得ちょっとだけ説明します。

Google App Engine 用の Eclipse plug-inちょっとだけ説明します。

mobylet + T2 / Google App Engineここからデモになります。

Page 10: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.10

(1)Google App Engine のアカウント取得

http://code.google.com/intl/ja/appengine/

Google アカウントと携帯メアドがあれば OK 。

Page 11: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.11

(2)Google App Engine Eclipse Plug-in [1]

http://code.google.com/intl/ja/appengine/docs/java/tools/eclipse.html

Plug-in を Eclipse にインストールします

Page 12: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.12

(2)Google App Engine Eclipse Plug-in   [2]

インストールすると

こんな感じになります。( GAE のアイコンが現れます)

Page 13: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.13

(3)mobylet+T2 / GAE プロジェクト

実は。。。ブランクプロジェクトを用意しました。

http://mobylet.sandbox.seasar.org/resources/0.9.1/mobylet-blank-t2gae.zip ( DI コンテナに Guice を利用しています)

まずはダウンロードします。

そしてプロジェクトにインポートします。

Page 14: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.14

それでは作りましょう

まずは画面設計します。1画面で完結する簡単な Twitter にします。

mobytter

投稿

つぶやきました。

携帯サイトですね。

こんにちは。

Page 15: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.15

Google App Engine で ID を取得

アプリケーション ID を取得するアプリケーション ID が URL となったり、デプロイ時のキーになったりするので、最初に取っておく。

今回は「 mobytter 」で取ってみる。

時間が無いかもしれないので ID だけ取得済み。

下の URL から取得する(あらかじめ GAE のアカウントが必要です)

https://appengine.google.com/

Page 16: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.16

(4) 設定ファイルを確認しましょう

WEB-INF/web.xmlフィルタの設定をチェックします。

WEB-INF/logging.propertiesWEB-INF/appengine-web.xml

ログの設定をチェックします(基本そのまま)

META-INF/jdoconfig.xmlJDO の設定をチェックします(基本そのまま)

logback.xmlログ( T2 )の設定をチェックします(そのまま) ▼

Page 17: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.17

(5)mobylet.xml [1]

mobylet.xml の設定をチェックするinitializers/chain初期化クラスの設定(内部コンテナの初期化)

emojiemoji/basedir

絵文字のキャリア間変換設定ファイル配置場所

emoji/imagePathOTHER キャリアでの絵文字画像出力パス

devicedevice/basedir

バリューエンジン社の端末プロファイル設置場所

Page 18: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.18

(5)mobylet.xml [2]

mobylet.xml その他の設定through/carrier

mobylet に余計な処理をさせたくないキャリアの設定

proxyproxy/hostproxy/port

プロキシサーバが介在する通信処理を行う場合に設定

defaultdefault/contentType

HTML/XHTML のどちらかを指定可能(初期値はHTML )

Page 19: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.19

(6)静的なトップページの作成 [1]

index.jsp の作成今回は直接 JSP にアクセスさせたくないので「 WEB-INF/view/ 」の下とかに作りましょう。

とりあえずタイトル部とフォーム部だけ作ってみましょう。

こっそり絵文字も入れてみましょう。

Page 20: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.20

(6)静的なトップページの作成 [2]

page ディレクティブ<%@page pageEncoding=“UTF-8” isELIgnored=“false” %>

Content-Type は mobylet が設定するので書かなくて良い。

GAE/J はデフォルトで EL 式が使えないので、 isELIgnored=“false” を指定する。

Page 21: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.21

(6)静的なトップページの作成 [3]

taglib ディレクティブどうせ使うので 2 つ書いておきます

<%taglib prefix=“c” uri=“http://java.sun.com/jsp/jslt/core” %><%taglib prefix=“m” uri=“http://taglib.mobylet.org” %>

GAE では include-prelude が使えないのでcommon.jsp とかに taglib指定を書いておくようなことが出来ないので注意。

Page 22: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.22

(7)静的なトップページの Page クラス [1]

TopPage.classT2 で REST ライクな URL を使いたい。

名前は何でも良いので、これにする。

POJO ( Plain Old Java Object )で良い。

rootpackage配下の page パッケージに作る。

Page 23: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.23

(7)静的なトップページの Page クラス [2]

TopPage クラスにアノテーションを付ける

@SingletonScopeシングルトンインスタンスで良い時はこれを付ける。

@Page(“/top”)http://hoge.com/top としてアクセスさせる指定

GAE はコンテキストパスが無いので↑な感じになる。

Page 24: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.24

(7)静的なトップページの Page クラス [3]

処理するメソッドを作るpublic Navigation index(WebContext context)処理メソッドは Navigator クラスを返すお決まり

引数は色々設定可能だが、 WebContext を取る王道でやってみましょう

@Default アノテーションを付けるGET でも POST でも、どんな Method でリクエストされても処理出来るように、このアノテーションを付けます。

限定したい場合は @GET とか @POST とか使います

Page 25: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.25

(7)静的なトップページの Page クラス [4]

JSP を表示するreturn Forward.to(“/WEB-INF/view/index.jsp”)

JSP のパスを指定して表示させる。

Forward.to() を使うことで、 WEB-INF以下のパスも指定可能。

Page 26: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.26

(8)投稿を処理する Page クラス [1]

PostPage.classとりあえず同じように作っておきましょう

URL は「 post 」にしましょう

メソッドは相変わらず@Default にします

処理したら表示ページに返しましょうRedirect.to(“/top”)

Page 27: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.27

(8)投稿を処理する Page クラス [2]

せっかくなので DI してみるMobylet インスタンスを DI する。

META-INF/services/com.google.inject.modulesrc/org/mobylet/t2gae/MobyletModule

Page クラスを @RequestScope に変更Mobylet インスタンスが RequestScope のため

@Inject protected Mobylet mobylet;これで DI 可能

これで色々な情報が取れます

Page 28: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.28

(9)投稿を Bigtable にストアする [1]

まずは Bigtable を超簡単に理解しましょう。Bigtable とは「 key-value 」ストアエンジンです。イメージは Java の HashMap みたいなものです。Map に put したら DB に保存されていると思えば、イメージは大体オッケイです。Map から get したら DB からデータが取得できていると思えば、イメージは大体オッケイです。今回は JDO を使って Bigtable にアクセスするので、JDOQL なる、変な Query が使えますが、あまり気にしない方が良いです。詳しく知りたい方は以下の URLへ!http://code.google.com/intl/ja/appengine/docs/java/datastore/さらに詳しく知りたい方は「ひがさんのセッション」へ!

Page 29: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.29

(9)投稿を Bigtable にストアする [2]

ストアするデータクラスを作りましょう一意になる key と、格納したいメンバを持つデータクラスを作ります。

Long key一意なキーを自動採番させます。

String comment投稿したコメントをここに入れます

Date postDate投稿日時をここに入れ、この日時でソートします。

Class名は CommentDto とでもしておきます。

rootpackage/page以外のパッケージに作りましょう ▼

Page 30: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.30

(9)投稿を Bigtable にストアする [3]

データクラスにアノテーションを付けるクラスに付けるアノテーション

@PersistenceCapable(identityType=IdentityType.APPLICATION)

JDO を使ってデータの格納 / 取得をするために必要

Key となるメンバに付けるアノテーション@PrimaryKey@Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)自動採番させるための指定です

メンバに付けるアノテーション@Persistent

Bigtable に格納することを宣言するものです

Page 31: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.31

(9)投稿を Bigtable にストアする [4]

格納するデータインスタンスを作りましょう

Request からパラメータを取得します。Request request = context.getRequest();String comment = request.getParameter(“comment);

Null チェックでもしておきましょうか。if (StringUtils.isEmpty(comment)) {

Redirect.to(“/top”);}

格納するデータインスタンスを作ります。CommentDto dto = new CommentDto();dto.setComment(comment);dto.setPostDate(new Date());

Page 32: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.32

(9)投稿を Bigtable にストアする [5]

PersistenceManager を使って store します。

ブランクプロジェクト付属の PMF クラスを使って取得します。PMF.get().getPersistenceManager();

makePersistent メソッドで store して、終わったらちゃんとクローズします。try {

pm.makePersistent(dto);} finally {

pm.close();}

Page 33: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.33

(10) ストアした情報を取得 / 表示する [1]

まずは取得するやっぱり PersistenceManager を使います。 PMF.get().getPersistenceManager();

Query クラスを使って取得したいと思います。(他にも方法はありますが)Query query = pm.newQuery(CommentDto.class);

ソート条件を指定しますquery.setOrdering(“postDate desc”);

先頭の 30件だけ表示することにしますquery.setRange(0, 30);

オブジェクトのリストを取得します(List<CommentDto>)query.execute();

取得し終わったらちゃんとクローズします

Page 34: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.34

(10) ストアした情報を取得 / 表示する [2]

Request の属性に情報を設定するCommentDto のリストからコメントだけを抜き出してリスト化する

大人の事情により( GAE のページを読んでね) CommentDto のメンバは publicじゃないので、 JSP でアクセスしやすいように入れ替えます。

List<String> commentStrList = new ArrayList<String>();for (CommentDto commentObj : commentList) {

commentStrList.add(commentObj.getComment());}

リクエストの属性に設定するcontext.getRequest().setAttribute(“list”, commentStrList);

Page 35: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.35

(10) ストアした情報を取得 / 表示する [2]

JSP に表示する<c:forEach> とか使って表示する<c:forEach items=“${list}” var=“comment”>

<div>${comment}</div></c:forEach>

<hr /> とか使って見やすくしてみる

サニタイジングもした方が良いですね

Page 36: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.36

(11) とうとう GAE にデプロイする [1]

Eclipse を使ってデプロイするProject を右クリックして「 Google 」 -> 「 Deploy to App Engine 」を選択

「 App Engine project settings 」でアプリケーション ID とかを設定する

アプリケーション ID は「 mobytter 」にする

出来たらパスワードを入力して、「配置」ボタンをクリック!

上手く行っていれば以下の URL で動くはず!

http://mobytter.appspot.com/top/

Page 37: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.37

(11) とうとう GAE にデプロイする [2]

QR コードで簡単アクセス

近距離の方はこちら

Page 38: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.38

(12) おめでとうございます!

というわけで30 分程度で小さな携帯サイトが作れました!

是非みなさんも試してみてください!

Page 39: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.39

番外編 [1] Mail を使った投稿

MailBoxer サービスを使う株式会社レイハウオリの ASP でメールの内容から URL をキックしてくれるサービスがあります。

http://mailboxer.jp/これが使えるように新しい Page クラスを作ってみる。( MailBoxerPage )

デプロイして実験する

Page 40: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.40

番外編 [1] Mail を使った投稿

QR コードで簡単アクセス

近距離の方はこちら

Page 41: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.41

番外編 [2] mobytter ロゴのサイズ調整

mobytter のロゴを使ってみるしかし、携帯のブラウザサイズはまちまちなので、解像度の高いブラウザだと「ちっっっっちゃな」ロゴになっちゃう。mobylet のブラウザサイズ別画像サイズ出し分け機能を使ってオートリサイズして出力してみる。

(注意)最近GAE/J の Image API の実装が変わった際に、リサイズ後の画像は PC ブラウザでは表示出来るが、 docomo/SoftBank で表示出来ないケースが発生しています。

Page 42: mobylet ケータイサイト30分クッキング

Copyright(C)2009 mobylet & Lei Hau'oli Co.,Ltd.42

以上

ご清聴ありがとうございました。

<ご連絡はこちら>[email protected]

http://mobylet.sandbox.seasar.org/http://www.leihauoli.com/