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

マンデルブロ集合を描画しよう

プログラマというものはフラクタルが好きというのは至極当然の話です。マンデルブロ集合、シェルピンスキーのギャスケット、コッホ曲線、etc、・・・。フラクタル系の図形は色々あります。でも自前でフラクタルを描画したことがある人って意外と少ないのでは…

ビット演算には ByteBuffer が便利

モダンでハイソでナウでヤングな Java プログラマの皆様はビット演算なんてものはもはや古代語の如く古めかしく、その上メンテ性が悪いので敬遠されることもしばしばですが、それでも稀にビット演算が必要になる場合が出てきます。あまり使わないせいか久し…

Java のアサーションライブラリ AssertJ の時代が来そうな予感

Java のアサーションライブラリに AssertJ というものがある。 http://joel-costigliola.github.io/assertj/Fluent にアサーションが書けるとのことなので、我がプロジェクトに導入してみました。

Google Guava の transform, filter 系のお話

Java 派な皆様は本日も Google Guava の恩恵を受けていることかと思われます。ある時自社プロダクトのパフォーマンスを調べていて、プロファイルを取ったところLists.transform が上位に出てきてました。

Struts1 の脆弱性対策について (CVE-2014-0094)(S2-020)

更新:Apache Struts2 の脆弱性対策について(CVE-2014-0094)(S2-020) http://www.ipa.go.jp/security/ciadr/vul/20140417-struts.html Apache Struts 2の脆弱性が、サポート終了のApache Struts 1にも影響 http://www.lac.co.jp/security/alert/2014/04/24_a…

Apache Tika があばずれに育ってて泣いた

我がプロジェクトでは Apache Tika というライブラリを利用している。このチカちゃんは、ファイルの中身や名前を元に MimeType を判定してくれたり、ファイル内からテキスト部分だけを抽出してくれたりとなかなか優れたライブラリ、だった。

try-with-resources で lock を使う

Java7 から導入された try-with-resources は Closeable, AutoCloseable を実装したクラスならスコープを抜ける時に自動的に close を呼び出してくれるというものである。例外時にも close してくれるのでリソースリークの心配が無い。さてこの try-with-res…

lombok を採用した結果wwwwwww

冗長なコードがだいぶ減った。 その分ロジックが増え、コードの「濃度」が上がった。

Java のコード量を激減できる lombok がスゴイ

きしださんのブログで知った lombok という Java のライブラリがスゴイ。 http://projectlombok.org/指定されたアノテーションを付与することで、下記のようにメソッドを生成してくれる。 setter や getter の自動生成 toString メソッドの自動生成 hashCode…

いざという時のために覚えておきたい OQL - OQL ヘルプ日本語訳

Java ヒープを解析する際、jhat や Memory Analyzer といったツールを使うことになるが、これらのツールの内部では OQL (Object Query Language) という言語が使われ、ヒープを解析している。 SQL ライクに記述できるこの言語を手で打って使用することは滅多…

Thread.sleep(0) のオーバーヘッドがヤバイ件

あるプログラムがどうも遅いので、調べてみると Thread.sleep(long) が怪しかった。もちろん、スリープしているならプロファイルで遅い結果が出てくるのも頷けるが、Thread.sleep に渡していた値は 0。 どうやら、Thread.sleep(0) のオーバーヘッドは予想以…

クロスプラットフォームな Java コードの書き方

仕事で、Ubuntu 上のみで稼働する Java 製のプログラムを Windows で動くよう対応したので、対応するのに必要だった点を記録しておく。

強烈に素晴らしいプロダクトに変貌した Apache Solr - Solr 4.0 登場

Apache Solr 4.0 がリリースされた。 本記事では Solr 4.0 の新機能や改善された点のうち気になるものを紹介する。 概要 Solr 4.0 では、下記の変更が入る。 83 個の新機能 13 個の最適化 121 個のバグ改修 Solr 4.0 はメジャーバージョンアップにふさわしい…

デストラクタが無い言語はオブジェクト指向言語を名乗るな

デストラクタが無いと、真のオブジェクト指向でコードを書くことはできない。 これが理解出来てない人が割と多いようなので、ここに記録しておくことにする。 前提知識 デストラクタとは、オブジェクトを破棄する際に呼び出される関数 Java のファイナライザ…

Java も brainf*ck も大差無い件

Java で Hello world を書くとこうなる。 \u0070\u0075\u0062\u006C\u0069\u0063\u0020\u0020\u0020 \u0063\u006C\u0061\u0073\u0073\u0020\u0020\u0020\u0020 \u0053\u0061\u006D\u0070\u006C\u0065\u0020\u0020\u0020 \u0020\u007B\u0070\u0075\u0062\u006…

ファイルに書きこみを行ったらかならず fsync しよう

通常、なんの考えも無しにプログラムがファイルに書きこみを行った後、運悪くシステムがクラッシュするとファイルが失われる可能性がある。通常のファイル書き込みはファイルに書き込んでいるように見えて実はバッファがメモリ上に蓄えているだけだからだ。…

String#intern したオブジェクトをロックオブジェクトとして使ってはいけない

「文字列をロックオブジェクトとして利用したい」場合がある。 例えば渡されたファイルに処理をするメソッドで、ファイルごとに排他処理をしたいとする。しかしファイルをそのままロックオブジェクトとして使ってはいけないのは明らかだ。File インスタンス…

Java とサロゲートペアについて

サロゲートペアを知らない人は、その挙動に戸惑うだろう。直感に反する挙動をするからだ。次の Java コードを実行すると何が表示されるだろうか。 String val = "𠮷"; System.out.println(val.length()); val は見た目上は一文字なので 1 と表示することを期…

全文検索エンジン Solr のパフォーマンスチューニングについて

この記事は古くなりました。新しい知見は下記を参照。aoking.hatenablog.jp 概要 全文検索エンジン Solr を使用していて、パフォーマンスチューニングに四苦八苦した話。 ここでは、検索時ではなくドキュメントの追加時についてのチューニングについて記して…

ストライピングロックを試す

マルチスレッドプログラミングでは、ロックの獲得が出来ずに待ち時間が発生し、パフォーマンス劣化の原因となることがしばしばある。そのような場合、まずは下記二点の検討を行う。 ロックの粒度を下げる そもそもロックしないようなアルゴリズムに変える も…

マルチスレッドプログラミングの基本

マルチスレッドプログラミングは直感とかなり異なる挙動をすることが多く、非常に困難なプログラミングであることが知られている。不具合も発見しにくく、高負荷になった時にのみ再現したり極めて稀な状態になった時にのみ再現したり等、解決が困難なだけで…

jstack でスレッドダンプを取る

jstack というツールがある。このツールは、現在実行中の Java プロセスのスレッドの状態を取得出来るツールだ。思ったように性能が出ない時やデッドロックっぽい現象が発生した際はこのツールを使ってスレッドの状態を取得、つまりスレッドダンプを得て、そ…

適切な Java コーディングのために心がけること

良いコードを書くために心がけることを箇条書き。 Close 処理を finally で行う ダメな例 InputStreamReader reader = new HogeInputStreamReader(...); doSomething(reader); reader.close(); doSomething(reader); で Exception が発生した場合に close さ…

finally 句で return してはいけない

finally 句で return すると try{} 句の中で発生した例外が握りつぶされる。 public static void main(String[] args) { try { throw new RuntimeException(); } finally { return; } } 上記コードを実行すると、RuntimeException は発生せず何も表示されず…

Java で簡単マルチスレッドプログラミング

仕事でマルチスレッドを扱うようになったので備忘録として Executors 関連のメモを残しておく。 あるタスクを別スレッドで実行したい時、Executors クラスを使えば自前でスレッドの管理をすること無く簡単に並列処理を行えるようになる。 もちろん完全に簡単…

Java で LISP 的思考を身につけよう

表題の通り、Java を使って Lisp 的思考を身につけようの巻。 リストの長さを得るとき、list.size() ではなく (length list), リストの中身を足し合わせるには (sum list).以上のような考え方を身につけるため、Lisp をいきなり使うよりは慣れた開発環境のほ…

Java は馬鹿が使う言語か?

惜しい。正確には、馬鹿でも使える言語。決して Java 言語を批判しているわけではない。優れた言語だと思う。だがそれは過去の話で、多くのプログラマが Java を好むのは初恋のようなものだからだ。 言語的に古臭くなったとはいえ、それでも業務で Java を使…

System.out を置き換えよう

Java では System.out.println メソッドで hello world 等のメッセージを標準出力に出力できるが、この出力先は変更可能なのです。System クラスには setOut メソッドがあり、このメソッドを用いて System.out を置き換える事ができる。 デフォルトでは標準…

Java で遅延評価式を実装する。

Java は先行評価式の言語であるが、遅延評価を行えるよう遅延評価式の実装を行う。 遅延評価はサンク( Thunk, 遅延評価 - Wikipedia ) と呼ばれ、値が必要になった時点で計算をする。 要件 式を表す事ができること 値を表すことができること 遅延評価が出来…

Java7 の新機能

Java 7 がやっとリリースされたそうで。C# や Scala のような先進的な機能が無く、後方互換を気にするあまり Java は古臭い言語になってしまいつつあるが、 JVM 上で動く言語がちらほら出てきてるので今後20年くらいは Java は主流で居続けるだろうな。きっ…

[1,2,3,...,9,10,20,30,...90,100,200,300,...] みたいなリストが欲しい

1桁の数字を10個、2桁の数字を10個、3桁の数字を10個、というようなリストが欲しい。以下のコードでOK. for( int i=1; i<10000; i = i + (int)Math.pow(10, String.valueOf(i).length()-1)) { System.out.println(i); } 実行結果 1 2 3 4 5 6 7 8 9 10 20 30…

ある文字のバイト数を知りたい時は

ある文字、または文字列のバイト数を取得したい時。(文字列長では無い) String#getBytes().length を使う。例 System.out.println("あ".getBytes().length); System.out.println("あ".getBytes("UTF-8").length); System.out.println("あ".getBytes("Shift-J…

Arrays.asList はプリミティブ型の配列をリスト化してくれない

プリミティブ型の配列をリスト化してくれない。 いや、正確にはリスト化はしてくれるものの、プリミティブ型の配列全体を単一の要素として扱うため極めて直感と異なる動作をする。 //OK Integer[] intArray = {1,2,3}; List<Integer> list = Arrays.asList(intArray);</integer>…

四種類の内部クラス

Java にはクラス内にクラスを宣言する機能がある。 あるクラス内に宣言されたクラスを内部クラス(またはインナークラス)と呼ぶ。内部クラスには以下の四種類があり、それぞれ特性が異なる。 ・static メンバークラス ・非 static メンバークラス ・無名クラ…

型パラメーターへのキャストは絶対に行ってはいけない

通常、ジェネリクスで型指定されたコレクションには指定された型のインスタンスしか格納されない。例えば以下のコードで表される list には Integer クラスのインスタンスしか格納されない。 List<Integer> list = new ArrayList<Integer>(); 上記の list に対して以下のコード</integer></integer>…