sb - weblog management system

TIPS

項目
複数のsbを設置する

sb自体はMovable Typeのような複数ウェブログ作成機能をサポートしていません。複数のウェブログを管理したい場合、その分のsbを設置する必要があります。

複数のsbを設置する際、それぞれのsbに対して、lib/, ext/, doc/, plugin/ を用意しても構わないのですが、同じファイルを別の場所にいくつも置くのは冗長ですし、バージョンアップにも手間がかかります。

sbではlib/, ext/, doc/, plugin/ を共有して利用する仕組みを用意しています。また、希望するならば lock/ も共有して利用できます。

ここでは具体例を挙げながら、各ディレクトリを複数のsbで共有化する方法について説明します。

以下のような構成を想定します。

  • /public_html/sb0//public_html/sb1/に設置する。
  • lib/, ext/, doc/, plugin/をそれぞれ/public_html/内に置く。

ディレクトリ構成は以下のようになります。

  • /public_html/
    • sb0/
      • index.html
      • style.css
      • admin.cgi
      • sb.cgi
      • cnt.cgi
      • mb.cgi
      • init.cgi
      • addlib.cgi
      • data/
      • log/
      • img/
      • lock/
    • sb1/
      • index.html
      • style.css
      • admin.cgi
      • sb.cgi
      • cnt.cgi
      • mb.cgi
      • init.cgi
      • addlib.cgi
      • data/
      • log/
      • img/
      • lock/
    • doc/
    • lib/
    • ext/
    • plugin/

sb0/sb1/の中に置かれているaddlib.cgiというファイルに注目してください。このファイルは配布アーカイブには含まれていません。

addlib.cgiの中身は以下のようになります。

use lib qw(../lib ../lib/lang ../ext);
1;

適当なテキストエディタで上記の内容を保存します。ここで../libとなっているのはsb.cgiから見たlib/ディレクトリの位置になります。

今回の例ですと、sb0/sb1/に置くaddlib.cgiの内容は全く一緒で構いません。

続いて、init.cgiの設定を見てみます。

今回の例で、/public_html/がウェブ上ではhttp://www.example.com/でアクセスできるとしましょう。

sb0/に置かれたinit.cgiの設定は以下のようになります。

# 初期設定ファイル
DataDir ./data/
DataSuffix .cgi
ScriptPath http://www.example.com/sb0/

# 以下、追加設定(必要に応じて設定してください)
HelpSrv http://www.example.com/doc/
TempSrv http://www.example.com/lib/lang/
TempDir ../lib/lang/
LockDir ./lock/
BaseDir ./
LogDir log/
ImgDir img/
WeblogId sb0
PluginDir ../plugin/

HelpSrv, TempSrv, TempDirなどは標準のinit.cgiでは設定されていない項目ですが、ヘルプドキュメントや管理画面で利用されている画像パーツを共有する際に必要になります。

WeblogIdは複数のsbを設置した際に、それぞれのsbで管理画面のCookie情報を混同しないようにするためのものです。

sb1/に置かれたinit.cgiの設定もほとんど一緒です。異なる部分を強調しています。

# 初期設定ファイル
DataDir ./data/
DataSuffix .cgi
ScriptPath http://www.example.com/sb1/

# 以下、追加設定(必要に応じて設定してください)
HelpSrv http://www.example.com/doc/
TempSrv http://www.example.com/lib/lang/
TempDir ../lib/lang/
LockDir ./lock/
BaseDir ./
LogDir log/
ImgDir img/
WeblogId sb1
PluginDir ../plugin/

以上の設定で、複数のsbで各ディレクトリを共有することが可能です。環境設定などはそれぞれのsb毎に保存されます。

ウェブログコンテンツを全て動的に出力する

保存形式を「None」に設定していても、sbではトップページ(index.html)を静的に出力します。

sbではトップページも含めて全てのページを動的出力に切り替えることも可能です(ただし、rss, atom feedとスタイルシートを除く)。携帯電話からのアクセスを自動判別させたいような場合に有効な運用方法になります。

以下のような手順になります。

  1. sb.cgiの名前を「inidex.cgi」に変える
  2. index.htmlの名前を適当な名称に変更する
  3. init.cgiにMainScriptTopIndexの設定を追加する
  4. .htaccessの設定を行う
  5. トラックバックurlを修正するプラグインを有効にする
  6. 保存形式を「None」に設定する

1番目と2番目の設定は念のためです。また、4番目の設定は環境によっては必要ありません。

sb.cgiの名前を「index.cgi」に変更します。これはトップページのアクセス先を「index.html」という静的なファイルからスクリプトに切り替えるための下準備です。

index.htmlの名前を例えば、「dummy.html」の名前にしておきます。sbではトップページ用のファイルがないと管理画面でエラーになってしまうため、ダミーのファイルが必要になります。

1番目と2番目で行った名称変更の設定を反映させるため、init.cgiの設定を変更します。上述の例の場合、

MainScript 
TopIndex dummy.html

を追加します。MainScriptの設定が空になっていることに注意してください。index.cgiとしても構いません。TopIndexは変更後のindex.htmlの名称を指定します。

環境によっては必要ありませんが、sbを設置したディレクトリで.htaccessを以下のように設定します。

DirectoryIndex index.cgi

この設定でウェブサーバ上のディレクトリアクセス先をindex.cgiにすることができます。

3番目の設定でMainScript index.cgiのように設定している場合はプラグインを有効にする必要はありませんが、MainScriptを空に設定している場合は、「correct trackback url」プラグインをsb開発研究所よりダウンロードして、インストールします。

このプラグインはトラックバックURLを有効なアドレスに置き換えるためのものです。

記事の固定リンクを動的出力のものにするために、保存形式を「None」にする必要があります。

管理画面の自動ログイン

管理画面にアクセスした際、通常ログイン画面が表示されます。

sbでは標準で管理ユーザ情報をCookieとしてブラウザに保存していますので、管理画面のアクセス方法を若干修正すれば、ログイン画面を飛ばすことができます。

管理画面に対して、例えば、http://www.example.com/sb/admin.cgiでアクセスしている場合、このアドレスをhttp://www.example.com/sb/admin.cgi?mode=statusに変更します。

管理画面のCookie有効期間内であれば、ログイン画面を飛ばしてステータス画面に移行します。

通常、sbの管理画面のCookie有効期間は1日に設定されています。これを変更したい場合、例えば、有効期間を7日に設定したい場合は、init.cgiに以下のような設定を追加します。

AdminCookieDay 7
携帯電話用のテンプレート

携帯電話用に利用される表示もsbでは内部にテンプレートとして記述されています。

プラグインを利用することで携帯電話用のテンプレートを変更することができます。

mobile_settings.plという名称で次のようなテンプレートを用意します。

sub plugin_init {
  $gEnv{'plugin'}{$_[0]} = {
    'name' => 'settings for mobile',
    'version' => '0.00',
    'author' => 'takkyun',
    'link' => 'http://serennz.cool.ne.jp/sblog/',
    'type' => 'mobile',
  };
}
sub sbmob_settings {
  $gEnv{'disptime'}{$gEnv{'conf'}{'disptime'}} = { # 日付フォーマット
    'entry_date' => '%yr.%mo.%dy (%wk)',
    'entry_time' => '%hr:%mi',
    'msg_time' => '%yr.%mo.%dy %hr:%mi',
    'dateinlist' => '<br />(%yr/%mo/%dy)',
    'time_lang' => $gEnv{'conf'}{'lang'},
  };
  $gEnv{'conf'}{'entry_disp'} = 5; # ページ毎の表示記事数
  $gEnv{'conf'}{'page_disp'} = 1; # ページ表示設定
  $gEnv{'basic'}{'mob_size'} = 2048; # ページに表示する本文サイズ
}
sub sbmob_template {
  my $template = <<'_HTML_TEMPLATE_';
<!-- BEGIN show_xml_declaration -->
<?xml version="1.0" encoding="Shift_JIS"?>
<!-- END show_xml_declaration -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
<meta name="generator" content="sb" />
<title>{site_title}</title>
</head>
<body>
<!-- BEGIN mob_top -->
<h1>{blog_name}</h1>
<p>{blog_description}</p>
<hr />
{selected_entry_list}
<hr />
<!-- BEGIN page -->
<div align="center">{prev_page_link} {page_now}/{page_num} {next_page_link}</div>
<!-- END page -->
<!-- END mob_top -->
<!-- BEGIN mob_entry -->
<h1>{entry_title}</h1>
<p>{entry_date} {entry_disp_time}<br />{user_name}</p>
<hr />
{entry_description}
<hr />
<p>{entry_link}<br />{comment_num}<br />{trackback_num}</p>
<hr />
<p>{prev_entry}<br />{next_entry}<br /><a href="{site_top}" accesskey="0">[0] [top]</a></p>
<!-- END mob_entry -->
<!-- BEGIN mob_comment -->
<h1>{entry_link}</h1>
<h2>Comments</h2>
<hr />
<!-- BEGIN comment -->
<dl>
<dt>{comment_name}</dt>
<dd>{comment_time}</dd>
<dd>{comment_description}</dd>
</dl>
<!-- END comment -->
<p>{comment_form}<br />{comment_link}</p>
<!-- END mob_comment -->
<!-- BEGIN mob_trackback -->
<h1>{entry_link}</h1>
<h2>Trackbacks</h2>
<hr />
<!-- BEGIN trackback -->
<dl>
<dt>{trackback_title}</dt>
<dd>{trackback_blog_name}</dd>
<dd>{trackback_time}</dd>
<dd>{trackback_excerpt}</dd>
</dl>
<!-- END trackback -->
<p>{trackback_link}</p>
<!-- END mob_trackback -->
<!-- BEGIN mob_form -->
<h1>{entry_link}</h1>
<h2>Comment Form</h2>
<hr />
<form action="{site_cgi}" method="get">
<dl>
<dt>name:</dt>
<dd><input type="text" name="name" value="{cookie_name}" size="10" /></dd>
<dt>email:</dt>
<dd><input type="text" name="email" value="{cookie_email}" size="10" istyle="3" /></dd>
<dt>url:</dt>
<dd><input type="text" name="url" value="{cookie_url}" size="10" istyle="3" /></dd>
<dt>comments:</dt>
<dd><textarea name="description" rows="4" cols="20"></textarea></dd>
<dt>submit:</dt>
<dd>
<input type="submit" value="submit" />
<input type="hidden" name="entry_id" value="{entry_id}" />
<input type="hidden" name="charset" value="Shift_JIS" />
<input type="hidden" name="mob" value="on" />
</dd>
</dl>
</form>
<p>{comment_num}</p>
<!-- END mob_form -->
<hr>
<div align="right">[<a href="http://serennz.cool.ne.jp/sblog/mb.cgi">sb</a> {script_version}]</div>
</body>
</html>
_HTML_TEMPLATE_
  return($template);
}
1;

携帯電話用に利用されている独自ブロック・独自タグは基本的に通常のテンプレートと同じですが、いくつか携帯電話専用の独自ブロック・タグが存在します。

sbmob_settingsという関数では、携帯電話用の表示を行っている際に利用される日付フォーマットやエントリーの表示数などの各種設定を行うことができます。

独自ブロック 説明
show_xml_declarationXML宣言を表示するブロックです。DoCoMo端末では非表示になります。
mob_topページ表示(トップページ含む)用のブロックです。
mob_entry個別エントリー表示用のブロックです。
mob_commentコメント表示用のブロックです。
mob_trackbackトラックバック表示用のブロックです。
mob_formコメントフォーム表示用のブロックです。
独自タグ 説明
{entry_link}ページ分けされたエントリー用のリンク表示です。
{comment_link}ページ分けされたコメント用のリンク表示です。
{trackback_link}ページ分けされたトラックバック用のリンク表示です。

あまり役に立たない用語集

ウェブログ

ウェブログはウェブ上に綴られたある連続した記事群(日記など)を称することが多いようです。ブログと呼称されることもあります。

エントリー

個別の記事のことをsbではエントリーと呼ぶことがあります。

コメント

sbでは登録された記事に対して閲覧者がコメントを寄せることが出来ます。

トラックバック

ある記事(元記事)に対して言及した記事があった場合、元記事に対して言及したことを半自動的に通知する仕組みです。元記事から言及記事に対して自動的にリンクが貼られることが多いようです。

JUGEM

(株)paperboy&co.により2004年2月から運営されているレンタルウェブサービスです。詳細についてはhttp://jugem.jpをご覧下さい。

Movable Type

シックス・アパート株式会社より提供されている強力なウェブログ管理ツールです。詳細についてはhttp://www.movabletype.jp/をご覧下さい。カスタマイズ性に富み、sbでは出来ないような大規模なサイト運営も可能になっています。

sb

pure perlによる簡易なウェブログ支援ツールを目指して作りました。データの再利用性を高めるため、既存ツール(JUGEM)とテンプレートの互換性を持たせたり、データ移行関連の機能がそれなりに充実していると思います。

トラブルシューティング

「内部サーバエラー 500」と言われて管理画面に入れません。

アップロードしたファイルとディレクトリのパーミッションが正しく設定されているかを確認してください。

また、AAA!CAFEで利用されている方はパッチファイルを利用しているかどうかをご確認下さい。

sbの管理用スクリプト「admin.cgi」は設置後のトラブルを出来るだけ軽減するため、やや厳密にパーミッションチェックを行っています。

「内部サーバエラー 403」と言われてウェブページを見れません。

index.html ならびに sb.cgi のパーミッションが正しく設定されているかどうかを確認してください。

特にsuexecを利用するサーバだと index.html のパーミッションを「600」に設定しても index.html の書き換えは出来るので、管理画面は利用できますが、閲覧が出来ない状態になる場合があります。

装飾がない状態で表示されてしまいます(レイアウトが崩れます)。

style.css ならびに sb.cgi のパーミッションが正しく設定されているかどうかを確認してください。

特にsuexecを利用するサーバだと style.css のパーミッションを「600」に設定しても style.css の書き換えは出来るので、管理画面は利用できますが、スタイルシートが読み込まれないので、希望通りの表示にならない場合があります。

「該当ユーザーがいません」と言われて管理画面にログインできません。

一度もログインに成功したことがない場合、data/ ディレクトリの中を確認してみてください。

initkey というファイルが残っているようでしたら、管理ユーザの設定に失敗しています。一度 data/ ディレクトリ内のファイルを消してもう一度管理用スクリプトにアクセスしてみてください。

アクセス解析が表示されません。

独自タグ{collect_log}がHTMLテンプレート内に記述されているかどうかを確認してください。

もし、独自タグ{collect_log}がHTMLテンプレート内に記述されていて、それでもアクセス解析が表示されないようでしたら、cnt.cgi のパーミッションを確認してください。

なお、sbでは基本的に管理者のアクセスは集計しませんので予めご了承下さい。

コメントが文字化けします。

ja.plの文字コードなどが正しく設定されているか、Jcode.pm のバージョンが0.86かどうかを確認してください。

また、Jcode.pmで文字コードの自動判別に失敗している可能性があります。その場合は以下の方法で文字化けを軽減することが出来ます。

HTMLテンプレート内のコメントフォームで<input type="hidden" name="entry_id" value="{entry_id}" />の後ろに<input type="hidden" name="charset" value="{site_encoding}" />を入れます。

XML-RPC APIについて

XML-RPC API

以下のXML-RPCメソッドをサポートしています。

  • blogger.newPost
  • blogger.editPost
  • blogger.getRecentPosts
  • blogger.getUsersBlogs
  • blogger.getUserInfo
  • blogger.deletePost
  • metaWeblog.getPost
  • metaWeblog.newPost
  • metaWeblog.editPost
  • metaWeblog.getRecentPosts
  • metaWeblog.newMediaObject
  • mt.getCategoryList
  • mt.setPostCategories
  • mt.getPostCategories
  • mt.getRecentPostTitles
  • mt.publishPost
  • mt.supportedMethods
  • sb.getMediaObjectList
  • sb.getMediaObject
  • sb.deleteMediaObject

sbの仕様と適合しない一部のパラメータは無視されます。XML-RPC APIを利用することにより、XML-RPCクライアントからウェブログを更新することが可能です。

blogid ならびに appkey は sb では利用されません。任意の文字列を指定することができます。

XML-RPC APIのエンドポイントは管理用スクリプト(admin.cgi)のアドレスになります。

blogger.newPost
機能
新しい記事を投稿します。
引数
appkey [string], blogid [string], username [string], password [string], content [string], publish [boolean]
返値
成功すると記事ID(string)を返します。
blogger.editPost
機能
記事ID(postid)の記事を上書きします。
引数
appkey [string], postid [string], username [string], password [string], content [string], publish [boolean]
返値
成功するとtrueを返します。
blogger.getRecentPosts
機能
sbに投稿された記事の一覧を取得します。
引数
appkey [string], blogid [string], username [string], password [string], numberOfPosts [int]
返値
取得に成功した記事の数だけ記事情報を含んだ構造体の配列を返します。
補足
記事情報は以下の項目を含みます。
  • dateCreated [dateTime.iso8601]
  • userid [string]
  • postid [string]
  • content [string]
blogger.getUsersBlogs
機能
ユーザーが投稿可能なウェブログの情報を取得します。
引数
appkey [string], username [string], password [string]
返値
投稿可能なウェブログ情報の構造体を含んだ配列(sbの場合ひとつ)を返します。
補足
ウェブログ情報は以下の項目を含みます。
  • url [string]
  • blogid [string]
  • blogName [string]
blogger.getUserInfo
機能
ユーザーの情報を取得します。
引数
appkey [string], username [string], password [string]
返値
ユーザー情報の構造体を返します。
補足
ユーザー情報は以下の項目を含みます。
  • userid [string]
  • firstname [string]
  • lastname [string]
  • nickname [string]
  • email [string]
  • url [string]
blogger.deletePost
機能
記事ID(postid)の記事を削除します。
引数
appkey [string], postid [string], username [string], password [string], publish [boolean]
返値
成功するとtrueを返します。
metaWeblog.newPost
機能
新しい記事を投稿します。
引数
blogid [string], username [string], password [string], content [struct], publish [boolean]
返値
成功すると記事ID(string)を返します。
補足
content [struct]は以下の項目を含みます。
  • title [string]
  • description [string]
  • dateCreated [dateTime.iso8601]
  • mt_allow_comments [int]
  • mt_allow_pings [int]
  • mt_convert_breaks [string]
  • mt_text_more [string]
  • mt_excerpt [string]
  • mt_keywords [string]
  • mt_tb_ping_urls [array]
metaWeblog.editPost
機能
記事ID(postid)の記事を上書きします。
引数
postid [string], username [string], password [string], content [struct], publish [boolean]
返値
成功するとtrueを返します。
補足
content [struct]は以下の項目を含みます。
  • title [string]
  • description [string]
  • dateCreated [dateTime.iso8601]
  • mt_allow_comments [int]
  • mt_allow_pings [int]
  • mt_convert_breaks [string]
  • mt_text_more [string]
  • mt_excerpt [string]
  • mt_keywords [string]
  • mt_tb_ping_urls [array]
metaWeblog.getPost
機能
記事ID(postid)の記事情報を取得します。
引数
postid [string], username [string], password [string]
返値
成功すると記事情報の構造体を返します。
補足
記事情報は以下の項目を含みます。
  • dateCreated [dateTime.iso8601]
  • userid [string]
  • postid [string]
  • title [string]
  • description [string]
  • link [string]
  • permaLink [string]
  • mt_allow_comments [int]
  • mt_allow_pings [int]
  • mt_convert_breaks [string]
  • mt_text_more [string]
  • mt_excerpt [string]
  • mt_keywords [string]
metaWeblog.getRecentPosts
機能
sbに投稿された記事の一覧を取得します。
引数
blogid [string], username [string], password [string], numberOfPosts [int]
返値
取得に成功した記事の数だけ記事情報を含んだ構造体の配列を返します。
補足
記事情報は以下の項目を含みます。
  • dateCreated [dateTime.iso8601]
  • userid [string]
  • postid [string]
  • title [string]
  • description [string]
  • link [string]
  • permaLink [string]
  • mt_allow_comments [int]
  • mt_allow_pings [int]
  • mt_convert_breaks [string]
  • mt_text_more [string]
  • mt_excerpt [string]
  • mt_keywords [string]
metaWeblog.newMediaObject
機能
ファイルをサーバに転送します。
引数
blogid [string], username [string], password [string], file [struct]
返値
転送したファイルの url を返します。
補足
file [struct]は以下の項目を含みます。
  • bits [base64]
  • name [string]
  • type [string]
mt.getCategoryList
機能
ウェブログに設定されたカテゴリー一覧を取得します。
引数
blogid [string], username [string], password [string]
返値
カテゴリー情報を含んだ構造体の配列を返します。
補足
カテゴリー情報は以下の項目を含みます。
  • categoryId [string]
  • categoryName [string]
mt.setPostCategories
機能
記事ID(postid)のカテゴリーを設定します。
引数
postid [string], username [string], password [string], categories [array]
返値
成功するとtrueを返します。
補足
categories [array]の各項目は以下の項目を含む構造体です。
  • categoryId [string]
  • isPrimary [boolean]
mt.getPostCategories
機能
記事ID(postid)のカテゴリーを取得します。
引数
postid [string], username [string], password [string]
返値
その記事に設定されたカテゴリー情報を含んだ構造体の配列を返します。
補足
カテゴリー情報は以下の項目を含みます。
  • categoryId [string]
  • categoryName [string]
  • isPrimary [boolean]
mt.getRecentPostTitles
機能
sbに投稿された記事の一覧を取得します。
引数
blogid [string], username [string], password [string], numberOfPosts [int]
返値
取得に成功した記事の数だけ記事情報を含んだ構造体の配列を返します。
補足
記事情報は以下の項目を含みます。
  • dateCreated [dateTime.iso8601]
  • userid [string]
  • postid [string]
  • title [string]
mt.publishPost
機能
指定した記事とトップページを再構築します。
引数
postid [string], username [string], password [string]
返値
成功するとtrueを返します。
補足
sbでは指定した記事のステータスは変更されません(非公開記事は非公開のまま)。トップページは再構築されます。保存形式によっては記事が含まれるhtmlファイルを構築し直します。
mt.supportedMethods
機能
sbがサポートしているメソッド一覧を取得します。
引数
なし
返値
サポートしているメソッドの配列を返します。
sb.getMediaObjectList
機能
アップロードされている画像ファイル一覧を取得します。
引数
blogid [string], username [string], password [string], numberOfObjects [int]
返値
アップロードされている画像ファイル情報の配列を返します。
補足
画像ファイル情報は以下の項目を含みます。
  • objectid [string]
  • dateCreated [dateTime.iso8601]
  • name [string]
  • url [string]
sb.getMediaObject
機能
アップロードされている画像ファイルを取得します。
引数
blogid [string], objectid [string], username [string], password [string]
返値
指定された画像ファイルをbase64でエンコードした内容を返します。
sb.deleteMediaObject
機能
アップロードされている画像ファイルを削除します。
引数
blogid [string], objectid [string], username [string], password [string]
返値
成功するとtrueを返します。
補足
サムネイル画像がある場合、サムネイル画像も同時に削除します。

Copyright © SimpleBoxes 2004-, All rights reserved. [ver. 1.15R]