livedoor Reader で irb (インタラクティブ ruby)

RedHanded 経由で irb のリモート版があるのを知り、早速作ってみました。LDR 上で

:ruby 10.times { print "ho! " }

なことができます。

また、セッションが維持されますので、前に定義した変数等を参照することも出来ます。

つまり、irb そのものです。

  • 手元に ruby が無い
  • 手元に計算機が無い
  • ruby のお勉強系のブログでその場でお勉強

といった場面での活躍が期待できます。(よね?)


ご利用はキーワードの方からどうぞ (user.js ファイルが提供されています)。

一応こちらにも定義部分を再掲しておきます:

register_command("irb|ruby", function() {
  // See: http://redhanded.hobix.com/inspect/rubylessRuby.html
  var irb = "http://tryruby.hobix.com/irb?cmd=";
  var func = arguments.callee, args = arguments;

  if (!func.sess)
    return GM_xmlhttpRequest({
      method: "GET",
      url: irb + "!INIT!IRB!",
      onload: function(res) {
        func.sess = res.responseText;
        func.apply(this, args);
      }
    });

  GM_xmlhttpRequest({
    method: "GET",
    url: irb + encodeURIComponent(w.Array.from(args).join(" ")),
    headers: {
      "Cookie": ["_session_id", func.sess].map(encodeURIComponent).join("=")
    },
    onload: function(res) {
      message(res.responseText);
    }
  });
});

(IE では "w.Array" の "w." が不要です。ひょっとして Firefox でも不要でしょうか?)

追記:

言い忘れましたが、IE 用の GM_xmlhttpRequestid:reinyannyan:20060525:p1 に定義してあります。


Update [20060705]:

GM* 関数が二つあるのが格好悪い気がしたので、書き直してみました。(が、行数的には長くなってしまいました)
あと、サーバーが落ちている場合にインプット・フィールドがいつまでも閉じないのが嫌だったので、返答待ちのメッセージを追加しました。

register_command("irb|ruby", function() {
  var self = arguments.callee;
  if (!self.gen_param)
    self.gen_param = function (args) {
      var cmd, headers, onload;
      if (self.sess) {
        cmd = encodeURIComponent(w.Array.from(args).join(" "));
        headers = {
          Cookie: ["_session_id", self.sess
                      ].map(encodeURIComponent).join("=")
        };
        onload = function(res) {
          message(res.responseText);
        };
      }
      else {
        cmd = "!INIT!IRB!";
        onload = function(res) {
          self.sess = res.responseText;
          self.apply(null, args);
        };
      }
      return {
        method: "GET",
        url: "http://tryruby.hobix.com/irb?cmd=" + cmd,
        headers: headers,
        onload: onload
      };
    };

  message("..");
  GM_xmlhttpRequest(self.gen_param(arguments));
});