>

2010年2月18日木曜日

Windows上のFlex SDK(Flex Builder)でASDocがうまく作成されない件

WindowsでASDocを作成しようとすると

Error: could not find a JVM.

と怒られる場合は
C:\Program Files\Adobe\Flex Builder 3 Plug-in\sdks\3.2.0\bin\jvm.config
にあるjava.homeの項目を次のように編集する。

java.home=/Program Files/Java/jre1.6.0_07

上記は僕のJVMのインストールフォルダだが要するにC:\...のような形式ではなく/から始まる形式にする。通常はC:\が/に対応する。

2010年2月17日水曜日

ActionScriptのメンバ変数の命名では頭に_をつけるべきか

メンバ変数の名前の先頭にはアンダーバーをつけるべきかどうか。

FlexBuider 3を使用した場合、Javaエディタと異なり、ActionScriptではメンバ変数のフォント色を自動的に変えてくれないため一目で見分けがつかない。
この解決方法として命名規則とかでプレフィックスとしてアンダーバーをつけてこれを解決することは妥当なのか考える。

一目で見分けがつかない不便さの解消方法としては_とかをつける他には全ての参照箇所でthis.をつける方法があるがこの方法と比較してみる。

1)this.は参照箇所すべてに付ける必要があり、コーディング規約としては抜けなく守るのが難しい
2)次のようなコードではthis.はHogeインスタンスを示さないので逆にthis.をつけてはならない。こうなるとthis.がついたりつかなかったりで混乱を招く

public class Hoge
{
 var private myMemberStr:String = null;

 public function AlbumManager(albumUrl:String)
 {
  var proc:MyProcedure = new MyProcedure();
  proc.execute();

  proc.addEventListener(Event.COMPLETE, function(event:ResultEvent):void{
   //ここでthis.を入力するとFlexBuilder3のオートコンプリートではmyMemberStrが
   //候補として表示されるがこれはバグ。
   //この行が終わってもHogeインスタンスのmyMemberStrはnullのまま。this.をつけなければ
   //意図したとおりにHogeインスタンスのmyMemberStrにevent.resultが代入される。
   this.myMemberStr = event.result as String;
  });
 }
}


以上より全ての参照箇所でthis.をつける方法は危険。よって_をつけるのは妥当である。
なお、基本的には_をつけたメンバ変数は基本的にはprivateにし、アクセスにはgetter, setterを使う。getter, setterでアクセスする際は_はつけない方がかっこいいのではないかと思う。(というか普通そうなのかもしれないが。)

//例
//メンバ変数名には頭に_をつける
private var _myMemberStr:String;

//関数名には_はつけない
public function myMemberStr ():String{
 return _myMemberStr;
}


結論として
ActionScriptのメンバ変数の命名では頭に_をつける。メンバ変数はprivateとしてそれにアクセスする際にはgetter, setterを用いる。getter, setterの関数名には_はつけない。

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
のドキュメントに従って作って行きたい。