Go to Contents Go to Java Page

JavaOne 2005 SF

6/27 JavaOne 第 1 日

Coffee サービスのおじさん

初日の朝は雨がパラパラしていて、肌寒い朝です。それでも、General Session には長蛇の列が。今年は 10 周年なので、みなさん気合いが入っているのでしょうか。

そんな中、野球場のビール売りのようなコーヒのサービスが。写真にとっていいかと聞いたら、かなり照れてました ^^;;

というわけで、今日聴講したのは

General Session

General Session はメディアがとりあげますし (Enterprise WatchIT MediaIT Pro)、星さんの blog石原さんの blog ですでに取り上げられているので、私からいうことはほとんどないのです。

まぁ、しいていえば Blu-Ray で Java をサポートということですが、これは以前から Blu-Ray のドキュメントには書いてあったので今日発表したというものでは全然ないのです。

というわけでフォトログ風に。

General Session
会場に向かう人々
General Session
サイバーなバンド。もしかしたら、2003 年の JavaOne で演奏していたのと同じバンドかも
General Session
アコスティックギター (Ovation) ですが、まったく違う音が鳴っていました
General Session
司会はもちろん John Gage

 

General Session
Jonathan Schwaltz
General Session
Blu-Ray でも Java をサポート
General Session
DoCoMo の夏野さんはビデオで出演
General Session
IBM の John Miller。IBM と仲直りしたのです

 

General Session
John Loiacono
General Session
Creator 2 で AJAX のデモ
General Session
Black Berry で動作する Research In Motion のデモ
General Session
なんとなく構図がおもしろかったので

 

General Session
T-Shirt Launcher。ぜんぜん飛びませんでした ^^;;
General Session
ステージ横で出番を待つ Duke。手には Dukelele
General Session
Gosling と Gage
General Session
Scott McNealy も加わる

 

General Session
誕生日のセレモニー
General Session
Scott のお気に入りだそうです

General Session
Green Project のスタッフが集合

General Session
Happy Birthday, Java!

 

Technical General Session

Graham Hamilton
Graham Hamilton

Bill Shanon
Bill Shanon

Mark Hapner

Mark Hapner

ふつうの 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 と同じ機能が入るとしたら、なんかイヤだなぁ。

 

Technical Session

今日聞いた中では、最後の Profiler がはずれでした。

JMX や MXBean が前半にあって、この後にすごいことを説明するのかという期待をはずして、たいしたことなく終わってしまいました。

というわけで、残りの 3 つです。

TS-7264 Tigers and Mustangs and Dolphins, Oh My!
Sun Microsysms Mark Reinhold

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

JSR-202 Class File Update

クラスのベリフィケーションが Java ME のように分離できるようになるそうです。

JSR-199 Compiler API

今までも 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"));

JSR-260 Javadoc Tag Update

今までの Javadoc はカテゴリは 2 つ。つまり Field と Method だけです。しかし、これだと巨大なクラスでは見にくいというので、新しいカテゴリが導入されました。

Property と Field では何が違うかというと Setter/Getter があるのが Property だそうです。JavaBeans 的ですね。

Factory には newInstance メソッドなどが含まれます。

そして、Event には addActionListener とか removeActionListener メソッドなどが含まれます。

これらはカテゴリなので、自動的に javadoc コマンドが判別してくれるそうです。

JSR-221 JDBC 4.0

今まで JDBC ドライバのクラスを明記して Class#forName をしていましたが、いらなくなります。単に URL と getConnection メソッドだけです。

JSR-223 Scripting

JavaScript をプログラム中で使うことができます。こんな感じです。

import javax.script.*;
   
    ScriptEngineManager sem = new ScriptEngineManager();
    ScriptEngine engine = sem.getEngineByExtension("js");
 
    engine.eval("pring('Hello, World!')");

その他の新機能

Waring の抑制

@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 メソッドを使うと ******* で表されるようになるのだと思います。

JConsole Update

UI が新しくなり、必要に応じてアタッチできるようになったようです。また、デッドロックの検出もできるようになるらしいです。

DTrace

Solaris の DTrace で Java の情報までシームレスに見れるそうです。いいなぁ。

Improved Out-of-Memory Handling

今まで OutOfMemoryException が発生しても、どこで本当にメモリ食っているのかよく分からなかったのですが、分かるようになるらしいです。これはうれしい。

JDIC との統合

どこまで JDIC の機能が入るのかよく分かりませんが、ブラウザを起動することやシステムトレイにアイコンをおくことなどはできるようです。

Dolphin

XML の扱いがかなりかんたんになりそうです。こんな感じ。

void addReviewer(Element feature, String user, String time) {
    feature.add(<reviewed><who>{ user }</who></reviewed>
                          <when>{ time }</when>
                </reviewed>);

add( の後にダブルクォーテションはいらないのです。

TS-3738 Yet More Programmers Puzzlers
Google Joshua Bloch, Google Neal Gafter

Joshua Bloch

Joshua と Neal が Google に転職してしまったので、もう Puzzler はないのかと思っていたのですが、ちゃんと彼らは JavaOne に戻ってきました。

ちなみに右の写真は奇跡的に手ぶれも被写体ぶれもなかった写真です。

今回は問題が 8 問。すべて難しいです。

ここで答えまで出してしまうのもなんなので、みなさんで考えてみてください。

問題の形式はすべて同じで、実行したときにどのように出力されるかです。すべて 4 択の問題です。

1. Joy of Hex

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

2. Animal Farm

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

3. A Tricky Assignment

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

4. Thrown for a Loop

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

5. Sum Fun

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

6. Mod Squad

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

7. Package Deal

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

8. Lazy Initialization

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 が本になったそうです。これは買わねば ^^;;

 

TS-3133 Desktop Java Technology in Project Mustang and Beyond
Sun Microsystems Stanley Ho, Thorsten Laux, Denis Mikhalkin, Scott Violet

まずはじめにデスクトップアプリケーションの紹介。私も知らないものばかりなので、メモ代わりに書いておきます。

次に Java のデスクトップ関連のコミュニティ。

さて、ここからが本題です。

まずは Mustang での AWT の拡張について。

Modality API

モーダルをコントロールするための API が新しく導入されました。また、モーダルのモードも

の 3 種類になるそうです。

JavaHelp のウィンドウが常にアクセスできるようになるとか、Applet のモーダルダイアログが他のアプレットに影響を与えないとか、いろいろ改良されているようです。

使い方はこんな感じ。

    Dialog d = new Dialog(frame, "Dialog");
    d.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
    d.setVisible(true);

Tray Icon

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

いままで 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 Enhancement

次は Java2D の拡張に関してです。

Microsoft の Clear Text のようなことが Java でできるようになります。LCD でもフォントが見やすくなるはずです。

そして、Single Thread Rendering のパフォーマンス向上。いままで、この部分は ThreadLocal を使ったり、Lock を使ったりでかなり面倒なことをしていたようです。これをすっきりさせてパフォーマンス向上を図っています。

そして、うれしいのが円の描画精度が向上するということです。いままで、小さい円を描画すると変につぶれたようになってしまったのですが、これが修正されます。

また、Linux でのフルスクリーンのサポートや、Image I/O で GIF の書き込みができるようになるなどの改良点もあります。

Swing Enhancement

などが拡張した点です。個人的にはタブにコンポーネントが追加できるようになったのがうれしいです。タブごとにクローズボタンがつけられますから。

SwingWorker もうれしいですね。

I18N

私自身よく分かっていないので、資料をそのまま写しておきます。

もっとよく知りたい方は ここここ へ。

BOF

BOF ははじめの 2 つがはずれ。特に Javadoc は資料が 2 枚しかなく (実質 1 枚ですが)、サンプルも資料なしで口でいうだけという、英語がダメな私にはもっとも苦手なセッションなのでした。

BOF-9778 StAX or SAX? Pull or Push Parsing XML?

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)