おもろいものをありがとうございます

Home - GroovyServ

というわけで、GroovyServためしました。CLIでもいくらか試しましたが、このくらい速ければサーバサイドで使ってもよくねー?というわけで珍幹線で実験してみた。

実験コードは以下。

<script id="code" type="text/groovy">
  def a = 3;
  def b = 2;
  println(a+b);
</script>

一瞬「えっ!?」というかんじですが、速さゆえに可能なこと、つまりスタティックなHTMLにgroovyスクリプトをうめこんでサーバサイドでうごかしてみる実験です。

方向性はnode.jsのwebsockets経由でgroovyclientからgroovyスクリプトを動かすってな方向。つまりはwebsocketが実装されてるブラウザじゃないと動かないよってかたち。いいんです。じぶんが楽しめれば。ローカルじゃないとダメですしね。

ちなみにじぶんはwebkitのnightly buildでためしたよ。

groovyserv.html

<!doctype html>
<html>
  <head>
    <title>groovyserv via websocket</title>
  </head>
  <body>

    <script id="code" type="text/groovy">
      def a = 3;
      def b = 2;
      println(a+b);
    </script>

    <p id="result"></p>
    
    <script type="text/javascript">
        var webSocket = new WebSocket('ws://localhost:8080/groovy');
        var groovy_script = document.getElementById('code').innerText;

        webSocket.onopen = function(event){

            document.getElementById('result').innerHTML = 'waiting for socket';
            
            webSocket.send(JSON.stringify({
                  doing:"exec_script",
                  code:groovy_script
            }));
        };

        webSocket.onmessage = function(event){
            var object = JSON.parse(event.data);
            document.getElementById('result').innerHTML = object.res;
        };

        webSocket.onclose = function(event){
            document.getElementById('result').innerHTML = 'socket closed';
        };
    </script>
    
  </body>
</html>

node.websocket.jsをつかいましたので、modulesにはこんなjsを置きました。

groovy.js

var Module = this.Module = function(){
};

var sys = require("sys");

Module.prototype.onData = function(data, connection){
  var req = JSON.parse(data);
  
  if(req.doing == 'exec_script'){
    var proc = ('/opt/groovyserv/bin/groovyclient -e "'+req.code+'"').replace(/\r\n|\r|\n/g,"");
    sys.exec(proc).addCallback(function(stdout,stderr){
      connection.send(JSON.stringify({res:stdout}));
      sys.puts(stderr);
    });
  }  
};

Module.prototype.onDisconnect = function(connection){
  clearInterval(this.interval);
};

あとは

> groovyserver
> node runserver.js

してあげてgroovyserv.htmlをひらけばscriptタグ内のgroovyスクリプトがwebsocketを経由してgroovyservで動くわけですね。

こんなふうな「groovyservをサーバサイドで使う方法」なんてのは極端な例だし、キチ○イめいたものかもしれませんが、groovyの中身の世界でスピードアップのチャンスをいただいた分、それを利用させていただく側としてはその恩恵をうまく享受できるように工夫する必要があると思います。開発者の方々に「あーしてほしい、こーしてほしい」の前になんとかできる方法を考えてみるって大事だし、それが「コンピュータやくざ」にとって一番必要なことだろうと思うわけですね。そしてそれ以前にこういうおもろいものをリリースしてもらえることに感謝しなければならないと思うわけですよ。金も払わずにこんなおもろいものをいじくれるってのは、ホントに幸せなことです。

でもって今後はもうすこし中身をくわしく見ていって、フツーじゃない使いかたを考えていければと思います。間違った解釈こそおもろいものが生まれる根源だと思っておりますので。