テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

Scalaざっと調べ

Scalaは学生の頃より興味を持っていました. 一応, 本などは読みましたが, 本格的に使おうという気にはなりませんでした.

Scalaオブジェクト指向と関数型の融合ということが良く言われますが, 僕は関数型の方に興味があるので, オブジェクト指向的にも書けてしまうScalaはなんとなく嫌だなと思っていました. 逃げ道があるというのはストイックではありません. しかし運命なのか, この度, 仕事でScalaを使う機会に恵まれてしまったので, Scalaについて色々と調べました.

この記事ではScalaの文法ではなく, 以下のことについて書きます. とりあえずScalaを触りたい!レベルの人には有益だと思います. とにかく走りだすことが重要なことは多いと思います.

なお, このブログに書いてあることを反映したプロジェクトをGithubにうpしておきました. このプロジェクトを見れば, Scalaをとりあえず始めることが出来るでしょう.

https://github.com/akiradeveloper/scalafun

SBTの使い方

Simple Build Tool (SBT)は, Scala向けのビルドシステムです. Scala向けというのは語弊があります. JavaMavenやAntを置き換える立ち位置にあると私は理解しています.

SBTを使うと以下のことが出来ます.

  • 使いたいライブラリをダウンロードしてくれます. Mavenのような感じです.
  • 自動ビルドが出来ます. ファイルを更新すると自動的にビルドが走ります. autotestのように, 自動的にテストを回すことも出来ます.
  • jarファイルを簡単に作ることが出来ます.

詳しくはネットで調べると良いでしょう. 例えば, http://scalajp.github.io/sbt-getting-started-guide-ja/ が本格的ですし, 私のGithubを見て始めるのが, 最小を知るにはてっとり早いかも知れません.

SBTを使うと, jarファイルを作ることが出来ます. sbt-assemblyというプラグインを使います. http://qiita.com/items/260e237df56f70bcb975 に最小の使い方が書いてあります.

嵌るところはほとんどないと思います.

ユニットテストの仕方

Scalaユニットテストでもっとも基本的なのはScalaTestだと思います. 私はこれしか試していないので, ScalaTestについて話します. ただし, 一般的なテストならばScalaTestで十分だと思います. 満たすべき性質に着目してQuickCheckのようなことがしたい場合は, scalacheckを使うのだと思います.

Scalaにおけるユニットテストについては, http://seratch.hatenablog.jp/entry/20110807/1312726957 が良くまとまっています. ご覧のとおり, 色々なスタイルのテストを書くことが出来ます. たぶん, implicit conversionを活用しているのではないかと思います.

嵌りポイントが一箇所. なんと, 公式に書いてあるコードは, 比較的新しいバージョンではコンパイル出来ません. ShouldMatchersが, org.scalatest.matchers以下に移動されているのです.

Vim環境の作り方

シンタックスハイライト

シンタックスハイライトは, 本家のhttps://lampsvn.epfl.ch/trac/scala/browser/scala-tool-support/trunk/src とかから落としてきて.vim以下にぶちこむのが正道なのですが, すごくめんどくさいので, vim-scalaをNeoBundleで入れるのが一番楽だと思います.

コード補完

Shougoさんのneocomplecacheを使います.

オムニ補完は, .dictファイルを.vim/dict以下に格納します. 例えば, https://github.com/tyru/dotfiles/blob/master/dotfiles/.vim/dict/scala.dicthttps://github.com/yuroyoro/vim-scala/blob/master/dict/scala.dict を使うと良いと思います.

スニペット補完は, http://wp.krks.net/2011/03/vimneocomplcache%E3%81%A7scala%E7%94%A8%E3%81%AEsnippets%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B/ が参考に出来ると思います.

雑記

ctagsを使う

ctagsは, ソースコードをタグジャンプして探索していくのに便利です. ctagsをScalaに対応させるには, .ctagsを記述する必要があります. 設定方法は, http://ronor.blog81.fc2.com/blog-entry-66.html に書いてあります. 以下を記述すると書いてあります.

--langdef=scala
--langmap=scala:.scala
--regex-scala=/^[ \t]*class[ \t]+([a-zA-Z0-9_]+)/\1/c,classes/
--regex-scala=/^[ \t]*trait[ \t]+([a-zA-Z0-9_]+)/\1/t,traits/
--regex-scala=/^[ \t]*type[ \t]+([a-zA-Z0-9_]+)/\1/T,types/
--regex-scala=/^[ \t]*def[ \t]+([a-zA-Z0-9_]+)/\1/m,methods/
--regex-scala=/^[ \t]*val[ \t]+([a-zA-Z0-9_]+)/\1/C,constants/
--regex-scala=/^[ \t]*var[ \t]+([a-zA-Z0-9_]+)/\1/l,local variables/
--regex-scala=/^[ \t]*package[ \t]+([a-zA-Z0-9_.]+)/\1/p,packages/
--regex-scala=/^[ \t]*case class[ \t]+([a-zA-Z0-9_]+)/\1/c,case classes/
--regex-scala=/^[ \t]*object[ \t]+([a-zA-Z0-9_]+)/\1/o,objects/

並列・分散

Scalaでコードを書いて, それがOpenCLのコードになる実装が試されているようですが, まともには動いていないようです. https://github.com/ochafik/ScalaCL

日本人によるLT資料がここにあります. http://d.hatena.ne.jp/chimerast/20110828/1314536925

CUDA用ですが, nvidiaによるThrustの方がずっとまともに思います. HaskellにもAccelerateというのがあります. Scalaは並列では一歩ビハインドかも知れません.

分散用では, Sparkというのが実装されています. 分散という点では, Akkaが有名です. Scalaは, 並列や分散と言った分野からも注目されているのだと思います.

勉強するためには

Twitterが書いた, Effective Scalaが日本語に翻訳されています. また, リンク先でも紹介されていますが, Scala Schoolなどが, 基本的なことを学ぶために用意されています.
Scalaは, Haskellに比べると随分と道がしっかりしているという印象です. Scalaは, 実用的な言語というポジションを狙っていますし, Twitterなどでの採用実績もあります. 成功しつつある言語なのではないでしょうか.