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…

JMX接続の気持ち悪い挙動

JConsoleからリモートホストで動いているJVMに接続するときの挙動が気持ち悪い。推測の域を出ないのだけれど、リモートホスト上でホスト名から引いたIPアドレスとJConsoleが接続するリモートのポートのIPアドレスが等しいようなホスト名をリモートホストにつ…

通知(Notification)を行うNotificationEmitterを実装したMXBean

JMXでの「通知」を行えるMBean(MXBean)を作った。その概要を説明するためのサンプル。JVMのOldピープ増加速度を通知する(jstatを使えば通知はできなくてもシェルレベルでログ出力まではできそう)。実行時のJConsoleイメージはこのエントリの下のほうにのせ…

NotificationEmitter は実装クラスに implements する

状態の通知を可能にするインターフェース NotificationEmitter は MXBean に extends させてはダメ。MXBean の実装クラスに implements する。NotificationBroadcasterSupportを継承できないときに出くわしたケース。ちょっと考えたら当たり前か。MBeanとし…

時がたったら内容を見直さないとまずいでしょう

Javaスタイルブック (IT Architects’ Archiveシリーズ)参考になるお作法がコンパクトにまとまっててさらっと見直せるのは良い。しかし double checked locking しましょうとか書いてある。原書は2000年ころに書かれたらしい(The Elements of Java™ Style (S…

GUI上の日本語表示

linuxでは良くあるらしく、標準でJVMが日本語フォントを読めるようになっていないみたい。フォント構成ファイルにしたがってフォントファイルを指定してあげないといけない分けだが、物理フォント名を調べて設定ファイルに色々記述するのは面倒そう。他の方…

スレッド毎にClassLoaderを用意してクラスパスを割り当てる

ThreadにはsetContextClassLoader()というメソッドがあって、スレッド毎にクラスローダを割り当てることができる。要するにスレッドを作るときにそのスレッド専用のjarファイルなりクラスパスを割り当てることができる。これを確かめるためにクラスパスを引…

スレッドに割り込んだときのjava.io.InterruptedIOException

スレッドに割り込んだ状態でIOを行うとSolarisのJVMではInterruptedIOExceptionが発生する。 log4j:ERROR Failed to flush writer, java.io.InterruptedIOException at java.io.FileOutputStream.writeBytes(Native Method) at java.io.FileOutputStream.wri…

MulticastSocket.joinGroup(InetAddress) は1度に1つのインターフェースにしかIGMP joinを送らない

MulticastSocketがANYアドレスにバインドしているとき、MulticastSocket.joinGroup(InetAddress)ですべてのインターフェースにjoinするかと思ってたら大間違い。ANYとかワイルドカードとかたいそうな名前だとしてもデフォルトとして選ばれるインターフェース…

visualvm 1.1.1

jdkを6u12にアップデートしたあたり?からvisualvmからマシン内Javaプロセスが見えなくなってた。で、1.1.1がリリースされていたので更新したら解決。

double checked lockingがダメな理由

double-checked lockingとSingletonパターン 結局のところ、インスタンス作成処理がアトミックになってないからちゃんと同期化しないとダメ、ということかしら。変数をvolatileにすれば今は意味を成すらしいけど、double checked locking自体の趣旨=同期化の…

スレッド実行率を表示するJTopもどき

JDKのデモに付属してるスレッド実行時間を表示するJTopを基にして、単位時間当たりの実行率を表示させてみた。なんか合計が100%超えてるけど、マルチコアのせいなのか精度が良くないのかバグってるのか。このときのOSでみたCPUの使用率は80〜90%だった。 追…

同期してないHashMapのget()とresize()がぶつかると値が取れない可能性がある

非同期状態のHashMapのサイズが拡張している最中にgetすると値が取れないことの確認。jdkの6u7。 putするとaddEntryが呼ばれて、要素数が閾値(指定しなければテーブルサイズの0.75倍)を超えたとき、テーブルサイズが2倍になる。 java.util.HashMap.addEntr…

judeでクラス図自動生成

(2009-11-04) judeはastah*に名称が変更された。JUDEユーザーの皆様へ、astah* 製品の利用について Judeでソースコードからクラス図を自動生成できる。 JUDEでは、Javaソースコードの読み込みをサポートしています。 (JUDE/Community, JUDE/Professional)(1)…

JUnit テストRunnerの拡張

テストを行う際にしておきたいこと(テスト対象プログラムの起動やテスト対象への接続)をRunnerに記述した。その概要メモ。 テストでこのRunnerを使えばテストコードにはテストのコードだけ書けばすむ。Before/Afterアノテーションでやれば良いじゃんという…

ファイルの内容を文字列として取り込む

ファイルの読み込みテスト書くときに重宝。最後の改行は注意。 $ sed 's/"/\\"/g' < file | sed 's/\t/\\t/g' | sed -r 's/(.*)/sb.append("\1\\n");/g'

char配列 -> String は byte配列 -> String より4倍くらい速い

いちいちchar[]にコピーする手間を入れても、エンコードに掛かる手間のほうが断然重いらしい。計測順の入れ替えを行っているのは、順序によって若干結果が異なるのを平準化するため。試したJVMは6u7, CPUはCore2Duo E8400(3.0GHz)。 といってもn〜μ秒の世界…

MessageResourceでの「'」

<移行分> Springframeworkというか、ResourceBundleのお約束事なのかな。 MessageResourceを扱うとき、メッセージの定義が argument.required=the argument '{0}' is requiredであるとして、{0}に hoge を当てはめるつもりで以下のようなコードを書くと怒…

32bit CentOS 上 JVM の最大ヒープは2.5GBぐらい

32bitCentOS上でJVMのヒープをどれくらい取れるのか調べてみた。XenServer上なのでXenの影響は不明。メモリは十分(6GB)。起動デーモンの状態によりそうだけど、安定してとれるのは2.5Gぐらい。もうちょっとがんばると下のような感じ。 $ java -Xmx2625M -X…

Enumのvalues()はフィールドのシャローコピー

コンパイラが生成する(?)、Enumのフィールドにある要素の配列の参照がそのまま帰ってくると思ったら、コピーされた別の配列が返ってくる。試したバージョンは6u7。元の列挙型 public enum EnumTest { A, B, C } コンパイル、そしてjad $ javac EnumTest.j…

エンコード後バイト列の長さ

java.nio.charset.CharsetEncoderでエンコードしたときのエンコード後の長さをエンコード前に調べるには averageBytesPerChar() / maxBytesPerChar() に入力文字数をかけて見積もる。今回EUC-JPにエンコードしたく、それぞれ出力値を調べてみる。 CharsetEnc…