FreeBSDでもclojure


先日は、すっかりclojureという面白いものにハマッテしまった訳であるが、おしい
かな、動かした舞台は Windows上の事。
Javaのキャッチフレーズ Write onece Run anyware からすれば、他の環境、、
LinuxとかSolarisとか*BSDとかでも、動いて当たり前のはず。
まあ、SolarisはSunのお膝元だから、当然として、LinuxもSolarisの代役を務める
ご時世だから、これもまあ難なく動くだろう。
ならば、*BSDはどうか? 手元にあるFreeBSD 6.4-stableで、最近のJava事情を
確かめてみる事にする。

まずは、/usr/ports/java/を見てみる。使えそうなのを見繕うと
diablo-jre16
jdk16
linux-sun-jre16

FreeBSDは、Linuxとしても使えるので、linux-sun-jre16を試してみよう。
makeを始めると
======================================================================
Warning: This JRE may be unstable. You are advised to use the native
FreeBSD 1.6 JDK, in ports/java/jdk16.

This Java VM will attempt to obtain some system information by
accessing files in linux's procfs.  You must install the Linux
emulation procfs filesystem for this to work correctly.  The JVM
will exhibit various problems otherwise.  This can be accomplished
by adding the following line to your /etc/fstab file:

 linprocfs   /compat/linux/proc   linprocfs   rw   0  0

and then, as root, executing the commands:

kldload linprocfs
mount /compat/linux/proc

======================================================================
いきなり出鼻をくじかれるようなメッセージが出てきたよ。
まあ、お遊びだから、楽(直ぐに使える)な路線で行ってみよー。

root@fb /usr/ports/java/linux-sun-jre16]# make
===>  linux-sun-jre-1.6.0.03 You must manually fetch the JRE self-extracting file for the Linux platform (jre-6u3-linux-i586.bin) from http://java.sun.com/javase/downloads/index.jsp, place it in /usr/ports/distfiles and then run make again.
*** Error code 1

Stop in /usr/ports/java/linux-sun-jre16.

Sunのサイトに行って、取ってこいですって。で、行ってみると指定の
jre-6u3-linux-i586.binはもう無いみたい。しょうがないので、最新のやつを取って
きて、それに合わせてちょいとMakefileとかdistinfoを変更。

===>  Extracting for linux-sun-jre-1.6.0.12
===>   linux-sun-jre-1.6.0.12 depends on file: /compat/linux/etc/fedora-release - found
register_JDK: not found
/usr/ports/java/linux-sun-jre16/work/install.sfx: 22: Syntax error: "else" unexpected
*** Error code 2

register_JDKって言うコマンドなんて聞いた事ないぞ。それに文法間違いも有る
とは、、Makefileを見つつ、workの現場に駆けつけて、現場検証だな。

---------------------------------------------------------
 :
    # Service Tag support and JDK product registration
    register_JDK "$javahome" "${BINARY_NAME}" "$1"

else
    if [ "$1" = "-x" ]; then
        echo "Extraction of RPM Done."
 :
----------------------------------------------------------
else に対する ifが無いんよ。そりゃエラーにするわな。要するに、スクリプトの
頭の方がカットされているのだ。これは、JRE_REVISION= 03 を 12 に強引に
書き換えた祟りだろう。Makefileをじっと見直すと、、、

----------------------------------------------------------
do-extract:
        @${MKDIR} ${WRKDIR}
        @cd ${WRKDIR} \
        && ${TAIL} -n +403 ${DISTDIR}/${DISTNAME}${EXTRACT_SUFX} > ${WRKDIR}/install.sfx \
        && ${CHMOD} +x ${WRKDIR}/install.sfx \
        && ${WRKDIR}/install.sfx > /dev/null
-----------------------------------------------------------
謎のMagic Number +403 を発見。こいつが悪い、こやつを調整してやろう。
今度は、エラーが出なくなったけど、待てど暮らせど、一向に動いている
そぶりが無い。

業を煮やして、work/install.sfx を直接実行してみると、、
For inquiries please contact: Sun Microsystems, Inc., 4150
Network Circle, Santa Clara, California 95054, U.S.A.

Do you agree to the above license terms? [yes or no]

ライセンスに同意を求めてきたよ。/dev/nullに捨てられていたので、これが
見えなかっただけね。了解しましただ。
こうして、インストール完了。

[sakae@fb ~]$ java -version
java version "1.6.0_12"
Java(TM) SE Runtime Environment (build 1.6.0_12-b04)
Java HotSpot(TM) Client VM (build 11.2-b01, mixed mode, sharing)
[sakae@fb ~]$ uname -v
FreeBSD 6.4-STABLE #0: Sat Mar  7 04:16:29 JST 2009     root@fb.kuma.net:/usr/obj/usr/src/sys/SAKAE


さて、いよいよお目当ての clojureだな。Windows機から、そのまま持って
きたものを試してみる。

[sakae@fb ~/clj]$ java -jar clojure.jar
Clojure
user=> (+ 1 2 3 4 5 6 7 8 9 10)
55
user=> (/ 1 0)
java.lang.ArithmeticException: Divide by zero (NO_SOURCE_FILE:0)
user=> (/ 1 3)
1/3
user=> ^Z
[1]+  Stopped                 java -jar clojure.jar

ああ、動いているぽいね。
終了しようと思ったら、裏側に回っちゃったよ。ついでだから
[sakae@fb ~/clj]$ ps
  PID  TT  STAT      TIME COMMAND
  667  v0  I      0:00.03 -bash (bash)
  669  v0  I+     0:00.01 /bin/sh /usr/local/bin/startx
  687  v0  I+     0:00.01 xinit /home/sakae/.xinitrc -- -auth /home/sakae/.serv
  693  v0  I      0:00.11 twm
  722  v0  I      0:00.20 kinput2 -jserver localhost -wnn
 2122  p0  Is+    0:00.03 bash
  822  p1  Ss     0:00.08 -bash (bash)
 2576  p1  T      0:00.05 /usr/local/linux-sun-jre1.6.0/bin/java -jar clojure.j
 2683  p1  S      0:00.00 /usr/local/linux-sun-jre1.6.0/bin/java -jar clojure.j
 2684  p1  T      0:03.98 /usr/local/linux-sun-jre1.6.0/bin/java -jar clojure.j
 2685  p1  T      0:00.35 /usr/local/linux-sun-jre1.6.0/bin/java -jar clojure.j
 2686  p1  T      0:00.00 /usr/local/linux-sun-jre1.6.0/bin/java -jar clojure.j
 2687  p1  T      0:00.00 /usr/local/linux-sun-jre1.6.0/bin/java -jar clojure.j
 2688  p1  T      0:00.00 /usr/local/linux-sun-jre1.6.0/bin/java -jar clojure.j
 2689  p1  T      0:00.55 /usr/local/linux-sun-jre1.6.0/bin/java -jar clojure.j
 2690  p1  T      0:00.00 /usr/local/linux-sun-jre1.6.0/bin/java -jar clojure.j
 2691  p1  T      0:00.02 /usr/local/linux-sun-jre1.6.0/bin/java -jar clojure.j
 2713  p1  R+     0:00.00 ps

こんなにたくさんjavaが動いているのは、FreeBSDの事情によるもの? それとも
clojureの特殊事情で仕事を振り分けでもしてるの?

[sakae@fb ~/clj]$ fg
java -jar clojure.jar
(* 1111111111 1111111111)
1234567900987654321
user=> ^D
[sakae@fb ~/clj]$

最後に、
言うまでもないけど、1行GUIと摂氏華氏変換のGUIも動くのを確認済み。