Play jjug2012spring
Post on 07-Nov-2014
9011 Views
Preview:
DESCRIPTION
Transcript
Play! Framework日本 Playframework ユーザー会
池田尚史 @ikeike443
自己紹介
• 池田尚史(いけだたかふみ)
• 株式会社シャノン Product Manager• @ikeike443• Play! Framework コミッター
• 日本 Playframework ユーザー会
• 『 Jenkins 』オライリージャパン 寄稿
• 勉強会、翻訳等々やってます
Ajenda
• Playframework って何?
• コアメンバー、歴史
• Play1 と Play2• Playframework の特徴
• デプロイの選択肢
• 利用事例など
そのまえに。。。
• 質問させてください
あなたのメイン言語は。。。
•Java?•Scala?•それ以外?
Playframeworkについて。。。
•聞いたことある方
Playframeworkについて。。。
•触ったことある方
Playframeworkについて。。。
•Play1?•Play2?
Playframeworkについて。。。
•何か作ってみた方
Playframeworkについて。。。
•Play1?•Play2?
Playframeworkについて。。。
•プロダクションで使った方
Playframeworkについて。。。
•Play1?•Play2?
•ご協力ありがとうございます
Ajenda
• Playframework って何?
• コアメンバー、歴史
• Play1 と Play2• Playframework の特徴
• デプロイの選択肢
• 利用事例など
Playframeworkって何?
• Java/Scala 用 Web フレームワーク
• フランスの Zenexity 社が開発
• 現在は Typesafe 社の Typesafe Stack の一部でもある
• Rails ライク● フルスタック● CoC
Playframeworkって何?
• Web 開発者の Web 開発者による Web 開発者のための Web フレームワーク
• 決して JEE のフレームワークではない
• JEE の規約に則っていない
• Servlet を使っていない
• XML 不要
Playはシンプル
FaceletsFacelets EJBEJB
Java Server FacesJava Server Faces
Http Server (Tomcat とか )Http Server (Tomcat とか )
Servlet APIServlet API
JEE Container (JBoss など )JEE Container (JBoss など )
Play! FrameworkPlay! Framework
Http Server (Netty)Http Server (Netty)
• 従来型の JEE アーキテクチャ • Play のアーキテクチャ
JEEの難しさ
• JEE は抽象化レイヤーが多すぎる
• JEE は将来出現するかもしれない Web ではない何かにも対応するべく高度な抽象化をしようとしている??
• その何かってなんだ?
• Java の Web 開発は難しい!
• そもそも前スライドの図が正しいかどうかも分からない
PlayはWebフレームワークである
• 多すぎる抽象化レイヤーは悪
• Web フレームワークは Web の開発が出来ればよい
• Web にフォーカスしよう
• HTTP を変に抽象化するのはやめよう
Heroku曰く
• Developers with experience in both Java and Ruby web development often ask the question: Why is web app development so complicated in Java, and so much simpler in Ruby, with Rails?
• Java と Ruby の両方を経験している Web 開発者はしばしば疑問に思うことがある。なぜ Javaの Web 開発はこんなにややこしいんだ? Ruby, 特に Rails で開発するとこんなにシンプルなのに。
http://blog.heroku.com/archives/2011/8/29/play/http://blog.heroku.com/archives/2011/8/29/play/http://d.hatena.ne.jp/ikeike443/20110830/p1http://d.hatena.ne.jp/ikeike443/20110830/p1
Playコアメンバー曰く
• 鈍重な開発サイクル、行き過ぎた抽象化、多過ぎる環境設定と言った伝統的な Java web 開発の痛みを伴わない、最高の Java プラットフォームを目指しているのが Play! というフレームワーク
Playコアメンバー曰く
• 開発時間が限りなくゼロに近いとき、未来の開発に向けた抽象化に挑戦するのではなく、速やかにアプリケーションの機能開発や試験に向けて集中するべきです。
デモ動画
• プロジェクトの新規作成
• 起動〜 Welcome ページ
• 変更〜 Hello World!• Json レスポンス
デモ動画
どうでしたか?
• Servlet は出てきませんでした
• XML の設定ファイルもありませんでした
• サーバ再起動なしで変更が反映されました
app → アプリケーションのソースコード
└ assets →アセットのソースファイル
└ controllers → アプリケーションのコントローラ
└ models → アプリケーションのビジネスロジック層
└ views → テンプレート
conf → 設定ファイル
└ application.conf → メイン設定ファイル
└ routes → ルート定義
public → 公開アセット
└ stylesheets → CSS ファイル
└ javascripts → JavaScript ファイル
└ images → 画像ファイル
project → sbt 設定ファイル
└ build.properties → sbt プロジェクトの基本ファイル
└ Build.scala → アプリケーションのビルドスクリプト
└ plugins.sbt → sbt プラグイン
lib → 管理されないライブラリ依存性
logs → デフォルトのログ保存場所
target → Play により生成されたファイル
コアメンバー
Playframeworkの歴史
2007年頃 (ver0.x)
• 社内フレームワークの時代
• Servlet / JSP
2009年末〜2010年頃 (ver1.0)
• OSS 化
• Groovy テンプレート , Python シェル
• この頃から既に非同期 I/O を実装
2011年頃 (ver1.2)
• ネットワーク周りを Mina から Netty へ
• Websocket サポート
• Scala サポート
現在 (ver2.0.1)
• 全体を Scala で書き直し
• Netty+Akka で非同期 I/O の徹底
• 基本的な思想は 1 系と同じ
Play1とPlay2
• Play1 Java で書かれた Java のフレームワーク
Scala はプラグインでサポート
• Play2Scala で書かれた Scala/Java のフレームワーク
Play1とPlay2• 基本的な設計思想は同じ
• 完成度を取るなら Play1• 未来への成長を取るなら Play2
Play1とPlay2
• Play1 が好きな人から見ると、 2 はデグレードしたように見えており、少しもめていた
• Play1 は今後もサポートされることを発表し、メンテナーを増員した(それが私)
• Play1 が好きな方も安心してください
コミュニティの成長
• 2010 年初頭、 ML の登録数は 400人ほどだった
• 2012 年 5月現在、 5900人超• Java の Web 開発に風穴を開けた印象
• ML を見ていると熱狂的なファンが多い
• 日本で Seasar が出た時の雰囲気に似てるかも?
Playの特徴
Playの特徴
• 高生産性かつ楽しい
• Web フォーカス
• ステートレス
• 広範囲な型安全
• ノンブロッキング
• リアクティブ
• 高いテスタビリティ
• プラグイン機構
高生産性
高生産性かつ楽しい
• なによりもセットアップの手間がない
• フレームワークを DL して、 unzip するだけでもう使える
• XML を書かなくていい!!
高生産性かつ楽しい
• コードのホットスワップ● 明示的なコンパイル不要● まるで LL のように
• Evolution(Rails の Migration のようなもの ) でスキーマ変更も自動的に行える
• サーバの再起動なしで開発をすることができる
高生産性かつ楽しい
• CoffeeScript, LESS のサポート
• assets ディレクトリに格納しておくと、それぞれ Javascript, css にコンパイルし、静的コンテンツとして扱ってくれる
• Rails3 のアセットパイプラインと同じ
• もちろん自動コンパイル
• Google Closure Compiler も内蔵してるよ
Webフォーカス
Webフォーカス
• Servlet API を使わない
• HTTP へのフルアクセスが可能
Webフォーカス
• もしあなたが Servlet API や Strtus のような Java の Web フレームワークを使っているならば、 HTTP プロトコルを Java の奇妙な API やコンセプトで抽象化したビューを使ってきたことになります。
• Web アプリケーションフレームワークは HTTP とそのコンセプトに対して完全かつ容易なアクセス手段を提供すべきです。これが Play とその他の Java web フレームワークの根本的な違いです。
ステートレス
ステートレス
• Play には HttpSession はない
• Play の session の実体はただの Cookie• セッション管理には Memcached を使うのがおすすめ
• セッションレプリケーション? なにそれ美味しいの
ステートレス
• ステートフルでコンポーネントベースの Java Web フレームワークは、自動的にページの状態を保持するのを容易にしますが、他に多くの問題をもたらします : ユーザがふたつ目のウィンドウを開いたら何が起こるでしょう?ブラウザの戻るボタンを押したら ?
• Share Nothing アーキテクチャは、 PHP に始まり、 Ruby on Rails や Django など数多くの Web フレームワークで奨励されています。ブラウザがどんどん強力になっていくにつれて、今や Ajax やオフラインストレージを使って、クライアントサイドで状態保持の問題を解決することが容易になっています。
• もう Web に紛い物の状態を再構築するために HTTP モデルをハックする必要はありません
ステートレス
• クラウド時代( IaaS, PaaS )の Web 開発はステートレスであるべきではないか
• キャパシティプランニング→サーバ調達→デプロイ、という時代ではない
• まずデプロイ→ニーズ・状況に応じて即時スケールアウト、という時代ではないのか
• Play はステートレス養成ギブスであり、時代の要請にマッチしている!
広範囲な型安全
広範囲な型安全
• HTTP ルーティング、 HTML テンプレート、 Javascript に至るまですべてコンパイルし、静的にエラーを検出できる
• コンパイルエラーは瞬時にブラウザに表示される
アプリケーションコード
Javascriptも
※ Google Closure Compiler 内蔵
テンプレートも
※テンプレートは Scala の関数
として実装されている
Routesも
広範囲な型安全
• LL っぽく柔軟に書けるフレームワークでありながら、同時にあらゆるものを静的に検査してくれる型安全性
• 型安全だが、堅苦しくない絶妙なバランス
• Scala の型推論と Play のホットスワップ機能の合わせ技!
ノンブロッキング
ノンブロッキング I/O
• Play はありとあらゆる部分でノンブロッキング、非同期処理を手軽に書けるように考えられている
• なぜか?
Playはこう考える
• これから先はリアルタイム Web の時代
• Web フレームワークには完全な非同期 HTTP プログラミングモデルをサポートすることが求められる。 (node.js の流行 )
• Comet 、 WebSocket 、 SPDY 等、コネクションは長い間保持されるものになっていきがち。
• Web プログラミングはイベント駆動モデルへと進むべきでは。
ノンブロッキングの実現
• Netty による非同期 I/O の実現
• Akka による継続プログラミングモデルの実現
• 場合によっては node.js より速いかも
● 1.2(Netty+Javaflow) のときは node.js といい勝負だった
Nettyとは
• JBoss のネットワークフレームワーク
• Java NIO のラッパー
• 非同期イベント駆動型
• 高スケーラビリティを誇る
• Twitter が採用していますね
• Play が Servlet API を使っていない理由の一つ
Nettyとノンブロッキング I/O• 詳細は下記参照
http://d.hatena.ne.jp/fatrow/20110208/nettyhttp://www.slideshare.net/tanago3/netty
• Play は Netty のラッパー。利用者は特に意識せずとも Netty のパワーを享受できる。
• これだけで十分速い
Akkaによる非同期処理
• Akka とは、 Scala製の Actorベース非同期処理フレームワーク
• Actor とはメッセージベースの並列計算モデルのこと
• Erlang などが有名
• 詳細は Wikipedia...
Actorのイメージ
Actor1Actor1 Actor2Actor2messagemessage
Actor1Actor1 Actor2Actor2
Actor1Actor1 Actor2Actor2messagemessage
処理処理
PlayのActor
• ActionInvoker● FW がルーターからコントローラを呼ぶ部分で
• PromiseInvoker● 利用者が明示的に Promise を利用する時に
• WebsocketAgent● 利用者が明示的に Websocket を実装する時に
PromiseInvokerの例 (Scala)
def index = Action { val promiseOfInt = Akka.future { longComputation() } Async { promiseOfInt.map(i => Ok("Got result: " + i)) }}
別の Actor( ワーカースレッド)へ
Promise が返却されるまでの間、スレッドをブロックしないで待ってくれる
Akka の設定を変更すると、アプリケーションコードを変更せずに、 longComputation を別クラスタに移譲するようなこともできる( Akka remote )
PromiseInvokerの例 (Java)public static Result index() {
Promise<Integer> promiseOfInt = Akka.future(
new Callable<Integer>() {
public Integer call() {
longComputation();
}
}
);
async(
promiseOfInt.map(
new Function<Integer,Result>() {
public Result apply(Integer i) {
return ok("Got result: " + i);
}
}
)
);
}
ノンブロッキングまとめ
• Netty で意識することのないノンブロッキングI/O
• Akka のヘルパーを使って気軽に手続き的に非同期処理を書く事ができる
• Akka remote を使って重たい処理をバックエンドに飛ばすことも簡単
• Websocket も使えるよ
リアクティブ
リアクティブ
• Iteratee, Enumlator, Enumlatee• Haskel からヒントを得た IO モナドの実装
• ストリーム処理を抽象化し、イベントドリブンに処理できるようにしている模様
• 巨大なファイルアップロードを一度に大量に受け付けることなどを想定している?
• Guillaume と Sadek が Qcon で詳しく説明してくれています
http://www.infoq.com/presentations/Play-I-ll-See-Your-Async-and-Raise-You-Reactive
高いテスタビリティ
テスタビリティ
• Specs2 : BDD フレームワーク
• 組み込みのテストフレームワークとして採用
http://etorreborre.github.com/specs2/• Play2 はあらゆるものが Scala の関数であるため、テストしやすい
• Selenium WebDriver も組み込んでいてブラウザを通した受け入れテストも簡単に書ける
テスタビリティ
• テンプレートもただの関数→View をテスト可
"render index template" in {
val html = views.html.index("Coco")
contentType(html) must equalTo("text/html")
contentAsString(html) must contain("Hello Coco")
}
テスタビリティ
• コントローラもテスト可能
"respond to the index Action" in {
val result = controllers.Application.index("Bob")(FakeRequest())
status(result) must equalTo(OK)
contentType(result) must beSome("text/html")
charset(result) must beSome("utf-8")
contentAsString(result) must contain("Hello Bob")
}
テスタビリティ
• HTTP サーバを起動して Selenium WebDriver(FluentLeniumを採用している )"run in a browser" in {
running(TestServer(3333), HTMLUNIT) { browser =>
browser.goTo("http://localhost:3333")
browser.$("#title").getTexts().get(0) must equalTo("Hello Guest")
browser.$("a").click()
browser.$("#title").getTexts().get(0) must equalTo("Hello Coco")
}
}
テスタビリティ
• テストフレームワークが組み込みで用意されおり、特に準備することもなく即 TDD に取り掛かることができる
• CI を組むのが簡単
• アジャイル開発にとてもマッチするフレームワーク!
プラグイン機構
プラグイン機構
• フレームワーク全体にプラグイン機構を採用
• DB層や Akka などはプラグインとして実装されている
• 1.xほどのバリエーションはまだないが、 MongoDB, Redis, Memcached, Spring, Guiceなど、続々プラグインがリリースされている。
http://www.playframework.org/documentation/2.0.1/Modules
利用事例
Klout• ソーシャルスコアリングで勢いのあるベンチャー
• 検索コンポーネントと、 Klout API の部分をPlay+Scala で構築している
http://corp.klout.com/blog/2012/03/sexy-api-from-klout/
英ガーディアン
• コンテンツAPI の実装に Play2 Scala を採用している
• github で実装を公開もしている
https://github.com/guardian/frontend
Minecraft• ネットで旋風を巻き起こしたインディーズゲームの Web サイト
多数のスタートアップ
• Mashape: www.mashape.com
• Ocado: www.ocado.com
• ollaa: www.ollaa.com
• Komli Mobile: www.komlimobile.com
• LikedBy: www.likedby.com
• Docracy: www.docracy.com
• Masterbranch: masterbranch.com
• Valraiso: www.valraiso.net
• eXpress-Board : www.express-board.fr
• CMesDonnees : www.cmesdonnees.com
• Venarc : www.venarc.comEdit
その他
• Verizon• Fannie Mae• Freddie Mac• Foreclosure.com
国内
• 情報が少ないのが正直なところ
• 金融機関などでも使われているという噂はあり
• ちなみに私が関わった案件はすべて Play● 某大手研修サイトの一部機能● 某大手不動産業者サイトのコンテンツAPI● 某大手生保スタッフサイトの一部機能● 某イベントの受付フォーム
デプロイ
デプロイは苦労知らず
• Servlet コンテナを使わない
• 開発環境と本番環境の差異がほぼ発生し得ない
• リポジトリからチェックアウトすればデプロイ完了
即時スケールアウト可能
• ステートレスなフレームワークであるため、 IaaS や PaaS と相性が良い
• Java が使える環境であれば、普通のレンタルサーバでも特に問題はない
PaaSの選択肢
•Heroku•Cloudbees•OpenShift• Cloudfoundry
• Google AppEngine
• DotCloud
• Amazon Beanstalk
ネイティブサポートネイティブサポート
どうですか?
• Play! Framework って楽しそうじゃないですか?
日本Playframeworkユーザー会
• https://groups.google.com/forum/?fromgroups#!forum/play_ja
日本Playframeworkユーザー会
• 不定期に勉強会をやってます
• 次回は 7月 14 日(土)です!
• http://playframeworkja.doorkeeper.jp/events/1231-%E7%AC%AC3%E5%9B%9Eplayframework%E5%8B%89%E5%BC%B7%E4%BC%9A-play_ja• 将来的にはコアメンバーたちを日本に呼ぶことも構想しています!!
• その実現のためには、みなさんのご参加が!!
日本Playframeworkユーザー会
• ドキュメントの翻訳も行っています!
• 現在は 2.0.1 の翻訳を進めています。
• 興味のある方はぜひML でお知らせください。
ご静聴ありがとうございました!
top related