- mod_jk or mod_proxy_ajp [hideaki]
- mod_jk or mod_proxy_ajp [otsuka]
- mod_jk or mod_proxy_ajp [hideaki]
- S2JDBC [otsuka]
- S2JDBC [koichik]
- Struts2 入力フォームの確認画面 [matobat]
- Struts2 入力フォームの確認画面 [otsuka]
- Struts2 入力フォームの確認画面 [matobat]
- Struts2 入力フォームの確認画面 [otsuka]
- Struts2 入力フォームの確認画面 [matobat]
- Struts2 拡張子をhtmlにしていると… [matobat]
- Struts2 拡張子をhtmlにしていると… [otsuka]
- Struts2 拡張子をhtmlにしていると… [matobat]
- Struts2 はじめました [otsuka]
- Struts2 はじめました [matobat]
2009年4月21日
Java | JJUG Cross Community Conference
JJUG Cross Community Conference 2009 Spring
今日は早起きして行ってきました。開始時間を間違えて早く着いてしまいました。
今年はもう何でも「クラウド」って付けておけばいいんだなと思いました。
MapReduceについて全く分かってなかったので、Hadoopのセッションはとても役に立ちました。
2008年7月23日
Java | YouTube API その後
OZACC.blog: YouTube APIの刷新去年の9月にこんなことを書いていて、「今月中」どころか結局保証期限まで残り1ヶ月になってようやく着手した。前に仕事で作ってたYouTubeライブラリを修正しなければ。まだ一年あるからと思っていると、あっという間にまた夏が来てしまうので今月中にやる。
その間にGoogle YouTube APIの日本語ドキュメントも整備され、Google Data APIのバージョンも1.20になり、開発しやすくなっていた。おかげで1日も掛からずライブラリを修正できた。
なぜYouTubeのAPIにJavaMailが必要なのか未だに分からないが。
2008年2月19日
2007年11月16日
Java | FLVとURLRewriteFilterとStruts2
if url is for an flv it must have .flv extension and take no parameters
動的に生成したFLVファイルをサーバから返して、Flashで再生しようとすると上のようなエラーが出た。訳すと「FLVを示すURLなら拡張子は.flvじゃないといけません。また、URLにパラメータが付いててもダメです」。
この規則を知らなかったので、「http://example.com/path/to/flv.do?name=value」みたいなURLで、何故再生されないんだろうと孤軍奮闘してました。
で、この規則を知って回避方法があるんじゃないかといろいろとトライしていたのだけど、結局URLRewriteFilterを使うことに。「http://example.com/path/to/value.flv」といった形のURLを上のパラメータが付いた形のURLにリライト。これでFlashPlayerは騙せる。
ところが今度はリライトしてるのにNotFoundが出るようになった。Struts2とURLRewriteFilterが相性悪いのかと思ってググってみると、ズバリそうだった。
Forward not working with Struts 2...
Struts2はサーブレットではなくフィルターで処理を行うので、web.xmlの<filter-mapping>で<dispatcher>を指定する必要があるらしい。<dispatcher>なんて今まで使ったこと無かったので、このページでお勉強。
デフォルトではリクエストが来たときにしかフィルターを適用しなので、Struts2の<filter-maaping>を以下のように設定すればよい。
<filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> <1/filter-mapping>
2007年11月14日
Java | Struts2 Type Conversion
ClassName-conversion.properties ファイルを用いてパラメータの型変換を行う場合、そのパラメータに該当するプロパティにgetterとsetterの両方がないと変換が行われない。setterだけではダメ。
ということに気付くまでに1時間以上。人生について考えさせられた。
Java | Log4j から LogBack
commons-logging + log4j な環境から slf4j + logback への移行メモ。
削除
・commons-logging.jar
・log4j.jar
追加
・slf4j-api.jar
・jcl104-over-slf4j.jar
・log4j-over-slf4j.jar (これは要らないかも)
・logback-core.jar
・logback-classic.jar
設定
・Log4jのAppenderにあったThresholdパラメータは、LogBackではThresholdFilterとして実装されている。
TODO
・LogBackのSMTPAppenderの文字コード調査。
Java | mod_jk or mod_proxy_ajp
Tomcat FAQ - ConnectorsApache2.2 + Tomcat 6の連携にmod_proxy_ajpを使っていたのだけれど、どうも調子が悪い。ApacheのエラーログにWhich connector: mod_jserv, JK, JK2, mod_webapp or mod_proxy?
mod_jk is great and should be used for production. It is still under active development and also works for the apache 2.X series for cases where you do not want to use mod_proxy_ajp.
The timeout specified has expired: ajp_ilink_receive() can't receive headerと残っていたが、何が原因なのか分からない。ProxyPassのパラメータをいじって様子を見ているが、もう一回同じエラーが起こったらmod_jkを使うことにする。いや、多分明日にはmod_jkに変更してると思う。
mod_jkの方が細かい設定ができるし。mod_proxy_ajpでJkUnMountの機能はどう実現すればいい?
2007年10月26日
Java | Red5 再び
またRed5なお仕事をすることになったので、前回使った0.6.2からsvn trunkにバージョンアップして環境を構築。すぐにできるべと思っていたら、0.6.2からは大きく変わっていて、まずServlet API 2.5に依存していた。このせいで初めてTomcat 6をインストール。
とか何とかもういろいろあって、動かすまでに丸一日かかった。もう書くのも面倒くさい。疲れた。お陰で金八先生もライブで見られなかったし。ドキュメントなさ過ぎ。
0.6.2の時に出来なかったTomcatのシャットダウンができるようになっている点が嬉しい。(0.6.2の時はTomcatのプロセスをkillするしかなかった)。
Log4jとLogbackとSLF4Jの関係が分からない。この辺りのjarファイルがたくさん入っているのだが。
2007年10月24日
Java | S2JDBC
via ひがやすをblog
ドキュメントに一通り目を通した。すばらしいデザインのAPI。
特に気に入ったのが「検索条件」で説明されているSimpleWhereクラスを使ってHibernateで言うところのCriteriaオブジェクトを組み立てるところ。「valueがnullの時は追加されません。」、「valuesの配列の長さが0の時は追加されません。 」という思いやりのお陰で入力値がnullじゃなければという冗長な条件節を省ける点がユニークで便利な機能だと思う。要件がピタリと合えば、相当楽チンになるはず。
ただ書いていて気付いたけど、こういう場合に僕は if (StringUtils.isNotBlank(departmentName)) と、nullだけじゃなくて空文字列やホワイトスペースだけの文字列も検索条件から外すケースが多いので、SimpleWhereクラスのようなnullチェックだけだと足りないかも知れない。
複雑なSQLが必要なときにはS2Dao使った方が良さそうに思うけど、Daoインターフェースを作るのが面倒くさい位のものであれば、ここで書かれているようにサービスクラスのメソッド内でサクッと実装しちゃうのが便利そう。
こうするとデータアクセス層を独立させたレイヤー構造は崩れちゃうけど、publicプロパティにしてもお堅いJavaの暗黙の縛りを解いて、開発効率を上げようという姿勢はいいと思う。
Seasar2では、トラブリにくくするために、いたずらに機能を増やすのではなく、トラブリやすい機能は意図的に削っています。こういった潔さもGood。
2007年9月13日
Java | Ivy
Javaの依存ライブラリ管理ツール。
検索してもマイコミの記事「Jayasoft、ライブラリの依存関係を管理、Ivy 1.3 公開ほか」くらいしか出てこなかったので、人気ないのかも。
Red5のtrunkで使われるようになっていたので調べてみたけど、まあ普通はMaven使うよねー。
2007年9月 7日
Java | JMX
Java Management Extensions (JMX)
JMXについて勉強したいのだが、Java 5でJava SEにも取り込まれたにも関わらずまだ日本語の書籍はなかった。洋書も4~5年前に出たものばかり。
まずは上のページに目を通してみよう。PDFだったら一気にプリントして読めたのに。
その他、参考になりそうなJMX解説ページ。
2007年8月27日
Java | Log4J SMTPAppender 日本語対応版
3年弱前にLog4J-1.2.8のSMTPAppender日本語対応版を作ったけど、先日バージョン1.2.14にも手を入れたので使ってみたい人はどうぞ。
http://spring-ext.sourceforge.jp/maven/log4j/jars/log4j-ja-1.2.14.jar
2007年8月16日
Java | Struts2 ParametersInterceptorのエラーログ
[ERROR] ( com.opensymphony.xwork2.interceptor.ParametersInterceptor.setParameters ) ParametersInterceptor - [setParameters]: Unexpected Exception caught setting 'noCacheIE' on 'ExampleAction: Error setting expression 'noCache' with value '[Ljava.lang.String;@4c03d4'
Struts2のActionに対してのリクエストで、Actionクラスに定義されていないプロパティ名のリクエストパラメータがあった場合に上記のようなエラーログが出てしまう。GETリクエストでキャッシュ防止用のパラメータとかを付けただけでもエラーログが出てしまうので困ってしまう。
こういう場合はサーバ側で必要なくても受け取り得る全てのプロパティ(のsetter)をActionクラスに定義しなければいけないのか?
こんなのエラーログ吐かなくてもいいじゃんと思うけど。でも開発時には役立つからDEBUGレベルのログならいい。
2007年7月12日
Java | Struts2 バリデーションエラーの有無
Struts2ではViewにJSPを使っているのだけど、<s:fielderror /> タグが id や cssClass 属性を無視して <ul> タグ付きでバリデーション結果のエラーメッセージを出力してしまう。スタイルシートでエラーメッセージを目立たせるために、<s:fielderror /> に <div> タグをラップして、それにスタイルを設定するやり方で何とか対処した。
が、今度はエラーがない時でもその <div> タグが出力されてしまうせいで、ちょっと表示がおかしくなってしまう。エラーのあるなしを判断しないといけないのだが、そのやり方が分からない。Struts1では <logic:messagesPresent> というtaglibで条件分岐できたけど、Struts2でのそれっぽいやり方が分からない。
結局ActionSupportクラスに getFieldErrors() というメソッドがあったので、
<c:if test="${fn:length(fieldErrors) gt 0}">
<div class="fielderror"><s:fielderror /></div>
</c:if>ってなJSPコードで対応できた。他にもっとダイレクトな方法がありそう。
<s:fielderror /> はフィールドを指定しても <ul タグを吐いてしまうのでダメな感じ。Strutsタグはテーマとかテンプレートとかを自作しないと、標準の状態では痒いところに手が届かないな。
今回ソースも追おうとしたけど、apacheやopensymphonyにリポジトリが文才している状況が引っかかる。個々のライブラリを組み合わせる形でフレームワークが成り立つのはメリットなのかも知れないけど。
2007年7月10日
Java | Struts2 入力フォームの確認画面
個人事業主のつぶやき | Struts2 Sample と Spring 続報Struts2で、入力フォーム→確認画面→完了画面のフローを実装する場合のベストプラクティスを探していたんだけど、Struts2のサンプルアプリの中にもこのフローを持つものがなかった。バンドルされているインターセプターのドキュメントにも一通り目を通してみたけど、ズバリこれを使えみたいなものはなかった。さて、Struts1では、struts-configでactionのscopeを決めることが出来る。
私は(良いやり方か分からないが)こういう確認画面を挟むような画面はsession="scope"にして、作ることが多い。
こうすると、確認画面にhiddenを書くことが無くなるため、
かなりの労力軽減になる。それをStruts2で実現する方法が見付からなかった。
そのため、一時的にformをsessionに詰めるということをしている。
(confirm,submitの1行目がそれにあたる。)こうやるしかないのか?ちょっと分からない。
上記ページのようにSessionに直接入力内容オブジェクトを保持するしかないのだろうか。何となくスマートな感じがしなくて、僕も「こうやるしかないのか?」とちょっと納得いかない気分。
Sessionを使わず、<s:hidden>タグと<s:token>タグでやる手もあるが、<s:hidden>タグではStruts1の<html:hidden write="true">のようにwrite属性がサポートされていないので面倒くさい。
関係ないけど、Execute and Wait Interceptorはオシャレ。
2007年7月 9日
Java | Struts2 拡張子をhtmlにしていると…
Struts Actionの拡張子を
<constant name="struts.action.extension" value="html">と設定して「.html」にしていたんだけど、この設定はAjaxタグを使おうとする場合にNGだということが分かった。
<s:datetimepickr>を使うとStrutsがカレンダーのテンプレートファイルを読もうとするのだけど、そのテンプレートファイルの拡張子も「.html」の為、StrutsがAction実行だと勘違いしてテンプレートが見つからないヨというエラーを吐いていた。
「.html」を使わない方がいいとなると、結局また「.do」か、それとも「.action」にするか。「.cgi」なんて拡張子も新鮮な感じがする。そういえば、拡張子なしでAction実行するにはどうすればいいんだろう。Struts1だと、/exec/action_name みたいな呼び出し方法があったけど。
このエラー原因に気付くまでにまた大分時間を喰ってしまったが、ようやく表示できたDojoのカレンダーはあまり格好よくなかった。どこまでカスタマイズできるか、見極めるのにまた時間を要してしまいそうだ。
2007年7月 6日
Java | Map-backed ActionFormをStruts2で
Struts 1.xにはMap-backed ActionFormsという仕組みがあり、動的に生成される複数の入力フィールドの送信に対応できたけど、これと同じようなことをStruts 2で実現する方法が分からない。
例えばブログエントリーに対する未チェックのコメント一覧があったとして、一覧の各コメントに公開または削除のラジオボタンがあり、どちらにチェックをしていって最後に送信すると各コメントが公開されるか削除されるかする。この場合、各コメントのIDとラジオボタンの値が取得したい。
Struts 1でできるのだから、きっと何か方法はあるはず。
誰かご存じでしたら教えてくださいー。
[追記]
ひとつ方法は見つけた。いちいちMapに格納されるクラスを作らなければいけないのが面倒くさい。
http://struts.apache.org/2.0.8/docs/type-conversion.html
http://forums.opensymphony.com/thread.jspa?messageID=9960⛨
The reason you need tha intermediate object (Answer) is because of a deffeciency in WebWork. This is getting fixed in 2.2 so you could just have a map of Integer -> String (or whatever).とあるけど、intermediate classなしでもできるのかな?
[更に追記]
できた。Actionクラス-conversion.propertiesファイルで
Key_xxx = java.lang.Integerを設定。Actionクラスでは
Element_xxx = java.lang.String
Map<Intger, String>のxxxプロパティを持つ。HTMLフォームではname="xxx[123]"といった属性をもつinput要素を作成する。
2007年7月 5日
Java | Struts2 はじめました
今取り組んでいるプロジェクトの納期に多少余裕があるので、Struts2を使ってみることにした。
Strutsとは名ばかりで、Struts 1.xとは別モノ。懐かしのWebWorkがベースになっていることを初めて知った。
そして使い方がさっぱり分かりません。参考書もまだ売ってないし、日本語の情報もちょっとずつ散在してるし、本家のドキュメントもWikiになっててどこから読んでいいのかよく分からない。
とりあえずHello Worldまでは出力できた。「.action」という拡張子はどうやったら変えられる?
2007年7月 3日
Java | アップロードされたファイル名のUnicode正規化
先日まで知らなかったのだが、Unicodeでは濁点や半濁点の付いた文字、例えば「が」を表すのに二種類の方法があるそうだ。NFCとかNFDとか詳しくはこの辺りを読んでもらうとして、一般的にはNFCが使われているのだがMacOS XのファイルシステムではNFDで正規化されたUnicodeが使われている。
で、時々この違いが問題になる。例えばWebでアップロードされたファイルのファイル名を扱う場合。Strutsなんか使っちゃって、FormFile#getFileName() で取得するファイル名はMacからアップロードされた場合に文字化けしてしまう可能性がある。
そんなときに使うのが、Java 6から導入された java.text.Normalizer。詳しくは以下のページを参照。Java SE 6 じゃじゃ馬ならし Unicode の正規化
要約すると、
String fileName = Normalizer.normalize(formFile.getFileName(), Normalizer.Form.NFC);こうしておかないとヤバいかもよってこと。
2007年6月29日
Java | Terracotta
【ハウツー】JVMレベルでクラスタリングを可能に - OpenTerracotta (1) JVMレベルのクラスタリングって何? | エンタープライズ | マイコミジャーナル
Red5のMLを読んでいると、Terracotta、Terracotta…とよく出てくるので、なんで植木鉢が関係するんだろう?、そういう言い回しが英語にあるのかなと思っていたら、TerracottaというJavaのプロダクトがあった。
検索してもこの記事以外に日本語の情報がほとんどないけど、このプロダクトすごいんじゃないか? 用途がちょいと違う気がするけどMemcached使うよりも良さそうな雰囲気。今後要調査。
2007年6月21日
Java | 一定時間で削除されるCollection実装
WeakHashMap (Java 2 Platform SE 5.0)
キーのリファレンス参照がなくなると、そのMapエントリーが自動的に削除されるWeakHashMapというMap実装があるけど、エントリーを追加してから3分経ったら自動的に削除されるようなCollection実装はないですか?
追加した日時を持っておいて、スレッド回して管理する実装を作るしかないですか?
2007年4月25日
Java | Eclipseプラグイン - Explore It
パッケージ・エクスプローラ上のファイルやフォルダのコンテキストメニューからWindowsのExplorerを起動するEclipseプラグイン「Easy Explorer」を昔から愛用しているのだけど、FlexBuilderでは使えなかったので初めてプラグインを自作してみました。
Easy Explorerのソースを参考に、FlexBuilderでも使える拡張ポイントだけを使用し、さらにEasy Explorerにはない機能を設定項目に加えました。Windows版のEclipse 3.1以降とFlexBuilder 2.0以降で使えると思います。Java 6で動かしてないとダメかも。
更新サイトURLは http://www.strippers.jp/eclipse/updates です。
Eclipseプラグインの構造がまだ理解できてないんですが、本格的なEclipseプラグインを作ることはかなり大変だということが分かりました。
2007年2月22日
Java | Timerクラス
Timer (Java 2 Platform SE 5.0)JavaのTimerクラスの挙動について完全に勘違いしていて、1つのTimerインスタンスに対して登録された複数のTimerTaskでも独立して実行されると思い込んでいた。各 Timer オブジェクトと対応するのは、タイマーのタスクをすべて連続して実行するために使用される、単一のバックグラウンドスレッドです。タイマータスクは迅速に実行される必要があります。タイマータスクの完了に時間がかかりすぎると、タイマーのタスク実行スレッドが「占有」されます。これにより後続のタスクの実行が遅れ、違反したタスクの完了時 (完了した場合) に、立て続けに「まとめて」実行されることになります。
実際は、ひとつのTimerTaskが遅延したら、他のTimerTaskの実行が遅れてしまう。
ここに詳しく書かれてる。(SDCへのログインが必要)
http://sdc.sun.co.jp/java/private/techtips/2000/tt0530.html#2
2007年2月13日
Java | Java 6 vs 1.4
昨日、Javaで作成している画像処理プログラムで、JVM 1.6と1.4の簡単なパフォーマンステストを行ってみた。Java 2DとImageIOでの処理が主なものだけど、JVM 1.6では1.4に比べて150%程度の速度向上が見られた。
ここまで差が出るとは予想していなかっただけにビックリ。それだけ。
2006年12月25日
Java | Tomcat POSTサイズの上限
Enjoy�StudyTomcatにこんな制限があったことを今日初めて知った。server.xmlのConnectorに、maxPostSizeを追加して対処しました。
2006年12月13日
Java | Java 6でパフォーマンスアップ
Java SE 6: Top Ten | Danny Coward's Sun WeblogDouble digit improvements in performance, client and server.
早速Java 6をPCにインストールしてみた。Eclipseが速くなった気がする。気のせい? いや、速くなってる。Tomcatの起動も速くなってる。測ってはないけど。
2006年12月12日
2006年11月29日
Java | Trove
GNU Trove: High performance collections for Java.
ONJava.com -- Enhance Collection Performance with this Treasure Trove
via 新・たけぞう瀕死の日記
高速なコレクションAPI。初めて知った。ONJava.comの記事を見ると、記事が古いからアレだけどJDKのものよりかなり早い。
2006年11月12日
Java | Seasarカンファレンス
1コマ目から参加してきました。
新宿を過ぎたあたりからウンチしたくなって、市ヶ谷から早歩きで法政大学を目指す。春のSeasarカンファレンスと同じ会場だったので、場所はバッチリ分かる。何とかタワーに入って、1階のトイレに駆け込んだのだが、何かの資格試験をやっていたせいかおっちゃんで大混雑。即座に1階のトイレは諦め、会場となる26階のトイレを目指す。
こんな時に限ってエレベーターがなかなか来ない。ようやく来たエレベータは26階に向かって急上昇。じっとはしていられず、エレベータの中でもモジモジ。やっとエレベータが止まった、と思ったらそこは25階。「誰だよ、25階で降りる奴は!!」と心の中でいちゃもんをつけ、ようやく着いた26階で扉が空いたら受付も無視して、トイレへ急ぐ。
トイレ前でtakaiさんと出会う。久しぶりですと挨拶し、「どうですか、調子は?」と訊かれたので、「うーん、ウンチしたい」と率直かつ大変失礼な返答をしてしまった。ごめんなさい。
それ以降、スッキリとしたお腹でセッションを拝聴し、ウンと勉強させていただきました。セッションを聴いてる側からアイデアが浮かんできて、今はその制作に対するモチベーションが高まってます。
ちょっと用があったので残念ながら懇親会には出られなかったけど、会場でビールをくすねてきたので、晩ご飯の時に飲みました。ごめんなさい。
Java | S2ファミリーの名称
むぅ、S2ファミリーを普段から追っているわけではないので、もはやプロダクトの名前とその内容を覚えきれなくなってしまった。。。
「Seasar2.3、S2Dao、S2JSFの時と比べて覚えなければいけないプロダクト名が2倍になった」感じだ。
味気ないけど、S2Daoのようにプロダクトの意味を含んでいる名称ならまだ覚えやすい。沖縄特有の固有名詞が付くと、英語以上に韻に馴染みがないし、またプロダクト内容を連想させるものでもないので、これ以上増えてくると大変だ。
明日はしっかり勉強させてもらおう。
2006年11月 6日
Java | Javaのメモリ管理
苦手な分野だったけど、調べる必要性に迫られていたところ、ある方からチャットで分かりやすく説明してもらえた。僕の無知をさらけ出してしまい、「仕方ねえなコイツ」くらいな感じだったのでしょうか、基本からレクチャーしてもらえました。
せっかく教わったので、しっかり自分のものにするために復習します。
Java Pressと、Javaのヒープ・メモリ管理の仕組みを熟読しておきます。
2006年9月13日
Java | ImageIO GIFプラグイン
プログラミングと開発者のためのCodeZine:JavaにおけるGIFファイルの取り扱い(Java, GIF, Image I/O)FreeHEPとやらを使えば、ImageIO経由でGIFフォーマットの書き出しができるらしい。FreeHEP Java Libraryは、高エネルギー物理学のためのライブラリで、ライセンスはLGPLとなっています。現在、2.x系の開発が進められているようですが、成果物の供給がMavenに依存しているため、手軽に使える1.2.2を使います。freehep-v1.2.2.zipをダウンロードし、その中に含まれるfreehep-base.jar、freehep-graphics2d.jar、freehep-graphicsio.jar、freehep-graphicsio-gif.jarの4ファイルを取り出してください。
2006年9月 6日
2006年9月 1日
Java | Maven Repo Search復活
今更だろうけど、ずっと更新されないままになっていたMaven Repo Searchのデータを更新しました。
クローラーを、勉強を兼ねてPhtyonで作りました。どうせやるんならMaven 2に対応させろ、と思う方もいるかも知れませんが、まあ追々。
2006年8月15日
Java | DelayCloseIndexSearcher
[#LUCENE-445] Contrib.: Thread-safe DelayCloseIndexSearcher. - ASF JIRA
Lucene検索でToo many open filesエラーが起こるので、上記のDelayCloseIndexSearcherを導入してみた。これは「Lucene入門」にも書かれていたマルチスレッド下での検索パフォーマンスを上げるための方法。
Jmeterを使ってWebサイト経由で検索の負荷テストを行ったところ、IndexSeacherインスタンスを検索の都度生成する方式だと、10スレッドからの同時アクセスを超えた辺りでエラーが起こるようになってきたが、DelayCloseIndexSearcherを使ってIndexSearcherインスタンスを共有する方式だと、このエラーは起こらなかった。
インデックスファイルのフォーマットや大きさ、更新頻度など色々な要因がありそうなので一概には言えないけど、WebサイトでLuceneを用いた検索機能を提供するならDelayCloseIndexSearcher(か同等の仕組み)は導入しておいた方が良さそうだ。
2006年8月14日
Java | Leuene メモ
あ: Lucene 2.0.0メモ。古いAPIが削除されたので、JapaneseAnalyzerがコンパイルできなくなった。まあ簡単に対応できるけど。
TokenFilterのコンストラクタが変わったので、その継承クラスを直すのと、demo使うならField周りだけ。
他にもLucene関連で気になるエントリーが。
2006年8月 4日
Java | TomcatでJSPディレクティブの余計な改行を出力しない方法
アガテナ - TomcatでJSPディレクティブの余計な改行を出力しない方法知らなかった。僕も改行が出力されるのが嫌いだったので、複数のディレクティブを入れる場合はできるだけ改行を入れないようにしていたけど(後から読みにくくなるが)、これですっきりと書けそう。JSPで出力されたHTMLの先頭で、JSPディレクティブの場所の部分に余計な改行が出力されて、気持ち悪さを感じておりましたが、conf/web.xmlのJSPサーブレットでtrimSpacesで設定できることがわかりました。
ちなみにResinの場合、JSPディレクティブの後に「\」を入れると改行の出力を抑制してくれます。
2006年7月 4日
Java | Rad Upload
Rad Upload :: HTTP File Upload With Drag and Drop
ブラウザ上にドラッグ&ドロップでファイルをアップロードできるJavaアプレット。
クライアントサイドでのファイル圧縮まで実装されているのはGOOD。
2006年6月 2日
2006年5月16日
Java | S2DaoでOracleのヒント
AnsweringYourQuestions - SeasarWiki外部SQLファイルでヒントを埋め込んだのに、そのヒント指定のコメント部分が丸ごとなくなってる・・・と、ググってみたら、ちゃんと本家のWikiに書いてありました。Oracle なら「/*+ ヒント[ヒント] */」ではなく「--+ ヒント [ヒント]」を指定すればよかったはずです
なるほど、「--+ ヒント」のようなコメント形式でもヒントとして使えるんですね。
ヒントが使えるのも、S2DaoのようにSQLが自由に書けるというメリットのお陰です。
Java | Seasarカンファレンス
もう一昨日ですね。参加してきました。メインセッションはShotさんと和田さんの二つに出席、あとはコミッタブースでミニセッションを聴いていました。概要の説明を中心とするメインセッションよりは、コードや動くものを見せながらのミニセッションの方が僕にとっては面白かったです。コミッターの方々が「○○のコミッター」と記載された名札を首から提げていてくれたので、興味あるプロダクトの開発者を容易に見つけることができました。
コミッタブースでうろうろしていたところ、takaiさんに久々に再会。僕が書いた先日のエントリーを読み、SIMPURE Nを買ったそうですが、ソフト面がかなり使いにくくダメダメ携帯であると力説してくれました。(takaiさんのブログURLを教えてください)
そしてtakaiさんと話している横で、あのセレブエンジニアが個人会員10口の申し込みをして、皆の注目を浴びてました。僕はそのセレブの後で「一口でもいいですか…」と一応申し込んでおきました。セレブがセレブたる所以を目の当たりにしました。
社内ではJavaやPHPの話をする人がいないので、開発者と話ができたり、新しい刺激を受けたりできるこういう場は僕にとっては貴重。あっという間の五時間でした。
2006年5月 8日
Java | Seasar HOT Deploy
約10ヶ月前に開発のターンアラウンドタイムというエントリーを書いたけど、このターンアラウンドタイムを短くするための機能がついにSeasarに実装された。文字通り「これは、Javaの開発生産性を飛躍的に向上させるブレークスルーだ」と思う。
Javaでの開発はいちいちAPサーバをリロードしたり、デプロイするのに時間掛かって面倒くせーなーと思っていたけど、これで相当効率上がるのではないだろうか。まだ詳細を追ってないけど。
2006年4月25日
Java | 関口宏司氏のLucene
国産のLucene本が出るみたい。Luceneに関する書籍はManningの「Lucene in Action」以来かな? 著者名でググってみたら著者の関口氏によるLuceneについてのブログが見つかりました。マニアックです。関口氏も書かれているように日本ではNamazuの方が圧倒的に人気がありますね。先日アルファリリースされたPHPのZend Frameworkでは、フレームワークが提供する検索の仕組みとしてわざわざJavaのLuceneを呼ぶようになってました。このことだけでも海外での人気は高そうな気がします。
Lucene + Lucene-ja + Senの組み合わせは、Lucene 1.4系でしか動かないのかと思ってましたが、このエントリーを読むと最新の1.9系と組み合わせてますね。バージョンアップにトライしてみます。
2006年4月11日
Java | Struts「キャンセルボタンによる検証無効化機能」
【Jakarta/Apacheウォッチ】第25回 リリース間近!アーキテクチャを一新したStruts 1.3:ITpro全然知らなかった。。。しかし,キャンセルボタンを想定していないアクションでは通常は isCancelled メソッドを呼び出すことはせず,入力検証が動作しているものとして処理を実装してしまう。このとき悪意あるユーザーがフォームの値と共に,キャンセルボタンを押したのと同等の特定のキーと値をHTTPリクエストパラメータとして送信した場合,入力値検証が行われずにアクションが実行されてしまうことなる。Strutsクラッシックユーザーは注意していただきたい。
幸い最近のStruts使ったプロジェクトでは大事に至る箇所はなかったけど、以前に使ったものはどうだろう。
2006年4月 7日
Java | Maven Repo Searchは更新されてません
Maven 1.x用のMaven Repo Searchですが、かなり前からデータが更新できていない状態です。修繕を試みているのですが、まだ直ってません。新しいバージョンのjarファイルなどが反映されていないのでご注意ください。
2006年3月28日
Java | James君!
via オレンジニュース
これはすごい。一冊の本にしてもいいくらい突っ込んで書かれています。
以前にメール関連の案件があって、James唯一の書籍を買ったりして調べたけど、その案件は流れてしまい、Jamesはなかなか使う機会がない。
次に立てるサーバにはMTAにJamesを入れてみようかな。
2006年3月 2日
Java | s2dao用のSQLファイルを開くeclipseプラグイン
スバラシイ!
SQLファイルがない場合は「対応するSQLファイルを作成する」という選択肢が出て、使用するデータベース(またはデフォルト)を選択するラジオボタンのウィザードが表示され、OK押すとSQLファイルが作成される。
なんて感じで機能追加されないかなあ、と書いてみる。
2006年2月 9日
2006年1月17日
Java | Launch4j
Launch4j :: Cross-platform Java application wrapper for creating Windows native executables
MEMO。
2006年1月 4日
Java | Subclipseのコミットログのテンプレート
Heretic Programmer(2006-01-03) プロジェクトのルートでtsvn:logtemplateプロパティを設定することにより、コミットログのテンプレートを指定できる。プロジェクトでコミットログに残したい情報を決めるときに便利な機能。
MEMO。
2005年12月27日
Java | clipseHTMLEditor、StrutsIDE、FacesIDEバージョンアップ
毎度便利なツールをありがとうございます。
Struts IDEはバージョンアップすると、フローのレイアウトがデフォルト状態に戻ってしまうのがちょっと辛いところ。
アクションが増えてくると、フローの中でアイコンを探すのが大変になるので、アウトラインのアクションをクリックすると、フローの中のアクションアイコンがハイライトされるような機能があると便利ですね。
2005年12月16日
2005年11月23日
Java | Apache-Tomcat連携時のURL文字化け
The Apache Tomcat Connector - Reference Guidehttp://d.hatena.ne.jp/keyword/%a5%bb%a5%c3%a5%af%a5%b9%a5%d5%a5%ec%a5%f3%a5%c9JkOptions ForwardURIEscaped, the forwarded URI is escaped and Tomcat (since 3.3 rc2) will do the decoding part.
のようにURLの一部に(URLエンコードした)日本語を含むものをApache経由でTomcatに渡すと、日本語がひどく文字化けして困ったことになっていた。?name=valueのようなGETパラメータとしてなら問題なかったのだけど。
で、mod_jkのドキュメントを読んでいたら、ForwardURIEscapedという設定オプションがあり、これを試しに設定してみたら文字化けせずにTomcatに日本語を含むURLが渡るようになった。
以前にもこれを試したのだけど、その時は解決に至らなかった。今日気づいたのだけど、JkMountやJkUnMountは<VirtualHost>以下で設定できるけど、JkOptionsはhttp.confのグローバル領域にないとダメみたい。以前は<VirtualHost>以下に設定していたのだろう。
2005年11月18日
Java | どうする、Maven Repo Search 2
ま!(2005-11-07)Maven2をまだ一度も使ってないどころかダウンロードすらしたこともないので、何がどう変わってるのかよく分からないけど、ibiblioを調べてみたら、http://maven.ozacc.com/ のMaven2版を。
http://www.ibiblio.org/maven2/{groupId}/{artifactId}/{version}/{artifactId}-{version}.jar
というURL構成になってるんだね。
http://www.ibiblio.org/maven2/springframework/spring/1.2.6/spring-1.2.6.jar
http://www.ibiblio.org/maven2/org/springframework/spring/1.2.6/spring-1.2.6.jar
気になったのが、このような同じものが二つのディレクトリに分かれているケース。この二つの違いは何なのでしょう?
typeの概念はなくなったのかな? TLDファイルは拡張子で判別できるけど、pluginはどうすれば?
もうちょっと調べねば。
2005年11月16日
Java | Commons Validator 1.2
ValidatorVersion120 - Jakarta-commons Wiki
1.1.4はUrlValidatorのしょうもないバグがあったので、早速1.2を導入した。Struts 1.2.7に取り込むには、このWikiにもあるとおり、至極簡単。validator.xmlのDoctypeを1.2用のものに書き換えて、
<!DOCTYPE form-validation PUBLIC<arg0>とか<arg1>を全部<arg>に直すだけ。
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.2.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_2_0.dtd">
XHTMLモードではJavaScriptのバリデータが動作しないらしく、その場合はStruts 1.2.8を使えばいいとのこと。Struts 1.2.8はまだ正式リリースされてないけど、Subversionのリポジトリを見たらもうTag付けされているので、Development Releaseにあるものを使えばいいんじゃないかな。
2005年11月13日
2005年10月20日
2005年10月13日
Java | commons-io 1.1
1.1の正式版が出てた。ibiblioのMavenリポジトリにも登録されてる。
CopyUtilsのメソッドがDeprecatedになって、IOUtilsに移動してる。
2005年10月12日
2005年10月 3日
Java | Map-backed ActionForms
The Struts User Guide - 4.3.2 Map-backed ActionForms
こんなことができるなんて知らなかった。。。
2005年9月28日
2005年9月27日
2005年9月 6日
2005年9月 2日
Java | JSP タグファイル
JSP 2.0の新機能として「タグファイル」があることは随分昔から知っていたが、今まで使ってこなかった。というか、使い方を知らなかった。
JSTLのELで複雑な条件式とか書くことがあって、これならScriptletを使うのと大して複雑さは変わらないじゃんとか思っていたときに、ふとタグファイルの存在を思い出し、使い方を学んで早速取り入れてみた。
実際に使ってみると簡単だし、JSPコードの可読性が上がったので効果覿面。もっと早くから使っていればよかった。
2005年8月31日
Java | ozacc-googlemap 0.1
ozacc-googlemapライブラリ0.1をリリースしました。まずはGoogle Map API読み込み<script>タグを生成するTaglibクラス1つのみですが。
Google Map APIキー取得時に申請したURLと、そのキーをマッピングした設定ファイルを用意します。設定ファイルはプロパティファイルで、次のパスに設置します。/WEB-INF/googlemap.properties
で、地図を表示するJSPの中で<googlemap:javascript />を入れるだけです。
例
/WEB-INF/googlemap.properties
http\://127.0.0.1/map/ = ローカル用のキーGoogle Mapを表示するJSP
http\://dev.example.com/map/ = 開発サーバ用のキー
http\://www.example.com/map/ = 運用サーバ用のキー
#コロンの前にバックスラッシュを付けるのを忘れないように。
<%@ taglib prefix="googlemap" uri="http://www.ozacc.com/taglib/googlemap" %>これでJSPの中に各実行環境(異なるホスト)に対応したキーの付いたGoogle Map API読み込み<script>タグが出力されます。
<html>
<head>
<googlemap:javascript />
</head>
<body>・・・
これで、先日挙げた悩みは解決。
あっ、Google Mapじゃなくて、Google Mapsなんだ。間違ってたよ。。。
次のバージョンを出す機会があれば、複数形にするかも。
2005年8月11日
Java | s2dao 改
s2daoのN:1マッピングで、例えばエンティティDepartmentとEmployeeがN:1の関係にあり、Employeeがインターフェースでその実装クラスはいつどこで(どういうFQDNで)作られるか分からない。
そんな要件を満たすために、s2daoに手を入れて、N:1の1側エンティティのインターフェースと実装クラスを関連づけられるようにしてみた。
s2dao-rel.propertiesという設定ファイルを設けて、
ozacc.Employee = example.EmployeeImpl
といったエントリーをセットしておけば、Department検索時にはEmployeeImplのアノテーションを見に行って、EmployImplオブジェクトを生成してくれるという案配。
これが必要なケースって、あんまりないだろうな。うむむ。
2005年7月25日
2005年7月22日
2005年7月13日
Java | Exception management and error tracking in J2EE
Exception management and error tracking in J2EE
MEMO。後で読むべし。
2005年7月12日
Java | ant4eclipse
Eclipseの設定をAntビルドスクリプトに反映させるant4eclipse公開 (MYCOM PC WEB)
MEMO。
最近のMYCOM PC WEBはJava関係のマニアックというかプログラマーよりな記事をよく載せるようになったなあ。
2005年6月28日
2005年6月23日
Java | Struts 1.2.7
Struts Release Notes (since 1.2.4)Highlighting Errors
Struts can now automatically highlight error fields using the new errorKey, errorStyle, errorStyleClass and errorStyleId attributes on the HTML Input Tags. See the User Guide for details of these attributes.
いつリリースされてたの? すっかり見過ごしてました。個人的には上の新機能が一番魅力的。一年程前にこんなカスタムタグを作っていたけど、そんな面倒な処理は必要なくなったわけだ。
Download Actionもダウンロード用途がある時には使えそう。
2005年6月21日
2005年6月14日
Java | Log4rss
JavaアプリケーションのログをRSSで配信 - Log4rss (MYCOM PC WEB)
なるほど。最初はプログラムのログをRSSにしてどうするんじゃい!?と思ったけど、「RSSリーダに登録しておけばログの監視を行うことができる」わけだ。さすがはThoughtWorks。
ERROR、FATALレベルの重要なログは、SMTP Appenderを使ってクライアントを含むメーリングリストに送信するようにしている。WARNやINFOレベルのログもWebブラウザで見られるようにしているけど、RSS出力+RSSリーダ登録の方が良さそうだ。
2005年5月23日
2005年5月 1日
Java | OSCache helps databases cope
TheServerSide.com - Taking the load off: OSCache helps databases cope
後で読むべし。
2005年4月20日
2005年4月 3日
2005年3月18日
Java | S2プロダクトの依存関係
むぅ。もはやS2コアと各S2プロダクトのバージョン間の依存関係が分からない。
S2とS2Daoは常に最新版同士でないと動作しない? S2StrutsはどのバージョンのS2とでも動作する? とか。
自分でトライして一つ一つ確認していくしかないのかな。この辺りについて、どっかにまとめられているといいんだけど。
この点については、Springは全部入りだから楽だよね。
2005年3月 2日
Java | S2Struts サブモジュール対応
S2StrutsでStrutsサブモジュールを使う場合に、デフォルトモジュールのActionを呼び、サブモジュールのActionを呼び、再びデフォルトモジュールのActionを呼ぶと、RequestProcessorでエラーが。
[ERROR] org.apache.struts.action.RequestProcessor - パス /path/to/action に対するリクエストは無効です。
ソースを追ってないので原因はよく分からないのだけど、s2struts.diconに定義されているrequestProcessorのインスタンス管理を以下のようにprototypeにしたら解決。
<component name="requestProcessor" class="org.seasar.struts.processor.S2RequestProcessor" instance="prototype"/>
ドキュメントにs2struts.diconについて書かれてないんだけど、これは必ず必要なのかなあ。何か使い方を間違ってる可能性大。
2005年2月19日
Java | S2.1.13
S2とS2Daoを新しいバージョンにアップデートしたら、NullPointerExceptionが出て動かなくなった。どうしてそんなところがnullになるんだ!?と、ソースを散々調べまわった挙句、j2ee.diconにも変更が加えられていることに気が付いた。このj2ee.diconを新しいバージョンのものと入れ替えて解決。
Change Logには書かれていないので注意です。
2005年2月14日
Java | S2
あるWebサイトの制作にSpringではなくSeasarを採用することに。これまでは大抵の場合納期が切迫していたため使い慣れているSpringを採用してきたけど、今回は若干時間に余裕があるので、S2 + S2Daoに挑戦してみることにした。
アプリケーション自体はDIフレンドリーに構成すればS2でもSpringでも設定ファイルの書き方に違いがある位なんだけど、意外とその差が大きい。S2の方が書きやすいです。
MLを見てると、S2DaoとPostgresの相性にまだちょっと不安が残るので、S2Daoの使用はどうしようか思案中。納期までには諸々解決してそうな気もするけど。もうちょっといろいろ検証してみよう。
2005年2月11日
Java | CF MX 雑感
CF MX 7をようやくインストールできた。二台のPCにインストールし、一台はCF内蔵Webサーバを一緒に、もう一台にはJ2EEアプリケーションとしてインストール。
Resin 3.0.10にcfusion.warをデプロイしたのだけど、起動に失敗する。ログを見ると、web.xmlの<welcome-file-list>にid属性が設定されているのだけど、これにResinが対応してない様子。このid属性を外したら無事に起動。
内蔵Webサーバの方はJRunで、起動も遅いし、何となく重たい印象。こっちもJ2EE版にして、ResinかTomcat上で動かした方がいいかも。
今まで商用のアプリケーションサーバは使ったことがなかったけど(一応Resinも商用だけど)、ブラウザ上のGUI設定ツールは分かりやすいし便利だねえ。しかも日本語だし。こうあるべきだと思ったよ。
HTML to PDFはやっぱりちょっと時間が掛かるけど、いい感じだ。PDF帳票生成サーバソフトを買うよりは、CF買った方が良さそう。コストも抑えられるしね。
以上、CFMXをインストールしてデモを軽く動かしたところまでの雑感。
2005年2月10日
Java | Avoiding OutOfMemory errors in Maven
Carlos Sanchez's WeblogMEMO。maven.junit.fork=true maven.junit.jvmargs=-Xmx256m
2005年2月 2日
Java | JGroups
あるプロジェクトで使用するために検証中。日本語の資料はないに等しい。ググって出てきたのはIBMのdWの記事くらい。紹介記事が少ない割には有名なオープンソースプロダクトに採用されてたりする。
分散技術なんて普段使わないから、JMSについても全く無知なんだけど、JGroupsとJMSはどう違うの?
2005年2月 1日
2005年1月28日
Java | HessianC#
Caucho's Hessian binary protocol has been ported for Microsoft's .NET
C#で作られたクライアントとサーバサイドJavaをHessianプロトコルで繋ぐことが出来るってこと? インパクトでかいね。
S2HessianDotNetというものもあったんだね。知らなかった。
S2でもSpringでもHessianのサポートはされてるし、今後は使っていけるかも。ちと勉強しておこう。
2005年1月27日
Java | MockとStub
MockとStubはどう違うの?とテスト用に作ったクラスの名前を付ける時に疑問に思い、ググってみた。「Shunt」という単語は初めて見た。
Stubはインターフェースの実装した上で固定値を返す。Mockはもうちょっと柔軟に値を返すことができて、verify()メソッドが加えられてるような感じ。
僕はMockの場合はMockXxxx、Stubの場合はXxxxStubとクラス名を付けたいんだけど、それだと統一がとれないなあ。これはStubなんだゾ、とすぐ分かるようにStubXxxxにした方が良さげだね。
2005年1月20日
2004年12月15日
Java | Maven repository mirror
ibiblio is currently experiencing technical difficulties. We apologize for the inconvenience and hope to have systems back online soon.Mavenで管理しているWebサイトのアップデート作業を行っていたんだけど、何度やってもライブラリの取得が完了しない。おかしいなあと思って、www.ibiblio.orgにアクセスしてみたら、上記のメッセージが。
先日も落ちてたんだけど、ibiblio.orgが落ちると結構致命的だ。ま、そんなときのためにミラーがあるんだけど。ミラーサイトは公式には次の四つ。
- http://planetmirror.com/pub/maven/
- http://mirrors.sunsite.dk/maven/
- http://ftp.up.ac.za/pub/linux/maven/
- http://download.au.kde.org/pub/maven/
万一のことを考えると、ビルド及び稼働に必要なライブラリ取得を他所のサーバに依存してるのはよくないのかも。Mavenの利点でもあり、欠点でもあるような。
確実さを考えるなら、自前のサーバに依存ライブラリをまとめておくのがよさそうだ。
2004年12月 5日
2004年11月25日
Java | Maven Repo Search 検索語ランキング
Maven Repo Searchでは検索された単語も、AWStatsの機能を使ってアクセス統計を取っています。今日はその11月度ランキングを公開。ちなみにうちのIPからのアクセスは統計に入りません。1日のユニークユーザは大体20~50です。
- hibernate
- spring
- jta
- xdoclet
- log4j
- dom4j
- cglib
- struts
- servlet
- commons-logging
- commons
- jstl
- seasar2
- seasar
- jaxrpc
- asm
- ehcache
- activation
- standard
- commons-collections
- velocity
- commons-lang
- commons-pool
- odmg
- commons-dbcp
- hsqldb
- ozacc-mail
- S2
- servletapi
- xalan
- aopalliance
- dbunit
- junit
- jdom
- xerces
- axis
- quartz
- jaxb
- webwork
- commons-beanutils
- j2ee
- commons-digester
- middlegen
- oro
- beanutils
- jboss
- collections
- torque
- commons-configuration
- postgres
2004年11月23日
Java | SimpleDateFormatは
SimpleDateFormat (Java 2 プラットフォーム SE v1.4.0)知らんかった。気を付けろヨ、オレ。日付フォーマットは同期化されません。スレッドごとに別のフォーマットインスタンスを作成することをお勧めします。複数のスレッドがフォーマットに同時にアクセスする場合は、外部的に同期化する必要があります。
2004年11月22日
2004年11月18日
Java | 500行のメソッド
あるStrutsActionのexecute()メソッドが500行もある。せめて複数のメソッドに分割してくれー。
うーん、DispatchActionを使うべきところを、普通のActionで頑張っているのも一因の様子。マジックナンバーも埋め込まれるなあ。
何とかしなければ・・・
2004年11月11日
2004年11月10日
2004年11月 8日
Java | Struts 1.2.4のExceptionHandler
/**
* Logs the Exception using commons-logging.
* @param e The Exception to log.
* @since Struts 1.2
*/
protected void logException(Exception e){
log.debug(messages.getMessage("exception.log"), e);
}例外を記録するのに、どうしてdebugレベルで出力するんだよ。errorレベルで出してくれよ。
このためだけにサブクラス作るのもなあ・・・ Log4jの設定でorg.apache.struts.action.ExceptionHandlerを指定したCategoryを用意してDEBUGレベルを出力させるか。むぅ、どっちがいいだろう。
2004年10月30日
Java | Informa 0.6.0
Informa: RSS Library for Java0.6.0がリリースされてた。The Poller module is intended to provide convenient services for background polling of channel changes. Once you have some channels you might be interested in periodical check for updates. Poller helps to do this task common to many applications. It accepts channels for registration and creates the schedule for their updates.
RSSをクロールするPollerモジュールが導入された。マルチスレッドでの稼働スレッド数やクロール間隔も容易に設定できるみたい。
うう、もうちょっと早くリリースに気づいていれば。先日同じような機能を自分で実装したばかり。くやしい。
2004年10月29日
Java | Resin 3.0.9
Resin 3.0.9 Release Notesvia とらねこ放浪記The Resin distribution for 3.0.9 has been refactored into two distributions:
* Resin Professional - Most companies and organizations will use Resin Professional. Includes performance, caching, and clustering capabilities.
* Resin Open Source (GPL) - Contains all functional components of Resin, including EJB, but excludes performance and clustering capabilities.
マジですか? 「performance, caching capabilities」が具体的に何を指しているのか、まだ調べてないのでよく分からないのですが、Resinユーザが増えるのは間違いないはず。
ライセンスを買っている僕にとってはなかなか複雑ですが。と言っても、2.1のときのことだけど。未だに3.0系は使ったことがない。
2004年10月27日
Java | JavaMail 1.3.2
JavaMail-1.3-changesこの辺りがちょっと気になる。要調査。3. Add mail.mime.charset property (4377731)
The "mail.mime.charset" System property (NOTE: *not* Session property) names the default charset to be used by JavaMail. If not set, the standard J2SE "file.encoding" System property is used. This allows applications to specify a default character set for sending messages that's different than the character set used for files stored on the system. This is common on Japanese systems.
APOPにも対応。mail.pop3.apop.enableプロパティを使う。
2004年10月23日
Java | Maven War Plugin 1.6.1
Maven War Plugin - ChangesMEMO。Release 1.6.1 - 2004-10-23
o Splitted war:webapp in war:war-resources and war:webapp.
自作のプラグインがwar:webappに依存しているので、要修正。
2004年10月20日
Java | Quartzからマルチスレッド
昨夜から今朝まで、Quartzを使って起動するマルチスレッドプログラムの実装作業。Worker ThreadパターンのクライアントがQuartzのJobに当たる。こっちのスレッドが待ってる間に、あっちのスレッドがそれをやってからnotifyAll()とか、もう頭が混乱。いつもとはちょっと違った脳みそが使われてる感じ。
マルチスレッドもQuartzもどうやってテストしたらいいのかが分からない。JUnitテストケースのメソッドでThread.sleep(30000)している間にQuartzのJobが起動するような設定にして、実際に動かしてテストしていたので、やたら時間が掛かった。
それでも一晩かかってようやく終わりが見えてきた。後は例外の処理をするだけ。眠いー。
2004年10月18日
Java | without EJB 読書会
第二回目。今帰ってきました。
いやー凄かった。特に二次会。お酒の飲めないkakudaさんが突然ビールをラッパ飲み。酔っ払った挙句、ひがさんに分け分からない罵声を浴びせ、一同静まり返った。その後、「毎日オレンジニュースを書くオレの身にもなってみろ!!」と暴れまくって他のお客さんにも絡んで迷惑をかけそうな勢いだったので、僕のラリアットを喰らわせダウンさせました。温厚そうなkakudaさんがあんなになるなんて。日ごろのストレスが爆発したのでしょうか。
なんちゃって。今回は仕事が溜まっていたので読書会には参加できませんでした。なので、上の話は全部ウソです。
2004年10月17日
Java | Maven テスト実行を省略
Maven Test Plugin - Test Properties運用サーバ上でのビルド-デプロイ時はテストを実行したくない場合はどうすればいいんだろう。と調べていたら、こんなプロパティが用意されていた。maven.test.skip
Set this to 'true' to bypass unit tests entirely. Its use is NOT RECOMMENDED, but quite convenient on occasion.
Mavenには、他にも役に立つプロパティや機能がきっともっとあるんだろうけど、プラグイン全体での網羅的なドキュメントがないから、なかなかその存在に気づくことができない。書籍も出る様子はないし、今ひとつ盛り上がりに欠ける。まあAntに慣れてりゃムリに使うこともないからなあ。
2004年10月11日
Java | JSPにロジックを埋め込まないで
あるプロジェクトのSpring対応化を図って既存コードを修正しているのだが、いくつかのメソッドをコメントアウトしてみてもEclipse(のコンパイラ)が警告を出さない。何故どこからも参照されていないメソッドが作られているのだろう?と思いつつ、要らないのものはどんどん削除してコードをシンプルにしていった。
が、ふとあることに気が付いて、JSPファイルを開いてみると・・・
予想通り、スクリプトレットの中で要らないと思って削除していたメソッドが使用されていた。どうりでEclipseも気づかないわけだ。
しかも、JSPの中でConnection取得してDBアクセスまでしている。これじゃ、リファクタリングは困難だ・・・むぅ、どうしたものか。
Strutsを使ったところでMVCモデルに従わないと効果半減だよ。ある意味JSPは罪な奴だね。
あー、金八先生が始まっちゃう。
2004年10月 6日
Java | Log4J SMTPAppender 日本語対応版
以前にLog4j SMTPAppender 日本語対応版についてMEMOしたけど、今回自分で手を入れてみた。
Log4JオリジナルのSMTPAppenderだと、
- 例外ログを出力場合にスタックトレースが改行されず読みにくい。
- 何故かマルチパートメッセージを生成する。
そして文字コードについてはデフォルトでiso-2022-jpを使うようにし、任意の文字コードをセットしたい場合は、Charsetパラメータで指定できるようにした。
http://spring-ext.sourceforge.jp/maven/log4j/jars/log4j-ja-1.2.8.jar
2004年10月 3日
Java | Last modifiedサポートパッチ
またkhiさんからパッチを提供(?)していただきました。今度はOMLではなくMaven Repo Search。これで、dotさんからも要望を受けていたRSS feedが実現できそうです。
こうやってソースをじっくり読まれてしまうのは、実はちょっと恥ずかしい。特にMaven Repo Searchの方はやっつけで作ったものなので。「こんなアホなコード書いてるよ」とか思われてるかも・・・ 他人に見られても恥ずかしくないようなコードを書くように心がけないと。
でもこうして面識のない方からも機能を追加してもらえるのがオープンソースのいいところですね。
2004年10月 2日
Java | Maven Repo Search 機能強化
1. 新たに TLD も検索できるようになりました。
2. タイプを指定して検索できるようになりました。
Maven Repo Search Pluginもタイプ指定検索に対応してもらえると嬉しいなあ、と書いてみる。
Maven Repo Search Pluginがアップデート! タイプ指定検索に対応していただきました。
http://sourceforge.jp/projects/mrsp/files/
管理するArtifactが増えてきたせいか、以前ほどの検索スピードが出ない。と思っていたら、PostgreSQLデータベースをvacuumするのを忘れていた。vacuumしたら以前のスピードが戻った。
これからはデータベース更新後にvacuum fullを実行するように変更してみた。
2004年9月30日
Java | Reporting Application Errors by Email
ONJava.com: Reporting Application Errors by Email
via オレンジニュース mixi出張所
後で読むべし。
2004年9月29日
Java | Maven - リモートレポジトリにファイルを指定
前にdotさんから教わった小技を実践しようとしたら、ちゃんと思い出せなくて苦戦。ようやくうまくいったので忘れないようにメモっとく。
maven.repo.remote = http://www.ibiblio.org/maven/, file:lib/
2004年9月28日
Java | JDAVMail
SourceForge.net: Project Info - JDAVMail - WebDAV JavaMail providerMEMO。JDAVMail is a JavaMail 'service provider' (store and transport) implementing the WebDAV-like protocol used by HotMail.
2004年9月22日
Java | Maven Repo Search Plugin 0.1
はてなダイアリー - dragon3の日記やばい。チョー便利。Maven Repo Search Plugin 0.1 リリース
自分の作ったWebアプリがEclipseから使えるなんて、ちょっと感動。
2004年9月21日
Java | XML - classpathからリソースをロードする
dW : XML : ヒント: classpathからリソースをロードする
MEMO。
これを使えば、DTDファイルをクラスパス経由で読み込めるようになるのでは。そうすれば、DTDバリデーション時にインターネット経由での取得が必要なくなり、多少パフォーマンスが向上するはず。
Hibernateの実装
public class DTDEntityResolver implements EntityResolver {
Log log = LogFactory.getLog(DTDEntityResolver.class);
private static final String URL = "http://hibernate.sourceforge.net/";
public InputSource resolveEntity (String publicId, String systemId) {
if ( systemId!=null && systemId.startsWith(URL) ) {
log.debug("trying to locate " + systemId + " in classpath under net/sf/hibernate/");
// Search for DTD
ClassLoader classLoader = this.getClass().getClassLoader();
InputStream dtdStream = classLoader.getResourceAsStream( "net/sf/hibernate/" + systemId.substring( URL.length() ) );
if (dtdStream==null) {
log.debug(systemId + "not found in classpath");
return null;
}
else {
log.debug("found " + systemId + " in classpath");
InputSource source = new InputSource(dtdStream);
source.setPublicId(publicId);
source.setSystemId(systemId);
return source;
}
}
else {
// use the default behaviour
return null;
}
}
}
Java | パッケージ構成案
はてなダイアリー - ひがやすをのここだけの話パッケージ構成は、プロジェクト毎にバラバラだったりするので、こういう指針があるといいですね。くーすアプリケーションのパッケージは、ベースとなるパッケージの下に以下のパッケージで構成されます。
- form:フォームクラスを格納。
- action:アクションクラスを格納
- logic:業務ロジックのインターフェースを格納。
- impl:業務ロジックの実装クラスを格納。
- support:補助ロジックのインターフェースを格納。
- impl:補助ロジックの実装クラスを格納。
- dao:Daoのインターフェースを格納
- impl:あれば、Daoの実装クラスを格納。
- entity:エンティティクラスを格納。
- dto:DTOクラスを格納。
- util:ユーティリティクラスを格納。
- interceptor:あれば、インターセプタを格納。
- dicon:diconファイルを格納。
僕はViewに該当するパッケージ(actionとform)は次のように分けたい。
- web
- struts
- form:ActionFormクラスを格納
- action:Actionクラスを格納
- support (or util): Actionクラスが使用する補助ロジッククラス(Formの変換等)を格納
- servlet:サーブレットを格納
- struts
2004年9月20日
Java | MavenRepoSearchPlugin
はてなダイアリー - dragon3の日記書いてみるもんですね。dragon3さんが作ってくれているようです。Eclipseプラグインの学習として作成してみてます。
Viewに検索テキストフィールドと結果テーブルを表示。ダブルクリックでRepositoryへ飛びます。
期待してます!
2004年9月18日
Java | Mavenを使うメリット
Mavenを利用して得られるメリットの中で、僕にとって一番大きいのは、依存ライブラリのバージョンを明示的に設定することが強制される点。
別にMavenを使わなくても、Jarファイル名にバージョンをつけたり、他の方法でバージョンを控えるようにしておけばいいんだろうけど、つい面倒くさくなってサボったりするから強制される方が僕にとっては望ましい。
あるプロジェクトのlibディレクトリにjdom.jarが入ってるんだけど、これバージョンいくつなんだろう・・・
プロジェクトのプログラムは直接JDOMを使ってないので、他のライブラリに必要とされてるんだろうけど、その関連性も分からない。この辺りはMaven 2で解決されるんだっけ。
2004年9月17日
Java | XMLのコメントが
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setIgnoringComments(false); dbf.setCoalescing(true); dbf.setIgnoringElementContentWhitespace(true); dbf.setValidating(true); DocumentBuilder db = dbf.newDocumentBuilder();上記のようなコードで、XMLパースの設定をしているのだけど、ignoringCommentsをfalseにしているにも関わらずパース結果のDocumentではコメントが削除されたり、残っていたり。trueにしても同様に削除されたり、残っていたり。
AというXMLファイルは常にコメントが削除され、BというXMLファイルは常にコメントが残る。同一のXMLファイルでコメントが削除されたり、残っていたりというブレはない。
HELP!!
2004年9月16日
Java | Mavenzilla
MavenのMLにポストされてた。考えてることは同じなんだなと思った。
Webアプリの方が便利でしょ?と思って、Maven Repo SearchのURLだけポストしてみた。実は英語が書けなかっただけ・・・
このMaven Repo SearchをEclipseから使えるようなプラグインが欲しいのだけど、誰か作って~。例えば、検索結果をXMLで返すとか、プログラムの修正や拡張には応じます。
2004年9月15日
Java | Cargo
Cargo - HomeMEMO。Cargo provides a Java API to start/stop and configure Java containers
via オレンジニュース
2004年9月14日
2004年9月13日
Java | MavenでTransformerFactoryを使うテスト
Re: Plugin test doesn't know TransformerFactoryXMLを加工するTransformerFactoryを使うクラスのテストをMavenから実行すると、「Provider for javax.xml.transform.TransformerFactory cannot be found」というエラーが起こる。同じテストをAntで実行すると問題はないのだけど。maven.junit.sysproperties=javax.xml.transform.TransformerFactory
javax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl
このエラーにずっと悩まされていて、仕方ないからこのテストを無効にして対処していたのだけど、解決方法が分かった。projecte.propertiesに上記のプロパティをセットしておけばよい。
2004年9月 9日
Java | ValueList
ValueList - AboutSpringのMLで紹介されていたPagingのTaglib。In addition to implementing the Core J2EE Pattern, tag libries have been added to allow for easy intergration into any J2EE web application.
2004年9月 7日
2004年9月 4日
Java | Dumbster
Dumbster - Fake SMTP Serverすばらしい。テスト嫌いな僕でも使ってみたくなった。The Dumbster is a very simple fake SMTP server designed for unit and system testing applications that send email messages. It responds to all standard SMTP commands but does not deliver messages to the user. The messages are stored within the Dumbster for later extraction and verification.
早速、ozacc-mail libraryのテストケースで使ってみよう。
2004年9月 1日
2004年8月31日
Java | VeriTrans High-Level API
手がけているECサイトで、ベリトランス社の「BuySmart Flex」というカード決済サービスを利用している。ベリトランスから提供されるJavaのライブラリモジュールを使って開発してるんだけど、このライブラリのインターフェースはHashtableに依存していて、決済処理実行時の引数、そして結果もHashtableという徹底ぶり。例えばカード番号は"card-no"という文字列キーでputしておく。
このライブラリの使用方法は難しくはないのだけど、Hashtableに依存してるので、タイプセーフに開発を進められず、実際に動かしてログを見るまでエラーが分からないため使いにくい。
また何か決済処理に失敗したとしても、例外をスローしてくれるわけではなく、成功時と同様に結果Hashtableに含まれるステータスキーの値を調べなければならない点も不便。
そんなわけで、こんな低レベルなAPIをラップし、高度なAPIを提供するライブラリを開発しました。もうHashtableなんて使用しなくても大丈夫。一括払い、分割払い、リボ払いの指定も楽勝です。
決済処理に失敗すれば原因に応じた適切な例外もスローします。SpringやS2にもサクッと組み込めます。ズバリ開発効率が上がります、多分。
VeriTransのテストサーバで実際にテストして、動作は実証済みです。VeriTrans仲間でこのライブラリを使ってみたい方がいたらご連絡ください。そして、人柱になってください(!?)。
Java | Relaxer・・・
Relaxer JDBCのお話。前にも書いたけど、あるプロジェクトで採用されている。Relaxerが生成するデータアクセスのコードを追ってみたけど、これパフォーマンスはどうなんよ!?と思った。
エンティティオブジェクトを取得するのに、
- SQLを実行
- DocumentBuilderを生成
- ResultSetからDOM Documentを生成
- Documentからエンティティオブジェクトを生成
Listを返してもらって、その中のオブジェクトを取り出すときは、各々のオブジェクト取得時に2~4を行っている。うーん、悩ましい… コスト高そう。他にも引っかかる点がちらほら。
Rod Johnshonを引用。
Excessive use of XML within applications is a good example of the way in which fashion in J2EE architecture seems directly inimical to performance. (inimical: 有害な)英語はわかんないけど、XMLの多用はパフォーマンスには有害らしいよ。
2004年8月29日
Java | Maven Artifact Plugin
Maven Artifact Plugin - Overview
このプラグインがリモートレポジトリへのアップロードを担当。いつも忘れてしまうのでMEMO。
2004年8月26日
Java | ISO-8601
日付の表記に関するノートISO-8601に準じた日時表記は上記のような形式になる。が、JavaのDateFormatではこのタイムゾーンが表現できなかった。(5) 年月日および時分秒
YYYY-MM-DDThh:mm:ssTZD(例:2001-08-02T10:45:23+09:00)
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZ");
String result = formatter.format(date);
// 2001-08-02T10:45:23+0900このように、タイムゾーンを示す「+0900」の時間と分の間にコロンが入ってくれない。
この文字列をちょっといじればいいだけなので、大した問題じゃないけど、何故微妙に仕様からズレた結果を出すのでしょうか?
と思ったけど、SimpleDateFormatのJavaDocを読むとどこにもISO-8601に準拠とは書いてないね。
Commons-Lang 2.0を使うと、次のようなコードでISO-8601に準拠した結果を返してくれます。
DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(date);
2004年8月20日
Java | RSSOwl
SourceForge.net: Project Info - RSSOwl | RSS / RDF / Atom NewsreaderGUIアプリのRSSリーダーだけど、ソースをざっと見たところ、中身のRSS APIはシンプルで使いやすそう。もうちょっと調べてみるべし。RSSOwl is a RSS / RDF / Atom Newsreader written in Java using SWT as fast graphic library. Read News in a tabfolder, save favorites in categories, Export to PDF / RTF / HTML / OPML, Import Feeds from OPML, perform fulltext-search, use internal browser
Java | 標準RSS API
Blogの普及によってRSSが認知され、今やニュース系のサイトでもRSSでのデータ配信が行われることが珍しくなくなった。
そんなネット上の標準テキストフォーマットとなったRSSだけど、RSSデータを扱うJava APIには未だに標準もデファクトと言える存在もない。RSS自体の仕様のブレ(1.0と2.0の非互換性とか。JavaWorld 9月号参照。)や、BlogのRSS XMLにはDublin Coreなどの拡張モジュールが加えられているケースが多いから、標準APIを定めるのは難しいのかもしれない。
また本来XMLデータなんだから、XMLパーサで扱えばいいジャンといった向きもあるのかもしれない。
僕が調べたところ、Informa、RSSLibJ、RSS4Jの三つが今のところある程度メジャーなRSS API実装だが、Informaを除いて長い間アップデートされていない。これらのAPIに依存するプログラムにしてしまうと、今後のRSSやAtomの仕様の変化についていけなくなるかも知れない。
CPANのXML::RSS Perlモジュールのような標準的な存在があるといいのだけど。(関係ないけど、CPANって何でも揃うよね。Perlに不可能はないって空気を醸し出してる。)
Commons Loggingのように異なるAPIを持つ実装をラップしてくれるようなものでもいい。Jakarta Commonsでは僕が望んでいるのとは違う方向で何やら作ろうとしているし。偉い人が誰が作ってくれないかなあ。
2004年8月18日
Java | Maven Repo Search CVS
前にも書いた通り、Maven Repo SearchアプリのソースをSourceForge.jpのCVSにアップしました。
http://sourceforge.jp/projects/spring-ext/
Springベースで、PostgreSQLに依存したSQLがハードコードされてます。たった二つのサーブレットで構成されている小さいWebアプリなので、Springのサンプルとしても使えるかも。JavaDocコメントは何もありませんが。勿論(!?)、テストもありません・・・
Java | 日本のibiblioが必要
Mavenを使うようになると、何でもかんでもリモートレポジトリに登録されていて欲しいと思うようになった。自分でダウンロードしてローカルレポジトリに置いておくのはスマートじゃない気がする。
大抵のプロダクト(ライブラリ)はibiblioに登録されているんだけど、問題は日本発のもの。例えばSeasarファミリーの各プロダクトや、日本語処理がうまくできない洋モノを改良したプロダクトとか。こういったプロダクトが各開発者によって独自のリモートレポジトリに登録されるようになると、それを探すのにひと手間かかるようになってしまう。
Mavenの魅力のひとつは、デフォルトのリモートレポジトリであるibiblioに代表的なプロダクトが集約されているところにあると思う。国内でMavenを普及させるには、ibiblioとココだけmaven.repo.remoteプロパティに登録しておけばいい、という日本代表のリモートレポジトリを用意しておくことが必要ではなかろうか。
なんてことを思ったり思わなかったりの今日この頃。ところでibiblioは「イビブリオ」って読みで合ってる?
2004年8月16日
Java | JSPとServletでの文字コード指定
Servlet内で
response.setContentType("text/html; charset=SHIFT_JIS");とレスポンスの文字コードをセットする。そして、そのServletからフォワードするJSPのpageディレクティブで<%@ page language="java" contentType="text/html; charset=EUC-JP" %>と文字コードを指定する。
さて、実際に出力された時に適用される文字コードはどっちでしょう?
Tomcat 5では、JSPのpageディレクティブの文字コードが適用されました。では、動的に出力文字コードを変えたい場合はどうすればよいのか。
仕様によるとpageディレクティブのデフォルトcontentTypeは、「text/html; charset=iso-8859-1」。だから、contentTypeを指定しない場合はiso-8859-1で出力されてしまうのかと予想していた。
が、Servletのresponse.setContentType()で文字コードをセットし、JSPのpageディレクティブでcontentTypeをセットしなければ、Servletで指定した文字コードで出力された。
ひとつ学んだ。
2004年8月14日
2004年8月12日
Java | Maven Repo Search
Mavenの日本語MLにもポストしたんだけど、project.xmlのdependencyとして設定するjarファイルの情報(groupId, artifactId、version)をwww.ibiblio.org/mavenから探すのは面倒くさい。
ということで、リモートレポジトリに登録されているjarファイルを検索するWebアプリケーションを作ってみました。
Maven Repo Search http://maven.ozacc.com
検索対象のリモートレポジトリは、現在 www.ibiblio.org/maven と seasar.sourceforge.jp/maven です。
スペースで区切って検索キーワードを入れるとアンド検索になります。
リアルタイムで対象レポジトリを検索するのではありません。秘密のコマンドを打つと、Jarファイルのデータベースを更新するようになってます。結構時間が掛かる処理なので、気が向いた時に更新します。
(注) Jarファイルの取得プログラムがまだ完全ではなく、リストアップできてないjarファイルもあります。気づいているところではバージョン番号がなく「-SNAPSHOT」で終わっているJarファイル。他にも気づいたらご指摘を。
ちなみに「mockobjects-j1.4-j2ee1.3-0.08dev-20030318.jar」は、どれがバージョンなの? Maven Repo Searchでは「0.08dev-20030318」をバージョンとみなすようにしています。
まだ開発中のため、アクセスできないときやInternal Server Errorが出ているときがあるかも知れません。それから、お薦め(?)のリモートレポジトリがあれば、教えてください。
アホなコードですが、もうすぐソースも含めて公開します。
2004年8月 9日
Java | Powers of 2
Flags (Validator 1.2.0-dev API)Represents a collection of 64 boolean (on/off) flags. Individual flags are represented by powers of 2.
「Powers of Ten」というEamesの映像作品があったけど、あれは10の乗数ごとに画角を拡げる(狭める)という意味。
こちらは2の乗数。
僕は二進数とかシフト演算子が理解できないエセプログラマーなので、このFlagsクラスの仕組みはソースを見ても理解できないんだけど、何かすごくカッコイイ。やってることはすごく単純そうなんだけど。
public boolean isOn(long flag) {
return (this.flags & flag) > 0;
}「高級言語はよく分からないんだよね」とかムカつくこと言いながら、こういうコードを書いてみたい。
2004年8月 7日
2004年8月 6日
Java | Relaxer
データアクセス層がRelaxerなプロジェクトに関わることになって、Relaxerを勉強中。最初はプロジェクトのJavaソースを見てもさっぱりだったけど、EAでクラス図を生成させたり、Javadocを見たりして、徐々に掴めてきた。
いわゆるXxxDAOインターフェースに当たるのが、IXxxTableView。そして、その実装クラスがXxxTable。これが分かった時点でデータアクセス層はほぼ理解できた。
まあRelaxerの理解なんて心意気一発ッスよ。
そして、このプロジェクトにはビジネスロジック層がない。全部Struts Actionかサーブレットのプレゼンテーション層に書かれている模様。ざっと見たところ、ほとんどのActionはシンプルにデータアクセスしてるだけみたいなので、この設計でも全然問題なさそう。トランザクション制御が気になるけど。
開発プロジェクトに途中から関わった経験はないに等しいので、自分のやり方と異なる点とかあって新鮮だ。
ソースにJavadocコメントがほとんどなく、あったとしてもそのクラスの機能を簡単に説明しただけのもの。何のためにそのクラスがあるのか、クラスの責務に関する記述が欲しいのだけど、それが書かれていない。
でも、自分で書く場合もそう。必要なことが書けていなかったんだな。「人の振り見て我が振り直せ」とは正しくこのこと。今回のプロジェクトはいろいろと勉強になりそう。
2004年8月 5日
Java | Struts Validatorで入力値を変換する
最近、Struts周りのTaglibやValidatorを作り貯めてるんだけど、Validatorの可能性に惹かれている。validatorメソッドでは、その引数にActionForm以外にHttpServletRequestも受け取ることができる(つまりHttpSessionも)ので、もっといろんなことを透過的且つ外部のXML経由の指示で行なわせることができそうだなと。
通常Validatorはvalidation.xmlに入力値の規則を定義して、それに反する値がActionFormにセットされている場合、ActionError(ActionMessage)を生成して返す。
半角数字で入力してもらいたい電話番号フィールドに全角数字で入力された場合を考えてみる。validation.xmlで、半角しか受け付けないmaskルールを作るのが普通だと思う。クライアントサイドのJavaScriptは使わないものとすると、この場合、全角数字で入力されるとエラーになってしまう。
以前に書いたことがあるけど、全角半角など簡単にできる変換はシステムが行うべきだ。ただ、Struts Validatorを使うとなると、Validatorメソッドに入力値が渡される前に、その値を変換しておかないといけない。ValidatorメソッドはActionの前に呼び出されるので、どこでそんな変換をするんだということになってしまう。
ここで、Validatorを値変換の用途に使用してはどうかと考えている。validation.xmlにはfield要素のdepends属性で、呼び出されるValidatorメソッドの順番を指定できるので、例えば
<field property="tel" depends="required, toHankaku, mask">のようにして、maskメソッドに渡される前に、値のフォーマットをしておくことができるだろう。値のフォーマット時に例外が発生してもエラーは返さずスルーする。
ひとつ悩みどころなのが、例えば名前の読みをカタカナで入力するような場合。「いとうみさK」と入力された値は、「イトウミサK」と変換されるが、結局エラーになってしまう。で、エラーになると、入力フォームに戻って正しい値の入力を促すわけだが、そのフィールドには「いとうみさK」ではなく「イトウミサK」と、自分が入力したものではない変換された後の値が表示されてしまう。これがユーザビリティとしてはどうなんだろう?
Java | Informa
RSSライブラリ。RSS4Jは開発が止まっているようなので、このInformaを使ってRSSを扱うプログラムを制作した。今のところパースだけだけど、至って簡単にできた。RSSの扱いなんて心意気一発ッスよ。
2004年8月 4日
Java | Struts CreditCard Validator
眠れなかったので、Struts用のCreditCardValidatorクラスを作ってみた。
Strutsの標準Validatorでもクレジットカード番号はチェックできるけど、日本で普及しているJCB、そしてお金持ちが使うDinersはサポートされていない。まずは、この二つのカード会社もサポートしたvalidateCreditCard()メソッドを作成。
このvalidateCreditCard()メソッドでは、カード番号しかチェックしない。例えば、ECサイトの決済フォームで、カード会社にVISAを指定して、JCBカードの番号を入力しても、その番号がJCBのものとして正しいければ(チェックデジットが正しければ)、Validatorをすり抜けてしまう。
まあ実際は、クレジットカードの与信にはカード番号と有効期限だけが必要だから、カード会社の指定なんて必要ないのだけど。それにこのValidatorでチェックできることは文法的に正しいカード番号かどうかだけで、本当に有効なカード番号かどうかはチェックできないしね。
そうは言っても、カード決済網にアクセスする前の段階で一度、カード会社名も含め入力されたカード情報の妥当性はチェックしておきたい。そこで作ってみたのが、validateCreditCardNumberWithType()メソッド。Javadocコメントは以下。
指定されたカード会社に対応する正しいクレジットカード番号かどうかをチェックします。
type変数にカード会社が指定されるプロパティ名をセットします。
例えば、カード会社名入力フィールドのプロパティ名が「cardType」で、カード番号入力フィールドのプロパティ名が「cardNumber」の場合、
validationルールは次のようになります。
<field property="cardNumber" depends="required,strictCreditCard">
<arg0 key="typeForm.cardNumber.displayname"/>
<var>
<var-name>type</var-name>
<var-value>cardType</var-value>
</var>
</field>typeで指定されたプロパティからカード会社名が取得できない場合、validationは失敗します。
対応しているカード会社と、typeで指定されたプロパティで使用できる値は次の通りです。
| カード会社 | 認識できる値 (大文字・小文字は問いません) |
|---|---|
| VISA | visa |
| Master Card | master または mastercard |
| JCB | jcb |
| アメリカンエクスプレス | amex |
| ダイナースクラブ | diners または dinersclub |
あとは有効期限のチェックメソッドを作らないと。これは月と年で二つにフィールドが分かれるとちょっと面倒だけど、ルールそのものは今日の年月より後かどうかだけなのでシンプル。
2004年7月29日
Java | Struts errorMsg Tag
入力フィールドのすぐ横や下にエラーメッセージを表示したい場合、その箇所に<html:errors property="name">と書いておけばよい。が、例えば、エラーメッセージを赤く表示したいと思ったら、エラーがあるかないかの条件分岐が入るのでJSPのコードが複雑になってしまう。
ApplicationResources.propertiesでerrors.prefix等を設定する手もあるけれど、MVCのVの範疇のことをクラスパスに置いてあるpropertiesファイルに設定するのも違和感があるし、そもそも複数のHTMLフォームのエラーメッセージに同じprefixが適用できるわけじゃない。
そこで、昨日のwhenErrorタグに続いて、errorMsgタグを作成した。
errorMsgタグのproperty属性で指定したプロパティにStruts Validatorが発見した入力エラーがあった場合、タグで囲まれた文字列を出力します。その際、「$$」をエラーメッセージに置き換えます。property属性は必須です。
(例)
<html:text property="name" />上記のようなJSPでは、次のような出力になります。
<struts:errorMsg property="name"><p class="err-msg">$$</p></struts:errorMsg>
・nameプロパティに入力エラーがない場合
<input type="text" name="name" value="" />つまり、何も出力されません。
・nameプロパティに入力エラーがあった場合
<input type="text" name="name" value="" />
<p class="err-msg">名前を入力してください。</p>
taglibのソースとtldファイルはここにアップしてあります。Struts 1.2.1用です。
ozacc-struts.zip
2004年7月28日
Java | Struts whenError Tag
HTMLフォームで、入力エラーがあったフィールドの色を変えたりして目立たせたい。これをStrutsのValidatorと連動させて何とかできないものか考えてみた。
<html:text>タグとかにonErrorStyleとかonErrorClass属性があれぱよかったんだけど、そんなものはない。じゃ、タグクラスを拡張して自作してしまおうかとも思ったけど、視点を変えてJavaScriptで処理できないかと考え、以下のようなwhenErrorタグを作ってみた。
<struts:whenError excludes="name, furigana">上記例の場合、エラーがあったプロパティのうち、nameとfuriganaを除いたプロパティ名が「$$」に代入されて出力されます。
document.forms['formName'].elements['$$'].style.background = '#EEEEEE';
</struts:whenError>
例えば、name、email、telプロパティにエラーがあった場合、以下のようなJavaScriptが生成されます。
<script type="text/javascript" language="javascript">上の場合、nameプロパティはexcludes属性で指定されているので除外されます。エラーのプロパティがなかった場合には、次のJavaScriptが生成されます。
<!--
function doWhenError() {
document.forms['formName'].elements['email'].style.background = '#EEEEEE';
// tel
document.forms['formName'].elements['tel'].style.background = '#EEEEEE';
}
//-->
</script>
<script type="text/javascript" language="javascript">そして、<body onLoad="doWhenError()">と書いておく。
<!--
function doWhenError() {
// no error
}
//-->
</script>
もっと簡単なやり方をご存知の方がいたら、ご教授ください。
taglibのソースとtldファイルはここにアップしてあります。Struts 1.2.1用です。
ozacc-struts.zip
2004年7月27日
Java | アップロード画像ファイルのValidator
アップロードされたファイルの容量、画像フォーマット、画像の縦横サイズ、ついでに英文のワード数をチェックするStruts用のValidatorクラスを作成した。
今まで面倒くさかったアップロード画像ファイルのチェックが、とても簡単にできるようになった。
2004年7月26日
Java | プロパティエディタ
propertiesファイル用エディタ。Eclipseのpropertiesエディタとしては、今までこっちのエディタを使っていたけれど、機能的にも今回のエディタの方が気に入った。
五つ星。
Java | EclipseのAntが実行できなくて困ったの巻
JDKを1.4.2_05にバージョンアップしたら、Eclipse上でAntを実行できなくなった。こんなエラーが。
Specified VM install not found: type Standard VM, name 標準 VMJREの設定やクラスパス変数も正しく設定されているし、何故だーとイラつきながら、ノートPC上のEclipseの設定を調べたり、エラーメッセージをググってみたりするも解決法が分からず。
一時間ほど格闘したところで、あるプロジェクトのbuild.xmlが実行できた。実行できるものとエラーになるものがある。これでピンときた。Run > External Toolsを選択すると、案の定これまでに実行したAntターゲットの設定が蓄えられていた。つまり、古いバージョンのJREパスが設定されたAntターゲットがキャッシュされていた。これらの設定を全て削除したら解決! つまらないことに時間を費やしてしまった。
Java | デフォルトのヒープサイズ
dW : Java technology : パフォーマンスへの目: 開発プロセスを改善するThe Sun 1.4 JVMでの最大ヒープ・サイズのデフォルト値は64メガ・バイトです。
MEMO。
2004年7月21日
Java | DTDの設定
Transformer transformer = transformerFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"); transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "-//Apache SoftWare Foundation//DTD Struts Configuration 1.1//EN");XMLを読み込むのはこれまでにやったことあったのだけど、今回初めてXMLの出力に挑戦。
DTDの出力の仕方が分からなかったのだけど、上のページを見て解決。
Java | Email Validator for Struts 1.1
Struts 1.1のvalidation-rules.xmlに設定されているJavaScript版email validatorは、infoドメインとか四文字のトップレベルドメイン名ではエラーになってしまう。こんなことに今頃気づいた。infoドメイン自体の利用者がまだわずかなので、影響はほとんどなかったと思うけど。
1030行目を
(domArr[domArr.length-1].length > 4)) {として回避。
2004年7月12日
Java | public boolean hasXxxx()
JavaBeansのシグネチャ規約に則れば、boolean値のGetterメソッドは、getXxxx()かisXxxx()でなければいけない。でも意味的にhasXxxxと命名したい場合が多々あり、EL内で使うことも考えて普段は
public boolean hasFoo() {
return foo;
}
public boolean getHasFoo() {
return hasFoo();
}
と同内容のメソッドを重複して定義してます。
でも、二つメソッドを定義することに対して何となくスッキリしない。こういう場合どうすればいいのでしょう?
hasXxxx()をget○○Xxxx()またはis○○Xxxx()とスマートに言い換える汎用の語句○○はあるのか?
外国語学部英語学科卒業のくせに分かりまへん。そう言えば、前務めていた会社のラスボスに「お前は受験英語の成れの果てだからさ」と辱められた(?)事があります。
2004年7月 2日
2004年6月21日
Java | ICU4J 3.0
3.0リリース。2.8をテストしていたとき、実行速度があまり速くないと感じたのだけど、3.0ではパフォーマンスは向上してるかな? 「ICU 3.0 includes the latest bug fixes, locale/charset updates, and performance/build/porting enhancements.」とあるので、ちょい期待。余裕ができたら試してみよう。
2004年6月10日
Java | 例外のロギング
先日書いた例外のログをとる場所について、ひがさん、縣さんのエントリーが参考になります。
http://d.hatena.ne.jp/higayasuo/20040610#1086820307
http://diary.hatena.ne.jp/agt/20040609#p2
縣さんは検査例外に関しては、「例外をthrowするクラス」で実行時例外に変換&ログを取り、さらに「プレゼンテーション層でサービスを呼び出すクラス」でログを取っているようです。呼び出し元で二重にロギングされても大した問題ではないとしています。確かに二重でログを取ることは別に問題にはならないと思います。
そんなことよりCommons LoggingのLogインターフェースに
log.error(e.getMessage(), e);Throwableなオブジェクトを第二パラメータに指定するメソッドシグネチャがあることを初めて知った。
2004年6月 8日
Java | ダイコン時代の設計手法 - 例外処理
J2EEシステムデザインを読んでからは、スローする例外のほとんどは実行時例外を選ぶようになり、それにともなってログや例外の変換以外、catchすることはなくなった。その実行時例外はそもそも回復が不可能なので、catchしたところでなす術がない。なので、Strutsまで例外は送られることになる。catch禁止。間違いない。
ただ、いつも迷うことが一つ。例外のログをどの層でとるべきなのか。例えば、DAO層で発生した例外は、サービス層、プレゼンテーション層も通ることになり、基本的にどの層でもcatchすることはできる。
悩んでたら、もう時間だ。今日は六本木でお仕事。遠い・・
2004年6月 7日
Java | .Net - Java
.Netの勉強を始めようかと考えていて、OpenAMFのように.NetからJavaオブジェクトを使うことはできないものかと調べていたら、Ja.NETというソフトを見つけた。でもコマーシャルソフトで値段も高い。
Java | Tomcat Struts Module
Use this for more rapid Struts application development. It reloads your application every time the struts-config.xml file is modified.おっ、便利そう。
2004年6月 4日
Java | Struts tiles-el
<tiles-el:insert> <tiles-el:put name="title" value="日本語" type="string" /> </tiles-el:insert>putタグのvalue属性値で日本語を指定すると例外がスローされる。EL対応じゃないないtiles taglibを使えば大丈夫だったので、tiles-elがどっかおかしいと思う。後で調べてみるべし。
5/31付けのビルドを使用。
javax.servlet.jsp.JspException: An error occurred while evaluating custom action attribute "value" with value "???": Lexical error at line 1, column 2. Encountered: "\u672c" (26412), after : "" org.apache.taglibs.standard.lang.jstl.Evaluator.evaluate(Evaluator.java:140) org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager.evaluate(ExpressionEvaluatorManager.java:112) org.apache.strutsel.taglib.utils.EvalHelper.evalString(EvalHelper.java:74) org.apache.strutsel.taglib.tiles.ELPutTag.evaluateExpressions(ELPutTag.java:244) org.apache.strutsel.taglib.tiles.ELPutTag.doStartTag(ELPutTag.java:228)このスタックトレースをから判断すると、JSTL実装に問題があるのかな。
2004年6月 1日
Java | MappingDispatchAction
Struts 1.2の新クラス。CVSのソースを追ってみた。名前から分かるとおり、DispatchActionのサブクラスで、Actionマッピングのparameter属性値と同じ名前のメソッドをリフレクションで取得し、実行するだけのシンプルなもの。
DispatchActionは、URLパラメータでメソッド名を指定するのがイヤでほとんど使わなかった。MappingDispatchActionは、メソッドの数だけActionマッピングが増えてしまうけど、それぞれのActionパスに対してValidatorを適用できる利点がある。
関連するユースケースのまとまり単位でMappingDispatchActionクラスとサービスインターフェースを作るのがスマートなデザインだろう。
気になったのが、キャンセルハンドラのcancelled()メソッド。1.1の時も自作のBaseActionの中でキャンセルハンドラを実装していたので目新しいものではないのだけど、MappingDispatchActionでも全体のメソッドでひとつのcancelled()メソッドしかない。
つまり、readとupdateのDispatchメソッドを実装したとしても、キャンセルハンドラはこれらのメソッドで共用しなければいけない。これじゃ使えない。希望としてはメソッドひとつにつき、キャンセルハンドラも1つ。read()とupdate()メソッドがあるなら、readCancelled()、updateCancelled()というハンドラを呼び出してくれるのが便利。
さらに、マッピングのparameterがnullならサブクラスで実装されるexec()メソッドを呼び出すことで、普通のActionとしても使えるようにしたい。こうすれば、基本的にBaseMappingDispatchActionひとつあれば済むことになる。(LookupDispatchActionは滅多に使う機会はないので)
この二つの点を中心に改良したマイMappingDispatchActionを作ったりして、今日の自習時間を過ごす。次のプロジェクトからは、Struts 1.2で。
2004年5月31日
2004年5月23日
Java | Tomcat Plugin For M9
Eclipse 3.0M9で、Sysdeo Tomcat Pluginの一部機能が作動していないことに気づいた。かなり参っていたところ、M9対応版を発見。対応早いなあ。マジ感謝。
2004年5月22日
Java | Eclipse 3.0M9
kakudaさんからのコメントを読んで、辛抱溜まらずEclipse 3.0M9をインストールしてみました。もともとプロジェクトデータのディレクトリは分けていたので、移行自体はすんなり。U/Iが随分きれいになったというのが起動後の第一印象。
プラグインはImprove Resin Launcher、Sysdeo tomcat、Spring Beans、Easy Explorerの動作を確認。
XML BuddyはM8だとクラッシュするかもよ、みたいなことが書いてあったのでインストールしなかったのだけど、実際はどうなんだろう? 人柱やってる人がいたらコメントくださいませ。
CVSのコミットコメントのエンコーディング指定がようやく実装された。ソースコードはEUCで、コメントはShiftJISのちぐはぐな状態からやっと開放され、WindowsでEclipseを使ってない人に不便をかけずに共用できる。
今CVSレポジトリにあるソースファイルのコメント部分をEUCに一気に変換する方法なんてあるのでしょうか?
2004年5月20日
Java | Ant 1.6
久しぶりにAntファイルを書いていたのだけど、こんなタスクないのかなーと思ってググると大体1.6で実装されていた。
でもEclipse上ではAnt 1.6が使えなかった。何か方法はないのでしょうか?
2004年5月18日
2004年5月13日
Java | JPEG画像 CMYK→RGB
カラースペースがCMYKで保存されたJPEG画像をRGBに変換したいのだけど、その方法が皆目検討つかない。ImageMagickを使えばできるようだけど、PureJavaでいきたいところ。
JPEG Metadataの理解はこの目的に近づいているのだろうか? とりあえず後で読んでみるべし。
Java | Commons-IO 1.0
リリース。FileUtilsが好き。Jakarta Commons Team is happy to announce version 1.0 of the Jakarta Commons-IO library. Jakarta Commons-IO contains utility classes, stream implementations, file filters , and endian classes.
2004年5月12日
2004年5月 6日
2004年5月 4日
Java | Log4j SMTPAppender 日本語対応
MEMO。SMTPAppenderで日本語を正しく扱うことができません。そこで、SMTPAppenderを日本語で扱えるようにしてみました。オリジナルのlog4j-1.2.8.jarの代わりにlog4j-1.2.8-ja.jarを用いて、パラメータに以下を追加してください。
<param name="Charset" value="ISO-2022-JP" />
2004年5月 1日
2004年4月26日
Java | TapestryとURLパラメータ
Tapestry in Actionを85ページ読んで、いくつかサンプルを動かしてみたけど、まだピンと来ない。
ここまでで気づいた点として、Tapestryが生成するURLが気に入らない。こんなこと言ったら元も子もないんだけどさ。
Amazonでもそうなんだけど、人にとって意味をなさないURLは好きじゃない。例えばサイトマップのページなら、www.example.com/sitemap/index.html とか www.example.com/sitemap.html といったURLが望ましい。Tapestry使うと多分 www.example.com/app?service=page/Sitemap こんな感じになるのかな。全く意味をなさないわけじゃないけど、スマートじゃない。@DirectLinkなんか使った場合は、パラメータがもっと複雑になるはず。
他所のサイトならともかく、自分が作るサイトがそういうURLになるのは抵抗がある。パブリック向けのサイトでは、URLもデザイン対象の一つだと思ってるから。
Tapestryはまだよく分からないので、実は柔軟にURLパスを設定できるのかも知れないけど。
こんなことを書いておきながら、そのうちTapestryを使い始めて、「URLなんて大したことじゃないよ」と言ってそうな気もする。うん、多分そうなる。
2004年4月24日
2004年4月21日
Java | CronTrigger * と ?
「?」の使い方が、読んでもよく分からない。例を見ると、必ず一つは入ってるんだけど、「*」でもいいような気がする。う~む。The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify 'no specific value'. This is useful when you need to specify something in one of the two fileds, but not the other. See the examples below for clarification.
2004年4月19日
2004年4月 7日
Java | I LIKE GREEN BAR VERY MUCH

僕はテストが嫌いだ。いや、テストすること自体は好きだ。テストを実行する環境とテストケースを作るのが嫌いだ。とても面倒だから。でも、このグリーンのバーを見ると、そんな面倒な作業を行った苦労も忘れて喜んでしまう。
今回のプロジェクトこそ、最後までテストケースを作り続けよう。「最初のうちだけテストする」のテスト・ファーストにならぬよう。
今夜は無事にグリーンバーが出たので、これから"24"を観ることにする。レッドバーでもきっと観たと思うけど。
2004年4月 3日
Java | Fast Lane Readerパターン
随分前に、HibernateDAOとJDBC DAOを使い分けることについて触れたけど、似たような目的のJ2EEパターンがあることを今日知った。
2004年4月 2日
Flash, Java | DTO for Flash Remoting
Flash Remoting経由でやりとりするオブジェクトのクラスは、Flashで必要なプロパティだけをまとめた専用のクラスを作った方が良さそうだ。J2EEデザインパターンのDTOと同じような感じで。ただ、そうなるとFlash Remoting用にそのDTOを返すサービスメソッドを作らねばならない。
2004年3月31日
Flash, Java | OpenAMF CVS版
以前に書いたOpenAMF 1.0 RC5の不具合ですが、3月初めにCVSのコードは修正されていました。
ソースを見たら自分とほぼ同じコードで解決していたので、ちょっと嬉しい。ASTranslator.fromActionScript(Object asObject, Class desiredBeanClass)はprotectedだったけど、ASTranslator 1.5.6でpublicに戻された模様です。
Java | Javaグラフィック
画像ファイルに対して動的にいろいろと処理を施したいと思って、最近はJavaのグラフィック処理について勉強中。
Flash Remotingと組み合わせれば、面白い表現がブラウザ上で出来そうな予感。キーとなるクラスは、java.awt.image.PixelGrabber みたい。
2004年3月30日
Flash, Java | org.openamf.RequestContext
I committed a new class into OpenAMF's CVS repository.OpenAMFのMLから。HttpSessionを簡単に取得できるようになるのは便利そう。The new class is org.openamf.RequestContext
This class provides easy access to the HttpServletRequest object and the HttpSession object.
Application developers can use these static methods:
RequestContext.getHttpServletRequest
RequestContext.getHttpSession
2004年3月29日
2004年3月24日
2004年3月18日
2004年3月10日
Java | 続・ICU4J
Normalizer.normalize(
"全角英数字や半角カタカナ",
Normalizer.NFKC);この一行で「全角英数字や半角カタカナ」で指定した文字列が半角英数字と全角カタカナに変換されて返ってくる。PHPではこんなのは組み込み関数で簡単にできるけど、前にJavaで似たようなクラスを作ったときは結構大変だった。もっと前から知っていれば・・・
ICUを使って西暦-和暦の変換する方法が分からない。誰か知ってたらご教授ください。
その他のクールな変換機能。変換速度は遅いので注意。
Transliterator t =
Transliterator.getInstance("Hiragana-Katakana");
String result = t.transliterate("ひらがながカタカナに");
System.out.println(result); // ビラガナガカタカナニ
Transliterator t =
Transliterator.getInstance("Hiragana-Latin");
String result = t.transliterate("ひらがながカタカナに");
System.out.println(result); // hiraganagaカタカナni
2004年3月 9日
2004年3月 4日
Java | JSP 2.0 Tag Function
JSP 2.0で導入されたTag FunctionとSimpleTag、どちらもTaglib開発をこれまでよりも簡単にしてくれたんだけど、HttpServletRequestを取ってこられないのが不便。まあ、HttpServletRequestが必要になるタグなんて滅多にないからいいんだけど。