理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

java

Composite パターン・Strategy パターンでの比較ロジック

実際には Composite パターンと Strategy パターンの組み合わせで比較条件をいくらでも複雑にできるという例です。 wikipedia:Composite パターン wikipedia:Strategy パターン 例えば 入力パラメータ a, b, c によって、特定ブロックを実行するか否かが複雑…

DBUnit でカラム値の比較をカスタマイズする

DBUnit の思想について - 理系学生日記 の記事の続きです。DBUnit では、基本的にデータセット単位、あるいはテーブル単位で比較するので、このカラムの値がこういうときにはテストを OK としたい、というようなカラム値単位でのテスト制御を行うためにはち…

DBUnit の思想について

DBUnit というと、JUnit 徹底入門だったり、現場で使える Java ライブラリだったりで紹介されていることからも分かるように、それなりにユーザベースも広く、"DB 関連のテストをするにあたってそういうライブラリがある" という認識はわりと多くの方が持たれ…

DBUnit の IDataSet を JavaBean で表現する

DBUnit においては、DB に投入するデータセットは IDataSet と呼ばれる Interface によって規定されている。この記述だけではイメージが分かないが、これを実装したものをいくつか挙げれば、イメージを掴んで頂けると思う。 CSV ファイルからデータセットを…

SpringでBean名にエイリアスの名前を付ける

既存の Spring アプリケーションにおいて applicationContext.xml で特定の Bean が定義されており、それを別名の Bean として参照したい場合がある。 今回遭遇したケースでは ロジック層用の applicationContext.xml が存在していて多数の Bean が定義され…

複数のスレッドで同時にある処理を起動させたい

こういうときは CountDownLatch を使う。 latch、英語としては「掛け金」とかそういう意味だけど、その名の通り、スレッドに対して掛け金をかけておいて、掛け金を外したらスレッドが猪突猛進に走り出すイメージ。CountDownLatch では、コンストラクタに与え…

@ControllerAdvice を使(わ|え)ないときの、コントローラ横断例外ハンドラの実装

コントローラベースの例外ハンドラ Spring MVC といえば、その名の通り Spring が提供する MVC フレームワークで、Controller 等を POJO で実装することができます。 で、Controller 層で例外を送出した場合、単純に HTTP STATUS 500 を返却するのではなく、…

Java並行処理プログラミング

読んだ。Java並行処理プログラミング ―その「基盤」と「最新API」を究める―作者: Brian Goetz,Joshua Bloch,Doug Lea出版社/メーカー: ソフトバンククリエイティブ発売日: 2006/11/22メディア: 単行本購入: 30人 クリック: 442回この商品を含むブログ (173件…

Tomcat で Too many open files 発生、CLOSE_WAIT の TCP セッションが多数

Tomcat のログを見ると "Too many open files" のエラーが出力されてるとします。ログの内容通り、これは Tomcat プロセスが、1 プロセスが開けるファイルディスクリプタの上限を越えてもまだファイルディスクリプタを開こうとしているわけです。そもそもフ…

-XX:+PrintGCDetails で出力される GC ログの読み方

-XX:+PrintGCDetails を JVM に与えて起動させると、GC ログが詳細化される。 もともと、-verbose:gc を与えてると [GC 325407K->83000K(776768K), 0.2300771 secs] [GC 325816K->83372K(776768K), 0.2454258 secs] [Full GC 267628K->83769K(776768K), 1.84…

GC ログに関わる JVM コマンドラインオプションまとめ

Full GC による Stop the World でサーバが停止状態に…、そんなときに調査の助けになるのが GC のログ。Permanent 領域が溢れているのか、Java Heap が溢れているのか、Heap が溢れているのなら何のオブジェクトが溢れているのか、メモリリークが発生してい…

Java における class sun.reflect.GeneratedSerializationConstructorAccessor... または Java の Inflation について

まぁ GC の様子を見ていると、 Unloading class sun.reflect.GeneratedSerializationConstructorAccessor1 Unloading class sun.reflect.GeneratedSerializationConstructorAccessor2 Unloading class sun.reflect.GeneratedSerializationConstructorAccesso…

Log4J バグっぽい

Log4J 1.2.5 あたり、同期制御がうまくいってないバグがあるっぽい。Tomcat の処理滞留が発生してて、スレッドダンプとったら Log4J のログ出力時に待ちになってるスレッド大量にあった。 deadlock, log4j でググったら色々ヒットする。bugzilla にも登録さ…

SimpleDateFormat がマルチスレッドで使われて人間が不幸になる

人のソースレビューをしていると、SimpleDateFormat クラスが(暗黙のうちに)マルチスレッドで使いまわされるようなコードを見てしまいました。 Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle 前にも書いたけど、Java…

Callable と Future

そういえば、ExecutorService#submit が受け取ることができるのは古き良き Runnable に留まらず、Callable も受けとることができる。この Callable は Runnable#run と似たような call というメソッドを持っているのだけれど、この宣言がイカしていて、Inter…

ExecutorService を使ったスレッドプール実験

そういえば先日、Executor をはじめて使った。昔のソースを眺めていると、生で Thread を使い、その Thread を配列にプールしていて自作スレッドプールを作成していたことが判明したのだけれど、この頃から比較すると随分と時代は変わったのだと実感した。ま…

Cassandra に対する Java からの Insert

ここで Java を使うのは諸事情のためなのだけど、Cassandra に対するアクセスは Thrift 経由となる。じゃぁ Thrift って何よというと、公式では以下のように説明されている。 Thrift is a software framework for scalable cross-language services developm…

ResultSet がメモリをモリモリ食い出す事案が発生

Oracle DB のテーブルに格納されたレコードのうち、SELECT した数十万レコード程度を ResultSet 経由で受け取るようにしていたところ、ResultSet#next を呼び出すループを回す毎に JVM のメモリが増えていく事案が発生。ヒープをあまり取っていないと、メモ…

Re: タグ名が可変の XML 文書を JAXB で構築する

JAXB ナメてました。 このあいだ タグ名が可変の XML 文書を JAXB で構築する - 理系学生日記 という記事をかきましたが、DOM 操作なんか必要なかった。もっとシンプルにかける。 package kiririmode.test.jaxb.main; import javax.xml.bind.JAXBContext; im…

タグ名が可変の XML 文書を JAXB で構築する

タイトルから既に異常な感じがしますが、要するに以下のような XML 文書を作りたいというときにどうすれば良いのかという話です。 <whole> <aaa>value aaa</aaa> <bbb>value bbb</bbb> <part01> <part_a>part value A1</part_a> <part_b>part value B1</part_b></part01></whole>

split にハマる

Java で CSV ファイルをカンマで区切る処理を、RFC4180 をムシして簡単に書こうとすると*1、String#split を使うことが多いかと思います。 しかし、String#split には以下のような罠が存在します。 public class SplitTest { public static void main(String…

こんなプログラムはいやだ

今日のこんなプログラムはいやだ。 メソッドの戻り値が Map ばかり エラーが発生しても、そのエラー情報を Map に入れて呼び出し元に返却する 例外が発生すると即座にキャッチして Map を返す 深いメソッド呼び出しの中でエラーが発生すると、エラー情報が入…

スレッド間うんたらでぼくが不幸になる

10,000 とか 100,000 件/分 を捌くようなオンラインシステムにおいては、待ち行列を作る部分がボトルネックになりがちです。 特に外部サービスと連携するような部分においては、そのネットワーク的な遅延や外部サービス側のレスポンス遅延が大きな影響を与え…

オートボクシングの罠

とある Google Group で話題に上がっており、ぼく自身これに起因するバグを見たことがあるので紹介します。このプログラムの出力は予想できるでしょうか。 public class TestInteger { public static void main(String[] args) { Integer a127, b127, a128, …

日本語文字化け

業務上、割と片手間でつくったスタブモジュールがあったのですが、それを使った人から「設定ファイルに日本語を設定したらその日本語が化けるんですけどなんでですかね*1。ところであなたはなんなんですかね。」みたいな問い合わせがきたりしました。 実は設…

SJC-WC

というわけで晴れて Oracle 認定 Web コンポーネントディベロッパ EE5 を名乗れることになりました。もちろん名乗る機会など毛頭ございませんし給料も一円たりとも上がりません本当にありがとうございました。 SJC-WC の S は Sun だと思うんですけど、もう…

synchronized は相互排他のためだけにあるわけではない件

起動しているスレッドを別スレッドから停止させようとするとき、次のような形のコードを時々見る。 import java.util.concurrent.TimeUnit; public class StopThread { private static boolean stopRequested; public static void main(String[] args) throw…

ローカル AP サーバへの JNDI lookup と RMI 用の JNDI lookup をまぜたときにうまく動かないんだけどこれなんなんだろ

前提として、RMI 呼び出しの際に用いる InitialContext は引数なしのコンストラクタによって構築されており、その構築部分は触わることができない。また、jndi.properties に記述されている JNDI プロパイダの情報はすべて正しく、RMI を提供するリモートサ…

OC4J で HTTP ステータスとして 600 番以降を返そうとすると

ArrayIndexOutOfBoundsException が出てわらえたけど、HTTP の RFC を良く読むと The first digit of the Status-Code defines the class of response. The last two digits do not have any categorization role. There are 5 values for the first digit: …

Commons Collections で FizzBuzz

Java SE では、機能ロジックをカプセル化した関数オブジェクトとして例えば Comparator や Iterator が定義されていますが、Apache Commons collections には、for 文や while 文、if 文をカプセル化した Functor が用意されています。なるほど、これを使え…