Java

Java8 時代の素数の求め方

Java

「創るJava」 の著者である、きしださんが「Java8時代の文字列連結まとめ」という面白い記事を書いてくれた。

文字列連結だと Java8 での Stream API でコネコネしても感動的な結果は得られず残念な結果となった。

つまり文字列連結は今まで通りのほうが速いよってことのようです。

さて、それではあまりにも Java8 の Stream API が可愛そうなので Stream API 威力を発揮するようなプログラムを組んでみます。

といっても簡単でシンプルなものにします。

みんな大好き素数を表示させるプログラムです。

素数と言えばエラトステネスの篩だと誰もが思うのですが、それは無かったことにしてください。( ̄。 ̄;)

それでは一番シンプルで Java8 じゃないプログラムを組んでみました。

このプログラムは 32,000,000 までの自然数に素数がいくつあるか検出し、その処理時間を計測しています。

ちなみに検出された素数はコメントアウトしてある部分を解除すれば表示されます。

それでは気になる処理時間は次のようにけっこう時間かかってます。(>_<。)

1973815個の素数を検出しました。
0時間2分53秒40869402600000626

それではこのプログラムを現代的に並行処理させてみます。

これも Java8 じゃないプログラムです。

そう、Executor を使って平行処理プログラムを組んでみました。

実はこのプログラムは随分前に Executor の学習にネットで見つけたサンプルをほぼいただいてます。

こういうのは思いつかなかったなぁ・・・

で、きっと処理時間が短縮されているだろうと予想される結果は次のとおりです。

1973815個の素数を検出しました。
0時間0分14秒2449762050000004

おおっ! 凄いぞ! さすが Java5 の主役の Executor だ!

ついでだから NetBeans のプロファイラでのスレッドと CPU を貼っておきます。

PrimeNumber4Executor

ex1

 

さて、そろそろ古き時代のコードは見飽きた頃合いになってきましたね。

Java8 時代の素数を求めるプログラムを組んでみました。

凄くシンプルで Java5 時代の Executor より綺麗です!

それに Java8 に慣れるとこちらの方がソースコードの可読性が良いと思うようになります。

さぁ、Java8 時代の素数を求めるコードの処理速度はどうなんだ!?

1973815個の素数を検出しました。
0時間0分3秒5042672730000004

なんと! Executor 使って並行処理してプログラムより5倍近く高速に処理されてます!

ParallelStream 使いどころを誤らなければ凄く幸せになれそうな気がする。

このプログラムは parallel() メソッドをちょこっと書くだけでなんと並行処理をしてくれます。

内部でJava7 の主役? として活躍した Fork/Join Framework が使われています。

こちらもついでにスレッドと CPU のプロファイル画像を貼っておきます。

Fork/Join Framework が使われているのが確認できますね。

PrimeNumber4ParallelStream

PPS1

 

この Java8 時代のプログラムですが 20 行目の parallel() メソッドをコメントアウトして

シーケンシャル処理させると処理時間は次のようになりました。

1973815個の素数を検出しました。
0時間0分49秒009503713000000857

一番最初に紹介した古いプログラムよりかは高速ですね。でも。遅いよね。

ちなみにスレッドモニターでシーケンシャル処理されていることが確認できます。

PrimeNumber4NonParallelStream

 

文字列連結では Java8 時代のプログラムは残念な結果となったけど素数検出プログラムでは本領発揮といったところですね!

最後に、Java8 凄い!(^_^)

Hatena タグ:

お年玉キャンペーン 当たったよ(^_^)

General Java

OTN Newsletter のお年玉キャンペーンに何気に応募していた。

すっかり忘れていたのですが(当たると思っていなかった)昨日怪しげな白い包みが届いていた。

なんだろうと思っていたが PC の調子が悪く、そちらの修理におわれていた。

やっと一段落ついたので怪しげな白い包みを開けてきたところ Duke の T シャツが入っていた。

白い包みには小さな赤い文字で ORACLE と書かれていた。

やっとお年玉キャンペーンで当たったんだなと理解した。^_^;

このところ、ベビースターラーメンのメガタオル、パン屋さんのキャンペーンでの食パンをイメージした座椅子、

KitKat の Nexus7 と応募していたがことごとく外れた。

このお年玉は凄くうれしい!

今年はこれを着てドヤ顔で夏を楽しもう!

4

5

Oracle さん、ありがとう (^_^)

Hatena タグ:

JDK9 の Windows 8.1 64bit での Build

Java

ちまたでは先日リリースされた Java SE 8 で盛り上がってます。

Java SE 8 は革新的な変革をとげ、多くの Java デベロッパに愛されるでしょう。

さて、今日はせっかちな人の為に・・・と言いつつ新しい物好きの私は Windows 環境での OpenJDK  JDK9 の構築に挑戦してみました。

あくまで洒落です!

OpenJDK の Build Infrastructure Group のページにはまだ JDK9 のBuild ドキュメントはアップされてないようです。

それで私は、JDK8 のビルドガイドを参考に駄目元で試してみました。

ビルドに必要なツールを準備します。

Windows SDK for Windows 7.1

Microsoft VisualC++ 2010 Express

Cygwin (64 bit)

make

freetype

Ant

Java SE 8

以上です。

ダウンロードしたプログラムのなかには圧縮されたものもありますからお好みの解凍ツールをご用意くださいませ。

まず、Java SE 8 と Ant をインストールします。

そして、Path を設定します。

次に Windows SDK for Windows 7.1 をインストールします。

1

 

そして次は、Microsoft VisualC++ 2010 Express をインストールします。

2

 

では次に、Cygwin (64 bit) をインストールします。

3

 

インストールの途中で Cygwin にインストールするプログラムを選択します。

下記のものをインストールするようにビルドガイドにはあります。

ar.exe
Devel
binutils
The GNU assembler, linker and binary utilities

make.exe
Devel
make
The GNU version of the ‘make’ utility built for CYGWIN

m4.exe
Interpreters
m4
GNU implementation of the traditional Unix macro processor

cpio.exe
Utils
cpio
A program to manage archives of files

gawk.exe
Utils
awk
Pattern-directed scanning and processing language

file.exe
Utils
file
Determines file type using ‘magic’ numbers

zip.exe
Archive
zip
Package and compress (archive) files

unzip.exe
Archive
unzip
Extract compressed files in a ZIP archive

free.exe
System
procps
Display amount of free and used memory in the system

 

私の環境では Windows OS 側の Mercurial が正しく動作せず、Cygwin に Mercurial をインストールすることで回避できました。

33

 

Cygwin のインストールには 自国の ftp サーバーを選んでも少し時間がかかるので小休憩をします。(^_^;)

Cygwin のインストールが終わったら次は make を展開配備します。

その前にビルド作業用のディレクトリを作成しておきましょう。

今回私は、C ドライブ直下に OpenJDK と言う名前のディレクトリを作りました。

そこに make を展開配備してください。

OpenJDK ディレクトリ内に、make-3-82 と言う名前のディレクトリが作成されその中にファイルが納められていれば OK です。

ディレクトリの名前は make のバージョンによって変わります。

次に同様に freetype を OpenJDK ディレクトリ内に展開配備します。

OpenJDK ディレクトリ内に freetype が展開配備されたら OK です。

それでは先ほど展開配備した make をインストールしましょう。

Cygwin を起動します。

スクリーンショットを撮り忘れたのですがターミナルウィンドウが表示されます。

次のようにコマンドを打ち込みます。

cd /cygdrive/c/OpenJDK/make-3-82

make-3-82 ディレクトリまで移動したら次のようにコマンドを打ち込みます。

./configure

そして最後に

make

これで make のインストールは完了です。

さて、次は freetype ライブラリを作ります。

Cygwin ターミナルで

cd /cygdrive/c/OpenJDK/freetype

とコマンドを打ち込み freetype ディレクトリまで移動します。

そして

./configure

と打ち込みます。

ここでついでにこれから作成するライブラリを格納するディレクトリを作成しておきます。

mkdir lib

と打ち込めば freetype ディレクトリの中に lib ディレクトリが作成されます。

それでは freetype ライブラリを作りましょう。

C:\OpenJDK\freetype\builds\win32\vc2010\freetype.vcxproj をダブルクリックして VisualC++ Express 2010 を起動させます。

そして、ソリューションエクスプローラーの中にある freetype を右クリックしてコンテキストメニューを表示させ、プロパティをクリックします。

11

 

プロパティページが表示されます。

12

 

これを次のように編集していきます。

アクティブ ソリューションプラットホームを新規作成します。

13

 

新しいプラットホームの名前を x64 と入力します。

14

 

構成を Release Multithreaded に変更します。

15

 

もう一度構成マネージャーを表示させます。

16

 

このようになります。

これを編集していきます。

まず、全般を編集します。

17

 

出力ディレクトリを編集します。

18

 

19

 

中間ディレクトリを編集します。

20

 

ターゲット名を編集します。

21

 

プラットフォーム ツールセットを Windows7.1SDK に変更します。

22

 

このように全般の編集を終えます。

23

 

それでは freetype を右クリックして表示されたコンテキストメニューでビルドをクリックします。

24

 

出力に freetype.lib が作成されたことが確認できます。

25

 

もう一度プロパティページを表示させ、プロジェクトの規定値の構成の種類を変更します。

ダイナミック ライブラリ(.dll)に変更します。

26

 

27

 

もう一度 freetype をビルドします。

出力に freetype.dll ができたことが確認できます。

28

 

freetype.lib と freetype.dll を配備します。

Cygwin ターミナルを起動して下記コマンドを入力します。

cd /cygdrive/c/OpenJDK/freetype/objs/win64/vc2010

そして

cp -R freetype.dll freetype.lib /cygdrive/c/OpenJDK/freetype/lib

これで配備完了です。

Linux 環境だとこんな面倒なことはしなくていいのですが・・・

Windows 環境だと非常に面倒です!

でも、後はお気楽に作業できます。

それでは JDK9 をビルドする作業ディレクトリを作成します。

Cygwin ターミナルを起動して下記コマンドを入力します。

cd /cygdrive/C/OpenJDK/

そして MyJDK9 というディレクトリをそこに作ります。

mkdir MyJDK9

これで準備完了です。

Mercurial でソースをダウンロードしてビルドするだけです。

今回ソースはこちらのリポジトリよりダウンロードしてきました。

http://hg.openjdk.java.net/jdk9/dev

これとは別に http://hg.openjdk.java.net/jdk9/jdk9 もあるようですが試していません。

それでは Cygwin ターミナルを起動して下記コマンドを入力します。

hg clone http://hg.openjdk.java.net/jdk9/dev MyJDK9

53

 

そして、Mercurial でダウンロードしたファイルを使用してソースをダウンロードします。

cd MyJDK9

MyJDK9 ディレクトリへ移動したら get_source.sh を実行してソースを取得します。

これは通信環境にもよりますが時間がかかるのでコーヒータイムとします。^_^;

55

56

57

 

コーヒータイムの間にソースのダウンロードは済んだようですね。

では make する(ビルドする)ために Configure を実行しなくてはいけません。

Cygwin ターミナルで MyJDK9 ディレクトリに移動します。(既にそこにいるなら必要ないです)

cd /cygdrive/C/OpenJDK/MyJDK9

そして、make と freetype のオプションを設定して実行します。

./configure MAKE=/cygdrive/C/OpenJDK/make-3-82/make.exe with_freetype=/cygdrive/C/OpenJDK/freetype

58

59

 

最後に make を実行してビルド完了となります。

make all

これも時間がかかるのでコーヒーのおかわりをします。( ̄▽ ̄;)

61

 

これで終わりです。

ちょっと確認してみましょう。

cd build/windows-x86_64-normal-server-release/images/j2sdk-image と入力して移動します。

63

 

そして bin/java –version と打ち込みます。

openjdk version “1.9.0-internal”  … と表示され完了です。

64

 

念には念をで Windows のコマンドプロンプトでも確認してみました。

65

 

さらに本当に動くのか試してみた。

NetBeans IDE 8.0 を OpenJDK9 で動かしてみた。

71

 

Hello World は動くことを確認しました。

JavaFX は無いような・・・残念!

と言うことで近い将来正式なビルドガイドがリリースされ、ビルド方法も変わると思うのであくまで洒落でってことで!

ところで Java 9 の注目の新機能って Project Jigsaw の他に何かあったっけ?

 

Hatena タグ:

Java8 の Date & Time API ではまった。

Java

日経ソフトウェア4月号の「至極の Java クイズ」で JSR310 の問題がでていた。

知らない内容が鍵となっていてとても勉強になった。

しかし、それにもかかわらずはまってしまった。

ここでクイズです。

下記プログラムを実行するとどうなるでしょうか?

1.2014-03-03

2.2014-3-03

3.2014-3-3

4.実行時エラー

解りましたでしょうか?

 

このプログラムは DateTimeFormatter でパターンを設定し、ResolverStyle を設定しただけのシンプルなものですね。

LocalDate d = LocalDate.parse(“2014/3/03”, DateTimeFormatter.ofPattern(“yyyy/M/d”)
                .withResolverStyle(ResolverStyle.STRICT));

この問題の答えは 4.実行時エラーです。

Exception in thread “main” java.time.format.DateTimeParseException: Text ‘2014/03/10’ could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {YearOfEra=2014, MonthOfYear=3, DayOfMonth=10},ISO of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1919)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1854)
    at java.time.LocalDate.parse(LocalDate.java:400)
    at jp.yucchi.localdateparsetest.LocalDateParseTest.main(LocalDateParseTest.java:15)
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {YearOfEra=2014, MonthOfYear=3, DayOfMonth=10},ISO of type java.time.format.Parsed
    at java.time.LocalDate.from(LocalDate.java:368)
    at java.time.LocalDate$$Lambda$7/980546781.queryFrom(Unknown Source)
    at java.time.format.Parsed.query(Parsed.java:226)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1850)
    … 2 more

 

ResolverStyle.LENIENT もしくは ResolverStyle.SMART だと 2014-03-03 と表示されます。

何故、ResolverStyle.STRICT だとエラーになるか解りますか?

エラーメッセージを読んでピンッてきたかたもいると思います。

ResolverStyle.STRICT は厳密に判定を下すので DateTimeFormatter.ofPattern(“yyyy/M/d”) の y をきっちり解釈してしまうのです。

ここでパターン設定に使われている y は year-of-era となっています。

これがエラーを引き起こす原因です。

じゃあどうすればいいかというと u を使えばいいのです。

u は year なので厳密に判断される場合でも全然問題ないのです。

よって、このプログラムを正しく動作させるには

LocalDate d = LocalDate.parse(“2014/3/03”, DateTimeFormatter.ofPattern(“uuuu/M/d”)
                .withResolverStyle(ResolverStyle.STRICT));

と DateTimeFormatter.ofPattern(“yyyy/M/d”) を DateTimeFormatter.ofPattern(“uuuu/M/d”) としてあげればいいのです。

よく見かけるサンプルは DateTimeFormatter.ofPattern(“yyyy/M/d”) となっているのが多いので注意が必要ですね。(^_^)

Hatena タグ:

JJUGイベント 「祝☆Java 8 Launch」

Java

昨日、東京で JJUGイベント 「祝☆Java 8 Launch」が開催された。

私は仕事で参加出来なかったが(休日でも東京まで行く元気は無いかも(^_^;) YouTube にその模様がアップされているので保存用に貼っておきます。

途中まで見かけたのですが昨日は YouTube が非常に重くあきらめました。

笑っていいともに安倍首相が出演したらしくその影響だったのかな?

ちなみに今の日本の総理大臣が安倍さんだって昨日知りました。( ̄。 ̄;)

アベノミクスって安倍首相からもじって名付けられたとか・・・ やっと納得!

政治にあまり興味がないのと NEWS もほとんど見ないので ← 非国民です!

さて、どうでもいいことはほっといて動画をどうぞ!

 

祝 Java SE 8 正式リリース

 

祝☆Java 8 Launch – 徹底解説!Project Lambdaのすべて リターンズ 吉田 真也 @bitter_fox #jjug

 

祝☆Java 8 Launch – Brand new Date and Time API 蓮沼 賢志 @khasunuma #jjug

 

祝☆Java 8 Launch – null書いたら負け!Java8コーディング作法 @kis #jjug

祝☆Java 8 Launch JavaFX – GUI by Illusion @skrb #jjug

 

祝☆Java 8 Launch from old Java to modern Java – reloaded @cero_t #jjug

 

祝☆Java 8 Launch – Raspberry Pi on Java ショートアップデート #jjug @masafumiohta

 

まだほとんど見てないのでこれからゆっくり見る!

凄く楽しそうな雰囲気が十分に伝わってくる!

JJUG の録画スタッフのかたはじめ、みなさまに感謝感激です!

Java 最高! (^_^)

Hatena タグ:

« 古い記事 新しい記事 »