java

アサーション時、 ListのtoString()がObjectのtoString()っぽくなる

Listのアサーションを記述したとき、 java.lang.AssertionError: Expected: is <[1]> but: was <java.util.ArrayList@35ffcd64> の様にObjectのtoString()っぽい表記になることがあった. 原因は toString() 内部で NullPointerException が発生していたこと. この時、org.hamcrest.BaseDisc</java.util.arraylist@35ffcd64>…

Object#wait()に関連するテスト

タイムアウト可能な同期をとって処理を行うメソッドを定義するとき、うっかり時間単位間違えて使ってエンバグすることがある. private final Object mutex_ = new Object(); // モニタ private String value_; // ガードする変数 public void method0(long t…

NotificationBroadcasterSupportにExecutor

JMXの通知で使えるサポートクラス javax.management.NotificationBroadcasterSupport に、リスナ呼び出しをExecutorで行う機能がついていた. 適当な Executor を渡すと、リスナ毎に Executor の呼び出しを行うようになっていた. 未指定時はそのまま Runnable…

JMXの属性や操作に簡単にアクセスする

JMXの属性を取得したり操作を呼び出したりしようとすると非常に面倒. 属性の場合複合オブジェクトだとCompositeDataを再帰的に降っていかないといけないし、操作に関してはいちいちメソッドのシグネチャを特定しなければならない. この辺は型が分かっていれ…

Intellij IDEA javac オプション

Intellij IDEAでコンパイラのオプションにオプションをつけるには、 Settings -> Compiler -> Java Compiler -> Additional command line parameters に記載する. プロジェクトを開く前の Settings から設定すると Template project settings になるので、常…

Socketのバインド判定

java.net.Socket では isBound() でバインド済みか判定できる。java.nio.SocketChannel では getLocalAddress() の戻り値が null ならば未バインド、null でないならばバインド済み。ServerSocket と SocketChannel、DatagramSocket と DatagramChannel でも…

tail -f

GNUのtailが無い環境向けの、ファイル追記内容出力するツール。

Tyrus サンプル

JSR 356 - Java API for WebSocket のリファレンス実装である Project Tyrus のサンプルをクライアント付きで書き起こした。サーブレットコンテナは面倒なのでスタンドアロンモード。実際のものは ihiroky/tyrus-sample · GitHub に置いてあるので、下記引用…

符号付き Variable Byte Codes

ある値の付近を動くデータを符号化する必要があったので、Variable byte codes の符号付きを書いた。2の補数は用いず、マイナス0に相当する符号が null に対応させている。niotty/src/main/java/net/ihiroky/niotty/buffer/AbstractCodecBuffer.java at deve…

JVM switch文とバイトコード

Java で switch 文を書くと、バイトコードとして tableswitch か lookupswitch が生成される。tableswitch 生成条件と、tableswitch と lookupswitch の挙動について調べた。参考にしたコードは OpenJDK の jdk7u。 tableswitch と lookupswitch Chapter 3. …

Intellij IDEA live templates に JUnit 関連のスニペット

Reformat according to style にチェックを要れておくと適宜インデント等してくれる

boolean で NullPointerException

boolean と評価する文脈でなぜか NullPointerException が起きるなーという場合は実際に null が Boolean として評価されているかもしれない。Auto boxing こわい。

ant + cobertura でカバレッジを計るときは、jvmをforkさせることは必須

It is important to set fork="true" because of the way Cobertura works. It only flushes its changes to the coverage data file to disk when the JVM exits. If JUnit runs in the same JVM as ant, then the coverage data file will be updated AFTE…

LocateRegistry#createRegistry() は作成したRegistryをエクスポートする

LocateRegistry#createRegistry() で RMI の Registry を作ったらそれはエクスポートされる。以下LocateRegistry#createRegistry(int) の javadoc。 Registry インスタンスと指定された port を引数に指定して static メソッド UnicastRemoteObject.exportOb…

variable byte code

Javaで実装。単なる関数なのであまりJavaっぽくないけど。都合でバイト列は引数渡し。 public class VariableByteCoder { public static void encode(int n, byte[] target, int offset) { int t = n; int i = 0; // 7ビットごとに分割 for (; t > 0x7f; t >…

java.io.InputStream の read(byte[], int, int) は -1 を区切りにデータを読み込む

これを抑えておくとテストを書くときに便利。 以下のようなクラスを用意しておくと、 -1, 0, 1, ... 255が配列(コンストラクタのdata)に含まれていたら、それは有意なデータの一部 -1, 0, 1, ... 255以外の値が配列に含まれていたら(擬似)IOException -1 …

UTF-8環境での eclipse findbugs-plugin の文字化け解消

日本語メッセージがShift-JISでエンコードされており、かつ適切にハンドリングされていないようなのでUTF-8環境のeclipseでfindbugsを実行すると文字が化ける(findbugs-1.3.9)。簡易処置として、すべての日本語メッセージファいるをすべてUTF-8に変換する。…

正規表現お試しコード

Java用正規表現微調整のお供に。 コード import java.util.regex.*; public class TestRegex { public static void main(String[] args) { System.out.println("regex : " + args[0]); System.out.println("input : " + args[1]); Pattern p = Pattern.compi…

「名前」でロックを制御する

オブジェクトに対してロックをかけるのではなく、「名前」(というか文字列)に対してロックをかける。違うインスタンスなんだけど同じ名前を持つオブジェクトに対してロックをかける場合に使う。 使い方 一般的なロックと同じ?でロック取得/解除時に対象…

FileResource ルールの使い方

テスト後にファイルが消されることを保障しようとするルール - ihirokyの日記の使い方。 使おうと思えば使おうと思うほど @Before/@After でやるのと変わらないような気がしてくるが、ファイル削除を明示的に書かないで済むといえば済む。 テスト毎に扱うフ…

テスト後にファイルが消されることを保障しようとするルール

JUnit4.7から「ルール」なるものが導入され、テスト実行後にファイルの削除が保障される?ルールがデフォルトで備わっている。それに該当するものがTemporaryFolderなるクラスらしいのだが、名前どおりあくまで一時ファイル・ディレクトリを管理するクラスで…

Sun Java6 java.io.File#renameTo(File) でのファイル名変更は solaris では不可分な操作

Java6 の java.io.File#renameTo(File) のjavadocには以下のような記述がある。 この抽象パス名が示すファイルの名前を変更します。このメソッドの動作の多くの部分は、本質的にプラットフォーム依存です。名前の変更操作では、ファイルをファイルシステム間…

org.hamcrest.BaseMatcherを拡張してassertThat()で使う

Junit4.4からデフォルトで含まれるようになったorg.hamcrestパッケージ。assertThat()でテストを書いていると、デフォルトで含まれるcoreパッケージだけでは物足りない。hamcrest-libraryを追加すればバリエーションが増えるらしい(2007-10-08 - marsのメモ…

直接newとClass#newInstance()の速度差

あまり気にしちゃいけないところかもしれないけど、調べてみた。使ったJVMは 6u14。 一回だけ呼出 newInstance() は new より桁違いに遅い。ただし、μ秒の世界。 public class Instance { public static void main(String[] args) throws Exception { long s…

Thread.getState() と Thread.isAlive() の関係

試したJVMはWindows版の SunJDK 6u14。 結論 Thread.getState() Therad.isAlive() NEW false RUNNABLE true BLOCKED true TIMED_WAITING true TERMINATE false 検証コード public class ThreadState { public static void main(String[] args) { final Objec…

synchronizedブロックに指定するオブジェクトがnullだとNullPointerException

読んで字の如く。意味ないコードだけど試す。 public class NPEAtSynchronized { public static void main(String[] args) { Object lock = null; synchronized (lock) { System.out.println("hoge"); lock.notify(); } } } 実行結果 $ java NPEAtSynchroniz…

eclipseからTrayIconを表示させるとメニューが文字化ける

Eclipse上で、TrayIconを表示するクラスのmain関数を実行(Run As -> Java Application)するとポップアップメニューの表示が豆腐になる。でも、同じクラスファイルを使ってjavaコマンドによりmain関数を実行させると文字化けない。この差は何なのだろう。

VMのデフォルトヒープサイズ

てっきりデフォルト最大サイズは64MBだと思っていたけど、変わってたみたい。 パラレルガベージコレクタ (-XX:+UseParallelGC) を使用してどちらかの VM (クライアントかサーバ) を実行するサーバクラスマシンでは、初期ヒープサイズと最大ヒープサイズが以…

JJUG Cross Community Conference 聴講

404 Not Found にいってきた。一日あいちゃったけどメモメモ。Oracle Coherenceの話はちょっと気になったけどいろいろ忙しかったので午後から参戦。聴くだけだけど。全体的にはとてもクラウド過ぎ、というかGAE(Google App Engine)過ぎて、若干空かし気味…

GC HotSpotオプションとそれに対応するコレクタ名

sun jdk 6u13 での実行結果。Client VMだとSerialGCがデフォルトで、Server VMだとParallelGCがデフォルトっぽい。コンカレントGCを有効にするには明示的に指定しないといけない。コレクタ名だけ見てると、-XX:+UseConcMarkSweepGCと-Xconcgcは等価。 $ java…