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…

ANYアドレスでServerSocketをバインドさせる

ServerSocketがbind()するとき、そのエンドポイント指定に使うInetSocketAddress作成で、 第一引数にInetAddress.getByName("0.0.0.0")を渡す 第一引数にInetAddress.getByName(null)を渡す と、ANYでバインドする。つまり、上記の二つのInetAddressがANYア…

メッセージの国際化

とりあえずデフォルトメッセージと日本語用メッセージを用意。それぞれ文字コードをUTF-8にしておく。(native2asciiはしない) messages.properties (デフォルト名+.properties) pstyle.crypt.Tool.location_is_null=--location option is required. pstyle…

秘密鍵 / 公開鍵 を生成して署名

署名を生成するための秘密鍵、書名の確認を行うための公開鍵の生成。 アルゴリズムは "RSA" とか "DSA"とか。 public CryptKeyPair generate(String keyAlgorithm, int keyLength) { try { KeyPairGenerator generator = KeyPairGenerator.getInstance(keyAl…

共通鍵方式で 暗号化 / 復号化

まず鍵生成。アルゴリズムは "AES" とか "DESede" とか "Blowfish" とか。 public CryptKey generate(String keyAlgorithm, int keyLength) { try { KeyGenerator generator = KeyGenerator.getInstance(keyAlgorithm); SecureRandom random = SecureRandom.…

JCE参考サイト

・セキュリティー http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/index.html Javaにおけるセキュリティ全般の説明。 ・Java ™ 暗号化アーキテクチャー(JCA) リファレンスガイド http://java.sun.com/javase/ja/6/docs/ja/technotes/gu…

Base64 エンコード / デコード

エンコード。3バイト分のデータを4文字に変換。dataはバイト列。forの真ん中がlength-2なのは3バイトであまるものをはじくため。3バイトずつ処理して、データのお尻で余ったもの処理を入れた。 public String encode(byte[] data) { char[] charBuffer = new…

SimpleJdbcTemplateに甘えすぎた

JdbcTemplateのsyntax sugarなSimpleJdbcTemplate。文法が甘いだけに、恥ずかしいエラーで立ち止まる。SimpleJdbcTemplateで使うのRarameterrizedRowMapper public class FooRowMapper implements ParameterizedRowMapper { @Override public Foo mapRow(Res…

ResourceBundle, MessageSourceでproperties内に日本語でメッセージを書く

<移行分> ResourceBundle, MessageSourceでproperties内に日本語でメッセージを書く Java6のJavaDocを眺めていると、ResourceBundle を拡張する ResourceBundle.Control というものがあるらしいことに気づいた。つまりUTF-8指定した Properties を使う Res…

eclipse.ini

SpringIDE 2.1がリリースされてる。Spring Web Flow 2 と Ganymede 対応がメインの様子。コード編集中に eclipse がやたらに落ちる。[プロジェクト]/.metadata/.log 内にjava.lang.OutOfMemoryError: PermGen spaceが出力されるとき、eclipse.ini でPermSize…

スレッドスコープ

Springframeworkのカスタムスコープ、知っておくといろいろ便利そうなので、 リファレンスで実装例がなかった "thread" スコープを実装してみました。ThreadLocalMapはThreadLocal内にあるHashMapをMapインターフェースでラップしたもの。 package examples.…