日記

8月 2日 (土)

1. text-to-speech

語学司令部で、biheartという、入力したテキストを読み上げるソフトが公開されています。日本語もOKなんですが、音読みと訓読みを高確率で正しく使い分けてくるので、かなり驚きました。

2. 検索文字列

検索サイトで検索した結果、うちのページがヒットし、そこからうちのサイトに飛んでくることがあります。時々面白い単語で検索してくる人がいるので、HTTP Refererが残るapacheのログチェックは欠かせません。

ただ、日本語文字の場合はURIエスケープされてますし、文字のエンコーディング方法が予めわかっていないと、正しく復元できません。それに、私は目視でURIアンエスケープ、文字デコードできるほど器用ではありません。

そこで、Perlで検索文字列抽出ツールを作ってみました *1 。単純に、HTTP RefererのURIドメイン部から検索エンジンを推測し、URIパラメータからエンコーディング方法と検索文字列を取得するだけです。検索エンジンによって文字エンコーディング方法が違っているので、Jcode.pmは必須です。

さて、どんな結果がでますかねぇ。

  • *1: そういう解析ツール、どこかにありそうな気がしますけど。

3. 調査

エロゲー会社のトップページについて調査いたしました。

わざわざ調査するようなことですか。

4. White Requiem

かなり丁寧に作られています。

8月 3日 (日)

1. 改装

ちょくちょくとサイトをリニューアルしています。以前書いたHTMLCSSが相当酷いので、苦労しています。

2. ○ー○ー○ー○

TVオンエア? 実写? 正気?

3. 朝日新聞のデタラメHTML入門に対する抗議

朝日新聞の土曜別刷り版「be」のHTML入門記事の件です。これ、各地で叩かれていますね。

朝日新聞のコンピュータや情報(いわゆる'IT')関連の記事は、読むに耐えないものが多いので、お笑いネタにしか見えません。

8月 5日 (火)

1. 超連射68Kサントラ再販

コミックマーケット64

8月17日、東6・ヌ-02b

「 有限会社るざりん 」にて一挙大大大公開!!

頒布価格は、2,000円(税込)!

なんとっ!

今回は参加しない予定なんですが…通販もやるみたいだしなぁ…

でも、何かの間違いで完売なんぞしてしまったときは……

巫女み●ナース、アカペラで熱唱してやるさ!!

しかも、ようやく果たす事の出来る約束……

そう、マ●チの格好でな!!!

…一般参加が確定しました(爆)

買います!売上に貢献します!

つーか、私はこの作品のためだけに、有明に出向くのでしょうか?いや、まぁ、目的さえあれば逝きますけどね…

2. XML

通信用語の基礎知識の辞書ファイルを、XML化する実験開始。XSLTしてHTMLにすれば、閲覧も可能。見栄えは当然CSSで。

単語単位では何とかなりそうです。あとは、辞書、辞書グループ単位でのグルーピングと、単語IDの生成方法の確立ですかね。

ああ、変換プログラム作らないといかんなあ。

8月 6日 (水)

1. フリーズ

R-TYPE FINAL。エンディング終了後、フリーズしました。今回で2度目です。R-13系を使うとフリーズしやすいという話です。

これで俺的評価がさらに下降。恒常的な処理落ちに加え、作りこみの甘さ、R-TYPEΔでも言われていた当たり判定・食らい判定のわかり難さが改善されていないなど、もはや駄目ゲーと呼んでも差し支えないかも。

Thunder Force V の爪の垢でも煎じて飲んで下さいな、アイレムさん。

8月 7日 (木)

1. 猫

朝、ベランダから外を見ると、向かいの塀の上にいる灰色の猫と目が合いました。黄緑色の目で、じーっとこっちを見ています。というか、睨んでません?

何だか不気味な猫でした。

2. 声

最近、夜になると、外から奇妙な声が聞こえてくることがあります。聞こえ始めは赤ん坊の泣き声っぽいのですが、よく聞いてみると、どうも人間の声ではないようです。家の中にいると多少変質して聞こえるのですが、猫の鳴き声のようにも聞こえます。

いや、仮に猫だとすると、「鳴き声」なんてかわいいものではなく、うめき声というか、叫び声というか。B級オカルト映画に出てきそうな化け猫の鳴き声のような、そんな感じです。

夜は静かにしてもらいたいものです。

8月 8日 (金)

1. トンデモ

と学会公式HPHTML 、なかなかのトンデモぶりです。

2. enqueue

  • アクメツ(1-3)

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

8月 20日 (水)

1. TDS

TDSで作るWebページ。メモ。修正するファイル、箇所はtitle属性に記述。

1.1. 脚注

脚注のアンカーにあるhrefのフォーマットを変更。${new} は不要かも。

# FN : 脚注表示部
package TDS::Tdf::Command::FN_Content;
$HrefTemplateStatic = qq(#r%0d-%{new}-F%fn);

1.2. 目次

htmllintに怒られたので、目次中のハイパーリンクにtitle属性追加。

package TableOfContents;
$BeginContentTemplate = qq(<li class="page-toc">
  <a href="\#h%counter" title="%counter %content">%content</a>\n);

1.3. セクション対応

曲がりなりにもTeX使いの私としては、<Hx> 〜 </Hx> 〜 <DIVx> 〜 </DIVx>ISO/IEC 15445:2000 風)よりも、<SECTION> 〜 </SECTION>形式のほうがしっくり来ます。目次を作りたいので、HDコマンドを参考にゴニョゴニョ。

まずはブロック要素にSECTION系コマンドを登録。

@{$Entities{'Block'}} = (
 'CHAPTER',  # H1
 'SECTION',  # H2
 'SUBSECTION',  # H3
 'SUBSUBSECTION',  # H4
 'MINORSECTION',  # H5
 # H6 なんて使わないからいいや
 'HD', 'INCLUDE');

次。HDではなく、SECTION系を見に行くようにします。

  @templates = (
    undef,
    TDS::Tdf::Command::CHAPTER::BottomTemplate,
    TDS::Tdf::Command::SECTION::BottomTemplate,
    TDS::Tdf::Command::SUBSECTION::BottomTemplate,
    TDS::Tdf::Command::SUBSUBSECTION::BottomTemplate,
    TDS::Tdf::Command::MINORSECTION::BottomTemplate,
    '',
  );

    for (reverse 1..6){
    if ($params->{"hd_$_"}){
      $bottom_html .= Template::Expand($template[$_], {'1'=>$_});
    }
    }

SECTION系コマンドで共通する部分を追加。終始、値を保持していないといけない部分があるので、パッケージ化しました。もっとスマートなやり方があると思いますが…

package TDS::Tdf::Command::Hierarchy;
@DocLevel = (undef, 0, 0, 0, 0, 0, 0);

# 追加 sub 1
# サブルーチン化する必要ありませんでした
sub toNum {
  my $r = '';
  for (my $i = 1; $i <= 6; $i++) {
    my $n = $DocLevel[$i];
    if ($n) {
      $r .= "$n.";
    }
  }
  return $r;
}

# 追加 sub 2
sub getHierarchyInfo($)
{
  my ($num, $bt) = @_;

  my $inc;
  my $dec;
  my $i;

  unless ($DocLevel[$num]) {    # deeper
    $inc++;
  }

  my $bottom_html;
  for (reverse $num..6){
    if ($DocLevel[$_] >= 1){
      $bottom_html .= Template::Expand($bt, {'1'=>$_});
      $dec++;
    }
  }

    $DocLevel[$num]++;

  # reset
  for ($i = $num+1; $i<=6; $i++){
    $DocLevel[$i] = 0;
  }

  my $modNum = toNum();
  my $retlevel = $DocLevel[$num];

  return ($retlevel, $inc, $dec, $modNum, $bottom_html);
}

これでやっとSECTIONコマンドを追加できます。

# section
package TDS::Tdf::Command::SECTION;
@ISA = qw(TDS::Tdf::Command::_Block);

$Template = qq(<!-- begin section -->\n
  <h2 id="h%h2_counter">%h2_counter %ext_attrs</h2>\n<div class="dh2">\n);
$EndTemplate = qq(</div>\n<!-- end section -->\n);
$TopTemplate = qq();
$BottomTemplate = qq();
@AllowCommands = ('%Flow', 'HD', 'SUBSECTION', 'SUBSUBSECTION', 'MINORSECTION');
$OmittableEnd = 0;
$IsOneline = 0;
$MustHaveContent = 0;
$NumAttr = 0;
$HasArgContent = 0;
$RegisterToc = 1;

sub AsHTML($$)
{
  my ($self, $params) = @_;
  my $num = 2;

  my $i;

  my ($retlevel, $inc, $dec, $modNum, $bottom_html)
   = TDS::Tdf::Command::Hierarchy::getHierarchyInfo($num, $BottomTemplate);

  $params->{h2_counter} = $modNum;

  if ($RegisterToc) {
    require TableOfContents;
    $params->{_toc} = new TableOfContents unless ref $params->{_toc};

    $params->{_toc}->Add({
      counter=>$params->{h2_counter},
      inc=>$inc,
      dec=>$dec-1,
      level=>$num,
      content=>$self->{ext_attrs} });
  }

  my $html = $self->SUPER::AsHTML($params);
  my $top_html = Template::Expand($TopTemplate, {'1'=>$num});
  return "$bottom_html$html$top_html";
}

CHAPTER, SUBSECTION, SUBSUBSECTION, MINORSECTION も同様にパッケージ化。テンプレート中の%h2_counter ,@AllowCommands や、sub AsHTML中の$num ,$param->{h2_counter} は文書構造レベルに合わせて変更。

あー、上書き防止策入れるの忘れてますね。また今度でいいや。

2. 抱腹絶倒

るざりんさんの過去の日記(5月1日)を読んで、一人で笑い転げていました。

は、腹がよじれる(笑)

8月 21日 (木)

1. invader

1.1. 他人事

夜、旅人さんの日記[1][2]を読んでおりました。

「ゴキブリなんか侵入させちゃ駄目だよー。」

「確か、ゴキブリホイホイよりもいい兵器があったなー。しょーがないなー、アレを教えてあげようかなー。」

と、半分笑いながら、ちょうど数日前に見つけたゴキブリ退治のWebサイトを探してました。

「えーと、どこだったけなー」

もう、他人事です。いや、他人事でした、そう、このときまでは。その直後でした、目の前が真っ暗になったのは… いや、目の前に真っ黒いものが現れたのは。

1.2. 有事

今のアパートに住んで以来、ゴキブリや蛾はもちろん、蚊ですら2〜3匹しか侵入を許したことの無い我が家(借家)。その経歴に、泥を塗るヤツ…

ゴキブリ!しかも飛行型!

侵入口は不明ですが、飛行していたことから、まさに今その瞬間に侵入したものと思われます。即刻、排除せねばなりません。

1.3. 臨戦体制に移行、目標を抹殺し、安眠時間を確保せよ

敵は一匹と言えども、強敵です。しかも、専用の兵器がありません。とりあえず、手近にある武器になりそうなものを装備します。

右手
新聞紙
左手
ギャッツビー デオドラント(制汗スプレー)

スプレーは冷気が出るやつです。直撃させれば多少は動きが鈍るでしょう。物と物の隙間に入ったら冷気攻撃、広い空間に出てきたら物理攻撃。遠慮は無用です。

えーい、バシバシ。

なかなか死にません。生命力と防御力が異常に高いのが奴らの特徴です。さすが、35億年もの歴史を持つだけのことはあります。恐竜は死滅したのに、こいつらだけ平然と生き延びているのは厳然たる事実。いや、たとえ地球が滅んでも、ヤツらだけは絶滅しないに違いありません。

うりゃ、バシッ! おお、クリーンヒット? 動かなくなりました。が、油断は禁物です。気絶してるだけかもしれません。

とどめっ、バシバシ。うむ、今度こそくたばったようです。念のため、目標を広告の紙ですくって新聞紙の間にはさみ、その上から踏みつけます。

安らかなる眠りを、我に。
永遠なる眠りを、彼に。

1.4. 終戦

20分の死闘の末、勝利。任務完了。

普段は廃品回収の対象でしかない新聞紙が、今回は大活躍してくれました。今日ほど新聞とってて良かったと思った日はありません。

1.5. 教訓

他人様のWebサイトを見て、ゴキブリ騒ぎを笑うのは慎みましょう。インターネット経由で感染します。

1.6. 敵を知り己を知れば百戦危うからず

探していたWebサイトはこれでした。

ああ、美しきゴキブリの世界!

サイト名も凄いですが、ドメイン名もまた凄いです。

8月 22日 (金)

1. R-TYPE FINAL

無敵モードで放置プレイ。もはや、まじめにやる気、皆無。

1.1. F-A

ステージF-Aボス戦で、ボスの目の前にフォースを置いて、そのまま放置してみました。一眠りして目を覚ますと、スコアが200万位になってました。良い稼ぎポイントです。

1.2. 3回目

3周くらい(放置)させて、ようやくR-99が出現しましたが、エンディング後に例のごとくフリーズ。通算3度目です。セーブしてあるからダメージは小さいものの…

リコールものでしょ、これ?

8月 23日 (土)

1. R-TYPE FINAL

1.1. Last Dancer and Curtain Call

R-99, R-100 出現。フリーズ対策のため、最終面突入時にゲームを中断して、エンディングを見ないことにしました。何でこんなことせにゃならんのか。

1.2. AI

AIモードをプレイ。以前やったとき、全然面白くなかったので放置していましたが、ギャラリーを埋めるために渋々プレイ。

R-99があるので、フレキシブルフォース+サイビット2+ホーミングミサイルを装備して、バウンドライトニングをぶっ放していれば、相手に関係なく9割方勝てますね。あっさりとAIモードクリア。

それににしても、このロードの多さはいったい何なのでしょう。

  1. AIモード移行(ロード)
  2. CHAMPIONSHIP移行
  3. 相手選択(ロード)
  4. 自機選択(ロード)
  5. 戦闘モード(ロード)

以後、

  1. 相手選択(ロード)
  2. 自機選択(ロード)
  3. 戦闘モード(ロード)

の繰り返しです。画面が切り替わるごとにロードが入る上、戦闘では自分で操作することはできませんし、相手・自機選択ではほとんど操作は必要ないですから、本当に見てるだけのリアル放置プレイ。これまた本編同様、睡魔に襲われます。

1.3. 4度目の…

R-101開発のため、再び本編。相変わらずまじめにやる気が無いので、R-TYPERモードで無敵放置していました。

すると、2面ボス開戦直後にフリーズ…エンディング以外でもフリーズするのかよ。処置無しだ。

2. user style

無料Webサーバで公開されているWebページなどに、決まって挿入されているバナー広告が鬱陶しかったので、Mozillaのユーザスタイルシートに、

table {
  display: none;
}

と書いたところ、何も表示されないWebページが続出してしまい、悲しい思いをしました。と同時に、TABLE要素をレイアウトのために使用しているWebページがいかに多いかを実感しました。

<div class="server-include-advertisement">みたいにマークしてくれると、ありがたいんですが。

3. dloader(NaverRobot)

あの… dloader と名乗るロボット、正直、うざいんですけど…

NAVARのロボットのようですが、htmllint CGIにアクセスしまくってて、CPUリソースを浪費させられています。アクセス間隔が0なので、まるでDoS攻撃。お行儀が悪いです。困ったものですね。弾いちゃおうかな…

8月 24日 (日)

1. R-TYPE FINAL

1.1. Grand Finale

無敵で放置。R-101はあっさり出現しました。これでようやく全機揃いました。

1.2. 点稼ぎ

F-Aボスにセクシーフォースをめり込ませて放置。自機1機で400万以上稼げるので、最終スコアが1000万を超えることが確認できました。

1.3. メモ

  • ライトニング波動砲とサイビットは相性が良い。ザコに強い。
  • サイクロンフォースとグリーンポッドは相性が良い。フォース切り離し状態が強い。
  • セクシーフォースの触手には、個別に判定があるような気が。DOSE溜めるのが楽だし攻撃力も高い。
  • F-Cの後半のザコラッシュは、フレキシブルフォースか、一掃系レーザー(ターミネイトγ、ハウンドRAY、…)があれば楽勝。
  • 最弱機体は B-3A MISTY LADY ということで・・・

2. 伺か

2.1. SSP

本家(materia)よりも、互換(SSP)のほうが安定している気がします。少なくとも、本家みたいに突然落ちることは無いみたいです。

2.2. 歌詞

SSPはクイックセクション使用時の歌詞表示が軽すぎるのか、materiaでタイミングを調整した歌詞が先行しすぎてしまいます。当然、SSPで調整した歌詞をmateriaで表示させると、遅延が発生するわけで。困りましたね。

3. ゴキブリバスター

ゴキブリ退治の特効薬ホイホイさん、近所には売ってませんねぇ(当たり前)。

8月 25日 (月)

1. ID

メモメモ。

XHTML のIDデータ型って、HTMLと同じく、「アルファベット([A-Za-z])で開始し、任意の数のアルファベット、数字 ([0-9])、ハイフン (-)、アンダースコア (_)、コロン (:)、ピリオド (.)のみで構成された文字列」だと思ってたんですが…

XHTML関連のサイトをいくつか見てみると、やはり同じことが書かれています。Another htmllint でもこのルールに従っていますが、この制約って、どこから来た話なんでしょう?XHTMLってXMLだから、XMLの命名ルールに従わないといけないんじゃないかなー、と思ったり。

XMLだと、IDデータ型にはUnicodeで規定される大概の文字が使えたような気がしますが… んー?

ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".").

Validity constraint: ID
Values of type ID must match the Name production. A name must not appear more than once in an XML document as a value of this type; i.e., ID values must uniquely identify the elements which bear them.
Names and Tokens
[4]  NameChar  ::=  Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender
[5]  Name      ::=  (Letter | '_' | ':') (NameChar)*

Following the characteristics defined in the Unicode standard, characters are classed as base characters (among others, these contain the alphabetic characters of the Latin alphabet), ideographic characters, and combining characters (among others, this class contains most diacritics) Digits and extenders are also distinguished.

Characters
[84]  Letter  ::=  BaseChar | Ideographic

BaseCharとIdeographicによって、数字以外の漢字やら何やらいろいろ含まれてしまうわけで、つまり、ほとんど何でもアリってこと? 要調査。

XHTMLだけ例外的なルールがあるとか…? いまいちわからんなぁ。

1.1. 2004-03-24 追記

ありました。

Note that the collection of legal values in XML 1.0 Section 2.3, production 5 is much larger than that permitted to be used in the IDand NAMEtypes defined in HTML 4.When defining fragment identifiers to be backward-compatible, only strings matching the pattern [A-Za-z][A-Za-z0-9:_.-]*should be used. See Section 6.2 of [HTML4] for more information.

見落とし。ガクッ。

8月 28日 (木)

1. THE地球防衛軍

これ、マジで面白いです。ヤバイです。ハマりました。

UFO、巨大アリに宇宙怪獣。こいつらに生身で立ち向かう主人公。乗り物は戦闘ヘリと戦車とバイク。

これ作った人たち、よくわかってるじゃん

正直、SIMPLE 2000シリーズ って、ただのミニゲームという程度の認識しか持っていませんでした。買うときも、中身にはあまり期待していませんでした。しかし、このゲームをやってしまったからには認識を改めねばなりません。侮れません、SIMPLE 2000シリーズ

8月 30日 (土)

1. THE地球防衛軍

こればっかりやっています。

難易度HARDESTはクリアできましたが、最高難度のINFERNOにはさすがにてこずっています。特にアリが強くて…

黒アリ
硬いです。そこいらのミサイル程度では死にません。
酸のばら撒き攻撃はさながらショットガン。至近距離で食らうと大ダメージで、戦車ですら一撃で沈みます。
赤アリ
黒アリよりもさらに硬いです。ロケットランチャーですら貧弱に見えてきます。
おまけに速いです。そのスピードは、全力疾走している戦車をも凌ぎます。

そういえば、ロマサガ2でもアリに悩まされた記憶が。

8月 31日 (日)

1. 昼食

1.1. twice

スパゲッティをゆで、ソースをかけたところ、ソースの量が妙に多いなと感じました。袋を良く見たら、「2人前」と書かれていました。ぐはぁ。こりゃ、夜もスパゲッティだな。

1.2. 算数パズル

スパゲッティをゆでるとき、いつも思うことがあります。

スパゲッティって大抵一袋、奇数×100gで売られています。ほどんどが 300g, 500g, 900g です。食べるときは袋から一食分の約100gを取るわけですが、一回目が非常に難しい。300gの場合、最初の100gを取るには3等分すればよいのですが、3等分てのは簡単には出来ません。300gはまだ良いほうで、900gなんて買ってこようものなら、9等分するハメになってしまいます。難関ですよ、9等分。

しかし、1回目さえクリアしてしまうと、次回以降は楽なんですよね。内容量をN ×100g (N は 3, 5, 9)とすると、1回目クリア時点で内容量は (N -1)×100g となります。ここで、N -1 は 2, 4, 8、つまり、2のべき乗ですから、残ったパスタを半分、半分、…とするだけで、100g分を取ることが出来ます。半分にするのは、3等分するよりもはるかに簡単なことです。

要は、最初から2Warning:'SUP' is reserved. SUP n ×100g単位で売ってくれればよいのです。そうすれば、一食分を取るのが簡単になるのです。

いや、まぁ、素直に秤を使えばいいんですけど、うちには秤がないもので。秤を使う機会なんて、まずありませんからね。料理は毎回目分量。計量カップとか大さじ小さじですら使ったことがないです。適当ですねぇ。でも100gにはこだわる…