Archive for the ‘Java’ Category
JDK7 build 107
月曜日, 8 月 30th, 2010NetBeans 6.9 をインストールしてみた
日曜日, 6 月 20th, 2010先日リリースされた NetBeans 6.9 をインストールしてみた。
せっかくだから Java チュートリアルのサンプルを実行してみた。
試したチュートリアルは Watching a Directory for Changes です。
以下の環境で試したのですがちゃんと実行されました。
しかし、バーチャルコンピュータ上で動かしているせいか実行結果が・・・
そして、出力ウィンドウのフォントを大きくしようとしたところポップアップメニューがつぶれてました。
これはゲスト OS がサポート外なので NetBeans の問題ではないでしょう。
実機での確認はできないのでそういうことにします。(ヲヒ
で、同じプログラムを Windows Vist で実行すると
全然 OK です!
ちなみにルートディレクトリに適当にディレクトリを作成したりリネームしたり削除したりしてます。
今回のバージョンアップでは日本人にとっては大きな問題であった IME 変換時の勝手なスクロールは直ってます。
そして何より私のような未熟者にとってはヒントが増えてさらに賢くなったエディタは大歓迎です(^^)
JavaEE のほうでは CDI がサポートされましたね。
たしか WebBeans とか言われてたものですよね。
新技術への対応の早さはさすがです。
やっぱり NetBeans 最高です!
型推論が使える?
水曜日, 3 月 31st, 2010JColorChooser が豪華になってる
金曜日, 2 月 26th, 2010deepEquals
土曜日, 2 月 6th, 2010今日、ネットサーフィン(死語)してて、面白そうな記事を見つけたのでさっそく試してみました。
ネタもとは英語だったので詳しく理解することはできなかった。
コードの切れ端と読めない英語をながめてみました。
私はこれを見てすぐに自信を持って答えることはできませんでした(><)
まぁ・・・永遠の初心者ですからしかたないです。
けど気になるので下記のようなシンプルなコードを書いて実行してみました。
24行目からの if 文の処理結果はよく知られた結果となることは間違いないでしょう。
29行目からの if 文の処理結果が気になります。
実行結果だけ確認するのもあれなので、NetBeans を使ってるのだからウォッチポイントを設定してデバッグ実行してみました。
変数 a,b,c,d をウォッチポイントとして違いを確認してみました。
変数 c,d は一段階深い所に Object 型の配列の中に Object 型配列の変数が格納され一段階深くなってます。
素人考えでは一段階深くなったところで同じじゃないの?って思ってしまいます。
そこで29行目にブレークポイントを仕掛けてステップ実行させてみました。
下のコードの2392行目で引っかかるようですね。
念のために実行結果はこうなります。
たぶん Java プログラマなら知ってて当然ってことでしょうがこんなこと考えたことがなかったので新鮮でした。
NetBeans の優秀なデバッガをこんなことに使う私って・・・幸せ者だ(^^;
JDK 7 の Switch 文を試してみる
火曜日, 2 月 2nd, 2010Play!
月曜日, 1 月 25th, 2010CodeZine の記事で Java で動く軽量フレームワーク Play! が紹介されていた。
なにげに見てたら NetBeans プロジェクトとして取り込むことができるとあった。
Play! がどういったものかは CodeZine の記事をご覧いただくとして、記事をもとに NetBeans で動かしてみた。
まず、コマンドプロンプトで Web アプリケーションを作成します。
次に NetBeans プロジェクトとして取り込めるようにします。
これで NetBeans プロジェクトとして取り込めるはず。 たぶん・・・
では、取り込んでみます。
プロジェクト構成は下図のようになってます。
test パッケージがエラーとなってます。
未使用のインポートがあるようです。
何故かは調べてないので解りませんが無視するか、指示にしたがって未使用のインポートを削除でとりあえずエラーはなくなります。
プロジェクトが実行できるか確認します。
無事にプログラムが実行されました。
ブラウザで確認します。
ついでだから記事のとおりプログラムを変更してみました。
いつもの NetBeans での使い勝手の良さがこれでも一緒ですね。
で、ちょっとだけ触ってみただけなのですが・・・
NetBeans プロジェクトとして取り込んで何が便利なのかな?って考えてみた。
賢いエディタ機能が使える!
これくらいしか思い浮かばない(><)
ForkJoin を NetBeans 6.8 で試してみた
月曜日, 12 月 21st, 200912月の初旬にリリースされた NetBeans 6.8 を使って JDK 7 に組み入れられる予定の ForkJoin フレームワークを試してみました。
Fork Jion フレームワークの情報は日本語でも少しありましたのでネット上の情報を元に英語の API ドキュメントをちらちら見ながら適当にプログラムを組んでみました。
素人の私がそういう状況で作ったので間違いがあるかもしれないの見つけられた方は優しく解りやすく間違いを正してくれることを望みます。(^^;
まず、JDK 7 build 77 をインストールして NetBeans 6.8 でそれを使えるようにします。(現在は build 78 が最新です)
Java プラットフォームマネージャーにて JDK 7 を登録します。
メニューバーの [ ツール ] から [ Java プラットフォーム ] をクリックして表示される画面の指示に従って入力していきます。
プラットフォーム名は自分の好みでつけてかまいません。
以上で NetBeans 6.8 でターゲット JDK を JDK 7 build77 にすることが簡単にできます。
新規プロジェクトを作成したらデフォルトがターゲット JDK と異なってる場合はプロジェクトのプロパティで Java プラットフォームを変更できます。
先ほど登録した JDK 7 build 77 が利用可能になってますのでそれを選択します。
また、下のほうに「ソース / バイナリ形式」 に JDK 7 が選択可能となりますのでそれを選択します。
以上のようにして下図のようなプロジェクト構成のサンプルプログラムを作ってみました。
分割統治型アルゴリズムで有名なマージソートです。
ちなみに JDK 6 ではこのマージソートアルゴリズムが使われているらしいです。
この JDK 7 build 77 からは java.util.Arraysクラスの定義されている基本データ型の配列のソートは、Dual Pivot Quicksortを呼び出すように書き換えられています。
参照型の配列の場合には、TimSortですので、Java 7ではソートのアルゴリズムが新しくなります。
と ForkJoin フレームワークの情報を探していたときにみつけました。(余計な情報><
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っつ起動されているのかは謎です。(こういう仕様なのか?)
では、生成されるワーカースレッド数を変更してみます。
int nThreads = Runtime.getRuntime().availableProcessors();
nThreads = 1;
ForkJoinPool pool = new ForkJoinPool(nThreads);
このようにワーカースレッド数を1に変更してみました。
次に 2に変更
4の場合
ちゃんと指定した数のワーカースレッドが生成されるようですね。
ついでにプロファイラの CPU でアプリケーションのパフォーマンスを調べてみようとしたところ
見れなかった(><)
ヒープを大きくしても変わらず・・・ なんでだろう?
JDK 7 に標準搭載予定の ForkJoin フレームワークについての情報はネット上にも少し流れていますので興味のあるかたはググってみてくださいね。
大切なことを忘れてました。
ノーマルのマージソートとのパフォーマンスの比較はまだしていませんので気になる方は比較してみてください。(爆
無限大
金曜日, 8 月 21st, 2009Java でも無限大を定義することができます。
ちょっとそれを試してみました。
なぜかって?
今まで無限大を使ったことがないからです。(^^;
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 って表示されるんですね。
初めて知りました。
おまけがついてますけど浮動小数点数演算って癖があるので微妙・・・(^^;;;
