seratch's weblog in Japanese

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

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 のスターがかなり増えていますね。また、手前味噌ですが ScalikeJDBCSkinny 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でメンテされる状況をつくることができればいいと思っています。ということで、既に関わってくださっている方々にはとても感謝しております。いつもありがとうございます。

*1:なお、もちろんスター数が多いからよいライブラリとは限らないのですが、必要条件ではあるとは思います

*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

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 は十分に実用レベルで利用可能なフレームワークです。今日は実際に試したり、情報交換などできればと思います。

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 を下さった全ての方に感謝いたします。

公式ドキュメント

こちらです。全て英語ですが、私が書いているので全部平易な表現で書かれています。

http://skinny-framework.org/

試す

Skinny Framework はすぐに試せます。JDK さえ入っていれば Mac OS XLinuxWindows を問わず 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

http://localhost:8080/members

にアクセスすると members テーブルの CRUD 画面が動作していることを確認できます。

テストを実行する

テストも大事ですね。db:migrate を忘れずに。

./skinny db:migrate test
./skinny test

カバレッジ計測も大事ですね。ということで scoverage を使えるようにしていますが

https://github.com/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

皆様のフィードバックをお待ちしています

*1:本当はもっと便利なものを入れたかったけど、ちょっと最近色々忙しいもので...これからも継続してやっていきます

*2:デフォルトの DB は SQLite3 ではなく、ローカルファイルの H2 Database ですが

*3:db migrate してない状態で model クラスをロードするとエラーになります

*4:拡張子は jar ですが

デブサミ 2014「OSSコミッタ大集合」に登壇

させていただきました。@ayumin さん、@koichiroo さんが和やかな雰囲気をつくってくださったので、特に緊張することもなく楽しいセッションになったのはないでしょうか。

http://event.shoeisha.jp/devsumi/20140213/session/394/

http://togetter.com/li/628956

こんな感じの話をさせていただきました。うまく伝えられなかったところは若干補足しています。

  • 他の方のように既存のプロジェクトに貢献・コミットされているのとはちょっと違ったパターンで、自分で始めたプロジェクトを育てている事例として紹介できればと思う。
  • 仕事では必要に応じて issue や PR を投げたりするが、プライベートでやるならできるだけ自分のコントロール範囲が広い方が楽しいと思っている。(これはスライドに書いてあって口頭では説明できなかった・・)
  • Scala で色々やっているのは Scala が好きだからというのが一番だが ScalaOSS 界隈がブルーオーシャンだからというのも大きい。Ruby のような大きなエコシステムが出来上がっているわけではないので「こういうのないかな」と思って探しても普通になかったりする(誰もつくってない or もうメンテされてないなど)。なので、まだまだデファクトスタンダードをとれそうな領域が結構ある。
  • ScalikeJDBC は DB アクセスライブラリで、これは二年くらいやってきてだいぶ育ってきていて、国内外で利用事例が増えてきた。
  • Skinny Framework は Web フレームワーク。バズりたくて "Scala on Rails" というキャッチコピーをつけているが、Scalatra(ScalaSinatra)の上に作り込みをしているので 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

NHKAPI は確か去年の 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 で設定する。そうするとうまくいくはず。

将来のバージョンではもう少し気の利いたエラーメッセージになってるといいですね。