あっという間に日時はめぐり、もう最終日です。
今日の Geneeral Session には 10 年前の Java のエバンジェリストであった Miko Matsumura が登壇します。彼がいたおかげでエバンジェリストという職種を知ったわけですが、あのころは夢がいっぱいあったような気がします。
まだ、使えるとも何ともいえない Java に対してなんでこんなに入れあげていたのだろうと不思議な感じがします。今はすぐに仕事で使えないとダメという風潮があるようで、個人的にはちょっと残念。
まぁ、そんなことはおいておいて、今日聴講したセッションは次の通りです。
今日も MC の末次さんから。まず、Java の父 James Gosling のビデオスピーチから。でも、やっぱりビデオだとつまらないです。それに T-Shirt 投げもなかったし。かなり残念。
その後に登壇したのが Sun のオープンソースをとりまとめている Simon Phipps。彼の肩書きは COSO、Chief Open Source Officer。 CTO とか CIO というのはよく聞きますが、COSO なんてはじめて聞きました。内容もやはりオープンソースと Participation Age に関するものです。
最後に末次さんとのやりとりの中で、これがオライリーの専門書の売り上げのグラフを表示したのですが、これがなかなかおもしろい。残念ながら、写真に撮るのを忘れてしまったのですが... これを見ると Java は強いです。Java の書籍の売り上げはこぶが 2 つあり、2 つめのこぶはオープンソースが活発になったためだと Simon はいいます。そんなもんなんでしょうか。
でも、全体的にみると、微減か横ばい。でも、思ったよりも本が売れていると感じたのは私だけではないと思います。
その後、登壇したのは Matt Tompson。JEDI (Java Education & Development Initiative) に関する講演です。JavaOne SF で紹介された JEDI ですが、着々と実績を上げているようです。JEDI はフィリピンではじまり、Java を学べない国の人たちにもオープンソースで優れた教材を提供しようとプロジェクトです。詳しくは https://jedi.dev.java.net へ。
ここまではよかったのですが、次に登壇した経産省の久米さんはひどいプレゼン。まったくなっていません。
プレゼンテーションというのは自分の考えを相手に伝えるためにあるはずなのですが、まったくの独りよがりのプレゼン。資料の字は小さくて、何が書いてあるか全然読めないし。
それに自分に期待された役目というものをはっきりいって分かっていないですね。自分がこの場で何を求められているのかを理解していないといったらいいでしょうか。もしかしたら、ここが Java のテクニカルカンファレンスであることも知らないのかもしれません。
というのは、彼の講演の中に Java とうい言葉は 1 度も出てこなかったからです。
はっきりいって、ひどすぎ。
しかし、それを救ってくれたのは Miko Matsumura でした。彼のスピーチは口数はすくなく、かみしめるように話すのですが、本当に力強い。すばらしいです。
それに手の使い方が抜群にうまい。動作は自然なのですが、手からはパワーがほとばしっているようです。まるで、役者か宗教家のようなのです。
自分もああいうプレゼンができるようになりたい、とつくづく思います。
途中、彼のプレゼン資料の中に HTML が貼ってあるものがあり、そこに Applet があったのですが、表示されないというハプニングが。どうやら、ネットが切れてしまったようです。慌ててネットを確認にいくスタッフ。でも、そんなことに少しも動じず、余裕で何もなかったかのようにプレゼンを進める Miko。まるで、それがシナリオであったかのように、流れるように進んでいきます。
彼は元々 Sun の社員で先に書いたようにはじめの Java のエバンジェリストだったわけです。その 10 年前のそれこそ世界中を旅して回っていた日々のことから、現在までを俯瞰し、これからの世界がどうなるかを少しだけ語るというものです。
後から、Sun の石原さんに聞いたのですが、ネットがつながらなくなってしまったので、Miko のところに謝りにいったそうなのです。そうしたら、Miko はそんなことは全然気にしていなく、「いいよ、いいよ」と。やはり、器が大きいですね。
General Session の最後に昨日の Night for Java Techonology の勝者が紹介されました。安中さんだけは都合で出席できなかったので、4 人が壇上に。
その中の代表ということで西島さんがデモをおこないました。覚えておられる方もいるかもしれませんが、西島さんは JC 2005 Spring の時も基調講演で 3D CG に関してデモをおこなっています。そのときは、プロ野球のデモでしたが、連続して基調講演でデモするなんて、なかなかすごいことだと思います。
ところで、JavaOne がはじまる前、ある一握りの人たちでおこなわれていたのが指笛プロジェクト。JavaOne 会期中に Cool なことが紹介されたら指笛を吹こうというプロジェクトです。主婦Java ののに子さんがいいだしたプロジェクトで、Sun の神谷さん、公式 blogger の杉山さんたちで盛り上がっていたのですが...
今までだれも指笛を吹いてくれません。櫻庭は昨日の Night for Java Technology や、今日の基調講演でも指笛を吹いたのに...
誰も追従してくれません。それだけでなく、拍手も何もなくシーンとしたまま。携帯で Duke や Gosling が動いているんですよ。Cool じゃないですか? 年に 1 回あるかないかの Java のお祭りなんだから、もう少し楽しんでもいいと思うんですけど...
Next Generation Dependency Injection はひがさんのセッション。これはいろいろな人がレポートしているので、わざわざ門外漢の櫻庭がレポートするほどでもないでしょう。コンセプトは設定ファイルを書かないですませよう、です。
Tigers and Mustangs and Dolphins, Oh My! は SF の焼き直しでそれほどアップデートがありませんでした。
やっぱり楽しい Programming Puzzlers。今回はなんと Tiger Edition。Tiger で取りいれられたジェネリクスにちなんだ問題などが出題されました。
出題は 8 問の予定だったのですが、時間がなくなって、7 問になってしまいました。
ここまでの成績は前回のチャンピョンの遠藤さんとやはり前回も参加された木村さんが 4 問づつ正解。なんとこの 2 人、前回も最後の場面でタイだったのです。
で、 結局 8 問目を行うことになりました。
そして、劇的な逆転で木村さんが優勝。前回の雪辱を果たしたのでした。
ということで、問題と選択肢を並べておきます。難しいですよ〜。
public class OddBehavior { public static void main(String[] args) { List<Integer> list = Arrays.asList(-2, -1, 0, 1, 2); boolean foundOdd = false; for (Iterator<Integer> it = list.iterator(); it.hasNext();) { foundOdd = foundOdd || isOdd(it.next()); } System.out.println(foundOdd); } public static boolean isOdd(int i) { return (i & 1) != 0; } }
選択肢 a. true b. false c. Throws Exception d. None of the above
public class SetListr { public static void main(String[] args) { Set<Integer> set = new LinkedHashSet<Integer>(); List<Integer> list = new ArrayList<Integer>(); for (int = -3; i < 3; i++) { set.add(i); list.add(i); } for (int = 0; i < 3; i++) { set.remove(i); list.remove(i); } System.out.println(set + " " + list); } }
選択肢 a. {-3, -2, -1} {-3, -2, -1} b. {-3, -2, -1} {-2, 0, 2} c. Throws Exception d. None of the above
public enum PowerOfTen { ONE(1), TEN(10), HUNDRED(100) { @Override public String toString() { return Integer.toString(val); } }; private final int val; PowerOfTen(int val) { this.val = val; } @Override public String toString() { return name().toLowerCase(); } public static void main(String[] args) { System.out.println(ONE + " " + TEN + " " + HUNDRED); } }
選択肢 a. ONE TEN HUNDRED b. one ten hundred c. one ten 100 d. None of the above
public class BeyondCompare { public static void main(String[] args) { Object o = new Integer(3); System.out.println(new Double(3).compareTo(o) == 0); } }
選択肢 a. true b. false c. Throws exception d. None of the above
public class Bleep { String name = "Bleep"; void setName(String name) { this.name = name; } void backgroundSetName() throws Exception { Thread t = new Thread() { @Override public void run() { setName("Blat"); } }; t.start(); t.join(); System.out.println(name); } public static void main(String[] args) throws Exception { new Bleep().backgroundSetName(); } }
選択肢 a. Bleep b. Blat c. It varies d. None of the above
import java.lang.reflect.*; @interface Test {} public class Testy() { public static void main(String[] args) { @Test public static void test() { System.out.println("Pass"); } @Test public static void test2() { throw null; } public static void main(String[] args) { for (Method m: Testy.class.getDeclaredMethods()) { if (m.isAnnotationPresent(Test.class)) { try { m.invoke(null); } catch (Throwable ex) { System.out.println("Fail"); } } } } }
選択肢 a. Pass Fail b. Fail Pass c. It varies d. None of the above
public class Fibonacci { private static final int LENGTH = 7; public static void main(String[] args) { int[] fib = new int[LENGTH]; fib[0] = fib[1] = 1; //First 2 Fibonacci numbers for (int i = 2; i < LENGTH; i++) { fig[i] = fib[i-2] + fib[i-1]; } System.out.println(Arrays.asList(fib)); } }
選択肢 a. [1, 1, 2, 3, 5, 8, 13] b. Throws exception c. It varies d. None of the above
public class Parsing { /** * Returns Integer corresponding to s, or null if s is null. * @throws NuberFormatException if s in nonnull and * doesn't represent a valid integer. */ private static Integer parseInt(String s) { return (s == null) ? (Integer)null : Integer.parseInt(s); } public static void main(String[] args) { System.out.println(parseInt("-1") + " " + parseInt(null) + " " + parseInt("1")); } }
選択肢 a. -1 null 1 b. -1 0 1 c. Throws exception d. None of the above
セッションが終了して、部屋から出てきた Joshua Bloch と Neal Gafter はすぐにサイン攻め。いつのまにか回答者が使用したボールがサインボールに早代わり。また、Puzzlers の本にサインしてもらっていた人も多くいました。
公式 blogger の杉山さんはちゃっかり Duke ネクタイをつけて、Joshua と Neal と記念写真。その後、回答者たちと記念写真。最後に木村さんも。
そいうえば、Joshua が私にむかって、「それは Dukelele か?」と聞くので、そうだと取りだしてみせたところ、いきなり弾きはじめました。どうやら、エレキを弾くらしいですね。Joshua が弾いた Dukelele なんて、めったにないですよ。あぁ、もう弾けない。
と、いいながら弾いてしまったわけですが ^^;; 詳しくは後ほど。
講師の Cliff Click は Sun で HotSpot を開発した人です。現在は Azul に所属しています。このセッションはその Azul で使用されている GC のアルゴリズムについて。
うーん、美しい。こんな単純にできるんだと、かなり感動。
これもハードウェアとソフトウェアのバランスがいいから成り立っているのでしょうね。
私がゴタゴタいうよりも、同じく感動されていた nminoru さんの Web ページをリンクしておきます。
日本では国際化に困っている人も多いだろうから、聴講者も多くいるだろうと思ったらあまりいませんでした。不思議ですね。
講師はついこの間まで国際化チームのリーダーだった Nobert Lindenberg、現在は Java SE のリリースマネージャの Brian Beck。彼はもともと国際化チームにいたのだそうです。そして、テクニカルライターの John O'Conner。日本からは奥津さん。なぜ、神谷さんは壇上にいないんでしょうね?
で、のっけからクイズ
Q. Java で char を 16 bit にすると決めたのはだれでしょう?
A. James Gosling
ということで、JDK 1.0 のころから Tiger までの国際化の歴史を一通り説明しました。
さて、またクイズです。
A. J2SE 1.2 で加わった Input Method Framework API の開発に加わらなかった企業は?
- Apple
- Fujitsu
- IBM
- Microsoft
- OMRON
- Sun Microsystems
答えは内緒だそうです ^^;;
さて、Mustang での国際化関連の新機能は次の通りです。
私も自分のセッションで和暦を扱ったのですが、これについて質問してみました。というのも、java.util.Formatter クラスが Calendar クラスの era を扱えないからなのです。
era は Gregorian Calendar では AD と BC が代入されます。よっぽどのことがないかぎり BC (紀元前) は使わないので、Formatter クラスで扱えなくてもたいした問題にはならないのです。
ところが JapaneseImperialCalendar では元号を era で表します。したがって、「平成」と Formatter クラスで出力することができないのです。
この問題に対して Mustang の Formatter はもうこのまま、Dolphin でそれが取りいれられるかどうかはリクエスト次第ということだそうです。
それよりも、Calendar クラス自体が使いにくいのではないかという懸念を奥津さんは感じているらしいです。たしかに、Calendar は使いにくいかもしれません。もしかしたら、Dolphin では Calendar クラスではなくて、新しい日時の表し方が導入されるかもしれません。
というわけで、JavaOne のとりは Project Looking Glass です。
もう、kyuka さんの blog や John さんの blog で明かされてしまったので正直にいいます。そうです、川原さんといっしょに歌ってしまいました、Project Looking Glass のテーマソングを。
まぁ、それはそれとして、このセッションでは LG3D のギークの人たちのノウハウを紹介してもらうというセッションです。
今回、私は川原さんといっしょに司会。講演者とタイトルは次の通りです。
LgScope はファイルマネージャです。ファイルはボックスとして表され、Z 軸をファイルサイズを表しています。また、ボックスの他の面にはファイルのメタデータが表示されるようになっています。
おもしろいのは、いろいろなファイルの並べ方ができるということです。本棚のように並べることや、まったく実用性のないバラバラに並べる方法など。
また、ファイルビューアも用意されていて、JMF を使用して動画を見ることもできます。
ファイルマネージャはよく使われるアプリケーションなので、みなにとって使いやすいように作るのはなかなか難しいと思います。LgScope もまだ完成したというにはちょっと早いと思いますが、これからが楽しみなアプリケーションです。
発表資料: LgScope
Kawa というのは Java で実装された Scheme 処理系です。
Kawa はスクリプトの中から Java のオブジェクトを生成したり、アクセスしたりすることができます。これを利用して、LG3D を Kawa から動かしてしまおうというのがえんどうさんの発表です。
スクリプトのよさは、すぐに実行できること。ちゃんとした Java のプログラムを作らなくても、とりあえず試してみるなんていう使い方にもってこいです。
LG3D でもテクスチャをいろいろ試してみるとか、モデルの変更などをスクリプトで簡単に実行できるのであれば、アプリケーソンの作成にかなり役に立つと思います。
発表資料: lg3d-on-kawa
San Francisco の JavaOne で話題をさらった、LG3D の中で踊る Duke と James Gosling。それを作ったのが西島さんです。
もともと、LG3D は Java3D で作成されているので、Java3D のモデルローダをそのまま使用することができます。
ところが、Java3D のモデルローダにはボーン構造を扱えるものがなかったのです。しかし、Duke のような関節がどこにあるかわからないようなものをアニメーションさせるにはボーン構造が扱えなくてはなりません。
そこで、作ってしまったのが MXW3DLoader です。現在は Lightweight 3D のモデルをロードできるそうです。
ところが、ボーン構造だけでないのです。
たとえば、Duke の鼻のテカリ。これは通常の LG3D のライティングモデルだと実現できません。そこで、西島さんは環境マッピングを扱えるようにしてしまったのです。
これで、Duke の鼻のテカリや、James Gosling の眼鏡の反射が実現されています。
すごいですね。テカリにそんな技術が使われていたなんて思いもよりませんでした。
発表資料: MXW3DLoader
最後の西本さんは、昨日の Night for Java Technology でデモをおこなった Ibrik についてです。
Ibrik は 3D と 2D のウィジェット、プレゼンテーションマネージャ、マルチメディア、テキストレンダラから構成されているようです。
通常の PowerPoint のようなプレゼンテーションは 2D のフレーム状のウィジェットにテキストレンダラを使用して描画されています。テキストはデザインと分離されており、デザインはスタイルシートを独自に使用しています。
LG3D では文字を扱うという場合は必然的にテクスチャを使用しなければいけないのですが、テクスチャの利用にもコツがいります。
静的で書きかわらないテクスチャであれば TextureLoader クラスを使用するのが便利なのですが、アニメーションなどで動的に変化するテクスチャには TextureLoader は不向きです。Ibrik ではそこらへんもちゃんとやってくれるので、ユーザは気にする必要はないとのこと。
また、3D のモデルローダとして、ObjectFile フォーマットを扱っているようです。ObjectFile はテキストファイルなので、簡単なモデルであれば手で書けるという強みもあります ^^;;
最後に川原さんからぜひとも Incubator で公開してもらいたいというと、西本さんは快諾してくださったので、もうすぐ公開されると思います。
発表資料: Ibrik Presentation Toolkit
4 人のプレゼンはおもしろく、かつ技術的にも参考になる点が多々あったのですが、はじめに歌を歌ったりしてしまったせいで時間がおしてしまい、会場から質問などをうける時間がなくなってしまいました。最後に Puzzlers であまったボールを川原さんのサインボールとして再利用して、会場で投げておしまい。
kyuka さんの blog の最後の写真はこのサインボールを取ろうとしている人たちの写真なのでした。
会場が狭かったいうこともありますが、最後まで立ち見状態。とても盛況に終えることができました。立ち見だった人ごめんなさい。また、質問しようと思ってもできなかった方ごめんなさい。今後もこのような企画をいろいろ考えていくつもりなので、よろしくお願いします。
今回はほとんどパビリオンにいく暇がなかったのですが、今日すこしだけぶらついてみました。
入るとすぐに火あぶりの刑に処せられている Duke が... うそです、誕生日のケーキの上にいるだけです。
その向かい側に Java の 10 年の歴史がパネルになっていました。去年の SF と同じように勝手に来場者が書きこめる紙が置いてありましたが、あまり書きこんでいる人はいないですね。それにしてもこのパネルは撮るのが難しい。
最後の写真は LG3D の BOF が終わった後、パビリオンの上を通りかかったとき撮ったものです。祭りの後はなんとなく寂寥感を感じてしまいます。
LG3D の BOF の後、そのまま打ち上げになだれこみました。総勢 22 人。国際フォーラムの地下にある宝。
参加された方には Programing Puzzlers に出場されていた遠藤さんとおだはらさんや Night for Java Technology に出場されていた西本さん、井上さん、福田さんも。もちろん、川原さんや安藤さん、藤槻さんなども参加されています。女性が 3 人もいらっしゃるのがすごいかもしれない ^^;;
こういう機会も利用して、少しでも LG3D のコミュニティが育っていく力になればと感じています。
(Nov. 2005)