Category Archives: Java

Java One Tokyo 2012 (#JavaOneJP) に参加しました

2012年4月4,5日に開催されたJava One Tokyoに参加させて頂いてきました。タイトルは "Moving Java Forward" ということで、Javaはどのように前進しているのでしょうか?

感想

このエントリは最後グダグダになるので、いきなり冒頭から総括します(^^; メインの内容は去年のJavaOne(サンフランシスコ)の報告会として開催されたJJUG CCC 2011 fallで得られた情報とかなりかぶっていました。本場に行けば半年前に情報が得られたわけですね。しかし、Oracle本社からキーパーソンが来日していることはやはり重要なことです。質問の機会もありますし、彼らの熱意を感じることができました。参加者も全国からJava好きの人が集まっているというのが大きいです。さすが祭典です!

その他、一般公募セッションやハンズオンなども開催されているので、5000円ほどの参加費用を払っても参加する価値は十分だったと思います。

だって7年ぶりですし!次は7年後でないことを願います……。

僕が参加したセッション

1日目(4/4)

  • Strategy Keynote
    • 途中から参加したらサテライトに回されました...
  • 長期運用を実現するNECのEnterprise Java
    • これが噂に聞くえすあいあーというものかー
  • Java EE Web Container in the Cloud -What's New in Servlet 3.1
    • Servlet 3.1 から NodeJSみたいなイベントハンドリングなプログラミングが出来るみたいです。
  • The Heads and Tails of Project Coin
    • 後述
  • Pragmatic Cloud and PaaS with Java EE 7 (and GlassFish)
    • 難しかった
  • Project Lambda: To Multicore and Beyond
    • 早く使いたい!
  • JAX-RS 2.0: What's in JSR 339?
    • クライアントもサーバもJAX-RSでつなげる!ということくらいしかわからなかったorz
  • トラブルシューターの頭の中身 〜7年間のJavaトラブルシュートサービスから
    • 面白かったです。後述
  • Special Session
    • 面白かったです。

2日目(4/5)

  • Technology Keynote
    • 途中から参加したらサテ(ry...
  • ビッグデータ時代におけるJava技術
    • ICTとか「ひゅーまんせんとりっく」とかいうキーワードが聞こえましたが、気がついたらセッションが終わって(ry
  • [一般公募セッション] Java SE 7 InvokeDynamic in JRuby
    • 難しかった
  • Project Jigsaw: Putting it all Together
    • 結局Mavenと何が違うんでしょう?JDK自体がモジュール化するらしくてjarがjmodになる!?
  • How to Write Low Latency Java Applications
    • 後述
  • UI Controls and Charts: Drag-and-Drop, Filtering, Sorting, Table Hookup with Charts
    • JavaFX系のセッションは面白いと聞いて、参加したら文字ばかりでした。。。JJUGのskrbさんのセッションと被っていた印象
  • The Future of JavaScript in the JDK
    • あまり話題になっていないけど個人的にすごい興奮しました。後述
  • Special Session
    • しごとないしょくしていてあまりきけなかっ(ry....

心に残ったセッション

The Heads and Tails of Project Coin

前半はJava7で導入されたダイヤモンド演算子、String switch、Try with resourcesの紹介を、NetBeansによるデモを交えて紹介。大分コードが完結になって良いですね!早く使いたい!(もう使えます)

後半は、この言語仕様を導入するためにいかに苦労したかという話。自分のような初心者が横で「こうだったら便利なのに」などと簡単に言うけどいざ言語設計に落としこんでみると矛盾したりして大変なんですね。それをどのように解決したか!どこが難しかったかと、言語マニアの熱意が伝わりました。

Project Lambda: To Multicore and Beyond

これは以前から聞いていた話の通りですが早くJDK8でLambda使いたいな〜

トラブルシューターの頭の中身 〜7年間のJavaトラブルシュートサービスから

自分も年に何度か、原因不明の不具合に対処してきましたが、いきなりソースを精読したり、スレッドダンプ見に行ったり無駄なことをしている例そのものでした。
jmap, visualvmでヒープダンプも見ます!
ハイテンションの谷本さんとクールな江里口さんのペアが面白かったです。

How to Write Low Latency Java Applications

知らなかったのは、Finalizerを実装すると、GCの後に再度GCが走ってパフォーマンスを悪くするということでした。Effective Java 第2版には

ファイナライザの使用には深刻なパフォーマンスのペナルティがあります。私のマシンでは、単純なオブジェクトを生成して開放するのに要する時間は約5.6ナノ秒です。ファイナライザを実装すると、その時間は2,400ナノ秒に増加します。つまり…

と記載されていますが、理由までは書かれていませんでした。ちなみに、同書では、ファイナライザを使用する正当な理由はネイティブメソッドを委譲しているオブジェクトの開放の時と、明示的終了を呼び出した時の「安全ネット」の2種類のみとのことです。安全ネットを取るべきか、パフォーマンスを取るべきかで迷うところです。AutoCloserが導入されたJDK7ではその必要も低下しているでしょう。

The Future of JavaScript in the JDK

実は個人的に2日間で一番聞きたいセッションでした。Project Nashornとは、JDK6よりバンドルされているRhinoというJVM上のJavaScript実装を、再実装するというプロジェクトがJDK8に向けて動いているというようです。

このブログでも、ここでちょっと触れさせてもらいました http://d.hatena.ne.jp/s-ishigami/20111203/p1

発表の概要は、

  • JDK6からJVM上のJavaScriptが提供され、JavaからJavaScriptが動かせるし、そのJavaScriptからJavaクラスが使え、メソッドのoverrideもできる
  • InvokeDynamicの導入を受けてJVM8搭載の実装としてRhinoをリプレースしてNashornを開発中
  • Nashornはオープンソース化してOpenJDKプロジェクトに取り込まれる予定(時期は不明)
  • まだ非公開だけど、オープンソース化したらみんな試せる
  • Node.jsをポーティングしてJVM上でNodeのアプリケーションが動くようにしたよ!
  • Node on NashornではJavaのクラスも参照できる!

淡々とした発表なのに内容はすごく熱くないっすか!Java APIが使えるNode使ってみたい><;

こんなのは僕だけかもしれませんが、僕はJavaAPI大好きっ子で、ちょっとしたスクリプトを書くときは Rhinoスクリプトを jrunscript コマンドで書いています。JDKが入っているすべてのマシンでどのOSでも使い慣れたJavaAPIでスクリプトがかけて便利なんです。心配なのは、それらの資源がNashornでも使えるかってことで、終了後に時間があったので発表者のAkhil Arora氏に、たどたどしい英語で質問チャレンジしてきました。

Do scripts written for Rhino run on Nashorn perfectly?
(ここで「えっ?」というような反応をされたので)
I'm afraid my scripts for rhino don't run after JDK8.

というようなことを言ったのですが、話しながら、自分はBe動詞で話し始めたのか、一般動詞で話し始めたのか、単数形だったか複数形だったか、中学生レベルの文法で頭の中が混乱して、「a..Are,,Do,,,,Does, no Do ....(゚∀゚)アヒャ 」という感じでした。motto eikaiwa benkyo shinaito dame desune!

答えは

Yes, it "shuold" be run!

でした。望みの解答が得られても"Thank you" しか言えないのも情けないですねえ。

ひとまず、これからも安心してRhino(→Nashorn)用scriptを書いて行けそうです。

それから早くJVM上のNode書いてみたいなー。

自分が参加しなかったセッション

今回は勤務先の会社の後輩S氏と一緒に参加してきました。彼に聞いたところ、JavaFXのセッションが全般的に熱いみたいです。やはり動く技術は楽しそうですね!彼にはJavaEEハンズオンを受けてもらってきたので、今後自社に最新標準技術を業務に取り入れてくれるよう動いてくれることを期待します。

飲み会とか

1日目の後の飲み会に参加してきました。大阪など全国からJava好きのエンジニアの方が集まっていてすごいです!普段TLの中でしか会えない有名な方と飲むことができたなんて、後輩S氏の口癖を借りれば「最高です!」

失礼ながら、皆さんリアルだと普通のおっさんでしたw
見た目おっさんなのに中身はすごいレベルの高いエンジニアが集まっている。
すごいエンジニアだけどお酒を飲むおっさんズ
Java One Tokyoすごいです。楽しいです。なんか Java One に参加していない人も結構いたみたいですが(笑)

結論

わあい JavaOne あ○り JavaOne だいすき!

PostgreSQL で LANケーブルが抜けた場合にConnectionを破棄する方法

TomcatでWebアプリを開発していてDBとの接続はコネクションプーリングを行なっています。コネクションプーリングをしているとはいえ、何らかの原因でConnectionが使い物にならない場合は、再接続をするために、Connection取得時に以下のようなSQLを投げて死活チェックを行なっています。

select 1

ところが、例えばDBサーバへのLANケーブルが抜けた場合、このSQLをいつまでも実行してしまい、結果的にConnectionPoolからの取得待ち行列がたまり、Tomcatのスレッドを消費してDBが不要なサービスにまで影響を及ぼしてしまうという問題があります。

その問題が発生しないように、クエリにタイムアウトを施したいと思い、まずは以下のようにしてみました。

Statement stmt = connection.createStatement();
stmt.setQueryTimeout(1);

ところがこの方法は上手くいきません。

Method setQueryTimeout(int) is not yet implemented.

などのように言われてしまいます。実装されていないのか?(なぜ?)それでは、タイマーを用意して横からcancelをさせることを考えました。

final Statement stmt = connection.createStatement();
Runnable canceler = new Runnable() {
    public void run() {
        try {
            stmt.cancel();
        } catch (SQLException e) {
            // I can do nothing :)
        }
    }
};
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(canceler, 500, TimeUnit.MILLISECONDS);

この方法は上手くいきませんでした。なにせLANケーブルが抜けているのでcancelすら到達しないようです。

それでは、逆の発想で、別スレッドでテストをさせて、メインのスレッドはjoinをして、制限時間を過ぎればスルーして終了する実装にしてみましょう。

final Statement stmt = connection.createStatement();
class Checker implements Runnable {
    boolean succeeded = false;
    public void run() {
        try {
            try {
                stmt.execute("SELECT 1");
                succeeded = true;
            } finally {
                stmt.close();
            }
        } catch (SQLException e) {
            // I can do nothing :)
        }
    }
}
Checker checker = new Checker();
Thread thread = new Thread(checker);
thread.start();
try {
    thread.join(1000);
} catch (InterruptedException e) {
   // i can do nothing :)
}
return !checker.succeeded;

この方法でとりあえず何とかしましたが、これでもなんだかcheckerのスレッドを消費しそうなのと毎回スレッド生成するので遅くなりそうですね……。背に腹は変えられないということか?

GWTでJavaプログラミングをはじめよう!

Java アドベントカレンダー2011 31日目です。

みんな大晦日だよ!僕が子供の頃は青いネコ型ロボットが出るアニメが特番をやるのが楽しみでした。「こんなことできたらいいな」と思って「叶えてくれる」と言ったら、「はい、Java言語」ということで子供たちの夢を叶えるプログラミングを今Javaで入門したらどうなるのかを試みてみようと思います。

Javaを使ったプログラミングってどんなことが一般的に行われているでしょうか?

  • JavaEEベースのWebアプリ
  • Androidアプリ
  • 黒画面でHelloWorld
  • Applet(……忘れましょう)

Webアプリ開発は現時点で大変実用的な分野ではありますが、これを最低限でもこなすためには「HTML」「HTTP」「JavaScript」「CSS」「JSP」「XML」やら各種フレームワークやら、覚えることがたくさんありすぎて、大変であることが経験上わかりました。

Androidアプリは僕はよくわからないので、今回はスルーします(ぉぃ)

黒い画面でHelloWorldとかソートをひたすら作っていくのは王道ですよね?遅かれ早かれこうした環境で勉強するのは必要だと僕も思っています。が、いきなりそこから入って多くの挫折した人々を見ていますし、昔DelphiやVBのようなものから入った軟弱者としては、最初から「びじゅある」な夢を見させてもらってもいいじゃないかと思います。

さて、作ったものを人に配布できないとモチベーションがぐっと下がります。そんなわけで、スタンドアロンアプリケーションでは不利です。やはりWeb関連が便利です。Google App Engineのようなプラットフォームにデプロイするだけでいきなり全世界に配信できる楽さは利用しない手はないでしょう。GAEにデプロイするならEclipseにGoogleプラグインを入れると手っ取り早いです。

何を隠そう、Google App Engineがリリースされたばかりの日、僕もGAEを触ってみようとしてアカウントを取得しましたが、Eclipseプラグインをインストールしてアプリケーションを作り始めて「すげーww簡単じゃん」と感激して作っていたのはGAE関係なく、単なるGWTのアプリケーションでした(^^;

ということで、今回は、これからプログラミングを覚える人に、GWTを勧めたらどうなるでしょうか?まずは自分が入門者になったつもりでアプリを作ってみます!

開発環境を整える

まずは開発環境を整えなければいけません。Snow Leopard以前のMacなら最初からJava入ってるよねーで済んだのですが、いまだとえっと、ここに詳しく書いてあるみたいです。

「JDKをMacOSX Lionにインストール」- 三十路SE(みそじシステムエンジニア)日記

Windowsの人はOracleの公式サイトからインストーラをダウンロードできるので、そこからインストールするといいでしょう。
http://www.java.com/ja/download/help/download_options.xml

次にEclipseのインストールと、GAEのアカウント作成がありますが、人の記事に助けていただきます。

「Google App Engine (for Java) の開発環境構築」 - Tech Booster

さらに、GAE for Javaでの開発はとりあえず、Slim3を使ったほうが便利です。このページを真似してみましょう。

「開発環境の構築‎ > ‎Slim3 Plugin for Eclipse」- Slim3room

さて、他人のふんどしを履いて光速で開発環境が整ったということで、早速最初のプログラムを作ってみようと思います。

画像を表示してみよう

まずはSlim3プロジェクトを作成します。この時Use Google Web Toolkitというのを選びます。

せっかくなら、HelloWorldではなくて、画像を表示しましょう。まず絵を書いて、Eclipseのここにドラッグアンドドロップします。

そして、Main.javaというコードをこのようなコードを書き変えましょう。

Main.java

package com.example.nekogata.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.RootPanel;
public class Main implements EntryPoint {
    public void onModuleLoad() {
        Image image = new Image("nekogata.png");
        RootPanel.get().add(image);
    }
}

そうしたら実行の右三角ボタンを押せば早速プログラムを動かすことができます。

と、ここまで書いて挫折しました。さらりと書いていますが、ChromeのGWTプラグインが不安定だったり、プラグインのインストールで手こずったり、コンパイルで手こずったりするうちにざっと2時間も経過してしまいました。年の瀬で忙しいので嫁に呼ばれてしまったので、ここから先は年内はあきらめます。年明けに気が向いたら続きを書きます。

ちなみに、本当はボタンを押したら画像がON/OFFしたりはしようとしました。

結論

GWTでプログラミング入門はまだ無謀かもorz
開発環境ががが…………

追記 (12/31 22:00)

このままではあんまりなので、カウントダウン時計を作ってみました。ちゃんと動くのかはわかりませんが……

package com.example.nekogata.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;

public class Main implements EntryPoint {

    public void onModuleLoad() {
    final long newYearTime = DateTimeFormat
        .getFormat("yyyy/MM/dd")
        .parse("2012/01/01")
        .getTime();
    final Image image = new Image("nekogata.png");
    final Image image2 = new Image("nekogata2.png");
    final Label label = new Label();
    RootPanel.get().add(label);
    RootPanel.get().add(image);
    RootPanel.get().add(image2);
    image2.setVisible(false);
    Timer timer = new Timer() {
        @Override
        public void run() {
        long now = System.currentTimeMillis();
        long rest = newYearTime - now;
        if (rest > 0) {
            label.setText("新年まであと" + rest / 1000 + "秒");
        } else {
            label.setText("A Happy New Year !!");
            image.setVisible(!image.isVisible());
            image2.setVisible(!image2.isVisible());
        }
        }
    };
    timer.scheduleRepeating(100);
    }
}

http://gwtnewyear2012.appspot.com/

きっと、ちゃんと動くよ!うん、GWT簡単ですね!コーディングが直感的で気持ちいいよ!><

さらに追記 (12/31 22:30)

調子に乗ってこんなボタンを作ってみた。
http://2.gwtnewyear2012.appspot.com/
やっぱりGWT面白いよ!!いいよ!

それでは皆さん良いお年を〜