Scalaの環境を作る

2018年8月9日(木)
伊藤 竜一
【Scalaはこわくない!マルチパラダイム言語Scalaの入門書!】株式会社インプレスR&Dより発行された「Scalaをはじめよう! ─マルチパラダイム言語への招待─」の立ち読みコーナー第2回です。

Scalaの環境を作る

 この章ではsbtというScala向けのビルドツール(JavaのGradleやMaven,Pythonのpipやvenvのようなものです)のみを利用します1,2.sbtは単なるビルドだけでなく言語仮想環境や外部ライブラリの管理などもでき,作業がこれ一つで完結します.なお,ScalaのプログラムもsbtもJVM上で動作するため実行環境としてJDK8+を利用しますが,scalaコマンドのインストールすら不要です.……ですが,それすら面倒な場合はオンライン実行環境であるScastiehttps://scastie.scala-lang.org)を利用することで,ローカルの環境構築を全てスキップしてScalaを試すことができます.Scastieについてはこの章の最後に紹介します.

sbtをインストールする

 利用するOSに応じてインストールを行ってください.sbtのバージョンは,2018年2月現在1系がメインストリームとなっています3.出来る限り最新のバージョン(2018年2月現在では1.1.0)を利用しましょう.


Windowsの場合

 公式に頒布されているインストーラを利用する方法が一番かんたんでしょう.リリースページ(https://github.com/sbt/sbt/releases/latest)のDownloadsからsbt-${バージョン}.msiをダウンロードして実行してください.

 別の選択肢としては,Windows向けのパッケージマネージャであるChocolateyhttps://chocolatey.org/)経由でインストールする方法もあります.Chocolateyが導入済みであれば,PowerShell上で,

choco install sbt

と実行することでインストールできます.


MacOSの場合

 MacOS用パッケージマネージャであるHomebrew(https://brew.sh/index_ja.html)を利用します.Homebrewをインストールした後,ターミナル上で,

brew install sbt

と実行することでインストールできます.


Linuxの場合

 多くのディストリビューションのパッケージマネージャで提供されていますが,基本的にリポジトリを追加する必要があります.詳しくは公式マニュアル(http://www.scala-sbt.org/1.x/docs/ja/Installing-sbt-on-Linux.html)からそれぞれの環境にあったものを選択して実行してください.どれも数コマンドをコピペするだけでインストールが可能です.

sbtでテンプレートからプロジェクトを作る

 ここからは各OS共通の処理になります.ターミナル上で

sbt new amaya382/simplest.g8

と実行するだけです4.ここで指定しているamaya382/simplest.g8というのはプロジェクトのテンプレートです.テンプレートリスト(https://github.com/foundweekends/giter8/wiki/giter8-templates)で挙げられているように,様々なタイプのアプリケーション向けにテンプレートが用意されています.今回利用するテンプレートは単にHello Worldと出力するだけの非常に簡易なプログラムのテンプレートです.

 実行するとプロジェクト名(=プロジェクトルートディレクトリ名)等を聞かれるので適当に決めましょう.空欄のままエンターで進むとデフォルト値が利用されます.今回はプロジェクト名をscala-tour-example,パッケージ名はデフォルトのexample,クラス名をScalaTourとして進めていきます.

$ sbt new amaya382/simplest.g8

The simplest Scala project for beginners

name [simplest]: scala-tour-example
package [example]:
classname [Simplest]: ScalaTour

Template applied in ./scala-tour-example

 テンプレートから作成されたプロジェクトの雛形も確認しておきましょう.これは今回のテンプレートに限らず,全てのsbtベースプロジェクトの基本になります.ディレクトリ構成は以下のようになっているはずです(target/のみ最初は存在せず,後から生成されます).

scala-tour-example/
 ├ build.sbt
 ├ project/
 │ └ build.properties
 ├ src/
 │ ├ main/
 │ │ └ scala/
 │ │   └ exapmle/
 │ │     └ ScalaTour.scala
 │ └ test/
 │   └ scala/
 │     └ example/
 └ target/

上から見ていきましょう.まずプロジェクトルートにあるbuild.sbtはプロジェクトの設定を管理します.この設定ファイルはScalaのDSLとして書くことができ,主に

 ・プロジェクトのメタ情報(プロジェクト名,プロジェクトバージョン,etc.)

 ・利用するScalaのバージョン

 ・利用するライブラリ

を設定します.詳しい設定内容は追い追い紹介していきます.

 project/build.propertiesは主にビルドに利用するsbtのバージョンを設定します.src/にはMavenと同じディレクトリ構造が用いられています.src/main/以下にプログラム本体のソースファイルを,src/test/以下にテスト用のソースファイルを置きます.src/main/src/test/どちらも言語別のディレクトリ,今回はScalaなのでscalaを作り,更にその下にexampleのようにパッケージ名のディレクトリを切ることになります.

 ちなみにエントリポイントとなるソースファイルは基本的にsrc/main/scala/以下にあればどこに属していてもよく,コンパイラが自動的に適切なメインメソッドを探索してくれます(もし複数見つかった場合コンパイル時にどうするか聞かれることになります).最後のtarget/はコンパイル時に自動的に生成され,コンパイル結果の保存先になります.つまりtarget/以下はGit等で管理する必要はないということです.

sbtでプログラムを実行する

 作ったプロジェクトディレクトリに移動して実行してみましょう.

cd scala-tour-example
sbt # sbt-shell が起動する

sbt-shellが起動するので,加えて以下を実行してください.

run

初回はビルドのための様々なダウンロードが行われるため少々時間がかかるはずです5.2回目以降はキャッシュが効くので,それほど待たされることはないでしょう.とりあえずHello Worldと出力されれば成功です.

sbt-shellを使う

 sbtはsbtコマンドでsbt-shellを常に立ち上げておき,そこから各コマンドを利用しましょう.Shell上からsbt runのように直接サブコマンドとして利用することも可能ですが,毎回JVMの起動が行われるため動作が遅くなります.

sbtでScala REPLを使う

 REPLとはRead-eval-print loopの略でコードを対話的に逐次実行できる環境です.Scalaはコンパイラ言語ですがREPL上ではスクリプトのように実行できます.REPLをsbtプロジェクト内で実行することで,build.sbtで指定したScalaのバージョンや外部ライブラリといった設定も利用できます.

 sbt-shell上で

console

と実行することでデフォルトのScala REPLが開きます.REPL上ではTabキーで補完機能を利用することができます.

scala> val message = "Hello World"
message: String = Hello World

scala> println(message)
Hello World

scala> 1 + 1
res1: Int = 2

scala> println(res1)
2

 明示的に変数に代入しなかった場合は,上記サンプルres1のように自動的に変数が作成され,参照可能になります.

 :pasteコマンドを実行することで,複数行に渡るコードを入力してCtrl-Dで一括実行することもできます.一括実行であるため,相互参照を含むコードも扱うことができます.

scala> :paste
// Entering paste mode (ctrl-D to finish)

val message = "Hello World"
println(message)

// Exiting paste mode,now interpreting.

Hello World
message: String = Hello World

 :quitコマンドでREPLを, Ctrl+Cでsbtごと終了できます.




【コラム】Scastie

■Scastieとは

 Scastieは,Scala公式のオンライン実行環境です.本格的な開発はできませんが,Scalaをかなりリッチな環境で試すことができます.

■Scastieの使い方

1.https://scastie.scala-lang.orgを開く!

2.表示されるエディタにコードを書く!

3.Runボタンを押す!

以上です6

図1: Scastie エディタ

 Formatボタンを押すと,いい感じにコードの整形もしてくれます.Build Settingsタブから外部ライブラリへの依存を追加することもできます.ライブラリは名前で検索して選択するだけで追加されます.最新バージョンがデフォルトで選択されるので,そのままで良いでしょう.ライブラリ以外にも設定項目がありますが,特別に違うバージョンのコンパイラを試したいと行ったことがなければ,デフォルトで良いでしょう.

図2: ライブラリを検索

図3: ライブラリを選択すると追加される

 注意点として,Worksheetモードというものがあります.ツールバーのWorksheetアイコンの丸が黒になっていればオフ,黄緑色になっていればオンを意味します(デフォルトではオンになっているはずです).オフになっていると通常のプログラムとして実行されるため,メインメソッドのようなエントリポイントが必要になります.一方オンになっているとエントリポイントは不要になります.

図4: Worksheetオン

図5: Worksheetオフ

また,GitHubアカウントでログインした状態でSaveボタンを押すとソースコードを個別のURLに紐付けて保存でき,更にSaveボタンをおした後に表示されるDownloadボタンを押すと,sbtのプロジェクトとしてソースコード一式をダウンロードすることもできます.

図6: ソースコードの保存

【コラム】サンプルコード

 本書のサンプルコードは以下の区分で実行できます.サンプルコードセットはGitHub(https://github.com/amaya382/scalatour-resources)でも公開しています.

  

■サンプルコードの実行

◆行番号のあるサンプルコード

 REPL/ScastieWorksheetオンで実行できます.REPLを利用する場合は:pasteコマンドを利用してください.Scastieの場合はWorkSheetオンの状態でRunボタンを押すことで実行するものとします.一部,直前のサンプルコードと組み合わせる必要がある場合があります.

リスト例(REPL/ScastieWorksheetオンで実行できるコード)

 1: val message = "Hello World"
 2: println(message)

 一部のサンプルコードはsbtプロジェクト/ScastieWorksheetオフで実行できます.

 sbtプロジェクトの場合は2.2節で作成したプロジェクトの

src/main/scala/example/ScalaTour.scalaを書き換え,sbt-shell上のrunで実行するものとします.Scastieの場合はWorksheetオフの状態でRunボタンを押すことで実行するものとします.

リスト例(sbtプロジェクト/ScastieWorksheetオフで実行できるコード)

 1: package example
 2: 
 3: object ScalaTour {
 4:   def main(args: Array[String]): Unit = {
 5:     val message = "Hello World"
 6:     println(message)
 7:   }
 8: }

◆行番号のないサンプルコード

 一般的な形を示すためのScalaの擬似コードか他の言語のコードであり,実行を目的としていません.

リスト例(Scalaの擬似コード)

def メソッド名(引数名: 引数の型,...): 返り値の型 = 式

リスト例(Javaのコード)

final String message = "Hello World";

■サンプルコード中のコメント

 サンプルコード中のコメントは以下の規則に従っています.

== 糖衣構文による等価なコード
>> 期待される結果の値
>> : 期待される結果の型
/* 出力+期待される改行を含む出力+*/

 判りやすさのため文字列の場合はクォーテーション(")で括っています.

リスト例(サンプルコード中のコメント)

val message = "Hello" + " " + "World"
// == "Hello".+(" ").+("World")
// >> "Hello World"
// >> :String

println(message)
/* 出力
"Hello World"
*/

(次回へ続く)


1. 古い情報の中には,lightbend activator(=旧typesafe activator)を利用する方法が紹介されている場合がありますが,これは既に更新が停止されているので利用しないようにしましょう.lightbend activatorで提供されていた機能は,別のツールで補完できるようになっています.

2. 本書では説明を簡単にするために導入していませんが,Scalaで本格的な開発を行う場合はsbtに加えてJetBrain社のIntellij IDEAという統合開発環境を組み合わせて利用することをおすすめします.これはデバッガやLinterといった補助的な機能をデフォルトで利用できます.sbtによるプロジェクトを後からインポートすることも可能です.

3. 2017年8月までは0.13系がメインストリームでした.そのためsbtプラグインの一部は1系に対応していないものもありますが,基本的には1系を利用しましょう.

4. もしsbtコマンドがうまく動作しなかった場合は,(1)JDKがインストールされているか(1.8+が必要)(2)sbtのパスが通っているか(3)ネットワークが通じているか,をまずはじめに確認してください.

5. ネットワーク性能によっては10分以上かかり,途中で止まって見える場合もあります.気長に待ちましょう.

6. たまに「サイトには繋がるがRunができない」ということがあります.左下のステータスが「Down」になっている場合はScastieのバックエンドエンジンがメンテナンス等で止まっている状態なので,気長に待つかローカルのsbtを使いましょう.

大阪大学大学院情報科学研究科を修了後、さくらインターネット株式会社にてクラウドサービスのバックエンド開発に従事。プログラミング言語であるScala好きが高じ、Scala関西勉強会やScala関西Summitにて登壇。またその運営にも携わった。 最近はKubernetesと戯れている。

連載バックナンバー

開発ツール書籍・書評
第4回

FizzBuzzしてみよう

2018/8/16
【Scalaはこわくない!マルチパラダイム言語Scalaの入門書!】株式会社インプレスR&Dより発行された「Scalaをはじめよう! ─マルチパラダイム言語への招待─」の立ち読みコーナー第4回です。
システム開発書籍・書評
第3回

Hello Worldを嚙み砕こう

2018/8/14
【Scalaはこわくない!マルチパラダイム言語Scalaの入門書!】株式会社インプレスR&Dより発行された「Scalaをはじめよう! ─マルチパラダイム言語への招待─」の立ち読みコーナー第3回です。
開発言語書籍・書評
第2回

Scalaの環境を作る

2018/8/9
【Scalaはこわくない!マルチパラダイム言語Scalaの入門書!】株式会社インプレスR&Dより発行された「Scalaをはじめよう! ─マルチパラダイム言語への招待─」の立ち読みコーナー第2回です。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています