以前購読していた某A新聞の販売所から、電話がありました。「またとって欲しい。商品券、ビール券、クォカード付けたうえで、安くするから。」ということです。
断りました。商品券売りに来たのかあんたは。少しは新聞の中身を売り込んでみなよ。
夕方、ちょっと涼しくなってきた頃にアキバへ。
あーあ、買っちゃった。
虎で購入したところ、おまけで袋がついてきました。オタクオタクした絵が描かれています。リサイクルマークも原材料表記も無いので材質は不明ですが、手触りと接合部等から、ポリプロピレンっぽいです。
A4サイズの本が入り、マチもそこそこあるので、これを持って有明を徘徊せよ、ということでしょうね。
バブルジェットプリンタの黒が出なくなってしまい、インクタンクを変えても駄目だったので、カートリッジごと交換です。高いんですよね、カートリッジ。なんでこんなプラスチックの箱が三千円もするんでしょう。
内径1.1mm。これなら大丈夫でしょう。
…またもやサイズ違い…これでも大きい…
ちょい待て。これより細いプラグなんてあるんですか?電子部品補修在庫画像一覧を見ると、どうやら内径0.7mmってのがうちのデジカメに使えそうですが、千石でも売ってないってことは、結構マイナーじゃないのかなぁ。
ちょっとしたロゴを作ってみました。微妙に使いどころに困る、そんなロゴです(意味なし)。
ついでに小さいバナーも作ってみました。
TDSのテンプレートとスケルトンを書き換えて、HTML 4.01 Transitional からXHTML 1.0 Strictに移行しました。結構面倒でした。
以下、改変記録。TDS は version 1.6.2 (Stable)を使用。
デフォルトではスケルトン中の</head>
の直前にメタタグが挿入されますが、これがHTML 仕様なので、 TDS::Skelton::MetaGeneratorTemplate *1 を template.ph で上書きします。
# スケルトン package TDS::Skelton; $MetaGeneratorTemplate = qq(<meta name="generator" content="Tomsoft Diary System/%version (%mode)" />\n);
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";
日記中の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を変更せずともアンカーとハイパーリンクの問題は解決するような気がします。
以上を踏まえ、通常コマンドもXHTML 仕様に適宜修正します。
こいつは骨が折れます。ソース書き換えは必至です。まず、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);
さらに…
XHTML のa要素のid属性とname属性は、それぞれ ID, NMTOKENです。どちらもパーセンテージ記号'%'は使用不可ですから、%encoded_term, %encoded_char はURI エスケープした文字列を含んではいけません。そこで、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);
以上。疲れたー。
dictionary.dat が更新されていないと、
static.pl -f -d
としても dictionary.html は更新されないですね。
VERBコマンドの引数まで辞書変換されてしまいます。ひどいや姉さん。
R-TYPE FINAL。プレイすればするほど、その出来に不満が蓄積されていく…開発陣、とりあえずそこへ直れ。
参考程度にR-TYPEΔをやってみました。
Δを初めてプレイしたときには微妙な違和感を感じたものです。しかし、あらためてプレイしてみると、敵の配置、難易度(バランスね)、パターン作りの面白さは、初代ほどではないにしろ、どれをとってもΔの方がR-TYPEっぽさを感じます。少なくとも、プレイ中に眠くなるようなことはないですね。
TDSのユーザメーリングリストで、過去にXHTML 対応について語られた形跡がありましたが、結局対応はされなかったようです。
一覧出力をXHTML に対応。template.ph 書き換えのみ。
上書き防止策は不要な気がしてきました。残しておいても害は無いと思いますが。
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";
使用していないので変更予定無し。というか、用語変換機能があればURL 置換機能は不要な気がします。
template.ph 書き換えで対応できそう。使ってないから関係ないけど。
TDSだけでWebサイト構築、なんていうのもいいかもしれません。鬱陶しいタグを連記しなくていいのですから、コンテンツを作るのが楽になるでしょうね。あ、でもスケルトンとかソースを作り直すのが大変かも。
カオスも混じってますね。アートですよ、これは。
ジュリア集合、マンデルブロ集合、ヒルベルト曲線、コッホ曲線、セルオートマトン、…。過去、フラクタル画像に手を出したことのある身としては、感動せずにはいられません。
また改造メモ。この辺の機能はTDS非公式かな?
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;
スケルトンに
<!--#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一発ですね。
"hoge"
と'hoge'
にマッチして、"hoge'
と'hoge"
にはマッチしないperl正規表現。
(["'])(.*?)\1
C言語みたいに
\
でエスケープしたものを弾く場合。
(["'])(.*?)(?<!\\)\1
これだと
\
記号のエスケープが直前にあるとまずいわけで、"foo\\"
がマッチしなくなっちゃいます。"foo\"\\\'\\\\\\\\"
みたいなケースを考えたら、オートマトンで処理したほうがいいかも。
よく降りますねぇ。
目次作成部が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;
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
文書の論理構造、という視点から見た場合、HTML のHR要素やBR要素って、何の意味もないように思えます。
雨が降ってるのでパス。
MBlast っていうんですか、「ブラスター」とか「ラブサン」とか言われているワーム。ずいぶん世間を賑わせているようですね。ZDNet news の記事にもあるように、12日以降、tcp:135 から/へのアクセスが急増しているようです。
ちょっと気になったので、うちのファイアウォールのアクセスログを見てみました。すると、あるわあるわ。確かに12日を境に、急激に増えています(全部叩き落してますが)。以前からも tcp:135, tcp:139. udp:137 への攻撃はよくあったんですが、ここまで多いとは。世間様の夏休みが明けたら、もっと増えるんでしょうかねぇ。
今まで書いてきたHTML を、tdf形式に変換してみました。全て手作業は嫌なので、ある程度はコンバータでやることに。
しかし、HTML → tdf → XHTML って、何だかなぁ。
CAPTION コマンドを追加しました。
type = inline template = <caption> end_template = </caption>\n has_arg_content 1 is_oneline 1
allow_child = TR, CAPTION
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 って、デフォルトだとどこからも参照されてないんですよね。上書き防止策も、この変数にだけ施されてません。無効にされるとまずい事情でもあるのかなぁ…
TDSをXHTMLに対応させるための文書を書いていました。日記のまとめです。校正が終わり次第、晒しましょう。
サイトのコンテンツを、XHTMLベースからTDSベースへと移行しました。内容、文法等をチェックしてから反映させます。
XHTML変換とサイトへの反映を楽に行いたいので、Makefileを書きました。久しぶりに書いたので、書式をすっかり忘れています。Apacheなど、他のソフトにあるMakefileを見て、思い出しながらなんとか。
誰かアニメ化しませんか?(無理)
三日連続で雨ですね。珍しいかも。
なんだかんだで1万以上使ってしまいました。でも「コミック」は1冊しか買ってないですね。しかも「ごめんなさい価格」で100円。金額的コミック率1%以下。
ターゲットはきっちり確保。某氏はマルチのコスプレしてました。
東方妖々夢 を買いに行ったら、結構並んでました。最後尾はどこかなーと列を辿っていくと、一直線に肉客が並んでいるのが見えます。末端がなかなか見えてきません。50メートルくらい歩きましたかねぇ。いつの間に大手に?
当然、私も50メートル並んだわけです。初めて「最後尾ボード」持ちましたよ。ちょっぴり感動しました。今まで大手サークルには並んだことがなかったですからね。
しかし、さらに凄いのが黄昏フロンティアでした。さすがにアレは並ぶ気がしません。いったいあの列は、何回折り返してるんでしょうか。並んでるうちに完売してしまいそうです。
早速プレイ。難易度はノーマル。咲夜でどうにかノーコンティニュークリアしました。でもグッドエンディングではないです(ボム使いすぎ)。
三面までは体験版で何度もやっていたので楽勝でしたが、四面以降はさすがに凄い弾幕。下からも飛んでくるし。隙間、無いし。いや、確かによく見れば隙間はあるんですが、そんなのをかわし続ける気力がそう長く続くわけもなく。
これでも難易度ノーマルなんですよね…はぁ。ルナティックはどうなっちゃうんでしょ。
せっかくだから、エキストラをプレイしました。こちらは予想通り、常人が手を出せるレベルではないことだけがわかりました。達成率わずか30%。シクシク…
ヘタレシューターはイージーでもやってなさいってことです。
金田一春彦によると、日本語で「みゅ」という発音が現われる唯一の単語 (外来語を除く) だそうだ。
東京ミュウミュウ(違)
Opera7.1もMozilla1.3もIE5.5も、フォント周りがいまいちですね。いや、Operaはいまいちと言うより、滅茶苦茶。
8月18日午後より、ネットワーク上で大量のICMP Echo Reqestが観測されている。
例によってログを見てみると、本当に増えてました。ICMP Echo Request だらけです。逆に、tcp:135 はほとんどなくなっています。
どちらが増えても、鬱陶しいことには変わりないですね。
日替わりスタイルってのも面白いかも。
echo "${RANDOM} % 100" | bc