あけましておめでとうございます(^^)
あけましておめでとうございます。
本年もマイペースでのんびり更新してまいりますのでよろしくお願いします。
昨年は大晦日の紅白歌合戦に矢沢永吉さんこと永ちゃんがサプライズ出演して本当にびっくりしました。
うれしいサプライズでした。
2010年もうれしいサプライズがある年であったらいいなぁって思ってます。
2010年もハッピーな一年にするぞ!!
あけましておめでとうございます。
本年もマイペースでのんびり更新してまいりますのでよろしくお願いします。
昨年は大晦日の紅白歌合戦に矢沢永吉さんこと永ちゃんがサプライズ出演して本当にびっくりしました。
うれしいサプライズでした。
2010年もうれしいサプライズがある年であったらいいなぁって思ってます。
2010年もハッピーな一年にするぞ!!
今日は大晦日です。
残すところあと僅かな時間となりました。
大きな怪我や病気をせずに終われそうでなによりです。
2010年はどんな年にしたいかと考えてみたけど特になにも浮かばない(><)
とりあえず家族全員が健康で平凡に過ごせればいいなぁって思ってます。
買うだけ買ってほったらかしにしていた Windows 7 64bit をメイン PC にインストールした。
Vista のほうが安定していて使いやすい(><)
7 は印刷プレビューを表示する時に GPU が停止してしまいます。
画面が黒くなって何回か点滅をしたあと通知領域に GPU カーネルがどうたらと吹き出しが出ます。
なんとかフリーズせずに使えてますが今現在のところ Vista より良いところはみあたりませんね・・・
本当の意味で無駄遣いをしてしまったかもしれないw
12月の初旬にリリースされた 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 フレームワークについての情報はネット上にも少し流れていますので興味のあるかたはググってみてくださいね。
大切なことを忘れてました。
ノーマルのマージソートとのパフォーマンスの比較はまだしていませんので気になる方は比較してみてください。(爆
世の中不況になったときに企業の派遣切りが問題視されていました。
もちろん私が勤める会社も例外ではありませんでした。
ワークシェアリングとか言ってみんなの雇用を守るために一人一人の仕事量を減らしてでも乗り切ろうとしていた。
ところがマスコミが派遣切りのことを話題にしなくなったとたんいっきに協力社員や再雇用(OB)社員の方々を解雇しました。
その分、仕事が増え、残業とサービス残業も増え、以前に増して忙しくなってます。
個人的に収入は以前と変わらないくらいになりましたが景気回復の兆しが見られないこの現状では喜べません。
ましてや会社を辞めざるを得なくなった仲間のことを思うとなおさらです。
ワークシェアリングというシステムは素敵なシステムだったがどうやらマスコミ対策のためにいやいや導入したのかと思ってしまいます。
政権が変わったけどあまり期待できないと思うのは私だけだろうか・・・?
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 って表示されるんですね。
初めて知りました。
おまけがついてますけど浮動小数点数演算って癖があるので微妙・・・(^^;;;
無限ループ文の作り方にはいろいろなものがありますが最近知った素敵な無限ループ文を個人的に覚え書きしておきます。
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 の最小値になってます。
普通このような無限ループを使う人はいないと思うので素敵ですね!
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の効果が高い領域を優先的に開放するので、アプリケーションの停止時間を大幅に減少できる。
パフォーマンスアップが期待されますね。
とりあえず今からダウンロードしてインストールすることにします。
スマスマに永ちゃんが出演するので録画した。
それを今日見たけど飯食ってトークしてるだけじゃん!
一曲くらい歌ってくれるのかと最後までみたけど歌ってくれなかった。
4年ぶりのアルバムは今度の休みにでも買いに行こう。
もう一度ロックンロール・アーミーツアーやってくれないかなぁ・・・
歳が歳だから無理だろう・・・
でもキャパが1500人程度の小さなステージでも来てくれた時はうれしかった!
一番前の席は取れなかったが前から6列目のセンターでしっかり楽しませてもらった。
それ以来テレビでしか見てないなぁ・・・
WOWOW でやってた100回目の武道館はしゃれが効いててよかった。
やっぱ、永ちゃんは最高!