uehaj's blog

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

GroovyServを公開しました

以前予告編として紹介した、Groovyを常駐サーバ化して、見た目の起動速度を高速化するGroovyServの0.1版をApache Lisence 2.0に基づくOSSとして公開しました。GroovyServを使う事で、Groovyの起動がRubyPerlのように速くなります。これにより、「JVM上のスクリプト言語は起動が遅いから駄目だ」などという批判を過去のものとする事ができます。

特徴は以下の通り。詳しくはこちらもどうぞ。

  • クライアントはC言語およびRubyのものを用意(C言語クライアントの動作にはWindowsでは今のところcygwinが必須。cygwinが嫌な方はRuby版をどうぞ。)。
  • MacOSX,Windows(cygwin),Linuxで動作確認されており、これらの環境向けにバイナリパッケージが提供されています。
  • クライアントは、初回起動時にサーバが動作してなければサーバを起動する。つまり透過的に利用できる(初回起動時は遅いけど)。
  • クライアント-サーバ間は独自プロトコルで通信
  • サーバに接続できるのはlocalhostからのみで、かつサーバを起動したユーザと同じユーザが起動したクライアントからのみ。
  • クライアントは自身の標準入力をサーバに送信し、サーバで標準出力/エラー出力に出力された内容をクライアントに転送する。受け取ったクライアントは、それを自身の標準出力/標準エラーに書き出す。要はフィルタが書けるってことです。
  • クライアントは自身のカレントディレクトリをサーバに送信し,サーバは受け取ったカレントディレクトリをJNA(Java Native Access)でネイティブレベルで設定しつつ実行。これによりコマンドラインでファイルを相対指定することが可能。
  • 複数のクライアントがサーバに同時接続してきたときは、サーバー側のSystem.out/in/errは対応クライアントと接続されるように多重化(複数クライアントの同時接続は、特に複数のgroovyスクリプトをパイプでつないでフィルタとして動作させるために必要)
  • サーバはスクリプト起動ごとに動的にクラスパスを設定して実行。つまりCLASSPATH環境変数はクライアント実行時のものが使われるし、クライアント実行時に指定した-cpオプションも機能する
  • Groovyのバージョンには今のところ一応依存しない(1.6.x以降、1.8の現時点でのsnapshotで確認)
  • サーバ側でのSystem.exit()の実行を、セキュリティマネージャでトラップをかけて、クライアントにexit statusを送り返し,クライアントがそのexit statusでexitする

予告編で問題点として書いていた、クラスパスの問題やnew Threadしたときの標準出力の結び付けなどは現時点ではおおむね解決しています。同マシン上の他のユーザから接続できてしまっていたというセキュリティ上の問題だった点も、クッキーを用いた方式で対応しています(自ユーザのみからアクセス可能。ただしWindows/cygwin環境は留意が必要だが、複数ユーザが同時ログインして利用しているのでなければ問題ない。)

使ってみて感想など頂けますとありがたいです。
最後に開発にご協力いただいたkobo projectの皆さんとくにid:nobeansさんにおかれましては大変ありがとうございました。