i アプリに必要なADF(.jam) 記述

– AppClass = Foo
IApplication を継承している実行クラス。必須。
– PackageURL = foo.jar
アプリを格納している jar ファイル。相対ディレクトリ指定、URL 表記ともに可能。必須。
– AppSize = 12345
PackageURL で指定したファイルのサイズをバイト単位で正確に指定する。必須。
– SPsize = 102400
確保する必要のあるスクラッチパッド領域をバイト単位で指定する。必須。
– LastModified = Mon, 07 Nov 2005 16:00:00
更新時刻。

WWW, DD MMM YYYY HH:mm:ss

という表記をとる。503i 系対応にするときは月に Apr を指定してはならない。必須。
i アプリのバージョンアップ時にチェックされる。
– UseNetwork = http
i アプリ上で Web アクセスする場合に必須
– UseBrowser = launch
i アプリ上でブラウザを立ち上げる場合に必須
– AppVer = X.X
バージョン指定。必須?
– AppTrace = On
指定すると携帯端末でデバッグ出力(トレース情報, ダウンロード元 URL 等)を表示するようになる。
トレース表示の仕方は機種によって全く異なるため、<http://www.saturn.dti.ne.jp/~npaka/ibook2/izon.html> の各バージョンについての「待ち受けボタン・トレースの表示」を参照。

DoJa エミュレータでオプションとなっている API を使うと例外が出る

少し前にはまった。DoJa エミュレータのデフォルトではライブラリが不足しているので呼び出そうとすると RuntimeError になる。エミュレータ上で正しく動作させるには micro3d_v2_32.dll というファイルを DoJa の bin フォルダにいれてやる必要がある。
<http://www.mascotcapsule.com/toolkit/docomo/>
– micro3d_v2_32.dll の配布元。
– 追記 2005-12-19: ダウンロード場所がわかりにくい気がするので捕捉。現在、
DoJa 2.5oe/3.0/3.5 の Tools -> DLL micro3d_v32.dll でダウンロード可能。

Tomcat で Filter を使う例(IPアドレスによるアクセス制限)

<http://www.jajakarta.org/kvasir/bbs/technical/688?expand=true>
jakarta.org: Ja-Jakarta Project 掲示板 -> Tomcatでの特定のディレクトリに
対してのアクセス制限の方法
より転載(一部改変).
フィルタの実装の仕方、web.xml のパラメータの取得の仕方が分かるし、実用的。
web.xmlの設定:

<!– ローカルネットワークからだけのアクセス許可–>
<filter>
<filter-name>Allow Local Network Access</filter-name>
<filter-class>IpAddressFilter</filter-class>
<init-param>
<param-name>allowIP</param-name>
<param-value>192.168.0.</param-value>
</init-param>
</filter>
 
<filter-mapping>
<filter-name>Allow Local Network Access</filter-name>
<url-pattern>/pages/manage/*</url-pattern>
</filter-mapping>

 
IpAddressFilter.java:

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class IpAddressFilter implements Filter {

private FilterConfig config;
private String allow_ip;

/**
* パスに対してアクセス制限を行う
*
*/
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
final String ip_address = ((HttpServletRequest) request).getRemoteAddr();

if (!ip_address.startsWith(allow_ip)) {
((HttpServletResponse) response).sendError(HttpServletResponse.SC_FORBIDDEN);
}
else {
chain.doFilter(request, response);
}
}

public final void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
this.allow_ip = config.getInitParameter(“allowIP”);
}

public final void destroy() {
this.config = null;
this.allow_ip = null;
}
}

その他参考:
– Java で Hello World
<http://www.hellohiro.com/filter.htm>

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

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

// 時間をミリ秒で返す
// (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のとき、優先順位が等しく実行準備のできた他のスレッドに処理を譲
る。該当するスレッドがない場合は即制御を返す。

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

バイナリエディタ

– 昔から PowerWitch The Royal というバイナリエディタを使っている。高機能でフリー。ただしもれなくバニーさんがついてくる。スクラッチパッド編集で使いたくなったので久しぶりにダウンロードしてみた。
<http://www.nx.sakura.ne.jp/~elysium/software/pwtr/>
– PowerWitch The Royal

Jarg, 7zip による Jar ファイルサイズ削減

– ここ <http://www.moreread.net/mario/Any/appli/memo.html?id=1> のソースを改変して一つのファイルで実行するようにしたもの。空白を含むパスに微妙に対応してある。DOJA エミュレータと同時に実行するとロックのために書き換えに失敗するのが難点。
– JavaBlender <http://homepage.mac.com/t.sekiguchi/javablender/index-j.html> を先に実行したらいいらしい。(Java Blender はクラス融合/パッケージ構造の平坦化などでプログラム自体のサイズ最適化を行う)

@echo off
REM ———————————————————-
REM = 使い方:
REM = optimize.bat “C:\path\to\jars\app.jar”
REM = 指定した jar のサイズを削減し、同じディレクトリにある同名
REM = の .jam のサイズ指定を書き換える。ドラッグ&ドロップ実行に
REM = 対応
REM ———————————————————-
REM = 下準備:
REM = ●jarg.jar <http://jarg.sourceforge.net/index.ja>を
REM = ダウンロードして、適当なところに配置。
REM = ●7zip <http://www.7-zip.org/> をインストールして
REM = 7za.exe にパスを通しておく。
REM ———————————————————-
REM = 設定
REM ———————————————————-
REM = クラスパス(DOJA 付属の zip 2つ)
set _CP=D:\Progra~1\Java\iDKDoJa4.0\lib\classes.zip;D:\Progra~1\Java\iDKDoJa4.0\lib\doja_classes.zip
REM = preverify.exe のパス(DOJA に付属)
set _PREVERIFY=D:\Program Files\Java\iDKDoJa4.0\bin\preverify.exe
REM = jarg.jar のパス
set _JARG=D:\Program Files\Java\tool\jarg\jarg.jar
REM ———————————————————–
if %1 == “” goto MES
set TARGET_F=%~f1
set TARGET_P=%~p1
set TARGET_SP=%~sp1
set TARGET_N=%~n1
mkdir %TARGET_P%bin
cd %TARGET_P%bin
mkdir temp
java -jar “%_JARG%” -nobco -j2me-prev “%_PREVERIFY%” -j2me-cp “%_CP%” “%TARGET_F%”
7za x %TARGET_SP%%TARGET_N%_s.jar -otemp -w -r -y > nul
REM del .\%TARGET_N%_s.jar

del “%TARGET_SP%%TARGET_N%_s.jar”
REM ! “%TARGET_F%”
cd temp
7za a -tzip “%TARGET_F%” * -mx=9 -mpass=4 -r -y > nul
cd ..
rd temp /s /q

type %TARGET_SP%%TARGET_N%.jam | find /v “AppSize” > %TARGET_SP%%TARGET_N%.tmp
type %TARGET_SP%%TARGET_N%.tmp > %TARGET_SP%%TARGET_N%.jam
echo AppSize = %~z1 >> %TARGET_SP%%TARGET_N%.jam
del %TARGET_SP%%TARGET_N%.tmp
cd %TARGET_P%
rd bin /s /q
exit /b
MES
echo optimize.bat [App.jar]
ERR
pause

JavaScript から画像の存在有無を調べる

– Image オブジェクトを使うとスマートにできる。Firefox1.0.4, IE6 で確認。

function existImage(sImageUrl){
    var img = new Image();
    img.src = sImageUrl;
    return img.height > 0; // 読み込みに失敗すれば 0 になる。
}
  
if(existImage(“http://www.google.co.jp/intl/ja_jp/images/logo.gif”)){
  alert(“存在します”);
}else{
  alert(“存在しません”);
}

 
追記(2009-08-18):
メモリークラフトさんの記事より、この方法はIE7以降では動作しないようです。代替実装はリンク先を参照してください。

ブラウザでページを操作

– ブラウザのアドレスバーを使った遊び。日本語テキストたっぷりなページでを開いた後、次のコードをアドレスバーにいれて実行すると文章を書き換える。

javascript:varelm=document.getElementsByTagName(“body”)[0];elm.innerHTML=elm.innerHTML.replace(newRegExp(“。”,”g”),”にゃ。”);

堅苦しい言葉がトロ語に。replace 使うと Firefox だと化けるなぁ.. split(“from”).join(“to”); としたほうがいいかも。

document.getElementsByTagName(“body”)[0].innerHTML;

これがキモ。DOM メソッドを使って Body タグの全文章を取得/操作する。

追記[2005-06-22]:

document.getElementsByTagName(“body”)[0]

は、

document.body

でも参照可能らしい。某所にあったコードのほうが汎用的で簡素みたい。

JavaScript:document.body.innerHTML=document.body.innerHTML.split(‘。’).join(‘にゃ。’);focus();

focus() しないと、実行後が別ページ扱いになって相対パスの外部ファイル(画像, js, css)の読み込みに失敗して見ためが崩れるみたい。