初心者による初心者のためのScalaでhello world

1 初心者による初心者のためのScalaでhello world

1.1 はじめに

このエントリは Scala Advent Calendar jp 2011の12/18日です。前日はeed3si9nさんのIterator パターンの本質でした。

このエントリではScalaを始めたときにhello worldから一歩踏み出すときの言語以外の部分、環境について書きます。

Scalaを始める人は大概scalaコマンドのREPLやhello worldから始めると思うんだけど、 そこからリアルワールドに飛び出すときにギャップが大きくて挫折しやすい。 というか3回くらい挫折しました、僕は。 hello.scalaをscalaコマンドに渡して実行するだけならともかく、 小さくてもプロダクトを作ろうとしたときに途方にくれてしまう。

これはScalaに限った話ではなく、 Javaでhello worldを書いたあとにいきなりMavenに手を出すか? あるいはPythonのREPLを触ったあとにスムーズにvirtualenvとsetuptoolsやeasy_installにたどり着くか?と同じ話です。

そういうベストプラクティスに乗っているか乗っていないかで挫折確率がぜんぜん違うと思うので 自分用のメモを兼ねてエントリを書こうと思った次第です。最も、これがベストプラクティスかどうかは知りません。多分、ただのプラクティスくらいな感じ。

1.2 Scalaの環境をつくる

Scalaに初めて触れる人は当然Scalaがインストールされていないはずなので、インストールから始めます。

当然のように $ yum install scalaなり、$ apt-get install scalaなり、$ brew install scalaすると思います。

しかしscala本体だけでは全然足りなくて周辺ツールも必要で、 Delphiや.NETのAnders Hejlsbergさんは「言語とライブラリ、開発環境は三位一体」 というような発言をしており、Scalaを入れただけでは開発環境が足りないのです。

というわけで、開発をサポートするツールとして以下の3つを入れます

  • cs: conscript GitHubからScalaのツールインストールするイケてるツール。
  • sbt: simple build tool 名前のSimpleというのには疑問だけどScalaだったらMavenよりもsbt
  • g8: Giter8 プロジェクトテンプレートをGitHubから取ってきて、雛形を作ってくれる
$ curl https://raw.github.com/n8han/conscript/master/setup.sh | sh
2011-12-19 2:14修正しました 現状 conscriptの最新版jarがリポジトリにデプロイされておらず
sbtのインストール時にコケます。
n8hanさんがデプロイすると問題は解決すると思いますが、以下のように問題回避できます。
あくまで一時的な対応です。
---修正ここから
$ git clone git://github.com/sett4/conscript.git
cd conscript
./setup-from-local.sh  (中でsbt-launch.jarを使ってconscriptをビルドして、ローカルのivyリポジトリにpublishしてます)
---修正ここまで 
$ cs harrah/xsbt --branch 0.11.2
これ、途中で入力プロンプトになって止まりますが、
慌てずCTRL+Cで終了してください。そのうちconscriptが修正されると思います。
$ cs n8han/giter8

1.3 conscriptってなんだろ

https://github.com/n8han/conscript

conscriptとはScalaで書かれたプログラムをインストールしたりアップデートしたりするツール。 具体的にに言うと以下の二つをします。

  1. githubのリポジトリから所定の場所にあるlaunchconfigをダウンロードしてきて2-3行環境依存の行を加える
  2. ダウンロードしてきたlaunchconfigをsbt-launch.jarに渡すスクリプトを~/bin以下に作成する

$ less ~/bin/screpl とやると、 java $CONSCRIPTOPTS -Xmx1G -jar Users/sett4.conscript/sbt-launch.jar @/Users/sett4/.conscript/harrah/xsbt/screpl/launchconfig “$@” という1行が書かれていいるだけなんだけど、それだけでうまく動いちゃう。 sbt-launch.jarが頑張ってるから。

1.4 sbt-launch.jarってなんだろ

https://github.com/harrah/xsbt/wiki/Launcher

sbtの一部。launchconfigに書かれている内容を元に、指定されたバージョンのjarをリポジトリから取得して依存を解決して実行してくれるものです。 大変素晴らしいです。

例えば、scala 2.9.1で動かしてたけどscala 2.8系でもちょっと動かしたいな〜 とかがlaunchconfigを書き換えるだけで簡単にできます。

1.5 sbtって何だろ

Simple Build Toolなんだけど僕にはどうにもSimpleには思えません。 しかしまー、Scala界隈的にはビルドにsbtを使うのはスタンダードになりつつあって 使っておけば間違いなさそうです。conscriptもsbtを前提にしたツールですし。

先程の$ cs harrah/xsbt –branch 0.11.2の実行によって~/bin以下には 以下の3ファイルができています。

  • sbt みんな大好きSimple Build Toolのコマンド
  • scalas SBT Script Runner https://github.com/harrah/xsbt/wiki/Scripts 標準のScalaコマンドと違ってスクリプトに埋め込まれた依存関係を解決してから実行してくれる。 こういうのが欲しかった! マジ便利。
  • screpl sbt REPL with dependencies.そのまま! このライブラリの依存を追加してREPL起動とかができちゃう。 https://github.com/harrah/xsbt/wiki/Scripts

1.6 screplでhello world

というわけえまずはREPL環境から。

$ ~/bin/screpl

と打つとREPLのシェルが立ち上がる。初回の起動だと依存関係を解決しつつ実行するのでけっこう時間がかかるかもしれないので気長に待って欲しい。 はい。 起動したら。

scala> println("hello world")
hello world

launchconfigファイルは ~/.conscript/harrah/xsbt/screpl/launchconfigにあるので、 scala 2.8.xでREPLやりたいなーとか思ったらversionを書き換えればOK.

あとは、依存を追加してscreplを起動したいなということもできます。 

1.7 scalasでhello world

~/bin/scalasは渡されたscalaのファイルを実行します。

$ cat > hello
#!/usr/bin/env scalas
!#

/***
scalaVersion := "2.9.1"
*/

println("hello world from scalas")

CTRL+D

$ chmod +x hello

$ ./hello をすると、画面にはhello worldが表示されます。 このあたりの書式については https://github.com/harrah/xsbt/wiki/Scripts を参照して欲しいんだけど、いくつか特徴的なのをピックアップすると

  • 2行目の!# どうやらScalaはスクリプトモードでコンパイルするときに#!から!#までをヘッダーとしてスキップするらしい。 むしろ無いとエラー
  • 4-6行目 動かしたいScalaのバージョンや、依存するライブラリ、依存解決に使えるリポジトリ等の定義ができる。sbtの機能。Wasshoi!!

ほんと気が利いてる。sbtには足をむけて寝れない。 小さいスクリプトはScalaで書こうかな?というような気になってくる。

1.8 sbtでhello world

最後にsbtでhello worldなのだけど、正直よくわかりません。 build.properties形式の書き方や、 build.sbt形式の書き方( https://github.com/harrah/xsbt/wiki/Getting-Started-Basic-Def )とかさっぱり存じ上げていなくてですね…… さらにカスタマイズ可能な.scalaによるプロジェクト定義( https://github.com/harrah/xsbt/wiki/Getting-Started-Full-Def )のほうも完璧にさっぱりでして……

それでも救いの神はいるもので、それは

$ cs n8han/giter8

とすれば降臨します。 girer8っていうのはmavenでいうところのarchetypeみたいなもので、プロジェクトの雛形を作ってくれる。

コマンドは

$ g8
$ g8 --list

でgiter8に登録されているテンプレートの一覧を出す。いっぱいありますね。 simpleとかでひっかけて、簡単そうなのを使うことにする。

$ g8 chrislewis/simple-scala-project 
$ vim ./build.properties

でsbtのバージョンを0.11.2に、scalaのバージョンを2.9.1にしてやって、

    $ vim ./src/main/scala/App.scala

package idea

object App {
  def main(args: Array[String]) = {
    println("hello world from sbt")
  }
}
    
    $ sbt
    sbt> run
    hello world from sbt

1.9 ビルドツールはsbtだけど、開発環境としてはEclipseを使いたい

今はもう21世紀が始まって10年以上経ちますし emacsやvimじゃなくてEclipseを使いたい?もちろん可能です。

$ vim build.sbt

以下の行を追加。 addSbtPlugin(“com.typesafe.sbteclipse” % “sbteclipse” % “1.5.0”)

そうすると、sbtの中でsbteclipseが使えるうようになります。 sbt> eclipse create-src とするとEclipseのプロジェクトファイルができあがります。

1.10 まとめ

とりあえずsbtとconscriptとgiter8使っておくと便利です。特にsbtは基盤ツールだと思います。

「X言語ができる」というからには 言語仕様と言語処理系のコードと標準ライブラリのコードは最低でも読んでるよね? みたいな風に仰る天上の方々もいるけど、 世界的には「オハヨーゴザイマス」「ドーモ ニンジャスレイヤー デス」「スシ オイシー」くらい言えれば 日本語できるって言っていいみたいなので もっと気軽にScalaやってScalaできるって言えばいいと思います。

うまくいかなかった方は @sett4 にreplyで教えてくれたり、 Tumblrのaskページから伝えてもらえると嬉しいです。また 日本Scalaユーザーズグループ に疑問を投稿したりすると僕なんかよりすごい方々が優しく教えてくれると思います。

enjoy!

明日はdekosukeさんです。

Date: 2011-12-18 16:50:37 JST

HTML generated by org-mode 6.33x in emacs 23

追記2011-12-19 01:56

  1. giter8のインストールのところで、”cs n8than/giter8” と間違えていたのを”cs n8han/giter8”と修正しました。
  2. 2011-12-19時点でリポジトリにあるconscriptのjarだとxsbtのlaunchconfigのパース時にエラーになります。それへの対応を追記しました。GitHubのconscriptは既に修正されていますので自前でビルドしてsbt publish-local出来る方はそうしていただいて、まだsbtが入ってない!って方は変更した記事中の方法を取っていただくと入れれます。ただし、記事中の方法は一時的な対応です。
Tags: scala