B-Teck!

お仕事からゲームまで幅広く

【Scala/Play】PLAY2 + SLICK ハンズオンをやった

Play 2.5.x + Slick 3.1.x の手順をベースに「Play 2.8.x + Slick 3.3.2+(Play Slick 5.0.x)」の組み合わせでやってみた。
実装したものはこちら
バージョンを変えたことによってそのまま動かなかった箇所がいくつかあったので、メモとして残す。

プロジェクトの作成

Playの雛形作成は下記で2.8系を選択。

$ sbt new playframework/play-scala-seed.g8 --branch 2.8.x

build.sbt の記述の追記も合わせて変更している。

// ↓↓↓↓ここから追加↓↓↓↓  
libraryDependencies ++= Seq(  
  "com.h2database" % "h2" % "1.4.193",  
 "com.typesafe.play" %% "play-slick" % "5.0.0",  
 "com.typesafe.play" %% "play-slick-evolutions" % "5.0.0"  
)  
// ↑↑↑↑ここまで追加↑↑↑↑

DBの準備

  • H2がJDK11では動かず、JDK1.8環境に戻す必要があった
    • イントロダクションではJDK1.7以降と書いてあったので油断してた…

DB接続の設定

slick.dbs.default.driver がdeprecatedになっていたのでslick.dbs.default.profileに変更

slick.dbs.default.profile="slick.jdbc.H2Profile$"  

実装

UserControllerの雛形

package controllers

import models.Tables._  
import play.api.data.Forms._  
import play.api.data._  
import play.api.db.slick.{DatabaseConfigProvider, HasDatabaseConfigProvider}  
import play.api.mvc._  
import slick.jdbc.H2Profile.api._  
import slick.jdbc.JdbcProfile  
  
import javax.inject.Inject  
import scala.concurrent.{ExecutionContext, Future}

class UserController @Inject()(implicit ec: ExecutionContext,
                                val dbConfigProvider: DatabaseConfigProvider,
                                components: MessagesControllerComponents) extends MessagesAbstractController(components)
  with HasDatabaseConfigProvider[JdbcProfile] {

  /**
   * 一覧表示
   */
  def list = TODO

  /**
   * 編集画面表示
   */
  def edit(id: Option[Long]) = TODO

  /**
   * 登録実行
   */
  def create = TODO

  /**
   * 更新実行
   */
  def update = TODO

  /**
   * 削除実行
   */
  def remove(id: Long) = TODO

}

  • play.api.libs.concurrent.Execution がdeprecated
    • scala.concurrent.ExecutionContext へ修正
  • play.api.i18n.MessagesApi がdeprecated
    • MessagesControllerComponentsMessagesAbstractController へ修正
  • slick.driver.JdbcProfile がdeprecated
    • slick.jdbc.JdbcProfile へ修正

JsonControllerの実装

package controllers

import controllers.JsonController._
import models.Tables
import models.Tables._
import play.api.db.slick._
import play.api.libs.functional.syntax.{toFunctionalBuilderOps, unlift}
import play.api.libs.json._
import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents}
import slick.jdbc.H2Profile.api._
import slick.jdbc.JdbcProfile

import javax.inject.Inject
import scala.concurrent.{ExecutionContext, Future}


class JsonController @Inject()(implicit ec: ExecutionContext, val dbConfigProvider: DatabaseConfigProvider, cc: ControllerComponents)
  extends AbstractController(cc) with HasDatabaseConfigProvider[JdbcProfile] {

  /**
   * 一覧表示
   */
  def list = TODO

  /**
   * ユーザ登録
   */
  def create = TODO

  /**
   * ユーザ更新
   */
  def update = TODO

  /**
   * ユーザ削除
   */
  def remove(id: Long) = TODO
}

変更点はUserControllerの修正とほぼ同じだが下記のみ異なる

  • Controller が利用できなくなっている
    • ControllerComponentsAbstractControllerへ修正

参考

【IntelliJ/Scala】推論された型を常にエディタ上に出す

絶対忘れるので自分用のメモ。
Kotlinだとデフォルトで表示されてたような気がするけど、Scalaは設定しないと出ない?

IntelliJ IDEA > Preferences > Editor > Inlay Hints > Scala > Type hints
f:id:beatdjam:20210723053201p:plain

個人的にはParameter hintsのShow parameter hintsも両方有効にしておきたいところ
f:id:beatdjam:20210723053332p:plain

【本】実践Scala入門を読んだ

仕事でScalaを扱うことになったので読んだ。
この本の前に下記の本を読んでいたけど、100Pに満たない本なので触れられていないトピックも多く、全体的な言語仕様を知ろうと思ったのが理由。
【Scala】Scalaをはじめよう! ─マルチパラダイム言語への招待─ を読んだ - B-Teck!

本書も思想や言語の考え方を掘り下げるというよりは、言語機能やその扱い方の紹介がメイン。
目的は達せられたけど深い部分には触れられなかった。
Akkaの本も気になるけど、まずコップ本だよなぁ。

第1章 Scalaひとめぐり
第2章 Scalaの基礎
第3章 Option/Either/Tryによるエラー処理
第4章 コレクション
第5章 並行プログラミング
第6章 Scalaプロジェクトのビルド
第7章 ユニットテスト
第8章 知っておきたい応用的な構文
第9章 よりよいコーディングを目指して

章立てはこんな感じ。

以下感想。

  • 実践と言う割にそこまで実践的なテクニックが出てきた感じはしなかった
    • 言語機能はよく網羅されていたと思う
  • 並行プログラミングの章が大きなトピックになってるけどあまり旨味がわかってない
    • JVM言語でこれだけ単純にスレッドを扱えるのがうれしい?
    • 正直ここはあんまり読んでて楽しくなかった(個人の感想)
  • 6章のsbtの扱い方は勉強になった
    • 反面、IDEで開発するときにどのくらい利用されているのかは気になる
  • 7章のユニットテストも勉強になった
    • 複数の書き方やテストの方法等がわかりやすく並べられていたので良かった
    • 読了時点で、一部scalatestから切り出されているテスト向け機能などがあり、新しいバージョンで試す場合は注意が必要
  • 8、9章は大きな学びがあるわけではないものの、最低限注意しておくべき部分がまとまっている感じで良かった
  • 写経していたらいくつかそのまま動かせないコードやあっているのかわからないコードがあって困った
    • 読み方ミスってるだけかもしれない
    • 本音を言えば、収録コードをDLするか公開リポジトリに置いてほしい

次は挫折しなければコップ本を読みます。
先日第4版が出たばかりだし。