Scala Hack-a-thon #2 に行ってきました

昔からscalaに割と興味はあったので、せっかくの機会なので行ってきました。

午前中は主催の@yuroyoroさんから1時間ほどレクチャーをしていただきました(資料はこちら)。かなりわかりやすかったです。家に帰ってscala本を読んでいて、ポイントが押さえられて簡潔な説明だったことがあらためてよくわかりました。

評判通り割と黙々と作業する感じで、これはこれで楽しかったです。会場に行ったら@WdWeaverさんがいて隣に座っていましたが、会場内ではお互い黙々と作業をしていました。ネタになるくらいの面白さだったと思います。


今日の目標は、appengine-rubyの様な対話的なインターフェイスで、scalaで書いたコードがappengine上のサービス呼び出しに変換されて、そのサービス呼び出しに使われたprotocol bufferの中身が対話的にぼこぼこ出てくるものをつくる、でした。

後半のprotocol bufferをどうにかするのはそれほど難しくなく、というかjavaなのでほぼできました。実績のあるツール(@shin1ogawaさんのgaejtool)も知っていたので。scalaのスクリプト内でdatastore serviceをimportしてjavaのdelegateを上書きしたものに噛ませるだけで、この内容でLTしてみましたが内容的にもそれほど面白くなく、トラブルもあったので次回チャンスがあればもうちょっとがんばりたいです。ただ、前半の対話的インターフェイスでどうにかするというのがくせ者でだいぶはまっていて、まだできてないです。

イメージ的にはこんな感じなのですが、

#!/bin/sh
exec scala -classpath appengineとかのjar "$0" "$@"
!#

import scala.tools.nsc._
import interpreter._
import java.io._
import scala.reflect._

val out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)))
val settings = new GenericRunnerSettings(out.println _)
val args : List[String] = List()

def exec(target : String) : unit = {
 ScriptRunner.runCommand(settings ,target, args)
}

runCommandで一行を評価するのはできているのですが、一行ごとに別プロセス?になっているようで、val hoge・・・とかやっても次の行でhogeが使えてないです。scalaのインタプリタ自体もscalaで書かれているるので(scala、と打ったときのインターフェイスではscala.tools.nsc.MainGenericRunnerが呼ばれている模様)、がんばればどうにかできるはず、です。たぶん、InterpreterLoopとかを使えばよいのかな、というところで今日のところはあきらめました。


LTは、みなさん黙々と作業するだけあって、個人の世界が展開されているような感じで面白かったです。scalaがdslに向いていると言われているだけあって、なんとなくdslを連想させるようなテーマが多かったように思います。


最後に、会場を貸していただいたoracle様、企画運営をしていただいた@yuroyoroさん、@k_nishijimaさん、参加者のみなさま、ありがとうございました。