理系学生日記

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

忍者TOOLS

java

Java プログラマーなら習得しておきたい Java SE 8 実践プログラミング

Java プログラマーなら習得しておきたい Java SE 8 実践プログラミングを読みました。タイトル長いな。Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング作者: Cay S. Horstmann,柴田芳樹出版社/メーカー: インプレス発売日: 2014/09/22メ…

Loggerはstatic 変数にすべきか、インスタンス変数にすべきか

Logger は static 変数にすべきか、インスタンス変数にすべきかという話があります。 static 変数 public class Foo { private static Log log = LogFactory.getLog(Foo.class); .... } インスタンス変数 public class Foo { private Log log = LogFactory.g…

SLF4Jとはなにか

SLF4J とは何か。これ、わりと分かりづらい人もいるかと思います。SLF4J の FAQ にそのものズバリな回答があるんですけど、 What is SLF4J? SLF4J is a simple facade for logging systems allowing the end-user to plug-in the desired logging system at …

GoogleにおけるJava CamelCaseの決定方法 (ipv6Address? ipV6Address?)

一般に ObjectiveC だったり Java だったりといった言語は CamelCase で変数名やクラス名を付けるというのが定石のようになっていますが、世の中には「この言葉の CamelCase はどういう風になるんだろう」というのが曖昧になるケースがあります。 例えば IPv…

java のクラスパスをワイルドカードで指定する

大量の jar ファイルに依存している Java のバッチとかを走らせるとき、これらの jar ファイルに対するクラスパス(classpath) を通す必要があります。 これ、かつては for f in $(ls lib/*.{jar,JAR}); do CLASSPATH="${CLASSPATH}:$f" done java -cp $CLASS…

DBUnit から "Potential problem found: The configured data type factory 'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' might cause problems with the current database" と怒られたあなたへ贈るメッセージ

あなたへ贈るメッセージ このFAQを読めや!!!!! 背景 DBUnit を使ったテストをしていてふとログを見てみると、以下のような WARN ログが出力されることがあります。 [main] WARN org.dbunit.dataset.AbstractTableMetaData - Potential problem found: T…

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, …