Scala DB ライブラリ事情(2014/06 版)
最初に調べてから一年経ったので、また GitHub スター数の推移を見てみました*1。というか、こういうの自動化するサービスがあるといい気がしてきたけど。。
DB ライブラリ
順位 | 名前 | 2013/06 | 2013/07 | 2013/08 | 2013/09 | 2013/10 | 2014/06 | 総増減 |
---|---|---|---|---|---|---|---|---|
1 | Slick | 613 | 638 | 658 | 692 | 717 | 922 | +309 |
2 | postgresql-async | 159 | 187 | 213 | 227 | 240 | 421 | +262 |
3 | Squeryl | 322 | 329 | 334 | 338 | 340 | 365 | +43 |
4 | ScalikeJDBC | 112 | 135 | 141 | 150 | 180 | 274 | +162 |
5 | Querulous | 154 | 157 | 158 | 162 | 164 | 170 | +16 |
6 | scala-activerecord | 92 | 101 | 104 | 113 | 130 | 168 | +76 |
7 | Activate | 85 | 94 | 99 | 103 | 112 | 163 | +78 |
8 | sqltyped | 109 | 108 | 110 | 119 | 121 | 162 | +53 |
9 | SORM | 91 | 95 | 97 | 100 | 102 | 127 | +36 |
10 | ScalikeJDBC-Async | - | 14 | 20 | 27 | 28 | 59 | +59 |
11 | Prequel | 35 | 37 | 39 | 41 | 44 | 58 | +23 |
12 | Relate | - | - | - | - | - | 42 | +42 |
13 | DataExpress | 24 | 24 | 27 | 27 | 29 | 37 | +13 |
14 | Scala SQL DSL | 28 | 27 | 27 | 27 | 28 | 28 | 0 |
15 | jdub | - | - | - | - | - | 24 | +24 |
16 | MyBatis Scala | 1 | 3 | 4 | 4 | 7 | 14 | +13 |
17 | ScalaSQL | 12 | 13 | 13 | 13 | 13 | 13 | +1 |
18 | Scweery | 12 | 12 | 12 | 12 | 12 | 11 | -1 |
19 | mirage-scala | 4 | 4 | 4 | 5 | 5 | 7 | +3 |
20 | shirahae-sql | - | - | 2 | 2 | 2 | 2 | +2 |
フレームワークの一部
順位 | 名前 | 2013/06 | 2013/07 | 2013/08 | 2013/09 | 2013/10 | 2014/06 |
---|---|---|---|---|---|---|---|
1 | Anorm | - | - | - | 3697 | 3797 | 4906 |
2 | Lift Mapper | - | - | - | 717 | 722 | 796 |
3 | Spring JDBC Scala | 154 | 168 | 182 | 194 | 212 | 262 |
4 | Skinny ORM | - | - | - | - | 99 | 251 |
5 | Circumflex ORM | 136 | 136 | 137 | 140 | 143 | 155 |
感想など
Slick と postgresql-async のスターがかなり増えていますね。また、手前味噌ですが ScalikeJDBC、Skinny ORM も順調に成長できたといってよいのではないかと思います。
注目すべき点としては Relate というライブラリが出てきてなかなか面白い存在です。Anorm と比較して「パフォーマンス的に生 JDBC と同等」とうたっています。
https://www.lucidchart.com/techblog/2014/06/17/performant-database-access-relate/
提供している Lucid Software というのはデータ分析をビジネスとする会社のようです。元々 Anorm を使っていたものの、かなり大量のデータを扱う必要があって ResultSet からの取り出し部分でのオーバーヘッドが無視できなかったため、独自で開発したとのこと。ここでいうオーバーヘッドは ResultSet からの取り出し部分に限った話なので、通常はそれほど重視する必要はないかなと思いますが、速いのはよいことですね。
また Simple Finance Technology という会社が出している jdub というライブラリを見落としていたようで、こちらを加えました。ただ、この会社が Scala 2.9.2 を使い続けているのか、他のバージョンへのリリースがされておらず、新しい Scala のメジャーバージョンが出る度に issue が登録されている状況のようです。ていうか、なんかビルドが Maven だけど...。
この会社、テストライブラリも自作していたりして、なかなか興味深いです。
https://github.com/SimpleFinance/simplespec
simplespec も Maven でやっているようですが、こちらは 2.11 にもビルドしているようなので jdub は一部の Scala 2.9.2 なレガシープロジェクトだけで使っているということなのかもしれません。
一般的にライブラリの提供元が会社であるということは、半強制的にメンテナンスがチーム体制となるので、継続性という面はプラス要因といえます。それだけでなく、少なくとも何らかの本番環境で使われているということの証明でもあります。最近の OSS では会社をつくるケースが増えている印象もありますが、やはり仕事の一環としてメンテナンスされているというのはよい状況だと思います。
私がやっているようなボランティアベースの開発においても、そのライブラリを使っている会社の開発者を積極的に関係者に巻き込んでいくことで、会社をまたいだ業界内のギルトのようなチーム*2でメンテされる状況をつくることができればいいと思っています。ということで、既に関わってくださっている方々にはとても感謝しております。いつもありがとうございます。
JJUG CCC 2014 Spring で登壇しました #jjug_ccc
JJUG CCC 2014 Spring – R2-4 Skinny Framework で始める Scala
http://www.java-users.jp/?page_id=1048#R2-4
プレゼン資料
感想など
運営の皆様ありがとうございました。懇親会も非常に楽しかったです。
Skinny よかったらぜひ使ってみてください。
スキニー東京 1 資料 #skinnyjp
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 は十分に実用レベルで利用可能なフレームワークです。今日は実際に試したり、情報交換などできればと思います。
Skinny Framework 1.0.0-RC1 をリリース
English?
This is an article for Japanese developers. English article is here:
http://blog.seratch.net/post/77537302500/try-skinny-framework-1-0-0-rc1
Release Candidate 1
Skinny Framework 1.0.0-RC1 をリリースしました。基本的にはこれからは大きな機能追加はせずにバグの修正や API の最終的な確認・改善を行っていきます*1。
これから約 1 ヶ月、いろんな方に試していただいて final を良い形でリリースできればと思っています。
まずチームに感謝
私一人の力ではありません。本業も忙しい中、contribute してくださった @BlackPrincess と @Arakaki の両氏と pull request を下さった全ての方に感謝いたします。
公式ドキュメント
こちらです。全て英語ですが、私が書いているので全部平易な表現で書かれています。
試す
Skinny Framework はすぐに試せます。JDK さえ入っていれば Mac OS X、Linux、Windows を問わず skinny コマンドだけを使って起動するまではとても簡単に試せます。
wget https://github.com/skinny-framework/skinny-framework/releases/download/1.0.0-RC1/skinny-blank-app.zip unzip skinny-blank-app.zip cd skinny-blank-app ./skinny run
scaffold を試すのが理解の近道です。Rails と似た感じで*2、簡単に scaffold を試せます。基本的には動かしながら scaffold しても大丈夫です*3。
./skinny g scaffold:jade members member name:String "nickname:String:varchar(64)" birthday:Option[LocalDate] ./skinny db:migrate ./skinny run
にアクセスすると members テーブルの CRUD 画面が動作していることを確認できます。
テストを実行する
テストも大事ですね。db:migrate を忘れずに。
./skinny db:migrate test ./skinny test
カバレッジ計測も大事ですね。ということで scoverage を使えるようにしていますが
./skinny scoverage:test
Skinny ORM の SkinnyCRUDMapper との相性が悪いようです。これはまだ詳細未調査なのでフィードバックできていないのですが、解決に向けて動いていければと思っています。
war ファイルをつくる
package コマンドを実行するだけです。build の下に生成されます。
./skinny package
スタンドアロン jar をつくる
Jenkins や GitBucket などダウンロードしてきた war ファイルを java -jar ですぐに Web サーバとして起動できるのは非常に便利ですが、そういうファイルをすぐにつくることもできます*4。
こちらは素晴らしい sbt-assembly を使わせていただいていますが、skinny-blank-app.zip では既に諸々の設定がされているので、以下のコマンドを叩くだけ。
./skinny package:standalone
皆様のフィードバックをお待ちしています
Skinny Framework 1.0.0-RC1 を出しました。final の前にここだけはどうにかしろとかそういうフィードバックを頂けると非常に嬉しいです。final は 3 月後半予定。
— Kazuhiro Sera (@seratch_ja) February 22, 2014
デブサミ 2014「OSSコミッタ大集合」に登壇
させていただきました。@ayumin さん、@koichiroo さんが和やかな雰囲気をつくってくださったので、特に緊張することもなく楽しいセッションになったのはないでしょうか。
http://event.shoeisha.jp/devsumi/20140213/session/394/
きゃー瀬良さーん! #devsumiE pic.twitter.com/NkKNTlk2di
— Yuichiro Umezawa (@garbagetown) February 13, 2014
こんな感じの話をさせていただきました。うまく伝えられなかったところは若干補足しています。
- 他の方のように既存のプロジェクトに貢献・コミットされているのとはちょっと違ったパターンで、自分で始めたプロジェクトを育てている事例として紹介できればと思う。
- 仕事では必要に応じて issue や PR を投げたりするが、プライベートでやるならできるだけ自分のコントロール範囲が広い方が楽しいと思っている。(これはスライドに書いてあって口頭では説明できなかった・・)
- Scala で色々やっているのは Scala が好きだからというのが一番だが Scala の OSS 界隈がブルーオーシャンだからというのも大きい。Ruby のような大きなエコシステムが出来上がっているわけではないので「こういうのないかな」と思って探しても普通になかったりする(誰もつくってない or もうメンテされてないなど)。なので、まだまだデファクトスタンダードをとれそうな領域が結構ある。
- ScalikeJDBC は DB アクセスライブラリで、これは二年くらいやってきてだいぶ育ってきていて、国内外で利用事例が増えてきた。
- Skinny Framework は Web フレームワーク。バズりたくて "Scala on Rails" というキャッチコピーをつけているが、Scalatra(Scala 版 Sinatra)の上に作り込みをしているので Padrino Framework 的なもの。来月 version 1.0.0 を出す予定。
- 最初の頃はコツコツつくりながら勉強会などで「使ってみて」と告知していたが、最近は国内外で利用してくれる方も増えてきた。実際使ってみた上での pull request や要望などが増えてきた。プロジェクトの方針として PR を reject するようなケースも出てきたし、プロジェクト運営としては個人でつくっているものから次の段階へと進み始めているのかなと思う。
- 以前は全てを自分でコントロールしたいと思ってやっていたが、最近は手を挙げてくれる人、やってくれそうな人に積極的に任せるようにしている。そうしないと回らなくなってきているし、やはりその方が良いものができる。
- Q: だいたい何人くらいでやってるの? A: (どちらも)だいたい 3 - 4 人くらいがアクティブに活動している状況。
- Q: どんな反応が多い? A: 海外の人は GH の issue とかあげる前にカジュアルに gmail のアドレスとかにメールしてくる人が多い印象がある。日本で issue とかあげてくれるような人は律儀な人が多い気がする。世界で見るといろんな人がいるなぁという印象。先ほどの松田さんの Rails の話にも共感したが、関わってくれる人はうまくいくようにと思って行動してくれているわけなので、お互いがうまくいくようにと思いながら対応している。
ScalikeJDBC の説明で「最近だと Nulab さんの新しいサービス (http://www.typetalk.in/) でも使ってくださってるんですよー!」とかドヤ顔するつもりだったんですが、すっかり忘れていました・・
ちなみに、オフラインだといくつかの会社さんでも使ってくださってるとうかがっているのですが、差し支えなければ、「使ってるよ」と公言していただけると私としても非常にうれしいです。
今年は、知名度の向上、ドキュメントの更なる充実など実装以外のやるべきことにももっと取り組んでいきたいと思っています。
NHK 番組表 API の Scala クライアント
http://api-portal.nhk.or.jp/ja
正式な開始は 1/27 みたいだけど、API キーも発行できるみたいだし、ひまつぶしに Scala クライアントを書いてみました。
実装は・・カッとなってやった感満載なので、気になる人は pull request とかいただければうれしいです。
https://github.com/seratch/nhk4s
sbt-sonatype を使ってリリースしました。問題なく使えました。すばらしいです。
http://search.maven.org/#search%7Cga%7C1%7Cnhk4s
NHK の API は確か去年の 6 月にリリースするということになっていましたが、おそらく前例もないことで色々大変だったんだろうと思います。中の方々、チャレンジ大変お疲れさまでした。
npm login で default value must be string or number
ブログに書くことで記憶に定着させよう程度の内容ですが、新しいマシンで npm publish しようとして、まず npm login しようとすると謎めいたエラーメッセージが。username/password は合ってるのに。
$ npm -v 1.3.21 $ npm login Username: xxxx Password: npm ERR! Error: default value must be string or number npm ERR! at read (/usr/local/Cellar/node/0.10.24/lib/node_modules/npm/node_modules/read/lib/read.js:15:11) npm ERR! at readEmail (/usr/local/Cellar/node/0.10.24/lib/node_modules/npm/lib/adduser.js:96:3) npm ERR! at loop (/usr/local/Cellar/node/0.10.24/lib/node_modules/npm/lib/adduser.js:33:20) npm ERR! at /usr/local/Cellar/node/0.10.24/lib/node_modules/npm/lib/adduser.js:89:5 npm ERR! at Interface.onLine (/usr/local/Cellar/node/0.10.24/lib/node_modules/npm/node_modules/read/lib/read.js:111:5) npm ERR! at Interface.EventEmitter.emit (events.js:95:17) npm ERR! at Interface._onLine (readline.js:202:10) npm ERR! at Interface._line (readline.js:531:8) npm ERR! at Interface._ttyWrite (readline.js:760:14) npm ERR! at ReadStream.onkeypress (readline.js:99:10) npm ERR! If you need help, you may report this *entire* log, npm ERR! including the npm and node versions, at: npm ERR! <http://github.com/isaacs/npm/issues>
エラーメッセージをググるとすぐわかるレベルの話で、これと類似なんですが
https://github.com/npm/npm/issues/4363
npm は $HOME/.npmrc に email が設定済であることが前提になっているようで。
.npmrc を開いて email=xxx@example.com と一行書き足すか、npm config set email xxx@example.com で設定する。そうするとうまくいくはず。
将来のバージョンではもう少し気の利いたエラーメッセージになってるといいですね。