読者です 読者をやめる 読者になる 読者になる

PlayFramework関西ビギナーズ in OsakanSpaceに参加してきました

表題の勉強会に参加してきました。

聴講中に残されていたメモをおいておきます。

以下メモ


PlayFramework 1.x

Scala
最近出てきた言語
JVM上で動く便利なやつ

JEE
小・中規模開発にはあまり向いていない・・・?
Javaはちょっとコードが冗長
StrutsをはじめとしてXml(設定ファイル)が糞ほどで生産されて面倒
➡つまり生産性が低い…

Play
何かと面倒臭いJEEを辞めた
さらばTomcat
環境によってホットリロードかどうかの切り替えももちろん可能
ステートレス
Javaはセッションを利用してサーバーサイドに情報を保存している
フルスタック(開発に必要なものは全部ぶちこんでいる)
Servletを利用したライブラリに関しては利用できない(JEEがないため)

なぜ今1.xなのか?
Scalaで書き直されているため読めないとつらい
Scalaは学習コストが高い…
1.3がリリースされる…という噂はある
現実的には1.xの方が…

まだまだ知名度が低く情報は少ない

  • JDKは1.5以上(1.xの話)
  • 2.x系は1.6以上

play1.x

  • 1.x系のテンプレートはGroovy

validation

  • @Requiredで簡単に入力値をチェック
  • 画面間でValidationの結果を受け渡すためにValidation.keepを利用する
  • messagesにてデフォルトのメッセージを変更
  • セッション ユーザーセッションが有効な間
  • フラッシュスコープ 次のリクエストにのみ持ち越し
  • キャッシュ JVM上に保持される.JEEで言うところのセッションに該当?memcachedで分散することが推奨されている模様
  • 1.x系JavaではDB周りもよしなにやってくれる…模様
  • ymlファイルにデータを打ち込んでおいてやればデータをサーバ起動時に流し込んでくれる
  • トランザクションはよしなにやってくれる
  • テーブルアノテーションという機能もある
  • カスケードで連動してくれるようになっている
  • CRUDの管理画面を提供してくれるモジュールcrud

play2.x
Scala

  • 手続き、オブジェクト、関数型のハイブリットな言語
  • 関数型で書くと並列処理でバグが生まれにくいうれしいメリット

ドキュメント 100ページ以上(playframework.org)
日本語版もあるよ

プラガブル
プラグインが充実している
最新版向けは27種類

静的な型付け
実行時にようやく分かるようなケアレスミスがなくなる。コンパイルで分かる。
ない関数は呼べない

play2.1は今年中…?
1系は2009年からのプロジェクトで安定している。Scalaもプラグインを利用すれば一応利用できる
2系は2012年から コアはScalaで書かれている Javaで言うところのサーブレットになっている…らしい
※勉強会から帰ったらRC1が公開されていました。胸が熱くなりますね

2.1での変更点
Scalaが最新に2.10?
JSONがもっと直感的に
ひな形作成がサポートされさらに簡単に!
ユニットテストやりすぎるとPlayが落ちると行った問題の解消
コンパイルが早くなる
AnormがデフォルトではなくなってScalaQueryに変更

今から始めるならなかな良い頃合い
単にWebアプリケーションを作ってみたい人にもおすすめ

ビーストハーレムはRC1からPlay2を利用
Squeryを利用しているが今となってはScalaQueryを使った方がいいんじゃないかといったところ

コンパイルはやっぱり遅い
古いマシンだと結構きつい 最新なマシンだとまし

ScalaでやるならPlayがよいのでは?Lift等他にもあることにはある

開発版を利用するとコンパイルが通らなくなるといったことが普通にある
Docomo,auは文字コードがWindows_?、SoftbankUTF-8でなかなか難しい

Scalaはコップ本、Playはドキュメント輪読をする
原則はペアプロを行う

やれモナドやれカリー化と関数型勉強会では言われるが一定の品質のものを作る分にはそこまでアカデミックな知識は問われない

ゲーム開発は保守の方が長く、リリースしてからがスタート
設定ファイルが複雑にならないというのは大きなメリット

新しいものに物怖じしない人がプロジェクト内に何人かいないとやっぱり厳しい…?



以上残されていたメモでした。
ちなみにScalaの勉強会もやるとかやらないとかって話があったので興味ある方は期待して待ちましょう

Play2.0:TODOリストを作成する

こちらで紹介されているTODOリストが最終的にどうなるかをまとめました
初めて作ったときにどこのソースに追加するのか少し迷ったので参考までに。

Application.scala

package controllers

import play.api._
import play.api.mvc._

object Application extends Controller {
  
  def index = Action {
    Redirect(routes.Application.tasks)
  }
  
  def tasks = Action {
    Ok(views.html.index(Task.all(), taskForm))
  }
  
  def newTask = Action { implicit request =>
    taskForm.bindFromRequest.fold(
      errors => BadRequest(views.html.index(Task.all(), errors)),
      label => {
        Task.create(label)
        Redirect(routes.Application.tasks)
      }
    )
  }
  
  def deleteTask(id: Long) = Action {
    Task.delete(id)
    Redirect(routes.Application.tasks)
  }
  
}

Task.scala

package models

import play.api.data._
import play.api.data.Forms._
import anorm._
import anorm.SqlParser._

case class Task(id: Long, label: String)

object Task {

  val taskForm = Form(
    "label" -> nonEmptyText
  )

  val task = {
    get[Long]("id") ~ 
    get[String]("label") map {
      case id~label => Task(id, label)
    }
  }
  
  def all(): List[Task] = DB.withConnection { implicit c =>
    SQL("select * from task").as(task *)
  }
  
  def create(label: String) {
    DB.withConnection { implicit c =>
      SQL("insert into task (label) values ({label})").on(
        'label -> label
      ).executeUpdate()
    }
  }

  def delete(id: Long) {
    DB.withConnection { implicit c =>
      SQL("delete from task where id = {id}").on(
        'id -> id
      ).executeUpdate()
    }
  }
  
}

index.scala.html

@(tasks: List[Task], taskForm: Form[String])

@import helper._

@main("Todo list") {
    
    <h1>@tasks.size task(s)</h1>
    
    <ul>
        @tasks.map { task =>
            <li>
                @task.label
                
                @form(routes.Application.deleteTask(task.id)) {
                    <input type="submit" value="Delete">
                }
            </li>
        }
    </ul>
    
    <h2>Add a new task</h2>
    
    @form(routes.Application.newTask) {
        
        @inputText(taskForm("label")) 
        
        <input type="submit" value="Create">
        
    }
}

以上に加えて

  • conf/application.conf
  • conf/routes
  • conf/evolutions/default/1.sql

を編集することで、アプリケーションを起動できるようになるかと思います。
自分でアプリケーションを作っていろいろいじって遊んでみましょう!

近いうちにTODOリストへのテストやログイン画面の作成なんかをやります。たぶん。