Home

日記
外部JSの読み込み (13:05)Edit

スクリプトのインポート」より。Wiki系の長いURLは、MMではURL文字数制限に引っかかってメモできないんだよなー。

var s = document.createElement("script");
s.src="lib.js";
document.body.appendChild(s)

Published At2005-04-04 00:00Updated At2005-04-04 00:00

日記
おまけ: 過去ログ・カテゴリー表示機能の作成Edit

目次を見ればわかるとおり、本書では第3章の分量が不自然に少ない。これは本来第3章に入るハズだった内容が、時間の都合等でばっさり削除されているからだ。というわけで、その欠けている部分のネタを埋めておく。まずは、本書の内容だけではあまり意味がなさげに見えるインデックスの応用例について。

現状の本書の内容では、わざわざ作成したインデックスクラスEntryIndexにあまり存在意義はない。確かにインデックスを用意することで多少速度的には有利になるが、あの程度の使い方ならば記事データディレクトリを全部なめても大したことはない。

しかしもともとはインデックスを用意したのは、過去ログ表示やカテゴリー表示などを行うための土台にすぎない。ということで、以下では具体的に過去ログ表示およびカテゴリー表示機能を作成してみることにする。

まずは過去ログ表示機能。たとえば以下のような内容となる。

archive.php

<?php
require_once 'config.php';

main();

function
main() {
    
$index =& new EntryIndex();
    
$index->load();
    
$index->select('date', $_GET['date']);

    
$entry_list = array();
    foreach (
$index->sort('date') as $filename => $item) {
        
$entry_list[] = load_entry_data($filename);
    }
    
    
show_template('htmlheader.tmpl', array(
        
'title' => '過去ログ '.$_GET['date']
    ));
    
show_template('entry_list.tmpl', array(
        
'entry_list' => $entry_list
    
));

    
show_template('htmlfooter.tmpl');
}

?>

これに、archive.php?date=200503のような形でdateパラメータを渡すことで、2005年3月の日付を持つ記事データをまとめて表示する機能を持つ。上記ではdateパラメータの内容チェックはしていないので、date=20050305などのように日付まで指定してもいいし、date=2005のように年だけを指定しても動作する。

続いてはカテゴリ表示機能。

category.php

<?php
require_once 'config.php';

main();

function
main() {
    
$index =& new EntryIndex();
    
$index->load();
    
$index->select('title', '['.$_GET['category'].']');

    
$entry_list = array();
    foreach (
$index->sort('date') as $filename => $item) {
        
$entry_list[] = load_entry_data($filename);
    }
    
    
show_template('htmlheader.tmpl', array(
        
'title' => 'カテゴリー表示 '.$_GET['category']
    ));
    
show_template('entry_list.tmpl', array(
        
'entry_list' => $entry_list
    
));

    
show_template('htmlfooter.tmpl');
}

?>

やっていることは過去ログ表示と同じだ。category.php?category=blogなどとすると、タイトルとして『[blog]記事データの構造』のように、大括弧でカテゴリー文字列を指定した記事データだけを抽出し表示する。日本語カテゴリー名を指定する場合は、categoryパラメータとしては、EUC-JPで記述した文字列をURLエンコードしたものを渡す必要がある(ツール側でカテゴリーリンクを張る場合など)。

ただし、いくらインデックスファイルを用意しておいたとしても、このように毎回select、sortを行っていては早々に(記事データ数が増えると)処理速度が鈍ってくる。そのような場合は、あらかじめよく使うパターンのselectおよびsort済みのインデックスファイルを、別名で保存しておくといいだろう。あるいは記事データの更新がない限りは、一度select、sortした結果は流用できるような、キャッシングの仕組みを追加してもいい。

まあ実際問題としては、このような処理を本格的に行いたい場合は、素直にDBを使った方がいいと思うのだが、本書ではDBは使わないということになっているので、一応こういうやり方を紹介してみた。

『自分で作るblogツール(PHP編)』サポートエントリーに戻る

Published At2005-04-04 12:24Updated At2005-04-04 12:24

日記
DBがこけていました (11:24)Edit

今朝8時くらいから、DBサーバーがこけて、あちこちでエラーが発生していました。先ほど(11時過ぎ)に復旧しました。ご迷惑をおかけしました。

っつーか、なんで一番どうでもいい、AmazonのキャッシュDBのインデックスがこけるかなー。myisamchk -rで治ったけど。

Published At2005-04-06 00:00Updated At2005-04-06 00:00

日記
Perlのお勉強しよう (15:13)Edit

やっぱりTCPサーバーを書くのには、PHPでは無理がありすぎるよ。書けなくはないけど、プロセス間通信とエラーハンドリングがネックになりすぎ。PHP5にすればエラーハンドリングは何とかなるだろうけど。

で、JavaとPerlとRubyのどれにするか迷ったんだけど、ひとまずPerlでやってみることにしよう。POEってのがなにやらよさげな雰囲気だし。それでダメならJavaだろうなー。よっぽど時間があったらRubyも面白そうだけど、Rubyは言語仕様レベルで覚えることが多すぎるんだよなー。

ちゃんとしたPerlのプログラムを書くためには、まずはらくだ本の前半を精読して、後半(モジュール紹介)をぱらぱら眺めてから、いくつかPerlモジュールを作って、さらにmod_perlで動くアプリケーションでも作ってみればいいのかな。そのくらいやれば、いまどきのPerlっぽいコードが書けるようになるだろう。

Published At2005-04-06 00:00Updated At2005-04-06 00:00

日記
StringCollectionとString()の相互変換 (18:59)Edit

って、いちいち、

dim sc as new StringCollection()
dim sa(sc.Count) as string
sc.CopyTo(sa, 0)

とか

dim sa(5) as string
dim sc as new StringCollection()
sc.AddRange(sa)

とかしないといけないの?

Published At2005-04-06 00:00Updated At2005-04-06 00:00

日記
昨日からゲロゲロだ (00:58)Edit

花粉症で鼻をすすりすぎて気持ち悪いだけのような気もするんだけど、ちょっと限界を超えて気持ち悪い。特に寝ているときにタンかつばかわからないものが喉に詰まって「おえっ」てなるのは何とかして欲しい。ろくに熟睡できないし。

Published At2005-04-07 00:00Updated At2005-04-07 00:00

日記
編集中にパース結果が見えるWikiサンプル (14:49)Edit

WikiParserのJavaScript版を作ってみたのに、誰も試してくれる人がいないっぽいんで、自分でデモを作ってみようコーナー。

左側のテキストボックスにいろいろ入力していくと、それにあわせて(1秒単位で更新チェック)右側にレンダリングされたHTMLが表示される。「WikiNameを利用する」チェックのオン/オフで、WikiParserでWikiName形式への自動リンクを行うかどうかを切り替えることができる。

こんな感じで、リアルタイムで入力結果を確認できると、Wikiテキストの入力の簡便さと、レンダリングした結果HTMLの表現力の高さを、同時に実現できたりしていいんじゃないですかね。という提案なんですよ。

ごっつい暇ならば、WikiParserのPHP版とJavaScript版を使ったWikiエンジンをでっち上げてもいいんだけど、結果がわかっているからあんまりやる気が出ないんだよなー。今作りかけているWikiParserのVB.NET版ができたら、デスクトップクライアント込みで作るかもしれないけど。

Published At2005-04-07 00:00Updated At2005-04-07 00:00

日記
編集中にパース結果が見えるWikiサンプル Ajax版 (03:19)Edit

なんかAjaxの方がキャッチーらしいんで、(俺的には)意味のないAjax版を作ってみた。JavaScriptのソースはまあ見たとおり、単にJavaScriptでパース処理をする代わりに、XMLHttpRequestで元テキストを渡して、非同期で返された結果HTMLをInnerHTMLに埋め込んでやるだけ。

もちろんAjaxでもJavaScriptパーサーを使う場合でも、OnChangeとかOnKeyPressとかでパースを呼ぶことは可能だけど、負荷を考えるとそこまでやらない方がいいよね。ただ、OnKeyPressで改行キーが押されたときはその場でパースを呼び出した方が、編集していて気持ちがいいかもしれない。

呼び出されているPHPの方のコード(parse.php)は、PHP版のWikiParserを使って、

<?php
require_once 'WikiParser.php';
$parser =& new WikiParser(array(
'heading_depth' => 3,
'paragraph_oriented' => TRUE,
'disable_plugins' => array('html'),
));
$body = $_POST['body'];
$html = $parser->parse($body);
header('content-type: text/plain; charset=UTF-8');
echo $html;
?>

って感じ。

でもどう考えてもこういう用途ではAjaxを使わなくてすむならば使わない方がいいよなー。サーバー負荷がかからないし、XMLHTTPRequestを使わず純粋に文字列操作だけのパース処理をJavaScriptで書いた方がクロスブラウザ性も高いし(Ajax版はOpera8でも動かない)。

まあ汎用的なサンプルコードとしては、Ajax版の方が他のWikiエンジンとかに組み込みやすいんだろうけどさ。

Published At2005-04-08 00:00Updated At2005-04-08 00:00

日記
げげげーっ! (10:09)Edit

TypeKeyの認証サーバー、SSL証明書の期限が切れてるよ。更新してプリーズ!

そういやTypeKeyのサーバーって、thawteってところの証明書使ってるんだな。聞いたことないけど、どうなんだろう?(主に携帯電話対応とか。ってそれはverisign以外はほとんどダメだろうけど) 値段はそこそこ安いみたいだけど。

Published At2005-04-08 00:00Updated At2005-04-08 00:00

日記
どうでもいい豆知識 (16:46)Edit

「B0007V」から始まるASINはエロゲーらしい(未検証?)。

ダメだな

ASINコードからエロゲーを区別する規則性を探そうと思ったけど、ダメっぽい。上記コード範囲はたまたまエロゲー登録が多かっただけかな?

Published At2005-04-09 00:00Updated At2005-04-09 00:00