2011年6月30日木曜日

JavaFX 2.0をGroovyで使ってみる

JavaFX ユーザグループ 第 5 回勉強会に参加しました。

そこで作ったカスタムブラウザ(参考 カスタムブラウザを作る - Everyday JavaFX)をGroovyで書き直してみました。

使ったJavaFXはJava FX 2.0 Beta (Build 32)です。
Groovyは1.8.0です。



思ったより面倒だったので、次はGroovyFXを使って書いてみようと思います。

2011年6月19日日曜日

emscriptenを使ってみる

LLVMのアセンブリ(.ll)からJavaScriptを生成するEmscriptenを使ってみました。
きっかけは、ちょっとした思いつき

試したかったのは、JS以外の言語でJSの世界に触るコードを書くというものなのですが、JS世界のオブジェクトやら何やらを定義するのが面倒くさくて断念しました。
JSの世界とは全く別のコードをJSに持って行くのには便利だと思います。


以下は、試した手順のメモ。
前提として、LLVM2.9, Clang, v8, Python2.x(2.7.2でやった)は入っているものとします。

1. emscriptenを使えるようにする

[hideaki@archbox ~]$ git clone git://github.com/kripken/emscripten.git
[hideaki@archbox ~]$ cd emscripten/
[hideaki@archbox emscripten]$ python2 emscripten.py 
Usage省略

一回emscripten.pyを実行すると、~/.emscriptenが作られるので環境に合わせて編集する。
編集したのは

  • EMSCRIPTEN_ROOT(~でgit cloneしたので、~/emscripten)
  • LLVM_ROOT(パッケージで入れたので/usr/bin)
  • LLVM_GCC(clang++にした)
  • COMPILER_OPTS(64bit環境なので)
  • V8_ENGINE(パッケージなので/usr/bin/d8)

2. Cのコードを書く

とりあえず、環境が既にあるCにしました。もともと型チェックが欲しいのがきっかけなので、存在しないJSの関数もプロトタイプ宣言します。今回はalertで(後で分かったことですが、alertに文字列を渡しているつもりだったのですが、うまく動きませんでした。当然ながらアドレス(相当)を渡しているので、結果として整数として扱われるようです)

[hideaki@archbox ~]$ cat test.c
#include <stdio.h>
extern void alert(char *msg);

int test(int x, int y) {
    char s[1024];
    int r = x + y;
    snprintf(s, sizeof(s), "%d+%d=%d", x, y, r);
    alert(s);
    return r;
}

int main(int argc, char* argv[]) {
    test(1, 2);
    return 0;
}

3. コンパイルとLLVMアセンブリ作成

[hideaki@archbox ~]$ clang -c -emit-llvm test.c
[hideaki@archbox ~]$ llvm-dis --show-annotations test.o
これでtest.o.llが出来ているはず。

4. JS作成

[hideaki@archbox ~]$ cd emscripten/
[hideaki@archbox emscripten]$ python2 emscripten.py ../test.o.ll > test.js

5. 実行してみる

[hideaki@archbox emscripten]$ d8 test.js
test.js:718: ReferenceError: _alert is not defined
    _alert($11);

当然失敗する。

なお、alertの中身をputsとかにしておけば動きます。
[hideaki@archbox ~]$ cat test.c
省略
void alert(char *s) {
 puts(s);
}
省略

コンパイルとか省略

[hideaki@archbox emscripten]$ d8 test.js
1+2=3

6. ブラウザで実行する


alertは_alertとして参照されるので、_alertを定義します。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <script>
      function _alert(arg) {
        alert(arg);
      }
    </script>
    <script src="emscripten/test.js"></script>
    <script>
      alert(_test(1, 2));
    </script>
  </head>
  <body></body>
</html>

このHTMLをブラウザで開くと、3回alert dialogが表示されます。
最初にmainが実行され一度目、次に_test(1, 2)によって二度目、最後に_test(1, 2)の戻り値がalertで表示されます。

このように、他の言語からJSの関数を使うのは面倒な感じでした。他の言語でロジックを書いて、JSから呼ぶとかそんな感じが一番使いやすそうです。

2011年6月4日土曜日

java.util.concurrentの紹介をやった

会社の勉強会でjava.util.concurrentっていうものが在るんだよという程度のプレゼンをやった。

メモリモデルの説明まではやれないので、大まかにAtomic, 並行コレクション、同期オブジェクト,  Executorの説明をしようと思ったのに、Atomic以外はほとんど出来なかった…。そのAtomicも微妙だったけど。とりあえず定番のインクリメントのデモをやった。

作るプログラムにも依るけど、java.util.concurrentをしっかり使うところって、あんまり無いんだろうか…。普通のサーブレットだと通信やらDBの方が遅くなるし。JDK1.4なところとかもいまだにあるしな…

デモのソース(関数オブジェクトが欲しくなる…)