Archive for the ‘Java’ Category

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 タグ: ,
 

無限大

金曜日, 8 月 21st, 2009

Java でも無限大を定義することができます。

ちょっとそれを試してみました。

なぜかって?

今まで無限大を使ったことがないからです。(^^;

 

package infinity2;

public class Main {

    private static final double i = Double.POSITIVE_INFINITY;
    private static final double j = Double.NEGATIVE_INFINITY;
    private static final double k = 1.0e40;

    public static void main(String[] args) {
        if (i == i + 1) {
            System.out.println(“無限大 ” + i);
        }
        if (j == j – 1) {
            System.out.println(“無限小 ” + j);
        }
        if (k == k + 1) {
            System.out.println(“1.0e40 に1を足しても ” + k);
        }
        System.out.println(“ulp = ” + Math.ulp(k));
        System.out.println(“最も近い浮動小数点数 ” + Math.nextUp(k));
    }
}

 

このプログラムの実行結果は下記のとおりです。

無限大 Infinity
無限小 -Infinity
1.0e40 に1を足しても 1.0E40
ulp = 1.2089258196146292E24
最も近い浮動小数点数 1.0000000000000002E40

 

無限大や無限小って英語で Infinity , -Infinity って表示されるんですね。

初めて知りました。

おまけがついてますけど浮動小数点数演算って癖があるので微妙・・・(^^;;;

Hatena タグ:

素敵な無限ループ

木曜日, 8 月 20th, 2009

無限ループ文の作り方にはいろいろなものがありますが最近知った素敵な無限ループ文を個人的に覚え書きしておきます。

package infinity;

public class Main {

    public static void main(String[] args) {
        int count = 0;
        // 素敵な無限ループ
        for(int i = 0; i <= Integer.MAX_VALUE; i++)
            if (i == Integer.MAX_VALUE)
                // 無限ループになるトリックの答え
                System.out.println(“Integer.MAX_VALUE + 1 = ” + (i + 1));
            count++;
        System.out.println(count);
    }
}

無限ループがあるので標準出力に変数 count の値は表示されません。

無限ループの中で int の最大値の時に 1 を足した時の値を表示させてます。

Integer.MAX_VALUE + 1 = -2147483648

これで解るように int の最小値になってます。

普通このような無限ループを使う人はいないと思うので素敵ですね!

Hatena タグ:

JDK 6 Update 15 がリリースされてます

木曜日, 8 月 6th, 2009

JDK 6 Update 15 がリリースされてます。

Windows 7 、Internet Explorer 8、Windows Vista SP2 などのサポートをしているようです。

G1 ガベージコレクタも含まれているようです。

この G1 ガベージコレクタ と言うものはいったい何なのでしょう?

調べてみたところ Garbage-Firstガーベージコレクタ 略のようです。

名前からして早そうですね。

今までのガベージコレクタは 世代別GC と呼ばれるものでヒープ領域を物理的に二つのYoung領域とOld領域(Tenured領域)に分けて管理しています。

それに対してG1 ガベージコレクタ はヒープ領域は一つです!

その一つだけ用意された領域の中でいくつかをYoung領域とし、残りをOld領域として利用してます。

詳しくは Java SE 6 Update 14のEarly Access公開、G1ガーベージコレクタが利用可能に をご覧ください。

これによって、全ヒープ領域に対して常にフルGCを実施するのではなくGCの効果が高い領域を優先的に開放するので、アプリケーションの停止時間を大幅に減少できる。

パフォーマンスアップが期待されますね。

とりあえず今からダウンロードしてインストールすることにします。

Hatena タグ:

Java One 2009 Return of the Puzzlers 間違った(><)

木曜日, 6 月 25th, 2009

こちらのサイトに Java One 2009 Puzzlers が紹介されていたので考えてみました。

問題はこちら

1

解答はなかったので念の為に(どっからくるんだその自信)プログラムを実行して確認してみました。

おお!なんと間違ってました。orz

やはり、私は未熟者です!

Hatena タグ:

JDK 7 ならこう?

金曜日, 6 月 19th, 2009

ちょっと勉強になるブログを発見した。

http://d.hatena.ne.jp/bleis-tift/20090616/1245134308

http://d.hatena.ne.jp/shin/20090618/p2

ついでに以前試した JDK 7 の walkFileTree を使ったチュートリアルをもとにゴニョゴニョしてみた。

特定ディレクトリ以下の列挙 ということなので見栄えは良くないが JDK 7 ならこんなのもありかな?

import java.io.IOException;
import java.nio.file.FileRef;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;

public class Find {

    public static class Finder implements FileVisitor {

        private final PathMatcher matcher;

        Finder(String pattern) {
            matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);
        }

        void find(Path file) {
            if (matcher.matches(file.getName())) {
                System.out.format("%s%n", file);
            }
        }

        @Override
        public FileVisitResult preVisitDirectory(FileRef dir) {
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult preVisitDirectoryFailed(FileRef dir, IOException exc) {
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(FileRef file, BasicFileAttributes attrs) {
            find((Path) file);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(FileRef file, IOException exc) {
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult postVisitDirectory(FileRef dir, IOException exc) {
            return FileVisitResult.CONTINUE;
        }
    }

    public static void main(String[] args) {
        Path searchDir = Paths.get("C:\\ターゲットディレクトリ");
        String pattern = "*";
        EnumSet<FileVisitOption> opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
        Finder finder = new Finder(pattern);
        Files.walkFileTree(searchDir, opts, Integer.MAX_VALUE, finder);

    }
}

基本的に間違っていたらごめんさない。

素人のやることだから笑ってゆるしてね(^^;

追記 List<String> result に格納するのがポイントだったのかな?

Hatena タグ: