• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
JavaからScalaへ
 

JavaからScalaへ

on

  • 5,442 views

 

Statistics

Views

Total Views
5,442
Views on SlideShare
2,707
Embed Views
2,735

Actions

Likes
16
Downloads
17
Comments
0

7 Embeds 2,735

http://d.hatena.ne.jp 2175
http://kikutaro777.hatenablog.com 451
http://sgykfjsm.github.io 98
http://cloud.feedly.com 6
https://twitter.com 3
http://localhost 1
http://matomi.jp 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    JavaからScalaへ JavaからScalaへ Presentation Transcript

    • JavaからScalaへ ScalaでWeb開発はこう変わる Naoki Takezoe @takezoen NTT-DATA INTELLILINK
    • 自己紹介 • NTTデータ先端技術所属 • Project Amateras • Seasar2 • Apache Click • Java + アジャイル
    • 自己紹介 • NTTデータ先端技術所属 • Project Amateras • Seasar2 • Apache Click • Scala + アジャイル
    • Web開発言語としてのScala • ステートレス • HTTPもステートレス • クライアント側で頑張る流れになってきている • 関数型言語のステートレスな性質と相性がよい • コレクション操作 • Webアプリは基本的にデータを加工して表示する • 強力なコレクションAPIはこのような処理と相性が よい • フレームワーク • ノンブロッキングI/Oを活用 • アクセス数の多いシステムのバックエンドに適して いる
    • たとえばこんなプロジェクト • JavaベースのWebアプリをScalaにポーティング • 約170画面、約40,000 lines • 最大5人×6ヶ月 • コード量を40~50%削減、品質向上 Before • Seasar2 • Apache Click • S2JDBC • PostgreSQL + Tsearch • Raw JavaScript After • Play2 (Customized) • ScalaQuery (Cuztomized) • PostgreSQL • Apache Solr • jQuery + jQuery UI
    • たとえばこんなプロジェクト • JavaベースのWebアプリをScalaにポーティング • 約170画面、約40,000 lines • 最大5人×6ヶ月 • コード量を40~50%削減、品質向上 Before • Seasar2 • Apache Click • S2JDBC • PostgreSQL + Tsearch • Raw JavaScript After • Play2 (Customized) • ScalaQuery (Cuztomized) • PostgreSQL • Apache Solr • jQuery + jQuery UI Flexibility and Safety
    • ScalaのWebフレームワーク • Play2 • フルスタックのWebフレームワーク • ScalaのWebフレームワークとしては最もメジャー • Nettyベース(ノンブロッキング) • Scalatra • Sinatra由来のマイクロフレームワーク • シンプルだが周辺モジュールが充実している • Servletベース
    • Play2
    • Play2はノンブロッキング • 1台で処理できるリクエスト数を上げる • 非同期処理も簡単に書ける def index = Action { val futureInt = scala.concurrent.Future { intensiveComputation() } Async { futureInt.map(i => Ok("Got result: " + i)) } }
    • でも… • ボトルネックであるDBアクセスがブロックし てしまう
    • 最近はこんなのがあります • postgresql-async https://github.com/mauricio/postgresql-async • ノンブロッキングなPostgreSQL/MySQLアクセス 用のドライバ val future: Future[QueryResult] = connection.sendQuery("SELECT 0") val mapResult: Future[Any] = future.map(result => result.rows match { case Some(rs) => rs.head(0) case None => -1 }) val result = Await.result( mapResult, 5 seconds )
    • Play2はタイプセーフ • テンプレートもタイプセーフ @(customer: Customer, orders: List[Order]) <h1>Welcome @customer.name!</h1> <ul> @for(order <- orders) { <li>@order.getTitle()</li> } </ul>
    • Play2はタイプセーフ • ルーティングもタイプセーフ GET /clients/:id controllers.Clients.show(id: Int) 設定ファイルにルーティングを定義 コントローラやテンプレートで逆引きが可能 def index = Action { Redirect(routes.Clients.show(1)) } <ul> @clients.map { client => <li><a href=“@routes.Clients.show(client.id)”>@client.name</a></li> } </ul>
    • WebSocketも簡単に使えます def index = WebSocket.using[String] { request => // クライアントにメッセージをプッシュするEnumerator val out = Enumerator.imperative[String]() // クライアントから送信されたメッセージを処理するIteratee val in = Iteratee.foreach[String]{ message => out.push("Hello " + message + "!") } (in, out) } クライアントからのメッセージを受信するためのIterateeと、 クライアントにメッセージを送信するためのEnumeratorの タプルを戻り値として返す
    • クライアント側はこんな感じ @()(implicit request: RequestHeader) … <script> var ws = new WebSocket("@routes.WebSocketController.index.webSocketURL()"); // サーバーからプッシュされたメッセージをダイアログで表示 ws.onmessage = function (evt) { alert(evt.data); } </script> <input type="text" id="name"> <input type="button" value="Send" onclick="ws.send($('#name').val())"/> … エンドポイントのURLを タイプセーフに指定できる
    • Play2はステートレス • サーバサイドに状態を持たない • セッションIDだけクッキーに持たせてデータは外 部のKVSなどに置く • クライアント側で状態を管理する Play2 App HTML / JavaScript スマート フォン
    • Servletコンテナでは動作しない • warにするプラグインが存在しますが茨の道な のでやめといたほうがいいです • 既存のJavaベースのシステムのポーティング には向いていない
    • Scalatra
    • こんな感じ class MyServlet extends ScalatraServlet with ScalateSupport { get("/") { // リクエストパラメータを取得 val name = params("name") // XMLリテラルでレスポンスを生成 <html> <body> <h1>Hello, world!</h1> Say <a href="hello-scalate">hello to {name}</a>. </body> </html> } }
    • Scalatraの特徴 • 周辺モジュールとして認証、バリデーションな どがあり必要な機能は一通り揃っている • Play2のようなタイプセーフなテンプレートも 使用できる • ルーティングはタイプセーフに記述できない • Servlet 3.0対応のコンテナで動作する • HttpSessionやServlet APIも使用可能なので、 既存のJava Webアプリの移植に向いている
    • 使い分け Play2 既存のAPサーバ(Tomcat等) Scalatra Slick(ORM) JavaVM Non-Blocking I/Oを活かした多重度重視の 構成。同時接続数が多く、スケーラビリティ が必要なBtoC向けサイトやスマートフォン アプリのバックエンドなどに向く。 Tomcat等のAPサーバ上で動作可能な構成。 既存のJavaアプリケーションのポーティング やアクセス数の予測が容易な業務アプリケー ションなどに向く。 Netty Stateless & Scalable Stack Stable & Reliable Stack
    • Scala is now glowing up! • Scalaは業務でも十分に使える言語です。 • ScalaにはJavaでは失われた熱気があります。 • まだ未熟な部分もありますが、一緒に成長して いきましょう!
    • ご清聴ありがとうございました Scala逆引きレシピ • Scalaの基本から各種フレームワークまで実 践的な300のレシピを収録 • 特にこれからScalaを勉強してみようという Javaプログラマの方におすすめ