2013年3月28日木曜日
org.w3c.dom.Document の XML parse で Exception あるある
Double-Byteの文字が入っているXMLファイルをParseする際に良くある失敗
Invalid byte 1 of 1-byte UTF-8 sequence.
XMLにDouble-Byteが入っているなら、対応するEncodingを指定してあげましょう
上の例であれば、読み込み対象のXMLファイルのEncodingがUTF-8になっているはずなのでこれをShift-JISに変えます。
<?xml version="1.0" encoding="UTF-8"?>
-->
<?xml version="1.0" encoding="Shift-JIS"?>
そもそもDouble-Byteが入っているのにEncodingがUTF-8であるXMLファイルは、それ自体XMLファイルとしてFormatが成立していない訳なんですが、自分の場合は、強引にXMLファイルを作成するケースが多いので、なんども同じ過ちを繰り返してしまう。。。
あるよね~ (え?ないですか?)
2013年3月19日火曜日
Oracle Enterprise Manager (OracleDBConsole) がアクセスできない!?
背景:
ある日、突然 EM (Oracle Enterprise Manager) のWeb Consoleが使えなくなった
Internet Explorer ではこのページは表示できません
Windows Service "OracleDBConsole" は開始になってるし、%ORACLE_HOME%\sysman\log\emdb.nohupなどを確認しても問題なく動いているし。。。
でも、 https://hostname:1158/emにアクセスしようとすると、やっぱり
Internet Explorer ではこのページは表示できません
なんで?
やったこと:
いちおうセオリーに則って。。。
1.Windows ServiceからEM ("OracleDBConsole") の再起動 --> 復旧せず
2.EMの再生成 --> 復旧せず
- emca -deconfig dbcontrol db -repos drop
- emca -config dbcontrol db -repos create
create 途中で、「'job_queue_processes' must be greater than or equal to 1.」と怒られたので、alter system set job_queue_processes=1 scope=both; でjob_queue_processesを1にしてみる、そういえばこの前この値を変更したわぁ、きっとこれが原因に違いないと思ったが、結局 create後も現象は復旧せず
3. そもそもEM自体は問題なく動いてたわけだし、1. 2.ともに解決策になるわけもないことを確認する。「Internet Explorer ではこのページは表示できません」という現象を考察し直す。 サーバーサイドエラー(500系)ではないので、ブラウザ側の設定の問題かも知れないと思う(今更ですが。。。)
4. 試しにFireFoxでアクセスしてみる -->動いた!(ていうか、そもそも動いてたー!)
5. そういえばIEを8に上げていたんだった
6.IE設定の問題かと思うけど、FireFoxを使うからいいや、ということで、とりあえずおしまい。ここまでで 3時間を無駄にした
まとめ:
IEだとページがロードできなかったので、FireFoxを使うことにした。
IEのSSLやTLSあたりの設定が原因かと思うが、今回は特定はできず。
追って確認する、します。
原因解明:
原因が解明、Windows更新プログラムだったかー
暫定回避策を更新しました
2013年3月11日月曜日
@setlocal EnableDelayedExpansionの使い方
@setlocal EnableDelayedExpansionの使い方について
この設定が欲しくなるケースは恐らくその多くの場合、「For loop内で、loopが1巡する毎に異なる値を環境変数に設定したい時」だと思います。
以下説明は、「setlocal /?」と「cmd /?」のヘルプからの引用+自分なりに解釈した、環境変数と遅延環境変数の違いです(たぶん合ってる、間違っていたらすみません。。。)
と、いきなり言われても結局どう使えるの?
ということで、遅延環境変数の使用例です
手順:
C:\Temp\for>EnableDE.bat
Line:1 This is a sample file to be read
Line:2 by "for" statement in test.bat.
Line:3 Each line to be set as a value
Line:4 of the environment varialble,
Line:5 "!readline!" and shown
Line:6 by echo !readline!.
Line:7 This requires
Line:8 "@setlocal EnableDelayedExpansion"
Line:9 enables setting each line to
Line:10 !readline! variable
Line:11 *EVEN* that's set sometime in "for" loop
Line:12 As default, otherwise, setting
Line:13 several values in a "for" loop
Line:14 wasn't allowed.
(*1)EnableDE.bat
=========================================
@echo off
@setlocal EnableDelayedExpansion
set count=
for /f "delims=" %%s in (C:\temp\for\readFile.txt) do (
set /a COUNT+=1
set readline=%%s
echo Line^:!count! !readline!
)
(*2)readFile.txt
=========================================
This is a sample file to be read
by "for" statement in test.bat.
Each line to be set as a value
of the environment varialble,
"^!readline^!" and shown
by echo ^!readline^!.
This requires
"@setlocal EnableDelayedExpansion"
enables setting each line to
^!readline^! variable
*EVEN* that's set sometime in "for" loop
As default, otherwise, setting
several values in a "for" loop
wasn't allowed.
気になる方は、DisabledDE.batをC:\temp\forで実行してみください
(*3)DisabledDE.bat
=========================================
@echo off
set count=
for /f "delims=" %%s in (C:\temp\for\readFile.txt) do (
set /a COUNT+=1
set readline=%%s
echo Line^:%count% %readline%
)
はじめに:
EnableDelayedExpansionは遅延環境変数を使用可能にするオプションです。
この設定が欲しくなるケースは恐らくその多くの場合、「For loop内で、loopが1巡する毎に異なる値を環境変数に設定したい時」だと思います。
以下説明は、「setlocal /?」と「cmd /?」のヘルプからの引用+自分なりに解釈した、環境変数と遅延環境変数の違いです(たぶん合ってる、間違っていたらすみません。。。)
- 環境変数は区切り文字として % を使います (例:%var%)
- 遅延環境変数は区切り文字として ! を使います (例:!var!)
- 環境変数はforループ中に値を変更することができません。forループが完了してからループ中最後に代入された値が入ります(途中で代入された値は無視されます)。 同様にLoopに入る前にすでに環境変数に値が入っている場合はLoop中は常にその値が維持されます、そしてLoopが完了した時点でLoop中最後に代入された値が反映されます。
- 遅延環境変数はforループ中にsetで値を代入することができます。(<-- これが、いいですねー)
と、いきなり言われても結局どう使えるの?
ということで、遅延環境変数の使用例です
使用例:
ある複数行のテキストファイルがあり、For分で一行ずつ環境変数に読み込んでEchoでその環境変数を標準出力する。
手順:
- C:\temp\forというフォルダを作成
- EnableDE.bat(*1)をC:\temp\forに作成
- readFile.txt(*2)というファイルを準備(内容はなんでもいいんです)
- CMDを開いてC:\temp\forに移動(cdする)
- EnableDE.batを実行
C:\Temp\for>EnableDE.bat
Line:1 This is a sample file to be read
Line:2 by "for" statement in test.bat.
Line:3 Each line to be set as a value
Line:4 of the environment varialble,
Line:5 "!readline!" and shown
Line:6 by echo !readline!.
Line:7 This requires
Line:8 "@setlocal EnableDelayedExpansion"
Line:9 enables setting each line to
Line:10 !readline! variable
Line:11 *EVEN* that's set sometime in "for" loop
Line:12 As default, otherwise, setting
Line:13 several values in a "for" loop
Line:14 wasn't allowed.
(*1)EnableDE.bat
=========================================
@echo off
@setlocal EnableDelayedExpansion
set count=
for /f "delims=" %%s in (C:\temp\for\readFile.txt) do (
set /a COUNT+=1
set readline=%%s
echo Line^:!count! !readline!
)
(*2)readFile.txt
=========================================
This is a sample file to be read
by "for" statement in test.bat.
Each line to be set as a value
of the environment varialble,
"^!readline^!" and shown
by echo ^!readline^!.
This requires
"@setlocal EnableDelayedExpansion"
enables setting each line to
^!readline^! variable
*EVEN* that's set sometime in "for" loop
As default, otherwise, setting
several values in a "for" loop
wasn't allowed.
ちなみに:
一方で、環境変数を使った場合はForループ内で値は変更されないことが分かります
気になる方は、DisabledDE.batをC:\temp\forで実行してみください
(*3)DisabledDE.bat
=========================================
@echo off
set count=
for /f "delims=" %%s in (C:\temp\for\readFile.txt) do (
set /a COUNT+=1
set readline=%%s
echo Line^:%count% %readline%
)
FOR 変数参照の置換(%~) の可能性を探る旅
ファイルの取扱いで痒いところに手が届かないイメージのあるDOSですが、for /? のHelpを見ると、それなりに使えるオプションが揃っています。
今回は、FOR 変数参照の置換(%~) の可能性を探る旅と称して、「DOS for文のツアー」を準備してみました。
DOS窓からtreeで表示すると下記のような構成のフォルダになります
test用のフォルダの準備ができたら、そのDOSをそのまま使っても結構なのでecho offします(for文の標準出力がうっとうしいので)
そして以下のfor文を実行してみましょう
こんな結果が出たら旅の準備は完了です
はてさて、それぞれどんな結果になるでしょうか?
これまでを通して「FOR 変数参照の置換オプション」というツールを手に入れられたのではないでしょうか? (ついでにfsutilやtreeなどにも触れました。)
個人的には ~z のファイルのサイズを返すオプションが目玉だと思います。空ファイル(0kb)を判別する必要がある時などに重宝します。
そして、ここからが旅の本番です、行く先々で待ち受けているであろう「DOS故の痒いところ」は、もしかすると「FOR 変数参照の置換オプション」で、意外と簡単に乗り越えられるかもしれませんね
※今回の例ではFOR変数に I を使用しています、またコマンドラインで実行しているので 変数I に付ける % は一個です、.batで実行するような時は %%I としてください。 またFOR変数は I である必要はありません、aを使いたかったら%aでいいですし、その場合は %~za という感じで使ってください
最後に「FOR 変数参照の置換オプション」をリストしておきます。for /? からの抜粋です。
今回は、FOR 変数参照の置換(%~) の可能性を探る旅と称して、「DOS for文のツアー」を準備してみました。
旅準備:
test用のフォルダとファイルを準備します。 手作りでもいいですが、せっかくなので下の8行をコピーしてDOS窓にペーストして実行してみます。if not exist C:\temp\for (mkdir C:\temp\for) fsutil file createnew C:\temp\for\0kb.txt 0 fsutil file createnew C:\temp\for\1kb.txt 1024 fsutil file createnew C:\temp\for\10kb.txt 1024 if not exist C:\temp\for\sub (mkdir C:\temp\for\sub) fsutil file createnew C:\temp\for\sub\0kb.txt 0 fsutil file createnew C:\temp\for\sub\5kb.txt 5120 fsutil file createnew C:\temp\for\sub\50kb.txt 51200 |
DOS窓からtreeで表示すると下記のような構成のフォルダになります
> tree /F /A C:\temp\for C:\TEMP\FOR | 0kb.txt | 10kb.txt | 1kb.txt | \---sub 0kb.txt 50kb.txt 5kb.txt |
test用のフォルダの準備ができたら、そのDOSをそのまま使っても結構なのでecho offします(for文の標準出力がうっとうしいので)
echo off |
そして以下のfor文を実行してみましょう
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %I) |
こんな結果が出たら旅の準備は完了です
C:\temp\for\0kb.txt C:\temp\for\10kb.txt C:\temp\for\1kb.txt C:\temp\for\sub C:\temp\for\sub\0kb.txt C:\temp\for\sub\50kb.txt C:\temp\for\sub\5kb.txt |
いざ旅へ!:
さて、ここから旅の始まりです。「FOR 変数参照の置換オプション」を試してみましょう
はてさて、それぞれどんな結果になるでしょうか?
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~fI) for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~sI) for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~aI) for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~tI) for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~zI) for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~ftzaI) |
更なる旅へ!:
さて(うまく結果が出たとして)、今回の「DOS for文ツアー」はここで終わりです
これまでを通して「FOR 変数参照の置換オプション」というツールを手に入れられたのではないでしょうか? (ついでにfsutilやtreeなどにも触れました。)
個人的には ~z のファイルのサイズを返すオプションが目玉だと思います。空ファイル(0kb)を判別する必要がある時などに重宝します。
そして、ここからが旅の本番です、行く先々で待ち受けているであろう「DOS故の痒いところ」は、もしかすると「FOR 変数参照の置換オプション」で、意外と簡単に乗り越えられるかもしれませんね
※今回の例ではFOR変数に I を使用しています、またコマンドラインで実行しているので 変数I に付ける % は一個です、.batで実行するような時は %%I としてください。 またFOR変数は I である必要はありません、aを使いたかったら%aでいいですし、その場合は %~za という感じで使ってください
最後に「FOR 変数参照の置換オプション」をリストしておきます。for /? からの抜粋です。
=========================================================== %~I - すべての引用句 (") を削除して、%I を展開します。 %~fI - %I を完全修飾パス名に展開します。 %~dI - %I をドライブ文字だけに展開します。 %~pI - %I をパス名だけに展開します。 %~nI - %I をファイル名だけに展開します。 %~xI - %I をファイル拡張子だけに展開します。 %~sI - 展開されたパスは短い名前だけを含みます。 %~aI - %I をファイルの属性に展開します。 %~tI k- %I ファイルの日付/時刻に展開します。 %~zI - %I ファイルのサイズに展開します。 %~$PATH:I - PATH 環境変数に指定されているディレクトリを 検索し、最初に見つかった完全修飾名に %I を 展開します。 環境変数名が定義されていない場合、または検索 してもファイルが見つからなかった場合は、この 修飾子を指定すると空の文字列に展開されます。 修飾子を組み合わせて、複合結果を得ることもできます: %~dpI - %I をドライブ文字とパスだけに展開します。 %~nxI - %I をファイル名と拡張子だけに展開します。 %~fsI - %I を完全なパスと短い名前だけに展開します。 %~dp$PATH:I - PATH 環境変数に指定されているディレクトリを 検索して %I を探し、最初に見つかったファイル のドライブ文字とパスだけに展開します。 %~ftzaI - %I を DIR コマンドの出力行のように展開します。 =========================================================== |
登録:
投稿 (Atom)