2009年1月30日金曜日

CMD.EXE 変数の評価

CMDなどの変数は遅延評価しないのがデフォルト。
下記のようなコードでは、%ERRORLEVEL%は起動時に値が「0」で入ってしまい、途中では変化しない。

@ECHO ON

@ECHO OFF
::cmd.exe
SET NETADRS=%1
for /L %%i in (1,1,254) do (
CALL ping -l 0 -n 1 -a %NETADRS%.%%i
ECHO ERROR : %ERRORLEVEL%
IF %ERRORLEVEL%==0 ECHO FOUND %%i
)


ただしくは、以下のように「ERRORLEVEL」を裸で使用する。

IF ERRORLEVEL 0 ECHO FOUND %%i


 ところが、これだといつでも「FOUND」となってしまう。調べると「 DOS コマンド一覧 > If 」にあるように、ERRORLEVELの指定はその数値以上という意味であった。
 上記のコードではエラーレベルが0以上ならと解釈されていつでも実行することになった。正しくは、下記のようにする。


@ECHO OFF
REM search network ips with ping
::cmd.exe
SET NETADRS=%1
SET DSPNORES=%2
IF "%NETADRS%"=="" (
ECHO "usage: %0 NETADRS(xx.xx.xx) [DSPNORES]"
GOTO END
)

for /L %%i in (1,1,254) do (
ping -l 0 -n 1 -a %NETADRS%.%%i >:NULL
IF ERRORLEVEL 1 (
IF NOT "%DSPNORES%"=="" ECHO -NORES %NETADRS%.%%i
)ELSE ECHO +FOUND %NETADRS%.%%i
)
:END
@ECHO ON

2009年1月29日木曜日

Teeda(Seasar2) のSelectアイテム

Selectタグに項目を埋めるためにListでフィールドを作成したが、意味不明のエラー。

public List<Map<String, String>> locidItems;


* text

java.lang.NullPointerException: text
at org.seasar.framework.util.AssertionUtil#assertNotNull (AssertionUtil.java#41)
at org.seasar.teeda.core.context.html.HtmlResponseWriter#writeText (HtmlResponseWriter.java#152)
at org.seasar.teeda.core.render.html.HtmlSelectManyListboxRenderer#renderSelectItems (HtmlSelectManyListboxRenderer.java#179)
at org.seasar.teeda.core.render.html.HtmlSelectManyListboxRenderer#encodeHtmlSelectListboxEnd (HtmlSelectManyListboxRenderer.java#91)
at org.seasar.teeda.core.render.html.HtmlSelectManyListboxRenderer#encodeEnd (HtmlSelectManyListboxRenderer.java#68)
at javax.faces.component.UIComponentBase#encodeEnd (UIComponentBase.java#348)
at org.seasar.teeda.core.util.RendererUtil#renderChild (RendererUtil.java#327)
以下省略


ここにも同じ経験の人がいて、解決も乗っていた。(解決を見る前に自分でも解決したが、、、)

 サンプルがいまいち分かりにくかったのだが、ListならDtoでよく、Mapなら単独のMapでよかった。
それを、MapのListにし、各Mapには put(labelStr, keyStr) の形でデータを入れていたのだが、MapのListの場合はDtoと同じ扱いになり、"label","value"という名称のフィールドとして扱えることが必須であった。
 つまり、今回の場合だと、Listに追加するMapには、以下のようにデータを入れる必要があった。
map.put("value",keyStr);
map.put("label",labelStr);

2009年1月23日金曜日

Ejb On GlassFish 続き

GlassFishのACCでのLoad-Balance/Fail-Overに関して、SUNのForumに質問して分かったこと。
1)クラスタ内のEJBに対するLB/FOの設定はORBの機能
2)GFのORMは、DynamicにLBする機能はなく、初期接続時のLBのみである
つまり、InitalContext を作成して、Lookupした時点でLBされるのであり、それ以後はおなじクラスタメンバにアクセスすることになる。JBOSSやWAS、WebLogicでは、Optionが必要な場合もあるが、複数の方式のLBをサポートしている。たとえば以下のようなもの。
接続時にLB
毎回LB
トランザクションごとにLB
UDS/Forteでは、最初から上記の方式をサポートしていたことを考えると、GFのORBは退化してしまっているように感じる。ただし、EJBの世界ではUDSのようなRouterとなるプロセスやスレッドを持たないため、ベンダー毎の独自拡張となっているようだ。

2009年1月7日水曜日

Ejb on GlassFIsh

クラスタを組んだGFにEJBを配置してクライアントから呼び出していたが、以下の原因不明のエラーが発生。


Caused by: java.lang.NullPointerException
at com.sun.enterprise.util.ORBManager$1.run(ORBManager.java:386)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.enterprise.util.ORBManager.setORBSystemProperties(ORBManager.java:381)
at com.sun.enterprise.naming.SerialInitContextFactory.(SerialInitContextFactory.java:65)
... 28 more

結局ソースを調べてわかったのは、System.getProperty("java.vendor") が null になっていた。
これは、SystemPropertiesの設定をするところで、以下のようにしたため。
System.setProperties(prpty);
これをすると、prptyに定義されているものだけが残り、ほかはすべてNULLとなる。
Propertiesの指定をした理由はSunのACCを使用せずにクラスタが使えないかを調べるためだったが、
結局普通のクライアントからだとクラスタ化されたJNDIを引くことができずに撃沈。

ACCを使用すると、関連するインスタンスを探し出してそのJNDIをリストアップし、重みづけをして負荷分散できるように設定しているらしいことがログからわかった。ただし、実際のコードの実行部分になると、以下のようなエラーが発生してしまう。


Caused by: java.lang.RuntimeException: メインクラス内の持続性ユニットの注釈の確認中にエラーが発生しました
at com.sun.enterprise.appclient.StandAloneAppClientInfo.classContainsAnnotation(StandAloneAppClientInfo.java:101)
at com.sun.enterprise.appclient.AppClientInfo.mainClassContainsPURefcAnnotations(AppClientInfo.java:413)
at com.sun.enterprise.appclient.AppClientInfo.appClientDependsOnPersistenceUnit(AppClientInfo.java:382)
at com.sun.enterprise.appclient.AppClientInfo.completeInit(AppClientInfo.java:175)
at com.sun.enterprise.appclient.AppClientInfoFactory.buildAppClientInfo(AppClientInfoFactory.java:149)
at com.sun.enterprise.appclient.MainWithModuleSupport.(MainWithModuleSupport.java:366)

2009年1月5日月曜日

大阪王将が閉店

国道沿いとはいえ、ちょっと入りにくい場所だったのが災いしたのか赤字だったようだ。
30日にASAPASS割引を使って6人で親睦会、アツアツのバイキングを堪能して7500円と
お得だったのに残念だ。