Mireille - Bulletin Board System

これはなにか

“Mireille”は「ほんのりと寂れの匂いがしつつもなんとか賑わっている個人サイト向け、 高機能雑談系CGI/Perl掲示板システム」です、目標は。 この目標を達成するためには、多少気乗りしない機能でもつける予定です。 技術的&労力的&需要的に可能ならば。

つかいかた

対応サーバー

OS
UNIX系、WinNT系(Win9xとMacOS9以下ではflockが動きませんが一応)
httpd
IIS5.1とApacheで確認、他のものでもCGI/Perlが動けばきっと動くはず
Perl
5.005_03以降

対応ブラウザ

WinIE5.01以上(WinIE6以上を推奨)、 Mozilla1.0.0以上、 Opera7、 そのほかのブラウザでも多分読み書きできます。 古いブラウザやマイナーなブラウザ、 例えばWinIE4, MacIE, Netscape4, Opera, iCab, Konqueror, Safariなどでも、 記事の読み書きレベルすらできない場合は教えてください。 最低限記事の読み書きは出来るべきだと思っていますので。

設置

まず、Mireille.txtとMireille.html以外は漢字コードがShift_JISでなく、EUC-JPです。 メモ帳で文字化けしてしまうのは仕様であってバグではありません。 詳しい説明はこの文章の「/特筆すべき注意/文字化けするときは」で、

とりあえず必須ファイルだけ。

/bbs/          777
/bbs/index.cgi 755
/bbs/core.cgi
/bbs/iconctlg.cgi
/bbs/style.pl
/bbs/style.css
/bbs/artnavi.js
/bbs/log/      777
/bbs/log/0.cgi 666 or そのまま

広告が自動挿入されるサーバーなどで動かしたときに、画面が真っ白になってしまう場合は、 index.cgiの中の$CF{'conenc'}='|gzip -cfq9';という所を$CF{'conenc'}='';としてください。 (コメントアウトではダメ)

詳しい設置説明は同梱のMireille.htmlを参照してくださいまし。

Coming soon...?/memo.

suオプション
管理者パスワードが「hoehoe」の時に、投稿時コマンド欄に「su=hoehoe;」と入れておくと、 それ以降Cookieに管理者であることが保存され、いちいち管理者パスワードを入れなくても、 記事の削除や修正、 最大子記事数制限に達したスレッドへの返信などができるようになる。 セキュリティホールを作りこみかねないので慎重に実装しないと。
MireilleIconList規格の強化

BNFもどきで書くと今はこんな感じ。

( 'BEGIN' | 'END' ) '_' ( 'VENDOR' | COPY1' ) (#x20 |#x9)+ <VALUE>?
( 'VENDOR' | 'COPY1' ) '_' ( 'NAME' | URL' | 'LINK' ) (#x20 |#x9)+ <VALUE>
'PAGE-BREAK'
#BEGIN_*では<VALUE>を取れる、これは*_NAMEに本来入る<VALUE>である、つまり略記。

これを以下のような感じに拡張したい。

( 'BEGIN' | 'END' ) '_' ( 'VENDOR' | COPY1' ) (#x20 |#x9)+ <VALUE>
( 'VENDOR' | 'COPY1' ) '_' ( 'NAME' | URL' | 'LINK' | 'COMMENT' ) (#x20 |#x9)+ <VALUE>
'PAGE_' ( 'TITLE' | 'GROUP' | 'COMMENT' ) (#x20 |#x9)+ <VALUE>
#PAGE_命令群はそのページに対しての情報を付加する

さらに、同じキャラで表情が違う、といったのをグループ化したい。 (Marldiaでは強引にやっているが、その方法では限界がある)

もっといい案がほしいな。。 アイコン配布サイト側がこの形式のアイコンリストを配布する〜までいけば最高ですけどね。

Mireilleのパッケージに何かしらアイコンを添付する
あったらいいなぁ。
Undocumentedな事項を文章化する
コマンド周りでは特に文章化されていない機能が多く存在します。 「マニュアルとして整形するのが面倒〜」 「そもそも実験的な実装なので変わる可能性があるのだ」 とか言ってますが、文章化するべきな気がします。 当面は細かい挙動や隠れた機能を知りたい方はソースを見てください。 わかりにくい場合はコメントをつけたり、コメントの文章を練り直すのでご一報を。

Mireille History

2003-07-25 Release 1.2.12

core.cgi
style.pl
index.cgi,manage.cgi

2003-07-05 Release 1.2.11

配布圧縮ファイルのディレクトリ構成を変更

core.cgi
style.pl
style.css
index.cgi,manage.cgi
index.cgi
manage.cgi
artnavi.js
help.pl
Mireille.html

2003-03-30 Release 1.2.8

core.cgi
index.cgi
manage.cgi
style.pl
style.css
help.pl
Mireille.html

2003-01-29 Release 1.2.7

core.cgi
style.pl
artnavi.js
index.cgi
index.cgi,manage.cgi
style.css
help.pl

2002-12-25 Release 1.2.6

core.cgi
help.pl
index.cgi,manage.cgi
index.cgi,style.pl
style.pl
Mireille.html
style.css
convert12.cgi

2002-11-18 Release 1.2.5

core.cgi

2002-11-15 Release 1.2.4

core.cgi,style.pl
style.css
artnavi.js

Release 1.2.4より前

省略

既知の問題(相対バグ)

許可タグに"STRONG"を入れると、語句強調と衝突する可能性がある

ユーザーの入力するSTRONGタグが/<STRONG class="[^"]*">.*<\/STRONG>/ にマッチしないものなら大丈夫です。 語句強調の使用するclass名を、特定の文字列から始めるようにする、 といった対策も検討してはいます。(つまり当分対策予定なし)

許可タグに"A"を入れると、URI自動リンクと衝突する可能性がある

少なくとも/^<A class="autolink"/にマッチしなければ大丈夫です。

MSIE以外でToolTipの"\n"がちゃんと表示されないことがある

現実的な対処法を模索中です・・・。

HTML/CSSでvalidでない部分がある

現在のブラウザが一通り入れ替わったら、XHTML2+JavaScript2+CSS3で書き直します。 (成瀬はW3C原理主義者じゃないので・・・) $ENV{'HTTP_USER_AGENT'}みてrequireするstyleを切り替える?

アイコンリストや色リストの形式はHTML完全互換でない

処理の簡便化のため、一部互換性を省いています。 例えば次の、

<OPTION value=hoe.png>ほえ

はHTML4では正当なものですが、Mireilleはvalueの値を""でくくっていない為と、 </OPTION>が無いために解釈することが出来ません。(出来ることもあるけど)

日本語オンリー

EUC-JPでの使用を前提として、正規表現を決め打ちしている部分が多々存在する。 Perl5.8+UTF-8に変えるか、スクリプト自体はASCIIにしてstyleはopenFileしてとってくる? 今のところあまりは需要はなさそう、かな。

表現が統一できてない、または表現が適切でない部分がある

例えば、

「アイコン一覧/IconList/アイコン見本/IconSample/IconPreview」
互いにまぎらわしいぞ
フォーム「ホーム」
「ホーム/HOME/URL/ホームページ/HP」の中から「ホーム」を選んだ当時のわたしに乾杯(謎
「コマンド」
「コマンド」って何さ?飾りですよ
「投稿された記事の著作権は管理者の管理下におかれます。」
もっとうまい言い方はないのかね
メニュー「更新」
更新ってなんだ?何を?
メニュー「ホーム」
フォーム側と整合性は取れているけど・・・もっとうまい表現無いの?
「BACK to HOME/CONTENTS/INDEX」
どこに行くのか解りづらい上に、そもそもどこに行ってもらうべきか不明
「ヘルプ」といいつつ
ろくに助けになってない(ぉ

などです。 修正案を思いついた方は教えてくださいまし。

日和見中

一行レス機能

普通にやるとアイコンリストが重過ぎるので、 Cookieが保存されている時のみ、Cookieの情報を使うことでできる・・・かな。

NoIconStyle以外のスタイルの配布

現在の青ベースデザインの他に、赤や緑や橙など? もっと大幅にデザインを変えたもの? どなたか改造したものを寄贈してくださると楽なのですけど(ぉぃ

RSS対応

需要がなさそう・・・。

携帯端末で見れるように

スキンに対応したら、そのときに携帯端末用スキンを作ることで対応する予定です。

夢。

いつかやりたいけれど当分できなさそうなこと。

より自由度の高いスタイルの変更

ツリービューにしたり、果ては日記のように使えるようにしたり。

Unicode化

EUC/SJISの呪縛から逃れたい〜use encodingさいこぉ〜。 'テスト'=~/好/がマッチしないのステキ☆ Perl5.8待ちですね。

ログ形式の変更

Storableモジュールなんか使うのいいですね。 XMLデータベースまで使ちゃったら素敵ですね。

開発言語の変更

RubyとかC#とか。

現在予定していないこと

TODOの逆、みたいなものです。 以下にあげるものは現在、半永久的に実装予定がありません。 理由は「ポリシーに反するから」でも「つけるのが無理だから」でもなく、 「使う人がいなさそうだから」ですので、使う人がいればつけます。

「検索する単語」で正規表現を使えるようにするorAND/OR検索

今はquotemeta関数で文字列にしています。 正規表現を使えるとより複雑な検索が出来ます。

P3P対応

そもそもこの存在を知っているユーザーが少ないと思われる。

語句強調の方法

$DT{'strong'}に' '(半角空白)区切りで、

$CF{'strong'}='// s2f2 > s8184 # s8194 ◇ s819e ◆ s819f □ s81a0 ■ s81a1 ※ s81a6';

のように、強調する記号と対応するCSSのクラスを列挙します。

このとき、最初の一文字が

$CF{'strong'}=' // s2f2f /(/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)/ s2f2a > s8184 # s8194';

のように' '(半角空白)だった場合拡張モードになります。 記号やクラスの前後を//で囲んだものはそのまま正規表現として代入され、

$DT{'body'}=~s[$regexp][$ST{$_}]gm;

と置換作業に利用されます。

ちなみに、記号とクラスは別々に、そのまま正規表現として代入するか、判定されます。 上の例では /* ・・・ */ というC言語のコメント部分に、s2f2aというCSSクラスを与えます。

文字列内に' '(半角空白)を書きたい場合は、8進数文字コードで\040と書くか、 16進数文字コードで\x20と書いてください。

アイコンまわりの説明

index.cgiのアイコンディレクトリ設定

$CF{'icon'}の設定は最後に/を含めてください。

アイコンリスト

$CF{'icls'}の最初の一文字が' '(半角空白)だった場合複数リストモードになります。 具体的な例を出すと、

単一とみなされる例
複数とみなされる例

アイコン編集

タグ方式とSharp方式があります。

タグ方式

HTML4に基づいた形で、SELECTタグ内の要素を羅列するだけです。 管理CGIはその中のOPTGROUPとOPTIONタグを認識して、アイコン見本を作成してくれます。 とりあえず例を、

<OPTGROUP label="グループ名">
  <OPTION value="アイコンファイル名">アイコン名</OPTION>
  <OPTION value="アイコンファイル名">アイコン名</OPTION>
</OPTGROUP>
<!-- %BEGIN_COPY1 SQUARE -->
<!-- %COPY1_URL http://www.playonline.com/ -->
<OPTGROUP label="FINAL FANTASY VII">
  <OPTION value="cloud.gif">クラウド</OPTION>
  <OPTION value="tifa.gif">ティファ</OPTION>
  <OPTION value="aerith.gif">エアリス</OPTION>
  <OPTION value="yuffie.gif">ユフィ</OPTION>
  <OPTION value="vin.gif">ヴィンセント</OPTION>
  <OPTION value="sephi.gif">セフィロス</OPTION>
  <OPTION value="cid7.gif">シド</OPTION>
  <OPTION value="red.gif">レッドXIII</OPTION>
  <OPTION value="barret.gif">バレット</OPTION>
  <OPTION value="cait.gif">ケットシー</OPTION>
</OPTGROUP>
<!-- END_COPY1 -->

HTML4の仕様上はOPTIONタグは終了タグを省略できるはずですが、 Mireilleでは省略した場合の動作は保証しません。 ちなみに、OPTGROUPタグは入れ子にできない(<OPTGROUP><OPTGROUP>とできない) ので注意しましょう。 これはHTML4の仕様なので、入れ子をサポートする予定は当分ありません。 HTML4の仕様のせいにしてたりなんかしません(w

Sharp方式

その名の通り、"#"を使う方式です。 これも例を見たほうが早いでしょう。 タグ方式と見比べてみてください。

#グループ名
  アイコンファイル名#アイコン名
  アイコンファイル名#アイコン名
#
<!-- %BEGIN_COPY1 SQUARE -->
<!-- %COPY1_URL http://www.playonline.com/ -->
#FINAL FANTASY VII
    cloud.gif#クラウド
  tifa.gif#ティファ
  aerith.gif#エアリス
  yuffie.gif#ユフィ
  vin.gif#ヴィンセント
  sephi.gif#セフィロス
  cid7.gif#シド
  red.gif#レッドXIII
  barret.gif#バレット
  cait.gif#ケットシー
#
<!-- END_COPY1 -->

という感じです。

相対指定アイコン

1.2.9から相対指定アイコンというコマンドが実装されているのですが、 ここではこの機能について説明します。

この機能はrelativeIcon=hutsuha/shitei/dekinai/icon.pngとコマンド欄に入力することで使えます。 利点はアイコンリストに登録されていないものでも使える、ということなのですが、 当然「わざとアイコンリストに登録していないもの」も使えてしまいます。

そのため、セキュリティホールになりそうにも思えますが、 実際にはこの機能が追加されたために、セキュリティホールが増える、ということはありません。 その根拠は以下の三点になります。

  1. ファイル名指定アイコン機能を使わなくても、DUKEを使えば以前から同じことができる。
  2. ファイル名指定アイコン機能では../のようなディレクトリをさかのぼる指定ができない。
  3. ファイル名指定アイコン機能を実行させるためのON/OFFを設定できる。

どう転んだとしても、いかがわしい目的で本来使えないアイコンを使おうと思ったら、 ファイル名指定アイコン機能を使うよりも、既存のアイコン指定の枠組み内で、 フォームを偽装して投稿した方が自由度が上です。 以上より、この機能の追加によって、Mireilleのセキュリティが下がるということはありません。

絶対指定アイコン

絶対パスを指定します。 コマンドはabsoluteIcon=http://www.airemix.com/airemix.pngという感じです。

アイコンリストの拡張コマンド

まだversion0.xなので、将来規格が変わる可能性があります。 注意して使ってください。

COPY1
一時著作権者の情報を設定します。 基本的にはNAMEとURLを指定します。 LINKはアイコンカタログなどで使うリンクを明示的に指定するときに使います。
VENDOR
アイコンの製作者の情報を設定します。 他はCOPY1と同じ。
PAGE-BREAK
このコマンドが出現したところで、アイコンカタログはページを変えます。

style.plのHTMLデザイン部について

かなりの自由度でデザインを変更することが出来ます。 また、メニュー、記事、投稿フォームのデザイン部では以下の変数を使うことが出来ます。

記事番号:$DT{'i'}
返信番号:$DT{'j'}
名前:$DT{'name'}
題名:$DT{'title'}
メールアドレス:$DT{'email'}
ホームページアドレス:$DT{'home'}
投稿日時("????年??月??日(?) ??時??分"型):$DT{'date'}
本文:$DT{'mes'}
アイコン:$DT{'icon'}
パスワード:$DT{'pass'}
コマンド:$DT{'cmd'}

これら以外にも使える変数が存在することはしますが、使うべきものかどうかは微妙です。

特筆すべき注意

管理CGIのファイル名を変えること!

Mireilleの管理CGI(manage.cgi)は非常に強い権限をもっているため、 悪意の第三者にアクセスされた場合、非常に危険です。 必ずファイル名を変更しましょう。 (そもそも1.2.3.7以降ではファイル名を変更しないと使えないようになっています)

文字化けするときは

Mireilleは、このMireille.txtとMireille.htmlを除いて全て、 EUCという漢字コード書かれています。 そのため、メモ帳を筆頭とする、EUC非対応のエディタでは編集することが出来ません。 EUC対応のエディタをご使用ください。 以下は推奨するエディタです。

他にもEmEditorやWZEdiotr,Peggyなどが対応しています。 特に本格的にやるならば、色付けをしてくれるエディタだと格段に、 効率が上がり、かつミスも減ると思います。

PrelFactory ≪http://homepage1.nifty.com/wizman/≫ はその名の通りPerlの開発環境です。 ざっと見た限りではPerl単体の色付けに関してはケチをつけられる所はありませんでした。

アンカーシステムズ株式会社のPeggyPro ≪http://www2.noritz.co.jp/anchor/≫ を、 成瀬は2001年中ごろから使っています。 Perlだけでなく主要な言語からそうでない言語まで幅広いサポートが光ります。 CREC(コンテキスト正規表現カラー表示)を使って新規に言語モードを作ることで、 新たな色づけ規則を、単なるキーワード強調以上のことができます(><

ファイル名変更の制限

スタイルシートのファイル名は、 必ず[_a-zA-Z0-9]*.cssという形式である必要があります。 つまり、-=~<>\などの記号や日本語名は使えません。

詳しい説明は同梱のMireille.htmlを参照ください

よくある疑問

エラーがでたっぽい

文字化けしてます〜;;

漢字コードがおそらくShift_JISになっています。 MireilleはEUCを使っているのでEUCで保存しなおしてください。 一部のファイルを除いて全ての他のファイルも同様です。 「一部のファイル」がどれかは、最初から何行目かに、

# "This file is written in shift_jis, CRLF." 空

のような行があるので、そこにどの漢字コードを使っているか書いてありますので、 それを参照してください。 ちなみにこのファイルはShift_JISで保存してあります。

それじゃなんでEUCを使うの?

確かにShift_JISのほうが楽です。 ほとんどの人はWindowsを使っているでしょうから、標準のShift_JISを使ったほうがいいですね。 わたしも本当はWindows上での利便性を考えればShift_JISを使いたいです。 ただ、Shift_JISだと一部の漢字においてCGI処理の中でうまく処理できないのです。

具体的には、「print"能";」というコマンドでエラーが出ます。 これはShift_JISでの「能」の16進文字コードが\x945cなため下の二つが、 \x5cである特殊文字「\」とかぶってしまうからです。 このような文字は「能」「饅」など数十文字あります。 回避策は何個かありますが、一番確実な回避策がEUCを使う、ということだったわけです。 EUCにはこのようなエラーを誘発する文字が、無いように作られていますので。 このことについては、 perl スクリプトは EUC-JP で書く が詳しいです。

その意味では今流行の、世界中の全ての文字を一つに詰め込もうという無茶な規格、 Unicodeでもいいのですが、まだエディタ側の対応を見ると時期尚早だと思いますので^^;; Perl側の対応もPerl5.8を待たないといまいちですし。

全てがわからない!ぜんぜん無理!

とりあえず今はあきらめることをお勧めします。 それが嫌な場合は親切かつ有能な友人を頼ってください^^;;

投稿時間を保存するのに、UNIX秒で保存してるのはなぜ

確かにログ保存時に「1970年01月01日(木) 09時00分」などとしてしまったほうが、 表示時のサーバー負荷や所要時間は多少なりとも減ると思われます。

しかし、この負荷はログファイルの読み込みに比べれば微々たる物ですし、 所要時間に至ってはHTTPでの転送にかかる時間に比べれば誤差です。

それよりも、 「1970年01月01日(木) 09時00分」という形式に比べ、UNIX秒のほうが他の形式に変換しやすい、 というメリットをとったわけです。

なぜgetloginなんてしてるの

これは歴史的な経緯によります。 とあるレンタルサーバーで、Mireilleの自動作成したファイルを、 FTPから削除できないという現象があったのですが、これの対応策として、 getloginでユーザーを調べ、''だったらumask(0)をかける、としたためです。 そのサーバーは今ではSuEXECを使うようになっためumask(0)する必要ないのですけどね。 もっとスマートな解決方法ってあったのかな。。

なぜfont-familyが'MS P ゴシック'なんですか

歴史的経緯です。 'MS UI Gothic'のような、他のフォントの方がよいという方が多いようだったら変えますよ。

書き込みフォームの、本文入力欄の位置が新規と返信で違う

こうした方が使いやすいかなと。

Mireilleの仕様

Mireilleの構造について、実装の手法からつらつらと書き連ねておきます。 「ここが知りたい」という個所があれば、言ってくだされば優先的に記述します。

Mireilleの版付け規則

Release1.2.4以降では、 Mireilleを構成する個々のファイルは“?.?”と二桁のRevisionであらわされます。 MireillePackageのバージョンは3桁の場合と4桁の場合があり、 Release版やStable版の場合は3桁、Experiment版の場合は4桁になります。 3桁目はMireille.txtのRevisinの2桁目と、4桁目はcore.cgiのRevisinの2桁目と一致します。 1桁目と2桁目は気分に次第で適当に増やします。 基本的には、行った変更の重要さ(派手さ)加減によって変わる・・・はず。

CSSとその動的切り替え

本来はCSS2の属性セレクタ(Attribute selectors)と擬似クラス(Pseudo-classes)でやるのが理想なのですが、 そうも行かないのでいろいろ知恵をひねることになります。

まず、Mozillaは理想のとおり属性セレクタと擬似クラスで切り替えを行います。 この際に属性セレクタを含んだブロックと含まないブロックの両方を用意する必要があります。

.submit{
  background-color: #dde;
  border: #355 solid 2px;
  color: #355;
  cursor: pointer; cursor: hand;
  width: 7em;
}
INPUT[type="submit"]{
  background-color: #dde;
  border: #355 solid 2px;
  color: #355;
  cursor: pointer;
  width: 7em;
}

こうしないと属性セレクタを解釈できないブラウザが.submitまで無視してしまうのです。

次にWindowsInternetExplorerです。 これはMozillaのようには行かないので、フッター直前に置いたJScriptで処理します。 以下は$CF{'jscript_AtSe'}をはしょったものです。

<SCRIPT language="JScript" defer>
<!--
/*@cc_on
if(document.getElementsByTagName){
  var tags=document.getElementsByTagName('TEXTAREA')
  for(var i in tags){
    tags[i].className='blur';
    tags[i].onfocus=function(){this.className='focus';};
    tags[i].onblur=function(){this.className='blur';};
  }
}
// @*/
-->
</SCRIPT>

ここで、他のブラウザに悪影響が出ないように、JScriptの条件コンパイルという方法を使っています。 ≪http://www.microsoft.com/japan/developer/library/script56/js56jsconconditionalcompilation.htm≫ 上のスクリプトは速度上の問題からWinIE5以上にのみ対応していますが、WinIE4で動かすこともできます。 流石に“人類が生み出した三つの最悪なものの一つ”WinIE3では無理ですけど。

さて、残るOpera6やNetscape4などですが、これらは無視します(ぉ。 属性セレクタにも対応しないわ、JavaScriptからのCSS切り替えもできないではどうしようもありません。 やるべきことはこれらの表示に影響が出ないように、前の二つで表示できるようにする、です。

MacIEは6になるころには属性セレクタにも対応してくれることでしょう。 なので様子見;)

ログ形式

基本的にはTSVとname=valueの折衷である、

"name=\tvalue;\tname=\tvalue;\tname=\tvalue;\t"

という=\tと;\tで区切る方式を使っています。 \tはタブ文字のことなので、展開され、

name=	value;	name=	value;	name=	value;	

のようになります。 実際にMireilleのログとして保存する場合は最初に管理情報を埋め込み、 あとは任意のログ項目を列挙します。 現在の「Mir1型」ログ形式だと、

Mir12=	;	name=	名前;	subject=	テスト;	

と保存されます。 保存したログから値を読み出す際には、

my%DT=($_=~/([^\t]*)=\t([^\t]*);\t/go);

として一括してハッシュにつめこみ、あとは$DT{'name'}で呼び出します。 このあたりの処理はちょっと気に入っています(何

項目ごとの検索(題名に'Millefeuille'を含む記事を含むスレッドを検索)では、

$sertch_word='Millefeuille';
$log=~/\ttitle=\t$serch_word;\t/o;

とやれば、\tは区切りにしか含まれていないはずなので、必ず目的の項目が見つかります。 前に\tのない、行の最初の項目はこれでは検索できませんが、 Mir12型では行頭は管理領域なので、普通の検索では扱いませんし。(そもそも扱えたら困る) システムがこれにアクセスする場合は/^Mir12/で検索するので、問題ありません。

アイコンリスト形式

長年の研究の結果導き出された、最良のリスト形式は、「そのままタグを列挙する」でした(笑。 というわけで、SELECTタグ内に記述されるタグを列挙する、というわかりやすい形式になっています。 また、グループ分けのためHTML4で策定されたOPTGROUPタグの利用を推奨しています。

<OPTGROUP label="グループ名">
  <OPTION value="ファイル名">アイコン名</OPTION>
</OPTION>

Cookieを使って初期状態で選ばれるアイコンを選択する際には、

s/value="Cookieにあるファイル名"/value="Cookieにあるファイル名" selected="selected"/

とやる安易な方法を用いています。 この一見かつ適当に思えるリスト形式によって、大幅な高速化&耐久性を実現・・・ しているような、気がします(w (とりあえず700個のアイコンでそこそこの速度での動作を確認済) Rev:1.1.3.8以降ではHTMLコメントでアイコンの配布元情報を埋め込んだりも出来るようになっています。

カスタマイズ

index.cgiに変数群%CFを用意することによって行っています。 style.plで主に変更可能な、HTMLを記述することによって設定するデザインは、 eval関数を使うことによって、文字列内でも変数を普通に使えるように・・・。 やっぱり適当といえば適当な仕様です。

index.cgiの設定は、直接エディタで編集、管理CGI(manage.cgi)から操作、の2種類を用意しています。 基本的には下位互換性を確保するようにしているため、 たいていはバージョンアップをしても問題なく動作するでしょう。 管理CGIからindex.cgiへの書き込みは、地味にテンプレートのようなものを用意して、 それに代入しつつ書き込むというシンプルな方法です。 (foreachなどして多少は自動化してますが)

将来はプログラムとデザインと設定を完全に分離し、各々を別々に組み合わせられるように・・・。 JavaでいうMVCモデルみたいなものを使うのかな?。 もっと勉強&思案しないと。。

文字コード

早くから(β04から)MireilleはEUC-JP決め打ちで書かれています。 Shift_JISのエスケープ問題や、Perl自体の日本語対応の不完全さを補うためです。 例えば検索部のコードは変なところでマッチしないようにEUC-JP決め打ちで処理を行い、 日本語処理に際しての不具合が出ないようにしています。 ただ、このままだと多国語化できないので、将来的にはPerl5.8+Unicodeに移行したいのですが。。。

メモ

ちょっとしたメモなのです。

語句強調・自動リンク・記事参照

特にこれを売りとしてはいませんが、何気にかなり手をかけている部分だったりします。

まず、語句強調は何が難しいって、強調すること自体はさして難しくはないのですよ。 設定に応じて正規表現で置換するだけですからね。 問題はMireilleに修正機能が存在することです。 修正する際には強調する前の状態に戻してTEXTAREAに表示しないといけません。 ここは苦労しました・・・。

また自動リンクの精度をあげるのも大変です。 ベースはこのテキストの末尾にも載せてある、Perlメモさんのところの断片なのですが、 これがよくできたもので、 <STRONG title="http://www.airemix.com/">http:www.airemix.com/</STRONG> などという文字列があるとき、ちゃんと">http:www.airemix.com/</の部分だけに、 リンクを張ってくれるんです。

ただ、ここでも修正機能が話を複雑にします。 <IMG src="http://www.airemix.com/airemixb.png">Airemix 最初にという文字列があったとすると、IMGタグを許可していない場合にはタグが無効化されて、 &#60;IMG src=&#34;http://www.airemix.com/airemixb.png&#34;&#62;Airemix となります。ここで、 http://www.airemix.com/bbs/index.cgi?icct&page=1 などの&とエスケープ後の.png&#34;&の区別がつけられなくなります。

記事参照機能というのは、 「>>No.113」などとすると、その掲示板の113番スレッドにリンクが張られ、 「>>No.113-5」などとすると、その掲示板の113番スレッド子記事5にリンクが張られる機能です。 比較的早くからある機能ですが、今まで文章化されていなかった機能だったりします。

セキュリティ

一応意識してはいます。 そのまま他のCGI/Perlのセキュリティホールを指摘してしまうことになるので、 具体的に、どこをどのように気をつけているか、は書きませんけど、、

ちなみに、現在Mireilleに存在するセキュリティホールでは、 管理CGIの設置場所が他者に漏洩する、というものがあります。 あくまで潜在的なものであり、直ちに被害が出うるものではありませんが・・・。 なにはともあれ、管理CGIは危険なのでこまめにWeb上から削除するようにしましょう。

(gzip実行部分は`...`を使うよりsystem()の方がいいのかな?) (open $fh,"-|" or exec{$cmd}@cmd;はWindowsだと効かないのだ。。)

ID属性とNAME属性と

後方互換性のためINPUTやTEXTAREAにはID属性とNAME属性を両方つけています。 そのため、名称はID属性とNAME属性の両方の制限に縛られます。

ID  : /[A-Za-z][-.:\w]*/にマッチするもの、大文字小文字を区別する
NAME: CDATA、大文字小文字を区別する(HTML4), NMTOKEN(XHTML1.0)

MireilleがHTMLとして出力する時には基本的に英大文字は使いません。

また%INや%CKでkeyが英大文字から始まるものは内部処理用です。 FORMから引数を取得する際も英大文字からはじまるものは読み込みません。

Mireilleは重い?

簡単に調べてみましたが、重いかもしれません。 原因は投稿フォームや記事表示にevalを使っているからでも、LogDir方式だからでも、 アイコンリストが肥大化しているからでもなく、(これらは思ったよりも軽い) 連発しているuse群のようで、特にuse Fcntlが重い模様・・・ 実際にコメントアウトすると、(Fcntlだけ外すとエラーになるのでuse Strictも外す) 新規投稿フォームの表示が約1CPU秒から約0.5CPU秒になりました。

ちなみにFcntlが影響を与えるのはsysopen関数とflock関数を使っているところです。 (結局Fcntlは外してしまいました) (それでもsylpheedには勝てません) (多少重くてもHTTP転送の負荷で無視できるだろう、と)

そうそう、HTMLは重いと思います。 短い記事が多いと、HTML全体のバイト数が記事本文のバイト数の倍になる、ということもあるようです。 いわゆるシンプルビューは少なくともv1.3までは実装しません。 (やっぱりevalの負荷も大きそう。。) (それでもローカルのHTML解析-表示のラグで消えますけど) (とある方からダメだしを受けたので、1.2.7において、多少HTMLを軽くしました。)

アイコンカタログCGIは重い?

これは思ったよりも重くありません。 本来の記事表示よりも軽いくらいですね。(アイコン700個の場合でも)

文字の範囲

# EUC-JP文字
[\x00-\x7F \x8E\x8F     \xA1-\xFC-\xFE]
# SJIS文字
[\x00-\x7F-\x8E\x8F\x90-\xA1-\xFC     ]

判定用としては、「空(EUC:\xb6\xf5 SJIS:\x8b\xf3」よりも、 「改(EUC:\xb2\xfe SJIS:\x89\xfc)」の方が適任かな? <- EUCの「空(\x8bf3)」は、 SJIS文書内で「半角カタカナの"カ"+外字の1byte目」として現れるかもしれないからと、 この文字だけでは判定してくれないことがある。。

Perlソース内のコメント

意識して書くようにしているので世の中でもコメントが多いほうではないでしょうか・・・。 r1.2.2.17のcore.cgiではコメントだけで19KBあるようです(ぉ。 まぁ、そのおかげで1年以上時々ブランクあけながらも修正できたわけですけどね。 コメントがなかったら絶対内容忘れていますww ちなみにコメントが他の場所と比べて明らかに少ないところは、あまり変更していないところです。 (変更しない→コメント書かない→忘れて変更できない→コメント書けない・・・)

あと=item〜=cutという所が結構ありますが、POD文書ではないです。 あくまで複数行にわたるコメントとして使っているのであって、それ以上でも以下でもありません。

連続投稿の防御

こう見えて一応やってます、いちおう0.cgiの2行目がそれで、 「スレッド番号:記事内容のCRC32:返信番号」 を保存し、それと新たに来た投稿とを比べることによって行っています。

HTML規格上は閉じタグを省略したり出来るけど、

Mireilleでは面倒なので基本的にタグの省略、属性引用符の省略などには対応していません。 また、引用符は基本的に " を想定しています。 ひねった方法で書くと、処理を通した時に、タグの構成が崩れるかもしれません。

属性セレクタ

CSS2ではこれによって

INPUT.submitover → INPUT[type="submit"]:hover

などとできるのだけど、IE6でも対応していないの。 今でも IE5=behavior/N6=属性セレクタ でいける? (面倒すぎて事実上いけないようなので諦めました)

アイコンリスト編集#

Marldiaの表情アイコンとの互換性を保つ目的で、 マッチングを/^\s*([^#]+(?:#\d+)?)\s*\#\s*(.+)$/で行っているため、 「hoe.png#uso#800」は「<OPTION value="hoe.png#uso">800</OPTION>」になりますが、 「hoe.png#777#slot」は「<OPTION value="hoe.png#777">slot</OPTION>」になります。

更新制御コマンド

主に修正時に、記事を更新したことがわかるようにします。

dnew
記事の投稿日時を更新します
znew
スレッドの最終変更日時を更新します
renew
dnewとznewを同時に行います

最大子記事数で使っている変数の名前

maxChildrenでなく、maxChildsになっているのは仕様です。 「ChildArticles」略して「Childs」なんです。

スレッドのロック機能

「lockThread = (all| (revise|delete).. )」 スレッドをロックします。 管理パスワードか、親記事のパスワードを使って、 ロックしたいスレッドに返信するとロックできます オプションを指定しない場合は、そのスレッドに対する返信がロックされます。

all
全てのオプションをオン
revise
修正をロック
delete
削除をロック

記事のロック機能

「lockArticle」コマンドで記事をロックできます。

署名

パスワードかコマンドで指定された元文字列を、CRC32->Crypt->CRC32としてからログに保存し、 表示時にまたCRC32やCryptしたりして表示します。 総当り対策のため、r1.2.9.20から表示結果には名前の情報が使われるようになりました。 現行では表示結果の署名から元の文字列を推測するのは、たとえ総当りを使っても無理・・・のはず。

NGワード

指定した文字列が本文含まれる場合はじきます。 ただ、文字参照を使ったりで回避できるのはご愛嬌。

隠し機能として$CF{'itemsCheckingNGWords'}でチェックする項目を決められます。

日時形式あれこれ

ISO8601やらRFC822やらRFC2822やらと、日時に関する取り決めはいくつかあります。

現在の“標準”は Combinations of date and time of day として、 ISO 8601の§5.4で定義されたもののようです。 形式は「1970-01-01T00:09:00+09:00」となります。(UNIXepochの時刻を表す場合) 同じものが XML Schema Part 2: Datatypes でも dateTime として定義されています。

HTTPで主に使われるのはこれと異なり、RFC822っぽいもの、です。 「Thu, 01 Jan 1970 09:00:00 GMT」 実際はRFC1123の形式でやり取りされている・・・みたいです。 HTTP関係は規格が定まる前に好き勝手やっていたものなので、色々と難しいみたい。 Last-Modifiedはこの形式でやり取りする模様。

Cookieでexpiresの値として使う形式はまた異なります。 「Thu, 01-Jan-1970 09:00:00 GMT」 と、微妙に上の形式と違います。 CookieもNetscape社が独自に実装し、それを他社が真似た物なのです。 ≪http://www.netscape.com/newsref/std/cookie_spec.html≫ 別にちゃんとRFCでCookieが仕様として策定されているのですが、黙殺されています。

環境変数のTZは日本だと普通は JST-9 でよいとされています。 "set TZ=JST-9" / "$ENV{'TZ'}='JST-9';" タイムゾーンをあらわす文字列は多々存在し、日本時間を表すものとして。 「JST-9」「I」「V」「+0900」「+0900 (JST)」「+09:00」 などなど、Iは-9時間、Vは+9時間を表すようですが、 悲しいかな+/-が混同されたようであったも参考程度にしかならないとか。 数字で書く方では基本的に日本は + です。 「JST-9」が - なのは、日本時間から-9時間すると協定世界時になる、との意とか。 ≪http://www.microsoft.com/JAPAN/developer/library/vccore/_crt__tzset.htm≫

JSTの他にESTとかPSTとかあるけど、LT(LunaTime)やMT(MarsTime)なんてあるのね;)

タイムゾーンをあらわすのに+/-どちらを使うかは慎重にしましょうと。 基本的には標準子午線より東側において、環境変数では - 、W3C系では + のようです。

ブラウザメモ&愚痴

非WindowsなブラウザはMac OS X Browser Comparisonのコメントを引用しています。 ≪http://www.hut.fi/u/hsivonen/os-x-browsers.html≫

WinIE
ver6で主に動作確認をしていますが、ver5.01でもたまにしています。 WinIE5.0では巨大なスレッド(Res50を超える)だと、スレッドDIVのボーダーが部分的に消えます。 WinIE4では巨大なスレッドだと、部分的に記事が見れなくなります。 OPTGROUPにはver6から一応対応、将来的なツリーメニュー型への変更を期待しています。 常に期待の80%以上は動いてくれるので結構使える。
MacIE
多くの場合盲点になりがちなこのブラウザ。 ver4未満では使えないともっぱらの評判でしたが、ver5になってかなり使えるようになっています。 なんと記事ナビも普通に動いてくれます。(半透明化は流石に無理、強引にやろうとすると落ちる) Mireilleのバージョンによって表示が崩れたします。 OPTGROUPが有名どころのブラウザで唯一ツリーメニュー型なのがうれしいところ。 侮れないくらいに使えるのだけどMacだから触れる機会が稀。
Mozilla
MSIEと同様(?)に「自分が標準」という強い自負があるのですよね。 実は独自拡張も結構しているのです。(XUL関連を除いてもまだまだ) OPTGROUPには一応対応、ツリーメニューへの変更を期待しています。 期待の90%以上動いてくれるけど妙なところが抜けていて結構重い。
Netscape6,7
ブラウザの名称も"NetscapeNavigator6"でなく、"Netscape6"です。 ちょっと付録が多すぎて邪魔、特にAOLIMを強制添付するのはMSより悪質。 表示機能はMozillaに準ずるので省略します。
Phoenix, K-meleon, Chimera, Galeonなどなど
Geckoエンジンのブラウザ、NetscapeやMozillaオリジナルよりも、 これらを使ったほうが使い勝手が良い場合が多いです。 表示機能はMozillaと同じ。
Opera
Opera6以前では日本語に標準対応していませんでした。 Opera6で日本語に対応したのですが、JavaScriptやDOMの実装が穴だらけ・・・。 それでもOpera7でinnerHTMLやOPTGROUPに対応し、 W3C標準の実装においては、一部Mozillaより進んでいるところもあるくらいで、 やっと機能的にも「第三のブラウザ」と名乗れるくらいになってきたかもしれません。 まだ記事ナビの半透明化には非対応、これはW3CによるCSS3のopacity待ちですかね
NetscapeNavigator
はやくきえてなくなれ。 1.2.3.1でCSSをN4でも使うようにしました。 おかげで邪魔なタグがたくさん・・・。 巨大なスレッド(子記事数が50を超える)だと部分的に記事が見れなくなる。
KHTML - Konqueror, Safari
(たぶん)ほどほどに動きま(す|した)。 意図的に弾くようなことはしていないので、記事ナビも動くときは動くことでしょう。 Safariでは試したことがないのですが、Konquerorに順ずるんですよね?
iCab
Macintosh向けです。 昔はiCabが「第三のブラウザ」と呼ばれていた、と記憶しています。 最近は“CSS support badly broken”なので、だめっぽ。。
OmniWeb
“Doesn't support HTML 4 and CSS1!”うーん。。
Amaya
あのW3C謹製のWebブラウザです。 が・・・はっきり言ってヲタブラウザです(ぉ。 Amaya6.2にてやっと日本語表示に対応したのですが、大抵の日本語サイトでは表示しようとすると、 ちょっと頑張っている様なそぶりを見せた後に、さくっと落ちます(笑。 OPTGROUPをツリーメニューにして表示してくれるのはうれしいのですけどね。 次のバージョンではまともに動くのでしょうか。 (Amaya6.3ではAiremixやMireilleを見れるようになりました、でも数分で落ちます) (Amaya7.0でも数分で落ちます) (Windows移植のためのライブラリが不安定なのかも。Linuxとかだとどうなのでしょう?)
Lynxとかw3mとか
勘弁してくださいw 積極的に対応作業をすることはありませんが、変更すべき点のリストをくださればマージはします。
i-modeみたいな
「待っていれば、そのうちWinIE/Mozillaみたいに表示してくれるようになるだろう」 と、とことん様子見とすることが内定しました。 (何度か需要調査したけど反応皆無だったのです)

パーミッション覚書

世の中のサーバーには3種類ある。 suEXECが有効になっているApache、suEXECが無効になっているApache、そしてその他。

Apache with suEXEC
Apache with suEXEC
その他
まずWindows+Internet Infomation Serverだと考えてよいでしょう。 Windowsはパーミッションの概念が曖昧なので、特に気にしなくても何とかなります。

サーバー別情報

ccsnet.ne.jp
biglobe.ne.jp
cool.ne.jp
infoseek.co.jp
tripod.co.jp
sakura.ad.jp
mixedmedia.net
cside.jp
tok2.com
tukaeru.net

技術

条件分岐コメント
CSS Enhancements in Internet Explorer 6

≪http://msdn.microsoft.com/library/en-us/dnie60/html/cssenhancements.asp≫

Keyword Values of the Font-size Property:
With earlier versions of Internet Explorer, these values are not defined intuitively. The medium value is not the default normal font size; small is the default.
TABLE Elements Inherit Text Properties:
TABLE elements inherit the value of text properties from their parents. These properties include color, font-size, font-weight, font-style, font-variant, text-decoration, text-transform, letter-spacing, and line-height. With earlier versions of Internet Explorer, for all of the text properties of TABLE elements except the font-family property, set all text properties to the settings on the BODY element.
Width and Height of Inline Elements:
Inline elements such as SPAN, B, and I do not support width or height properties. If you want to set the width or height property of an inline element with standards-compliant mode switched on, you must set the display property of the element to inline-block.
透明度指定
「Transparency: the 'opacity' property」 ≪http://www.w3.org/TR/css3-color/#opacity≫
userData
Microsoft Internet Explorerの独自技術 ≪http://msdn.microsoft.com/workshop/author/behaviors/reference/behaviors/userdata.asp≫
DOMUserData
DOM Level 3 Core WD2003-06-09にUserDataが取り込まれていました。 どのようなものになるかは、まだわかりませんが、一応覚書として。 ≪http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030609/core.html#DOMUserData≫

品質特性(ISO/IEC9126)に基づく自己分析

1 機能性 Functionality

1.合目的性 Suitability
管理CGI周りで不必要な機能が存在する可能性あり
2.正確性 Accuracy
おおむね達成できていると思われる
3.相互運用性 Interoperability
おおむね達成できていると思われる
4.セキュリティ Security
Mireille本体は、おおむね達成できていると思われる 管理CGIは多少難ありか
5.機能性適合性 Functional compliance
HTML4.01Strict - 一部不適格 CSS 1or2 - 一部不適格 日本国法律 - 未調査

2 信頼性 Reliability

6.成熟性 Maturity
まだまだ先長し
7.障害許容性 Fault tolerance
おおむね達成できていると思われる
8.回復性 Recoverability
おおむね達成できていると思われる
9.信頼性適合性 Reliability compliance
未調査

3 使用性 Usability

10.理解性 Understandability
今のMireille.htmlはまだ不十分かな?
11.習得性 Learnability
CGIが使える人なら使えるはず
12.運用性 Oprability
CGI掲示板に「運用」というほど大げさなことはあるのかな
13.快適性 Attractiveness
達成できていると思われる、この部分最優先でやっているわけだし ただ、IE5orLater/N6/Mozilla以外だと微妙
14.使用性適合性 Usability compliance
未調査

4 効率性 Efficiency

15.時間効率性 Time behavior
FANTASiXさんのSylpheedには負けるけど・・・ おおむね達成できていると思われる
16.資源効率性 Resource utilisation
CGI/Perlごときで資源云々言うのもよくわからないけど、 おおむね達成できていると思われる
17.相効率性適合性 Efficiency compliance
未調査

5 保守性 Maintainability

18.解析性 Analysability
コメントはたくさんつけているつもり。 少なくとも成瀬は解析できる (いわゆる「自分でも読めない味わい深きスパゲッティ」にはなっていないw)
19.変更性 Changeability
スクリプトですからそれは当然、解析できるわけだし
20.安定性 Stability
JavaScript周りに難あり むしろ現在進行形でMozillaはOperaは・・・ Perl5.6--5.0間でもたまに発生する
21.試験性 Testability
気合があればローカルで
22.保守性適合性 Maintainability compliance
未調査

6 移植性 Portability

23.環境適合性 Adaptability
Perlが動けばMireilleも動く、はず(flockも回避したし
24.設置性 Installability
ほどほど、かな パーミッション周りは一度はまると泥沼になるのだ
25.共存性 Co-existence
完璧、というかCGI/Perlで共存できないように作るほうが難しいと思われ
26.置換性 Replaceability
数件ログデータの移行も含めた実績あり ログデータの移行を考えなければ数多 #数多・・・見栄張ってますw
27.移植性適合性 Portability compliance
未調査

お世話になったところ

Academic HTML

HTML,CSSに関する的確な情報がたくさんあります。 HTML,CSSを一通り学びたい場合はここを見るだけで事足りてしまいます。

≪http://www.tg.rim.or.jp/~hexane/ach/≫

Another HTML-lint

HTMLの検証に際し利用しました。 初めてチェックすると、ほとんどの人がショックを受けることでしょう。

≪http://openlab.ring.gr.jp/k16/htmllint/≫

ARTEMIS

IconPreviewはここからです、便利なので頂きました。 新しい投稿があると教えてくれる〜もここのを見て、です。 他にもいろいろと参考にしています。 管理機能でここを見習う点は数多くあります。

≪http://www.artemis.ac/arrange/≫

HTML鳩丸倶楽部

ツッコミメインなHTML解説サイト、にわたしは見えました。 「HTML 4.01 のみを、純粋に学問的な興味から研究」しているそうです。 HTMLの構成に際して参考にしました。

≪http://www.ne.jp/asahi/minazuki/bakera/html/hatomaru≫

jcode.pl

漢字コード変換用のライブラリです。 Mireille本体では横着しているので使っていません。 管理CGIでは一部を切り出して使っています。

≪http://www.srekcah.org/jcode/≫

Jcode.pm

jcode.plの後継でPerl5用PerlModuleとなっています。 jcode.plの機能にUnicodeを扱う機能が追加されています。

≪http://openlab.ring.gr.jp/Jcode/index-j.html≫

KENT-WEB

なにはともあれ日本のCGI/Perl界に与えた影響は少なくはないはずです。 わたし個人では特にYYBOARD,YYCHATにはお世話になりました。 きわめてとっつき易いCGIが多いです。

≪http://www.kent-web.com/≫

Perlメモ

URI自動リンク機能をつけるに際し参考にしました。 Perlの正規表現に関してとても有用な情報があります。

≪http://www.din.or.jp/~ohzaki/perl.htm≫

W3C HTML Validation Service

HTML規格の策定を行う団体、W3CによるHTML検証サービスです。 Another HTML-lintよりチェック項目は少なめです。

≪http://validator.w3.org/≫

とほほのWWW入門

HTML部、Perl部ともに時々リファレンス代わりにしました。 なかなか載っていて便利です。

≪http://tohoho.wakusei.ne.jp/≫

彼の野原

LastPostはここのealisの真似です。 またRev:1.2.2の記事ナビは神乃さんのものベースに作りました。 最近ではPHPに移ってあるべき姿というものを模索していらっしゃるようです。

≪http://kano.feena.jp/≫

SWORD AND COMMERCE

retroさんにはMireilleでつまづく所No.1と思われるアイコン設定の解説を書いていただきました。 他にもMireilleの解説の不備な点を多数してもらいました。 ちなみに、retroさんのサイト自体はRagnarkOnline系雑談サイトです。

≪http://www10.plala.or.jp/ryokufuudou/kijindou.html≫

Snowish Hills

Mireilleを作りこむにあたって、半ばオンサイト顧客として、数々の有用なアドバイスを頂きました。 特に管理CGIは西名さんに言われなければ、かなり貧弱なものになっていたでしょう。 現在の初期状態のデザインも西名さんのデザインをベースにしています。 ちなみに、西名さんのサイト自体はKey系CGサイトでした。

相談に乗ってもらったり、ツッコミ・要望・バグ報告をもらったり、普及に貢献してくださった方々

imac零式さん、幽霊猫さん、西名さん、神乃さん、Bさん、TAKE4さん、かろかろさん、xbomさん、retroさん、秋宗さん (ある程度ツッコミを入れるとここに晒されるのですw)

他にも意見を下さった方々、参考にしたサイト・CGIの作者さんに感謝します

Copyright

Copyright (c) 2001-2003 NARUSE,Yui (Airemix). All rights reserved.