JavaOne 2002 Japanに行ってきた

初めてJavaOneに参加できました。忘れないうちにメモメモ

ヒット



JavaOne概要

 JavaOneは、Javaを使う開発者を集めた会議であり、年1回アメリカで開催されているが、昨年から日本でも開催されるようになった。内容は、各種技術セッションとBOF、基調講演からなる。技術セッションやBOFは同一時間帯に5〜6個並んでいるので、参加者は参加したいものを1つ選ばねばならない。これがけっこう悩ましいのである。また、パビリオンと呼ばれる展示会もあり、Java関連製品について見聞きして回ることができる。他にはJavaOneグッズを販売しているショップがある。また、今年はシャープがJavaOne特別仕様のLinux搭載PDA(ザウルス)を限定発売していた。

20020925(初日)

出発

 基調講演が10:30開始である。余裕を持って1時間前につくように家を出る。何時に家をでればよいかは、駅前探検倶楽部に聞いておいた。到着時間を指定して経路検索ができるのが便利だ。
 朝出がけに、JavaOneはでかいカバンを配っていると聞いたことを思い出す。手ぶらで行った方がいいのではないか、と思いつついつものカバンを持ってでる。これがあとで裏目に・・・。

 桜木町の駅を降りてから、意外と距離がある。ちょっと早めに着いたので、途中のカフェ・クロワッサンでモーニングセットを食べる。朝にカフェで余裕の一時を持つのが最近の生活スタイルとなっている(というか単に会社に行きたくなくて朝寄り道しているだけ)。

受付と最初の基調講演

 受け付けを済ました。カバン引換、ランチ引き換え券が入っているパスフォルダである。とりあえず会場へ。同時翻訳機が椅子においてあるが、今回は英語に慣れるためにつけないことにした。隣の席に外人の女性が座った。speakerのリボンをつけていたので講演者の方だろう。発表原稿に目を通していた。勇気をもって話しかけようと思ったが、ちっちゃな勇気はすぐにどこかへ消失した。
 さて、基調講演が開始した。意外と英語が聞きとれる。ちょっと自信を持った(あとですぐに自信は崩れるが)。内容は今となってはほとんど覚えていない。スライドで「タマちゃん」もJavaOneに来た、と冗談を入れたところは覚えている。Night for Java Technologyの会場は事前には明らかにされていない。講演の中で船上で開催することついて話していた。去年はハードロックカフェで開催されたが場所が非常に狭かった。今年はクルーズ船なので大分広いだろう。
 基調講演後、出口でカバンの引き換えに並ぶ。けっこう待たされた。ここでカバンを受取ったので、今日は一日ずっとカバン2つを持ち歩くことになってしまった。別にこの時間以外でも開催期間中は引き換えることができるのだから、後で引き換えるべきであった。今回のカバンは、バックパックに簡易椅子が付いたものだ。何かのときに楽かもしれないと思いながら、パビリオン会場へ向かう。ボーランドのブースで説明員をしているJava読書会のメンバーの高橋(智)さんに会うためだ。

カバンの中身

 カバンは、簡易折りたたみ椅子&簡易保冷機能付きバックパックだ。けっこう重いのである。中にはTシャツ、ノート、ボールペン、ビー玉、Sun ONE Starter Kitが入っていた。ビー玉は、Best BOFの投票用だそうだ。

お昼とBOF

 さて、パビリオンブースに入ってボーランドを探す。入り口直ぐの場所にある。ベストポジションだ。高橋(智)さんを見つけ、ちょっと話しをした。隣のブースでかわいい系の時計をノベルティグッズとして配っていることを教えてもらう。こうしたグッズは嫁さんへのお土産としてGetするに限るので、アンケートを記入して時計をもらう。
 その後、ランチ引き換え券でお弁当に引き換えて、目指すランチBOF"Powerful BOF for Server side Java technology"会場へ入る。ちょっと遅かったため、すでに立見状態。弁当片手に立見も辛いので、ここはあきらめて他のBOFを探すことにした。カバン2つがここで苦痛となる。弁当片手に、カバン2つを双方の肩に、うろうろ。途中、石原さんとすれ違った。大活躍の様子。さて、すいてそうなiモード+JavaのBOFに入る。ここはホールCで展示会場の隣。ちょっと殺風景だし薄暗いし、となんか感じ悪し。後ろの端っこに座って弁当を食べる。ランチは、弁当と紙パックのお茶である。弁当はいわゆる幕の内弁当だ。iモードのアプリの10KB制限、30KB制限は、ダウンロード速度(9600bps)から決めた値だと言っていたことだけ記憶に残っている。

セッション

TS-1016 J2SE 1.4のリリースおよび将来構想(Joshua Bloch)

 13:00〜13:50の午後の最初のセッションはこれを選択。同じ時間帯にある他のセッションは、J2EE、Mac OS XのJava、Webサービス開発パック、J2MEだ。組み込み(携帯電話)からエンタープライズまでが揃っている。
 Joshuaさんも英語が分かりやすかった。ゆっくり話しているようだ。assertionを力をいれて説明していた。assertionはたしかに良い機能だと思う。コンパイルオプションに付ける記号'-'のことを「ダッシュ」と発音していた。以下はめぼしい内容のメモ。

Merlin(J2SE 1.4)
64bitサポート、パフォーマンス改善、アサーションはノーコスト、ノーコンパイル、New I/O、既存I/Oは分かりやすくよく抽象化されているが大量のI/Oに対してパフォーマンスの難あり、正規表現はString/StreamTokenizerに代わる、ロギング、コレクション追加(LinkedHashMap/Set)、IPv6アドレッシング、w3c URIは旧URLの混乱を回避、GSS APIのケルベロスはOSの機能に委ねることとPureJavaの実装を使うのと2種類あり、JDBC3.0、CORBA POAとCosNaming、GUIはAPIを変えずに再構築しパフォーマンス改善、リモートXに良い(bitmap転送を減らし、Xコマンドを多用)、プラガブルImage I/O、ヘッドレスGUI、フォーカス管理を再記述、ホイールマウス、Windowsのファイルチューザ改善、JSpinner、JProgressBar、JTabbedPane、IEの<applet>タグに対応したPlug-in、Java Web Start
Hopper(J2SE 1.4.1)
バグフィックス(2000以上)、速く良いMerlin、JavaWebStart1.2、デッドロック検出ツール(?)
Mentis(J2SE1.4.2)
2003中ごろ
Tiger(J2SE1.5)
Generics、Autoboxing of primitive types、Enumerated types、importing constants、"foreach"、Metadata、メモリモデルの整理、JMX(CIM/WBEM, SNMP)、JVM監視・管理API、JVMプロファイリング、新たなファイルシステム、"printf"、非同期I/O、JAXP/JAXB/JAX-RPC/XML DSIG/XML Encryption、Concurrency Utility Classes、Application Isolation API、javacコンパイラAPI、BigDecimalに浮動小数、Unicode3.1(サロゲート)、フルIPv6、JDBC RowSet

 日経バイト2002年10月号特集1「プログラミング言語の明日」の中で「Javaの知られざる欠陥」で取り上げられていた問題点のうち2つが、GenericsとAutoboxingによってTigerで改善されることになる。(他の「知られざる欠陥」はプリミティブ型の存在そのものと多重継承)
 セッション終了後、現在開催しているJava読書会で「Effective Java」を読んでいることをJoshua Bloch氏に話しかけてみた。日本に滞在中に読書会メンバーと会う時間取れるか聞いてみたらOKとのこと、名刺を貰った。さて、どうなるか。
 後ろに2人ほどBloch博士(貰った名刺見たらPh.D.が付いていた。博士なんですね)に質問したくて並んでいたのでゆずったら、最初の1人に「英語できないので質問をして欲しい」と頼まれた。げげっ、と思いつつ断れずに通訳したけど、多分こんなにひどい通訳は他にはいないだろうなぁ、という出来だった。ごめんなさいね。さて、お役ごめんかと思いきや、2番目の人にも「僕も・・・」と言われた。うげげ、ぜんぜんしゃべれんのにぃ、超ブロークン英語で頑張って通訳。質問した方にもJoshuaさんにもごめんねぇ。

TS-1026 Jiniの設計原理(Michael Warres)

 14:00〜14:50はJiniを選択。この時間帯の他のセッションは、SOAP、J2SEセキュリティ、Java Server Faces、J2EEと.NET。
 セッションが既に始まっているので、急いで移動。こちらは会場がAnnexと呼ばれる場所で、きれいなブースだ。すでに開始途中だったので、ついていくのに時間がかかった。やや早口で聞き取りにくい。うーん、やっぱり英語はできないんだな。ここで自信が揺らぐ。(というか既に先のぼろぼろ通訳で崩壊していたが)。Jiniは簡単にいうと、分散したソフトウェア・コンポーネント同士を連携させる方法である。その際ネットワークには障害が付きものという前提で構築する点が特色。以下メモ。
 人は名前でサービスを判別、プログラムは型でサービスを判別、人とプログラムを混同しないように、とのこと。サブクラスで旧いクライアントもOK、とバージョンについて説明していた。(ような気がする)

TS-1110 Javaプラットフォーム用の新しい入出力API(Neal Gafter)

 15:00〜15:50はこれを選択。この時間帯の他のセッションは、JXTA、フレームワーク開発、Sun ONE、Servlet2.4とJSP2.0、エンドツーエンド。
 非常に早口、眠気もmax、辛かった。Channel、Buffer、FileChannel、説明も早かったので、メモはほとんど取れず。一部だけメモ。ヒープの外にバッファを取れるのでGCでコピーされない、かなり性能は向上している。(既存のI/Oの3倍位)

TS-1021 Java Web Start(Stanley Ho)

 16:00〜16:50はこれを選択。この時間帯の他のセッションは、Java Card2.2、J2EE、JCP、Standard Tag Library、Webサービスのネイティブコードへのバインディング。
 講演者はアジア系の方。割とゆっくりしゃべっていたので先程よりは聞きやすいが独特のアクセントがあった。以下メモ。
 リッチWebクライアントのための分散と自動更新。アプレットならPlug-inだがスタンドアロンアプリならJavaWebStart。シングルクリックインストール、透過的な更新、セキュア、どこへでもアクセス可、サーバへは一回インストールするだけ(クロスプラットフォーム)、HTTPでダウンロード、JARでパッケージ、JARDiffで差分更新、Sandboxを拡張したセキュリティ、複数のJREに対応。JNLPファイルにはリソース(JAR)の絶対URLを記述しなくてはならないがJNLPDownloadServletを使うと回避できるし、バージョンの違いによってJARDiffを作成させることもできる。ヘルプを分離して必要なときにダウンロードするような分割ができる。

TS-1017 JFC/Swing APIによる高性能GUI(Steve Wilson)

 17:00〜17:50のセッションは、2つ候補があってどちらを受講するか迷った。「継承に対する考え方」か「JFC/Swingによる高性能GUI」かだ。前者は、"Open Close Principle"、"Liskov Substitution principle"と非常に興味深いテーマを取り上げている。しかしここでは後者を選ぶ。高性能という言葉に惹かれたのであった。これ以外のこの時間帯のセッションは、NetBeans、コンポーネント・ベース開発、CMP2.0。
 目次がどこかで見たような・・・、そうだ、「Javaプラットフォームパフォーマンス」と同じではないか!内容もそうであった。もしかすると、同書籍の著者かもしれない。(そうでした)。しまった、前日どのセッションを受けるか調べていたのに気付かなかった(気付いたら本を持っていってサインお願いしたのに)。同書籍に載っていないことのメモ
 プロトタイプセル(1.4 New)、Common beans event handlerパターン(java.beans.EventHandler)、JDK1.4のVolatileImage、1.4ではハードウェア・アクセラレートはデフォルトでディセーブル。

基調講演・レセプション・BOF

夕方の基調講演

 さて、18:00〜19:30は夕方の基調講演だ。パビリオンのボーランドブースで智宏さんと落ち合う、読書会メンバーの村山さんもいた。3人で基調講演会場へ向かった。村山さんはAlumniだった。村山さんに続いて会場に入ったら、係のお姉さんに前の方の席を指差された。座ってから気付いたがAlumni専用だ。まあ、そのまま座して講演を聴く。ステージに近いのでラッキーだった。
 内容は、Javaの全体像とそれぞれのロードマップについてであった。Java2ME関係を良く知らなかったので、説明が大いに役立った。

レセプション

 19:30からは3人でレセプション会場に行く。飲み食いできると聞いていたので、まずはそちらに。BOFへ参加という手もあるけど、やっぱり飲まねば食わねば。レセプション会場で、読書会メンバーの宮本さん、瀬山さん、 Javaごはんメンバーの次家さんと会った。次家さんによると、今年のJavaOneはひどい、とのこと。今年初参加なので比較はできないが、、、。JavaクイズがはじまってしばらくしてからBOFの時間になったので移動。Javaクイズの方は、「PetStoreに売っている動物は?」なんてものが出たりした。(その後のクイズはもっとディープなものだったそうな)

BOF-1224 Jini技術の実システムへの応用

 20:30からのBOFも候補がいくつかあった。Jini技術の応用、浅海さんと村田さんによるXMLとRelaxer、Ja-Jakarta、高木さんのセキュリティ。ここはJiniでしょ、とJiniへ向かった。
 並んでいたときに、Javaごはんメンバーの倉岡さんに会う。沖電気のC-NetLiaisonと4D Networksの4D Pocketが紹介された。また、Jiniの動向についても触れられ、今Jiniがどうなっているかがうかがい知れた。Jiniは当初デバイス用として売り込まれていたけど、今回の例はどちらかというとインターネットサーバとクライアントを結ぶところに使われている。RMIべったりの実装となっていたり、RMIにセキュリティがないことやWebとの親和性が薄いことなどが弱点として上がったが、現在開発されている次のJini(Davisプロジェクト)では解消されるそうだ。4D Pocketのデモは今回が初めてだったので、興味深いものがあった。

 BOFセッションが終わったのが21:30過ぎ、ほぼ12時間滞在したことになる。その間ほとんど休む間もなく、JavaOneは非常に盛りだくさんなことを実感しました。

帰宅と翌日の準備

 自宅へ戻ってから、Joshua Bloch博士へのE-mail、読書会への緊急開催通知、今日の内容をWeb化したり、また明日のセッション計画を練ったらあっというまに午前3時、とりあえず寝る。


20020926(二日目)

出発

 いよいよ二日目である。寝不足もあり、寝起き悪し。朝食はベーコンエッグとごはん。9時半からなので、余裕をちょっと見て家を出る。例によってカフェに寄る。今日はランドマークタワー内のタリーズ。熱い珈琲を飲みながら今日のセッションをチェック。

午前のセッション

TS-1009 仮想マシンのモニタリング(Brian Doherty)

 ProfilingとMonitoringと2つの測定があり、前者は開発中に、後者は運用中に実施する。Monitoringツールには、ネットワーク管理システム、OSのモニタリングツール、JVMモニタリングツール、J2EEモニタリングツールがある。モニタ対象はアプリケーション、アプリケーションサーバ、JVM、OS、ハードウェアとに階層化される。OS階層のモニタリングツールをいくつか紹介(Solaris OSの例)。

prstat/top
ホットプロセス、メモリホグ、LWP数をモニタする。
prstat -p <pid> -L  ホットスレッドをモニタ
prstat -[L]m      ページフォールトタイムとusr/sysタイム
vmstat
メモリのボトルネック(ページング、スワップ)、CPUボトルネックをモニタする。
mpstat
個々のプロセスについて、usr/sys/idleタイム、システムコールレート、インタラプトレート、仮想メモリのフォールト、同期、CPUバランス、スケーラビリティをモニタする。
iostat
ディスクのボトルネックをモニタする。
ディスク使用率、スループット、遅延
netstat
パケット、エラー、コリジョン
pmap
Setsize?
pstack
プロセスのスタック、ループ、ブロックなどの活動をモニタする。
c++filt(Sun ONE Studioのツール)でC++名のデマングル化ができる
truss
プロセスの外部コールをモニタする。
truss -p <pid> -C   システムコール
truss -p <pid> -S ...  指定したシステムコール
truss -p <pid> -u ...  共有ライブラリに対するコール
kstat
カーネル、ドライバ。複雑なツール。

次にJVMのモニタリングツールを紹介。JVMのモニタリングには、java起動時のコマンドラインオプションで指定するものと外部ツールとがある。以下メモ。
コマンドラインオプション
-verbose:gc
-Xloggc:<ファイル名>
-XX:+PrintGCDetails         GC前後のヒープサイズ・GC時間をプリント
-XX:+PrintTenuringDistribution  若い世代のオブジェクトの分配等
-verbose:class
-XX:+PrintCompilation        コンパイル対象メソッド、コンパイル失敗をプリント
ツール
jvmstat 動的にアタッチ、リモートも可。
VisualGC jvmstatのサブセットをGUI表示

参照URL http://java.sun.com/docs/performance

TS1019 J2SEネットワーキング(Ram Marti)

 10:30〜11:20のセッションは3つの候補があった。CVM、J2SEネットワーク、アプリケーションサーバのパフォーマンスチューニング。やっぱり一番聞きたいところを選んだ。JDK1.4以降の新しい機能についての説明。

IPv6対応
RFC2373/2553/2732/2893。Solaris8/9、Linux対応。Windowsは今後対応予定。Inet4AddressとInet6Addressクラスが追加された。アプリから見るとv4/v6は透過的
Unconnected Sockets
オプションをバインド前に指定可、タイムアウト指定可、SocketAddress、InetSocketAddressクラスが追加
URI
RFC2396、2732?
NetworkInterface
eth0やhme0のように列挙できる
URLコネクション
FTP:putできる。PASVモード追加
HTTP:エラーストリーム、ダイジェスト認証
SOCKS:TCPクライアントのみ対応、SOCKS v4/v5
NameService
デフォルトはInetAddress、システムプロパティで選択可
JSSE
SSL/TSLが可能。https
TCPウィンドウサイズ
ネゴシエーション、64KB超、ICMPのPort unreachableハンドリング
JDK1.4.1で追加
HTTPパーシステントコネクション
JDK1.4.2で追加予定
NTLM authentication (Windows)
将来
HTTP timeout、パイプラインリクエスト、クッキー、プロキシ、chuncked request、ICMPサポート、IPv6 QoS、PING相当の機能

TS-1125 Webサービス用のリッチクライアント(Hans Muller)

 11:30〜12:20のセッションは、是非これ!というものがなく、候補として「Webサービス用のリッチクライアント」と「EJB仕様によるアプリケーションフレームワーク設計」の2つを挙げていた。GUIに興味があるので、前者を選ぶ。

 Webサービスにおけるクライアント:Desktop、PDA、携帯電話。携帯情報端末はリソースが小さいので、サーバへ機能を移す。一方Desktopはオーサリング、他ユーザとの協調作業、直接操作、リアルタイムレスポンス等サーバ負荷をクライアントへ移す。BigPDAはJ2SE(例:iPAQにSavaJe)かPersonalJavaが動作する。PDAでは、通信が途切れる状態があるので、通信はステートレス、キャッシュを活用する。

TS-1018 プログラミング・パズラ(Joshua Bloch、Neal Gafter)

 12:30〜13:20のセッション。ランチBOFの「スピード狂大集合」も面白そうであるが、パズラを選ぶ。ランチ引き換え券でお弁当を取ってセッション会場へ入る。このセッションでは、Joshuaさん、Nealさんがそろってつなぎの服(ジャンプスーツ)を着て登場する。
 パズルは、ごく簡単なJavaのソースコードを見て、それがどう実行されるかを選択する問題である。4人の回答者が壇上で回答し、正解するとDuke人形を1つもらえる。10問終わった時点で最もDuke人形が並んでいる回答者がチャンピオンになる。例えば、

public class Trivial {
  public static void main(String[] args) {
    System.out.print("H" + "a");
    System.out.print('H' + 'a');
  }
}

これを実行すると次のどれになるか?
(a) HaHa (b) Ha (c) どちらでもない

といったパズルがありました。回答者が回答を提示した後に正しい回答、コードをどう修正するか、そして教訓が示される。なかなか正解するのは大変だった。

昼の基調講演

 13:30〜15:00まで、基調講演。GoslingのTシャツパチンコ投擲を初めてLiveで見た。意外と距離が出るんだなと変な感心をした。KDDIと富士通の講演はほとんど聴いていなかった。Goslingの講演中、三菱電機によるカーナビのデモがあった。デモ終了後Goslingの講演が継続したが、カーナビの音声ナビが発声し続けてうるさかったのが妙に記憶に残っている。

午後のセッション(1)

 午後は是非聞きたい!というセッションが少なく、選択に苦慮した。

TS-1043 J2MEのPersonal ProfileとPersonal Basis Profile(Chihiro Saito)

 15:10〜16:00のセッションは、この「J2ME Personal/Personal Basis Profile」、「Java Plug-in上級トピック」、「XML Based RPC」の3つを候補にした。まあ聞いてもいいかなってレベルの3択だ。仕事上でJavaではないがPDAを扱っているので、ここはPDAに関係しそうなJ2MEを選択した。
 PDA用のJavaとしては、現在PersonalJava 3.1が2000.3に出ているが、これはJDK1.1ベースであり、今後はJava 2ベースのJ2ME Personal Profile/Personal Basis Profileへ移行する。J2MEは何たらプロファイルとか、なんたらコンフィグレーションというのがたくさんあって分かりにくい。

PersonalJava 3.1 Application Environment
2000.3リリース。Appletをサポートし、オプションでJSSE、RMI、JDBCが使える。フットプリントは〜2.5MB。
3.1って数は聞いたことがないと思ったら、PersonalJavaの仕様が1.2aで、参照実装のバージョンが3.1であった。参照実装は、Java Community Source Licenseを通してソースとしてSolaris/Windows版が入手できる。
CDC
コアAPIとJVM周りを決めたもの。ターゲットとして2MB〜のメモリ、ネットワークを前提としている。Java 2 VMのフル機能を持つ。
Foundation Profile
java.lang, java.util, java.net, java.io, java.text, java.security, javax.microedition.ioを持つ。J2SE1.3のサブセット。
Personal Profile
Applet、AWT、JavaBeansがある。主にPersonalJavaからの移行。
Personal Basis Profile
Personal Profileのサブセット。AWTはヘビーウィジェットを持たない等サブセット化されている。ヘビーウィジェットを持たないので、単純なトップレベルのFrameが提供される。また、αブレンディング、BufferedImageを追加している。また、独自のアプリケーションモデルであるXletを提供。XletはUIがなくてもよいAppletのようなモノ。
事例
ロイター、コンパック、サンでPocket Traderのプロトタイプ開発。

パビリオンめぐり

 16:00からのセッションに聞きたいものがなかったので、空いた時間でパビリオンを見て回ることにした。
 まず入り口でDukeの着ぐるみと出くわした。ここでDukeと一緒に写真をとる。
 次にスタンプラリーを開始。スタンプラリーはパビリオン内10個の場所でスタンプを押してもらうと、書籍「Java 2 Platform, Enterprise Edition アプリケーション設計ガイド 第2版」がもらえるという企画。J2EEは仕事でやることにでもならない限り手をだそうとは思わないので、自腹で本を買うことはなかった。ただならgetしようということである。とりあえずあちこちはんこをもらいに回って本をGet。スタンプをもらって回るときに各ブースでいろいろもらった。Tシャツ、携帯ストラップなど。SunのところでForte C++の話しを聞いたらForte Developer7のCD-ROMをもらった。試用版かな?
 さて、時間が空いたので、会場をうろうろ、AppleのブースでWebObjectの説明を聞く。簡単にささっとDBを使ったプログラムが出来上がる(書く/作るという言葉ではなく)のがなぜかちょっとだけ理解できた。
 書籍コーナーを回ってみたが、24日発売のJava系雑誌JavaWorld/JavaDeveloperどちらも買うに至らず。エンタープライズ色が強いときは買わないのでした。

午後のセッション(2)

TS-1136 エクストリーム・プログラミングの探求(Ravi Shankar Narayanan Nair)

 17:10〜18:00のセッションはこれを選んだ。もう一つの候補は「2001:イヤー・オブ・ザ・ゲーム」だった。通り一遍なXP解説なら聴かなかっただろうが、防御的プログラミング→契約による設計→Assertときて最後にXPとなる内容であったので、前半部に興味をもっていたのでこちらにした。このセッションは非常に聴講者が多くて、席に座れない人がいたほどである。

 人に分かるコードを書く、という話題から始まった。続いてプログラミング・エラーにより起きた事故の事例をいくつか紹介(マーズ・パスファインダ、放射線治療装置、GeminiV、Y2K)、コードインスペクションでは正しさを検証できない(intのオーバーフロー、sqrtに負値などはソースコード上を見ても分からない)と展開した。
 続いて防衛的プログラミングの説明。演算には括弧をつけよ、引数をチェックせよ、要求が満たせないときはエラーコードをreturnせよ、Javaでは構造化例外が使えるので優れている、Runtime例外はキャッチしてはならない、等を論じた。この防衛的プログラミングは構造化プログラミングには有効だが、OOには向かない、なぜならOOはメソッドが細分化するので防衛的プログラミングのコードが増し、メンテナンス・パフォーマンスが低下するから。
 契約による設計(DBC)の説明。
 J2SE 1.4から導入されたassertの説明。「プログラムから全てのprint文を取り除き、assertに置き換えよ」とちょっと極端なスローガンを提唱。これは、デバッグのためにprint文を入れるなら、代わりにassetにせよということ。
 事前条件には、(1)Object State、(2)Arguments、事後条件には(3)Side Effect、(4)Returnがある。例えばスタックのpop()の場合、(1)size>0、(2)none、(3)size--、(4)top object となる。
 OCLについて簡単に紹介。「設計者のための言語で、プログラマの言語ではない。only expression」
 XPについては概要を説明していた。

Night for the Java Technology

乗船前

Image of Java-Night's ship

 そう、今年の会場はクルーザーなのです。

 結構疲れてきたこともあり、また聴きたいというセッションもなかったので、ちょっと早いがNight for the Java Technology(JavaNight)に向かうことにした。早すぎたらどっかカフェに寄ろうと思っていたが、途中Javaごはんの倉岡さんとすれ違ったときに、招待券がないと乗れないかもとのことなのでまっすぐ集合場所へ向かうことにした。

Photo with Duke at JavaNight waiting place

 会場では、ボランティアスタッフ藤井さんを発見。続いてボランティアスタッフDuke班写真担当の安藤利和さんと着ぐるみDuke(中には渡辺がいます)がいました。写真を撮ったりした後、Duke人形にはファンがついているのを見つけた。着ぐるみもランクアップしたんだね。ボーランドの集団の中に智宏さん発見。ボーランドはとんでもない賞品を用意しているとだけ聞いていたので、何だろうか気になる。
 そんなこんなしているとき、整理券がどうのこうのと言っている人がいた。やっぱり招待券がいるのかな。キーノートでチケットをゴールドスポンサーのブースへ行って貰えと言っていたことを思い出す。うーん、必要ならどこかに書いてあればいいのに。。。とりあえず整理券を貰う。101番でした。

Photo with Ravi, speaker of Extreme Programming session

 当面することがないのでロビーをうろうろして知り合いがいないか探してみた。夕方のセッション(エクストリーム・プログラミングの探求)のスピーカであるRavi Shankar Narayanan Nairさんがひとりでいるのを見かけた。ちょっと聞きたいこともあって話しかけてみた。Sunはassertionのドキュメントで、publicなメソッドの事前条件には、assertではなくランタイム例外を使うように書かれている。Raviさんはすべてassertを使うといっていたがどう思うか質問してみた。答えは、assertでよい、assertがdisableになるのは運用時であり、assertは開発時に使うものだ、もし運用時にもチェックしたいならlogging APIを使ってログに残すべきだ、とのこと。
 その後、読書会の村山さんが合流。待ち時間のあいだ、しばらく雑談をしていた。Raviさんはシンガポールのソフトウェア会社に勤めており、と乗船が開始になった。3人で並んで進むが、気が付くと村山さんがいない。結局その日は会えずじまいだったが、翌日聞いたところ、乗船は整理券の順に行っており、整理券の番号が後の番だったため入れなかったとのこと。僕も整理券で番号が遅かったが、とくにチェックされなかった。Raviさんも招待券を持っていなかったようだし。招待券を事前に入手しないといけないのかConferenceバッジがあればよいのか、良く分からずじまい。 

乗船

 乗船後、入り口で袋とおにぎりを受け取る。袋にはTシャツ、JavaOne缶ビール、振ると音が鳴る棒(何と呼べばよいのか・・・)、デモのアジェンダ等が入っている。おにぎりは、海苔の外側に梅干がおかれた、ちょっと形の悪いもの。これは後で知ったことだが、Dukeを表していたんだそうな。気付かなかった。階段を上ろうとするが、前がつかえている。入り口と同じデッキの奥に誘導される。中は椅子とテーブルがきちんとある船室だった。部屋の隅にモニタが置かれている。なるほど、メイン会場の様子を各船室にこうやって上映するのか。とりあえず、Raviさんと窓側の席に座る。そのときXP MLの山野さんから声をかけられた。Raviさんに彼はmore XPerだと紹介し、3人で飲み食いした。

 さて、しばらくの歓談の後、イベントが開始した。座った席は部屋のちょうどモニタのある舷と反対側だったので角度的に辛い。そこでメイン会場にあがることにした。メイン会場も居場所がなく、通路際に立って見る状態となった。デモ舞台の正面にJames Goslingさんが座っており、その後ろのテーブルには、John GageさんとRob Gingellさんも座っている。今年のJavaNightはJavaOneのメインイベントの1つになった感がある。この3人は右の写真に写っているけれど後ろ姿でわかりにくいかも。また、この写真を撮った場所の横には、Joshua BlochさんとNeal Gafterさんも座っていた。

デモ

 今回は15組のデモが行われた。デモは各5分の持ち時間で行われる。デモ舞台の横には、右の写真のように持ち時間の残りを示すカウントダウンが表示されている。これがゼロになると時間切れでデモが強制終了になる。残り10秒になると、観客がカウントダウンの声をあげる。
 デモが終わると、結果発表となるが、今年は4つのスポンサーからApple賞、Borland賞、京セラ賞、コバルト賞(Sun)の4つが用意されている。賞品はそれぞれiBook、JBuilder Enterprise4カ国語の各パッケージ、京セラのJava PDA、Sun Cobaltである。
 デモが開始された。マイクの使い方か声が小さいか、何をしゃべっているのかよく聞こえないデモがいくつかあった。観客としては最初の10秒くらいでデモを見るのを止めてしまうこともあるので、非常にもったいない。また、説明中心で盛り上がりの足りないデモだとそれでデモへの注目がそれてしまう。飲み食い歓談している中のデモというのは非常に難しく、ソフトウェアそのものの出来よりも、どれだけうまくアピールできたかが受賞のポイントになると思う。
 今回の会場はクルーズ船なので、夜8時半になると桟橋を離れ沖合いをクルーズする。戻ってくるのが10時頃になるので、時間がない人は8時半で下船していった。Raviもここで下船。ホテルへ奥さんが独り残っているのを気にしていたのでした。

 今回サン・コバルト賞を受賞したjFDは、昔DOSで有名なFDというファイル管理ツールをSwingで作ったもの。あえて地味ながらJavaならではのネットワーク対応や選択したファイルがMovieやサウンドであっても実行してしまうなどの特徴がある。しかし、受賞のポイントは、ノスタルジックな点にあったのではなかろうか。

受賞

 受賞した作品と賞品は以下のとおり。

Apple賞(iBook)
"TaQQ(Ping-Pong)" by Rui Sato
Apple特別賞(iPod Mac版)
"The artificial intelligence tool which assists human in various scenes" by Keisuke Nishimoto
Borland賞(JBuilder Enterprise英語版/ドイツ語版/フランス語版/日本語版)
"DRAGRI" by Takashi Satou
京セラ賞(Pocket Cosmo)
"ColorFL" by Satoru Sugihara
サン・コバルト賞( Sun Cobalt Qube)
"jFD" by Shunji Yamamura

JavaNight関係リンク

宴の後

 JavaNightを観ていると、自分でも何か作ってみたくなる、そんな雰囲気のイベントだ。アイデアと日曜大工的な作りでも何とかなりそうなのがJavaなのかもしれないなぁ、などと思いながら下船し、家路へむかった。

帰宅と翌日の準備

 Joshua Bloch博士からのE-mailが入っていた。9/27が都合よいとのこと。明日なので、Joshuaさんと待ち合わせる時間と場所を連絡、また急遽読書会メーリングリストに開催通知を出す。こんなとき、モバイラだったら便利だなと思う。旧いが一応E-mailに対応した携帯電話があるので、連絡はとれないことはないか。
 それにしても眠い。明日のセッションの予定を立てようとするが眠気でうつらうつら、とりあえず寝ることにする。 

20020927(最終日)

出発

 JavaOneもあっという間に最終日だ。メールチェックをしてから出発。セッションの予定が立っていないので、昨日朝と同じくランドマークタワーのタリーズへ寄る。入る直前村山さんに声をかけられる。おやっ、とりあえず今日Joshuaさんと会うことになったことと待ち合わせ場所を伝えてわかれる。タリーズで珈琲を飲みながらセッションのチェック。朝1番のセッションが悩ましい。"More Effective Java"か、"Java Platform Performance"か、逆に午後後半はこれといって受けたいものがない。ざっとチェックしてからJavaOne会場へ向かう。

午前のセッション

TS-1014 Javaプラットフォームのパフォーマンス(Steve Wilson)

 9:30〜10:20のセッションはどちらを受けるか悩んだが、こちらを選択。書籍「Javaプラットフォームパフォーマンス」にサインをもらおうという理由が大きい。
 Steveさんは、冒頭日本語で挨拶をした。以降は英語だが、とても感じよい。以下内容のまとめ。
 パフォーマンス活動は、分析段階(Analysis)から始まる(ex.32MBで動作すること)。スケーラビリティは、よい設計の結果であるが、多くのプロジェクトではこれを抜かして失敗している。計ってから最適化すること。カプセル化やポリモルフィズムのオーバーヘッドは気にするな、それはボトルネックではない。アプリケーションに適したカスタムベンチマークを作って計れ、SPECjvmのようなものは、OSやJavaVMを計るだけだから。ベンチマークについては、JavaOne SF TS-1816 "How NOT to write a Microbenchmark"を参考にせよ。
 モニタは、2年前に本を書いて以降、エンタープライズ(ミッションクリティカル)へシフトしてきた結果加えた。パフォーマンスとモニタリングの開発工程は以下のとおり。運用中にモニタを行い、フィードバックをかけるものが追加された。

              Start
                V
    +------> Analysis <------+
    |           V            |
    +-----> Development <----+
    |           V            |
    +--------> Code <--------+
    |           V            |
    |        Benchmark       |
    |           V            |
    |      Performance  N    |
    |          OK?   ----> Profile
    |           V   Yes
  Monitor <-- Deploy

 モニタ・ツールは、運用中に使用される。プロファイルのような深い調査は行わない。モニタ対象は、ハードウェア・ネットワーク、OS、JVM、アプリケーションサーバの階層である。例えば、Disk Utilization/Timeが100%ならディスクI/O待ちが多いので、いくらプログラムコードをいじっても意味がない。この場合は、ディスクを換装することになる。

 大規模システムにおけるパフォーマンスについては、JavaOne SFのTS-2008/TS-1073を参照せよ。

 セッション終了後、、本を持ってサインを依頼したら快く書いてくれた。

TS-1010 Java HotSpot仮想マシンの自動メモリ管理(Brian Doherty)

 10:30〜11:20は、これを選択。もうひとつ興味を引いていたのはTS-1107 動的なアプリケーション・アップデートのためのバージョン戦略であるが、深い話しがきけそうなこれを選択した。
 ヒープへ影響を及ぼすのは、オブジェクトのアロケーションとGCの2つである。
 AccurateGCとConservativeGCとの比較。Accurate GCは、accidental Memory leaksがないがObject movementがある。Conservativeは、不要と判断されたオブジェクトを削除するが、Accurateは不要ではないオブジェクトを別に移動させる。
 オブジェクトの参照をハンドルを介すか直接ポイントするかがある。直接ポイントする場合、Object movementが困難。
 J2SEは、mark sweep compactがデフォルトだが、incremental(またはTrain)が選択できる。1.4.1からは、concurrent mark sweepが選択できる。
 Adaptive Heapは、コマンドラインでのフラグによるチューニングを低減する。-XX:UseAdaptiveSizePolicy(1.4.1では若い世代の生き残りスペースのみ)
 finalize()を使うと、GCの性能が劣化する。

TS-1023 高度なJavaテクノロジー対応クライアントの構築法(Hans Muller)

 11:30〜12:20は、JXTAのセッションとこれと悩み、こっちを選択。
 Swingを用いるクライアントとしてはオーサリング、コラボレーション、リッチなダイナミックスがいるものなど。適用先は、SEツール(ex.NetBeans/JBuilder/Oracle/BEA WebLogicWorkshop/Autodesk Architectural Studio)、一般ツール(ex.Limeware/Philips Match cast/Tejina)、科学(ex.ゲノム解析表示)。セッションのデモとして家具の部屋への配置をデザインする"Duke Design"を見せる。
 国際化:リソースバンドルにオブジェクトを記述する。通貨はjava.util.Currencyクラスが新登場。
 起動時:すぐに何かを表示する(Splash Screen)。Lazily load parts of applicaiton(一つWindowを出してスレッドを起こす)。JTabbedPaneを使うのもある。tabタイトルにHTML使える。最初にtabがVisibleになったときにオブジェクト生成。リスナークラスは使わずにEventHandlerクラスを使う(クラスロード数削減)。
 Drag & Drop:JComponentのtransfer handle属性をセットしてdropをハンドルする。

myComponent.setTransferHandler(new HandleTextDrop());
class HandleTextDrop extends TransferHandler {
  boolean canImport(..) {..} // オーバーライドする
  boolean importData(..) {..} // オーバーライドする
  Transferable createTransferable(..) {..} // オーバーライドする
    :
}

 Dragは、exportAsDragを呼んで開始。ドラッグ中に半透明の画像表示をさせるとよい。GlassPaneに画像を表示する。フェードイン/アウトもGlasasPaneを使う。

お昼とBOF

BOF-1252 続プログラミング・パズラ-(Joshua Bloch, Neal Gafter)

 12:30から13:20は、ランチタイムBOFのひとつ、続プログラミング・パズラ-を聴く。お弁当を引き換えに向かう途中、既にこのBOFの列が長くなっていた。列の途中に読書会のメンバーの伊藤さんがいたので声をかけた。今日、Joshuaさんと読書会メンバで集まることと場所を告げる。
 さて、弁当を受け取って列の後ろに並び、会場に入る。弁当は幕の内弁当のおかずが中華風になったようなもの。時間になって、壇上にパズル回答者が並んだが、そのうちの一人が先程の伊藤さんであった。おっ、と驚いた。いよいよ課題の1問目が開始。昨日の「プログラミング・パズラ-」より難易度が高くなったようだ。new Random().nextInt()は常に同じ値を返す、オーバーライドしたかに見えるオーバーロード、staticの初期化順序、String(byte[] b)はデフォルトロケールで変換される、サブクラスのコンストラクタはサブクラスのフィールドを初期化する前にsuper()を呼ぶ、コメント中にユニコード・エスケープを使うときの問題(コメント中に\u000aを入れたら)、式中に++iを使ったときに式が例外を起こした場合、、、など。教訓で「オーバーライドするときは、宣言をコピー&ペーストせよ。これは唯一コピー&ペーストが許される場合である」なんておもわずにんまりするものもあった。
 BOF終了後、Joshuaさんに今晩の確認を取る。Nealさんも来るとのこと。すばらしい。

基調講演

 ランチBOF終了後、Joshuaさんに確認をとってたりしたので遅れて会場に入る。
 昨晩のJava Nightの受賞者4人の紹介、Best of BOF賞として「プログラミング・パズラ-」が紹介された。

午後のセッション(1)

 午後は、聞きたいセッションがあまりないので何を選ぶか決めずらい。

TS-1031 J2EEについてのチュートリアル(Inderjeet Singh)

 15:10〜16:00は悩んだ末にこれを選ぶ。普段J2EEには手を出していないので、チュートリアルを聴いてちょっとでも理解できればと思った。
 J2EEは、エンタープライズ向けアプリケーションを、コンポーネントベースで開発するもの。コンポーネントとは、EJB、Servlet、JSPなど。コンポーネントはコンテナの中に"deploy"される。また、コンポーネントはモジュールへパックされる。EJB JAR、EARなど。コンテナは、コンポーネントのライフサイクル管理、並列実行管理などを行う。EJBコンテナ、Servletコンテナなど。また、セキュリティ、トランザクション、などの標準サービスが用意されている。
 サンプルとして、”Duke's Bank"を紹介。Webベースクライアントで口座履歴、入金、引き出し、振り替えができる。開発としては、クライアント開発者、EJB開発者がいる。
 ビーンの種類:セッションビーンは単一野クライアントを表す。クライアントの論理表現、ステートなし(永続でない)。エンティティビーンはデータベースを表す。しばしばテーブルのRawを表す。メッセージビーンはJMS呼び出し、メッセージをリスンしている。ビーンの開発は、コードの実装と、ホームインタフェース、リモートインタフェース、配置記述を作成する。クライアントは、ルックアップ→クリエート→ビジネスの流れ。セキュリティは、宣言的に記述、IDの認証、権限によるアクセス制限。

TS-1119 J2EE最新のリファレンス実装(Tony Ng)

 16:10〜17:00は、前の時間の続きでJ2EEものを聴くことにした。
 J2EE1.4で、Webサービス、ツールサポート、その他向上が加わった。WebサービスはJAX-RPC(WSDL、SOAP1.1)、Webサービス仕様(JSR-109)、JAXR、JAXP1.2(XMLスキーマ対応)。配置記述がDTDからXMLスキーマに変わった。

パビリオンめぐり

 17:00〜18:00はパビリオンめぐり。
 書籍コーナーで24日発売のJava World、Java Developerをパラパラ見るが、買いたいほどの記事がない。オライリーのところで「Java国際化プログラミング」が売られていた。国際化機能はまとまった情報が少なかったので購入。おまけにオライリーの布袋がついている。
 オープンテクノロジー社のブースがあるのを見つける。Javaで記述されたオープンソースのUMLツールIIOSSのメンテナンスをしている会社だ。説明員に具志堅さんが立っている。しばし雑談。昨晩のJava Nightにいたそうな。彼は去年のJavaNightでIIOSSをデモし入賞している。Java Oneに合わせて(?)IIOSSのバグフィックス版の1.2.2を公開したとのこと。IIOSSにないUndo機能について尋ねたところ、やはり予定はなさそう。IIOSSがベースにしているArgoUMLは0.8xだが、0.9xに変更するのは大変な作業らしい。

午後のセッション(2)

TS-1083 Project JXTA P2Pのセキュリティ:トランスポート層のセキュリティにおけるJavaテクノロジ・ベースのバーチャルトランスポートの実装(William Yeager)

 18:10〜19:00、いよいよJavaOne最後のセッションとなる。
 JXTA自体の話しではなく、JXTAによってノード間に「パイプ」が張られるときのセキュリティのお話し。暗号、認証系の用語がバンバン飛び出し、相当ディープなセッションだった。ついていくのが困難。勉強が足りないなぁと痛感。
 プライバシ:通信の秘匿。秘密を共有する(暗号の鍵など)。
 インテグリティ防御:データ改ざんから守る。通信のストリームの途中にデータを入れられないようにする。HMAC、ダイジェストを持つ秘密鍵。
 オーセンティケーション:公開鍵、one way v.s. Mutal authentication
 TRUST:人の評判、回覧(Webs-of-Trust)、poblano model
 オープンソースのTLSをJXTAに統合。Virtual TLS:フローコントロールが必要。


Joshuaさんとの歓談会

 インターネット協会Java研究部会のJava読書会BOFでは、2002年5月から10月にかけて月1回のペースで「Effective Java」を読む会を開催していました。同本の訳者である柴田さんも1回参加いただき、その際、著者のJoshua Bloch氏が9月に日本で開催されるJavaOneに、やって来ることを知りました。柴田さんはあらかじめJoshuaさんに日本で「Effective Java」を読んでいる読書会があることを紹介してくれていました。そこで、JavaOneでJoshuaさんに接触を図り、読書会メンバーと歓談を行うことになりました。

どんな人

Joshua Blochさん

 Sunのシニア・スタッフ・エンジニア。
 コアJavaプラットフォーム・グループの設計者。Effective Javaの著者であり、Javaコレクション・フレームワークAPI、java.mathほかの設計・実装を手がけた。Sunの前には、トランザーク社でEncinaの分散トランザクション処理などを担当。カーネギーメロン大学のコンピュータ科学の博士号を持つ。

Neal Gafterさん

 Sunのスタッフ・エンジニア。
 Javaコンパイラとツール(javac/javadoc/javah/javap)の開発者。Tiger(J2SE1.5)に導入予定のGenericsのプロトタイプJavaコンパイラも開発している。その前は、C++コンパイラ部門にいた。コンパイラ分野に長年携ってきた。ロチェスター大学のコンピュータ科学の博士号を持つ。

集合

 JavaOne最終日は最終セッションが19:00に終了するので、19:30にインターコンチネンタル・ホテル横浜のロビーで待ち合わせました。JavaOne会場にあるホテルです。今回、Effective Javaの著者であるJoshua Bloch氏と、同僚のNeal Gafter氏の2名が参加してくれることになっています。
 JavaOne会場の受付で参加メンバ(伊藤さん、門脇さん、前橋さん、村山さん、高橋(智)さん)と落ち合い、ロビーへ向いました。ロビーには、JavaOneで見かけたSunのエンジニアが何名かおりました。おそらく打ち上げ等に向うのでしょう。ここで根本さんと合流。携帯にメールで遅れて8時頃来ると1通あったので、誰だか分からないが(向こうも携帯メールだったら名前を本文に書かないと誰からか分からない)、とりあえずお店が決まったらメールをだせばよいでしょう。しばらくの後、ロビーの片隅にJoshuaさんとNealさんが来ているのに気がつきました。近寄って声をかけました。「夕食を食べたか?」と聞いたら、「未だ」との事でした。「何か特に食べたいものがあるか?」とたずねたら、「Japanese food! Sushi」との回答でした。そこで我々は寿司屋さんへ向かうことにしました。クイーンズスクエアに何軒か寿司があったので、ぞろぞろと向かいました。途中、日本は過ごしやすい気候だ、とJoshuaさんが言っていたので、9月も前半は30度を超える暑さで湿度も高いと話したら、ニューヨークに住んだことがあるので分かると言っていました。こちらが湿度で"wet"と表現したら"humidity"と返ってきました。使う単語も理系だなと思った場面でした。

寿司屋にて

 クイーンズスクエアの中の寿司屋さんに入りました。この時点で9人、8人がけにちょっと詰めて座りました。飲物を選ぶ際、Joshuaさんが日本酒通であることを発見。日本酒の銘柄をいくつも知っていたのです。飲物を注文後、こんどは食べ物を選びますが、ここでもJoshuaさんが寿司ネタに詳しいことを発見。サザエも知っていました。握りonlyの人と、握りとおつまみのコースと各自の好みで注文しました。

自己紹介

 乾杯後、Java読書会の簡単な紹介をしました。といっても難しい内容は英語で説明することができないので、月1回のペースで実施していること、今6冊目であること、過去読んだ本の紹介、について述べました。この後、Joshuaさんから順番に自己紹介を全員していきました。以下、記憶に残っている話題をメモします。
 智宏さんの自己紹介のとき、ボーランドのJavaコンパイラについてNealさんと盛り上がっていた様子だけど、内容がよく取れませんでした。Nealさんのマシンには、OSがたくさん載っているようですが、JDKのツール類の検証のためでしょうか。
 村山さんの自己紹介のとき、村山さんがJVMをやっていると聞いたNealさんからJavaプログラミング・パズラー問題が出されました。簡単なJavaソースを示され、これをJavaVMのインストラクションに変換するというものです。昔でいうとハンドアセンブルですね。問題は2次元配列に関するものです。 
 前橋さんの自己紹介のとき、前橋さんが書籍をいくつか書いていると聞いたJoshuaさんからどんな本かけっこう突っ込みを入れられました。

 自己紹介の途中、山本さんが登場。また、携帯に「Effective Java」翻訳者の柴田さんからメッセージが入ってきたので自己紹介の最後に紹介しました。

話題になったこと

 当日歓談の中で話題になったことをメモします。英語ベースで歓談が行われたので、内容の正確さについては保証の限りではありません。