2008-06-01から1ヶ月間の記事一覧

エンハンサによるPropertyChangeSupportの自動化

今まで何話かバイトコードエンハンサに関してのネタを書いて来たが、その総括として、Swingアプリケーションに限らずよく例として挙げられる、JavaBeansのPropertyChangeSupportによるプロパティ値の変更通知を自動化してみよう。1. PropertyChangeSupportク…

Diablo III

出るぞ出るぞと言われていたが、ついにBlizzardがDiabloの3作目を発表した。DiabloIII /Blizzard Entertainment8年ぶりか、楽しみだなぁ。わくわくするなぁ。追記: 既にかなり開発は進んでいるようで、公開されているプレイ動画を見たが、これはノートはおろ…

Javassist、ProxyFactoryのキャッシュ戦略

cglibにしろJavassistにしろオンザフライで拡張した型を際限無く生成していれば、あっという間にリソースの上限を超えてしまう。普通、生成したクラスの情報はPerm領域に積まれるが、この領域は拡張されていないことが多いためにOutofMemoryを起こしてしまう…

エンハンスされた型のメソッドとアノテーション

Javassistやcglibでクラスをエンハンスする場合、元の型をスーパータイプとして指定するので、拡張される前の型情報は引継がれるはずだが、アノテーションに関してはそうではないので注意が必要だ。以下のようなアノテーションを公開しているとしよう。 @Doc…

Javassistとcglibにおけるメソッドフィルタの指定

既に書いたが、Javassist、cglibは共にバイトコードを出力/書き換えることにより、既存の型を動的に拡張した型を生成することができるが、この機能を利用するために提供されるプロキシ(エンハンサ)は、捕捉するメソッドをフィルタリングすることが可能だ。 …

Java vs Rubyの醜い構図

いろいろと仕掛けている人がいたり、煽っているところもあるようだけど、RubystはそれほどJavaを意識していないのではないか。仕事ではJavaで趣味ではRubyという人も多いだろうし、長い期間をかけて醸成してきたコミュニティは、無益な比較は意味をなさない…

Javassist or cglib

Swingアプリケーション用のバイトコードエンハンサに何を使うかの検討だが、結論としてはデフォルトにJavassistを使い、場合によってはcglibも使えるようにシステムプロパティの値によってエンハンサ(を利用したAOP用プロキシの実装)を選べるようにした。※1J…

developerworksが重い

PC

http://www.ibm.com/developerworks/jp/ ここ暫くの間凄く重たいんだが、またうちのネットワークだけなのか?。追記: サイト検索をかけたがうんともすんとも言わない。何だろこの重さ。追記: 自宅からは普通に使える。やはりネットワーク固有の問題だな。

ならとでも

Javaに限らないレトリックだが、Java"なら"できます、とJava"でも"できます、の違いは重要だ。※ まるごと Ruby! Vol.1 この本、やはり(Rubyに懐疑的な)Javaプログラマは読むべき。今と後10年を考えると、Javaの最大の長所と短所はやはりC言語の構文を真似た…

Swingアプリにおけるバイトコードエンハンサ

Java1.3以降はDynamicProxyというメッセージ(メソッド)捕捉の仕組みを持つが、.NETのRealProxy等とは違い、インタフェースがメッセージ捕捉対象の絶対条件となるため、JavaBeansのPropertyChangeSupportの自動化等、インタフェースが実装されているとは限ら…

週末は本屋さん

まるごと Ruby! Vol.1 やっと買えた。いきなりartonさんの特集記事が良い。「RubyとJavaの比較論」はこれからRubyを学びたいJavaのデベロッパは必読だ。結局、これも買った。 プログラミングRuby 第2版 ライブラリ編 (大型本) 来月か再来月からは仕事で使う…

スレッドストール

Windows VistaにてUSBハードディスク(BUFFALO HD-PSG160U2-WH)の認識後、SecureLockwareの認証ダイアログが出てくるまでに異常に時間がかかるのに相変わらずイラついている。新しいPCの落とし穴以前にも同様のネタを書いたが、その時はHDDへのインデクシング…

JVMが起動されたメインクラス名を取得する

以前に同様のメソッドをスタックトレースから取得する実装にしていたのだが、現在のスレッドのコンテキストによっては当然のごとく期待通りの値を返さない。 public static String getMainClassName() { StackTraceElement[] traces = Thread.currentThread(…

JSTL(標準タグライブラリ)で嵌る

タグライブラリィ(Taglib)のプレフィクスを解決するためのURIは、対応するTLDにおけるtaglib要素内のuri要素と同じものを書く必要がある。旧版(JSTL1.0) <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>新版(JSTL1.1) <%@ taglib prefix="c" …

習慣の生き物

私はJavaでオブザーバを実装する場合、Observable/Observerではなくイベントリスナを使う。 イベントリスナのパターンを既存のクラスに追加するには1. イベントリスナ・インタフェースを作成 public interface IHogeListener extends EventListener { void h…

VistaのボーダーとLookAndFeel

Windows Vistaの標準的なテキストボックスは、このスクリーンショットの様に淵が少しだけ面取りされて描画され、フォーカスの有無によって背景色を変える効果が追加されているのだが(スクリーンショットでは、背景をグレーにして判り易いようにしている)、Ja…

JavaでURLを開く

組込みのクラスを使う方法と、URLを扱うことのできる外部プロセス(コマンド)を起動する方法がある。 組込みのクラスを使う Java組込みのクラスを使うことでOSに依らずにURLを開くことができる(大抵はWebブラウザか、そのプラグインを使うことになる)1. Java6…

RMIローカルレジストリをシャットダウンする

以下のコードでできるはずだと思ったのだが、上手くいかない Registry registry = LocateRegistry.getRegistry("localhost", Registry.REGISTRY_PORT); UnicastRemoteObject.unexportObject(registry, true); 実行結果 java.rmi.NoSuchObjectException: obje…

恣意的な生産性

いい加減、JavaとRubyの直接比較は止めた方が良いのではないだろうか。 双方ともに現時点での用途と良さがあるのだし、言語としての性格もかなり違うので直接比べるのは難しいと思うのは私だけだろうか。特に、生産性に関しては短期と長期、ソフトウェアのラ…

カフェイン中毒

煙草は止めることが出来たが、カフェインだけは止められない。 飲むと煙草が欲しくなるという理由で最初は避けていたが、最近では一日にコーヒーなら2杯、紅茶2杯は飲む。煙草吸っていた頃と違うのは、砂糖が入っている等の缶コーヒーの類は一切止めたこと。…

岩手で震度6強

がけ崩れも起きているようだし、かなり強い地震だったんだな。 ところで今回、緊急地震速報はちゃんと機能したんだろうか? 緊急地震速報、検知の3秒後に - MSN産経ニュースまた使い物にならなかったようだ。 とは言うものの、震度5だった仙台では10秒前に警…

砂上の楼閣?

infoq オープンソースの違反により、MicrosoftがSandcastleを削除 infoq Microsoft has Pulled Project Sandcastle for Open Source ViolationsOSSか否かの定義は正直どうでもいいから、デベロッパからドキュメント生成ツールを奪わないで欲しい。 だって、…

JMXのローカルコネクタアドレスを取得する

現在起動されている全てのVMのJMXローカルコネクタアドレスを取得する処理を、汎用的に使うために簡単な関数にした。 static final String CONNECTOR_ADDRESS = "com.sun.management.jmxremote.localConnectorAddress"; public static String[] getJMXLocalC…

ダウト

昨日のエントリから。 なお、上記では取得したMXBeanをインタフェースに直接キャストしているが、実際にはMBeanServerConnection#isInstanceOfメソッドを使って、現在接続しているMXBeanの型を前もってチェックすることで、InstanceNotFoundExceptionを捕捉…

プラットホームMBeanサーバと独自MXBean

Java6より、インタフェースとアノテーションによってMXBeanは非常に簡単に作れるようになった。 例えば私が実際に作っている「コードベース及びソケットのリスンポートを返すMXBean」は、以下のようにインタフェースにMXBeanアノテーションを付加することで…

どんどん使おうMXBean

MBeanは発表当初は実装の面倒さや、管理/監視目的のために用意された、どちらかというとニッチ向けのテクノロジとして紹介された為、サーバベンダー以外、いまひとつ積極的に使うユーザいなかったようだが、Java5->Java6とバージョンを重ねる度にクライアン…

起動プロセス中のJVM情報を列挙する

以前に書いたアタッチAPIよりも詳細な情報にアクセスしたい場合にはsun.jvmstat.monitorパッケージを使う方法もある。(というか、恥ずかしながら最近知った) MonitoredHost host = MonitoredHost.getMonitoredHost("localhost"); for (Object lvmid : host.a…

JVM毎に公開されるJMXローカルコネクタアドレスを取得する

複数のJVMで公開されているプラットフォームMXBean等のJMXBeanは、当然同一の名前を持っている訳で、その場合同一ホスト上の複数のJVM毎に公開されているはずのMXBeanに接続するにはどうすれば良いのか解らなかったのだが、ちゃんとドキュメントに書いてあっ…

凄いな。こんなん久しぶりだ。

凄くショック

だ。 秋葉原はもう暫く行っていないが、報道された現場の映像はどこも見覚えがある場所ばかりだった。 それだけに背筋がぞっとした。