Scala School (8)

体調不良で死亡中。以下は昨日書いてた下書きです。そのまま投入。
ちょっとトバします。今日は Simple Build Tool を確認。以下は別途。

Getting Started

ええと、でびあんパケジに sbt-launch.jar があるのかな。apt-cache search しても見つかりませんね。で、google code -> github から以下に辿り着きました。

とりあえず deb パケジが download できるみたいなので取得して以下。

$ sudo dpkg -i ~/Download/sbt.deb

バージョン的には 0.12.1 な模様。

$ dpkg -L sbt
/.
/etc
/etc/sbt
/etc/sbt/sbtopts
/usr
/usr/bin
/usr/bin/sbt
/usr/lib
/usr/lib/sbt
/usr/lib/sbt/sbt-launch.jar
/usr/share
/usr/share/sbt
/usr/share/sbt/sbt-launch-lib.bash
/usr/share/doc
/usr/share/doc/sbt
/usr/share/doc/sbt/changelog.gz
/usr/share/doc/sbt/copyright
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/sbt.1.gz

では sbt 実行してみます。

$ sbt
Getting net.java.dev.jna jna 3.2.3 ...
downloading http://repo1.maven.org/maven2/net/java/dev/jna/jna/3.2.3/jna-3.2.3.jar ...
        [SUCCESSFUL ] net.java.dev.jna#jna;3.2.3!jna.jar (1407ms)
:: retrieving :: org.scala-sbt#boot-jna
        confs: [default]
        1 artifacts copied, 0 already retrieved (838kB/158ms)
Getting org.scala-sbt sbt 0.12.1 ...

何かしてます。だんまり状態。と思ったら凄い勢いで jar を取得してますね。
で以下なソレで停止。

[info] Set current project to default-805a89 (in build file:/home/rms/OLDHome/rms/Documents/Scala/0.helloworld/)
> 

sample と入力してみるか。

[error] Not a valid command: sample (similar: apply, set, append)
[error] Expected '/'
[error] Expected ':'
[error] Not a valid key: sample (similar: name, compile, state)
[error] sample
[error]       ^

あら。C-d してリトライしてみます。いかん。Hello, World も確認します。
ええと、こうして

$ cat >hw.scala
object Hi {
  def main(args: Array[String]) = println("Hi!")
}
$

sbt 起動して

$ sbt
> run

するとなんかコンパイルしてますね。Hi! って出力もありました。なんとなくプロジェクトを作ってくれるのが sbt だと思ってたんですが全然違うんですね。

Adding Some Code

もひとつプロジェクトを作ります。SimpleParser って名前で。で、src/main/scala/com/twitter/sample/SimpleParser.scala を作成。

$ mkdir SimpleParser
$ cd SimpleParser
$ mkdir -p src/main/scala/com/twitter/sample/
package com.twitter.sample

case class SimpleParsed(id: Long, text: String)

class SimpleParser {

  val tweetRegex = "\"id\":(.*),\"text\":\"(.*)\"".r

  def parse(str: String) = {
    tweetRegex.findFirstMatchIn(str) match {
      case Some(m) => {
        val id = str.substring(m.start(1), m.end(1)).toInt
        val text = str.substring(m.start(2), m.end(2))
        Some(SimpleParsed(id, text))
      }
      case _ => None
    }
  }
}
$

で、次。This is ugly and buggy, but should compile. らしいげな。

Testing in the Console

ええと、sbt test しなさい、ということなのかな。テキスト読んでません (汗

$ sbt test
(中略
[info] No tests to run for test:test
[success] Total time: 27 s, completed Jan 11, 2013 3:39:12 PM
$

む、以下は?

$ sbt 'test-only com.twitter.sample.SampleSpec'
[info] No tests to run for test:test-only
[success] Total time: 2 s, completed Jan 11, 2013 3:40:15 PM
[error] Not a valid key: com (similar: compile, commands, compilers)
[error] com.twitter.sample.SampleSpec
[error]    ^

駄目です。sbt で起動して云々とか書いてあるのかな。

$ sbt
(略
> console
[info] Starting scala interpreter...
[info] 
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_06).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

あらら。あ、ここから続きがあるのか。

scala> import com.twitter.sample._
import com.twitter.sample._

次が以下。

scala> val tweet = """{"id":1,"text":"foo"}"""
tweet: java.lang.String = {"id":1,"text":"foo"}

SimpleParser なオブジェクトを作って

scala> val parser = new SimpleParser
parser: com.twitter.sample.SimpleParser = com.twitter.sample.SimpleParser@65a8f181

次で parse か。

scala> parser.parse(tweet)
res1: Option[com.twitter.sample.SimpleParsed] = Some(SimpleParsed(1,foo))

ファイル化したソースコードはこうして実行しなさい、って事なの? なんか微妙。ただ、これでテキストファイルに書いたパーツを試験することはできますね。

むむ

ちょっとここまでの部分、テキストをよく読んでみます。

つうか

scala の REPL とか sbt なナニを起動しっぱなしにしてると端末が死にますね。これはこれで如何なものかとorz
# 端末も非力なのですがorz