« 2007年11月 | メイン | 2008年01月 »

2007年12月 アーカイブ

2007年12月05日

jjsruby - JSRuby for Rhino (笑)

id:amachang わーい \(^o^)/ JS で書ける IRC ボットライブラリできたよー

(Rhino) たのしー \(^o^)/

というのに当てられて、タイトルですでにネタバレしているとおり、JSRuby を Rhino で試せるようにしてみました(笑)。
といっても、id:tokuhirom さんが commit してくれた repl.js をちょこっといじっただけですが(笑)。


(1) CodeRepos から JSRuby をぱしっと取ってくる。
(2) Java(5 以上?)や Rhino もいれておく
(3) jsruby の trunk の下で下記実行 ( js.jar のパスは適宜指定 )

java -cp ./js.jar org.mozilla.javascript.tools.shell.Main  tools/jjsruby.js

これで対話的に Rhino 上で javascript ruby のコードを実行できます( Rhino で Javascript が実行できるのは当たり前ですね、とほほ……)。

一番苦労したのは Rhino から標準入出力をどうやって読み書きするか(笑)。



追記:Rhino で標準入出力


せっかくなのでメモ。
Rhino では print() が組み込まれていて、標準出力に文字列を出力することが出来ますが、自動的に改行されてしまうため、改行を付けたくない文字列出力(プロンプトとか)には使えません。
また、SpiderMonkey には readline() が組み込まれていて標準入力から文字列が取れますが、Rhino にはそれっぽいのは無さそうです(見つけられなかっただけで、もしかしたらあるのか?)。

Rhino からは Java のクラスが使えるのでそっちを経由して標準入出力を取りたいところ。
java.lang.System に in と out というフィールドがあり、これらがそれぞれ stdin / stdout に対応しているのでこれを取れればOK。
でも java.lang.System.in と書くと "missing name after . operator" と怒られてしまう。正解は java.lang.System["in"] 。

というわけで jjsruby では以下のように使いました。

importPackage(java.io);
var stdin = new BufferedReader(new InputStreamReader(java.lang.System["in"]));
var stdout = new OutputStreamWriter(java.lang.System["out"]);

(中略)

stdout.write("> ");stdout.flush(); // プロンプト表示
while (line = stdin.readLine()) { // 一行入力
var nodetree = parser.parse(line)
print(ruby.exec(nodetree));
stdout.write("> ");stdout.flush();
}

stdin は readLine() が使いたかったので BufferedReader でくるんでます。
stdout は短い文字列を出力しただけだと表示されないので、すぐ flush() しています。

2007年12月07日

英語学習ブーム@ラボ

今、ラボ(の一部)では英語学習ブーム。
きっかけは iKnow だったんですが、早速下火気味(苦笑)。
で、続いて「勉強のためにどういうツールをどのプラットフォームで作るのがいいか」という方向で熱い議論が(爆)。
まあ iKnow でも、勉強するより iKnow 用の GreaseMonkey スクリプト書いてる時間の方が長かった人がちらほらいるようないないようなw。

2007年12月12日

JSRuby で DOM 操作

日々ちょっとずつ開発している JSRuby に以下の機能が追加されました。

  • Array のサポート
  • JavaScript オブジェクトを呼び出し可能に
まだ自由に JavaScript のオブジェクトを JSRuby に渡せるようにはしていないのですが ( def を実装すれば、引数で渡せるようにする予定)、window オブジェクトと document オブジェクトをそれぞれ $window, $document で参照できるようにしています。

例えば、以下のような JavaScript なんだか Ruby なんだかよくわからないコードが動きます。


$window.alert $window.prompt "hogehoge", 123


$document.getElementsByTagName("div").each {|x|
  x.style.border = "2px solid red"
} 


この実装のために、JavaScript のオブジェクトの判別とか、IE で window.alert.apply が呼び出せないのとか色々落とし穴があったんですが、都度 id:ZIGOROu さんに助けてもらっちゃいました。ZIGOROu++

2007年12月19日

MyMiniCity 日本語化

ちまたで噂の MyMiniCity に

なんてのを作ってみました。
んーでもこれって、訪れてくれた人にインセンティブが皆無なので、リピーターの獲得しようがないんですよね。
だから例えば「下連雀の住人の力を結集して 404Blog !Found に勝つぞーおー!」とかいうようなプロモーションに頼るしか。
"Nishio City" と姉妹都市提携を結ぶとかもできたら楽しそうなんだけど。
ううむやっぱりここは技術の力で何とかするしか。どうやらアクセス元の IP を一意にカウントしているようなので、世界中のオープンプロキ(ry

ちなみに、MyMiniCity の画面は英語なのですが、Japanize を入れればちゃんと日本語で遊べますよ! 中谷も翻訳データを更新しちゃいました~。

About 2007年12月

2007年12月にブログ「nakatani @ cybozu labs」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2007年11月です。

次のアーカイブは2008年01月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。