はじめての JavaFX エンタープライズ・アプリケーション : JavaFX と JPA で実装するアプリケーション


本日は少しだけ JavaFX を触ってみました。正直 JavaFX は櫻庭大先生や、関谷さん、他の Embedded チームの皆様に助けて頂いているので、私自身あまり JavaFX に触っておらず自信もないのですが、今日は、JavaFX から JPA を使って DB に接続するクライアント・サーバのアプリケーションの作成してみました。

開発環境:

  • JDK 1.7 (Mac OSX 1.7.0_04)
  • NetBeans 7.1.1 or later (Mac OSX 1.7.0_04)
  • JavaDB (今回は GlassFish に付属の JavaDB を使用しました)

 

必要なライブラリ:

  • eclipselink-2.3.0.jar
  • javax.persistence-2.0.jar
  • org.eclipse.persistence.jpa.jpql_1.0.0.jar
  • derbyclient.jar (JavaDB 用のドライバ)

アプリケーションの概要:

このアプリケーションは DB に存在する顧客情報を参照するだけの簡単なアプリケーションです。JavaFX のアプリケーションから JPA を使用して DB に接続し顧客名とメールアドレスをアプリケーション上に表示します。「データの取得」ボタンを押下すると DB よりデータを取得し、テーブル内に表示し、「データのクリア」ボタンを押下すると表示内容をクリアします。

 

 

 

それでは実際に作成してみましょう。まず、NetBeans の「新規プロジェクト」を作成します。

次に、「JavaFX アプリケーション」のプロジェクトを選択します。

選択すると下記の画面が表示されますので、「プロジェクト名 (N) :」と「アプリケーションクラスを作成 (C)」を編集しプロジェクトに対して適切な名前、パッケージ、クラス名を指定します。

以上で JavaFX アプリケーションのプロジェクトが生成されました。この状態で「主プロジェクトを構築 (B)」を選択した後、「主プロジェクトを実行 (R)」を実行するとボタンが一つだけ表示される Window が表示されます。ボタンを押下すると標準出力に ”Hello World !”が表示されます。今回はこの自動生成されたJavaFX プロジェクトのひな形を改造しアプリケーションを作成します。

デフォルトで生成される Main クラスのひな形ソースコード

public class Main extends Application {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

次にエンティティ・クラスを作成します。
※ 下記の方法は、既存で DB が存在し、既にテーブルが存在している場合の方法です。テーブルが存在しない状態でもエンティティクラスを生成できますが、簡単に説明するため今回は既存のテーブルを利用してエンティティクラスを生成します。
「新規」→「持続性」→「データベースからのエンティティクラス…」を選択します。

選択すると下記の画面が表示されます。ここで「関係する表を含める (I)」のチェックを外し「CUSTOMER」テーブルを選択した後、「次へ」ボタンを押下します。

ボタンを押下すると下記の画面が表示されます。ここでエンティティ・クラスのパッケージ名を適切に入力し「次へ」ボタンを押下します。

ボタンを押下すると下記の画面が表示されます。ここではデフォルトの設定のままで最後に「完了(F)」ボタンを押下します。

既存の DB テーブルを元に NetBeans で自動生成されたエンティティ・クラス

package jp.co.oracle.javafxsample.dao;

import java.io.Serializable;
import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author Yoshio Terada
 */
@Entity
@Table(name = "CUSTOMER")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Customer.findAll", query = "SELECT c FROM Customer c"),
    @NamedQuery(name = "Customer.findByCustomerId", query = "SELECT c FROM Customer c WHERE c.customerId = :customerId"),
    @NamedQuery(name = "Customer.findByName", query = "SELECT c FROM Customer c WHERE c.name = :name"),
    @NamedQuery(name = "Customer.findByAddressline1", query = "SELECT c FROM Customer c WHERE c.addressline1 = :addressline1"),
    @NamedQuery(name = "Customer.findByAddressline2", query = "SELECT c FROM Customer c WHERE c.addressline2 = :addressline2"),
    @NamedQuery(name = "Customer.findByCity", query = "SELECT c FROM Customer c WHERE c.city = :city"),
    @NamedQuery(name = "Customer.findByState", query = "SELECT c FROM Customer c WHERE c.state = :state"),
    @NamedQuery(name = "Customer.findByPhone", query = "SELECT c FROM Customer c WHERE c.phone = :phone"),
    @NamedQuery(name = "Customer.findByFax", query = "SELECT c FROM Customer c WHERE c.fax = :fax"),
    @NamedQuery(name = "Customer.findByEmail", query = "SELECT c FROM Customer c WHERE c.email = :email"),
    @NamedQuery(name = "Customer.findByCreditLimit", query = "SELECT c FROM Customer c WHERE c.creditLimit = :creditLimit")})
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "CUSTOMER_ID")
    private Integer customerId;
    @Column(name = "NAME")
    private String name;
    @Column(name = "ADDRESSLINE1")
    private String addressline1;
    @Column(name = "ADDRESSLINE2")
    private String addressline2;
    @Column(name = "CITY")
    private String city;
    @Column(name = "STATE")
    private String state;
    @Column(name = "PHONE")
    private String phone;
    @Column(name = "FAX")
    private String fax;
    @Column(name = "EMAIL")
    private String email;
    @Column(name = "CREDIT_LIMIT")
    private Integer creditLimit;

    public Customer() {
    }

    public Customer(Integer customerId) {
        this.customerId = customerId;
    }

    public Integer getCustomerId() {
        return customerId;
    }

    public void setCustomerId(Integer customerId) {
        this.customerId = customerId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddressline1() {
        return addressline1;
    }

    public void setAddressline1(String addressline1) {
        this.addressline1 = addressline1;
    }

    public String getAddressline2() {
        return addressline2;
    }

    public void setAddressline2(String addressline2) {
        this.addressline2 = addressline2;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getFax() {
        return fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getCreditLimit() {
        return creditLimit;
    }

    public void setCreditLimit(Integer creditLimit) {
        this.creditLimit = creditLimit;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (customerId != null ? customerId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Customer)) {
            return false;
        }
        Customer other = (Customer) object;
        if ((this.customerId == null && other.customerId != null) || (this.customerId != null && !this.customerId.equals(other.customerId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "jp.co.oracle.javafxsample.dao.Customer[ customerId=" + customerId + " ]";
    }
    
}

これで、JPA のエンティティクラスが生成されましたので、これを元に JavaFX で DB のデータを参照するアプリケーションを作成します。

まず、DB に接続し全データを取得する部分ですが、getData() メソッドで実装します。GlassFish の Java DB を利用した場合、上記までの手続きにより、自動的に Persistence Unit (持続性ユニット) の設定が行われています(※ その他の DB を利用する場合、別途 NetBeans の「新規」→「持続性」→「持続性ユニット…」を選択し持続性ユニットの設定を行ってください)。
持続性ユニットの設定が適切に行われている場合、プロジェクト内に persistence.xml というファイルが生成されています。この persistence.xml 設定ファイルには DB サーバへ接続するための情報(JDBC ドライバ、接続 URL、ユーザ名、パスワード)等が記載されていますが、プログラム上からどの持続性ユニットを利用するかを指定できるように持続性ユニット名が記載されています(この例では JavaFX-JPA-SamplePU)。

persistence.xml 中の持続性ユニット名の設定(全設定は最後にまとめて記載)

<persistence-unit name="JavaFX-JPA-SamplePU" transaction-type="RESOURCE_LOCAL">

JavaFX のアプリケーションではこの持続性ユニット名を指定してエンティティを管理するための、EntityManager を生成します。EntityManager を生成した後、JPQL の NamedQuery (NetBeans では上記エンティティ・クラスに記載されているように、基本的な Named クエリが複数自動生成。ここではCustomer に記載されている @NamedQuery(name = “Customer.findAll”, query = “SELECT c FROM Customer c” ),) を使用して全データを取得します。取得したデータは List にコピーし返します。

getData() の EntityManager 生成部分(全ソースコードは最後にまとめて記載)

        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("JavaFX-JPA-SamplePU");
        EntityManager em = emf.createEntityManager();
        TypedQuery tquery = em.createNamedQuery("Customer.findAll", Customer.class);
        List<Customer> list = tquery.getResultList();

「データの取得」ボタンが押下された際に、DB に接続しデータを JavaFX のテーブルに表示するため、ボタンが押下された際のイベントをハンドリングします。この際 JavaFX では javafx.scene.control.TableView の setItems(ObservableList < S > value) を利用してプロパティを設定する事ができます。List から ObservableList を生成するために、JavaFX で用意されている便利なユーティリティクラス FXCollections を使用して変換します。変換後 TableView#setItems() メソッドの引数に代入し実行します。

        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                ObservableList<Customer> data = 
                FXCollections.observableArrayList(getData());
                table.setItems(data);
            }
        });

後は、説明の必要もないかと思いますが、TableColumn でどの項目を表示するかを記載して完了です。FXCollections という便利なユーティリティツールが用意されている事もあり、JPA のエンティティをとても簡単に扱う事ができます。もちろん昔ながらの JDBC で記載する事も可能かと思いますが、JPA の方がとても簡単に効率良く実装できる事がわかるかと思います。

さて実装が終わったので、プロジェクトを構築して実行するわけですが、実はこの状態でプログラムを実行するとエラーが発生します。なぜなら現時点で本プロジェクトに JDBC ドライバのライブラリを組み込んでいないためです。


[EL Severe]: 2012-05-24 18:42:32.336–ServerSession(1090664123)–Local Exception Stack:
Exception [EclipseLink-4003] (Eclipse Persistence Services – 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Exception Description: Configuration error. Class [org.apache.derby.jdbc.ClientDriver] not found.

そこで、JavaDB 用の JDBC ドライバを組み込みます。ライブラリを選択し「JAR/フォルダを選択…」を選択してください。

選択すると下記の画面が表示されますので、JavaDB 用の JDBC ドライバを選択します(derbyclient.jar)。

ライブラリを組み込むと下記のように表示されます。

ドライバを組み込んだ後、プロジェクトを構築します。

次にアプリケーションを実行します。


 

最後に、今回は JavaFX アプリケーションとして、アプリケーションを作成しました。つまりこのアプリケーションでは、コネクション・プール等を利用していない為、ボタンを押下する度に DB に対して接続が発生します。そこでこのアプリケーションを大量に配布した場合、DBに対して高負荷を与える可能性もあります。
そのような場合、もちろんこのアプリケーションをアプリケーション・クライアント・コンテナを含めて作成する事も可能です。アプリケーション・クライアント・コンテナ上で作成すると、アプリケーション・サーバ上のリソースをアノテーションを利用して注入できるようになる他、アプリケーション・サーバ上で EJB を作成し、それを参照するようにする事でコネクション・プールの利用もできるようになるため、DB に対する負荷も軽減できるようなります。要件に応じてはクライアント・サーバ型のアプリケーションの実装が必要になる場合もあるかと思いますが、場合によってはアプリケーション・クライアント・コンテナ上でアプリケーションを実行する事もご検討ください。

Main クラスの全ソースコード:

package jp.co.oracle.javafxsample;

import java.util.List;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javax.persistence.*;
import jp.co.oracle.javafxsample.dao.Customer;

/**
 *
 * @author Yoshio Terada
 */
public class Main extends Application {

    /**
     * @param args the command line arguments
     */
    
    private TableView table = new TableView();
    
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        Scene scene = new Scene(new Group(), 500, 400, Color.LIGHTGRAY);
        primaryStage.setTitle("顧客情報参照アプリケーション");

        final Label label = new Label("顧客情報の参照");

        //テーブルの初期化
        TableView table = initTable();
        
        //ボタンの初期化
        Button getBtn = initGetButton();
        Button clrBtn = initClearButton();
        
        VBox vbox = new VBox();
        vbox.setSpacing(2);
        vbox.getChildren().addAll(label, table,getBtn,clrBtn);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.setPrefSize(480, 380);

        ((Group) scene.getRoot()).getChildren().addAll(vbox);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    private TableView initTable() {
        TableColumn nameCol = new TableColumn("顧客名");
        nameCol.setMinWidth(200);
        nameCol.setCellValueFactory(new PropertyValueFactory<Customer, String>("name"));

        TableColumn emailCol = new TableColumn("電子メール");
        emailCol.setMinWidth(280);
        emailCol.setCellValueFactory(new PropertyValueFactory<Customer, String>("email"));

        table.setEditable(true);
        table.setPrefWidth(480);
        table.getColumns().addAll(nameCol, emailCol);

        return table;
    }

    private Button initGetButton() {
        Button btn = new Button();
        btn.setText("データの取得");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                ObservableList<Customer> data = 
                FXCollections.observableArrayList(getData());
                table.setItems(data);
            }
        });
        return btn;
    }
    
    private Button initClearButton() {
        Button btn = new Button();
        btn.setText("データのクリア");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                table.setItems(null);
            }
        });
        return btn;
    }

    // JPA を使用して DB よりデータの取得
    private List getData() {
        EntityManagerFactory emf =
                Persistence.createEntityManagerFactory("JavaFX-JPA-SamplePU");
        EntityManager em = emf.createEntityManager();
        TypedQuery tquery = em.createNamedQuery("Customer.findAll", Customer.class);
        List<Customer> list = tquery.getResultList();

        if(em != null)
            em.close();
        if(emf != null)
            emf.close();
        return list;
    }
}

persistence.xml の内容

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="JavaFX-JPA-SamplePU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>jp.co.oracle.javafxsample.dao.Customer</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/sample"/>
      <property name="javax.persistence.jdbc.password" value="app"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
      <property name="javax.persistence.jdbc.user" value="app"/>
    </properties>
  </persistence-unit>
</persistence>

2012年5月24日 at 8:26 PM 1件のコメント

JavaOne Tokyo の発表資料公開 – JMS 2.0, Caching


JavaOne Tokyo 2012 で発表したプレゼン資料は本家サイトでも公開されておりますが、ダウンロードせずにさらっと見てみたいという方のために、JMS 2.0 と JSR-107 Cache に関するプレゼン資料をそれぞれ下記でも公開致します。

JMS 2.0, JSR-107 Caching Standard はそれぞれ Java EE 7 に含まれる技術であり、正式リリースまで時間があるため、内容が変更される可能性もありますが、現時点(2012年4月)で公開されている最新の仕様(アーリードラフト)に基づいた最新情報になります。つまり昨年の JavaOne San Francisco で発表された内容から若干ですが更新された内容も含まれます。どうぞご参照ください。

JSR-343 : What’s Coming Java Messaging Service 2.0

The New JSR-107 Caching Standards with RedHat ネコピーさん

Caching Standards ではネコピーさんと始めてコラボセッションを行ったのですが、質疑応答等で大変助けて頂きました。ありがとうございました!!(^_^)

2012年4月16日 at 4:04 PM コメントする

続:旧 Java SE API リファレンスへの新しいリンク先変更について


先日、「新しい Java SE API リファレンスの入手先について」のエントリでsun.com のドメイン廃止に伴い、Java SE API リファレンスのオンライン参照が不可能となった旨、ご報告を致しました。その節はご迷惑を御掛けし大変申し訳ございませんでした。


その後、社内でオンライン公開について協力してくださる方々が現れ
、彼らのご協力のおかげで、本日から改めて oracle.com ドメイン経由で参照できるようになりました。
新しい URLを下記にご報告致します。全てのドキュメントは OTN 経由から参照可能です。

OTN Java DevelopersJava SE API & ドキュメント からご参照頂けます。

直接のリンクは、それぞれ下記からたどれるようになりました。是非新しくなったリンクをご使用頂けますよう宜しくお願いします。

 

また、Java SE 7 API のドキュメント翻訳プロジェクトにつきましては、諸事情がございまして、5月中旬位まで御待ち頂けませんでしょうか。5月中旬移行に本件についてのアップデートをさせて頂きたいと考えております。

2012年4月11日 at 3:18 PM コメントする

Turning the potter’s wheel at JavaOne Tokyo


Recently the word of “Turning the potter’s wheel” is very popular in Japan.
One Japanese guy(Kouhei Iida-san) asked why the presentator always “Turning the potter’s wheel” at the explanation?

And another guys evaluate whether it is right or not as follows.
Turning the potter’s wheel

As a result, so many presentator even though Steave Jobs had turned the potter’s wheel. And It’s not a bad meaning at all. And it’s a one of the expression of the enthusiastic.

And Today I confirmed JavaOne Tokyo speakers.
(Sorry all of ther speakers I coulnd’t take the photos.)

And so many speaker had turned the potter’s wheel as follows.

For All of JavaOne Tokyo speakers :
Great Thank you so much for your excellent presentation !!

Thank you & Best Regards.
Yoshio.











2012年4月8日 at 3:10 AM コメントする

JavaOne Tokyo のお礼


JavaOne Tokyo にご参加頂いた皆様、誠にありがとうございました。心より御礼申し上げます。

開催前日は、あいにくの空模様で交通機関が完全に麻痺してしまったため、地方からご参加いただいた皆様の中には前日に東京にお越し頂く事ができなかった方がいらっしゃる事を伺っております。また当日お越し頂けた皆様の中には、新幹線に切り替えて、それでも新幹線が東京に到着するのが深夜となり、ホテルまでタクシーで移動された方もいらっしゃると聞いています。そのような大変な状況にも関わらず、北は北海道から南は沖縄まで日本全国から、JavaOne Tokyo にご参加頂きました皆様、本当にありがとうございました。

JavaOne Tokyo がこれだけ盛り上がったのも、一重に日本全国からご参加頂いた数多くの Java 開発者の皆様のおかげでございます。皆様のご参加、心より御礼申し上げます。

今回の JavaOne は7年振りという事もあり、JavaOne を全くご存知ない世代の方々も数多く参加して頂けたのではないかと思います。JavaOne をご存知ない世代の方々に対して、Java の開発者の祭典である JavaOne を再び日本でお届けできた事を心より嬉しく思っております。

また、この2日間、Twitter 上に JavaOne のメッセージで溢れ帰る程の多くのつぶやきが見受けられました。この JavaOne の盛り上がり、Java 開発者の皆様のメッセージは、本社社員や、日本のオラクル社員にも十分伝わっておりますし、今回残念ながらご都合が悪くご参加いただけなかった皆様も、皆様のツイートを見て、次回は是非参加したいと言って下さっている方もお見かけ致しました。これもご参加頂いた皆様が数多くのフィードバックをしてくださったからだと思います。本当にありがとうございました。

さらにはブログで、本場 JavaOne サンフランシスコに参加された Nobeans さんも、下記のように本場 JavaOne サンフランシスコのようで楽しかったというようなメッセージも頂きました。単なる日本における Java の勉強会ではなく JavaOne Tokyo ができたんだなと嬉しく思いました。

あと、JavaOneTokyo全体の感想としては、一言で言えば超楽しかったです。
去年と一昨年にSFのJavaOneに参加してきたんですが、
“今回タワーホールとかでセッション開始待ちしてるときの雰囲気とか
音楽とかもう去年のSFのJavaOneそのもので、すっごいテンション
あがりました。もうそのままSFにいるみたいな気分。”

 

その他にも下記のように数多くのブログの投稿を頂いております(すいません全てハンドリングできていないかもしれません、もし自分も書いたという方がいらっしゃいましたら、是非教えていただけないでしょうか)。多くの皆様から楽しかった!!というようなメッセージを頂き、次回開催希望も多く承っております。これら開発者の皆様の声はちゃんと US や日本の上層部にお伝え致します。(実は既にこのブログを書く前に、社長、取締役に報告しております。(^_^))

JavaOne Tokyo に参加してくださった皆様のブログ:

その他、下記のように Togetter にまとめて下さった方々も多数いらっしゃいます。誠にありがとうございます。

Togetter のまとめ一覧:

最後に、
繰り返しになりますが、この度は JavaOne Tokyo 2012 にご参加頂きまして誠にありがとうございました。JavaOne Tokyo がまたいつか開催できればと思っております。誠に簡単ではございますが、JavaOne Tokyo に携わってくださった全ての皆様に御礼のご挨拶まで!!

2012年4月7日 at 7:19 PM コメントする

JavaOne 受講票引換券の印刷のお願い


 

JavaOne Tokyo 2012 にご参加の皆様

JavaOne 当日、マイページから入手可能な、受講票引換券をプリントアウトし受付にお持ちください、受講票と交換致します。

仮にマイページのログイン方法が分からない場合、もしくは受講票の引換券が表示されない等のなどの問題がございましたら、下記のレジストレーション事務局までお問い合わせください。

お問い合わせ:
JavaOne Tokyo レジストレーション事務局
E-Mail:info-javaone_jp AT oracle.com
TEL:03-6834-4694(平日10:00~18:00)

詳細:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
JavaOne Tokyo 2012 受講票引換券発行/当日のご来場に関するご案内
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
申込番号:[XXXXXXXXXX]

この度は、JavaOne Tokyo 2012にお申し込みいただきありがとうございます。マイページより受講票引換券の発行を開始させていただきましたのでお知らせいたします。お手数ではございますが、ご来場前にご自身で受講票引換券を印刷し、当日はお忘れのないようお持ちください。

また、下記のご案内につきましては、ご来場前に必ずご一読くださいますようお願い申し上げます。

■受講票引換券の印刷/受講票のお渡し
マイページにログイン後、お申込み内容(選択セッション)一覧の右側の列に表示される「受講票の印刷」を押下し、受講票引換券を印刷してください。ご来場の際は、受講票引換券をお忘れなくお持ちください。受付にて受講票をお渡しいたします。

マイページURL: https://oj-events.jp/public/mypage/login?type=jo
ログインID:[XXXXXXXXXX]
パスワード:ご登録時にご自身で設定されたパスワード
※パスワードをお忘れの方は、上記マイページログインページに記載の
「パスワードをお忘れの方はこちら」より、再設定ください。

「ご注意」
◇受講票引換券を一度印刷した後、セッションの変更をされた場合は、再度
受講票引換券を印刷してください。当日は受講票引換券に記載のお申込み内容(選択セッション)を確認させていただき、記載がないセッションにはご入場いただけない場合がございますのでご注意ください。

◇受講票引換券及び受講票は2日間共通となります。
受講票引換券をお忘れになりますと再発行までにお時間がかかる場合があり
ますのでご注意ください。また、当日お渡しいたします受講票の再発行は致しかねますので、開催期間中は無くさないよう大切に保管してください。

■当日の受付
[受付場所] 六本木アカデミーヒルズ49
(〒106-6149 東京都港区六本木6-10-1 六本木ヒルズ森タワー49階)
[受付オープン時間] 4月4日(水)-5日(木) 8:00-19:30

印刷した受講票引換券を受付にてご提示ください。
当日朝は混雑が予想されますので、お時間に余裕をもってご来場ください。

※学生向け特別プログラムにてご参加の方は受講票引換券とともに「学生証」をご提示ください。

■来場者特典(カンファレンスバッグ/オリジナルTシャツ)
各日11時より会場内引換所にてお渡しいたします。来場者特典の引換券は受付にてお渡しいたします(お1人様1回限り)。

お問い合わせ:

JavaOne Tokyo レジストレーション事務局
E-Mail:info-javaone_jp AT oracle.com
TEL:03-6834-4694(平日10:00~18:00)

日本オラクル株式会社

 

2012年4月2日 at 2:05 PM コメントする

JavaOne 2012 Tokyo の歩き方


さて皆様、JavaOne まで残す所あと2日となりました。今回の発表資料を社員レビューアの一人として拝見いたしましたが、いずれのセッションもとても興味深くすばらしい物ばかりでした。是非皆様当日をお楽しみにして頂ければと思っております。

また地方からお越し頂く方は、明日中に東京に移動されて来られる方も多いのではないかと思います。地方の皆様は是非気をつけてお越し頂ければと思っております。

さて本エントリでは、皆様に私からの最後のお願いと申しますか、事前にお伝えしたい内容を記載したいと思っております。JavaOne 2 日間の貴重なお時間を有効に使って頂くために、是非下記をご参照ください。

最重要(命の関わる事)

大規模地震発生時、指揮権は全面的に森ビルに移ります。
森ビルの館内アナウンス等、全て森ビル側の指示にお従いください。
また係員の指示に従い迅速に行動してください。

具合の悪い方、もしくは具合の悪い方を見かけた方は
 近くにいる係員まで是非、お知らせください。

次に重要(時間の有効活用の観点)

● JavaOne 会場へはなるべくお早めにお越しください。(冗談抜きでのお願いです)
● 昼食はなるべく、お弁当をご持参ください。(冗談抜きでのお願いです)

朝とお昼は大変な混雑が予想されます。直前ギリギリにお越し頂いた場合、基調講演に間に合わない可能性もありますので、お早めの行動をおすすめ致します。実際、JavaOne 2012 Tokyo には 1000 名以上の開発者の皆様にご参加頂きます、会場であるアカデミーヒルズ 49 F まではエレベータで移動頂きますが、エレベータは 5基あり、1基辺り最大 22 名となっています。

基調講演を良い席で落ち着いてご覧頂くためにも、お早めのご来場を心よりお願い申し上げます。
(※ 午前 8 : 30 前後でのご来場を推奨致します。)

● バッグの交換は 11 時からを予定しています。




朝早くお越し頂いた皆様には、AM 8:25–8:40 まで、本場サンフランシスコからやってきた Duke と写真撮影もできます。お早めにお越し頂き、是非 Duke とツーショット写真をお撮りください!!Duke との写真撮影は 1日4回を予定しています。是非、本場 Duke とのツーショット写真もお忘れなく!!

Duke Photo ブース

1 8:25–8:40
2 10:55–11:10
3 14:15–14:30
4 16:45–17:00

また、昼食時にもランチタイムのスペシャルセッションをご用意しています。本スペシャルセッションは、GlassFish のプロダクト・マネージャを務める John Clingan が自ら、GlassFish の将来について紹介します。本セッションは、ランチタイム・スペシャルセッションという事でお食事をお召し上がりながら受けられるセッションです。是非ご持参頂いたお弁当を食べながらお聞きください。

Day1 – GlassFishのProduct Managerが語るGlassFish最新ロードマップ 12:20 – 13:00
Day2 もランチタイム特別企画が開催されるかも!!

是非ご協力頂きたい内容

会場は完全入れ替え制で、毎回入り口でバーコードチェックを行い入場します。仮に次に同じ部屋でセッションを受講される場合も、一度全員ご退場の上で再度ご入場ください。
(理由:受講者のセッション登録状況チェックと、同時通訳レシーバの回収、回収数チェックが必要なためです。)
各セッション間の休憩時間は 15 分用意していますが、イベントを迅速に運営するために大変恐れ入りますが、会場から一度ご退場の程宜しくお願いします。ご退場の際は、レシーバも必ず係員に御返却ください。

● セッションのキャンセル待ちについて:

予約時にご希望のセッションが満席で取れなかったが、どうしても違うセッションを受講したい場合、キャンセル待ちにお並びいただく事でセッションを受講する事が可能です。ただし、予約時にご登録頂いたかたから順に入場し、その後キャンセル待ちの方々にご入場いただけるようになります。立ち見での受講になる可能性もございますが、それをご承知の上で参加されたい場合、キャンセル待ちの列へお並びください。

最後に、

通常の受講セッションを待ち行列に加え、キャンセル待ちの行列もできる事が予想され、アカデミーヒルズの通路もまた大変な混雑が予想されます。皆様是非、混雑している中で、譲り合いのお気持ちをお忘れにならずに、慌てずに、そして決して怪我の無いように行動してください。また是非、係員の指示にお従いいただき行動してください。冗談抜きで、朝、昼、夜、セッション開始、終了時に大変な混雑を想定しております、迅速なイベントの運営・またあらゆる事故が発生しないように是非、皆様のご協力を宜しくお願いします。(くどいようですが、朝早く&お弁当持参で宜しくお願いしますね!!)

皆様と、当日お会いできる事を心より楽しみに致しております。

Java エバンジェリスト 寺田

2012年4月2日 at 5:39 AM コメントする

新しい Java SE API リファレンスの入手先について


2012 年 03 月 25 日、sun.com のドメインが利用不可になりました。これに併せ、java.sun.com で提供されていた Java SE API 日本語ドキュメントもオンライン経由で参照する事ができなくなりました。今後、日本語の Java SE API レファレンスはオンライン経由では参照できなくなりますので、アーカイブを御入手の上、ローカル環境でご参照ください。お手数をお掛けし申し訳ございませんが、どうぞ宜しくお願いします。

Java API の日本語ドキュメントはコチラから入手が可能です。
ドキュメントの再配布ポリシーはコチラをご参照ください。

新しい日本語 API ドキュメントのオンライン参照先URL (2012/4/11 訂正、追記)

PS.
引き続き、英語の API ドキュメントはオンラインで参照可能です。

Java SE 7 API Documentation
Java SE 6 API Documentation
J2SE 5 API Documentation
J2SE 1.4.2 Documentation
J2SE 1.3.1 Documentation

2012年3月25日 at 10:30 PM 3件のコメント

JJUG 主催 : JavaOne Tokyo 打ち上げ開催予定




この度、日本 Java ユーザ・グループ主催で JavaOne Tokyo 2012 の打ち上げを実施する事になりました。もしご都合がよろしければ下記よりご登録ください。

JavaOne Tokyo 2012 打ち上げの登録

詳細:

  • 日時:4/5 (木) PM 21:00-23:00
  • 場所:六本木周辺
  • 会費:¥5,000

Party 会場規模の関係で人数は限定となっており、また、事前にご登録頂いた方だけが参加可能になります。3/26(月) 募集締め切りますので登録締め切り後、ご登録頂いた方に対して会場のご案内を差し上げる予定です。

以上、どうぞ宜しくお願いします。

JJUG 幹事一同



2012年3月16日 at 6:00 PM コメントする

JavaOne Tokyo 2012 事前登録終了のお知らせ


JavaOne にご登録頂いた皆様、
この度は、大変多くの皆様にご登録頂きまして誠にありがとうございました。想定以上に多くの皆様に事前登録を頂き、本日チケット販売が終了致しました。ご登録くださった皆様、誠にありがとうございました。当日、皆様のご参加と、会場でお会いできる事を心よりお待ち申し上げております。

学生の皆様へ、
この度JavaOne Tokyo 2012において特別プログラムを提供する事ができず大変申し訳ございませんでした。多くの学生の皆様にお越し頂き最新の技術について触れて頂きたく計画しておりましたが、それが叶わず本当に申し訳ございませんでした。

また、
ご検討頂いていたにも関わらず、登録締め切りとなり、参加登録ができなかった皆様におかれましても申し訳ございませんでした。併せて心よりお詫び申し上げます。

今後、参加できなかった方のために、可能性も含め対応可能な点を検討・模索したいと考えております。それまで今暫く御待ち頂けないでしょうか。
以上、どうぞ宜しくお願いします。

寺田

2012年2月24日 at 6:06 PM コメントする

過去の投稿


ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2012年5月
« 4月    
 123456
78910111213
14151617181920
21222324252627
28293031  

カテゴリー

最近の投稿

Twitter

  • @boochnich センター棟で開催致しますので、センター棟(セミナーホール、402, 403, 405)までお越し頂けないでしょうか。 #jjug_ccc3 hours ago
  • JavaQne にご参加の皆様、今日はどうぞ宜しくお願いします。お土産も持ってまいりましたので是非楽しみにしてください!!#java #javaqne 3 hours ago

ブログ統計情報

  • 210,037 hits

RSSフィード


フォロー

Get every new post delivered to your Inbox.

現在1,361人フォロワーがいます。