目次
関連ページ
このページの目次
pyukiwiki-classic-0.1.9とIIS
- 職場のイントラネットサーバーのサーバソフトが、従来のapacheからwindowsベースのIISに変更された
- それに伴い、CGIの各種プログラムの文字コードとして、従来使用可能であったEUCが使えなくなり、SJISまたはUTF-8が指定された
- 従来のサーバでは「PyukiWiki Classic 0.1.9」でwikiページを構築していたが、EUC版であり、UTF-8版がない(というか、この名称の版はダウンロードサイトに見当たらなくなっている。)
- pyukiwiki0.1.9-nekyoが近いかも。
- 「pyukiwiki.ini.cgi」に文字コードをUTF-8にする設定があるが、これを行って、各cgiのプログラムファイルをUTF-8で保存しても、上記SJIS・UTF8縛りのIISでは作動しなかった(「500」のエラーが出る。)。
- メインプログラム(index.cgi)の動作を逐次調べていったが、ちょっとした正規表現による置換を行う行などで原因不明のエラーが発生していたりして(この行をはずすと次の行まで動作が進む)、修正しきれない。
pyukiwiki-0.2.0p3-UTF8
- そこで、pyukiwikiの最新バージョン(といっても2012年開発版)であり,UTF-8コードに対応した「0.2.0-p3-utf8」をサーバにインストール(というか展開)し、従来の版で生成したページのデータをすべて移行することにした
- と、簡単にいうものの、pyukiwikiでは作成ページや添付ファイルのファイル名が、ページ名や添付ファイル名に漢字など多バイトコードを含むことを前提として、16進数変換した形で保存されている。この変換が、従来のEUC版pyukiwikiであればEUCのコードに対応した16進コードに変換されるし(漢字など2バイト文字は4桁の16進数に変換される)、今回インスコしたUTF-8ベースのものであれば、UTF-8のコードに対応した16進コード(漢字など2バイト文字は6桁の16進数に変換される)に変換されるので、移行にあたっては、旧版で作成したページ・添付ファイルの名称すべてを変更する必要が生じ(これはExcelVBAなどで実行可能)、さらに、旧版で作成したページはEUCコードのテキストファイルになっているので、これを「TeraPad?」などのエディタで個別に手動でUTF-8に変更する作業が必要となり、移行に踏み切る際には相応の覚悟が必要。
- pyukiwiki新版には移行ツール(convertutf8)が付属しているが、いまいち使い方がわからない。
- ファイル名の変更はVBAなどで自動化できるが、ページのテキストファイルのコード変換は、職場の場合ユーザー側でアプリをインストールできないので、多ファイルを自動変換するツールを使えないため、手作業になる(これもVBAやperlなどでできると思うが、20〜30ページぐらいなら手作業の方が速そう
プログラム(CGI)ファイルの文字コード
- なぜか当該pyukiwikiのUTF-8版では、メインプログラム(index.cgi)がSJISで書かれており、pyukiwiki.ini.cgiはUTF-8、各プラグインはSJISと、コードがマチマチ。
- これが原因で、#refプラグインにおいて、全角交じりの添付ファイル名の表記が文字化けした。これは、refプラグインのプログラムファイルをUTF-8に変換して保存することで解消した
pyukiwiki-0.2.0p3-UTF8とIIS
作成ページ・添付ファイルのファイル名
- EUC版で作成したページは、EUCに対応した2バイトコードを16進表記したファイル名になっているので、そのままではUTF8版で読めない
- 新版の「wiki」フォルダにコピーする際に、ファイル名をUTF-8の16進コードに書き換え、さらに中身もUTF-8に変換する必要がある
- UTF-8では、より多言語に対応するため、日本語の2バイトコード文字(全角文字)は、3バイト表記となる。そのため、全角文字を16進表記した場合には半角6文字になり、著しくファイル名が長くなる
- 一方、IISはwindowsベースであるためか、パス名+ファイル名の全長は255文字まで、ファイル名自体は150文字までしか認識しないっぽい。(コピーする際にファイル名が長すぎる旨のエラーが出る)
- よって、従前のEUC版で作成したページや添付ファイルのうちフルパス名やファイル名が長くなる一部のものが、そのままの名称では移行できなくなった。
- 旧版の各ページや添付ファイルのファイル名は、EXCELのVBAで文字コード変換とコピーを行うプログラムを作成してUTF-8に変換した上で新版の対応フォルダにコピーした。
画像ファイルの表示
- ブラウザで画像を表示する場合に画像ファイルのファイル名は任意で、「<img src="URL"・・・」で指定されたURLの画像ファイルの先頭コードを読み取って画像フォーマットを判別して表示するのだが、どうやら職場のIISでは、セキュリティ対策のためか、「jpg」など画像の拡張子を持たないファイルは表示しないように設定されているよう。
- pyukiwikiでは、添付ファイル名は拡張子も含め16進表記化されるので、拡張子を持たない。なので、この環境下ではそのままでは画像ファイルを添付して#refで参照しても、画像は表示されない。(クリックすればアプリが起動して対象を表示することができるが)
- すべての添付ファイルを拡張子は16進変換せずに保存するのがファイル容量も小さくベストだが、#refで添付画像を参照する際には、imgタグでの画像表示のほか、クリックした場合にはattachプラグインが起動して画像を表示する仕様になっており、attach用の画像ファイルURL表記は、imgタグへの表記とは異なっている(16進コード間に%が挟まるエンコード)。その他、非画像添付ファイルの#ref参照にも影響が出るため、プログラムの変更箇所が多くなり、間違いが生じやすい。
- そこで、安易な解決法として、添付ファイルが画像ファイルである場合にだけ、別途拡張子付きのファイルも元ファイルからコピーして保存するようにし、imgタグで参照する際には該拡張子付きのものを参照するようにすることを考えた。
- attach.inc.plの、添付ファイルアップロードルーチンである「sub attach_upload」の最後に、下記#koala-- 〜 #--koala を追記
- #koala2-- 〜 #--koala2 は、添付成功後の表示で、タイトルに続けて、「#ref(添付ファイル名,ページ名,100%)」という#refで添付画像を参照するためのコードをコピペ用に表示するための改変
if($flag eq 0 && $::AttachFileCheck eq 1) {
unlink $obj->{filename};
return ('msg'=>"\t$::resource{attach_plugin_err_ignoremime}",'body'=>&attach_form);
}
&send_mail_to_admin($::form{mypage}, "AttachUpload", $ffile);
#koala--
my $gazoufilename = "";
my $filename2;
$gazoufilename = gazou_file($obj->{filename});
if ($gazoufilename eq $obj->{filename}) {
$filename2 = "";
} else {
$filename2 = $gazoufilename;
}
use File::Copy 'copy';
if ($filename2 ne "") {
copy ($obj->{filename} ,$filename2}
}
#--koala
#koala2--
return('msg'=>"$::form{mypage}\t$::resource{attach_plugin_msg_uploaded}\n\#ref($ffile2\,$::form{mypage}\,100%)", 'body'=>&attach_form);
# return ('msg'=>"$::form{mypage}\t$::resource{attach_plugin_msg_uploaded}", 'body'=>&attach_form);
#--koala2
}
- attach.inc.plの「sub attach_upload」のあとに、下記、画像ファイル名末尾の拡張子を16進変換からナマ表示に戻すサブルーチンを追加(かなり強引)
#koala--
sub gazou_file {
my $gazou0 = shift;
$gazou0 =~ s/2E474946$/\.GIF/;
$gazou0 =~ s/2E676966$/\.gif/;
$gazou0 =~ s/2E6A7067$/\.jpg/;
$gazou0 =~ s/2E4A5047$/\.JPG/;
$gazou0 =~ s/2E7A6E67$/\.png/;
$gazou0 =~ s/2E5A4E47$/\.PNG/;
$gazou0 =~ s/2E6A706567$/\.jpeg/;
$gazou0 =~ s/2E4A504547$/\.JPEG/;
return $gazou0;
}
#--koala
- ref.inc.plの「sub plugin_ref_body」の300行付近に下記#koala-- 〜 #--koala を追記
$title = &htmlspecialchars($name);
my $file = "$::upload_dir/" . &dbmname($page) . '_' . &dbmname($name);
my $file2 = "$::upload_url/" . &dbmname($page) . '_' . &dbmname($name);
#koala--
$file2 = gazou_file_ref($file2)+
#--koala
if (!-e $file) {
$params{_error} = 'file not found.' . $file;
return %params;
}
- ref.inc.plの「sub plugin_ref_body」のあとに、下記画像ファイル名末尾の拡張子を16進変換からナマ表示に戻すサブルーチンを追記
- 上記attachプラグインに追記した sub gazou_fileサブルーチンと同じ。常に実行されるindex.cgiに作成しておけばダブって追記する必要はないが、プラグインごとに完結していた方がわかりやすいので、敢えてこうした。
#koala--
sub gazou_file_ref {
my $gazou0 = shift;
$gazou0 =~ s/2E474946$/\.GIF/;
$gazou0 =~ s/2E676966$/\.gif/;
$gazou0 =~ s/2E6A7067$/\.jpg/;
$gazou0 =~ s/2E4A5047$/\.JPG/;
$gazou0 =~ s/2E7A6E67$/\.png/;
$gazou0 =~ s/2E5A4E47$/\.PNG/;
$gazou0 =~ s/2E6A706567$/\.jpeg/;
$gazou0 =~ s/2E4A504547$/\.JPEG/;
return $gazou0;
}
#--koala
パラメータ設定ファイル(pyukiwiki.ini.cgi)の設定
各ディレクトリのパス
- cgiのルートはcgi-binの直下にあるとのことなので、試行錯誤の結果、下記のとおり各ディレクトリのパスを設定するとうまく動作した
- pyukiwikiは、cgi-binの直下に「pyukiwiki」というディレクトリを作成し、そこへpyukiwikiを展開している状態(pyukiwikiディレクトリの直下にindex.cgiや、「plugin」などの各ディレクトリを配置)
- 「通常は変更しないで下さい」というbin_homeのパスを変更しなければならなかったり、data_urlだけルートに設定しなければならなかったりとまちまちで、正解を見つけるのに苦労。
# データ格納ディレクトリ
$::data_home = './pyukiwiki'; # CGIからのみアクセスするデータのディレクトリ
$::data_pub = './pyukiwiki'; # ブラウザから見れるデータのディレクトリ
$::data_url = '.'; # ブラウザからの絶対・相対ディレクトリ
$::bin_home = './pyukiwiki'; # 通常は変更しないで下さい
フィルター関連
- イントラネットであれば、いたずらは起きないので、下記フィルター関連ははずしておくほうがよい。
- はずさないと、ちょっとURLの参照が多いページを作ったりとかするとエラーが出てしまう。
# フィルター関連
$::filter_flg = 0; # 1でフィルター機能を有効にする。
$::chk_uri_count = 100; # 旧オプション
$::chk_wiki_uri_count = 100; # 編集画面でホームページアドレスが
# 10個以上になるとスパムとみなす。
$::chk_article_uri_count = 0; # 掲示板等でホームページアドレスが
# 1つ(個数)でもあるとスパムとみなす。
$::chk_article_mail_count = 0; # 掲示板等でメールアドレスが
# 1つ(個数)でもあるとスパムとみなす。
$::chk_write_jp_only = 0; # 編集画面で日本語が一字も入ってないと
# スパムとみなす。
# なお、デフォルトはプラグインだけや
# ソースファイルや英語等のページを作れる
# ようにOFFにしてある。
$::chk_jp_only = 0; # 掲示板、コメント等に日本語が一字も
# 入っていないとスパムとみなす。
$::deny_log = "$::cache_dir/deny.log";
# ログファイル。
# 指定されているとログを取る。
# 無くても問題ない。
$::black_log = "$::cache_dir/black.lst";
# フィルターフラグが付いているときの
# ログ出力先
添付ファイル容量
- 初期値では最大添付ファイル容量($::max_filesize )が1MB($::max_filesize = 1000000)設定されているので、ちょっとした文書や画像が容量オーバーで添付できないため、性善説に立てるイントラネットなどでは、足りないと思う場合は例えば十倍程度に変更しておくといい。
pyukiwiki 0.2.0 p3 UTF-8の不具合調整
- このサイトが利用しているver.0.1.9classicと比べると、バグも少なく、ページや添付ファイルの全角文字対応もできていて、改良の跡がうかがえる
見出し行右端のページトップへジャンプするリンク付き矢印(↑)が機能しない件
- 職場の環境(IISのイントラネット)だと、見出し行右端のページトップへ戻る矢印(↑)が機能しない。
- この矢印には、wiki.cgiにおけるhtml生成処理(sub text_to_htmlサブルーチン)で、表示中のページのURL末尾に「#navigator」を付したURLがリンクされており、クリックすることで、pyukiwiki.skin.cgiによって生成されるページ上部の「<div id="navigator">」タグまでジャンプする(この部位を再表示する)ようになっている。
- 矢印部分のタグ例(「&uarr」は矢印)。URLのページ名は全角のままになっている
<div class="jumpmenu"><a href="/cgi-bin/pyukiwiki020p3/index.cgi?整形ルール#navigator">↑</a></div>
- これは自宅イントラネットのapache環境下では、ページ名が全角を含んでいてもちゃんと機能するが、職場の環境では、全角を含むURLがいけないのか、クリックするとFrontPage(index.cgi)に戻ってしまう。
- 下記のようなエンコードしたURLをリンクさせればいいのだが、
http://・・・・/cgi-bin/pyukiwiki020p3/index.cgi?%E6%95%B4%E5%BD%A2%E3%83%AB%E3%83%BC%E3%83%AB
- この部分のwiki.cgiのコードは下記のとおりで、環境変数など種々の変数が入っていて面倒くさそう
my $hedding = ($tocnum != 0)
? qq(<div class="jumpmenu"><a href="@{[&htmlspecialchars($::form{cmd} ne 'read' ? "?$ENV{QUERY_STRING}" : &make_cookedurl($::pushedpage eq '' ? $::form{mypage} : $::pushedpage))]}#navigator">↑</a></div>\n)
: '';
- かといってこの部分を、直接ページトップに戻らせるべく下記のようにアンカーを指定しても、
-
my $hedding = ($tocnum != 0)
? qq(<div class="jumpmenu"><a href="#top">↑</a></div>\n)
: '';
とか
my $hedding = ($tocnum != 0)
? qq(<div class="jumpmenu"><a href="#navigator">↑</a></div>\n)
: '';
- headブロックで下記のとおりbase hrefの設定をしているので、
<base href="http://・・・・/cgi-bin/pyukiwiki020p3/index.cgi">
http://・・・・/cgi-bin/pyukiwiki020p3/index.cgi#navigator
- そこで、発想を変えて、矢印をクリックするとこの表示中のページのURLを取得し、その#navigatorアンカー(ページトップ)を表示するjavascriptの命令を実行するように仕組んでみたら、職場環境下ではうまくいった
- まず、pyukiwiki.skin.cgiのheadブロック内(headブロックでロードされている外部のjavascriptファイル内でもいいが、圧縮されていて読みにくく加工しにくいので)に、表示中のページのURLを取得し、その#navigatorアンカー(ページトップ)を表示するjavascriptの関数を設定する。
<script type="text/javascript">
function Ueemodoru() {
windows.location.href = windows.location.href + "#navigator";
}
</script>
- そして、wiki.cgiの上記「sub text_to_html」サブルーチン部分を下記のとおり書き換えると、とりあえずページトップへのジャンプをしてくれるようになった。
my $hedding = ($tocnum != 0)
? qq(<div class="jumpmenu"><a href="javascript:void(0);" onclick="Ueemodoru();">↑</a></div>\n)
: '';
- オリジナルコードではif分岐がされており、前記書き換えコードだとこの分岐が行われないが、とりあえず通常のページ表示状態であればトップへのジャンプは問題なく機能しているので、応急処置としてはOKか。
pyukiwiki 0.2.0 p3 UTF-8のカスタマイズ
画像添付時に#refの標準表記を表示する
- pyukiwikiで面倒に感じるのはファイルの添付作業。ページの編集と添付操作がそれぞれ独立していて、ファイルを添付したら、改めて編集モードで#refプラグインにそのファイル名やページ名をセットして文書中に張り込まなくてはいけないこと。
- 旧版(pyukiwiki0.1.9classic)では、添付時に、現在のページの末尾に自動的に該添付ファイル名とページ名を書き込んだ#refプラグインを追記するようにしていたが、新バージョンでは、見出し行のブロックごとに編集できるようになっていたりと、編集プラグインが複雑化していて、書き換えが面倒だったので、添付が成功すると、タイトル欄の末尾に#refコマンドを書き出して、これをコピペして編集中のページに貼りつけられるようにした。
- 改変は、添付を司るattachプラグインのプログラムファイルであるattach.inc.plにおいて、添付作業を行うattach_uploadサブルーチンの末尾を、ページ名の後に#refコマンドを書き足すように、下記#koala--〜#--koalaでくくったコードに書き換えた
&send_mail_to_admin($::form{mypage}, "AttachUpload", $ffile);
#koala--
#これがオリジナル
# return ('msg'=>"$::form{mypage}\t$::resource{attach_plugin_msg_uploaded}--",'body'=>&attach_form);
#これを下記のように「#ref($ffile2\,$::form{mypage}\,100%)」を書き足す仕様に
return('msg'=>"$::form{mypage}\t$::resource{attach_plugin_msg_uploaded}\n\#ref($ffile2\,$::form{mypage}\,100%)", 'body'=>&attach_form);
#--koala
- なお、画像の大きさを設定する縮尺パラメータ「100%」も付属させ、これをいじって表示サイズを調整することを促す表記にした。画像以外ではこの縮尺値は無視されるので、あっても問題ない。
Counter: 1439,
today: 1,
yesterday: 2