home ホーム search 検索 -  login ログイン  | help ヘルプ

find 検索

281 - 290 / 1320    [|<]  [|<]  [<]  21  22  23  24  25  26  27  28  29  30   [>]  [>|][>|]
タイトル/名前 更新者 更新日
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
ソート項目 / ソート順     1ページ 件ずつ表示

Java/UUID生成メモ  

所有者: msakamoto-sf    作成日: 2013-07-14 11:56:34
カテゴリ: Java 

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で確認):

参考資料:



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2013-07-14 12:03:03
md5:7afff5910ab5ece13da83100149e7e89
sha1:03789d7c60b4e293172fe5e9c89ea4a3ba1293c9

Java/Maven3/JUnit, Spock, TestNGを同時実行する  

所有者: msakamoto-sf    作成日: 2013-07-13 22:14:14
カテゴリ: JUnit Java Maven Spock TestNG 

Maven3で、JUnit, Spock, TestNG それぞれのテストケースを同時実行するサンプルを作成しました。

ビルドの仕方や参考URLはREADME.mdに書いてありますのでそちらを参照してください。

Gradleで同時実行させる設定は Groovy/Gradle/JUnit, Spock, TestNGを同時実行する を参照してください。

ポイントとなる部分だけ説明します。

  • Spockのテストケース = JUnitのテストケースなので、"JUnitのテストケースとTestNGのテストケースを同時に実行するには" という視点から調査する必要がありました。
  • 上記に加え、JUnit, TestNGについてはJavaとGroovyそれぞれでテストケースを記述しました。
    • JUnit : Java, Groovy, TestNG : Java, Groovy, Spokc : Groovyのみ、の計5パターンが同時に実行されます。
  • "pom-another-solution.xml"は2011 - 2012頃のWeb記事を参考にしてmaven-surefire-pluginをカスタマイズしています。
    • JUnit, TestNGのレポートを分離するよう調整しています。
  • "pom.xml"は2013年に改めて調べたWeb記事を参考にしてmaven-surefire-pluginをカスタマイズしています。
    • こちらは、JUnitとTestNGのレポートを混ぜてしまっています。
  • なお、"同時に実行"とは題していますが、実体は、JUnit系とTestNG系のsurefireがそれぞれ"test"ゴールで順繰りに実行されているだけです。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2013-07-13 22:49:04
md5:ef1cc199ea17b11ee4ecde915a676aaf
sha1:1c199906db97290d6946a3b732831243766a00ba

Groovy/Gradle/JUnit, Spock, TestNGを同時実行する  

所有者: msakamoto-sf    作成日: 2013-07-13 22:23:42
カテゴリ: Groovy JUnit Spock TestNG 

Gradle1.6で、JUnit, Spock, TestNG それぞれのテストケースを同時実行するサンプルを作成しました。

ビルドの仕方や参考URLはREADME.mdに書いてありますのでそちらを参照してください。

Maven3で同時実行させる設定は Java/Maven3/JUnit, Spock, TestNGを同時実行する を参照してください。

ポイントとなる部分だけ説明します。

  • Spockのテストケース = JUnitのテストケースなので、"JUnitのテストケースとTestNGのテストケースを同時に実行するには" という視点から調査する必要がありました。
  • 上記に加え、JUnit, TestNGについてはJavaとGroovyそれぞれでテストケースを記述しました。
    • JUnit : Java, Groovy, TestNG : Java, Groovy, Spokc : Groovyのみ、の計5パターンが同時に実行されます。
  • なお、"同時に実行"とは題していますが、実体は、TestNG用に"Test"タスクを拡張したタスクをもう一つ定義して、デフォルトでJUnitが動作する"test"タスクがそれに依存するように調整しています。そのため、厳密には「同時」ではなく、2つのタスクが順繰りに実行されているだけです。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2013-07-13 22:48:55
md5:99acc0c38fedf45269d623513733baf7
sha1:8eb479e3fddd5617f8cec18f41f58c9c23832f53

技術/TDD/TestNG/ReportNG  

所有者: msakamoto-sf    作成日: 2013-07-13 22:40:11
カテゴリ: TDD TestNG 

TestNGのレポート出力をよりわかりやすくしよう、というMaven/Ant/Gradleなどビルドツールに組み込んで使うライブラリ。

かなり面白そうではあるのだけれど、プロジェクトが依存してるTestNGのバージョンが若干古かったり、Maven系のリポジトリの反映まで若干タイムラグがあったり、なぜかGoogleのGuiceの依存性を手動で追加する必要があったり、Issuesに結構ポロポロと嵌りそうな問題が残ってたりと、不安にさせられる要素が多い感じ。

もうちょっと様子見かな・・・。

2013-07時点で1.1.4.



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2013-07-13 22:42:53
md5:59248a074ebd303da44fa3c6aaa31028
sha1:125c78b93ee68f50884959420482ab17f8a5c377

技術/TDD/TestNG/Groovyでテストメソッドを書く時の注意点  

所有者: msakamoto-sf    作成日: 2013-07-13 22:31:53
カテゴリ: Groovy TDD TestNG 

誤:

@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 にて確認。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2013-07-13 22:34:50
md5:47032ebece2ab98fba87b80b8b6f8b83
sha1:06fe1eb128ce81cb5697d6689040ce1733361565

Java/Collections/Hash, Linked, Treeの違い  

所有者: msakamoto-sf    作成日: 2013-07-07 18:04:05
カテゴリ: Java 

Javaプログラミングに10年近く携わっていて、今までまじめにHashMap/TreeMap/LinkedHashMapの違いを勉強したことがなかったので、簡単にまとめてみました。Oracle JDK 1.7.0.25 のソースも参照しています。
なお、あんまり学術的に突っ込んで調べてないので、話半分程度に考えて、正確な情報についてはJDKのJavaDocやソースコードを参照してください。

HashMap, HashSet

  • キーとなるオブジェクトのhashCode()をハッシュテーブルに振り分けて格納してく実装。
  • JDK 1.7.0.25の内部実装としては、hashCode()を元にして配列アクセス出来る"table"が用意されてる。配列アクセス=Javaの配列として用意されていて、どの配列要素にも一定のコスト(あんまり厳密に書いてないので、パフォーマンスというか感覚的な話)でアクセス出来る。hashCode()の計算量に引きずられるのかな?
  • デフォルトのコンストラクタではそれほど広大なハッシュテーブルを用意しているわけではなく、埋まり具合に応じて拡張・再構築される。一応、ハッシュテーブルの初期容量と、拡張・再構築を実施する埋まり具合を指定するコンストラクタも用意されている。
  • HashSetは内部的にはHashMapをそのまま使っていて、単に値としてダミーのオブジェクトを入れて、キーとしての操作だけをSetインターフェイスの実装として公開してるようです。

HashMapでput()にかかる時間、get()にかかる時間を見てみるサンプル:

  • https://github.com/msakamoto-sf/javasnack/blob/master/src/main/java/javasnack/snacks/perfs/map/PerfHashMapFinePutGet.java
    • put()では、最初から14回目位で若干時間がかかってます。バケット数16, スレッショルド 0.75 に設定してますので、多分ココらへんでハッシュテーブルの拡張と再構築が発生してると思われます。以降も、時々時間がかかるput()があります。
    • 全体傾向としてはput()もget()も大体コンスタントな計算量になってるようです。ただ、若干後ろの方にいくとハッシュテーブルのアクセス時間が伸びるのか、なんとなーく時間がかかり気味な感じもします。

TreeMap, TreeSet

  • 赤黒木・・・つまり平衡2分探索木の一種で、それを使ってソートされた状態でキー(と値)を保存出来る。
  • キーを指定する containsKey(), get(), put(), remove() メソッドは、使用されているアルゴリズムの特性から時間コストはlog(n)になる・・・つまり、平衡2分探索になりますよーということらしいです・・・。
  • やはり特徴としては、要素を追加すると自動的に自然順序 or コンストラクタで指定するComparatorによってソートされ、iteratorなどで要素を取り出すときもソートされた順序で取り出される点でしょうか。
  • 赤黒木の実装はそれなりに大変で、JDK 1.7.0.25 の内部実装でもコメント含めておよそ2,400行になっています。HashMapがおよそ1,100行ですから、その2倍のソースコードが必要になっています。
  • 内部の赤黒木に対して複雑な操作が必要になってくるため、要素の追加ではHashMapより計算量が多くなってしまっています。
  • HashSetと同様、TreeSetも内部的にはTreeMapを使っていて、単に値としてダミーのオブジェクトを入れて、キーとしての操作だけをSetインターフェイスの実装として公開してるようです。

参考:

TreeMapでput()にかかる時間、get()にかかる時間を見てみるサンプル:

LinkedHashMap, LinkedHashSet

  • HashMapですと、hashCode()を元に順番が並べ替えられてしまいますが、LinkedHashMapを使うと、要素を追加した順番で値を取り出すことが出来ます。
  • 仕掛けとしては要素(エントリ)に対して二重リンク・リストを保持しておき、Iteratorなどで取り出すときに二重リンク・リストを辿るようにしている。
  • なお、要素を追加した順序ではなく、要素に「アクセス」(get()含む)した順を保持するよう指定できるコンストラクタが提供されている。これを使うと、単にget()するだけでも、要素が入っていればアクセス順として内部のリンクリストの構成が更新される。
  • LinkHashSetについては、上と同様、LinkedHashMapを使って実現してます。

LinkedHashMapでput()にかかる時間、get()にかかる時間を見てみるサンプル:

Java配列, ArrayList, LinkedList

ちょっと脇道にそれますが、リスト管理の仕組みとしてJavaの配列, ArrayList, LinkedListを比べてみました。

Java配列のデモ:

ArrayListのデモ:

LinkedListのデモ:

  • https://github.com/msakamoto-sf/javasnack/blob/master/src/main/java/javasnack/snacks/perfs/list/PerfLinkedListFinePutGet.java
    • リンクリストによるListの実装になります。配列要素による管理はしてないため、初期容量がどうのこうのとか、容量が足りなくなった場合の拡張が~とかのコストがありません。そのため、put()の時間がかなりコンスタントになっています。
    • また、面白いのがget()の特性で、アクセスするindexが全体サイズで前から辿ったほうが速いか、後ろから辿ったほうが速いかチェックされています。そのため、0-499までのindexにアクセスしてみると真ん中の0 -> 250までは徐々に時間がかかってくるんですが、250 -> 499までは徐々に時間が減ってきてます。恐らく250以降になってくると、最後からたどっているためと思われます。

簡単なベンチマークプログラムを組んでみますと、HashMap/TreeMap/LinkedHashMapの実装による差異が目で見えるようになり、面白かったです。
今回は時間だけに着目したベンチマークプログラムを作ってみましたが、メモリ容量に着目してみるのも面白いかもしれません。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2013-07-07 18:05:06
md5:d7b15fe194475e8cc5e51f3eebb32644
sha1:cbdb8b500f614f638409f21752c5b654b8ea0a89

Java/Profile/VisualVMとIDEの連携(NetBeans他), 2013-07時点(JDK7前提)  

所有者: msakamoto-sf    作成日: 2013-07-06 13:42:14
カテゴリ: Java 

JDK7以降のみを対象として、2013年7月現在、JavaのProfile技法はどんな状況にあるのか、VisualVMとNetBeansをメインにざっくりと調べたメモです。
個人レベルでのプログラミングの勉強とか、お金ない環境でとりあえずJDKさえあればナントカなる、という状況を想定してるため、商用製品でどんなのがあるかまで調べてないです。
なお実際に試したのはJDK7(7.0.25), NetBeans 7.3.1です。

VisualVMとNetBeans

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入門:

リモートマシンのJVMのProfileについて

VisualVMの仕組みでは、リモートマシン上のJavaアプリをプロファイリングする機能はサポートされていないようです。JVMの監視についてはサポートされていますので、メモリ使用量やスレッドダンプなどについては取得出来るようです。

ただ、Googleで検索してみると"VisualVM remote profiling"で結構引っかかるんですよね・・・。監視レベルでのメモリとかスレッドダンプの取得も含めて"Profiling"と指しているのか、ヒープのダンプであったりメソッド単位でのCPU使用状況の監視なども含めているのか、良くわかりません。

なお、NetBeans6では、ターゲット側に特別なパッケージを導入することで、リモートのJVMに対してもヒープのダンプ取得や、メソッド単位でのProfilingが使えたようです。

VisualVMで粒度の細かいプロファイリングをリモートJVMに対して行う手法について、今回は調べきれませんでした。商用製品とかであれば対応してくれたりするのでしょうか・・・。

Eclipse, IntelliJ IDEAとの連携

Eclipseですと、"Eclipse TPTP"というプロジェクトがあって、こちらでプロファイリング機能が開発されているようです。

VisualVMとの連携ですが、いくつか専用のプラグインが開発されたりしているようです。

IntelliJ IDEAのPluginリポジトリで見つけた、プロファイリング系のPlugin:



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2013-07-06 13:42:49
md5:294e9ec1eb9786816474432a2aa15351
sha1:15540532054f972fa0b2637c70a43ee40c8adf1b

Java/JavaEE/Servlet含むJavaEE環境でのスレッド作成 or 非同期処理についてメモ(JavaEE6 - 7)  

所有者: msakamoto-sf    作成日: 2013-07-06 13:40:18
カテゴリ: Java 

EJBとかJMSのような実践的なJavaEEは今まで触らず、もっぱらServletプログラミングばかり触ってましたが、最近になって「新しいJavaEEでは非同期処理がサポートされた!」とか目にしまして、「アレ?JavaEE環境ってスレッド作成しちゃ駄目だったの?」と今頃になって気になり、ちょっと調べてみました。

結論

JavaEE7使おうぜ! or JavaEEコンテナ環境を当てにせず独自実装で頑張ろう!

  • JavaEE5以前 : 非推奨。
  • JavaEE6 : Servlet 3.0にて非同期処理に対応したので、スレッドっぽく使えそう。
  • JavaEE7 : EJB/JMS/Servletをサポートした、"Concurrency Utilities for JavaEE(JSR-236)"の導入により、正式にスレッド生成をサポート

JavaEE5以前

JavaEE5以前は、ServletやEJBなどJavaEE側でコンテナとして管理される仕組みではスレッドはなるべくコンテナ側で管理される仕組みを目指しているため、アプリ側で好き勝手にスレッド作るのは好ましくないようでした。JavaEE6になりServletで一部、非同期処理に対応したためスレッドっぽく使えるようになったようです。そのような状況でしたので、JavaEE7になり正式にスレッド生成をサポートするようになったのが、特にニュースになったようです。

「好ましくない」という言い方ですが、モノによっては「禁止」まで名言されてたりされてなかったりするようです。EJBだと以前の仕様では禁止と明記されてたり、Servletの仕様だと「好ましくない」にとどまってたり微妙に有耶無耶。ただ、あんまり「new Threadしたらコンテナ側からエラーで怒られた!」とかいう話は見当たらなかったので、コンテナ側のポリシー設定で禁止してるとかそういう話はみかけませんでした。(もしかしたら一部のJ2EEコンテナ製品ではそうした設定があったりして、単に検索で引っかからなかっただけかも)

理解した範囲で、技術的な背景を説明するなら、EJBにせよServletにせよ、スレッドローカルにコンテナ側で生成したオブジェクトを入れてる仕組みが多いようです。そのため、アプリ側で好き勝手に作られたスレッド中から、本来ならコンテナ側で管理してるオブジェクトを参照していたりすると、スレッドが動くタイミングではコンテナ側でクリアしていてNullPointerExceptionになってしまったりと、予測できない動きになってしまうケースがあるようです。
そのため、スレッドの作成をするのであればJavaEE環境の恩恵は受けられないことを前提として、必要なオブジェクトは自分たちでちゃんと引き継いで、スレッドの管理も含めて自分たちで面倒見てくださいね、何かあってもJavaEE側は知りませんよ、というスタンスみたいです。

分かりやすかった日本語解説ページ:

Servletの世界の場合ですと、ServletContextListener使うのが地雷回避っぽいですね。

stackoverflowでもチラホラトピックに挙がってました。

JavaEE6時代

JavaEE6に含まれた Servlet 3.0 において、非同期APIが導入されました。とはいえ、スレッド生成がサポートされた訳ではないようです。

JavaEE7になって

"Concurrency Utilities for JavaEE(JSR-236)"の導入により、正式にスレッド生成をサポート・・・つまり、JavaEEコンテナ側でスレッド管理されて、JavaEEコンテナ側で管理されてるリソースが生成されたスレッドから参照可能になる・・・ということでよろしいでしょうか・・・。
JSR-236とか目を通してないし、多分現場レベルでの情報が出てくるのはこれからだと思いますので、今日のところはここまで。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2013-07-06 13:40:48
md5:a97d9eae80e6c21664f0d9755008b812
sha1:86d6ea8bc2f7ce58ae1ef49bf169f585a20e5613

技術/MacOSX/ランチャーメモ(2013-07版)  

所有者: msakamoto-sf    作成日: 2013-07-06 13:38:40
カテゴリ: Apple 

OSXでのランチャーにどんなのがあるかメモ。(2013-07版)

まとめ:

Spotlightをランチャーとして使う:

"Alfred":

"Essentials":

"QuickSilver":

"LaunchBar":

変わり種:



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2013-07-06 13:39:40
md5:3456c79a8b2ab344cc74dacb6a1cf61f
sha1:fcd2ff61586571599a58824d154d814d47a96d97

日記/2012/11/11/h2dbでバイナリデータ出し入れメモ。  

所有者: msakamoto-sf    作成日: 2012-11-11 20:04:19
カテゴリ: Java 

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以降がいじられてしまってて、変。
とりあえずそれだけ。


プレーンテキスト形式でダウンロード
現在のバージョン : 2
更新者: msakamoto-sf
更新日: 2013-06-30 17:02:55
md5:fcb20caa25b3aa2f9ea3d1673921138a
sha1:62afbab4b2aa57c6fa6febda09da1905df31f7ea