2007年12月26日水曜日

NetBeans 6 / ruby gems OutOfMemoryError

Java heap size はどうもハードコーディングされているらしい。

http://deadlock.netbeans.org/fisheye/rdiff/netbeans?csid=MAIN:mkrauskopf:20071216155725&u&N

Index: ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java
===================================================================
RCS file: /cvsup/nb_all/ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java,v
diff -u -N -r1.2 -r1.3
--- ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java 16 Dec 2007 15:48:05 -0000 1.2
+++ ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java 16 Dec 2007 15:57:25 -0000 1.3
@@ -170,7 +170,7 @@

String extraArgs = System.getenv("JRUBY_EXTRA_VM_ARGS"); // NOI18N

- String javaMemory = "-Xmx256m"; // NOI18N
+ String javaMemory = "-Xmx512m"; // NOI18N
String javaStack = "-Xss1024k"; // NOI18N

if (extraArgs != null) {

JRUBY_EXTRA_VM_ARGS に -Xmx512m を指定することでこれは解決。

rake がなかなか動いてくれない。以下のキーワードで探してみるが、
これといったのが見つからない...

"adding Java library jruby-complete-1.0.2" "rake aborted!" "execution expired"

何とか war ファイルはできたものの、アクセスするとディレクトリリストが
見えてしまう。アプリケーションとしては動かない。rake task で run すると
jetty が起動されるが、JSP サポートがないと出る。
ただ、war をデプロイしたのは Tomcat 5.5.1 だ。なぜだ???

2007年12月21日金曜日

Scala

Java Posse の Martin Odersky の interview から、Scala の作者である
だけではなく 1.3 以降の javac の開発もやってきた人だと関心。Scala
自身は初見だったが、よく pod cast にでてきたのは覚えている。言語に
うるさい人には気になるようだ。

Scala のコンパイラ、実行環境はオープンソースでダウンロードできて、
1.4 あたりからの java があれば実行できる。

* Hello World

package hello;
object HelloWorld {
def main(args: Array[String]) {
println("Hello World!")
}
}

- package は java と同様
- object Name { ... } は Name というシングルトンを作る
- メソッドの定義は def ではじめる。引数は "名前: 型" で宣言する
- println は組み込み
- import も同様に使えるが、機能が拡張されている。最後の要素で
{class1, class2} のようにまとめて指定でき、import a.b.C._ で
C がクラス名とすると、これは C に関する static import として
働く。

- ソースの拡張子は .scala, scalac でコンパイル。ファイル名とクラス名の
 一致の必要はないようだ。

* クラス定義

class Complex(real: double, imaginary: double) {
def re = real
def im = imaginary
override def toString() =
"" + re + (if (im < 0) "" else "+") + im + "i"
}

クラス名のあとに引数のリストが来る。これは primary constructor の
シグネチャで、class の body がパースされる。ボディがパースされるのは
ruby に似ている。

def re = real

は初期値の設定と re という getter/setter の宣言でもある。プロパティを
作っているといってもいいかも知れないが、うるさい人は色々と意見がある
だろう。本当のプロパティはコンポーネントモデルにおけるプロパティであり、
参照、設定のほかにもイベント機能なども備えないとなど云々...

Ruby のように自明なものは関数のあとに () を書かなくても呼べる。
またオブジェクトのオペレーションを呼ぶときに "." すら省略できるケースが
ある。

インスタンス化は java とほぼ同じ。

val c = new Complex(1.2, 3.4)

これは厳密に書けば

val c: Complex = new Complex(1.2, 3.4)

* Generics / Genericity

Generics/Template 相当の機能を備えている。Genericity と呼んでいる。
下の例では a は任意の型。

class Reference[a] {
private var contents: a = _
def set(value: a) { contents = value }
def get: a = contents
}

* Mixin 機能。

Ruby のものと似ている。AOP の手法の一つともいえる。実態つき、拡張可能な
インターフェイスのようなものと言ってもいい。

* call-by-value/call-by-name

関数呼び出しは call-by-value と call-by-name があり、引数の評価の
仕方が異なる。デフォルトは call-by-valude であるが、reduction が
完了しない事がある。その場合にはパラメータの型の前に => を入れると
call-by-name になる。

def constOne(x: Int, y: => Int) = 1

* if-else は conditional expression の様にも使える。

def abs(x: Double) = if (x >= 0) x else x

* Unit は java の void とほぼ同様。()

* Nested function

inner class の様に関数の中に関数を定義できる。一番外側の関数の変数は
nested function からも参照できる。

* Tail Recursion

一見、再起呼び出しに見えても、スタックを余計に消費しないように実行できる
場合はそうしてくれる。

* First-Class Functions

関数は first-class value と呼ばれ、他の関数に渡すことができる。そのような
関数を受け取ったり、返したりする関数は higher-order functions と呼ばれる。

関数のパラメータの型は "Int => Int" (Int をとり Int を返す) という形で
指定できる。その例として下のものは a から b の間の値に f 適用してその
合計をとる関数となる。

def sum(f: Int => Int, a: Int, b: Int): Int =
if (a > b) 0 else f(a) + sum(f, a + 1, b)

def sumInts(a: Int, b: Int): Int = sum(id, a, b)
def sumSquares(a: Int, b: Int): Int = sum(square, a, b)
def sumPowersOfTwo(a: Int, b: Int): Int = sum(powerOfTwo, a, b)

def id(x: Int): Int = x
def square(x: Int): Int = x * x
def powerOfTwo(x: Int): Int = if (x == 0) 1 else 2 * powerOfTwo(x 1)

2007年12月20日木曜日

J2EE 1.4

J2EE 1.4 で iBATIS を使った Bean Managed Entity Bean のサンプルを作ることに
なった。一つ一つ手で行うのは無謀なので NetBeans6 を使ってみる。

J2EE 1.4 なので以下の URL を参考にする。
http://www.netbeans.org/kb/41/
http://www.netbeans.org/kb/41/j2ee-tut/index.html

SavingsAccount のサンプルで Bean Managed Bean を作ってみる。Bean Module を
作り、Entity Bean を追加する。Entity Bean 内で Enterprise Resource ->
Use Database でデータベースを選択することになるが、サンプルは NetBeans4.1
ベースで当時のバンドルデータベースは pointbase で細かなところが違って
くる。

Use Database のダイアログでまず最初に指定するのは Reference Name だが、
これは app server ごとに異なる sun-ejb-jar.xml の中で JNDI で参照する
サーバのデータベースリソース (jdbc/mysqlTest01 等) につける名前だ。
この設定は NetBeans が勝手にやってくれる。選択対象は Sun Java System
Application Server Admin Console の Resources/JDBC/JDBC Resources の
エントリから選択することになる。このページには jdbc/* がリストされている。
これらのエントリは個々に enable/disable ができて Resources/JDBC/Connection Pools
のエントリを参照している。Connection Pools のエントリはいわゆるデータ
ソースで URL, user, JDBC driver 等の属性を持っている。PointBase を
復習するのも面倒なので MySQL を使ってみる。ウィザードを使えば設定は
比較的簡単だが、最初 XA driver を選んでしまい、トランザクション関連の
エラーになったので、ただのデータソースにした。コネクションプールに
対応した JDBC Resource も定義して、Entity Bean からは適当に名前を
つけたリソースを参照させる。

実際の DB ソーサのコードはベタな JDBC なのでサンプルからコピー。
ビジネスメッソッドもコンテキストメニューを使ったり、リファクタリングの
フィールドのエンカプセレイト機能を使って作っていく。ビジネスメソッドは
対応するものが *Remote.java のインターフェイスに定義されていなければ
ならないが、IDE が 'throws RemoteException;' を自動的につけてくれて
いないメソッドについては実行時にエラーが出たので、手でつけた。

Home メソッドも追加していくことになるが、コンテキストメニューで追加すると
Bean には ejbFindByLastName のようなメソッドができるが、戻り値を複数に
指定しておくとどうやら Home インターフェイス側には cByLastName のような
メソッドができる。コレクションで返すのでこういうネーミングになっているのかも
と勝手に納得していたが、そういうことではないらしい。名前はあっていないと
いけない。インターフェイスにあわせて ejbCByLastName とやってもだめ、
ejbcByLastName とやってもだめだった。Collection を返すことが名前から
わかることは悪いことではないと思い、Home 側を findcByLastName として
Bean 側を ejbFindcByLastName とすると動いた。この辺は Java Beans の
細かなところを調べればわかるのかも知れないが、その気力はない。
経験則としてキャメルケース・パスカルケースに1文字のワードというか、節を
持たせるのは良くないということを覚えておこう。

これくらいをクリアしたところで動くようになった。サンプルのクライアントで
一箇所だけ動かなかったのは remove の呼び出し。そのままでは文法エラーに
なるし、home 経由で呼ぼうとしてもエラーが消えない。今回はスキップ。


次に Roster のサンプルで CMP も確認しておく。このケースではもともと
関連のあるテープルを定義しておいて、それから New -> CMP Entity Beans from
Database... で作っている。若干強引に MySQL 上にテーブルを作ってこの処理を
すると関連のテーブルだけプライマリキーがないということで Bean が
作成されない。alter table _table_name_ add constraint primary key (field, field1,...)
で強引にやると作成されたが、ejb-jar.xml に CMP Relationships がまったく
現れない。

結局 Derby でテーブル作成の SQL が通ったので、それをもとにやってみると
動いたみたい。1:N や M:N の参照をわかりやすい名前に ejb-jar.xml で変更する
とそれがソースに反映されるとあったが、どうやらこれは動いていない。

次のステップとしていくつかの Bean に finder メソッドを EJB QL で追加して
行くところだが、このあたりは NB 4.1 と 6.0 の違いが大きいようで、このあたりで
今日は断念。

やっぱり、昔の EJB は面倒くさい...

2007年12月9日日曜日

Xcode

自作の C++ アプリケーションのリファクタリングの為に NetBeans6 に取り込んでみる。
その過程でコンパイラを聞かれるがデフォルトではLeopard にはコンパイラはないらしい。
(cc, c++ は not found になる。)Google を見て回ったところ Xcode というパッケージに
含まれているようだ。ユーザー登録をすれば ADC からダウンロードできるとのこと。
ユーザー登録の際に Apple ID とリンクできるようなことが書いてあったので、登録して
みると確認等の画面で日本語が文字化けしている。まあいいだろうということでXcode 3.0
をダウンロード。ディスクイメージをマウントしてみて出てきた PDF をみてみると
Leopard のメディアにも入っているらしいということが判明...

展開したものから XcodeTools.mpkg を入れてみる。特に問題なくインストール完了。


Macintosh:wtp$ cc
i686-apple-darwin9-gcc-4.0.1: no input files
Macintosh:wtp$ c++
i686-apple-darwin9-g++-4.0.1: no input files

2007年11月22日木曜日

Leopard

Mac mini が届いた。が、気づいたらキーボードがPS2 だった。
翌日Apple keyboard を購入してやっと起動。ムービーが流れて、
ユーザー登録から始まる。まだTiger だ。
Leopard の DVD? を入れてアップグレード。難なく終わった。

Spaces はデフォルトでオフなので、オンにしたが F8 がきかない。
Apple keyboard では F1-F12 まではほかの機能に割り当てられていて
ファンクションキーとして動かすには fn と同時に押す必要が
あるようだ。でも、それでは面倒なので起動は F13 にふってみたが、
動作がどうも見覚えのあるのと違う。4つの小窓が出てきて、矢印も
出てきてびゅんびゅんと切り替わるというイメージだったが、どうも
地味だ。後でわかったが ctrl+矢印でそのような動作になる。
築かなかったらフリーソフト探しまくってたかも...

Mail で IMAP 接続できるか試してみるが、これには SSL 機能は
見当たらない。あきらめかけたところで、Thunderbird を試して
みる。なんか、うまくいった。ただ、パスワードを覚えさせて
しまって、それがどこに行ったか気になった。OS X のキーチェーン
を調べても Thunderbird のエントリはないし... どうやら Thunderbird
自身が保持しているようだが、詳細は今日のところはあきらめた。

Boot camp で既存ボリュームのリサイズができるか気になっていた
ので試してみたが、問題ないようだ。

Parallels も購入しておいたので入れてみる。最初の起動でプロダクト
キーを入れたら、アップデート版の通知がでる。アップデートすると
もう一度プロダクトキーを要求された。

マニュアルが厚めだったので、かまわず直感でやってみる。
ゲストOS に見せるメモリサイズや、ディスクサイズなどの設定は
一番詳しい(一番下)のモードを選ぶ必要がありそう。

Solaris 10 を入れてみた。やはり I/O がホストOS 経由のせいか
直接ディスク入れるときより遅い気がする。はたと気づくと Parallels
のウィンドウがない。ただ、プロセスとしては存在しているようだ。
このとき、ほとんど操作ミスで画面のスクリーンショットをとった
のだが、そこにはコンソールモードでの問い合わせメッセージが
でている。NFS のドメインがなんたらというやつだ。

よくわからなかったので、強制終了して Lepard も再起動。Solaris 10
は起動中にいわゆるシングルユーザーモードで止まってしまった。
インストールが完了していないということだろう。

いったん消して、再度インストールしてみる。右側のタブに全画面表示
があったので、今度はそのモードでインストール。alt-enter で全画面と
通常を行き来できる。VMWare などと同じでいったんゲストの画面に
マウスポインタが移ると ctrl-alt しないと OS X にもどらない。

インストール完了、GUI ログインも出てくる。が、画面がでかい。
xwininfo -root でみると 1600x1200 になっている。Parallels の
編集/仮想マシン、、、で画面サイズを変更しても反映されない。
これは xorgcfg でディスプレイのサイズを低い解像度にすることで
解決できた。

次はネットワークだが、どうも Solaris からは見えていない。SMC
などで DHCP の設定などないか探してみるが見当たらない。Solaris との
ファイル共有はできないので、ファイル転送はネットワークしかないのだが...

Google をサーチすると手順が見つかった。/Library/Parallels/Tools/vmtools.iso
をCD/DVD デバイスにして Solaris を立ち上げると、このイメージがマウント
されているので、その中にある solaris 用の network.sh を実行して、
DHCP のクライアントになるかに yes と答えるだけだ。どうやら、ここの
部分は Parallels 側から提供されていて、インストール時点では
ネットワークは全くないことになっているようだ。

あがってしまえば ssh, scp で操作はできる。

ちょっとじたばたしたが、結構いい感じ。

2007年11月20日火曜日

Ant notes

Ant の覚え書き

ファイルからプロパティをロードするには次の要素を設定しておく。


<property file="build.properties"/>


build.properties には key = value を書いておく。
build.xml からは ${key} で参照可能。

あまり真剣に書いたことがなかったが、Java プログラムの起動に引数が
たくさんつくケースのために java タスクを使ってみる。結果、次のような
物に落ち着いた。


<target name="run_pja" depends="compile" description="run">
<java classname="test" fork="true">
<classpath>
<pathelement location="${jcaptcha.jar_path}"/>
<pathelement path="."/>
</classpath>
<jvmarg value="-Xbootclasspath/a:${pjajar}"/>
<jvmarg value="-showversion"/>
<sysproperty key="awt.toolkit" value="com.eteks.awt.PJAToolkit"/>
<sysproperty key="java.awt.graphicsenv"
value="com.eteks.java2d.PJAGraphicsEnvironment"/>
<sysproperty key="java2d.font.usePlatformFont" value="false"/>
<sysproperty key="java.awt.fonts" value="${jh}/jre/lib/fonts"/>
<sysproperty key="user.home" value="${pja_home}/lib"/>
</java>
</target>


fork="true" をしてしているのは jvmarg は fork="true" でのみ有効だから。

-Dkey=value は <sysproperty key="..." value="..."/> を羅列すれば
良いらしい。<syspropertyset .../> は使っていた版で java task ない
ではサポートされていないと出たので今回は見送る。

2007年11月16日金曜日

Technologies for SOA

SOA!!!



Sun Tech Days で SOA 関連のセッションで紹介されていた BPEL など SOA
関連の技術が思っていたよりわかりやすかった。また、NetBeans 6 ではその
開発を補助する機能がそろっているという事でチュートリアルをみながら
試してみた。

以前、Axis を活用しようと思ったときに、XML Schema や WSDL の手書きに
ウンザリしたので、少し敬遠していたけれど、NB6 ではこれらのファイルも
IDE の管理下で作れるらしい。

チュートリアル概要



HelloWorld は単純すぎるので Loan のサンプルの概要を書いておく。

BPEL モジュールの作成


New Project > SOA > BPEL Module で作成できる。

  • XML Schema の作成

    サービス呼び出しの際に簡単な文字列をひとつ渡すだけであれば、これは
    おそらく必要がない。実際には何らかのデータ構造を渡すことになるであろうし、
    それには、それなりの型を持たすことがわかりやすい。そうするためには XML
    Schema で complex type を定義することになる。



    実際の操作は画面右側のパレットから Complex Type を Editor の Complex Types
    のところにドロップすることで型が作れる。さらにそれぞれの型に Element icon
    をドロップして要素を作っていく。



    もうひとつ行うことは Complex Type を決めてから、それらをグローバルエレメントに
    登録すること。やり方は Element icon を Editor の Elements のところにドロップ
    して名前をつけて、Definition で Complex Types に作った型の名前をセットする。


  • WSDL の作成

    Process Files の下に WSDL document を作成する。独自の XML Schema を使う場合には
    Import XML Schema File(s) チェックボックスをチェックして先に定義したものや、
    ネームスペースを利用して、インポートできる。



    次は Editor の Partner タブでメッセージの名前や、型を決める。In/Out の最低2つは
    あるので、リクエストの名前をわかりやすいものに変え、型を決める。型はダイアログの
    中から選ぶだけなので簡単。XML Schema をインポートしておけばその中で決めた型を
    引数の型に使える。この際の型の名前は complex type の名前ではなく Elements に
    登録した名前になる。IDE が選択肢を示してくれるので簡単だが、うろ覚えで手書きだと
    とてもはまるかも知れない...



    オプショナルで LoanProcessor EJB モジュールを作る。ユーザー情報をもとに Loan の
    可否を判定する。必然的に Web Service のインターフェイスを持つことになる。
    Web Service のフォルダを右クリックして Web Service を作れる。そのあと、その
    Web Service を右クリックして Add Operation で操作を追加する。その際にパラメータも
    定義する。結果として @WebService アノテーションを使った java ソースができる。
    作成時に Session Bean にデリゲートすることもできるようだ。
    本当に EJB じゃないといけないのかと疑問に思った。なぜなら EJB Container が
    前提といわれると困るから。結果として、これは杞憂。できたのは本当にクラスを
    まとめただけの jar ファイルだった。wsdl もこの時点では存在しない。



  • BPEL process の作成

    Process Files に BPEL Process を作るとフローチャートのような画面が現れる。
    まずはここに入力として request の wsdl, Loan のチェックを行う web service
    を登録する。後者に関しては wsdl は自動生成されるようだ。このステップは
    モジュールのドラッグでできる。



    この次のステップとして、receive, invoke, reply をパレットからドラッグして、
    サービスと関係付けていく。プロセスの最初は、receive で始まる。リクエスト待ちの
    先頭というわけだ。



    Assign 要素で変数を作る。関連づけは BPEL Mapper でソースとデスティネーションを
    つなぐだけだ。




  • Composite Application の作成

    別プロジェクトとして Composite Application を作る。この定義ファイルは *.casa.
    この JBI モジュールとして、作成した BPEL module をドラッグ&ドロップで登録。



    これに consumer としての SOAP アダプターを登録する。



  • テストの作成、登録

    composite application の Test folder にテストを作れる。リクエストのパラメータを
    埋めるだけでテストになる。1回目の実行結果が正しい実行結果とされ、以後のテストと
    比較される。結果を消す、クリアしてしまえば正しいテスト結果を変えられるということか?


  • JBI とは

    NB6 の Composite Application が JBI の実装ということかなと思う。JSR 208 という
    事だが、これには IBM, BEA は賛同していないらしい。BPEL まではいいが、その上は
    まだ議論の余地があるということか....ということはこれらのベンダのBusiness Process
    Integration は propretary ???