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

seratch's weblog in Japanese

About Scala, Java and Ruby programming in Japaense. If you need English information, go to http://blog.seratch.net/

スキニー東京 1 資料 #skinnyjp

Skinny Framework Meetup Tokyo 1

ようこそ Skinny Framework Meetup Tokyo へ!!

http://skinnyjp.doorkeeper.jp/events/10607

entrance

(この記事は Skinny Framework Meetup Tokyo でのプレゼン内容です)

Skinny Framework

Scala on Rails です。

http://skinny-framework.org/

Skinny Framework の歴史

Skinny Framework は 0.9 時代も含めるとだいたい半年弱の歴史があります。

年月日 バージョン 内容
2013/08 後半 --- プロトタイプ実装に着手
2013/09/25 0.1.0 Kabukiza.tech #1 でお披露目
2013/10/19 0.9.4 怖くない Scala でデモ
2013/11/28 0.9.17 怖い Scala で進捗報告
2014/03/28 1.0.0 最初の安定版リリース
2014/05/01 1.0.12 今日時点での最新バージョン

基本的に細かいリリースはどんどんする方針です。未リリースの機能が使いたいけど、なかなかリリースされないなーというときは何らかの手段で私に ping してください。

Skinny Framework 1.0.0 以降の変更点

基本的にライブラリの API については、致命的な不具合を除くソースコード互換性は 1.0.0-RC* から維持されています。1.0.0 以降は実際の開発現場で利用してみて見つかった問題や改善点を少しずつ修正してきました。

一方で skinny-blank-app.zip の内容は結構変わっています。古いひな形からつくったものをずっと使っている場合は一度最新のものと突き合わせ or Yeoman での管理をおすすめします。

それでは 1.0.0 以降の主要なトピックをざっと見てみましょう(Releases からの抜粋です)。

https://github.com/skinny-framework/skinny-framework/releases

skinny-blank-app-with-deps.zip の提供

今までの skinny-blank-app.zip とは別に約 80MB の skinny-blank-app-with-deps.zip も提供しています。これは最低限必要となる jar も含めた形で zip にしたもので、普段 Scala の開発をやっていないマシンでもすぐに Skinny の開発ができるようにするためのパッケージです。Typesafe Activator と近い発想ではありますが、こちらは初回起動時のみの話なので、それ以降は普通の sbt プロジェクトです。

Ivy の依存性解決は時間がかかってしまうので、今日のような場では特に有効だと思います。

また ./skinny idea(実体は sbt gen-idea)で javadoc も持ってくることがかなりのボトルネックになるので、最近の blank-app ではデフォルトでは他の jar は何も取得しない設定になっています。

https://github.com/skinny-framework/skinny-framework/blob/1.0.12/yeoman-generator-skinny/app/templates/project/Build.scala#L60-L61

// Nil じゃなく空文字一つをもつ Seq じゃないとエラーになる
transitiveClassifiers in Global := Seq("")

ただ IDEA で見るなら普通ソースコードはあった方がいいとは思います。その場合は以下のように変更いただければと思います。

transitiveClassifiers in Global := Seq(Artifact.SourceClassifier)

これは Skinny 以外の Scala プロジェクトでも使える tips ですね。「gen-idea が大阪から東京に着くまでの新幹線で終わらない」という悲劇を回避できるのではないでしょうか。

Scala.js との連携を強化

Scala.js を使った開発がかなりやりやすくなりました。

https://github.com/skinny-framework/skinny-framework/releases/tag/1.0.8

blank-app の状態からいきなり

  • 一つの terminal window で ./skinny scalajs:watch を起動しておく
  • もう一つの terminal window から ./skinny run を起動しておく
  • src/main/webapp/WEB-INF/assets/scala 配下に Scala.js のコードを置く
  • アクセスする HTML 内で以下の 2 つの JS を読み込む
<script type="text/javascript" src="${uri("/assets/js/application-extdeps.js")}"></script>
<script type="text/javascript" src="${uri("/assets/js/application.js")}"></script>

これだけでブラウザでアクセスすると source maps にも対応した状態(デバッガも使える)で Scala.js のコードを書いて試すことができます。これはぜひ試してみていただければと思います。

Chrome Dev Tools

sbt 0.13.2 を使えなかった問題が解決して incremental compiler がデフォルトに

xsbt-web-plugin の前のバージョンが動作しないという問題があったため、見送っていましたが sbt 0.13.2 が使えるようになったので、現在の skinny-blank-app では incremental compiler がデフォルトで有効になっています。

IDE のデバッガ連携をサポート

@gakuzzzz さんが対応してくれました。./skinny run の代わりに ./skinny debug [port] を実行すると JDWP(Java Debug Wire Protocol)連携が使えます。

ParamType に独自の型を指定可能に

これも @gakuzzzz さんがつくってくれました。直接聞いてください。ドキュメントに書いた方がいいですね。

Servlet セッションなどが不要な場合向けに SkinnyApiController を提供

Skinny を使って API サーバを実装する場合 web.xmlServlet セッションを off にしてしまいたいというニーズもあるかと思います。Flash のようなセッションを前提としている機能、テンプレートエンジン連携などを削ぎ落とした SkinnyApiController/SkinnyApiServlet を追加しています。デフォルトで削ぎ落とされているだけで Feature trait を追加すれば機能を使うこともできます。

ファイルアップロード

ファイルアップロードを実装する場合、ScalatraServlet の機能をそのまま使いますが、わかりやすいよう FileUploadFeature という trait を提供するようにしました。

http://skinny-framework.org/documentation/controller-and-routes.html#file-upload

シンプルな HTTP クライアントを追加

m3dev/curly というライブラリがあって、これは元々 Java 向けのシンプルな HTTP クライアントに Scala ラッパーがあるものでしたが、基本的な実装を流用しつつ pure Scala で書いた skinny-http-client を追加しました。使い方はこの辺を見てください。

https://github.com/skinny-framework/skinny-framework/blob/develop/http-client/src/test/scala/skinny/http/HTTPSpec.scala

と、今気づきましたが、これは最近入ったばかりでまだドキュメントに説明がないので対応しないと、ですね。

テスト時の URLGenerator#url の NPE バグ への work around

Scalatra の URLGenerator#url が embedded Jetty を使った integration test 時のみ NPE を throw する既知の問題にとりあえず work around で対応しています(エラーにならないようにしているだけなので、リンクの href の assert はできない)。

scalatra #368

ScalikeJDBC を直接使ったコードのコンパイル時間大幅改善

昨日(5/1)の話ですが、ScalikeJDBC のコンパイル時間を改善する PR をいただき、効果が大きかったので ScalikeJDBC 1.7.7 とデフォルトで 1.7.7 に依存したものを使っていただくようにということで Skinny ORM 1.0.12 をリリースしました。

https://github.com/scalikejdbc/scalikejdbc/pull/241

ScalikeJDBC の APIソースコードに多く含まれる場合はかなりインパクトが大きいと思います。Skinny 1.0.12 を使うか ScalikeJDBC 1.7.7 を明示的に追加してください。

Skinny Framework 1.1 について

依存するライブラリ、フレームワークのバージョンアップ対応に依存していますが、以下の対応を想定しています。

  • Scala 2.10、2.11 対応(依存ライブラリ待ち)
  • Scalatra 2.3 対応(@takezoe さんに期待)
  • ScalikeJDBC 2.0 対応(今対応中)
  • ScalaTest 2.1 対応(scalikejdbc-test の互換問題だけ)

また、可能な範囲で既存の issue にあがっている機能追加も入れたいと考えています。何か要望があればこちらにあげてください(英語でお願いします)。

https://github.com/skinny-framework/skinny-framework/issues?state=open

ソースコード互換性を崩す必要のある変更は今のところ予定していません。また、もし発生した場合も極力 @deprecated 指定による移行期間をもうけるようにするつもりです。

Enjoy Skinny Framework!

私自身もドッグフーディングしていますが、Skinny Framework は十分に実用レベルで利用可能なフレームワークです。今日は実際に試したり、情報交換などできればと思います。