98
Play! Framework 日本 Playframework ユーザー会 池田尚史 @ikeike443

Play jjug2012spring

Embed Size (px)

DESCRIPTION

JJUG CCC 2012 Springで講演した資料

Citation preview

Page 1: Play jjug2012spring

Play! Framework日本 Playframework ユーザー会

池田尚史 @ikeike443

Page 2: Play jjug2012spring

自己紹介

• 池田尚史(いけだたかふみ)

• 株式会社シャノン Product Manager• @ikeike443• Play! Framework コミッター

• 日本 Playframework ユーザー会

• 『 Jenkins 』オライリージャパン 寄稿

• 勉強会、翻訳等々やってます

Page 3: Play jjug2012spring

Ajenda

• Playframework って何?

• コアメンバー、歴史

• Play1 と Play2• Playframework の特徴

• デプロイの選択肢

• 利用事例など

Page 4: Play jjug2012spring

そのまえに。。。

• 質問させてください

Page 5: Play jjug2012spring

あなたのメイン言語は。。。

•Java?•Scala?•それ以外?

Page 6: Play jjug2012spring

Playframeworkについて。。。

•聞いたことある方

Page 7: Play jjug2012spring

Playframeworkについて。。。

•触ったことある方

Page 8: Play jjug2012spring

Playframeworkについて。。。

•Play1?•Play2?

Page 9: Play jjug2012spring

Playframeworkについて。。。

•何か作ってみた方

Page 10: Play jjug2012spring

Playframeworkについて。。。

•Play1?•Play2?

Page 11: Play jjug2012spring

Playframeworkについて。。。

•プロダクションで使った方

Page 12: Play jjug2012spring

Playframeworkについて。。。

•Play1?•Play2?

Page 13: Play jjug2012spring

•ご協力ありがとうございます

Page 14: Play jjug2012spring

Ajenda

• Playframework って何?

• コアメンバー、歴史

• Play1 と Play2• Playframework の特徴

• デプロイの選択肢

• 利用事例など

Page 15: Play jjug2012spring

Playframeworkって何?

• Java/Scala 用 Web フレームワーク

• フランスの Zenexity 社が開発

• 現在は Typesafe 社の Typesafe Stack の一部でもある

• Rails ライク● フルスタック● CoC

Page 16: Play jjug2012spring

Playframeworkって何?

• Web 開発者の Web 開発者による Web 開発者のための Web フレームワーク

• 決して JEE のフレームワークではない

• JEE の規約に則っていない

• Servlet を使っていない

• XML 不要

Page 17: Play jjug2012spring

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 のアーキテクチャ

Page 18: Play jjug2012spring

JEEの難しさ

• JEE は抽象化レイヤーが多すぎる

• JEE は将来出現するかもしれない Web ではない何かにも対応するべく高度な抽象化をしようとしている??

• その何かってなんだ?

• Java の Web 開発は難しい!

• そもそも前スライドの図が正しいかどうかも分からない

Page 19: Play jjug2012spring

PlayはWebフレームワークである

• 多すぎる抽象化レイヤーは悪

• Web フレームワークは Web の開発が出来ればよい

• Web にフォーカスしよう

• HTTP を変に抽象化するのはやめよう

Page 20: Play jjug2012spring

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

Page 21: Play jjug2012spring

Playコアメンバー曰く

• 鈍重な開発サイクル、行き過ぎた抽象化、多過ぎる環境設定と言った伝統的な Java web 開発の痛みを伴わない、最高の Java プラットフォームを目指しているのが Play! というフレームワーク

Page 22: Play jjug2012spring

Playコアメンバー曰く

• 開発時間が限りなくゼロに近いとき、未来の開発に向けた抽象化に挑戦するのではなく、速やかにアプリケーションの機能開発や試験に向けて集中するべきです。

Page 23: Play jjug2012spring

デモ動画

• プロジェクトの新規作成

• 起動〜 Welcome ページ

• 変更〜 Hello World!• Json レスポンス

Page 24: Play jjug2012spring

デモ動画

Page 25: Play jjug2012spring

どうでしたか?

• Servlet は出てきませんでした

• XML の設定ファイルもありませんでした

• サーバ再起動なしで変更が反映されました

Page 26: Play jjug2012spring

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 により生成されたファイル

Page 27: Play jjug2012spring

コアメンバー

Page 28: Play jjug2012spring
Page 29: Play jjug2012spring
Page 30: Play jjug2012spring

Playframeworkの歴史

Page 31: Play jjug2012spring

2007年頃 (ver0.x)

• 社内フレームワークの時代

• Servlet / JSP

Page 32: Play jjug2012spring

2009年末〜2010年頃 (ver1.0)

• OSS 化

• Groovy テンプレート , Python シェル

• この頃から既に非同期 I/O を実装

Page 33: Play jjug2012spring

2011年頃 (ver1.2)

• ネットワーク周りを Mina から Netty へ

• Websocket サポート

• Scala サポート

Page 34: Play jjug2012spring

現在 (ver2.0.1)

• 全体を Scala で書き直し

• Netty+Akka で非同期 I/O の徹底

• 基本的な思想は 1 系と同じ

Page 35: Play jjug2012spring

Play1とPlay2

• Play1 Java で書かれた Java のフレームワーク

Scala はプラグインでサポート

• Play2Scala で書かれた Scala/Java のフレームワーク

Page 36: Play jjug2012spring

Play1とPlay2• 基本的な設計思想は同じ

• 完成度を取るなら Play1• 未来への成長を取るなら Play2

Page 37: Play jjug2012spring

Play1とPlay2

• Play1 が好きな人から見ると、 2 はデグレードしたように見えており、少しもめていた

• Play1 は今後もサポートされることを発表し、メンテナーを増員した(それが私)

• Play1 が好きな方も安心してください

Page 38: Play jjug2012spring

コミュニティの成長

• 2010 年初頭、 ML の登録数は 400人ほどだった

• 2012 年 5月現在、 5900人超• Java の Web 開発に風穴を開けた印象

• ML を見ていると熱狂的なファンが多い

• 日本で Seasar が出た時の雰囲気に似てるかも?

Page 39: Play jjug2012spring

Playの特徴

Page 40: Play jjug2012spring

Playの特徴

• 高生産性かつ楽しい

• Web フォーカス

• ステートレス

• 広範囲な型安全

• ノンブロッキング

• リアクティブ

• 高いテスタビリティ

• プラグイン機構

Page 41: Play jjug2012spring

高生産性

Page 42: Play jjug2012spring

高生産性かつ楽しい

• なによりもセットアップの手間がない

• フレームワークを DL して、 unzip するだけでもう使える

• XML を書かなくていい!!

Page 43: Play jjug2012spring

高生産性かつ楽しい

• コードのホットスワップ● 明示的なコンパイル不要● まるで LL のように

• Evolution(Rails の Migration のようなもの ) でスキーマ変更も自動的に行える

• サーバの再起動なしで開発をすることができる

Page 44: Play jjug2012spring

高生産性かつ楽しい

• CoffeeScript, LESS のサポート

• assets ディレクトリに格納しておくと、それぞれ Javascript, css にコンパイルし、静的コンテンツとして扱ってくれる

• Rails3 のアセットパイプラインと同じ

• もちろん自動コンパイル

• Google Closure Compiler も内蔵してるよ

Page 45: Play jjug2012spring

Webフォーカス

Page 46: Play jjug2012spring

Webフォーカス

• Servlet API を使わない

• HTTP へのフルアクセスが可能

Page 47: Play jjug2012spring

Webフォーカス

• もしあなたが Servlet API や Strtus のような Java の Web フレームワークを使っているならば、 HTTP プロトコルを Java の奇妙な API やコンセプトで抽象化したビューを使ってきたことになります。

• Web アプリケーションフレームワークは HTTP とそのコンセプトに対して完全かつ容易なアクセス手段を提供すべきです。これが Play とその他の Java web フレームワークの根本的な違いです。

Page 48: Play jjug2012spring

ステートレス

Page 49: Play jjug2012spring

ステートレス

• Play には HttpSession はない

• Play の session の実体はただの Cookie• セッション管理には Memcached を使うのがおすすめ

• セッションレプリケーション? なにそれ美味しいの

Page 50: Play jjug2012spring

ステートレス

• ステートフルでコンポーネントベースの Java Web フレームワークは、自動的にページの状態を保持するのを容易にしますが、他に多くの問題をもたらします : ユーザがふたつ目のウィンドウを開いたら何が起こるでしょう?ブラウザの戻るボタンを押したら ?

• Share Nothing アーキテクチャは、 PHP に始まり、 Ruby on Rails や Django など数多くの Web フレームワークで奨励されています。ブラウザがどんどん強力になっていくにつれて、今や Ajax やオフラインストレージを使って、クライアントサイドで状態保持の問題を解決することが容易になっています。

• もう Web に紛い物の状態を再構築するために HTTP モデルをハックする必要はありません

Page 51: Play jjug2012spring

ステートレス

• クラウド時代( IaaS, PaaS )の Web 開発はステートレスであるべきではないか

• キャパシティプランニング→サーバ調達→デプロイ、という時代ではない

• まずデプロイ→ニーズ・状況に応じて即時スケールアウト、という時代ではないのか

• Play はステートレス養成ギブスであり、時代の要請にマッチしている!

Page 52: Play jjug2012spring

広範囲な型安全

Page 53: Play jjug2012spring

広範囲な型安全

• HTTP ルーティング、 HTML テンプレート、 Javascript に至るまですべてコンパイルし、静的にエラーを検出できる

• コンパイルエラーは瞬時にブラウザに表示される

Page 54: Play jjug2012spring

アプリケーションコード

Page 55: Play jjug2012spring

Javascriptも

※ Google Closure Compiler 内蔵

Page 56: Play jjug2012spring

テンプレートも

※テンプレートは Scala の関数

 として実装されている

Page 57: Play jjug2012spring

Routesも

Page 58: Play jjug2012spring

広範囲な型安全

• LL っぽく柔軟に書けるフレームワークでありながら、同時にあらゆるものを静的に検査してくれる型安全性

• 型安全だが、堅苦しくない絶妙なバランス

• Scala の型推論と Play のホットスワップ機能の合わせ技!

Page 59: Play jjug2012spring

ノンブロッキング

Page 60: Play jjug2012spring

ノンブロッキング I/O

• Play はありとあらゆる部分でノンブロッキング、非同期処理を手軽に書けるように考えられている

• なぜか?

Page 61: Play jjug2012spring

Playはこう考える

• これから先はリアルタイム Web の時代

• Web フレームワークには完全な非同期 HTTP プログラミングモデルをサポートすることが求められる。 (node.js の流行 )

• Comet 、 WebSocket 、 SPDY 等、コネクションは長い間保持されるものになっていきがち。

• Web プログラミングはイベント駆動モデルへと進むべきでは。

Page 62: Play jjug2012spring

ノンブロッキングの実現

• Netty による非同期 I/O の実現

• Akka による継続プログラミングモデルの実現

• 場合によっては node.js より速いかも

● 1.2(Netty+Javaflow) のときは node.js といい勝負だった

Page 63: Play jjug2012spring
Page 64: Play jjug2012spring

Nettyとは

• JBoss のネットワークフレームワーク

• Java NIO のラッパー

• 非同期イベント駆動型

• 高スケーラビリティを誇る

• Twitter が採用していますね

• Play が Servlet API を使っていない理由の一つ

Page 65: Play jjug2012spring

Nettyとノンブロッキング I/O• 詳細は下記参照

http://d.hatena.ne.jp/fatrow/20110208/nettyhttp://www.slideshare.net/tanago3/netty

• Play は Netty のラッパー。利用者は特に意識せずとも Netty のパワーを享受できる。

• これだけで十分速い

Page 66: Play jjug2012spring
Page 67: Play jjug2012spring

Akkaによる非同期処理

• Akka とは、 Scala製の Actorベース非同期処理フレームワーク

• Actor とはメッセージベースの並列計算モデルのこと

• Erlang などが有名

• 詳細は Wikipedia...

Page 68: Play jjug2012spring

Actorのイメージ

Actor1Actor1 Actor2Actor2messagemessage

Actor1Actor1 Actor2Actor2

Actor1Actor1 Actor2Actor2messagemessage

処理処理

Page 69: Play jjug2012spring

PlayのActor

• ActionInvoker● FW がルーターからコントローラを呼ぶ部分で

• PromiseInvoker● 利用者が明示的に Promise を利用する時に

• WebsocketAgent● 利用者が明示的に Websocket を実装する時に

Page 70: Play jjug2012spring

PromiseInvokerの例 (Scala)

def index = Action { val promiseOfInt = Akka.future { longComputation() } Async { promiseOfInt.map(i => Ok("Got result: " + i)) }}

別の Actor( ワーカースレッド)へ

Promise が返却されるまでの間、スレッドをブロックしないで待ってくれる

Akka の設定を変更すると、アプリケーションコードを変更せずに、 longComputation を別クラスタに移譲するようなこともできる( Akka remote )

Page 71: Play jjug2012spring

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);

}

}

)

);

}

Page 72: Play jjug2012spring

ノンブロッキングまとめ

• Netty で意識することのないノンブロッキングI/O

• Akka のヘルパーを使って気軽に手続き的に非同期処理を書く事ができる

• Akka remote を使って重たい処理をバックエンドに飛ばすことも簡単

• Websocket も使えるよ

Page 73: Play jjug2012spring

リアクティブ

Page 74: Play jjug2012spring

リアクティブ

• Iteratee, Enumlator, Enumlatee• Haskel からヒントを得た IO モナドの実装

• ストリーム処理を抽象化し、イベントドリブンに処理できるようにしている模様

• 巨大なファイルアップロードを一度に大量に受け付けることなどを想定している?

• Guillaume と Sadek が Qcon で詳しく説明してくれています

http://www.infoq.com/presentations/Play-I-ll-See-Your-Async-and-Raise-You-Reactive

Page 75: Play jjug2012spring

高いテスタビリティ

Page 76: Play jjug2012spring

テスタビリティ

• Specs2 : BDD フレームワーク

• 組み込みのテストフレームワークとして採用

http://etorreborre.github.com/specs2/• Play2 はあらゆるものが Scala の関数であるため、テストしやすい

• Selenium WebDriver も組み込んでいてブラウザを通した受け入れテストも簡単に書ける

Page 77: Play jjug2012spring

テスタビリティ

• テンプレートもただの関数→View をテスト可

"render index template" in {

val html = views.html.index("Coco")

contentType(html) must equalTo("text/html")

contentAsString(html) must contain("Hello Coco")

}

Page 78: Play jjug2012spring

テスタビリティ

• コントローラもテスト可能

"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")

}

Page 79: Play jjug2012spring

テスタビリティ

• 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")

}

}

Page 80: Play jjug2012spring

テスタビリティ

• テストフレームワークが組み込みで用意されおり、特に準備することもなく即 TDD に取り掛かることができる

• CI を組むのが簡単

• アジャイル開発にとてもマッチするフレームワーク!

Page 81: Play jjug2012spring

プラグイン機構

Page 82: Play jjug2012spring

プラグイン機構

• フレームワーク全体にプラグイン機構を採用

• DB層や Akka などはプラグインとして実装されている

• 1.xほどのバリエーションはまだないが、 MongoDB, Redis, Memcached, Spring, Guiceなど、続々プラグインがリリースされている。

http://www.playframework.org/documentation/2.0.1/Modules

Page 83: Play jjug2012spring

利用事例

Page 84: Play jjug2012spring

Klout• ソーシャルスコアリングで勢いのあるベンチャー

• 検索コンポーネントと、 Klout API の部分をPlay+Scala で構築している

http://corp.klout.com/blog/2012/03/sexy-api-from-klout/

Page 85: Play jjug2012spring

英ガーディアン

• コンテンツAPI の実装に Play2 Scala を採用している

• github で実装を公開もしている

https://github.com/guardian/frontend

Page 86: Play jjug2012spring

Minecraft• ネットで旋風を巻き起こしたインディーズゲームの Web サイト

Page 87: Play jjug2012spring

多数のスタートアップ

• 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

Page 88: Play jjug2012spring

その他

• Verizon• Fannie Mae• Freddie Mac• Foreclosure.com

Page 89: Play jjug2012spring

国内

• 情報が少ないのが正直なところ

• 金融機関などでも使われているという噂はあり

• ちなみに私が関わった案件はすべて Play● 某大手研修サイトの一部機能● 某大手不動産業者サイトのコンテンツAPI● 某大手生保スタッフサイトの一部機能● 某イベントの受付フォーム

Page 90: Play jjug2012spring

デプロイ

Page 91: Play jjug2012spring

デプロイは苦労知らず

• Servlet コンテナを使わない

• 開発環境と本番環境の差異がほぼ発生し得ない

• リポジトリからチェックアウトすればデプロイ完了

Page 92: Play jjug2012spring

即時スケールアウト可能

• ステートレスなフレームワークであるため、 IaaS や PaaS と相性が良い

• Java が使える環境であれば、普通のレンタルサーバでも特に問題はない

Page 93: Play jjug2012spring

PaaSの選択肢

•Heroku•Cloudbees•OpenShift• Cloudfoundry

• Google AppEngine

• DotCloud

• Amazon Beanstalk

ネイティブサポートネイティブサポート

Page 94: Play jjug2012spring

どうですか?

• Play! Framework って楽しそうじゃないですか?

Page 95: Play jjug2012spring

日本Playframeworkユーザー会

• https://groups.google.com/forum/?fromgroups#!forum/play_ja

Page 96: Play jjug2012spring

日本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• 将来的にはコアメンバーたちを日本に呼ぶことも構想しています!!

• その実現のためには、みなさんのご参加が!!

Page 97: Play jjug2012spring

日本Playframeworkユーザー会

• ドキュメントの翻訳も行っています!

• 現在は 2.0.1 の翻訳を進めています。

• 興味のある方はぜひML でお知らせください。

Page 98: Play jjug2012spring

ご静聴ありがとうございました!