日記

8月 10日 (日)

1. 新聞

以前購読していた某A新聞の販売所から、電話がありました。「またとって欲しい。商品券、ビール券、クォカード付けたうえで、安くするから。」ということです。

断りました。商品券売りに来たのかあんたは。少しは新聞の中身を売り込んでみなよ。

2. アキバ

夕方、ちょっと涼しくなってきた頃にアキバへ。

2.1. C64カタログ

あーあ、買っちゃった。

虎で購入したところ、おまけで袋がついてきました。オタクオタクした絵が描かれています。リサイクルマークも原材料表記も無いので材質は不明ですが、手触りと接合部等から、ポリプロピレンっぽいです。

A4サイズの本が入り、マチもそこそこあるので、これを持って有明を徘徊せよ、ということでしょうね。

2.2. カートリッジ

バブルジェットプリンタの黒が出なくなってしまい、インクタンクを変えても駄目だったので、カートリッジごと交換です。高いんですよね、カートリッジ。なんでこんなプラスチックの箱が三千円もするんでしょう。

2.3. DCプラグ

内径1.1mm。これなら大丈夫でしょう。

3. DCプラグ

…またもやサイズ違い…これでも大きい…

ちょい待て。これより細いプラグなんてあるんですか?電子部品補修在庫画像一覧を見ると、どうやら内径0.7mmってのがうちのデジカメに使えそうですが、千石でも売ってないってことは、結構マイナーじゃないのかなぁ。

4. ロゴ

ちょっとしたロゴを作ってみました。微妙に使いどころに困る、そんなロゴです(意味なし)。

ついでに小さいバナーも作ってみました。

8月 11日 (月)

1. TDS

TDSのテンプレートとスケルトンを書き換えて、HTML 4.01 Transitional からXHTML 1.0 Strictに移行しました。結構面倒でした。

以下、改変記録。TDS は version 1.6.2 (Stable)を使用。

1.1. 終了タグ

デフォルトではスケルトン中の</head>の直前にメタタグが挿入されますが、これがHTML 仕様なので、 TDS::Skelton::MetaGeneratorTemplate *1 を template.ph で上書きします。

# スケルトン
package TDS::Skelton;
$MetaGeneratorTemplate =
  qq(<meta name="generator" content="Tomsoft Diary System/%version (%mode)" />\n);

1.2. アンカー

XHTML 1.0 では、a要素にid属性とname属性があり、片方のみを記述するのは好ましくありません。使用する場合はタグに両方記述し、その値は同じでなければなりません。また、XHTML 1.1 では、a要素にname属性はありません。つまり、アンカーとして使用する場合はid属性は必須です。

TDSのデフォルト設定では、name属性やURI フラグメント部に展開される%anchor パラメータは、%0dで始まっているので、展開後の%anchor パラメータは、数字で開始されることになります。

XHTML のid属性は、英字で始まらなければいけませんから、数字で始まる%anchor をそのまま使用してはいけません。template.ph 中のパッケージごとに、$Anchor を上書きし、必ず英字で始まるように修正します。

package TDS::Tdf::Command::NEW;
$Anchor = "r%0d-%new";

1.3. カレンダー中のハイパーリンク

日記中のid属性値生成ルールが変更されたため、カレンダー中のhref属性値も修正しなければなりませんが、lib/TDS/Calendar.pmを見たところ、どうも外部から指定するのは無理っぽいです。

そこで、カレンダー部だけはソースを直接修正することにしました。lib/TDS/DiaryLink.pmの54行目から。

# anchor template
$AnchorTemplates{'DAY'} = '%0d';
$AnchorTemplates{'TOPIC'} = '%0d-%new';
$AnchorTemplates{'SUBTOPIC'} = '%0d-%new-%sub';
$AnchorTemplates{'FN'} = $AnchorTemplates{'TOPIC'} . "-F%fn";
# anchor template
my $AnchorTemplatePrefix = 'r';
$AnchorTemplates{'DAY'} = $AnchorTemplatePrefix . '%0d';
$AnchorTemplates{'TOPIC'} = $AnchorTemplatePrefix . '%0d-%new';
$AnchorTemplates{'SUBTOPIC'} = $AnchorTemplatePrefix . '%0d-%new-%sub';
$AnchorTemplates{'FN'} = $AnchorTemplates{'TOPIC'} . "-F%fn";

よく考えたら、この部分を変更するだけで、template.phを変更せずともアンカーとハイパーリンクの問題は解決するような気がします。

1.4. コマンド

以上を踏まえ、通常コマンドもXHTML 仕様に適宜修正します。

  • lib/TDS/Tdf/commands/ANCHOR.def(name属性とid属性)
  • lib/TDS/Tdf/commands/BR.def(終了タグ修正)
  • lib/TDS/Tdf/commands/HR.def(終了タグ修正)
  • lib/TDS/Tdf/Command/IMG.pm(終了タグ修正、align関連を削除)

1.5. 辞書 - 外部制御

こいつは骨が折れます。ソース書き換えは必至です。まず、lib/TDS/List/Dictionary.pmを編集します。

6行目、変数$EndTemplate を追加。

use vars qw(@ISA
    $EndTemplate 
    $LineTemplate $ContentTemplate
    $IndexSeparator $IndexTemplate $IndexTemplateNonExist
    $SkeltonFilename $CacheFilename $DataFilename
    @row);

23行目から変数設定。各変数にunless defined で上書き防止策を施します。

# temlate for HTMLize
$LineTemplate = qq(<hr><h2><a name="_%encoded_char">%char</a></h2>)
  unless defined $LineTemplate;
# $ContentTemplate is used for old format, this will be obsoluted.
$ContentTemplate = qq(<h3><a href="#%encoded_term" name="%encoded_term">%term</a>
  [%yomi]</h3><div style="margin-left: 2em">%explain</div>\n)
  unless defined $ContentTemplate;
$EndTemplate = qq(\n) unless defined $EndTemplate; # new var.
# (中略)
$IndexTemplate = qq(<a href="\#%encoded_char">%char</a>)
   unless defined $IndexTemplate;
$IndexTemplateNonExist = qq(%char)
   unless defined $IndexTemplateNonExist

128行目の最後で$EndTemplate を文字列結合(Expandした方がいいような気がする)。

$html .= Expand($LineTemplate,
     {char=>$row[$i][0],
       encoded_char=>UrlEncode($row[$i][0])
     }) .
     $line_html . $EndTemplate;

144行目に

$html .= $EndTemplate;

を挿入。191行目がHTML 仕様なので

return "$line_ja<br />$line_en";

に変更。

あとはtemplate.phをゴニョゴニョします。id, nameが英字以外で始まらないように注意。

# 辞書
package TDS::Tdf::Command::WORD;
$Template = qq(<h3><a href="#%encoded_term" id="%encoded_term" name="%encoded_term">%term
</a>%pronounce</h3><div class="dh3">\n);
$EndTemplate = qq(</div><!--3-->\n);
$IndexTemplate = qq(<a href="\#%encoded_char">%char</a>);
$IndexTemplateNonExist = qq(%char);

# 発音
package TDS::Tdf::Command::PRONOUNCE;
$Template = " [";
$EndTemplate = "]";

# 辞書見出し
package TDS::List::Dictionary;
$LineTemplate = qq(<h2><a id="%encoded_char" name="%encoded_char">%char
</a></h2><div class="dh2">\n);
$EndTemplate = qq(</div><!--2-->\n);

さらに…

1.6. 辞書 - URIエスケープ

XHTML のa要素のid属性とname属性は、それぞれ ID, NMTOKENです。どちらもパーセンテージ記号'%'は使用不可ですから、%encoded_term, %encoded_charURI エスケープした文字列を含んではいけません。そこで、URI エスケープ関数に手を加えます。lib/TDS/CGI/Tools.pmの 58行目、UrlEncode 関数に引数を追加し、 '%'を'_'に置換 *2 できるようにします。

sub UrlEncode {
  my($toencode, $more) = @_;
  $toencode=~s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
  if ($more) {
    $toencode =~ s/\%/_/g;
    $toencode = 'ID:' . $toencode;
  }
  return $toencode;
}

これに伴って、URI エスケープしている個所で辞書に関係する部分を修正します。

lib/TDS/List/Dictionary.pmの130行目と177行目。

encoded_char=>UrlEncode($row[$i][0], 1)
{encoded_char=>UrlEncode($char, 1),

lib/TDS/Replacer/Dictionary.pmの 154行目。

$encoded_term = UrlEncode($term, 1);

lib/TDS/Tdf/Command/Dictionary.pmの 21行目。

$params->{encoded_term} = $self->{anchor_name} ?
  UrlEncode($self->{anchor_name}, 1) :
  UrlEncode($self->{ext_attrs}, 1);

以上。疲れたー。

1.7. 辞書って…

dictionary.dat が更新されていないと、

static.pl -f -d

としても dictionary.html は更新されないですね。

1.8. 辞書って…さぁ…

VERBコマンドの引数まで辞書変換されてしまいます。ひどいや姉さん。

  • *1: 正しくは'Skeleton'ですよね、これ。
  • *2: 無論、アンダースコアである必要は無いのです。

8月 12日 (火)

1. R

R-TYPE FINAL。プレイすればするほど、その出来に不満が蓄積されていく…開発陣、とりあえずそこへ直れ。

1.1. Δ

参考程度にR-TYPEΔをやってみました。

Δを初めてプレイしたときには微妙な違和感を感じたものです。しかし、あらためてプレイしてみると、敵の配置、難易度(バランスね)、パターン作りの面白さは、初代ほどではないにしろ、どれをとってもΔの方がR-TYPEっぽさを感じます。少なくとも、プレイ中に眠くなるようなことはないですね。

2. TDS

2.1. XHTML

TDSのユーザメーリングリストで、過去にXHTML 対応について語られた形跡がありましたが、結局対応はされなかったようです。

2.2. summary

一覧出力をXHTML に対応。template.ph 書き換えのみ。

2.3. override

上書き防止策は不要な気がしてきました。残しておいても害は無いと思いますが。

2.4. dictionary index

lib/TDS/List/Dictionary.pm の修正で、191行目でタグをベタ書きしていた部分を、変数参照にしました。これで template.ph からカスタマイズ可能。

use vars qw(@ISA
  $EndTemplate $IndexJaEnSeparator
$IndexJaEnSeparator = '<br>'
  unless defined $IndexJaEnSeparator;
return "$line_ja$IndexJaEnSeparator$line_en";

2.5. URL置換機能

使用していないので変更予定無し。というか、用語変換機能があればURL 置換機能は不要な気がします。

2.6. PIM機能

template.ph 書き換えで対応できそう。使ってないから関係ないけど。

2.7. only TDS

TDSだけでWebサイト構築、なんていうのもいいかもしれません。鬱陶しいタグを連記しなくていいのですから、コンテンツを作るのが楽になるでしょうね。あ、でもスケルトンとかソースを作り直すのが大変かも。

8月 13日 (水)

1. 投稿フラクタル画像(?)

カオスも混じってますね。アートですよ、これは。

ジュリア集合、マンデルブロ集合、ヒルベルト曲線、コッホ曲線、セルオートマトン、…。過去、フラクタル画像に手を出したことのある身としては、感動せずにはいられません。

2. TDSでWebページ作成

また改造メモ。この辺の機能はTDS非公式かな?

2.1. 準備

tds_dir/doc/tnf2html.pl を適当な場所にコピーし、1行目と7行目を適切に変更します。7行目はカレントと web_diary_dir/lib に通れば良いです。

#!/usr/bin/perl
################################################################
# tdf2html.pl

use strict;
#use lib qw(. d:/tom/www/tawagoto/lib);
use lib qw(. ./lib);

目次機能を使う場合は、web_diary_dir/lib/TableOfContents.pm にunless definedで変数上書き防止策を施しておいた方が良いでしょう。

$BeginTemplate = qq(<ol>\n) unless defined $BeginTemplate;
$EndTemplate = qq(</ol>\n) unless defined $EndTemplate;
$BeginContentTemplate = qq(<li><a href="\#%counter">%content</a>\n)
  unless defined $BeginContentTemplate;
$EndContentTemplate = qq(</li>\n)
  unless defined $EndContentTemplate;

2.2. 使用

スケルトンに

<!--#macro cmd="TOC" -->

と記述すると、その場所に目次が作成されます。 "TOC""TableOfContents"でもいけるようです。

template.ph で見出しと目次を設定します。このテンプレートは、日記で使っているものと同じで良いでしょう。別にすると後で面倒になります。

ちなみに、日記中では目次機能は使えません。

package TDS::Tdf::Command::HD;
$Template = qq(<h%1 id="h%hd_counter">%hd_counter );
$EndTemplate = qq(</h%1>\n);
$TopTemplate = qq(<div class="dh%1">\n);
$BottomTemplate = qq(</div><!--%1-->\n);
package TableOfContents;
$BeginTemplate = qq(<ol>\n);
$EndTemplate = qq(</ol>\n);
$BeginContentTemplate = qq(<li><a href="\#h%counter">%content</a>\n);
$EndContentTemplate = qq(</li>\n);

使い方は tds_dir/doc/Makefile を見ればなんとなくわかります。日記のものとは別にスケルトンを作成し、tdf2htmlを実行します。スケルトンは指定しないといけませんが、 template.ph, dictionary.dat, term.datは日記の設定から勝手に探しに行くようです。

./tdf2html.pl -s MY_SKELETON.html SAMPLE.tdf > SAMPLE.html

みたいな。tds_dir/doc/ 下の .tdf ファイルがいいサンプルになります。

makefile さえ書いてしまえば、あとはtdfを更新するだけです。まさにmake一発ですね。

3. regexp

"hoge"'hoge'にマッチして、"hoge''hoge"にはマッチしないperl正規表現。

(["'])(.*?)\1

C言語みたいに \でエスケープしたものを弾く場合。

(["'])(.*?)(?<!\\)\1

これだと \記号のエスケープが直前にあるとまずいわけで、"foo\\"がマッチしなくなっちゃいます。"foo\"\\\'\\\\\\\\"みたいなケースを考えたら、オートマトンで処理したほうがいいかも。

8月 14日 (木)

1. 雨

よく降りますねぇ。

2. TDSでWebページ

2.1. 目次

目次作成部がXHTML に対応していないことに気付きました。web_diary_dir/lib/TableOfContents.pm を修正。 sub AsHTML() の最後は、

$html .= $EndContentTemplate;
for (2..$last_level-1){     # complete end tags
  $html .= "$EndContentTemplate$EndTemplate";
}
$html .= $EndTemplate;

としておかないと、ネストがきちんと閉じられないケースがあります。HTML 4 なら終了タグを省略できるので、問題は無かったのですが。

…ん? 1行にまとめると、こうなる?

$html .= $EndContentTemplate .
  ("$EndContentTemplate$EndTemplate" x ($last_level - 2)) .
  $EndTemplate;

2.2. DIVn

ISO/IEC 15445:2000 Preparation 風に書きたいので、DIVH.def を追加。

type = block
num_attr = 1
template = <div class="dh%1" %ext_attrs>\n
end_template = </div>\n
allow_child = %Flow

3. HTML

文書の論理構造、という視点から見た場合、HTML のHR要素やBR要素って、何の意味もないように思えます。

8月 15日 (金)

1. C64-1

雨が降ってるのでパス。

2. らぶさん

MBlast っていうんですか、「ブラスター」とか「ラブサン」とか言われているワーム。ずいぶん世間を賑わせているようですね。ZDNet news の記事にもあるように、12日以降、tcp:135 から/へのアクセスが急増しているようです。

ちょっと気になったので、うちのファイアウォールのアクセスログを見てみました。すると、あるわあるわ。確かに12日を境に、急激に増えています(全部叩き落してますが)。以前からも tcp:135, tcp:139. udp:137 への攻撃はよくあったんですが、ここまで多いとは。世間様の夏休みが明けたら、もっと増えるんでしょうかねぇ。

3. TDS

3.1. 移行

今まで書いてきたHTML を、tdf形式に変換してみました。全て手作業は嫌なので、ある程度はコンバータでやることに。

しかし、HTML → tdf → XHTML って、何だかなぁ。

3.2. table

CAPTION コマンドを追加しました。

type = inline
template = <caption>
end_template = </caption>\n
has_arg_content 1
is_oneline 1
allow_child = TR, CAPTION

3.3. 勝手に<p>

TDSでは、デフォルトでブロック要素の内側と、インライン要素の外側に、P要素が埋め込まれるようになっています。CAPTIONなんかも、

<table>
<p>
<caption>キャプション</caption>
</p>

と展開されてイヤンな感じです。この「自動P」機能を無効化するため、lib/TDS/Tdf/Parser.pm の66行目と、305〜312行目を変更します。

$AutoParagraphComplete = 1 unless defined $AutoParagraphComplete;
  if ($AutoParagraphComplete) {
#    print "$pos_name - $cmd_name, ";
#    print "P inserted<br>";
#     $pos->InsertCommand("P");
    $pos = $self->top->InsertCommand("P");
    # pos is changed
    $self->top->{'pos'} = $pos;
    $pos_name = $pos->Name;
    $allowed = "TDS::Tdf::Command::P::Allowed";
  }
package TDS::Tdf::Parser;
$AutoParagraphComplete = 0;

「自動P」制御フラグの$AutoParagraphComplete って、デフォルトだとどこからも参照されてないんですよね。上書き防止策も、この変数にだけ施されてません。無効にされるとまずい事情でもあるのかなぁ…

8月 16日 (土)

1. TDS

TDSをXHTMLに対応させるための文書を書いていました。日記のまとめです。校正が終わり次第、晒しましょう。

2. TDS移行

サイトのコンテンツを、XHTMLベースからTDSベースへと移行しました。内容、文法等をチェックしてから反映させます。

XHTML変換とサイトへの反映を楽に行いたいので、Makefileを書きました。久しぶりに書いたので、書式をすっかり忘れています。Apacheなど、他のソフトにあるMakefileを見て、思い出しながらなんとか。

3. レオタード戦士ルン

誰かアニメ化しませんか?(無理)

8月 17日 (日)

1. オタク祭り

三日連続で雨ですね。珍しいかも。

1.1. 買い物

なんだかんだで1万以上使ってしまいました。でも「コミック」は1冊しか買ってないですね。しかも「ごめんなさい価格」で100円。金額的コミック率1%以下。

ターゲットはきっちり確保。某氏はマルチのコスプレしてました。

1.2. はじめての最後尾

東方妖々夢 を買いに行ったら、結構並んでました。最後尾はどこかなーと列を辿っていくと、一直線に客が並んでいるのが見えます。末端がなかなか見えてきません。50メートルくらい歩きましたかねぇ。いつの間に大手に?

当然、私も50メートル並んだわけです。初めて「最後尾ボード」持ちましたよ。ちょっぴり感動しました。今まで大手サークルには並んだことがなかったですからね。

しかし、さらに凄いのが黄昏フロンティアでした。さすがにアレは並ぶ気がしません。いったいあの列は、何回折り返してるんでしょうか。並んでるうちに完売してしまいそうです。

2. enqueue

  • 夏の魔術
  • 地を這う虫
  • 侠骨記 *1

また買ってしまった…

しばらく古本屋に行くのは控えましょう。

  • *1: 「侠」:JIS第一、第二水準にない字なので当て字

3. 東方妖々夢

3.1. normal

早速プレイ。難易度はノーマル。咲夜でどうにかノーコンティニュークリアしました。でもグッドエンディングではないです(ボム使いすぎ)。

三面までは体験版で何度もやっていたので楽勝でしたが、四面以降はさすがに凄い弾幕。下からも飛んでくるし。隙間、無いし。いや、確かによく見れば隙間はあるんですが、そんなのをかわし続ける気力がそう長く続くわけもなく。

これでも難易度ノーマルなんですよね…はぁ。ルナティックはどうなっちゃうんでしょ。

3.2. extra

せっかくだから、エキストラをプレイしました。こちらは予想通り、常人が手を出せるレベルではないことだけがわかりました。達成率わずか30%。シクシク…

3.3. 結論

ヘタレシューターはイージーでもやってなさいってことです。

8月 18日 (月)

1. 大豆生田(おおまみゅうだ)

金田一春彦によると、日本語で「みゅ」という発音が現われる唯一の単語 (外来語を除く) だそうだ。

東京ミュウミュウ(違)

2. CSS font-family 悪戦苦闘

Opera7.1もMozilla1.3もIE5.5も、フォント周りがいまいちですね。いや、Operaはいまいちと言うより、滅茶苦茶。

8月 19日 (火)

1. 新ワーム

8月18日午後より、ネットワーク上で大量のICMP Echo Reqestが観測されている。

例によってログを見てみると、本当に増えてました。ICMP Echo Request だらけです。逆に、tcp:135 はほとんどなくなっています。

どちらが増えても、鬱陶しいことには変わりないですね。

2. 企み

日替わりスタイルってのも面白いかも。

3. bashで乱数

echo "${RANDOM} % 100" | bc