25 May 2015, 11:29

リアクティブプログラミングの世界観を垣間見!coursera で Principles of Reactive Programming を受けた

最近流行りの リアクティブプログラミング の講座が coursera で開講されたため、 ちょっと背伸びをして受講してみました。

結果から言うと、Scala の知識が足りずに途中で挫折しました。

一応感想を簡単に書いとくか。。〆(・ω・* )

内容

スーパースター講師勢ぞろい

まず、この講座の講師陣がすごい.

  • Martin Odersky … Scala 生みの親
  • Erik Meijer … へんなおじさん
  • Roland Kuhn … Akka チームリーダ

いずれも各分野におけるプロフェッショナル.

ちなみに、Oderskey さん、Erik Meijer さんの 講座は以前受けたことがあります.

Functional Reactive Programmig(FPP)

week1,2 で、Odersky さんが Functional Reactive Programming に関する 話題を説明します. よくネット上で話題になるのも、この辺の話.

RxScala

week3,4 で、Meijer さんが RxScala の話をします.

Meijer 氏いわく、以下の4つが 代表的な副作用なのだと. この 4 つの概念を順番に説明していくという内容.p

Try Emumerable


Future Ovserver

以下の動画でも、同じ話題が話されている.

Akka

最後に、week 5,6,7 で Roland Kuhn 氏が、Akka を通じて Actor モデルの説明をする.

また、その延長で 分散システムにおける フォールトトラレントなプログラミング手法に関しての話題がある.

感想

途中で挫折…

自分は、Scala の文法がよくわからないまま受講していたので、 途中で Assignment ができなくなって、挫折してしまった…

うーむ、基礎体力が足りなかった. とても悔しいので、もう一度この講座が 開講された時には、再び受講したいと思った.

リアクティブな世界を覗き見た

リアクティブプログラミングについて、概念的な話は知っていたが、 コードを通じてその世界をかいま見ることができた.

ネットで記事を読んでいると、

  • Monadic Programming はすごい!
  • Actor モデルは便利!

という話題をたまに見かけるのだけれども、ほんの入り口を体験した.

分散システムとリアクティブ

分散システムのシステム制御 は、これからも自分の仕事では関わり続けていく領域 なので、week6,7 で出てきた話題は、もう少し知りたいと思った.

今回は理解できなかったので、いつか理解しようと思って、書籍を購入. なんと、以下の書籍はこの講座を受講すると半額で購入できるとのことだったので、 衝動買いした。

また、この分散プログラミングで出てきた話題は、 つい先日まで受講していた 講座ともかぶる部分があった. 概念をコードから覗くことができた.

Akka や Erlang は 言語として フォールトトラレントな制御をサポート しているので、自力で分散システムのための仕組みをプログラミングした としても、それは車輪の再発明なんだなと思った. 世の中に転がっている OSS を理解し、自分の開発に取り入れねばと思った.

17 May 2015, 10:47

Actor モデル初体験! Akka で Hello World してみる

Scala

Scala の Akka で Hello World をしてみました.

スレッドとはちょっと違う、Actor モデルの初体験!

Akka とは

Akka とは、Scala で Actor モデルベースの平行処理を書くときの、 デファクトスタンダードなライブラリだ.

Hello Akka!!

ソース

以下のファイルを src/main/scala/HelloScala.scala に作成.

import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props

class HelloActor extends Actor {
  def receive = {
    case "hello" => println("World!")
  }
}

object Main extends App {
  // デフォルトの Actor を作成
  val system = ActorSystem("HelloSystem")

  print("Hello, ")

  // 送信先 Actor を作成
  val helloActor = system.actorOf(Props[HelloActor], name = "helloactor")

  // メッセージ送信
  helloActor ! "hello"
}

build.sbt 作成

以下の build.sbt ファイルを作成

name := "My Project"

version := "1.0"

scalaVersion := "2.10.0"

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies += "com.typesafe.akka" % "akka-actor_2.10" % "2.2-M1"

実行

コンソールより実行

> sbt run

[info] Running Main 
Hello, World!

返信ありのケース

sender を利用して、折り返し処理を実施.

import akka.actor.Actor
import akka.actor.Props
import akka.actor.ActorSystem

class HelloActor extends Actor {
  def receive = {
    case "introduce" => 
      print(",")
      sender ! "world"
  }
}

class CounterMain extends Actor {
  val system = context.actorOf(Props[HelloActor], "hellocounter")

  print("Hello")
  system ! "introduce"

   def receive = {
     case "world" =>
       println(" World!!")
       context.stop(self)
   }
}

object Main extends App {
  val system = ActorSystem("HelloSystem")
  val actor = system.actorOf(Props[CounterMain], name = "counterMain")
}

参考

05 May 2015, 16:17

Scala の例外処理について調べたメモ(try-catch, Try[T])

Scala には例外処理の書き方としては、

  • try, catch,finally
  • Option 型 Try

の2つがある.

それぞれ、実際に実装してどんな感じか調べてみました.

try-catch

try-catch で例外を処理する方法. これは、Java における例外処理と同じ.

以下のようなコードを書いた. これを、もう一つの Try[T] で書き換える.

object TryCatch {
  def main(args: Array[String]) {
    try {
      val result = divide(0)
      show(result)
    } catch {
      case e: Exception =>
    }
  }

  def divide(num: Int): Double = {
    try {
      val result = 1/num
      result
    }
    catch {
      case e: Exception =>      
        println("Failure!!")
        throw e
    }
  }

  def show(result: Double): Double =  {
    println(result)
    result
  }
}

Try[T]

このスタイルは、try-catch に比べて以下のようなメリットがある.

  • 複数の例外を紡いで処理を書いていくときに、正常系と異常系を綺麗に分 けてかいていくことができる(for 分とかで)
  • つまり、コードが綺麗にかける.

import scala.util.{Try, Success, Failure} を import して利用する.

object TryCatch {
  def main(args: Array[String]) {
    val result = divide(0)
    result match {
      case Success(v) => show(v)
      case Failure(e) => 
    }
  }

  def divide(num: Int): Try[Double] = Try {
    val result = Try{1/num}
    result match {
      case Success(v) => v
      case Failure(e) =>
        println("Failure!!")
        throw e
    }
  }

  def show(result: Double): Try[Double] = Try {
    println(result)
    result
  }
}

もっと Monadic に!!

main 関数は、以下のように flatMap や for 文を利用して書き換えることができる. この書き換えが Monadic なところなのだけれども、理解不足でこれ以上解説できません.

def main(args: Array[String]) {
  val result = for {
    result  <- divide(0)
    result2 <- show(result)
  } yield result2
}

try-catch が手続的なのに対して、flatMap をつかうと、ずっと宣言的に見える.

def main(args: Array[String]) {
  divide(0).flatMap( result => show(result) )
}

以上、Happy Hacking!!

Special Thanks

18 Apr 2015, 08:59

ScalaCheck をつかって Java の性質テスト (Property-based Testing) をしてみる

はじめに

Property-based Testing というものを知ったので, Java でできるか試してみました.

[toc]

Property-based Testing とは

うまい日本語訳がないのだが, この記事では性質テストとする.

ある集合のなかにある要素から取り出した値をつかって, 総当たりテストをして, 条件式がなりたつことを確認するテスト.

よく数学の問題で, 任意の x について hogehoge がなりたつことを証明せよ みたいなのがあるが, hogehoge が 性質にあたるもの.

上手く説明できないので, 大量の参照リンクをはっておく.

英語:

ScalaCheck

Scala の 性質テスト用ツールで, ScalaCheck というものがある.

Scala なので, Java にもつかえるか試す.(私は, 現在 java プログラマなので)

target

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    以下のコードをテスト.
  </p>

  <p>
    [sourcecode language=&#8221;java&#8221; title=&#8221;&#8221;]<br /> package example;
  </p>

  <p>
    public class MyArithmetic {<br /> public static int add (int a, int b) { return a + b; }<br /> public static int del (int a, int b) { return a &#8211; b; }
  </p>

  <p>
    public static void main (String[] args) {<br /> System.out.println (add (1, 2));<br /> }<br /> }<br /> [/sourcecode]
  </p>
</div>

Java で sbt をつかう

scala のテストツールなので, scala の ビルドツール sbt をつかうのが楽.

src/main/java 配下に ソースをおいて, root で sbt を起動すると なんと Java コードが sbt で使えてしまう.

これはこれで, 手軽さに驚いた. Java のビルドツールとして使えそう.

[sourcecode language=”bash” title=””]
# コンパイル
> compile

# main 関数を自動で検索して実行
> run
[/sourcecode]

ScalaCheck をつかう

以下のようなファイルを作成して, src/test/scala 配下におく.

[sourcecode language=”scala” title=””]
import org.scalacheck.Properties
import org.scalacheck.Prop.forAll

import example._

object MyArithmeticSpecification extends Properties ("MyArithmetic") {

property ("add") = forAll { (a : Int, b : Int) =>
val aa = a % 100
val bb = b % 100
val c = MyArithmetic.add (aa*aa, bb*bb)
c >= aa*aa && c >= bb*bb
}

property ("add2") = forAll { (a : Int) =>
val aa = a % 100
aa * aa >= aa
}

property ("del") = forAll { (a : Int, b : Int) =>
val aa = a g% 100
val bb = b % 100

val c = MyArithmetic.del (aa*aa, bb*bb)

c <= aa*aa || c <= bb*bb
}
}
[/sourcecode]

root ディレクトリの build.sbt に以下を書く.

[sourcecode language=”bash” title=””]
libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.12.2" % "test"
[/sourcecode]

ファイル構成はいかのようなかんじ

[sourcecode language=”bash” title=””]
— build.sbt
src
main
java
MyArithmetic.java
test
scala
MyArithmeticSpecification.scala
[/sourcecode]

テスト実行

[sourcecode language=”bash” title=””]
$ sbt test
[info] + MyArithmetic.add: OK, passed 100 tests.
[info] + MyArithmetic.add2: OK, passed 100 tests.
[info] + MyArithmetic.del: OK, passed 100 tests.
[info] Passed: Total 3, Failed 0, Errors 0, Passed 3
[success] Total time: 1 s, completed 2015/04/18 17:54:54
[/sourcecode]

おわりに

むかしむかし, CUnit のことを課長にはなしたことがあったのだが, (うたぐり深い) 課長は, xUnit のようなものでは品質がとれないと突っかかってきた.

全部網羅したテストじゃないと, 完全にバグがないなんて言いきれない

自分はこれに対して反論ができなかった.

いまならば, 反論できる.Property-based Testing はどうだろう? 乱数による総当たりテストならば, 信じてくれるのではないだろうか?

11 Feb 2015, 02:20

関数型言語 (Scala) をどうオブジェクト指向の現場に持ち込むか? セミナーをきいた感想

はじめに

今日は, なんだか仕事のやる気も起きないアンニュイな気分だったので, 仕事をサボって社内で開かれたセミナーを聴きにいきました.

Scala による OO と FP のお話

スピーカーは, 浅海智晴さん.

話の内容は, “オブジェクト指向と関数型プログラミング (Scala)“について.

用語を復習しようと Google で検索していたら, 今日きいた話のスライド発見. 一生懸命メモをとったものの, ラッキー.

以下, 用語についての復習と感想を書く.

背景

ハードウェアのメニーコア, 大容量メモリ化によって, 性能のボトルネックが I/O ではなくて, アプリケーションとなってきた. アルゴリズムが勝負の世界. アプリがボトルネックになってきた. そのため, 言語レベルで平行・並列処理が書きやすい言語が求められるようになった.

Cloud Computing において, 異常が発生したら全体をとめるのではなくて, 一部を停止して運用を継続させる必要がある.従来の例外処理では処理する のが複雑になってきた.そのため, 言語レベルで分散コンピューティングや Fault Tolerant をサポートするような言語が求められるようになった.

所感

ストレージ業界にいることもあって, アプリが性能のボトルネックになるというはなしはよくきく.

以前, 次世代メモリと呼ばれている ストレージ・クラス・メモリ (SCM) の技術動向の話をきいたときにも同じはなしが出た. アプリがストレージの性能のボトルネックになるとわかったとき, 我々開発者はなにをすればいいのか? という質問がでたが, 答えは,

関数型言語をつかうこと

All SCM Array が数年後に実現したときにはじめて, プログラミングの パラダイムシフト が起こるかもしれない.

関数型言語とは

過去と現在の関数型言語の認識の違い.

昔は, 高階関数 をサポートする言語という緩い定義だった.

現代のモダンな言語の定義は違う!

現代のモダンな言語 (Haskell, Scala など) は,

数学的理論を背景にプログラムを記述する言語

数学をベースとするプログラミング

数学的理論とは, たとえば以下.

  • ラムダ計算
  • 数理論理学
  • 圏論

とりわけ, Monad が大事.Monad をつかって, どうつくるかという流れ.

所感

数学のベースについて, 以下の記事でまとめられているが,これがおもしろい. 数学がベースといってはいるものの, 数学のほんの一部分.抽象代数学がからんでいる.

自分は, 大学では一応応用数学を学んだ気がしたので, プログラミングと数学が結びつくという売り文句はとてもうれしいのだ.

ああ, 学生時代の苦しみは無益ではなかったのだと.

代数学は, 禅僧の修行のような単なる苦悩に耐え忍ぶ訓練だと思っていたので, まさか, 社会人になって再び群論にお目にかかるとは,学生のときには想像 出来ないことだった.

コンパイル = 証明

コンパイルを通すということは, 正しさを証明すること

関数型言語では, コンパイルが通るとバグがほとんどでない. 純粋関数の世界でプログラミングをすることによって, 実現できる. 背景には数理論理学がある.

このことがなぜ大事かというと, 並列プログラミングのバグとりは大変. テストですべてのバグをとれたという保証ができない.

関数型ならば数学をベースにして, バグがないことを証明することができる

関数型言語のメリット・デメリット

  • メリット
    • 高階関数を使った技が使える (それによってコードが短くなる)
    • 定理と証明
  • デメリット デメリットだけみると, 組み込み系ではほとんど出番なしな気がした. いつの時代も, C 言語最強?? いや, C で並列処理はつらい.

    質問時間に, 組み込み系では関数型言語は活用できますかと 質問してみたが, わかりませんという回答だったので, 調べてみた.

    有力候補は OCaml. 時間効率, 空間効率がいいらしい.

    マイナーな言語で ATS というものもあるが, 情報が少ない.

    分散システムを組むならば, Erlang もつかえるか? - 組み込みから生まれた言語 Erlang の時代が来る - 日経エレクトロニクス

    組み込み系といっても, リッチな環境の組み込み系ならばリソースなんて 関係ない?? Android は Java で動いているし, Scala だって.

Monadic Programming

モナドを中心にプログラムを組む方法.

モナドとは,

  • コンテナ
  • パイプライン
  • インタプリタ

モナドにはいろいろな種類がある.

  • IO モナド
  • State モナド
  • Future モナド …

モナドの使い方は難しいのだけれども, パターンがあるのでなれれば簡単.

所感

モナドはよくわからない.

しかし, 今日の話で距離が狭まった.

難解なもの, 副作用をもつものは, モナドに閉じ込めて隠蔽する. それによって, プログラムがスッキリする.

この言い回しは, OO におけるカプセル化 でもきいたような気がする.

難解なもの, 副作用をもつものは, オブジェクトに閉じ込めてカプセル化する. それによって, プログラムがスッキリする.

また, モナドには使い方があり, 覚えてしまえば簡単という話は, 以前まとめた関数型デザインパターンの話にもつながるのかもしれない.

Functinal Reactive Programming (FRP)

ある変化に応じて動作する, イベント駆動のプログラミング方法.

Reactive Programmig には, 2 つの種類があるように思う.

  • Actor Model
  • Monadic Model

所感

以下の記事がわかりやすい.

最近よくみかける用語だし, これから流行しそうな手法.

GUI, インフラ, ビッグデータ処理など様々な場面で浸透しつつあります. 今までは複雑すぎて作ることが難しかったアプリケーションが簡単に設計できるようになっていくでしょう.

リアクティブ宣言なんという, かっこいい文章も存在する.

Object-Functional Programming (OFP)

オブジェクト指向のパラダイムと関数型のパラダイムの両方を利用して プログラミングする.

上流工程では, 今までどおりオブジェクト指向設計で考えることになる. ユースケースで今までどおり要件定義をして, コンポーネント分割までする. そこから, オブジェクトかファンクションのどちらかつかって責務を実現する. なので, OOP と FP は共存関係にある.

OFP 新三種の神器.

  • トレイト
  • モナド
  • 型クラス

OFP を導入することメリットは, 以下.

  • 高階関数DSL を書くことで 開発効率 をあげる
  • Monadic Programming を行うことで並列処理の品質をあげる

どこに Functional Programming を適用するか?

Functinal Programming で書くと, バグが出にくいので, Functonal Programming の割合をできるだけ増やしていくのがベスト.

システム開発では, OO:FP の割合は 6:4 くらいか??

FP でつくるのに適した部分は, DSL の部分. OOP で, Framework と呼ばれている部分.

アプリ開発は Java でもいい. アプリ開発の基盤にある DSL 部分を 関数型でかく.

DSL

DSL とは,特定のタスク向けに設計されたコンピュータ言語. DSL は一種類のタスクをうまく実行することに集中したもの.

そして, FP (というよりも Scala) は, DSL を書くことに 適している (Scalable language). なぜなら, 簡単に独自の型や制御構造を定義できるので.

まとめ

去年から, 関数型言語をかじりはじめてきたが, 自分が理解してきた

  • Stateless
  • High-order function

という考え方は, いわゆる伝統的な FP の概念だということを知った. また, それにかわるモダンな考え方は Monad だということも知った. (OFP 新三種の神器)

モナドについては, ほとんどまだ理解できていないので, 今年はモナドに注目して学んでいくことにする.

個人的には, 関数型言語を並列処理どう適用するかという話をもう少し つっこんで知りたい. それも, Monadic Model を理解すると見えるかもしれ ない.まずは, Monad.

Next Action

今は (伝統的!) 関数型言語の聖典, SICP を読んでいるので, Monad はさておき, まずはこれを読み終えなければ.

4 月か 9 月に coursera の Scala の講義が開講されたらもう一度受けてみる. (なぜなら, 前回は落第して単位をもらえなかったから…)

Reactive Programming についても学んでみたい. 去年 coursera で講座が 開講されるのをまっていたのだが, 去年は開講されなかった. 今年も開講されなかったら, 11 月からアーカイブ講座をつかって学んで見ようと思う.

28 Jun 2014, 11:55

[Coursera]Scala作者直伝の講座!Functional Programming Principles in Scalaを受けた

Courseraを利用して、Scalaの勉強をしました。

[//www.youtube.com/embed/tSCNZvv7ti4]

講座の感想

Scala言語作者の、Martion Odersky直々の講義であるところがまずスゴい。

Scalaを通じて、関数型の考え方を学ぶという内容。

  • Week One: Programming paradigms; overview of functional programming and the Scala programming language.
  • Week Two: Defining and using functions, recursion and non-termination, working with functions as values, reasoning by reduction.
  • Week Three: Defining and using immutable objects, review of inheritance and dynamic binding.
  • Week Four: Types and Pattern Matching
  • Week Five: Working with Lists
  • Week Six: Collections and Combinatorial Search
  • Week Seven: Lazy Evaluation

ついこの前に受けた以下の講座とかぶる部分もたくさんあった。

Lectureの内容も適度な量で、Assignmentの量もそれほど多くはない印象。 すごく時間がかかるというわけではなかった。 ただし、Assignmentの締切りに毎回間に合わなくてすべて遅れて提出・・・これが無念。

また、考え方がなれていないので、概念の理解はすこし時間がかかった。 いわゆるコップ本と呼ばれている以下の参考書を片手にガンバッタ。

Scalaの感想

講義の内容をそのまま引用してしまうが、 以下のような関数型の概念は、OOPの世界にいる自分にとってはとっても新鮮だった。

Functional programming provides a coherent set of notations and

  • methods based on higher-order functions,(高階関数)
  • case classes and pattern matching,(パターンマッチング)
  • immutable collections, absence of mutable state(イミュータブル)
  • flexible evaluation strategies:strict/lazy/by name(遅延評価)

A useful toolkit for every programmer. A different way of thinking about programs.

仕事ではRubyをつかっているが、 講座を受ける中でRubyが関数型言語の特性をたくさんもっていることに気がついたりした。

関数型の考え方を身につければ、Rubyも饒舌になれる。

関数型の考え方をはやく身につけて、 プログラミングの表現の幅をもっともっと広げたいと思った。

Scalaは美しい

<div class="outline-text-3" id="text-2-1">
  <p>
    Scalaに触れて一番驚いたのは、表現の簡潔さだ。
  </p>

  <p>
    Scalaではワンラインで表現できてしまう場面がたくさんある。 あまりに一行に詰め込みすぎるのも読みづらいので、 適度にインデントすると5行くらいになる。
  </p>

  <p>
    たった、5行である!一般的にScalaのコード量はJavaの半分になると言われているらしい!
  </p>

  <p>
    はじめにこれを聞いたときは、懐疑的だったけれども、今となっては納得である。
  </p>
</div>

これからどうするか

Scalaはとても気に入った。

講座が終わってしまったが、Scalaはこれからも折に触れて触っていきたい。 正直なところ、2ヶ月の講座だけではまだScalaを身につけたといえる自信がない。 力を伸ばすためにも、いろいろな場面でScalaを書いていこうと思う。

スクリプト言語としてのScala

<div class="outline-text-3" id="text-3-1">
  <p>
    Scalaはスクリプトとしても実行できる。 まずは、簡単なスクリプトを書くときにScalaを選択しようと思う。
  </p>

  <p>
    Scalaをスクリプトとして利用する最大の問題点は、起動にかかる時間だ。 ScalaはJVM上で動作するので、JVMの起動に時間がかかる。
  </p>

  <p>
    しかし、今はそれを我慢してでもScala力をみにつけたい。
  </p>
</div>

ほかの関数型言語も

<div class="outline-text-3" id="text-3-2">
  <p>
    自分が次に挑戦しようと考えてことは、Emacs Lispを身につけること。
  </p>

  <p>
    どういうわけか、最近とてもEmacsが気に入っている。 自分でもEmacs Lispがかけたらいいなと思う。
  </p>

  <p>
    Lispということで、同じ関数型でもScalaとは毛色がまた違うのだが、 それも新しい価値観に触れるということで、いいことだ。
  </p>
</div>

11 May 2014, 10:39

Emacs で Scala 開発環境を構築 (Ensime)

はじめに

edX で受けた プログラミングパラダイム の講義のなかで,

” これからは, Scala と Erlang だ!C++ と Java はレガシーになりつつある!”

とのことだったので, ちょっと scala をいじってみようと思います.

[toc]

Environment

<div class="outline-text-3" id="text-unnumbered-2">
  <ul class="org-ul">
    <li>
      Linux Mint 16 64bit
    </li>
    <li>
      Scala 2.9
    </li>
  </ul>
</div>

Installing Scalas

Installing the JDK

<div class="outline-text-3" id="text-unnumbered-4">
  <p>
    Scala は JVM 上で動作する. まずは JDK をインストール.
  </p>

  <p>
    [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> sudo apt-get install openjdk-7-jdk<br /> [/sourcecode]
  </p>
</div>

Installing sbt

<div class="outline-text-3" id="text-unnumbered-5">
  <p>
    Scala のビルドツールである sbt を入れる. 以下から Download して, 解凍. なかにある bin ディレクトリにパスを通す.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html">Setup &#8211; sbt Documentation</a>
    </li>
  </ul>

  <p>
    日本語のドキュメントがあった.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://scalajp.github.io/sbt-getting-started-guide-ja/">始める sbt &#8211; ようこそ</a>
    </li>
    <li>
      <a href="http://www.scala-sbt.org/">sbt &#8211; sbt Documentation</a>
    </li>
  </ul>
</div>

Installing Scala

<div class="outline-text-3" id="text-unnumbered-6">
  [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> sudo apt-get install scala<br /> [/sourcecode]</p> 

  <p>
    以下から最新版をダウンロードしてもよい.
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://www.scala-lang.org/download/">Download | The Scala Programming Language</a>
    </li>
  </ul>

  <p>
    ダウンロードしたら bin ディレクトリにパスを通す.
  </p>

  <p>
    [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> # Scala<br /> export PATH=$HOME/app/sbt/bin:$PATH<br /> export PATH=$HOME/app/scala/bin:$PATH<br /> [/sourcecode]
  </p>
</div>

Hello Scala

<div class="outline-text-3" id="text-unnumbered-7">
  <p>
    それでは, お決まりの儀式から.
  </p>

  <p>
    [sourcecode language=&#8221;scala&#8221; title=&#8221;&#8221;]<br /> object Hello extends App {<br /> println ("Hello, Scala!")<br /> }<br /> [/sourcecode]
  </p>

  <p>
    以下で実行.
  </p>

  <p>
    [sourcecode language=&#8221;sh&#8221; title=&#8221;&#8221;]<br /> % scalac Hello.scala<br /> % scala Hello<br /> Hello, Scala!<br /> [/sourcecode]
  </p>
</div>

Installing Emacs

Emacs 自体のインストール方法は省略.

Installing scala-mode

<div class="outline-text-3" id="text-unnumbered-9">
  <p>
    scala-mode と scala-mode2 がある. 2 を入れた.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/hvesalai/scala-mode2">hvesalai/scala-mode2</a>
    </li>
  </ul>
</div>

Installing Ensime

<div class="outline-text-3" id="text-unnumbered-10">
  <p>
    Scala 用の統合開発環境. インストールはは github にしたがえばよい.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/ensime/ensime-src">ensime/ensime-src</a>
    </li>
  </ul>

  <p>
    Ensime Server をダウンロードしてロードパスの通った場所におく.
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://www.dropbox.com/sh/ryd981hq08swyqr/V9o9rDvxkS/ENSIME%20Releases">Dropbox &#8211; ENSIME Releases</a>
    </li>
  </ul>

  <p>
    (ハマリメモ. github から落としてきたやつではなくて, Dropbox から落とした Reliese 番でないとダメなんだね. めちゃくちゃハマった)
  </p>
</div>

<div id="outline-container-unnumbered-11" class="outline-4">
  <h4 id="unnumbered-11">
    .ensime を作成
  </h4>

  <div class="outline-text-4" id="text-unnumbered-11">
    <p>
      ensime を利用するには, .ensime という設定ファイルが必要.
    </p>

    <ul class="org-ul">
      <li>
        <a href="http://d.hatena.ne.jp/masaaki1001/20121226/1356539103">ensime の設定方法 &#8211; masaaki1001 の日記</a>
      </li>
      <li>
        <a href="http://d.hatena.ne.jp/lranran123/20130409/1365515128">Emacs での Scala 開発には Ensime というプラグインらしい -q 趣味プログラマがまれになんかしたことの記録</a>
      </li>
      <li>
        <a href="https://github.com/ensime/ensime-sbt-cmd">https://github.com/ensime/ensime-sbt-cmd</a>
      </li>
    </ul>

    <p>
      上記を参考に~/.sbt/plugins/plugins.sbt を作成し, 以下を記入.
    </p>

    <p>
      [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> resolvers += Resolver.sonatypeRepo ("snapshots")
    </p>

    <p>
      addSbtPlugin ("org.ensime" % "ensime-sbt" % "0.1.5-SNAPSHOT")<br /> [/sourcecode]
    </p>

    <p>
      M-x ensime-config-gen というコマンドでも対話的に設定ファイルが作成できるらしい.
    </p>

    <p>
      Hello.scala を開いたディレクトリで以下を実行.
    </p>

    <p>
      [sourcecode language=&#8221;language&#8221; title=&#8221;&#8221;]<br /> sbt "ensime generate"<br /> [/sourcecode]
    </p>
  </div>
</div>

<div id="outline-container-unnumbered-12" class="outline-4">
  <h4 id="unnumbered-12">
    emsime 実行
  </h4>

  <div class="outline-text-4" id="text-unnumbered-12">
    <p>
      これで, .ensime が生成される.
    </p>

    <p>
      Emacs 上で M-x ensime を実行. 先ほど生成した.ensime の場所を教える.
    </p>

    <p>
      今日はこんなところで. 逐次, 追記予定.
    </p>
  </div>
</div>

追記 2014-06-21

sbt-mode というものもある.

機能的には ensime とおなじようなことができるし, ensime ファイルを作成しなくてもいいので導入が楽.

ensime よりよいところは, M-x sbt-send-region で Scala REPL にリージョンを送信することができるところ. これは便利そう.

また, repl を autoload する方法もあるようだ.