IDEを使わず気軽にScalaを始めるまで


# 概要
開発サーバ上でサクッと Scala を書く機会があったので、IDE を使わない Scala 環境構築についてまとめてみます。
CLI (CUI) と Vim のみで気軽に Scala を書き始めちゃいましょう。

おまけで AWS SDK を使えるようにする設定も書いてみました。

## 入れたもの
- [scalaenv](https://github.com/mazgi/scalaenv)
- [sbt](http://www.scala-sbt.org/)
- [vim-scala](https://github.com/derekwyatt/vim-scala)

### おまけで入れたもの
- [AWS SDK for Java](http://aws.amazon.com/sdk-for-java/)

CLI 環境で Scala が書きたいだけで余計な情報は必要ないんだよ！って方は、sbt のチャプターだけ読んでいただければ大丈夫かと思います。

# scalaenv
Scala のバージョンマネージャです。Ruby では rbenv 、Python では pyenv が有名ですね。
scalaenv は Ruby の rbenv を元に作られたものだそうです。

必須ではありませんが、システム環境を汚すのが余り好きじゃないので使っています。

## インストール
README の Installation にしたがってインストールします。

```bash
$ git clone git://github.com/mazgi/scalaenv.git ~/.scalaenv
$ echo 'export PATH="${HOME}/.scalaenv/bin:${PATH}"' >> ~/.bash_profile
$ echo 'eval "$(scalaenv init -)"' >> ~/.bash_profile
```

## Scala のインストール
scalaevn を利用して Scala の最新バージョンを導入します。

まずは最新バージョンを確認。

```bash
$ scalaenv install -l
```

どうやら執筆時点 (2015/06/14) では`scala-2.11.6`が最新のようなので、そちらをインストールします。

```bash
$ scalaenv install scala-2.11.6
```

インストール後、`scala-2.11.6`を通常使う Scala のバージョンに設定します。

```bash
$ scalaenv global scala-2.11.6
```

以下のコマンドでバージョンを確認できます。

```bash
$ scala -version
```

バージョンが表示されていれば、これで Scala のインストールは完了です。
簡単に動かしてみましょう。

```bash
$ scala
```

```scala
scala> println("Hi!")
Hi!
```

無事、動きました。

# sbt
sbt は Scala 用のビルドツールです。プログラムのビルドをよしなにやってくれます。
一言で言うとビルドを超簡単にしてくれるやつで、コマンド一発でビルドできるようになります。

ビルドツールを採用しなかった場合、きっと色々だるいです。
C を使っていたい時代にファイル分割しようとして「だるい！」ってなった記憶があります。
ちなみに、にわか C 使いだったため、Makefile を書いた経験はありません。

ところでなんて読むんでしょうねこれ。酢豚？

## インストール
sbt 公式ページに日本語でインストール方法が書いてある親切設計です。

- [Mac への sbt のインストール](http://www.scala-sbt.org/0.13/tutorial/ja/Installing-sbt-on-Mac.html)
- [Linux への sbt のインストール](http://www.scala-sbt.org/0.13/tutorial/ja/Installing-sbt-on-Linux.html)

Mac で homebrew を使っている方は、以下のコマンド一発で導入出来ます。

```bash
$ brew install sbt
```

## 設定
### ディレクトリ
まずはプロジェクトのルートとなるディレクトリを作り移動します。

```bash
$ mkdir scala-project
$ cd scala-project
```

そして必要最低限のディレクトリを作成します。

```bash
$ mkdir -p src/main/scala
$ mkdir -p src/test/scala
$ mkdir -p lib
```

名前から推測できるように`src/main/scala`が scala のソースファイルを置くところです。
`src/test/scala`はテストファイルを格納するディレクトリです。
`lib`も名前の通り、ライブラリ置き場です。

`src/main/java`を作成して、そこに Java のソースファイルを格納することも出来ます。
また、`src/main/scala-x.xx`のようにバージョン指定のフォルダを追加すると、複数バージョンの Scala を共存させることも可能のようです。

### プロジェクト
プロジェクトの設定ファイルもプロジェクトルートに簡単に作っておきます。

```bash
$ touch build.sbt
```

```scala:build.sbt
lazy val root = (project in file(".")).
  settings(
    name := "scala-project",
    version := "1.0",
    scalaVersion := "2.11.6"
  )
```

`build.sbt`の詳細は[こちら](http://www.scala-sbt.org/0.13/tutorial/ja/Basic-Def.html)に書いてあります。

## 実行
プロジェクト内で`sbt run`コマンドを叩けばプロジェクトがビルドされ、エントリポイントからプログラムが実行されます。

試しに簡単なファイルを作成し、プロジェクトを実行してみます。

```scala:src/main/scala/Hello.scala
object Hello {
  def main(args: Array[String]) = println("Hello, Scala!")
}
```

では、実行してみます。

```bash
$ sbt run
```

初回ビルドはプロジェクトに必要なライブラリ等を`sbt`が大量にダウンロードしてくるため、時間がかかります。
まぁ、そうでなくても Scala のコンパイルは遅いことで有名ですね。

画面に`Hello, Scala!`と表示されたら成功です。

## Git 管理
プロジェクトは現代人らしく Git で管理しましょう。

ビルド時に生成された`target`ディレクトリはコンパイル後の Class ファイルなどが格納されているので、管理下に置かないで良いかと思います。

```git:.gitignore
target/
```

# vim-scala
素の Vim だと Scala ファイルのシンタックスハイライトがないため、こちらを導入しておきます。
シンタックスハイライトなしでのコーディングは精神衛生上非常によろしくないのでやめておきましょう。

NeoBundle を使っている方は、以下の1行を`.vimrc`に追記するだけで導入できます。

```vim
NeoBundle 'derekwyatt/vim-scala'
```

# AWS SDK for Java
ここまでで基本は完了ですが、おまけで AWS SDK を導入してみます。
Scala のものは存在しませんが、Scala では Java の資産が使えるのでそれを使います。

## インストール
[公式サイト](http://aws.amazon.com/sdk-for-java/)から`AWS SDK for Java`をダウンるロードします。

解凍後、`lib`および`third-party`ディレクトリ以下に存在するすべての`jar`ファイルを先ほど作成した Scala プロジェクトの`lib`ディレクトリへとコピーします。

```bash
$ find ~/Downloads/aws-java-sdk-1.10.0/lib/ -name *.jar | xargs -J% cp -f % lib/
$ find ~/Downloads/aws-java-sdk-1.10.0/third-party/ -name *.jar | xargs -J% cp -f % lib/
```

`lib`ディレクトリ内は以下の様な状態になります。

```bash
$ find lib
lib
lib/aspectjrt.jar
lib/aspectjweaver.jar
lib/aws-java-sdk-1.10.0-javadoc.jar
lib/aws-java-sdk-1.10.0-sources.jar
lib/aws-java-sdk-1.10.0.jar
lib/aws-java-sdk-flow-build-tools-1.10.0.jar
lib/commons-codec-1.6.jar
lib/commons-logging-1.1.3.jar
lib/freemarker-2.3.18.jar
lib/httpclient-4.3.6.jar
lib/httpcore-4.3.3.jar
lib/jackson-annotations-2.5.3.jar
lib/jackson-core-2.5.3.jar
lib/jackson-databind-2.5.3.jar
lib/javax.mail-api-1.4.6.jar
lib/joda-time-2.8.jar
lib/spring-beans-3.0.7.jar
lib/spring-context-3.0.7.jar
lib/spring-core-3.0.7.jar
```

## 動作確認
DynamoDB のクライアントを作ってみて、エラーが出ないか確認してみます。

Trait を作ってミックスインしてみたり、それを`extends`したクラスをインスタンス化してメソッドを呼び出したりしてみました。

クエリの発行等を行ってテストすべきとも思いましたが、諸事情（面倒臭かった）により省略しています。
おまけ項目ですし勘弁して下さい。

```scala:src/main/scala/Main.scala
object Main extends App {
  val hoge = new Hoge()
  hoge.greet
  println("Hello scala!")
}
```

```scala:src/main/scala/Hoge.class
class Hoge extends DynamoDB {
  // ただ DynamoDB trait をミックスインしただけのクラス
}
```

```scala:src/main/scala/DynamoDB.scala
import com.amazonaws._
import com.amazonaws.auth._
import com.amazonaws.regions._
import com.amazonaws.services.dynamodbv2._

trait DynamoDB {
  val dynamodb = new AmazonDynamoDBClient(
    new BasicAWSCredentials(
      "アクセスキー",
      "シークレットキー"
    )
  )
  dynamodb.setRegion(Region.getRegion(Regions.AP_NORTHEAST_1))

  def greet = {
    println("I'm dynamoDB")
  }
}
```

DynamoDB を全く使っていませんが、実行してみます。

```bash
$ sbt run
I'm dynamoDB
Hello scala!
```

これで AWS SDK が無事エラーなくインストールされていることを確認できました。

# まとめ
sbt を導入することで、驚くほど簡単に Scala プロジェクトを作ることが出来ます。
IDE 使うのめんどくさい！でも Scala ちょっと使いたい！って方は、ぜひ導入してみてください。

IntelliJ を使うと sbt を使ったプロジェクトが GUI で簡単に作れるので、面倒でなければ IntelliJ を入れるのが一番手っ取り早いとは思います。

個人的には、軽いプログラミングなら CLI のみで完結する開発環境が好みです。

# 参考文献
- [始める sbt](http://www.scala-sbt.org/0.13/tutorial/ja/index.html)
- [AWS SDK for Javaを使う#EC2](http://dev.classmethod.jp/cloud/aws-ec2/)