2006-10-02 (月)
■ counterlist プラグインの不具合
counterlist プラグイン について、 不具合報告のメールを頂いた。 ページを削除しても counterlist の一覧に表示されてしまうので、 それを修正してみたとのこと。
気になったのでこちらでも調べてみたところ、 確かにページを削除しても、 counter ディレクトリの下にファイルが残ってしまっている。 ところが、ページを名前変更した場合は、 counter ディレクトリの下のファイルもきちんとリネームされる。 これは、むしろ PukiWiki 本体の不具合じゃないのか?
そう考えているうちに、妙なことに気が付いた。 counter ディレクトリと wiki ディレクトリを見比べると、 上で書いたゴミファイルの分だけ、前者の方がファイル数が多そうなのに、 実際には後者の方が明らかにファイル数が多い。
しばらく考えてみて、理由がわかった。 要するに、counter ディレクトリにファイルが作られるのは、 (カウンタ設置後に)そのページに最初にアクセスがあった時なので、 それまでは counter のファイルが存在しないわけだ。 だから、その分ファイル数が少ない、と。
…ということは、もしかして、 アクセス数が0のページは counterlist の一覧に表示されていない? あわてて確認すると、まさにその通りだった。
そうしてみると、 今まで counter ディレクトリをスキャンしてページのリストを得ていたが、 単純に wiki ディレクトリをスキャンする方が良いのかもしれない。
2006-10-05 (木)
■ counterlist プラグイン Ver.1.1 の公開
counterlist プラグイン のバージョン 1.1 を公開した。 前バージョンの 1.0 と比較しての変更点は、
- 削除したページは一覧に表示しない
- アクセス数ゼロのページも一覧に表示
- カウンタを設置していないページも一覧に表示
これらの変更は利点とも欠点とも言えるので、 もしかすると機能的にはバージョンダウン気味かもしれない。
特に、最後の変更点がちょっと気になるが、 このプラグインを使うような人は全ページにカウンタを設置するだろうから、 多分問題ないだろうと思う。 その辺は、もし要望があればまた考えることにする。
2006-10-11 (水)
■ geshi.inc.php, highlighter.inc.php プラグインを公開
GeSHi と Text_Highlighter を使って、コードを色分けして表示するプラグインを2種類作ってみた。
PukiWiki でコードハイライトするためのプラグインというと、 codehighlight.inc.php という強力なプラグインが既にあるが、 codehighlight.inc.php では未対応な言語に対応していたりもするので、 まぁ無意味ではないだろう。
オプション設定などはまだ全然作りこんでいないし、 スタイルシートももう少し調整したいところだが、 基本的な部分はまとめたので、暫定的に公開してみる。
2006-10-12 (木)
■ 複数行のプラグイン引数の改行コード
highlighter.inc.php を作っている最中に、いろいろと気付いたことがあるので、 少しずつ書き記していく。 まずは、PukiWiki 関連で気付いたこと。
- PukiWiki で複数行のプラグイン引数を使った場合、改行コードは \r に変換されて渡される。
どうも挙動がおかしいなと感じたので、 複数行の引数をプラグインに渡して、 渡された文字列を bin2hex して見てみると、 改行コードが必ず 0x0d (CR, \r) になっていた。 なにこれ?
PukiWiki のコードを見てみる。 lib/convert_html.php の Factory_Div() を読むと、 どうも内部的には \r を区切り文字として使っているように見える。 さらに lib/convert_html.php を読んでいくと、 Body クラスの parse メソッドに、
$line .= "\r"; // Delimiter
のようなコードがあった。あぁ、やっぱり。
PukiWiki/1.4/ちょっと便利に/複数行のプラグイン引数を可能に/仕様検討 のページに、
引数の最後に"\r"があるかどうかで複数行引数を判定可能。
と書かれているのを見た時に、 "\n" じゃないの? と疑問に思ったが、 改行コードが \r に変換されているからこの判定方法で良いわけだ。 なるほどね。
2006-10-15 (日)
■ PEAR の Text_Highlighter のバグ?
先日に引き続き、 highlighter.inc.php プラグインを作っていて気付いたこと。 Text_Highlighter に改行コードが \r の文字列を渡すと、改行コードだと認識してくれない。 以下、サンプルコード。
<?php
require_once 'Text/Highlighter.php';
require_once 'Text/Highlighter/Renderer/Html.php';
$options = array(
'numbers' => HL_NUMBERS_LI,
);
$string = "ABC\rDEF";
$renderer =& new Text_Highlighter_Renderer_Html($options);
$hl =& Text_Highlighter::factory('php');
$hl->setRenderer($renderer);
echo $hl->highlight($string);
?>
これを実行すると、以下のような HTML が出力される。
<ol class="hl-main"><li> <span class="hl-code">ABC DEF</span></li></ol>
ブラウザで表示すると、こんな感じになる。
1. ABC DEF
一方、$string = "ABC\rDEF"; の \r の部分を \n や \r\n に変更すると、 以下のような HTML が出力される。
<ol class="hl-main"><li> <span class="hl-code">ABC</span></li> <li> <span class="hl-code">DEF</span></li></ol>
ブラウザで表示すると、こんな感じになる。
1. ABC 2. DEF
改行コードが \r の文字列が渡されることはない、 という暗黙のルールがあるのかもしれないが、 このバグっぽい仕様と、PukiWiki の 複数行プラグイン引数の改行コードは \r に変換される という仕様のせいで、かなり悩まされた。
2006-10-18 (水)
■ tDiary を 2.1.4 にバージョンアップ
ちょっと試してみたいことがあって、 tDiary を安定版の 2.0.2 から開発版の 2.1.4 に上げてみた。 作業は基本的には上書きで済んだが、 それなりに注意すべき点がいくつかあったので、 明日にでもまとめてみよう。
ただ、ざっと見てみると、6月から8月の日記の部分に限り、 「本日のリンク元」がまったく表示されていないようなので、 リンク元の情報が一部壊れたかもしれない。
一応、バージョンアップする前にデータのバックアップは取ってあるが、 原因を探るのも面倒なので、そのまま気にしないことにしよう。 あちこちいじって使っているのが原因かもしれないし。
2006-10-19 (木)
■ tDiary 2.1.4 にバージョンアップする際の注意点
tDiary を 2.0.2 から 2.1.4 にバージョンアップさせたので、その覚え書き。 基本的には上書きインストールというか、 tDiary のスクリプトの差し替えで済んだが、 その他にも細かい作業が結構必要だった。
まずは参考資料として、公式ページに載っている変更点。
次に、追加作業や注意が必要だった部分を列挙してみる。
新 Wiki スタイルが最初からインストール済み
HikiDoc を利用した新 Wiki スタイル用のファイルが最初からインストールされている。 misc/style/wiki ディレクトリにあるのは旧 Wiki スタイル用のファイル。 あやうく上書きコピーしてしまうところだった。
jdate.rb プラグインは contrib パッケージに移された
jdate.rb プラグインを使っていた場合は、 tdiary-contrib.tar.gz をダウンロードしてきて、 展開して出てくる jdate.rb を misc/plugin ディレクトリにコピー。
html_anchor.rb プラグイン用の RewriteRule を書き換える
「前7日分」といった表示が可能になったので、 html_anchor.rb プラグインを導入している場合、 20061019-7.html のような URL も変換されるように、
RewriteRule ^([0-9\-]+)\.html$ index.rb?date=$1
のように .htaccess を書き換える必要があった。
tdiarysearch は contrib パッケージ内のものを使う必要がある
tDiary 2.0.2 の時は、以前書いたように、 tdiarysearch のページ からダウンロードした最新版のスクリプトでないと動かなかったが、 それを使用すると内部サーバーエラーになった orz
contrib パッケージに含まれている search.rb に戻してみたところ、 何だかよく分からないが動くようになった。
refedit.rb プラグインは refedit2.rb に差し替える
refedit.rb は tDiary 2.1.4 より古いバージョン用なので、 tDiary 2.1.4 以降用の refedit2.rb に差し替える。
recent_list.rb プラグインの出力する HTML が変わった
tDiary 2.0.2 の時はこんな HTML が出力されていた。
<P class=recentitem><A href="http://www.revulo.com/blog/20061012.html">2006-10-12 (木)</A> </P> <DIV class=recentsubtitles><A href="http://www.revulo.com/blog/20061012.html#p01">1</A>. 複数行のプラグイン引数の改行コード<BR></DIV>
それが、tDiary 2.1.4 にしたらこうなった。
<ul class="recent-list"> <li><a href="./20061012.html">2006-10-12 (木)</a> <ul class="recent-list-item"> <li><a href="./20061012.html#p01">1</a>. 複数行のプラグイン引数の改行コード</li> </ul> </li> </ul>
ところがスタイルシートの方は、この変更に合わせた設定がされていない。 ということで、見た目を tDiary 2.0 の時と同じ感じにするために、 テーマのスタイルシートに以下のような設定を追加した。
ul.recent-list {
font-size: 90%;
list-style-type: none;
}
div.sidebar ul {
margin-left: 4px;
margin-right: 2px;
}
あるいは base.css を書き換えるくらいの方がいいかもしれない。
2006-10-21 (土)
■ 「Revulo's Blog」改め「れぶろぐ」に
このブログの名前を、 「Revulo's Blog」から「れぶろぐ」に変更する事にした。 我ながらセンスのないネーミングだが、 この短い4文字の中に「れぶろ」も「ぶろぐ」ももれなく入っている、 というのが気に入ったので。
ところで、「れぶろぐ」で検索をかけてみると、競合するページが結構多い。 「れぶろぐん」とか「せれぶろぐ」なんてのも引っかかってしまう。 でも、このページを訪れる人は、 「Ethna」だの「MySQL」だのといった単語で検索してくるようだから、 別に構わないだろう。 要は、ページの内容が充実していればいいのだ。
2006-10-22 (日)
■ tDiary で GeSHi を使ってコードをハイライト表示
Wiki 記法で、
<<< ruby ... >>>
のように書けばハイライトできるようにしてみた。 やり方を以下に書いておくが、 ライセンスの問題があるので、コードは2つに分けて載せておく。
HikiDoc で ruby スクリプトのハイライト表示 のページを参考に、CVS 版の hikidoc.rb を一部改変したコード。
# Copyright (c) 2005, Kazuhiko <kazuhiko@fdiary.net>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of the HikiDoc nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
class HikiDoc
def parse_pre( text )
ret = text
ret.gsub!( /^#{MULTI_PRE_OPEN_RE}[ \t]*(\w*)$\n(.*?)\n?^#{MULTI_PRE_CLOSE_RE}$/m ) do |str|
begin
raise if $1.empty?
"\n" + store_block( parse_code( $1, unescape_html( restore_pre( $2 ) ) ) ) + "\n\n"
rescue
"\n" + store_block( "<pre>\n%s\n</pre>" % restore_pre( $2 ) ) + "\n\n"
end
end
ret.gsub!( /(?:#{PRE_RE}.*\n?)+/ ) do |str|
str.chomp!
str.gsub!( PRE_RE, '' )
"\n" + store_block( "<pre>\n%s\n</pre>" % restore_pre( str ) ) + "\n\n"
end
ret
end
def unescape_html( text )
text.gsub( />/, '>').
gsub( /</, '<').
gsub( /&/, '&')
end
end
GeSHi Plugin for tDiary のページに載っている geshi.rb を一部改変したコード。
# geshi.rb
#
# GeSHi Plugin for tDiary
#
# Copyright (c) 2006 TAKANO Mitsuhiro <tak at no32.tk>
#
# You can redistribute it and/or modify it under GPL2.
#
class HikiDoc
def parse_code( language, text )
source = text.gsub(/([\'\\])/, '\\\\\1')
geshi = <<-GESHI
<?php
include('geshi/geshi.php');
$source = '#{source}';
$language = '#{language}';
$geshi = new GeSHi($source, $language);
echo $geshi->parse_code();
?>
GESHI
IO.popen("php", "r+") do |io|
io.puts(geshi)
io.close_write
io.read
end
end
end
実際の使い方は以下の通り。
- tDiary のディレクトリで GeSHi のアーカイブを展開
- 上記の2つのコードを合わせて、tdiary/hikidoc_geshi.rb として保存
- tdiary/wiki_style.rb の先頭部分を以下のように変更。
require 'tdiary/hikidoc' require 'tdiary/hikidoc_geshi'
これでOK。 単に2つのコードを組み合わせただけだが、使い勝手は非常に良い。
ちなみにこのブログは XREA に設置しているが、 http://sb.xrea.com/archive/index.php/t-8710.html によると、 XREA では CLI 版 PHP は、
- /usr/local/bin/php4cli
- /usr/local/bin/php5cli
というパスになるらしい。 ということで、上のコードの PHP を呼び出す部分を、 以下のように変更する必要があった。
IO.popen("/usr/local/bin/php5cli", "r+") do |io|
2006-10-24 (火)
■ Google Sitemaps への登録
効果がどれほどあるのか分からないが、 PukiWiki によるページのサイトマップを作って Google に登録してみたので、 PukiWiki の側で行った作業を以下のページにまとめておいた。
妙に苦労した部分があるので、その辺は明日詳しく書く。
2006-10-25 (水)
■ Google Sitemaps への登録 (2)
昨日の話 の続き。 Google Sitemaps を利用するお手軽な方法として、 RSS2.0 や Atom フィードがサイトマップの代わりに使えるらしい。 しかし PukiWiki でそれをやると、最新の20件分しかサイトマップに載らないことになる。 それがなんとなく嫌なので、 Google Sitemaps プラグイン を使ってみることにした。
試してみると、全てのページがサイトマップに出力されるわけではないようだ。 cache/recent.dat を元に出力しているらしいので、 cache/recent.dat の中を見て数えてみると、 ちょうど 70 ページ分のデータが記録されていた。 この 70 という数字はどこから出てきたのか? 調べたところ、以下のページに答えが載っていた。
つまりこういうことだ。 PukiWiki 1.4.6 以前は、 cache/recent.dat に全ページの更新日時を保存していたが、 PukiWiki 1.4.7 では、以下の設定値を元に、 必要最小限の分だけ保存するように変更されたらしい。
- pukiwiki.ini.php の $maxshow = 60;
- lib/file.php の define('PKWK_MAXSHOW_ALLOWANCE', 10);
この2つの値の合計で、70 ページ分(だけ)データがキャッシュされているわけだ。 だから、全てのページをサイトマップに載せるためには、 全ページ数よりも大きな数字を $maxshow に設定してやればよい。
2006-10-26 (木)
■ Google Sitemaps への登録 (3)
Google Sitemaps プラグイン の出力を眺めていて気が付いたが、Last-modified ヘッダが出力されていない。 付けた方がいいんじゃないかな? ということで、sitemaps.inc.php に対するパッチを作ってみた。
--- plugin.orig/sitemaps.inc.php 2006-09-20 00:00:00.000000000 +0900
+++ plugin/sitemaps.inc.php 2006-10-26 21:58:19.000000000 +0900
@@ -5,5 +5,5 @@
if(!file_exists($recent)) die('recent.dat is not found');
$self = get_script_uri();
- $date = $items = '';
+ $lastmod = $items = '';
foreach(array_splice(file($recent), 0, $sitemaps_max) as $line) {
list($time, $page) = explode("\t", rtrim($line));
@@ -13,4 +13,7 @@
$time = $time + date('Z');
$date = gmdate('Y-m-d\TH:i:s', $time) . '+00:00';
+ if (!$lastmod) {
+ $lastmod = gmdate('D, d M Y H:i:s', $time) . ' GMT';
+ }
$items .= <<<EOD
<url>
@@ -22,4 +25,5 @@
}
header("Content-type:text/xml;charset=utf-8");
+ header('Last-Modified: ' . $lastmod);
print '<?xml version="1.0" encoding="UTF-8"?>' . "\n\n";
print <<<EOD
ただし少し手抜きをしていて、 recent.dat がきちんとソートされているという前提で作っているので、 $maxshow の設定値が小さいと、 質問箱3/458 のバグに引っかかってしまうはず。
ついでに言うと、 rss.inc.php プラグインが吐き出す RSS フィードも Last-Modified ヘッダが付いていない。 これも直した方がいいのかも。
2006-10-27 (金)
■ rewritemap.inc.php プラグイン Ver.1.1 をリリース
rewritemap.inc.php プラグイン にまずい点があったので修正した。 変更点は以下の通り。
- 存在しないページを指定した場合は 404 を返すように修正
- 設定用のページを :RewriteMap → :config/RewriteMap に変更
- ライセンスを明記
今までは、xxx.html という URL にアクセスがあった時に、 xxx という Wiki ページが存在しなければトップページに飛ばしていた。 ところがそれだと、
- ページを削除しても、ページが残っているように見えてしまう。
- Google ウェブマスターツールの登録で、サイトの所有権の確認に失敗する
といった不具合が発生してしまう。
Google のサイト所有権の確認というのは、 適当なページにアクセスして 404 が返ってくることの確認、 というのがあって、そこでもろに引っかかってしまった。 というか、そのおかげでこのバグに気付くことができた。
2006-10-28 (土)
■ counterlist.inc.php プラグイン Ver.1.2 をリリース
昨日の rewritemap.inc.php プラグイン に引き続き、 counterlist.inc.php プラグイン もちょっぴりバージョンアップ。
- カウンタがゼロのページは表示しない設定を追加
- rewritemap.inc.php 用のパッチを同梱していたのを別配布するように変更
- ライセンスを明記
前回の Ver.1.1 の修正をした際に、その副作用で、 カウンタがゼロのページや、 カウンタを設置していないページも一覧に表示されてしまっていた。 それらを判別するために余計な処理が増えるのが嫌で放置していたが、 よく考えたらわずかな修正で済むことに気付いたので対応してみた。
2006-10-29 (日)
■ pagetree.inc.php プラグイン Ver.1.1 をリリース
pagetree.inc.php プラグイン をほぼ1から書き直した。 これで 一昨日 と 昨日 に引き続き、 3日連続のバージョンアップ。
- スタイルシートを積極的に利用するように書き直し
- 処理の見直しによる高速化
- rewritemap.inc.php 用のパッチを同梱していたのを別配布するように変更
- ライセンスを明記
かなり良い感じの仕上がりになったと思う。
2006-10-31 (火)
■ get_existpages() の高速化
先日の pagetree.inc.php や counterlist.inc.php プラグインは、 処理の中で全ページのページ名を読み込んでいる。 これが結構重い処理のはずなので、何とかできないか考えてみた。
最初はプラグインを改良する形でいじっていたが、 どうせなら他のプラグインでも利用できるようにということで、 PukiWiki 本体の get_existpages() 関数のパッチとして分離させてみた。 詳細は以下のページに載せておく。
手元の環境では3倍程度の高速化になった。 ページ数にもよると思うが効果は確実にあると思う。
