ミリ秒単位の時間の取得をする

古いメモにあったものを整理のため写した。

// 時間をミリ秒で返す
// (clockid_tにより動作が変わる/CLOCK_REALTIMEの場合システムの実時間時計)
// time.h
int clock_gettime(
    clockid_t clock_id,
        struct timespec *tp
);
clockid_tはCLOCK_REALTIME,CLOCK_VIRTUALなど定数で指定する。
struct timespec{
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
tv_nsec の値は 0 〜 999,999,999 の範囲になければならない。
参照: http://docs.hp.com/ja/B2355-60104-05/rn04re25.html

この関数はCygwinでは実装されておらず、Windowsでは次の関数を使う。
// 起動してからの時間をミリ秒で返す
// windows.h
DWORD GetTickCount(void);

– ミリ秒以下のスリープ

// req で指定した時間、ナノ秒(1000ナノ秒 = 1ミリ秒)単位で処理をスリープさせる.
// rem はsignalによって停止した場合に残りの時間を格納するためのものでNULLでも
// よい。signalで停止した場合-1を返す。
// time.h
int nanosleep(const struct timespec *req, struct timespec *rem);

参照: <http://www.linux.or.jp/JM/html/LDP_man-pages/man2/nanosleep.2.html>
この関数はCygwinでは実装されていないが、WindowsではSleepがあるから不要ですね。

// windows.h
void Sleep(DWORD dwMilliseconds);

dwMilliseconds=0のとき、優先順位が等しく実行準備のできた他のスレッドに処理を譲
る。該当するスレッドがない場合は即制御を返す。

メール添付ファイルのデコード

– base64 エンコードされて改行区切りになったデータを受けてデコードして出力する。

$ php -r ‘ $buf = “”; while(!feof(STDIN)) $buf.= fgets(STDI
N); $buf = str_replace(“\r”,””,str_replace(“\n”,””,$buf)); echo base64_decode($buf); ‘ < /tmp/input.txt > /tmp/output.rtf

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 スコープでやり取りするとよさそう。

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

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() とは全く形式が異なるので注意。