[Java] 20 September 2009

失われた環境の復活(Eclipse用JUnitTemplate)

しばらくJUnitとか触ってなかったら。
EclipseのJUnitのassert用コードテンプレートが何処行ったかわからなくなったので、つくりなおした。
もう失くすのは嫌なのでエクスポートしたものをここに置いておくことにした。

[Java] 24 January 2008

MIDP用文字コード変換ツール作ったよ。

表題のもの作ってみました。下記にてDLできます。
J2ME用の文字コード変換コードencconv

NOKIA e61i
最近NOKIAの3Gスマートフォン(E61i)を買ったんですね。スマートフォン、PDAでも携帯でもなくいろいろできるスマートフォン!
こいつは簡体中文版なのですが、ユニコード対応なので表示だけなら日本語もできる優れものです。
日本語入力も、上海在住つながりの(勝手につながって・・・すいません。)nkozawaさん作成のKKJConvを利用すればばっちりなわけです。でも、悲しいことに、標準のメールソフトは日本語が使えないんですね。
悲しっす。


で、POP3のプロトコルを勉強して(っていうほどたいそうなものではないが・・・)携帯用のPOPプロキシサーバを作ってます。正確には携帯の上で動くPOP3プロキシサーバです。いつになるやらわかりませんが、単純なデリゲーターとしては既にPC上で動作してます。

ところがどっこい大きな問題が・・・・・、SJISはおろかEUCJP、ISO2022JPまで全滅です。エンコードの文字セットを持ってないんです。開発者マニュアル確認してもローカライズされたものには搭載されているとしか書いていない。もちろん引き下がるわけにも行かないので、ほやほやのNetBeans6でサンプルを作り、気合いを込めて実機に転送!

ズギュウゥゥン!!"あ".getBytes("SJIS")

おらああああああ!
どうだこのやろーーーー。サーバ野郎なめんな!

ドッギャアアアアアン、UnsupportedEncodingException!!

あえなく、撃沈。
で、怒りにまかせて作りました。
いろんなページを見てUCS2やらJISやらビットシフトやらやりました。とりあえずいくつかの問題はありますが、UTF-8を取得するという目的は達成できそうなので公開します。

ニッチですが、利用する人がいたら使ってください。
ではまた。

[Java] 17 May 2007

FlatXmlDataSetでnull値

ただのメモ。
DBUnitのFlatXmlDataSetでnull値を利用したいときはこういう感じでリプレースしてやると可能。
ReplacementDataSet dataSet = new ReplacementDataSet(
new FlatXmlDataSet(…));
dataSet.addReplacementObject("[NULL]", null);

http://dbunit.sourceforge.net/components.html

[Java] 30 November 2006

やばいClick進化してる・・・

しばらく放っておいたら1.0では大きく利便性が向上している。
0.xではいろいろと補完するためにツールが必要だったけど、かなりフルスタックでいけそう。
#っていうかこの前1.1出てるんだけどねw進化早いっす

いまのところ気持ちよいのは(いや表の派手なコントロールではなくて、地味なところに着目しちゃってるのですが・・・)
・Page#onRenderの導入
→ これはある意味で妥当な進化かも、以前からレンダリングプロセスを行うとき無駄に自由度高くてコードが荒れやすかったし(コードスタイル統一の観点と、オフショア的観点から)

・ClickControlの自動的なaddControlとaddModel
いままでは(古っ!)PageのaddControl,addModelをしないとダメだったが、1.x弄ってて気づいたのがいつのまにか追加されている。
おかしい・・・どこかで自動追加してやがる!と思って、良く見てみると下記のようにClickServlet#processPageFieldsでやってる。パブリックフィールドで捜し出してコールバックに渡して、コールバック内部ではinstanceofでControlとそれ以外を判定して追加してる。
→ これはよりいっそうC/S系クライアントに近付いたので非常に使いやすいと思う

protected void processPageFields(
Page page, FieldCallback callback) {
Field[] fields = page.getClass().getFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
try {
Object fieldValue = field.get(page);
if (fieldValue != null) {
callback.processField(
field.getName(), fieldValue);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

っていうかこういうインタフェースの使いかたって素敵で大好きw
あと、このコード見て思ったのが、やっぱり最近はアプリケーション層では例外にRuntimeExceptionを利用する流れが普通になってきたなあ、C#とかデフォでランタイムだしなあ

今回作ってる業務系WEBでは、いわゆる慣習化した確認画面を排除して工数を下げてみようと思ってる。機は熟した感じ、可能ならスケルトン自動生成でやりたいなあ

#業務連絡:
オナシスさん、忙しくて返事できてませんホントごめんなさい
m(_ _)m

[Java] 13 November 2006

待ってたよ、愛してるぜJava。

キタ!GPL2だぁーーー。


サン、「Java ME」と「Java SE」のソースコードをGPLライセンスで公開へ


これで多くのディストリに標準搭載になる。(ToT)/
嬉しい、嬉しいよ。

バッチをJavaで書いても怒られなくなるし、それとそれと、きっとレンタルサーバも標準で・・・・
gcjにやられることもなくなるし。。。。
↑gcjの人、すいませんm(_ _)m
OpenOfficeとか動かすために必要なのは知ってるけど、でもあれやっぱり忘れた頃にはまるので困る。

よーっし、今日はお祝いだ!(もうあほ丸出し・・・)

[Java] 01 November 2006

NetBeans5.5リリース

NetBeans5.5がリリースされた。
でもJavaSE6 beta2で使うのは勇気が要るので、JDKは1.5で・・・・

JavaDocのオートコメントのバグはまだ修正されてなかった。
ひょっとして気づいてないのかな・・・・。
↑困った現象のバグorz
オートコメントツールでサンプルにアノーテーションコードを含んだコメントを記述するとapidocのタグ(たとえば@returnとか@paramとか)だと解釈して勝手に消してしまう。
ようするに@が入ってるとダメなようですが、「test@test」みたいに@の前に文字が入っている場合は問題が無く、「 @」のように@の前に空白が入る場合に問題が発生するみたいです。

Java SE 6/EE 5へ対応 - NetBeans 5.5
http://journal.mycom.co.jp/news/2006/11/01/340.html

NetBeans.org
http://www.netbeans.org/

[Java] 21 October 2006

クライアントアプリとJ2EEと認証

全く持って縁がなかったので想像がつかない。
たぶん、J2EEサーバの認証を利用するんだろう・・・・

方向性としては、こんな感じ
1、J2EEサーバにユーザを登録(ロールベース)
2、J2EEの認証機構最大限利用
→ runclientとか言うヤツ???
3、メニュー情報をEJBで配信
→ その際にEJBContextのisCallerInRoleを利用してロールごとにメニューを変更して配信
4、クライアントアプリ側では2のメニュー情報に従ってメニューを構築
→ WEBと違ってメニューが無ければアクセスできないし
5、あとは各ロジック側に宣言的認証を設定すればセキュリティ的にはOK??

で、常にEJB使うと足を引っ張られるから、開発中はEJBを通さずにPOJOを呼び出して、本番でEJBみたいな。OpenEJBだけでもJ2EE認証使えるのかな??

たぶんこの辺が参考になりそう
Geronimo用のクライアント・アプリケーションを作る
http://www-06.ibm.com/jp/developerworks/java/050715/j_os-ag-client.shtml
第7回 J2EEのセキュリティのキホンを知る
http://www.atmarkit.co.jp/fjava/rensai/j2ee07/j2ee07_2.html

[Java] 16 October 2006

Shiftキー押下時の振る舞いを実装するには

Swingのメモ。
任意のJComponentにおいてShiftキー押下、解放時の振る舞いを実装しようと思った。
↑ターゲットとしては、業務アプリとかで画面下部に並んでいるファンクションボタン、アレってShiftキーだけ押下するとラベルが変わったりするでしょう?(例えば秀丸とかもそうだけど・・・)

あの動作をコンポーネント化した状態で実装したかった。
作り込みならKeyEventを拾って一個一個ハンドリングすればよいけど、再利用可能なコンポーネント化をしたいとき余りにも問題があると思ったので、InputMapにShiftのKeyBindを追加する。
FunctionKeyの振る舞い自体はMnemonic(ニーモニック)で対応予定。

//インプットマップの取得
InputMap inputMap
= getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
//アクションマップの取得
ActionMap actionMap = getActionMap();

//Shiftが押下されたときのKeyStrokeを取得
KeyStroke shiftPressKeyStroke
= KeyStroke.getKeyStroke(
KeyEvent.VK_SHIFT,
InputEvent.SHIFT_MASK,
false);

//文字表現によるKeyStroke
//KeyStroke shiftDownKeyStroke
// = KeyStroke.getKeyStroke("shift pressed SHIFT");

//KeyStrokeの登録
inputMap.put(shiftPressKeyStroke,"press");
//対応するActionの登録(shiftPressedはAction)
actionMap.put("press",shiftPressed);

//Shiftが押下状態から開放されたときのKeyStrokeを取得
KeyStroke shiftReleaseKeyStroke
= KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT,0,true);

//文字表現によるKeyStroke
//KeyStroke shiftReleaseKeyStroke
// = KeyStroke.getKeyStroke("released SHIFT");

//KeyStrokeの登録
inputMap.put(shiftReleaseKeyStroke,"release");
//対応するActionの登録(shiftReleasedはAction)
actionMap.put("release",shiftReleased);


重要なのは、InputMap取得時に
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
すること、デフォルトだとWHEN_FOCUSEDなのでどこでもハンドリングされるわけではない。

謎なのは、Shiftキーのpressを拾うときにmodifiersにSHIFTのマスクを設定する必要があること・・・。

参考:
JComponentのJavaDoc
InputMapのJavaDoc
The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Other Swing Features
How to Use Key Bindings

http://www.javadrive.jp/tutorial/jmenu/index10.html

これはEventListnerを利用する方法、これをやりたくなかったからInputMapを利用した。
http://www.atmarkit.co.jp/fjava/javatips/112java018.html

[Java] 03 September 2006

なぜ我々はMavenなのか(プロジェクトにおける有効性)

そろそろ時代に乗り遅れないようにJ2EE5.0の勉強を開始しようと思います。w
私がJ2EE勉強を始めるに当たり設定するゴールはこちら
  1. Eclipseによる開発

  2. Build&DeployはMaven2を利用

この2つのゴールは、最終的にはJ2EE5.0において実際的な開発を行なうための必須条件です。1点目については言わずもがなです。最も普及しているIDEである以上、当然利用します。
さてここからが本題ですが・・・・
» 続きを読む

[Java] 26 July 2006

[Groovy]馬鹿丸出しな利用法

昔の連絡先をメモするのが不便なこともあって、携帯から抽出しておいたVCF(VCARD形式)ファイルを見つけた・・・・。
が・・・、はっきり言ってアレは人間の読むものじゃないのでGroovyで名前と電話、メアドだけパース
そのときの馬鹿丸出しのScript。

vcfFile = new File(args[0])
fnPattern = ~"FN\\:(.*)"
telPattern = ~"TEL.*\\:(.*)"
mailPattern = ~"EMAIL.*\\:(.*)"
vcfFile.eachLine
{
printMatcher(fnPattern.matcher(it))
printMatcher(telPattern.matcher(it))
printMatcher(mailPattern.matcher(it))
}

def printMatcher(matcher){
if(matcher.matches()){
println matcher.group(1)
}
}

[Java] 10 July 2006

[Groovy&Velocity]最初の成果物0.0.1

とりあえず最初の成果物0.0.1を公開したく思います。
突貫なので簡単な作りでアレなんですが、興味ある人は、是非いじってみてください。
http://www.makino-style.org/ura/index.php?hymall%2F0.0.1

うまくいかない場合、コメントに質問書いてください。可能な限り返答します。
あと、もし面白いと感じてくれる人がいたら手伝ってください。まじめに作りますw

[Java] 09 July 2006

GroovyがVelocityを引っ張るのです。その3

S2を取り込んで見ました。
現状でBindingの生成にS2を利用してます。
良くある区分値テーブルとかの情報一覧を表示する場合のコード例
Sample.gdo
  import groovy.sql.Sql
  list = new ArrayList()
  sql = new Sql(dataSource)
  sql.eachRow("select * from sys_param") { row |
    kbnData = new KbnData()
    kbnData.name_j=row.name_j
    kbnData.kbn=row.kbn
    kbnData.kbn_id=row.kbn_id
    list.add(kbnData)
  }
  if(list.size()>0){
    request.setAttribute("list",list)
  }
  class KbnData{
    @Property name_j,kbn_id,kbn
  }
Sample.htm
  <html>
  <body>
  #if($!list)
    <table>
      <tr>
        <td>kbn_id</td>
        <td>kbn</td>
        <td>name_j</td>
      </tr>
  #foreach($data in $list)
      <tr>
        <td>$data.kbn_id</td>
        <td>$data.kbn</td>
        <td>$data.name_j</td>
      </tr>
  #end
    </table>
  #else
    <h1>結果は0件</h1>
  #end
  </body>
  </html>

#S2の手軽さに感動しました。

[Java] 09 July 2006

Dispatchしたときの・・・・(原因解明編)

きっとGroovy本家の人やコアな人は既に把握していて既出かもしれないのだが・・・・

ある程度原因が判明、状況から判断すると、結局スクリプト実行時にダイナミックにCategoryサポートを付加する際に、クラスの型ごとに行なっており、なおかつ実行時MetaClassImplにて関連するMetaMethodをすべて取得しているという動作に由来するようだ。

なぜこのような現象が発生するかというと、結局Servletコンテナの実装のため、もしくはGroovyの実装のためとしか言いようがない。

現象に照らし合わせて、状況を整理してみる。
1,スクリプトAでrequestのsetを実行しスクリプトBへDispatchする。
2,スクリプトBでrequestのsetを実行する。
そうするとGroovyRuntimeExceptionでAmbiguous method overloading for methodと例外が発生。

この時、最初のスクリプトAでバインドされたrequestはorg.apache.catalina.connector.RequestFacadeのインスタンスであり、GroovyCategorySupportのThreadLocalのstackにもRequestFacadeクラスのClassインスタンスをkeyとしてsetのCategoryMethodがキャッシュされる。
(詳しく言えばRequestFacadeがcategorizedClassとされ、さらにCategoryMethodにてHttpServletReqeustを対象としてキャッシュされる。)

ところが、スクリプトBでバインドされたrequestはコンテナによりDispatchされたrequestなのでorg.apache.catalina.core.ApplicationHttpRequest(HttpServletRequestWrapperのサブクラス)となっている。
そのためstackには新たにApplicationHttpRequestをkeyとしてsetのCategoryMethodがキャッシュされる。
(同じくApplicationHttpRequestがcategorizedClassとされ、さらにCategoryMethodにてHttpServletReqeustを対象としてキャッシュされる。)

このためスクリプトBの実行時にはCategoryメソッドの検索で、見事に2つのsetメソッドが存在することになり、結果的にAmbiguous method overloading for methodとなるらしい。

ということで、結局Servlet関連のrequest,session,contextに関連するCategoryサポートは利用できる局面と利用できない局面が混在することになるので、紛らわしいから利用しない方向で実装することに決定。
まあsetAttributeを書くのがそれほど苦痛とも思われないので、問題ないかと・・・

参考:
GroovyCategorySupportのコードを追ってみた。
裏マキノ式:GroovyCategorySupportの分析

[Java] 05 July 2006

DispatchしたときのGroovyCategorySupportの振る舞い

GroovyのスクリプトでServletCategoryを利用して、RequestDispatcherを利用するとrequestとかのsetでこける。

具体的には
1,スクリプトAでrequestのsetを実行しスクリプトBへDispatchする。
2,スクリプトBでrequestのsetを実行する。
そうするとGroovyRuntimeExceptionでAmbiguous method overloading for methodと怒られてしまうのだが、これはおかしいよなー
場所的にはMetaClassImplクラスのchooseMostSpecificParamsにおいてmatchesが1ないしは0以外の時に発生する。つまり簡単に言えば、ServletCategoryで追加しているsetメソッドが重複しているよーって言っているのである。

Groovyのソースコードを追っていると、GroovyCategorySupportにおいてCategoryのキャッシュを保持するためにThreadLocalを利用しているが、ここが超臭う。
private static ThreadLocal local = new ThreadLocal() {
 protected Object initialValue() {
  List stack = new ArrayList();
  stack.add(Collections.EMPTY_MAP);
  return stack;
 }
};
RequestDispatcherを利用しない場合は問題ないのになー。
↑これはTomcatがThreadの使い回しの際にinitialValueで初期化しているからと思われ・・・

オリジナルのGroovletでも同じ現象が発生してる・・・・・orz
そんなに影響はないけどCategory使えないのは利便性の観点から痛いなー

[Java] 03 July 2006

GroovyがVelocityを引っ張るのです。その2

昨日スタバのテラスで汗を流しながら考えたメモ
1.HTMLのモックアップからアプリケーションを作り上げる。
→ これは業務ではなくサイト構築という観点では非常に重要、理想論ではなく現場の現実論としての実装

2.共通のプレロジックの実行をサポート
→ 呼び出されたServletPathから判断して上位ディレクトリから順に規定された名称のGroovyスクリプトをチェーンして実行

3.DIコンテナによるカスタムBindingの生成
→ 既存Java資産の活用やトランザクションの実現が可能

4.Exceptionのハンドリング
→ 細かくは考えていないけど、規定の場所に配置して、ハンドリング後に呼び出し

5.その他
 VelocityのTemplateの実装、VelocityToolsのGroovyによる記述

番外
→ フレームワークの名前はスタバの隣のスーパーの名前(Hymall)にしようかとw

1は非常に重要で、コンシューマ向けのサイトを作り上げるときに見逃してはならない点である。具体的な実装方法としては、GroovyServletの親クラスであるAbstractHttpServletを継承して独自のコントローラを用意している。先頃GroovyのJSR06が出たのでそちらのソースコードを閲覧する必要もあるが、とりあえずJSR05で実装してみた。
大まかな流れとしては下記のようになっている。
①*.htmをハンドリング
②GroovyScriptが存在するなら、ServletPathから対応するGroovyScriptのパスを生成して実行
③Velocity用のHTMが存在するなら、マッピングされていないVelocityViewServletをgetNamedDispatcherにより取得してforward実行
④Groovy、Velocityとも対象ファイルが存在しない場合は404

開発スタイルのイメージとしては、デザイナーなどが作り上げたモックアップを配置して、Groovyのロジックを書き足していくイメージである。
仮にGroovyのロジックが存在しない場合でも、VelocityがHTMを配信するのでモックアップのまま利用すれば画面の流れが寸断されず良い。(*.htmでハンドリングしているため)
例えば下記の場合
/Sample.htm?name=F.Makino&address=Shanghai
既にSample.htmが存在して居るため対応するGroovyScriptであるSample.gdoが存在しなくても表示されるということ

#デプロイなしでシームレスに開発ができるのがこんなに幸せだとは思わなかったヨ...(TーT)

#あと意外にGroovyServletのソースは汚いよw