XMLEventReader through ConstructingParser and process your employee nodes below the top level with a callback."— scala - How to get a streaming Iterator[Node] from a large XML document? - Stack Overflow
-->
XMLEventReader through ConstructingParser and process your employee nodes below the top level with a callback."— scala - How to get a streaming Iterator[Node] from a large XML document? - Stack Overflow
Scala の場合、”" や “\” 関数を使って XPath 風の記述が可能。
"—
Groovy, Scala, Ruby, PHPでのXMLパース処理 - XPath使用 - なんとなくな Developer のメモ
Elemクラスの話。コレがあるおかげか、Javaのライブラリがあるおかげか、XPathのScala実装があまり見当たらないなぁ。
で囲む
Thread.yield"超便利!依存パッケージをまとめて1つのjarにしてくれる。maven-assembly-pluginのsbt版かな。
sbtで依存を書くときに
libraryDependencies += "org.scala-tools" % "scala-stm" % "0.3"
と書くのと
libraryDependencies += "org.scala-tools" %% "scala-stm" % "0.3"
と書くのはぜんぜん違うよ! ということに今更気づいた。%%はscalaVersionを付加する。Scalaのライブラリなら%%がいるけど、Javaのライブラリだったら%でOK。
sbtの Library Dependencies にきっちり書いてあるんだけどなぜか目からこぼれていた。
Scalaのライブラリを追加するときにはバイナリ互換問題によって今コンパイルに使ってるのと同じScalaでコンパイルされたライブラリが必要になっちゃうから%%があるのね…… 長い期間メンテしなきゃいかんプロダクトで依存が多いと涙目になりそう。
— Scala Advent Calendar jp 2011: トレイトと自分型で簡単!コード分割 - papamitra
このエントリは Scala Advent Calendar jp 2011の12/18日です。前日はeed3si9nさんのIterator パターンの本質でした。
このエントリではScalaを始めたときにhello worldから一歩踏み出すときの言語以外の部分、環境について書きます。
Scalaを始める人は大概scalaコマンドのREPLやhello worldから始めると思うんだけど、 そこからリアルワールドに飛び出すときにギャップが大きくて挫折しやすい。 というか3回くらい挫折しました、僕は。 hello.scalaをscalaコマンドに渡して実行するだけならともかく、 小さくてもプロダクトを作ろうとしたときに途方にくれてしまう。
これはScalaに限った話ではなく、 Javaでhello worldを書いたあとにいきなりMavenに手を出すか? あるいはPythonのREPLを触ったあとにスムーズにvirtualenvとsetuptoolsやeasy_installにたどり着くか?と同じ話です。
そういうベストプラクティスに乗っているか乗っていないかで挫折確率がぜんぜん違うと思うので 自分用のメモを兼ねてエントリを書こうと思った次第です。最も、これがベストプラクティスかどうかは知りません。多分、ただのプラクティスくらいな感じ。
Scalaに初めて触れる人は当然Scalaがインストールされていないはずなので、インストールから始めます。
当然のように $ yum install scalaなり、$ apt-get install scalaなり、$ brew install scalaすると思います。
しかしscala本体だけでは全然足りなくて周辺ツールも必要で、 Delphiや.NETのAnders Hejlsbergさんは「言語とライブラリ、開発環境は三位一体」 というような発言をしており、Scalaを入れただけでは開発環境が足りないのです。
というわけで、開発をサポートするツールとして以下の3つを入れます
$ curl https://raw.github.com/n8han/conscript/master/setup.sh | sh
2011-12-19 2:14修正しました 現状 conscriptの最新版jarがリポジトリにデプロイされておらず
sbtのインストール時にコケます。
n8hanさんがデプロイすると問題は解決すると思いますが、以下のように問題回避できます。
あくまで一時的な対応です。
---修正ここから
$ git clone git://github.com/sett4/conscript.git
cd conscript
./setup-from-local.sh (中でsbt-launch.jarを使ってconscriptをビルドして、ローカルのivyリポジトリにpublishしてます)
---修正ここまで
$ cs harrah/xsbt --branch 0.11.2 これ、途中で入力プロンプトになって止まりますが、 慌てずCTRL+Cで終了してください。そのうちconscriptが修正されると思います。
$ cs n8han/giter8
https://github.com/n8han/conscript
conscriptとはScalaで書かれたプログラムをインストールしたりアップデートしたりするツール。 具体的にに言うと以下の二つをします。
$ less ~/bin/screpl とやると、 java $CONSCRIPTOPTS -Xmx1G -jar Users/sett4.conscript/sbt-launch.jar @/Users/sett4/.conscript/harrah/xsbt/screpl/launchconfig “$@” という1行が書かれていいるだけなんだけど、それだけでうまく動いちゃう。 sbt-launch.jarが頑張ってるから。
https://github.com/harrah/xsbt/wiki/Launcher
sbtの一部。launchconfigに書かれている内容を元に、指定されたバージョンのjarをリポジトリから取得して依存を解決して実行してくれるものです。 大変素晴らしいです。
例えば、scala 2.9.1で動かしてたけどscala 2.8系でもちょっと動かしたいな〜 とかがlaunchconfigを書き換えるだけで簡単にできます。
Simple Build Toolなんだけど僕にはどうにもSimpleには思えません。 しかしまー、Scala界隈的にはビルドにsbtを使うのはスタンダードになりつつあって 使っておけば間違いなさそうです。conscriptもsbtを前提にしたツールですし。
先程の$ cs harrah/xsbt –branch 0.11.2の実行によって~/bin以下には 以下の3ファイルができています。
というわけえまずはREPL環境から。
$ ~/bin/screpl
と打つとREPLのシェルが立ち上がる。初回の起動だと依存関係を解決しつつ実行するのでけっこう時間がかかるかもしれないので気長に待って欲しい。 はい。 起動したら。
scala> println("hello world")
hello world
launchconfigファイルは ~/.conscript/harrah/xsbt/screpl/launchconfigにあるので、 scala 2.8.xでREPLやりたいなーとか思ったらversionを書き換えればOK.
あとは、依存を追加してscreplを起動したいなということもできます。
~/bin/scalasは渡されたscalaのファイルを実行します。
$ cat > hello
#!/usr/bin/env scalas
!#
/***
scalaVersion := "2.9.1"
*/
println("hello world from scalas")
CTRL+D
$ chmod +x hello
$ ./hello をすると、画面にはhello worldが表示されます。 このあたりの書式については https://github.com/harrah/xsbt/wiki/Scripts を参照して欲しいんだけど、いくつか特徴的なのをピックアップすると
ほんと気が利いてる。sbtには足をむけて寝れない。 小さいスクリプトはScalaで書こうかな?というような気になってくる。
最後にsbtでhello worldなのだけど、正直よくわかりません。 build.properties形式の書き方や、 build.sbt形式の書き方( https://github.com/harrah/xsbt/wiki/Getting-Started-Basic-Def )とかさっぱり存じ上げていなくてですね…… さらにカスタマイズ可能な.scalaによるプロジェクト定義( https://github.com/harrah/xsbt/wiki/Getting-Started-Full-Def )のほうも完璧にさっぱりでして……
それでも救いの神はいるもので、それは
$ cs n8han/giter8
とすれば降臨します。 girer8っていうのはmavenでいうところのarchetypeみたいなもので、プロジェクトの雛形を作ってくれる。
コマンドは
$ g8
$ g8 --list
でgiter8に登録されているテンプレートの一覧を出す。いっぱいありますね。 simpleとかでひっかけて、簡単そうなのを使うことにする。
$ g8 chrislewis/simple-scala-project $ vim ./build.properties
でsbtのバージョンを0.11.2に、scalaのバージョンを2.9.1にしてやって、
$ vim ./src/main/scala/App.scala
package idea
object App {
def main(args: Array[String]) = {
println("hello world from sbt")
}
}
$ sbt
sbt> run
hello world from sbt
今はもう21世紀が始まって10年以上経ちますし emacsやvimじゃなくてEclipseを使いたい?もちろん可能です。
$ vim build.sbt
以下の行を追加。 addSbtPlugin(“com.typesafe.sbteclipse” % “sbteclipse” % “1.5.0”)
そうすると、sbtの中でsbteclipseが使えるうようになります。 sbt> eclipse create-src とするとEclipseのプロジェクトファイルができあがります。
とりあえずsbtとconscriptとgiter8使っておくと便利です。特にsbtは基盤ツールだと思います。
「X言語ができる」というからには 言語仕様と言語処理系のコードと標準ライブラリのコードは最低でも読んでるよね? みたいな風に仰る天上の方々もいるけど、 世界的には「オハヨーゴザイマス」「ドーモ ニンジャスレイヤー デス」「スシ オイシー」くらい言えれば 日本語できるって言っていいみたいなので もっと気軽にScalaやってScalaできるって言えばいいと思います。
うまくいかなかった方は @sett4 にreplyで教えてくれたり、 Tumblrのaskページから伝えてもらえると嬉しいです。また 日本Scalaユーザーズグループ に疑問を投稿したりすると僕なんかよりすごい方々が優しく教えてくれると思います。
enjoy!
明日はdekosukeさんです。
Date: 2011-12-18 16:50:37 JST
HTML generated by org-mode 6.33x in emacs 23
追記2011-12-19 01:56