この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

Java

MariaDB Connector/Jの1.3.0以降でTIME型カラムの値が00:00のときにNULLになるバグ?

タイトルの通りです。 昨日はBOOLEAN型に関するバグを見つけましたが、今度はTIME型です。 00:00の値のときだけNULLになります。 原因はわかっていませんが、軽くデバッガで見てみたところ、当該カラムの値はサーバからのレスポンスがゼロバイト配列になって…

MariaDB Connector/Jの1.3.0以降でBOOLEANのカラムが常にtrueになるバグ?

ちょっと前にConnector/Jが1.3.0にアップデートされたのですが、とたんにTINYINT(1)のカラムの値を正しく取得できなくなりました。 MySQLはBOOLEANをTINYINT(1)の別名として扱います。アプリケーションから見たらこのカラムはBoolean型です。 で、Connector/…

SpringとGroovyにも直列化オブジェクト脆弱性

昨日の記事の続きです。 昨日はcommons-collectionsについて、どのような仕組みで攻撃が成功しうるかを書きました。 しかしこの問題はcommons-collections限定ではなく、GroovyまたはSpringFrameworkのクラスをロードしている環境でも起こりえます。 攻撃が…

commons-collectionsのInvokerTransformer脆弱性について

2015-11-12 追記あり。「SpringとGroovyにも直列化オブジェクト脆弱性」も参照してください。 昨日からJava界隈で話題になっているcommons-collectionsの脆弱性について。 元ネタはこちら。 対応するチケットはこちら。 InvokerTransformerなんてクラスは初…

HikariCP-2.2.5とJavassist-3.19.0の組み合わせでVerifyError、そして初のPR

Maven CentralにJavassist-3.19.0が登録されていたので、早速試してみたところ、この有り様。 Caused by: java.lang.VerifyError: Illegal type at constant pool entry 417 in class com.zaxxer.hikari.proxy.PreparedStatementJavassistProxy Exception De…

UseStringDeduplicationの効果を計測する

javacのバグのせいでずっとJDK1.8.0_20以降へ乗り換え出来ずにいたわけですが、 (参考: http://takahashikzn.hatenablog.com/entry/2014/10/15/204657 ) とうとう諦めて、このバグを回避するようソースを全面的を書き換えることにしました。 書き換えた内容…

ドッペルゲンガー?

言葉は違えども、考えていることは全く同じ。 何のことかというと、これ。http://www.infoq.com/news/2014/11/lang-ext-csharp-functional-exts http://github.com/louthy/language-ext このライブラリ、僕が作ったIndolentlyにソックリなんです。 関数名も…

CheckStyleがJava8に対応

CheckStyle-5.9がリリースされています。リリースノートはこちら。http://checkstyle.sourceforge.net/releasenotes.html 5.9での最大の変更点は、このバージョンからJava8の文法に対応したことです。 早速、ラムダ式だらけのソースに対してチェックを試して…

Java8u25がリリースされるもコンパイラのバグは解消されず

Java8u25がリリースされています。が…!!!以前書いたコンパイラのバグ*1は依然として解消されず。 バグパレードを検索したら、まさに同じ問題が登録済みでした。コレ。 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8056984 Java8u20から導入された…

Java8u20で文字列のメモリ効率が向上

以前、こんな記事(と言ってもほとんど意訳だけ)を書きました。 実はStringはメモリリークの原因だった(※1.7.0_06未満) 上記記事の要約は、 Java7u06より前のバージョンでは、String.substringなどで文字列を切り出す際に元の文字列の内部表現であるchar配列…

JDK8u20のコンパイラのバグにぶち当たる

いつの間にかJDK8u20がリリースされていたので更新しました。すると、 コンパイラで例外が発生しました(1.8.0_20)。Bug Paradeで重複がないかをご確認のうえ、Java Developer Connection (http://java.sun.com/webapps/bugreport)でbugの登録をお願いいたし…

CheckStyleがJava8の構文に非対応→8月末までに対応予定

http://github.com/checkstyle/checkstyle/issues/10 みんなが「無いとムリ!!死ぬ!!」と、一斉唱和したおかげで、作者の方も最優先で対応することを決めた模様です。

Tomcat8 正式リリース!

長いベータ版の期間を経て、とうとうTomcat8がリリースされました。 僕は既にTomcat8のベータ版を業務で使っていましたが、 商用環境で数ヶ月間の連続運用を行っている現在、大きな問題は出ていません。 横着したでござるの巻 ところで一つ、解せないことが…

caseがStringなswitch文はmapで実装されている?

http://java-performance.info/string-switch-performance/こちらより。 最後のまとめだけ書くと、 Summary String switch in Java 7 is implemented using a fixed size map with a number of slots close to 20. This means that you can freely use it in…

CheckStyle-all.jarをビルドする方法

CheckStyleがlambdaの構文に対応していないので、最新版をソースからビルドしてみることに。 antもEclipseのプラグインも、checkstyle本体だけでなく依存ライブラリも含めた全部入りのJarを要求するため、 単にmvn installではダメです。checkstyle本体のJar…

closure-compiler-20140407でVMBridgeのエラー

僕は強力にタイプチェックのかかる環境で開発するのが好きです。 Javaではできるだけキャストを排除するのは当然として、JSを書くときもclosure-compilerのアノテーションでタイプセーフに書くようにしています。 詳しくはこちら。 http://developers.google…

MariaDBのJDBCドライバがmaven repoへ登録完了

ウチもそろそろMariaDBへ乗り換えを始めているのですが、 JDBCドライバがmaven repoに未登録だったことに若干の不便を感じておりました。でも、それももう過去の話。https://mariadb.atlassian.net/browse/CONJ-3 http://search.maven.org/#search%7Cga%7C1%…

finalなフィールドの値をUnsafeで無理やり書き換える

[2014-03-25追記] インスタンスフィールドなら、finalであってもリフレクションで変更できました。 以下の話は、static finalなフィールド限定です。 昔はどうだったか知りませんが、少なくともJava7ではリフレクションを駆使してもstatic finalフィールドの…

Spring4.0.0のStackOverFlowは4.0.1で解消

先日の日記で書いた、Spring-4.0.0でStackOverFlowが出る件ですが、 早速FIXされた模様です。 っていうか、リリースされて数時間後に早速、バグチケット切られとるやん。。。 うーむ、そんなニッチな使い方してたっけ、僕? spring-4.0.1のリリースはよ。 ht…

実はStringはメモリリークの原因だった(※1.7.0_06未満)

InfoQから。http://www.infoq.com/news/2013/12/Oracle-Tunes-Java-String Stringのような基本型に大きな仕様変更が入ることは稀ですが、 1.7.0_06でアグレッシブな変更が入ったらしいです。 以下、適当和訳。 In an ongoing effort to improve Java perform…

Spring4.0.0が出た

…しかしStackOverflowで動かなかった!!(ドラクエ風に) ... at org.springframework.core.ResolvableType.hashCode(ResolvableType.java:693) ~[spring-core-4.0.0.RELEASE.jar:4.0.0.RELEASE] at org.springframework.util.ObjectUtils.nullSafeHashCode(…

Tomcat8.0.0がやたら遅い件

Tomcat8もそろそろリリースですね。いまRC5です。 後になって泣きを見ないよう、アプリを乗っけて動作試験を始めたところなのですが… とにかく動作が遅い。とても常用には耐えない感じです。 レスポンスが30秒間返ってこないとか、ザラ。 一体何が起きている…

POIのXmlValueDisconnectedExceptionを解消する

XmlValueDisconnectedException。 POIでOOXMLを使う際、避けては通れない関門のようです。 僕の環境でも、いつの間にか発生するようになってしまいました。 単にCell#getCellStyle()を呼んでいるだけなのに発生する始末。というわけで、半日かけて原因調査で…

Struts1.xがEOL

2014-04-23追記 昨今の状況を鑑みるに、新規案件でのStruts2の採用は余りお勧めできないと言わざるを得ません。 僕はStruts2およびOGNLのソースコードを実際に読み込んだ上で、自分で危険と判断したところは独自でパッチを当てているため、報告されているよ…

Rhinoの最適化レベル毎の違いを正確に理解する

※Rhinoのバージョンは1.7R4です。 ウチの製品であるMOD99は、いくつかの箇所で式言語としてJavascriptを採用しています。 例えば帳票生成において、サーバーサイドで計算しなければならない導出値(代表例: 何らかの集約値)を出力したいときなど。 帳票をダウ…

HttpSessionActivationListenerの使い方

HttpSessionが永続化ならびに活性化されるイベントを拾いたくなりました。 具体的には、HttpSessionに入れた値の幾つかを、永続化時に削除したいという要求です。 で、HttpSessionActivationListenerというのを使えばいいということが判明したのですが、 グ…

デバッグモードで起動したことを検知する

デバッガーを使う場合は、デバッグモードで起動します。コレ当たり前。 で、デバッグモードで起動したかどうかで、アプリの振る舞いを変えたい場合があります。 例えば、処理のタイムアウトをやめる等。デバッグモードだとありとあらゆるモノが遅くなるから…

POIで『縮小して全体を表示する』を設定する

POIで、『縮小して全体を表示する』ができなくて悩んでました。 POIのソースコードを調べてみたところ、HSSFCellStyleの内部表現であるExtendedFormatRecordに public void setShrinkToFit(boolean); というメソッドがあるのを発見。 ExtendedFormatRecordは…

ExcelのテンプレートをVelocityで記述

ウチの製品であるMOD99に、Excel帳票出力の機能を付けることになりました。 (これまではCSV+VBAで乗り切っていた) 今更かよって?ハイ、今更です。 サボってました。スイマセン。 コレまでずっと避けていたPOIをとうとう使うはめに… で、実際使ってみると…

ICU4Jがいきなり45バージョンも進んだ

なんと4.8.1から49.1へスーパー進化!! …と言うと機能がすごく増えたように見えますが、 最近流行りのラピッドリリースを採用した模様です。 最初見た時、ドットを付け忘れたのかと思ったよw ナンバリングについては詳しくはこちら。 http://userguide.icu…

JavaMailでマルチバイト添付ファイル名

久しぶりにJavaMailをゴニョゴニョやってますが、 近頃は添付ファイルのファイル名がマルチバイトでも苦労しないで済むんですねぇ。単に、 static { System.setProperty("mail.mime.encodefilename", "true"); System.setProperty("mail.mime.charset", "UTF…

javamailでGMailメールサーバを使う

javamailでGMailへ送信しようとしたら一筋縄でいかなかったのですが、 最終的には以下の手順で落ち着いたというご報告。 javamailプロパティ 以下のプロパティを設定する必要があります。 mail.smtp.host=smtp.gmail.com mail.smtp.port=465 mail.smtp.auth=…

FindBugs on JDK7において、System.outは常にnullであると警告される

先日、JDK7に乗り換えました。だけどFindBugsはJDK7に対応していないので、"-source 1.6 -target 1.6"で使っています。 ここまでは先日の日記で書いたとおり。 で、FindBugs on JDK7に新たな問題(と言えるか微妙だけど)があることを発見しました。 JDK7で…

JDK6準拠コードでも"Type safety: Potential heap pollution via varargs parameter"を解消する

ご無沙汰です。近頃、書くネタが切れたので放置気味です。 え?もちろん言い訳ですよ? このままブログを諦めるのか…?いや、まだ頑張れるはずだ。 というわけで、当面はブログのネタを生んでくれそうにない 平凡な仕事をしているので更に更新頻度が落ちます…

AspectJで自動コードレビュー

10月から新しい現場で作業してます。 で、その現場は典型的な大規模案件でして、 前の現場と比較して鈍重かつ洗練されていない開発プロセスになってしまっている感じ。 何をするにしても意思決定が遅い。無駄な作業が多い。進捗はエクセルで管理。等々… でも…

JDK7のホットスポットコンパイラに致命的なバグ

既に各所で報道済みですが、JDK7にはホットスポットコンパイラの致命的なバグが存在します。 http://journal.mycom.co.jp/news/2011/08/01/053/index.html で、なんとJDK6でも-XX:+AggressiveOptsを付けると、このバグが発現しうるそうです。 http://lucene.…

JDK7正式版の新機能一覧(Java言語仕様に関して)

2011-08-02追記 JDK7に致命的なバグ 重要なので先頭に追記しておきますが、JDK7のホットスポットコンパイラに致命的なバグが存在するそうです。 詳しくはコチラ。 http://d.hatena.ne.jp/takahashikzn/20110802 JDK7を使用する際はご注意下さい。 (Javadocの…

OpenSymphony, RIP(2000-2011)

OGNLのドキュメントを読もうと、OpenSymphonyのサイトへ行ったら こんな風になってました。あらら。今まで大変お世話になりました。お疲れ様でした。 http://www.opensymphony.com/ 一番重要なプロダクトxworkはstruts2の一部として今後も生きていくし、 OGN…

例外スローのテストをどう書くべきか

例えば、 public class Sample { /** * do something. * * @param i * a positive value. * @throws IllegalArgumentException * if i is a negative value. */ public static void doSomething(int i) { if (i < 0) throw new IllegalArgumentException("ne…

cofojaでラクラクDbC(予定)

http://code.google.com/p/cofoja/cofojaというプロジェクトがあります。これ、"Contract For Java"の略。 かつて存在したModernJassというプロジェクトの後継だそうです。 Contractという単語があることから判る通り、"Design by Contract"に関する何か、 …

serverVMはclientVMの夢を見るか

昨日、JDK1.6.0_25に更新しました。 "-XX:+TieredCompilation"が使えるようになったということで、 早速Tomcatの起動オプションに追加してみたのですが。コレがまた、Webアプリのリロードを繰り返すと頻繁にVMエラーで落ちるという。 # There is insufficien…

Tomcat7のスタックトレースがちょっと便利

2012-12-11追記: Tomcatの機能ではなくて、JDK7からそうなっているようです。失礼しました。 Tomcat7のスタックトレースがちょっと便利になっているということに気が付きました。 クラスがどのJarからロードされたか、わかるようになっています。([jasper.ja…

logbackへ移行するの巻

Javaにおける標準ログ実装の地位は、随分と長い間Log4Jが担ってきました。 (まさかjava.util.loggingなんて誰も使ってないと思いますが。。。) で、Log4Jは次期バージョンになるはずだった1.3の開発に失敗して以降、 ろくに新バージョンも出さずにいるわけで…

今日の、変なコード

今日、こんなコードを見かけました。 new Foo().super(); 僕の脳内:『なんじゃこりゃ???』→(5秒後)ああ、アレか。 さて、コレって何だかわかりますか? 正解は class Foo { class Bar { } } class Baz extends Foo.Bar { public Baz() { new Foo().super…

リストの最速ループの書き方

処理順序が重要でない場合に、ArrayListや配列を走査する場合には、フツーなら for (int i = 0; i < list.size(); i++) { Object o = list.get(i); ...(略) } とかやる*1わけだが、昔は色々と病気に罹患していた*2ため、こんな書き方をしてしまっていた。 fo…

全ての例外発生をフックする最短手段

ちょっと自分用メモ。 デバッガ上でアプリを動作させられないような状況下において、 例外の発生をフックしたいことがある。(エラー原因の解析処理をフックしたいなど→例えばログを出すとか) で、技術的にどうすればコレが可能か?を考えたのだが まず思いつ…

package-infoをJavadoc用途以外で使う

以前の日記でも書きましたが、 package-info.javaはインタフェースとしてコンパイルされます。 で、"package-info"という名前だけあって、パッケージ自身のメタ情報を含めるのにちょうど良い。 今やっている仕事で、『特定の処理を全てのクラスに適用する』…

TLDパス解決に見るTomcat7.0とTomcat6.0の違い

Tomcat7.0.8(Stable)がリリースされていたので早速使ってみました。 とりあえず、いつも使っているサンプルアプリケーション (Struts2, EclipseLink2, Spring3で構成)をデプロイして起動してみます。 2011-02-11 18:27:14,787 INFO [spring.StrutsSpringObje…

assertノススメ

僕は仕事だろうがプライベートだろうが、コードを書くときにはassert文を積極的に使います。 しかし、自分の他に使っている人をほとんど見たことがない。…何故? 考えるんじゃない 感じるんだ 使わない人が使わない理由として一番挙げそうなのが『いつ使えば…

final原理主義

僕は昔からずーっと、finalを付けられる箇所にはすべて付けるようにしています。 ちなみにEclipseを使うと、セーブアクションで自動的にfinal宣言できるので超便利です。 不変オブジェクトを作るために、インスタンスフィールドをfinal宣言するようなケース…