タイトル/名前 | 更新者 | 更新日 |
---|---|---|
Java/UUID生成メモ | msakamoto-sf | 2013-07-14 12:03:03 |
Java/Maven3/JUnit, Spock, TestNGを同時実行する | msakamoto-sf | 2013-07-13 22:49:04 |
Groovy/Gradle/JUnit, Spock, TestNGを同時実行する | msakamoto-sf | 2013-07-13 22:48:55 |
技術/TDD/TestNG/ReportNG | msakamoto-sf | 2013-07-13 22:42:53 |
技術/TDD/TestNG/Groovyでテストメソッドを書く時の注意点 | msakamoto-sf | 2013-07-13 22:34:50 |
Java/Collections/Hash, Linked, Treeの違い | msakamoto-sf | 2013-07-07 18:05:06 |
Java/Profile/VisualVMとIDEの連携(NetBeans他), 2013-07時点(JDK7前提) | msakamoto-sf | 2013-07-06 13:42:49 |
Java/JavaEE/Servlet含むJavaEE環境でのスレッド作成 or 非同期処理についてメモ(JavaEE6 - 7) | msakamoto-sf | 2013-07-06 13:40:48 |
技術/MacOSX/ランチャーメモ(2013-07版) | msakamoto-sf | 2013-07-06 13:39:40 |
日記/2012/11/11/h2dbでバイナリデータ出し入れメモ。 | msakamoto-sf | 2013-06-30 17:02:55 |
JDK 1.5から追加された java.util.UUID を使うと、RFC4122で定義されたバージョン3(名前のMD5ベース)とバージョン4(乱数ベース)のUUIDを生成出来ます。また、生成はできませんが、他のシステムが生成したバージョン1(タイムスタンプベース)のUUIDを読み込んで、タイムスタンプやclock sequenceなど取り出すことも出来るようです。
バージョン3(名前のMD5ベース)の生成:
UUID u2 = UUID.nameUUIDFromBytes("abcdefg".getBytes());
バージョン4(乱数ベース)の生成:
UUID u1 = UUID.randomUUID();
toString()すると、以下の様な文字列が取得出来ます。
78290547-ddd6-4cf2-8fe4-7dd241da3061
サンプル(JDK 1.7で確認):
参考資料:
Maven3で、JUnit, Spock, TestNG それぞれのテストケースを同時実行するサンプルを作成しました。
ビルドの仕方や参考URLはREADME.mdに書いてありますのでそちらを参照してください。
Gradleで同時実行させる設定は Groovy/Gradle/JUnit, Spock, TestNGを同時実行する を参照してください。
ポイントとなる部分だけ説明します。
Gradle1.6で、JUnit, Spock, TestNG それぞれのテストケースを同時実行するサンプルを作成しました。
ビルドの仕方や参考URLはREADME.mdに書いてありますのでそちらを参照してください。
Maven3で同時実行させる設定は Java/Maven3/JUnit, Spock, TestNGを同時実行する を参照してください。
ポイントとなる部分だけ説明します。
TestNGのレポート出力をよりわかりやすくしよう、というMaven/Ant/Gradleなどビルドツールに組み込んで使うライブラリ。
かなり面白そうではあるのだけれど、プロジェクトが依存してるTestNGのバージョンが若干古かったり、Maven系のリポジトリの反映まで若干タイムラグがあったり、なぜかGoogleのGuiceの依存性を手動で追加する必要があったり、Issuesに結構ポロポロと嵌りそうな問題が残ってたりと、不安にさせられる要素が多い感じ。
もうちょっと様子見かな・・・。
2013-07時点で1.1.4.
誤:
@Test def this_method_will_be_ignored() { ... }
Groovyの
def method_name(...)
は
public Object method_name(...)
になるらしいです。TestNGは戻り値がvoidであるところまでチェックしてますので、戻り値がObjectのメソッドはテストメソッドとして実行されません。素直に"void"と指定しましょう。
正:
@Test void this_method_will_be_executed() { ... }
JDK7, TestNG 6.8 にて確認。
Javaプログラミングに10年近く携わっていて、今までまじめにHashMap/TreeMap/LinkedHashMapの違いを勉強したことがなかったので、簡単にまとめてみました。Oracle JDK 1.7.0.25 のソースも参照しています。
なお、あんまり学術的に突っ込んで調べてないので、話半分程度に考えて、正確な情報についてはJDKのJavaDocやソースコードを参照してください。
HashMapでput()にかかる時間、get()にかかる時間を見てみるサンプル:
参考:
TreeMapでput()にかかる時間、get()にかかる時間を見てみるサンプル:
LinkedHashMapでput()にかかる時間、get()にかかる時間を見てみるサンプル:
ちょっと脇道にそれますが、リスト管理の仕組みとしてJavaの配列, ArrayList, LinkedListを比べてみました。
Java配列のデモ:
ArrayListのデモ:
LinkedListのデモ:
簡単なベンチマークプログラムを組んでみますと、HashMap/TreeMap/LinkedHashMapの実装による差異が目で見えるようになり、面白かったです。
今回は時間だけに着目したベンチマークプログラムを作ってみましたが、メモリ容量に着目してみるのも面白いかもしれません。
JDK7以降のみを対象として、2013年7月現在、JavaのProfile技法はどんな状況にあるのか、VisualVMとNetBeansをメインにざっくりと調べたメモです。
個人レベルでのプログラミングの勉強とか、お金ない環境でとりあえずJDKさえあればナントカなる、という状況を想定してるため、商用製品でどんなのがあるかまで調べてないです。
なお実際に試したのはJDK7(7.0.25), NetBeans 7.3.1です。
JDK6の途中からVisualVMという機能がJDKに追加されまして、2013-07時点では今のところJDKさえあれば使えるProfile技法としてメジャーのようです。
元々NetBeansで開発されてた機能が、単体で切りだされたか何かで、とにかくJDK6の途中から使えるようになり、JDK7でも問題なく使えてNetBeansの皆さんどうもありがとうという感じです。
2008年と古めの記事:
JDK7でのVisualVMのドキュメントと、リモートのJVMにJMX接続する際の資料:
NetBeans 7.3.1 においては、NetBeansでProfiler機能を使う = VisualVMと同等+NetBeansでのソースコード参照の連携とか色々便利状態と考えて問題無さそうです。
入り口:
NetBeansを使ったProfiler入門:
VisualVMの仕組みでは、リモートマシン上のJavaアプリをプロファイリングする機能はサポートされていないようです。JVMの監視についてはサポートされていますので、メモリ使用量やスレッドダンプなどについては取得出来るようです。
ただ、Googleで検索してみると"VisualVM remote profiling"で結構引っかかるんですよね・・・。監視レベルでのメモリとかスレッドダンプの取得も含めて"Profiling"と指しているのか、ヒープのダンプであったりメソッド単位でのCPU使用状況の監視なども含めているのか、良くわかりません。
なお、NetBeans6では、ターゲット側に特別なパッケージを導入することで、リモートのJVMに対してもヒープのダンプ取得や、メソッド単位でのProfilingが使えたようです。
VisualVMで粒度の細かいプロファイリングをリモートJVMに対して行う手法について、今回は調べきれませんでした。商用製品とかであれば対応してくれたりするのでしょうか・・・。
Eclipseですと、"Eclipse TPTP"というプロジェクトがあって、こちらでプロファイリング機能が開発されているようです。
VisualVMとの連携ですが、いくつか専用のプラグインが開発されたりしているようです。
IntelliJ IDEAのPluginリポジトリで見つけた、プロファイリング系のPlugin:
EJBとかJMSのような実践的なJavaEEは今まで触らず、もっぱらServletプログラミングばかり触ってましたが、最近になって「新しいJavaEEでは非同期処理がサポートされた!」とか目にしまして、「アレ?JavaEE環境ってスレッド作成しちゃ駄目だったの?」と今頃になって気になり、ちょっと調べてみました。
JavaEE7使おうぜ! or JavaEEコンテナ環境を当てにせず独自実装で頑張ろう!
JavaEE5以前は、ServletやEJBなどJavaEE側でコンテナとして管理される仕組みではスレッドはなるべくコンテナ側で管理される仕組みを目指しているため、アプリ側で好き勝手にスレッド作るのは好ましくないようでした。JavaEE6になりServletで一部、非同期処理に対応したためスレッドっぽく使えるようになったようです。そのような状況でしたので、JavaEE7になり正式にスレッド生成をサポートするようになったのが、特にニュースになったようです。
「好ましくない」という言い方ですが、モノによっては「禁止」まで名言されてたりされてなかったりするようです。EJBだと以前の仕様では禁止と明記されてたり、Servletの仕様だと「好ましくない」にとどまってたり微妙に有耶無耶。ただ、あんまり「new Threadしたらコンテナ側からエラーで怒られた!」とかいう話は見当たらなかったので、コンテナ側のポリシー設定で禁止してるとかそういう話はみかけませんでした。(もしかしたら一部のJ2EEコンテナ製品ではそうした設定があったりして、単に検索で引っかからなかっただけかも)
理解した範囲で、技術的な背景を説明するなら、EJBにせよServletにせよ、スレッドローカルにコンテナ側で生成したオブジェクトを入れてる仕組みが多いようです。そのため、アプリ側で好き勝手に作られたスレッド中から、本来ならコンテナ側で管理してるオブジェクトを参照していたりすると、スレッドが動くタイミングではコンテナ側でクリアしていてNullPointerExceptionになってしまったりと、予測できない動きになってしまうケースがあるようです。
そのため、スレッドの作成をするのであればJavaEE環境の恩恵は受けられないことを前提として、必要なオブジェクトは自分たちでちゃんと引き継いで、スレッドの管理も含めて自分たちで面倒見てくださいね、何かあってもJavaEE側は知りませんよ、というスタンスみたいです。
分かりやすかった日本語解説ページ:
Servletの世界の場合ですと、ServletContextListener使うのが地雷回避っぽいですね。
stackoverflowでもチラホラトピックに挙がってました。
JavaEE6に含まれた Servlet 3.0 において、非同期APIが導入されました。とはいえ、スレッド生成がサポートされた訳ではないようです。
"Concurrency Utilities for JavaEE(JSR-236)"の導入により、正式にスレッド生成をサポート・・・つまり、JavaEEコンテナ側でスレッド管理されて、JavaEEコンテナ側で管理されてるリソースが生成されたスレッドから参照可能になる・・・ということでよろしいでしょうか・・・。
JSR-236とか目を通してないし、多分現場レベルでの情報が出てくるのはこれからだと思いますので、今日のところはここまで。
OSXでのランチャーにどんなのがあるかメモ。(2013-07版)
まとめ:
Spotlightをランチャーとして使う:
"Alfred":
"Essentials":
"QuickSilver":
"LaunchBar":
変わり種:
h2dbで、
varcharフィールドに 0x00 - 0xFF のlatin-1の文字列、
clobフィールドに同上、
blobフィールドにbyte[]そのまんま、
で出し入れしてみた実験コード:
https://github.com/msakamoto-sf/javasnack/blob/master/src/test/java/javasnack/testng1/h2/H2UsageDemo1Test.java
varcharはok, blobも当然ok, でもclobだとselectしてみるとなんか変なバイト列に 0x80以降がいじられてしまってて、変。
とりあえずそれだけ。