読者です 読者をやめる 読者になる 読者になる

理系学生日記

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

忍者TOOLS

JavaでのQRコード生成

QR コード あまり知られていませんが、QR コードは日本発の規格になります。 スマートフォンで打ち込むのが面倒なデータをカメラ読込のみで入力できることから世界的にも普及しておりまして、先日は iOS の Chrome に QR コードをスキャンする機能も追加され…

HTTPS双方向認証の環境を作る

以下のエントリで HTTPS 通信を試してみましたが、このような試験環境を作るのはわりとメンドい。 メンドいことを何度もやりたくないので、実施した内容をエントリに残しておきます。 クライアント認証を含めた HTTPS の双方向認証を行うためには、以下が必…

JavaのJSSEでクライアント証明書を自由に選択できるようにする

HTTPS で API を呼び出すっていうシーンは頻繁にあって、その API を使うには、通常何らかの認証が求められます。 認証にも色々あるんだけど、そのうちの一つが HTTPS のクライアント認証です。 普通に HTTPS 通信をしたいだけだと意識しないことも多いので…

Stubby4JにおけるJSONでの正規表現、あるいはリクエスト中の特定のフィールドでレスポンスを変更する

Stubby4J を使用したテストにおいて、API リクエストとして送る JSON の中の値によって、レスポンスを切り替えたい場合がある。 もうちょっと具体的にいうと、 リクエストの JSON の中の特定のフィールドの値によってのみ、レスポンスを切り替える 他のフィ…

Maven Assembly Plugin でできるファイル名がクソダサかった話

Maven Assembly Plugin でできるファイル名がクソださかったのでなんとかしたかった話。 descriptorRef 要素で jar-with-dependency 指定してたら、hoge-0.0.1-SNAPSHOT-jar-with-dependencies.jar とかいうフザけた名前になってて、あまりの衝撃に手足が震…

Maven Assembly Pluginで実行可能jarをつくる

maven assembly plugin maven 力も Java 力も貧弱なのだけれど、依存性を 1 つにまとめた実行可能 jar を作る必要性に駆られたので、ちょっと調べてた。 maven の plugin で実行可能 jar を作ろうとすると、以下の 2 つがメジャー。 Maven Assembly Plugin M…

Stubby4JをJUnitから利用する

Stubby4J を Junit で起動できればだいたいの HTTP 要求に関するテストはできる。 だいたいこんな感じでテストを書きたい。 public class Stubby4jTest { @ClassRule public static Stubby4jServer server = Stubby4jServer.fromResource("com/kiririmode/bl…

RestEasyとHttpComponents、そしてConnectionManager

RestEasy client を使用した HTTP 要求を行うと、TCP コネクションが長時間にわたり残存する問題が発生することがあります。 RestEasy の公式ドキュメントを読めば「HTTP コネクションは適切に release し、適切に close しなければならない」ということは分…

パスワード等の秘匿情報をKeyStoreで保持する

DB 接続用のパスワードだったり、Basic/Digest 認証のときに使うパスワードだったり、世の中にはパスワードが溢れていて、もうパスワードを個別にして記憶しておくとか絶対にムリ、ムリムリムリムリかたつむりであるから、みんなどの Web サービスのアカウン…

コマンドラインで簡単にAES暗号化、または Java での AES 暗号化

Java で AES 暗号化とかやってて、コマンドラインで簡単に試せれば良いのになぁとか思ってたら、openssl 使ったら余裕で暗号化できることに気付いた。 例えば、AES/CBC の 128 bit 鍵長で暗号化したい場合は、以下のようにすれば良い。 -e は暗号化、-d は復…

Javaアプリから共有ライブラリが読み込めない問題(java.library.path と LD_LIBRARY_PATH)

なんか良くわからないエラー (no [ライブラリ名] in java.library.path みたいなヤツ) が出てきたのだけれど、解決方法が java.library.path の設定ではなく、LD_LIBRARY_PATH の設定だったりした。この手のエラーに苦しめられ続けており、そのあたり、ちょ…

maven と git-flow を使用したリリースフロー

ぼく自身、git-flow を利用するのは始めてで、Maven 力も低い。 そういう人間がリリース時にどうしようかとか考えても仕方がないので、先人に頼るかーと思っていたら、ちょうどいいエントリがあった。 Why I Never Use the Maven Release Plugin - DZone Jav…

Java に関する最後の雑誌?Java Magazine の購読

最近はもっぱらジャバジャバしているので、Java の雑誌でも読んで動向をウォッチしとかないとなぁなどと思っていた。 が、JAVA PRESS が死に、JavaWorld が廃刊になったこのご時世、雑誌としてはどうやってウォッチすれば良いのかなぁと思ったら Oracle が J…

Maven力の低い自分に送るMaven良い感じドキュメント

Maven 力が低くて、会社の人に迷惑かけている感じある。 Maven、基本的に 公式ドキュメント 読みにくいし全体像つかみにくいし、本読んでもなかなか詳細が分からないし何とかならんものかと思ってた。 Apache Maven 3 クックブック - 理系学生日記 思って探…

JBossでJCA(Java Cryptography Architecture)のプロバイダが使えない問題

JBoss で JCA のプロバイダの jar が見えない!! JBoss 上で Java Cryptgraphy Architecture (JCA) を利用したアプリケーションを書いていたのだけれど、いざデプロイして稼動確認してみるかといった段で例外を吐いて死ぬ惨状となった。 状況としては、こちら…

JBossにおけるVFSとは何であるのか

JBoss における VFS VFS というと Virtual File System の略であって、Google 検索するとおそらく Linux だとかの仮想ファイルシステムの話が上位にくるんだと思いますが、JBoss にも同様の仮想ファイルシステムたる VFS が存在しています。 最近この JBoss …

テスト前提が満たされている場合にのみJUnitのテストケースを実行したい

Java で JUnit のテストコードを書く場合、テスト実行環境がこういう前提を満たした場合にのみ、このテストを実行させるようにしたい、というようなケースが多々あります。 例えば、 テスト実行環境の OS に依存する テスト実行環境における特別なソフトウェ…

JCAとは何であるのか

Java SDK というのは、膨大な機能セットを提供してくれていますが、その中には暗号化に関するものがあり、このうち、暗号化に関する機能についてのフレームワークセットを JCA (Java Cryptography Architecture) と呼びます。 ちょっとこういう機能セットを…

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

日本語文字化け

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

SJC-WC

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