初日の朝は雨がパラパラしていて、肌寒い朝です。それでも、General Session には長蛇の列が。今年は 10 周年なので、みなさん気合いが入っているのでしょうか。
そんな中、野球場のビール売りのようなコーヒのサービスが。写真にとっていいかと聞いたら、かなり照れてました ^^;;
というわけで、今日聴講したのは
General Session はメディアがとりあげますし (Enterprise Watch、IT Media、IT Pro)、星さんの blog や石原さんの blog ですでに取り上げられているので、私からいうことはほとんどないのです。
まぁ、しいていえば Blu-Ray で Java をサポートということですが、これは以前から Blu-Ray のドキュメントには書いてあったので今日発表したというものでは全然ないのです。
というわけでフォトログ風に。
ふつうの General Session の後は、いつものように Technical General Session ですが、今年は同じ枠の中でいっしょにおこなわれました。
去年の Technical General Session では J2ME の時に聴衆が大挙して大挙してしまったのがかなりいたかったのか、今年は Tim Lindholm の J2ME は別枠に追いやられてしまいました。
その代わりに、Mark Hapner が SOA について。でも、SOA の時間になったら、やはりぞろぞろと人が出てってしまっていたのでした ^;;
ところで、JavaOne のプログラムには Bill と Mark の写真が逆になっています。ちょっと笑えない。
さて、Technical での大きな発表は Java 2 の 2 が抜けるということでしょうか。Java2 SE 6.0 -> Java SE 6 です。ただし、今までのものはそのままの名前で使うそうです。
J2EE や SOA は門外漢なので、J2SE に関してだけレポートします。
まずは Tiger から。Tiger に関しては 1 点だけ。
Tiger と Mustang の間隔が短いので、5.1 はスキップしてそのまま Mustang だそうです。これからも、小数点以下のバージョンアップは基本的にはおこなわないらしいです (Update は残されます)。
予定通りなら Mustang 2006 Q3、Dolphin 2008 Q1 だそうです
次は Mustang です。
Mustang のテーマは
です。
Compatibility, Stability, Quality! はいつもの通りなのでパス。
Diagnosability, Monitoring & Management では JMX や jconsole のアップデート、そして JVM レベルのモニタリングの強化があげられました。たとえば Out of Memory のハンドリングを強化するのだそうです。
XML & Web Services では JAX-WS と JAXB がバンドルされるようになります。基本的にはクライアントがターゲットですが、ライトウェイトなサーバーもターゲットに含まれるようです。
EoD で一番はじめに言及されたのが、Scripting です。と聞くと、Groovy がバンドルか? と思いましたが、実際のは JavaScript Engine の Rhino がのるそうです。
そして、Annotation によって使いやすくなった JDBC 4.0。これには XML データのサポートも含まれているようです。さらに、Javadoc のカテゴリが増えて、大きいクラスでも Javadoc が見やすくなるということです。
The Desktop では Longhorn のサポートがうたわれました。
その他に、L&F のアップデート (Longhorn の Avalon や GTK)、OpenGL や DirectX のパイプライン処理の高速がなどがあげられています。
最後の Becoming more open は java.net でのスナップショットの公開や、"I Needs You" キャンペーンなどに言及されました。
また、ライセンスも変更があります。もうすでにオープンにされていますが、SCSL に変わって JDL が登場しました。JRL は変更なし。そして、Java Internal Use License (JIUL)。社内で使うのであれば、TCK を通さなくてもいいというライセンスです。どんどんオープンに近づいていきますね。
さて、最後にちょっとだけ Dolphin の話。
ダイレクト XMl のサポートとか、"friends" のサポートとか言及しましたが、すべて maybe がついてます^^;;
しかし、C++ の friends と同じ機能が入るとしたら、なんかイヤだなぁ。
今日聞いた中では、最後の Profiler がはずれでした。
JMX や MXBean が前半にあって、この後にすごいことを説明するのかという期待をはずして、たいしたことなく終わってしまいました。
というわけで、残りの 3 つです。
General Session でも Mustang の話がでましたが、こちらも Mustang です。
でも、ちょっと観点が違っていて、テーマごとにではなく、Mustang を構成している JSR ごとにでした。
ちなみに講演者の Mark Reinhold は JSR-270 J2SE 6.0 ("Mustang") Release Contents のスペックリードですが、かつては New I/O のスペックリードだった方です。
さて、JSR-270 はアンブレラ JSR で他のさまざまな JSR から構成されています。
| JSR-202 | Class File Update | |
| Ease-of-Development | JSR-199 | Compiler API |
| JSR-269 | Annotation Processors | |
| JSR-260 | Javadoc Tag Upadte | |
| JSR-221 | JDBC 4.0 | |
| JSR-223 | Scripting | |
| XML | JSR-105 | XML Digital Signature |
| JSR-173 | Streaming API for XML | |
| JSR-222 | JAXB 2.0 | |
| Web Services | JSR-250 | Common Annotations |
| JSR-181 | WS Metadata | |
| JSR-224 | JAX-WS 2.0 |
クラスのベリフィケーションが Java ME のように分離できるようになるそうです。
今までも Java から javac はコールできたのですが、もっと簡単にクラスを作ることができます。
たとえば、つぎのような感じです。
import javax.compiler.*;
Compiler c = Compiler.newInstance();
c.setOutputDirectory(new File("build/classes");
c.setSourcePath(new File("src"), new File("gensrc"));
c.setOption("Xlint", "all");
c.run(new File("src/Main.java"));
今までの Javadoc はカテゴリは 2 つ。つまり Field と Method だけです。しかし、これだと巨大なクラスでは見にくいというので、新しいカテゴリが導入されました。
Property と Field では何が違うかというと Setter/Getter があるのが Property だそうです。JavaBeans 的ですね。
Factory には newInstance メソッドなどが含まれます。
そして、Event には addActionListener とか removeActionListener メソッドなどが含まれます。
これらはカテゴリなので、自動的に javadoc コマンドが判別してくれるそうです。
今まで JDBC ドライバのクラスを明記して Class#forName をしていましたが、いらなくなります。単に URL と getConnection メソッドだけです。
JavaScript をプログラム中で使うことができます。こんな感じです。
import javax.script.*;
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByExtension("js");
engine.eval("pring('Hello, World!')");
@SuppressWarning というアノテーションを使用することで Warning を抑制することができます。
File#getUsableSpace というメソッドが使えるようになりました。ついでに File#getTotalSpace というメソッドも。
いまいち、使い方が分からないのですが、こんなコードが示されていました。
import javax.swcurity.auth.callback.*;
class CosoleCallbackHandler implements CallbackHandler {
public void handle(Callback[] callbacks) {
Concole cn = System.console();
for (Callback cb: callbacks) {
if (cb instanceof NameCallback) {
String nm = cn.readLine("Username: ");
((NameCallback)cb).setName(nm);
if (cb instanceof PasswardCallback) {
char[] pw = cn.readPassword("Password: ");
((PasswordCallback)cb).setPassword(pw);
}
}
}
}
たぶん、コンソールから読み込むときに readPassword メソッドを使うと ******* で表されるようになるのだと思います。
UI が新しくなり、必要に応じてアタッチできるようになったようです。また、デッドロックの検出もできるようになるらしいです。
Solaris の DTrace で Java の情報までシームレスに見れるそうです。いいなぁ。
今まで OutOfMemoryException が発生しても、どこで本当にメモリ食っているのかよく分からなかったのですが、分かるようになるらしいです。これはうれしい。
どこまで JDIC の機能が入るのかよく分かりませんが、ブラウザを起動することやシステムトレイにアイコンをおくことなどはできるようです。
XML の扱いがかなりかんたんになりそうです。こんな感じ。
void addReviewer(Element feature, String user, String time) {
feature.add(<reviewed><who>{ user }</who></reviewed>
<when>{ time }</when>
</reviewed>);
add( の後にダブルクォーテションはいらないのです。
Joshua と Neal が Google に転職してしまったので、もう Puzzler はないのかと思っていたのですが、ちゃんと彼らは JavaOne に戻ってきました。
ちなみに右の写真は奇跡的に手ぶれも被写体ぶれもなかった写真です。
今回は問題が 8 問。すべて難しいです。
ここで答えまで出してしまうのもなんなので、みなさんで考えてみてください。
問題の形式はすべて同じで、実行したときにどのように出力されるかです。すべて 4 択の問題です。
public class JoyOfHex {
public static void main(String[] args) {
System.out.println(
Long.toHexString(0x100000000L + 0xcafebabe));
}
}
選択肢
a. 1cafebabe
b. ffffffffcafebabe
c. cafebabe
d. None of above
public class AnimalFarm {
public static void main(String[] args) {
final String pig = "length: 10";
final String dog = "length: " + pig.length();
System.out.println("Animals are equal: "
+ pig == dog);
}
}
選択肢
a. Animals are equals: true
b. Animals are equals: false
c. It varies
d. None of above
public class Assignment {
public static void main(String[] args) {
int tricky= 0;
for (int i = 0; i < 3; i++) {
tricky += tricky++;
}
System.out.println(tricky);
}
}
選択肢
a. 0
b. 3
c. 14
d. None of above
public class Loop {
public static void main(String[] args) {
int[][] tests = {{6, 5, 4, 3, 2, 1},
{1, 2},
{1, 2, 3},
{1, 2, 3, 4},
{1}};
int successCount = 0;
try {
int i = 0;
while (true) {
if (thirdElementIsThree(tests[i++])) {
successCount++;
}
}
} catch (ArrayIndexOutOfBoundsException e) {}
System.out.println(successCount);
}
private static boolean thirdElementIsThree(int[] a) {
return a.length >= 3 & a[2] == 3;
}
}
選択肢
a. 0
b. 1
c. 2
d. None of above
public class Cache {
static { initIfNecessary(); }
private static int sum;
public static int getSum() {
initIfNecessary();
return sum;
}
private static boolean initialized = false;
private static synchronized void initIfNecessary() {
if (!initialized) {
for (int i = 0; i < 100; i++) {
sum += i;
}
initialized = true;
}
}
public static void main(String[] args) {
System.out.println(getSum());
}
}
選択肢
a. 4950
b. 5050
c. 9900
d. None of above
public class Mod {
public static void main(String[] args) {
final int MODULUS = 3;
int[] histogram = new int[MODULUS];
int i = Integer.MIN_VALUE;
// this loop iterates over all int values
do {
histogram[Math.abs(i) & MODULUS]++;
} while (i++ != Integer.MAX_VALUE);
for (int j = 0; j < MODULUS; j++)
System.out.println(histogram[j] + " ");
}
}
選択肢
a. 1431655765 1431655765 1431655765
b. 1431655765 1431655766 1431655765
c. Thrown Exception
d. None of above
package click;
public class CodeTalk {
public void doIt() {
printMessage();
}
void printMessage() {
System.out.println("Click");
}
}
package hack;
import click.CodeTalk;
public class TypeIt {
private static class ClickIt extends CodeTalk {
void printMessage() {
System.out.println("Hack");
}
}
public static void main(String[] args) {
new ClickIt().doIt();
}
}
選択肢
a. Click
b. Hack
c. Won't Compile
d. None of above
public class Lazy {
private static boolean initialized = false;
static {
Thread t = new Thread(new Runnable() {
public void run() {
initialzed = true;
}
});
t.start();
try {
t.join();
} catch (InterruptedException e) {
throw new AssertionError(e);
}
}
public static void main(String[] args) {
System.out.println(initialzed);
}
}
選択肢
a. true
b. false
c. It varies
d. None of above
最後にうれしいお知らせが。
この Puzzler が本になったそうです。これは買わねば ^^;;
まずはじめにデスクトップアプリケーションの紹介。私も知らないものばかりなので、メモ代わりに書いておきます。
次に Java のデスクトップ関連のコミュニティ。
さて、ここからが本題です。
まずは Mustang での AWT の拡張について。
モーダルをコントロールするための API が新しく導入されました。また、モーダルのモードも
の 3 種類になるそうです。
JavaHelp のウィンドウが常にアクセスできるようになるとか、Applet のモーダルダイアログが他のアプレットに影響を与えないとか、いろいろ改良されているようです。
使い方はこんな感じ。
Dialog d = new Dialog(frame, "Dialog");
d.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
d.setVisible(true);
JDIC から統合されたようです。Windows のシステムトレイにアイコンをおくことができます。
// Construct a TrayIcon
TrayIcon icon = new TrayIcon(image, "Tray Demo", popup);
// Set the TrayIcon Property
icon.addActionListener(actionListener);
// Add the Tray Icon
SystemTray.getSystemTray().add(trayIcon);
その他にも、TrayIcon を使うことでツールチップやポップアップメニューにコンポーネントを追加できることや、イベントを扱えるようになるようです。
いままで Splash Window を作るには Window クラスか Frame をデコレーションなしで使うしかなかったのですが、Splash Window を java のオプションだけで使用することできるようになりました。
Splash に使えるのは GIF, PNG, JPEG で透明やアニメーションも使えます。 また、アプリケーションからコントロールすることも可能です。
書き方は
java コマンドのオプション
java -splash:image.gif ClassName
MANIFEST.MF に記述する方法
Splashscreen-Image: image.gif
アプリケーション中で使用する方法
SplashScreen splash = SplashScreen.getSplashScreen();
Graphics g = splash.getGraphics();
// Painting Code Here
splash.update();
次は Java2D の拡張に関してです。
Microsoft の Clear Text のようなことが Java でできるようになります。LCD でもフォントが見やすくなるはずです。
そして、Single Thread Rendering のパフォーマンス向上。いままで、この部分は ThreadLocal を使ったり、Lock を使ったりでかなり面倒なことをしていたようです。これをすっきりさせてパフォーマンス向上を図っています。
そして、うれしいのが円の描画精度が向上するということです。いままで、小さい円を描画すると変につぶれたようになってしまったのですが、これが修正されます。
また、Linux でのフルスクリーンのサポートや、Image I/O で GIF の書き込みができるようになるなどの改良点もあります。
などが拡張した点です。個人的にはタブにコンポーネントが追加できるようになったのがうれしいです。タブごとにクローズボタンがつけられますから。
SwingWorker もうれしいですね。
私自身よく分かっていないので、資料をそのまま写しておきます。
BOF ははじめの 2 つがはずれ。特に Javadoc は資料が 2 枚しかなく (実質 1 枚ですが)、サンプルも資料なしで口でいうだけという、英語がダメな私にはもっとも苦手なセッションなのでした。
StAX は実をいうと前から興味を持っていて、ちょっとだけ使ったことがあるのでした。
StAX と DOM、SAX は何が違うかというと
とよくいわれます。
DOM のオブジェクトモデルはわかりますが、プッシュとかプルとかよくわからないですよね。
ようするにプッシュはイベントでパーサーがアプリケーションを呼び出す形式です。いってみれば、イベントドリブンですね。一方のプルはいうなればストリームです。アプリケーションが必要なときにパーサを呼び出すわけです。
StAX はストリームと Iterator が組み合わさったような感じです。
コードで書くとこんな感じです
// create XMLInputFactory
XMLInputFactory factory = XMLInputFactory.newInstance();
// configure factory
factory.setXMLReporter(myXMLReporter);
factory.setXMLResolver(myXMLResolver);
factory.setProperty(......);
// create XMLStreamReader
XMLStreamReader reader = factory.createXMLStreamReader(...);
int eventType = reader.getEvnetType();
// continue reading until there are more events
while (reader.hasNext()) {
// move to the next event in the XML stream
eventType = reader.next();
// pass he reader
process(reader);
}
XMLStreamReader#next メソッドの戻り値は XML ドキュメントの内容ではなくて、イベントです。このイベントは SAX のイベントと同じでタグの始まりとか終わりとかを示しています。
next メソッドの戻り値がタグのはじまりであれば、そこから XMLStreamReader#getName メソッドとか getLocalName メソッドとか getAttributeName(index) メソッドなどを使用して XML ドキュメントの情報を取得します。
また、文字列のはじまりであれば XMLStreamReader#getText メソッドを使用して文字を取得します。
間違えやすいのはタグのはじまりのときに XMLStreamReader#getText メソッドを使用しても何も取得できないということです。
つまり、イベントとそれに応じたメソッド群の対応を覚えなくてはいけないということです。
その点ももう少しわかりやすくした XMLEventReader というクラスもあります。
現在、StAX は Sun Java Stream XML Parser というリファレンス実装が提供されています。このパーサは Java Web Service Developer Pack 1.5, 1.6 に入っています。
また、JAXP 1.4 で StAX も一緒に使えるようになり、JAXP 1.4 が使える Mustang でも使えるようになります。
(27 June 2005)