Archive for the ‘Java’ Category

軽い気持ちで JOGL

月曜日, 10 月 11th, 2010

最近 3D テレビの CM を見かけますね。

PC の CM でも 3D が売りになっていたり時代はついに 3D に突入してって感じです。

そこで Java でも 3D ってありなんだろうか?

Java 3D ってのが拡張ライブラリで用意されていて安定リリース版が 1.5.2 で開発版が 1.6.x で使えるようです。

注意 Java による 3D は 3D テレビのように飛び出して見えるような技術のことではありません。

でも 3D のプログラミングって複雑で難しそうなので今回は NetBeans に JOGL のプラグインがあるようなのでそれを入れてサンプルを動かしてみることにします。

これなら JOGL のプラグインを入れるだけでお手軽に Java で 3D プログラミングを楽しめるでしょう。

NetBeans OpenGL Pack をダウンロードし、適当な所に解凍します。

[ ツール ] → [ プラグイン ] でプラグインのウィンドウを表示させます。

そして [ ダウンロード済み ] タブを選択します。

さきほどダウンロードした NetBeans OpenGL Pack のファイルを選択し [ 開く ] ボタンを押します。

 

1

 

次のようにプラグインの追加が表示されます。

[ インストール ] ボタンを押します。

2

 

このような警告が出てインストールができない場合があります。

3

 

NetBeans OpenGL Pack のダウンロードページに下記のような書き込みがあります。

4

 

どうやら NetBeans のバージョンによって発生する不具合のようです。

NetBeans 6.7 では良さそうなので(未確認) 6.7 を使うかそれ以降の新しいバージョンを使う場合は問題の発生する GLSL editor のインストールだけ外すしかなさそうですね(><)

エディタライブラリのバージョン見てると警告文が矛盾していて問題なさそうに思えるのが不思議だけど気にしない(ヲヒ

私は NetBeans 6.9.1 を使用しているので今回の趣旨(お手軽)にそって GLSL editor のインストールだけ外して続行しました。

5

 

インストーラの指示に従い [ 次へ ] ボタンを押します。

6

 

ライセンス契約を読んで問題が無ければ [ すべてのライセンス契約条件に同意する ] チェックボックスにチェックを入れ [ インストール ] ボタンを押します。

7

 

証明書の検査で警告が出ます。

問題なければ自己責任において [ 続行 ] ボタンを押します。

8

 

無事にインストールが完了すればインストーラが再起動を促します。

[ 完了 ] ボタンを押し NetBeans を再起動します。

9

 

NetBeans を再起動させたら NetBeans OpenGL Pack がちゃんとインストールされたか確認しましょう。

[ ファイル ] → [ 新規プロジェクト ] を選択し、新規プロジェクトウィンドウを表示させます。

Java カテゴリのプロジェクトの項目に JOGL プロジェクトが確認できます。

10

 

私は JOGL の知識は無いのでサンプルプロジェクトを実行して動作確認します。

11

 

新規プロジェクト画面が表示されますので必要事項を入力します。

platform と言う項目がちょっと気になりますが・・・・・

とりあえずデフォルトのまま実行します。

12

 

プロジェクトを構築して実行してみたところ無事に動きました!

NetBeans の NetBeans OpenGL Pack プラグインを使えば JOGL をダウンロードしてインストールするという面倒なことをしなくてもいいようですね(^^)

13

 

ちなみに JOGL のバージョンは 1.1.1a のようです。

せっかく JOGL がお手軽に楽しめる環境が整ったので時間があれば

「OpenGLを使ってJavaでも3Dを楽しもう」

を参考にして流行の 3d を楽しめればいいなぁとおもってます。

Hatena タグ: ,,

Automatic Resource Management

月曜日, 8 月 30th, 2010

JDK7 に ARM(Automatic Resource Management) がはいったようだ。

今までこのようにリソースの解放処理をしていた。

3

それがなんと次のように簡略化できるようです。

4

調子にのってマルチキャッチも

5

ううっ・・

何か間違ってるのか?

それともまだ使えないのか?

まぁ、ARM だけでも楽になるから歓迎です。(^^)

Hatena タグ: ,

JDK7 build 107

月曜日, 8 月 30th, 2010

これって洒落ですか?

マジですか?

0

Hatena タグ: ,

NetBeans 6.9 をインストールしてみた

日曜日, 6 月 20th, 2010

先日リリースされた NetBeans 6.9 をインストールしてみた。

せっかくだから Java チュートリアルのサンプルを実行してみた。

試したチュートリアルは Watching a Directory for Changes です。

以下の環境で試したのですがちゃんと実行されました。

3

しかし、バーチャルコンピュータ上で動かしているせいか実行結果が・・・

そして、出力ウィンドウのフォントを大きくしようとしたところポップアップメニューがつぶれてました。

これはゲスト OS がサポート外なので NetBeans の問題ではないでしょう。

実機での確認はできないのでそういうことにします。(ヲヒ

2

で、同じプログラムを Windows Vist で実行すると

4

全然 OK です!

ちなみにルートディレクトリに適当にディレクトリを作成したりリネームしたり削除したりしてます。

今回のバージョンアップでは日本人にとっては大きな問題であった IME 変換時の勝手なスクロールは直ってます。

そして何より私のような未熟者にとってはヒントが増えてさらに賢くなったエディタは大歓迎です(^^)

JavaEE のほうでは CDI がサポートされましたね。

たしか WebBeans とか言われてたものですよね。

新技術への対応の早さはさすがです。

やっぱり NetBeans 最高です!

Hatena タグ: ,

型推論が使える?

水曜日, 3 月 31st, 2010

NetBeans 6.9 Dev で JDK7 で採用される機能の一つを試してみました。

JDK 6 では下記のようなコードはエラーとなります。

0

しかし、JDK 7 では OK なんですねぇ~

1

とりあえず、NetBeans でエラーが出なくて実行もできたことを確認!

Hatena タグ: ,

JColorChooser が豪華になってる

金曜日, 2 月 26th, 2010

JDK7 では JColorChooser が豪華になってる。

NetBeans 6.9 Dev 版で JColorChooser を GUI ビルダーにて貼り付けると変化に気づかないけど実行すると

1

なんと!

2

3

豪華になってますね(^^)

なんで今頃このような機能が追加されたのかは謎です。

 

[ 追記 ] 2010/03/08

NetBeans を JDK 7 で動かすようにしたら GUI ビルダーでも豪華になった JColorChooser で表示されました。

Hatena タグ: ,,

deepEquals

土曜日, 2 月 6th, 2010

今日、ネットサーフィン(死語)してて、面白そうな記事を見つけたのでさっそく試してみました。

ネタもとは英語だったので詳しく理解することはできなかった。

コードの切れ端と読めない英語をながめてみました。

私はこれを見てすぐに自信を持って答えることはできませんでした(><)

まぁ・・・永遠の初心者ですからしかたないです。

けど気になるので下記のようなシンプルなコードを書いて実行してみました。

24行目からの if 文の処理結果はよく知られた結果となることは間違いないでしょう。

29行目からの if 文の処理結果が気になります。

1

実行結果だけ確認するのもあれなので、NetBeans を使ってるのだからウォッチポイントを設定してデバッグ実行してみました。

変数 a,b,c,d をウォッチポイントとして違いを確認してみました。

2

変数 c,d は一段階深い所に Object 型の配列の中に Object 型配列の変数が格納され一段階深くなってます。

素人考えでは一段階深くなったところで同じじゃないの?って思ってしまいます。

3

そこで29行目にブレークポイントを仕掛けてステップ実行させてみました。

下のコードの2392行目で引っかかるようですね。

4

念のために実行結果はこうなります。

5

たぶん Java プログラマなら知ってて当然ってことでしょうがこんなこと考えたことがなかったので新鮮でした。

NetBeans の優秀なデバッガをこんなことに使う私って・・・幸せ者だ(^^;

Hatena タグ: ,

JDK 7 の Switch 文を試してみる

火曜日, 2 月 2nd, 2010

JDK 7 で変更のはいる Switch 文を試してみました。

JDK 6 ではエラーとなります。

1

ターゲット JDK を JDK 7 に変更します。

 2

プロジェクトをビルドします。

なにやらビルドエラーが出てますが NetBeans 6.9 の Dev 版を使っているので気にしない(いいのか!

3

プロジェクトを実行します。

ちゃんと String 型で Switch 文の制御ができてますね(^^)

素晴らしい!!

4

Hatena タグ: ,,

Play!

月曜日, 1 月 25th, 2010

CodeZine の記事で Java で動く軽量フレームワーク Play! が紹介されていた。

なにげに見てたら NetBeans プロジェクトとして取り込むことができるとあった。

Play! がどういったものかは CodeZine の記事をご覧いただくとして、記事をもとに NetBeans で動かしてみた。

まず、コマンドプロンプトで Web アプリケーションを作成します。

11

次に NetBeans プロジェクトとして取り込めるようにします。

13

これで NetBeans プロジェクトとして取り込めるはず。 たぶん・・・

では、取り込んでみます。

14

プロジェクト構成は下図のようになってます。

test パッケージがエラーとなってます。

未使用のインポートがあるようです。

何故かは調べてないので解りませんが無視するか、指示にしたがって未使用のインポートを削除でとりあえずエラーはなくなります。

16

プロジェクトが実行できるか確認します。

無事にプログラムが実行されました。

17

ブラウザで確認します。

18

ついでだから記事のとおりプログラムを変更してみました。

いつもの NetBeans での使い勝手の良さがこれでも一緒ですね。

19 20

で、ちょっとだけ触ってみただけなのですが・・・

NetBeans プロジェクトとして取り込んで何が便利なのかな?って考えてみた。

賢いエディタ機能が使える!

これくらいしか思い浮かばない(><)

Hatena タグ: ,

ForkJoin を NetBeans 6.8 で試してみた

月曜日, 12 月 21st, 2009

12月の初旬にリリースされた NetBeans 6.8 を使って JDK 7 に組み入れられる予定の ForkJoin フレームワークを試してみました。

Fork Jion フレームワークの情報は日本語でも少しありましたのでネット上の情報を元に英語の API ドキュメントをちらちら見ながら適当にプログラムを組んでみました。

素人の私がそういう状況で作ったので間違いがあるかもしれないの見つけられた方は優しく解りやすく間違いを正してくれることを望みます。(^^;

まず、JDK 7 build 77 をインストールして NetBeans 6.8 でそれを使えるようにします。(現在は build 78 が最新です)

Java プラットフォームマネージャーにて JDK 7 を登録します。

メニューバーの [ ツール ] から [ Java プラットフォーム ] をクリックして表示される画面の指示に従って入力していきます。

1

プラットフォーム名は自分の好みでつけてかまいません。

2

以上で NetBeans 6.8 でターゲット JDK を JDK 7 build77 にすることが簡単にできます。

新規プロジェクトを作成したらデフォルトがターゲット JDK と異なってる場合はプロジェクトのプロパティで Java プラットフォームを変更できます。

先ほど登録した JDK 7 build 77 が利用可能になってますのでそれを選択します。

3

また、下のほうに「ソース / バイナリ形式」 に JDK 7 が選択可能となりますのでそれを選択します。

4

以上のようにして下図のようなプロジェクト構成のサンプルプログラムを作ってみました。

分割統治型アルゴリズムで有名なマージソートです。

ちなみに JDK 6 ではこのマージソートアルゴリズムが使われているらしいです。

この JDK 7 build 77 からは java.util.Arraysクラスの定義されている基本データ型の配列のソートは、Dual Pivot Quicksortを呼び出すように書き換えられています。

参照型の配列の場合には、TimSortですので、Java 7ではソートのアルゴリズムが新しくなります。

と ForkJoin フレームワークの情報を探していたときにみつけました。(余計な情報><

5

RandomNumber2009.RandomNumber.java 

package RandomNumber2009;

import java.util.Random;

public class RandomNumber {

    private final int[] number = new int[300000];

    public RandomNumber() {
        Random generator = new Random(1982);
        for (int i = 0; i < number.length; i++) {
            number[i] = generator.nextInt(300000);
        }
    }

    public int[] getNumber() {
        return number;
    }
}
 
forkjointest.MergeSort.java

package forkjointest;

import java.util.Arrays;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

public class MergeSort {

    public int[] sort(int[] number) {
        int nThreads = Runtime.getRuntime().availableProcessors();
        ForkJoinPool pool = new ForkJoinPool(nThreads);
        SortImpl sort = new SortImpl(number);
        pool.invoke(sort);
        return sort.result;
    }

    private class SortImpl extends RecursiveAction {

        private int[] number;
        private int[] result;

        SortImpl(int[] number) {
            this.number = number;
        }

        @Override
        protected void compute() {
            if ((number.length < 5)) {
                result = Arrays.copyOf(number, number.length);
                Arrays.sort(result, 0, result.length);
            } else {
                int midpoint = number.length / 2;
                int[] left = Arrays.copyOfRange(number, 0, midpoint);
                int[] right = Arrays.copyOfRange(number, midpoint, number.length);
                SortImpl task1 = new SortImpl(left);
                SortImpl task2 = new SortImpl(right);
                invokeAll(task1, task2);
                left = task1.result;
                right = task2.result;
                merge(left, right, number);
                result = number;
            }
        }

        private void merge(int[] left, int[] right, int[] number) {
            int i = 0, j = 0;
            while (i < left.length || j < right.length) {
                if (j >= right.length || (i < left.length && left[i] < right[j])) {
                    number[i + j] = left[i];
                    i++;
                } else {
                    number[i + j] = right[j];
                    j++;
                }
            }
        }
    }
}
forkjointest.Main.java

package forkjointest;

import RandomNumber2009.RandomNumber;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        RandomNumber test = new RandomNumber();
        int[] beforeNumber = test.getNumber();
        System.out.println("Before");
        System.out.println(Arrays.toString(beforeNumber));
        MergeSort ms = new MergeSort();
        int[] result = ms.sort(beforeNumber);
        System.out.println("After");
        System.out.println(Arrays.toString(result));
    }
}
このプロジェクトを構築し、実行させると無事に動きました。
さて、ここで本当に並列化しているか確認してみます。
プロファイラを接続して ForkJoinPool のワーカースレッドが起動しているか?
プロファイラによると起動されてますね。
実行中から待機状態になり新たに4っつのワーカースレッドがありますね。
ちなみに CPU コア数は 8個なので8つのワーカースレッドが作成されます。
実行が終了し待機状態になってなんで新たにスレッドが4っつ起動されているのかは謎です。(こういう仕様なのか?)
7 
では、生成されるワーカースレッド数を変更してみます。
        int nThreads = Runtime.getRuntime().availableProcessors();
        nThreads = 1;
        ForkJoinPool pool = new ForkJoinPool(nThreads);
このようにワーカースレッド数を1に変更してみました。
8 
次に 2に変更
9 
4の場合
10 
ちゃんと指定した数のワーカースレッドが生成されるようですね。
ついでにプロファイラの CPU でアプリケーションのパフォーマンスを調べてみようとしたところ
見れなかった(><)
ヒープを大きくしても変わらず・・・ なんでだろう?
12 
JDK 7 に標準搭載予定の ForkJoin フレームワークについての情報はネット上にも少し流れていますので興味のあるかたはググってみてくださいね。
大切なことを忘れてました。
ノーマルのマージソートとのパフォーマンスの比較はまだしていませんので気になる方は比較してみてください。(爆
download-netbeans-125x125 
Hatena タグ: ,