エラーメッセージについての愚にもつかない考察
Webアプリの一行入力欄で、入力が制限の長さを超えたときに出すメッセージを考える。
例0。「タイトルが制限文字数を超えています」
例1。「タイトルは半角255文字以内で入力してください。」
例2。「タイトルが長すぎます。120文字以内でお願いします。」
例3。「ぎゃー!タイトル長すぎ!あと28文字減らしてちょ。」
さてこの中だとどれが好きですか?
とりあえず例0は制限が何文字なのか分からないのでアウト。読点がついていないのもホスピタリティー上よくない。
例1は一見普通だが、「半角」という表現を使っていいものかどうかは怪しい。半角と全角が混ざっていたらどうカウントするの?それに、255文字ってなんでそんな中途半端なの?データベースに入る文字数が255だからといってユーザに課す文字数制限が255である必要は全くないだろう。
加えて、この一文はおそらくユーザの脳内でこう変換される。「タイトルが長すぎるのか」
そこで例2に着地する。タイトルが長すぎるという事実を単刀直入に突きつけ、その補足として120文字以内で入れろということを明確にする。文字数もキリがよくてなんとなく納得できる。
例3考えようによっては例2よりもなお良い。冒頭にやや余計なものがくっついているが、長すぎることと短くしなければいけないこと、どれだけ短くしなければいけないかが全て伝わる。「不適切だ」という声がもう聞こえてくるが、では適切とはなんなのか。落ち着いて例3のメリットとデメリットを挙げてみると次のようになる。
メリット:シンプルである。伝えるべきことを伝えている。カジュアルで楽しげである。
デメリット:ネットバンキングなどのシステムには向かない。
ということは、ネットバンキングなどのシステムでなければ例3を採用すべきだということだ。というのは言いすぎだが、例3を「不適切」だと即座に決め付けてしまうのはいくらか性急、判断に適切さを欠いているのではないだろうか。
Antで任意のバッチファイルを実行する
exewrapというソフトを使うと、jarファイルを実行可能な.exeファイルにラッピングしてくれる。
このソフトはコマンドラインで使うのでバッチファイルを書いておくのが現実的なのだが、AntでJavaアプリをJarにパックした後で自動的にexeへの変換をしてくれるとと素敵だ。というわけでそのやり方は以下のとおり。
Exewrap.bat
c:\programs\dev\exewrap\exewrap.exe -g MyApp.jar
Antのbuild.xml
(略) <target name="exewrap" depends="packtojar"> <exec executable="cmd"> <arg value="/c"/> <arg value="Exewrap.bat"/> </exec> </target>
antではexecタスクを使うと任意のコマンドを実行できる。executable属性で実行ファイルを指定するのだが、バッチファイルの場合はcmdを実行し、それに /c batch.bat という形でパラメータとしてバッチファイル名を渡す必要があるようだ。
これはもちろんWindows環境でしか動かない。他のOSでexecタスクを使う場合についてはAntマニュアルで説明がある。
ちなみにexewrapではJavaアプリからサービスとして動くアプリまで作れてしまうので面白い。
Eclipseでデバッグ時の「行番号属性が見つからないため」
Eclipseでブレークポイントを入れてデバッグしようとすると以下のようなメッセージが出た。
行番号属性が見つからないため、ブレークポイントをpackage.SomeClassにインストールできません。行番号属性を生成するには、コンパイラー・オプションを変更してください。
Reason:
Absent Line Number Information
ところがPreferencesを覗いてみるとJava>Compilerで確かにAdd line number attributes…はONになっている。
どうやらAntでビルドした.classファイルをデバッグ時にリビルドしてくれていないのが原因だったようで、Antのjavacタスクに属性debug=”true”を追加してビルドしなおすとうまくいった。
Antビルドファイルに手を加えずにEclipse単独でデバッグ可能なリビルドをするには、ProjectメニューからClean…を実行して明示的にクリーンとビルドをする必要があるようだ。
Velocityのログ出力をオフにする
JavaのテンプレートエンジンVelocityは、デフォルトでカレントディレクトリに勝手にログを排出する。ファイル名は「~.log」で、Velocityとは関係のないスタックトレースも何故か勝手に出してくれる。その上アプリを起動するたびに次のようなメッセージがコンソールに出力されてうっとうしい。
2008/01/14 7:16:26 org.apache.velocity.runtime.log.JdkLogChute log
情報: FileResourceLoader : adding path ‘.’
このログ出力を止める方法がすぐには分からなかったのでメモしておく。
結論から言うと
Velocity.setProperty(VelocityEngine.RUNTIME_LOG, "");
でOK。
うそでした。(2008-01-14 16:00修正)
結論から言うと
Velocity.setProperty(VelocityEngine.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.NullLogSystem");
でOKです。ソースはCleaning up those velocity.log files。
これぐらいのことはDeveloper’s Guideにサクっと書いておいてほしい。
ちなみにVelocity.setPropertyはVelocityEngine#setPropertyへのショートカット。
それにしてもVelocityは使い勝手も可読性も悪い。どうしてもコードは行数が多くなるしテンプレートはごちゃごちゃする。やっぱりSmartyはよくできていると思う。