Skinny Framework Meetup Tokyo 1
ようこそ Skinny Framework Meetup Tokyo へ!!
http://skinnyjp.doorkeeper.jp/events/10607
(この記事は Skinny Framework Meetup Tokyo でのプレゼン内容です)
Skinny Framework
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 は何も取得しない設定になっています。
// 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 のコードを書いて試すことができます。これはぜひ試してみていただければと思います。
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.xml で Servlet セッションを 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 を追加しました。使い方はこの辺を見てください。
と、今気づきましたが、これは最近入ったばかりでまだドキュメントに説明がないので対応しないと、ですね。
テスト時の URLGenerator#url の NPE バグ への work around
Scalatra の URLGenerator#url が embedded Jetty を使った integration test 時のみ NPE を throw する既知の問題にとりあえず work around で対応しています(エラーにならないようにしているだけなので、リンクの href の assert はできない)。
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 を明示的に追加してください。
ScalikeJDBC 1.7.7 としてリリースされたこの改善の効果、かなり大きいです。10 個モデル生成して試したらコンパイル時間が半分〜 1/3 になりました。より大きいコードベースならもっとインパクトあると思います。https://t.co/9AiwgXuRMS
— Kazuhiro Sera (@seratch_ja) May 1, 2014
scalikejdbcのアプデでコンパイル速度が上がったおかげでMyFleetGirlsのコンパイルが捗る。めっちゃ早い
— ぽんこつ@本郷・春日 (@ponkotuy) May 2, 2014
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 は十分に実用レベルで利用可能なフレームワークです。今日は実際に試したり、情報交換などできればと思います。