Apacheのログのサイズが極めて小さい時に,

XML パースエラー: 整形式になっていません
URL: http://www.flightless-wing.com/anlgform.pl
行番号: 257, 列番号: 48:
<br /><span class="runtimetitle">処理時間:</span> <1 秒.

このようなエラーがでて困った事はありませんか?
PortsのAnalogをビルドしなおしてこの問題を解決してみます.

何が原因か

anlgform.plの吐くXMLのソース中のエラーが出た行を見てみると,

<br /><span class="runtimetitle">処理時間:</span> <1 秒.~

となっています.<1 秒の "<"に問題がありそうです.
1秒未満の処理時間の時,"<"の代わりに"&lt"を出力するようにしましょう.

ソースコードを読む

興味なければ飛ばしてOKです.
まずは「/usr/ports/www/analog/work/analog-6.0/src」に移ってください.
Analogのソースがごろごろしています.
この中からエラーの行を出力している部分を探すので,試しに"runtimetitle"で検索してみましょう.

www# grep runtimetitle *
outxhtml.c:    fprintf(outf, ".%sruntimetitle {\n\tfont-weight: bold;\n}\n",
outxhtml.c:  fprintf(outf, "<br /><span class=\"%sruntimetitle\">%s:</span> ",
Binary file outxhtml.o matches
www#

見つかりました.outxhtml.cの下の方が目的の部分のようですね.
その部分の関数(202行目から)を抜き出してみました.

/* The program run time */
void xhtml_runtime(FILE *outf, Outchoices *od, long secs) {
  char **lngstr = od->lngstr;

  fprintf(outf, "<br /><span class=\"%sruntimetitle\">%s:</span> ",
          od->cssprefix, lngstr[runtime_]);

  if (secs == 0)
    fprintf(outf, "%s %s.\n", lngstr[lessone_], lngstr[second_]);
  else if (secs < 60)
    fprintf(outf, "%ld %s.\n", secs,
            (secs == 1)?lngstr[second_]:lngstr[seconds_]);
  else
    fprintf(outf, "%ld %s, %ld %s.\n", secs / 60,
            (secs < 120)?lngstr[minute_]:lngstr[minutes_], secs % 60,
            (secs % 60 == 1)?lngstr[second_]:lngstr[seconds_]);
}

1秒未満の時の表示を修正したいのですが,どこを直せばよいのでしょうか?
変数名から想像すると,「secs == 0」0秒(もちろん1秒未満)で条件分けしてある

 if (secs == 0)
   fprintf(outf, "%s %s.\n", lngstr[lessone_], lngstr[second_]);

があやしいですね.
名前から想像すると,lngstr[second_]にはsecondを意味する単語(日本語では秒)が入っていて,
(elseブロックには複数形のseconds_があって面白い^^ 英語も大変ですね)
lngstr[lessone_]に問題の1秒未満の時の数値部(<1)が入っているようですね.
このlngstrには添え字に対応する意味の言葉が入っているみたいですね.
この配列にどこで値が入れられているかを調べるのも良いですが,
langディレクトリに言語ごとの設定が置いてあるので,それをいじくる事にしましょう.

修正する

.lngファイルをいじる

まずは本当に"<1"という文字列がlangディレクトリの中のファイルで定義されているのか調べます.

www# pwd
/usr/ports/www/analog/work/analog-6.0/lang
www# grep \<1 *
jpe.lng:<1
jpj.lng:<1
jps.lng:<1
jpu.lng:<1
www#

ありますね.これらの.lngファイルの289行目付近の1<を&lt:書き換えてやればOKです.
また,jpe,jpj,jps,jpuのそれぞれのファイルは,EUC-JP,JIS,Shift-JIS,UTF-8に対応していると思われますので,
自分の環境に合わせた物だけを修正すれば大丈夫です.(多くの場合jpeだけ)

ビルドしなおす

編集を終えたらAnalogをビルドしなおします.
analog-6.0ディレクトリに移ってmakeコマンドを実行してください.

www# pwd
/usr/ports/www/analog/work/analog-6.0
www# make
...色々

makeが無事終わったら,analogディレクトリに移ってdeinstall,reinstallをしてください.

www# pwd
/usr/ports/www/analog
www#deinstall
...色々
www#reinstall
...色々

これで処理時間が1秒未満でも正しく動くはずです.

コメント


お名前: