>

2010年1月31日日曜日

Hello World extensionをビルドしてみる

次はBuilding an Extensionに従いHello World extensionをビルドしてみる。

まずすることは上記サイトのリンク先からHello World extensionをダウンロードして解凍する。次にこの内容に対する説明がmozillaZineのGetting started with extension developmentに詳しく説明されているのでなんとか読んで理解する。

上記サイトによるとChromeとXULの概念の理解が前提条件になっている。
ChromeとXULについてはここで丁寧に紹介してくれている。

とりあえず、概念の詳細な勉強は後回しにしてダウンロードしたHello World extensnionを開発用プロファイルで開いているFirefoxにインストールしてみる。

DLしたhelloworldフォルダを適当な開発に使っているフォルダ(僕はD:\dev\FirefoxExtensions\の下)にコピーする。

次にPROFILE_FOLDERを開く。PROFILE_FOLDERはOSと先ほど作成したFirefoxの開発用プロファイルの名前によって異なる。各OSでのパスはここで説明されている。ここではWindows2000より上に限っていうとWindowsキー+Rで「ファイル名を指定して実行」を開き、"%APPDATA%\Mozilla\Firefox\Profiles"と入力してEnterするとExploreで開かれるフォルダがPROFILE_FOLDERとなる。

PROFILE_FOLDERの下には0v2q6gns.devみたいな名前のフォルダがある。この.より後のdevが開発用プロファイ名と一致しているフォルダが開発用プロファイルの設定を記述する場所である。

さらにその下のextensionsフォルダを開き、そこにhelloworld@mozilla.doslash.orgという名前のファイルを作成する。このhelloworld@mozilla.doslash.orgという名称は今回インストールしようとしているextensionのIDであり、DLしたhelloworldフォルダの中にあるinstall.rdf内で記述されているem:id要素の文字列と一致している必要がある。

で、そのhelloworld@mozilla.doslash.orgファイルの中にはHello World extensionの実体の所在地を示す次の一行を記述する。

D:\dev\FirefoxExtensions\helloworld


これで大方の作業は終わったのだがしかしこのままでは正常にインストールできない。DLしたhelloworldフォルダの中にあるinstall.rdfをエディタで開いてem:maxVersion要素の値を確認する。デフォルトだと1.5.*とかだと思うのでこの値を今使っているFirefoxのバージョンをサポートするように変更する。このエントリを書いているときは3.6だったので3.6.*と書いてみた。

さてこれで本当に設定が完了。Firefoxを再起動するとアドオンダイアログが開きインストールされましたというメッセージが表示される。メニューのツールを選択すると一番下にHello World!というメニューが増えていてこれを押すとHello Worldというウィンドウが開くことを確認できる。

開発環境の構築

Setting up an extension development environment
にはFirefoxを開発用にチューニングする設定や開発に欠かせないアドオンが書かれている。ここに書いてある内容を設定することでプロファイルをFirefox実行時の引数で分離し開発用Firefoxを起動できるようになる。ちなみにここにもほぼ同等のことが日本語で分かりやすく説明されている。設定したらFirefoxのショートカットのプロパティのリンク先を"C:\Program Files\Mozilla Firefox\firefox.exe" -no-remote -P devとかにしておいてそれをデスクトップとかクイック起動とかに置いておくと便利と思われる。
僕は通常のFirefoxにはGoogleツールバーは入れていないが開発用のFirefoxにはGoogleツールバーをインストールして常にログインした状態にしている。マウスオーバー辞書とかBlogger投稿が楽なので。

2010年1月30日土曜日

MyExceptionクラスを作成する必要があるケース

Exceptionを継承したMyExceptionクラスを自分で作る場合は多分次のときだと思う。
  • 自分のプログラムでExceptionに独自の機能を持たせたいとき。どのような機能を持たせるべきかはそのプログラムで採用する例外処理の規則によって異なる。例えばフィールドにログレベルを持たせたRuntimeException継承クラスを作成して全ての例外はベースとなるクラスでログに出力するとか。検査例外(例えばSQLExceptionとか)は全てMyExceptionのコンストラクタに食わせて、同時にメッセージとログレベルを設定してやるとかにしておけば複数のプログラマで開発しているときでも比較的全員に例外処理のルールを周知しやすい。
  • catch節で発生した例外の種別によって条件分岐をさせたいとき。発生した例外の種別によって後処理を切り替えたいときで、Javaで用意されているException(NumberFormatExceptionとか)で意味合い的にちょうどいいのがなかったときも適切な概念を持つMyExceptionクラスを自分で作っても良いかもしれない。ただし、プログラム的に正常系で単にif文とかの代替として例外種別による切り替えをするのはよくないとEffective Javaに書いてあった気がする。あくまで例外系での後処理の切り替えに使用するべきだと思う。例えばログイン時にユーザIDとパスワードの組み合わせが間違っていたのか個人情報を管理しているDBへのアクセスが出来なかったのかを分岐させて適切な表示をユーザに提示するときとかは例外種別による切り替えが適切な状況だと思う。

2010年1月25日月曜日

定数の管理場所

システムで定数を定義する場合はどこで定義するかをちゃんと考える必要がある。
定義する場所はちょっと思いついただけでも次のようなところがある。
ちなみにこの文章で定数と呼んでいるのは結構あいまいで、ローカル変数以外の値のことを指している。

  1. 環境変数
  2. propertiesファイル
  3. J2EEコンテナなどのプラットフォームが読み込む定数ファイル
  4. Constant.javaなどのjavaファイル
  5. JVM引数
  6. Java引数
  7. DB

それぞれの管理場所は変更のしやすさや一覧のしやすさが異なる。またその値を参照できるスコープも異なる。それぞれの管理場所ならではの特性をちゃんと考えて定数を管理すべき場所を考える。

とはいえこれで決まりと言う完璧なルールは存在せずプログラムの性質(ただのJavaアプリであるとかサーバアプリであるとか)や運用スタイル次第なところがあるので自分でそれぞれの特性を考えた上で、運用を想像して最終的な結論を出す。ただ忘れてはならないのがそれぞれの管理場所には必ず差があり、その差に応じた管理場所を真剣に考えなくてはならないということ。

環境変数はそのマシン固有の値であり、1回決めてしまえばその後はほとんど気にする必要がない。システムを構成するマシンのスペックにバラつきがある場合は、そのスペックの影響を受けるであろうjavaのヒープサイズとかはここで決めると便利なことがある。

DBはシステムを構成するアプリサーバが複数台であるとき、どのサーバからも一貫性を保って参照でき、またデータの変更は永続的に残るといった特徴がある。参照の負荷は他のところで定義される値に比べると高い。ユーザの操作によって刻一刻と変化するシステムのステートをあらわす値(主な)やシステムに対して一斉に制御したいトリガ値とかはDBに保存すると良い。基本的にはDBに保存しないとどうしても成り立たない値のみが保存されると考えてよいと思う。

その他propertiesファイルは一覧性と変更のしやすさが比較的高いだとかConstantクラスの値はまず変更は出来ないなど各自で特性を考慮した上で決めるのが大事。

2010年1月24日日曜日

Firefox add-onの種類

extension(拡張機能)とpluginとsearch pluginがあるらしい。

search pluginはデフォルト右上にある検索窓で検索できるサービスを追加するものと思われる。xmlで設定されているようだ。

pluginは外部のexeとかのプログラムと連携する際の橋渡しをするプログラムのことらしい。

extensionはFirefox上で動作して機能を拡張するものらしい。今回の目的であるハイライトを同じように行っているGoogleツールバーやTrendmicroのツールバーもextensionらしく、表示するhtmlの元ソースの中に何かタグを埋め込んで表示することが出来るものと思われるので僕が作りたいのもextensionの作成方法を理解すればよいようだ。

以降
https://developer.mozilla.org/en/Extensions
のドキュメントに従って作って行きたい。

Firefox add-on開発を始めました。

外部ファイルの情報を元に、表示しているhtmlの一部をハイライトするをブラウザ上で表示できるFirefox add-onを作成したいと思い、開発を始めることにしました。

Firefox add-onの知識は全くないので、まずは検索してみたがあんまり噛み砕いて説明してくれている日本語サイトはなさそうでした。先は長そうですが分かったことをなるべく書いていきたいと思います。

2010年1月20日水曜日

DBにアクセスする時のJavaコード

DBに接続するときは最終的に欲しい値(下の例の場合はsysdate)の変数宣言をconn, st, rsの変数宣言の手前で行う。conn, st, rsはDB接続のためのtry/catch/finally節が生み出すスコープのみで有効なのに対してsysdateはそのスコープよりも外で使用されることになるので。

closeのときにcatchした例外はその場で適当にログ出力してthrowしない。ここで例外が発生した場合は既に一つ前のcatch節にも入っている可能性が極めて高く、そちらでcatchした例外の方が有用な情報を持っている可能性が微かに高そうなので。まあこれはケースバイケースかも。

Date sysdate = null;

Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
conn = DriverManager.getConnection (url, user, pass);
st = con.createStatement();
rt = smt.executeQuery("select SYSDATE from DUAL");

sysdate = rs.getDate("SYSDATE");
}catch(SQLException e){
throw new MyException(e);
}finally{
try{
if(rs != null) rs.close();
if(st != null) st.close();
if(conn != null) conn.close();
}catch(SQLException e){
logger.error(e);
}
}