uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

GroovyServ FAQを作りました

そのうち公式ページに載せますが先ずはたたき台として。他に疑問があればコメント、Twitter(@uehaj)などで教えていただけますとたいへんありがたいです。

Q
なんでJNAつかってるの?
A
カレントディレクトリを変更するためです。具体的にはchdir()を呼ぶためです。Javaの機能として、カレントディレクトリを設定するためのものとされているSystem.getProperty('user.dir')がありますが、これはnew File(".")などではカレントディレクトリとして機能しますが、new FileInputStream("")などでは使われず、意図する動作となりません。
Q
対応する環境は?
A
今のところUbuntu Linux, Windows, Mac OS Xです*1ソースコードからコンパイルする場合、基本的には(1)シェルスクリプトが動作する事と(2)JNAが対応している事(3)gccが動作することの3つの条件がそろっていれば動作する可能性があります。もちろん、Groovy/JREが動作する事も必要です。
Q
ports,fink, deb,rpmパッケージないの?
A
すみませんまだありません。
Q
cygwin必要って何それ
A
すみません。そのうちcygwin脱却化を検討中です。それまではRubyクライアントで勘弁してください。
Q
Pure Javaじゃないのださい
A
このソフトウェアは、groovyコマンドの起動速度を短縮するため(だけ)のものなので、残念ながらクライアントをJavaで書くわけには行かないのです。GCJとかでネイティブ化してもいいんですが、起動が0.1秒切らないと意味ないと思っています。
Q
プロトコルは何?
A
独自です。仕様を簡単に知るためには、今のところはgroovyclient.rbを見てください。例えば以下のようなプロトコルです。
Q
Configureとかつかってないのださい
A
すんません。
Q
スレッドグループ指定して作成したスレッドから標準入出力が扱えないんですが。
A
仕様です。スレッドグループでどのセッションかを識別して標準入出力を多重化しているためです。
Q
GroovyServで起動したgroovycでコンパイル時に、コンパイル対象のスクリプトが使用しているクラスが見つからないと言われる。
A
-cpオプションで明示的にクラスパスを指定してください。groovycの仕様との兼ね合いでこうなっています。
Q
GroovyServで起動したgroovyshで入力補完ができないし行編集も効きません。
A
仕様です。groovyclientは標準入出力をリレーしますが、仮想端末としての接続をリレーするわけでないからです。
Q
ドキュメントにはセッション間をまたがって静的変数が共有されるとありますが、されていように見えます。
A
その静的変数は起動するGroovyスクリプト内やクラス内で定義していますか?ならば共有されません。セッッション毎にクラスローダが別なので、別クラスとして扱われ静的変数も共有されません。システムクラスローダによって読み込まれたクラスの静的変数、たとえばSystem.properties()で取得できる値などは共有されます。
Q
groovyclientをgroovyにaliasしたのですが、元のgroovyを呼び出したいときは?
A
shellやbashの使い方の問題ですが、\groovy のようにバックスラッシュをつけてください。
Q
サーバサイドのログはどこに出力される?
A
サーバを-vモードで起動している場合、~/.groovy/groovyserver/log-{port}.txtに出力されます。
Q
名前はなんでGroovyServなの?
A
起動が重いことで有名なエディタのEmacsを、都度起動するのではなく常駐起動してコマンドラインから編集ファイルを開く「Gnuserv」というのがあるのですが、それにインスパイアされました*2。知名度が無く、知らない人からするとよくわからない名前だったかも。だいいちサーバマシンで動作するわけではないし。
Q
Scalaのfscとの違いは?
A
似てますがあちらはscalaソースのコンパイル専用、こちらは汎用ですね。あと確かfscはクライアントもJavaじゃなかったかな。
Q
インストーラ版は?
A
まだありません。欲しいです。
Q
標準Groovyの機能にならないの?
A
そうなると嬉しいですね。ただソースコード組み込み自体はさほど難しくはないと思いますが、方針としては良くないと見なされるかもしれません。というのもJNAを使っているからです。JNAの対象とする範囲は広いとはいえ、例外はあるわけですし。ただし、もともとWndows専用である、Windows Installer版とかには特別に組み込まれてもいいかもしれません。
Q
Grapeとかで簡単にインストール・呼び出したい。
A
それが意味するのはクライアントをGroovyで書くという事ではないでしょうか?Groovyの起動が遅いからわざわざこれを作っているのに、その起動にGroovyを使うのはものすごい元の木阿弥です。ただ何か良い方法があればとは思います。
Q
サーバに対して他のマシンからリモートで使用する事はできますか?
A
セキュリティ確保のため不可にしています。GroovyServは外部から任意のGroovyコードが実行できるという事なので、リモートから呼べるようにする場合何らかの強固なセキュリティ機能を作りこむ必要があります。

たとえできたとしても、ローカルマシンと異なるファイル構成になる可能性があります(NFSなどで共有マウントしていれば別ですが)ので、ようとは限られるかもしれませんね。必要であればsshでポートフォワーディングして接続してください。

Q
JQS(Java Quick Start)との関係は?
A
原理は似たようなものですね。特に支障無く併用できます。Java SE 6u10で採用されたJQSのおかげで、Windowsでの環境でのJVM起動はもともと速いです。加えて、ネイティブ版groovy.exeの存在や、あとcygwinの遅さとも相まって、Windowsは体感的に一番起動速度差が少ない環境となります(でも20倍ぐらいはある)。

以上でした。

*1:ただしLinuxに関してはCentOSでlibcのバージョンによって動作しない環境があるとの報告を受けています。調査中。

*2:機能的にはgnudoitの方が近いけど。