カテゴリー : 2005年 7月

jsp の動的 include について


いつも 静的 include (<%@ include path="foo.jsp"%>)だったが、初めて動的 include (<jsp:include /> を試してみた。
- 静的なものと違い, ローカル変数, メソッド定義, import 構文はそれぞれに独立
- page スコープの属性は互いに参照できない(pageContext の attribute など)
- request スコープ以降のものは参照可能。
なので影響範囲を最小にしつつ参照するには request スコープを使うとよい。
- jsp:param (ex. <jsp:param name=”foo” value=”123″ />)はリクエストパラメータ(request.getParameter(String))になる。
- jsp:include 呼び出しと通常のリクエストとを区別するには request スコープでやり取りするとよさそう。

JSTL と EL の実験


<%@ page import="java.util.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
Set set = new HashSet();
set.add(“foo”);
set.add(“boo”);
set.add(“woo”);
set.add(“goo”);
pageContext.setAttribute(“set”, set);
%>
デフォルトの書き出し:<br>
  <c:out value=”${set}” /><br>
単純な forEach:{<br>
<c:forEach items=”${set}” var=”af”>
  <c:out value=”${af}” /><br>
</c:forEach>
}<br>
末尾を意識した forEach:{<br>
<c:forEach items=”${set}” varStatus=”status” var=”af”>
  <c:out value=”${af}” /><c:if test=”${!status.last}”>,<br></c:if>
</c:forEach>
}<br>

結果は次のとおり

デフォルトの書き出し:
[foo, woo, boo, goo]
単純な forEach:{
foo
woo
boo
goo
}
末尾を意識した forEach:{
foo,
woo,
boo,
goo }

 
参考:
<http://www.kawaz.jp/pukiwiki/?JSTL%2FCore#content_1_1>
- ずんWiki
<http://www.javaroad.jp/servletjsp/index.html#jsp>
- Java の道 (Servlet / JSP)
<http://www.stackasterisk.jp/tech/java/tomcat5th02_01.jsp>
- STACK* – EL式とタグファイル

今日のはまり 


Linux (Debian) に Tomcat を新規インストールしたものの, Tomcat を起動しようとするとやたら LISTENING 状態になるのに時間がかかり、しかも数分で勝手にプロセスがシャットダウンしてしまうという現象を聞いて、対応。
 

JAVA_OPTS=”-server -verbose -verbose:gc -verbose:jni -Xcheck:jni -Xfuture ” bin/catalina.sh start

とかしてログを冗長化。

tail -f logs/catalina.out

みたくしてリアルタイムにログを見ていたら, どうも毎回ソケット周りで止まっている模様。時間的に 2分弱だったので TCP のタイムアウトを疑い、localhost が設定されていないのではないか? と思ったら案の定,

ping localhost

が応答しない。ifconfig したら lo インターフェイスに IP アドレスが割り当てられていなかった。そりゃ問題も発生しますな…
 

ifconfig lo 127.0.0.1

これで手っ取り早く解決。(もちろん、マシンごと再起動しても大丈夫なように設定も必要。

Web アプリケーションの基礎


いまさらながら。
 
- 最低限の Web アプリケーション
webapps などアプリケーションを格納するディレクトリ(Tomcat 5.x なら conf/server.xml の Server タグ内 Host タグの appBase 属性)の中にあり、かつ WEB-INF ディレクトリを持つディレクトリが Web アプリケーションとみなされる。

 + webapps
 |
 –+ HelloApp
   |
   –+ WEB-INF

Tomcat 5.x + JNDI の基本設定メモ


毎回なぜかつまづいていた JNDI の設定が今回はすんなりいったのでメモ。
 
- foo という Web アプリケーション(ex. “TOMCAT_HOME/webapps/foo”)の中に, jdbc/privateDB という JNDI リソース名を, MySQL 公式で手に入る JDBC コネクタを使ってローカルの MySQL サーバの, foo_db というデータベースに, ユーザ user_foo, パスワード booboo で接続するリソースを割り当てるには, META-INF/context.xml をたとえば次のように設定する。

<Context path=”/foo” docBase=”foo”
                        debug=”5″ reloadable=”true” crossContext=”true”>
        <Resource name=”jdbc/privateDB” auth=”Container”
        type=”javax.sql.DataSource” driverClassName=”com.mysql.jdbc.Driver”
        url=”jdbc:mysql://localhost:3306/foo_db”
        username=”user_foo” password=”booboo” maxActive=”20″ maxIdle=”10″ maxWait=”-1″/>
</Context>

このとき server.xml では一切このリソースについて触れていない。server.xml とか conf/Catalina/localhost/foo.xml とかで複数の箇所で記述してしまうとうまく動かないのかも。

5.x でポートは開いているのに何も応答がない


作業用ディレクトリ(work)への書き込み権限がないと処理待ちでこうなる。
管理者と一般ユーザを分離して使っているWindows 環境(Windows XP + Cygwin) でなって, はまってしまった。
 
UNIX 系列な OS と Windows では管理者権限の扱いが微妙に違うので気を付けないとすぐこうなる..
 
全ての親ディレクトリについてフルコントロール権限を管理者に与え、Tomcat インストールディレクトリ以下の所有者を管理者にし、管理者の状態で実行しなおして解決。
あまりよくなさそう。

Security Code Guidelines


- セキュアなコードを書くための、 Sun 公式ガイドライン。
Eclipse の PMD プラグインで自動チェックしてくれるみたい。
<http://java.sun.com/security/seccodeguide.html#gcg>
- Security Code Guidelines
<http://pmd.sourceforge.net/>
- PMD 公式
Eclipse(2.x/3.0.x/3.1.x) 用プラグインをインストールするときは以下の URL を指定すればよい。
 http://pmd.sourceforge.net/eclipse
<http://www.eclipsewiki.net/eclipse/?PMD>
- EclipseWiki – PMD
使えるルールと、なぜいけないかという理由が日本語でまとめられている。

OpenOffice.org が GetStorage .. というエラーで起動できなくなる


OOo 起動中に電源ごと落ちて起動したあとに次のエラーがでて OOo 起動しなくなった。

GetStorage, name : “No Content !”

とりあえず検索したところ、OOo Forum で同じ現象について回答で次のような説明があった。
<http://www.oooforum.org/forum/viewtopic.phtml?p=17054#17054>

OOo stores configuration files into Two layers.
1. The SHARE layer.
2. The USER layer.
 
The User configuration layer holds any settings that are DIFFERENT from the Shared configuration. For example, if you change your color scheme, or default font, the change is saved into the user layer.
 
These two layers are stored in directories of files. It is different on Linux and Windows. You don’t say which you are on, so I’ll explain both. Please read both, it will give you insight.
 
On Linux, for example, suppose OOo is installed in the following path…
 
/opt/OpenOffice1.1.0
 
Then the System configuration layer is in the folder….
 
/opt/OpenOffice1.1.0/share
 
And the User configuration layer is in each individual user’s home directory….
 
/home/danny/OpenOffice1.1.0/user
 
 
 
On Windows, suppose OOo is installed to
 
C:\Program Files\OpenOffice1.1.0
 
Then the System configuration layer is stored in….
 
C:\Program Files\OpenOffice1.1.0\share
 
And the user configuration layer is stored in….
 
C:\Program Files\OpenOffice1.1.0\user
 
(以下略)

ここまで読んで User 層の変更があった設定を戻せばいけるんじゃないかと思い、最後に動いていたあたりに変更があったものを削除したら問題なく動くようになった。

$ # Windows なので Cygwin で作業
$ cd d:/OpenOffice.org1.1.4/
$ touch -t 071208050 /tmp/timestamp.tmp # 最後の変更直前くらい。
$ for i in `find . -type f -newer /tmp/timestamp.tmp`; do echo $i && mv $i /tmp/;done
$ # rm でもいいけどいざというとき戻せるように mv

ちなみに該当したのは次のファイル

./user/config/inethist.dat
./user/registry/cache/org.openoffice.Setup.dat
./user/registry/data/org/openoffice/Office/Common.xcu
./user/registry/data/org/openoffice/Setup.xcu

Linux で Windows のようなサスペンド


swsusp というのがあるらしい。
<http://www.suspend2.net/>
- Software Suspend 2 for Linux 公式
<http://thlug.sourceforge.jp/pukiwiki/pukiwiki.php?swsusp%BE%DC%BA%D9>
- THLUGPukiwiki – swsusp 詳細

Canvas.processEvent の使い方


- パラメータの意味について(とりあえず Doja 2.x では)詳しく書かれておらず、ちょっと試行錯誤してしまったのでメモ。

public void processEvent(int type, int param);
    低レベルイベントが通知されたときに呼ばれるメソッドです。
     
    パラメータ:
        type – イベントのタイプが渡されます。
        param – イベントのパラメータが渡されます。 パラメータの意味はイベントによって異なります。 パラメータを持たないイベントの場合は、0が渡されます。

- type : Display の定数のうち、xxxイベントと説明されているもの。
例えば
Display.KEY_PRESSED_EVENT (=0) がキーを押した時に呼ばれ、
Display.KEY_RELEASED_EVENT (=1) がキーを離した時に呼ばれる。
 
- param : キーイベントの時は Display.KEY_xxx のいずれかが入る。同時押しは考慮にいれず、実際にトリガを引いたキーの値が与えられる。
Canvas.getKeypadState() とは全く形式が異なるので注意。