まだ重たいCMSをお使いですか?
毎秒1000リクエスト を捌く超高速CMS「adiary

2006/10/16(月)ブロックdel, ins 記法

ブロックDEL, INS記法(β11以降)

インライン要素ではなく、ブロックに対して<DEL>, <INS>を指定する記法です。

>>>del
この部分がdelなblockです。

要素全部に対してdelが適用されます。
<<<

とすることで、

この部分がdelなblockです。

要素全部に対してdelが適用されます。

となります。ちなみに、インライン要素の場合は従来通り[del:削除しました]削除しましたでいけます。

2006/09/14(木)リスト記法、テーブル記法のセル連結、aa記法

値指定付きリスト記法(β10以降)

リスト記法において、値を指定する機能を付けました。=n (nは数値、後ろにスペースが必要です)として指定します。

-β10リリースに向けて
++リスト記法の拡張
++ジャンルが1つしかないとき、一覧に表示しない
++=5 カテゴリの実装の修正
-正式リリースに向けて
-test
  • β10リリースに向けて
    1. リスト記法の拡張
    2. ジャンルが1つしかないとき、一覧に表示しない
    3. カテゴリの実装の修正
  • 正式リリースに向けて
  • test

テーブル記法によるセル連結機能(β10以降)

| >        |*在庫     |<         |<      |
|*メーカー | >        |*プリンタ |*個数  |
|_         | LBP-740e | EP-J     | 3     |
|Canon     | LBP-1420 | EP-65    | 0     |
|~         | LBP-470  |<         | 0     |

> : 右に結合
< : 左に結合
~ : 上に結合
_ : 下に結合

という方法で連結できます。連結記号使用時はスペース(タブ含む)以外の余計な文字を含んではいけません。左右や上下の連結については、oddやevenなどやカラムに対するクラス指定により使い分けます。特に気にしなければどれを使用しても構いません。上の表は次のように出力されます。

在庫
メーカープリンタ個数
CanonLBP-740eEP-J3
LBP-1420EP-650
LBP-4700

aa記法(β10以降)

アスキーアート記法に対応してみました。

>|aa|
\   ∩─ー、    ====
  \/ ● 、_ `ヽ   ======
  / \( ●  ● |つ   はてながaa記法作るだなんて、    
  |   X_入__ノ   ミ   そんな餌で俺様が釣られクマ――
   、 (_/   ノ /⌒l
   /\___ノ゙_/  /  =====
   〈         __ノ  ====
   \ \_    \
    \___)     \   ======   (´⌒
       \   ___ \__  (´⌒;;(´⌒;;
         \___)___)(´;;⌒  (´⌒;;  ズザザザ
||<

と入力すると、

\   ∩─ー、    ====
  \/ ● 、_ `ヽ   ======
  / \( ●  ● |つ   はてながaa記法作るだなんて、
  |   X_入__ノ   ミ   そんな餌で俺様が釣られクマ――
   、 (_/   ノ /⌒l
   /\___ノ゙_/  /  =====
  〈         __ノ  ====
   \ \_    \
    \___)     \   ======   (´⌒
       \   ___ \__  (´⌒;;(´⌒;;
         \___)___)(´;;⌒  (´⌒;;  ズザザザ

となります。

2006/07/25(火)7/25版スナップショット

βリリースではなくスナップショットです。落としたい人は、ダウンロードページを参照ください。

  • mod_perl等の環境で、メモリリークする問題を修正しました。mod_perl環境の場合のみ、すでにリークしたメモリを開放するためApacheの再起動が必要です。
  • AnHttpd, lighttpd, Apache 1.3.x (cgiとmod_perl/1.29*1) などでの動作テストと、Apache1.3 などの環境でパス自動解析に失敗する不具合を修正を行いました。*2
  • ファイルアップローダーのコンパイルログが標準でonになっていたので修正しました。
  • スケルトンの更新チェックをより厳格にしました。
  • ssh で port forward した環境などで、redirect がうまく動作してなかったので対応しました。

メモリリークの関係で、データベースハンドラを解放できず、ここのレンタルサービスが何度か停止しご迷惑をおかけしました。今は修正されています。

*1 : mod_perl1.xxでの運用はあまり推奨しません

*2 : 主にApache 2.xのみテストされていますので、他のサーバシステムで問題を発見した場合はぜひともご連絡ください。

2006/07/19(水)スケルトンのカスタマイズ

この記事はVer2以前のものです。Ver3は無関係です。


skeltonを直接カスタマイズしたいという要望があるようなので、カスタマイズの仕方を説明します。スケルトンカスタマイズにはプログラム的知識が多少必要になります。

※2007/01/24 大幅に加筆しました。バージョンアップ時の手間を考えた場合、_main, _sidebarスケルトンの変更はあまりお勧めしません。「詳細デザイン」+トラストモードで済む場合はそちらを検討してください。

スケルトンディレクトリ diary.skel/

adiaryの機能はほぼすべてこの中に納められています。adiaryのスクリプトに対する引数

adiary.cgi?diary_edit

であれば、diary.skel/diary_edit.html が呼ばれます。カスタマイズしたい機能をみつけたい場合は、その画面のURLに着目すればよいことになります。なおセキュリティ上の制約で、"_" ではじまるスケルトンおよびサブディレクトリにあるスケルトンは引数では直接呼べません。

なお、スケルトンをカスタマイズする際は、diary.skel のを書き換えるのではなく、diary.user.skel にコピーしてから書き換えるようにしてください。こうすれば diary.skel より優先して読み込まれます。

ですが同時に、バージョンアップをしても常にユーザースケルトンが優先されてしまうので、オリジナルが大幅に書き変わっている場合など多少注意が必要です。後述する特殊スケルトンのうち _main, _main_onelog, _sidebarスケルトンは比較的よく改変されます*1。この3つについては、変更点をバージョンアップアナウンス時にアナウンスしていますのでご注意ください。

あまり使いませんが

diary.user.skel などにおいたユーザースケルトンでは

<$continue()>

という関数(コマンド)を使うことで、本来の diary.skel 内の該当スケルトンに処理を引き継ぐことができます。theme/hatena/_skelton/_frame.htmlなどで使用しています。

*1 : _multiuser_top はまず改変されません

特殊な役割をするスケルトン

まず重要なのが外側のフレームを生成するスケルトンです。通常、adiaryの画面は、該当スケルトンを処理し、その結果を埋め込む形でフレームスケルトン(_frame.html)が呼ばれます。サイドバーは、フレームスケルトン内から呼ばれています。

その他特殊なスケルトンは以下の4つです。

_main日記本文を生成するスケルントンです。
_main_onelog日記本文生成ですが、記事ID指定時の表示に使われます。
_sidebarサイドバーを生成するスケルトンです。
_multiuser_topマルチユーザーモード時のトップ画面です。

このblogレンタルサービスでは、_multiuser_top.html をカスタマイズして diary.user.skel/ に置いてあります。

デザインテンプレート

スケルトンをテーマディレクトリに置くことで「表示画面テンプレート」を作ることができます。例えば、携帯電話用テンプレート(HTMLの元)はtheme/_phone/_skelton/ に置かれています。

デザインテンプレートを作成する際は、theme/ 以下に任意のディレクトリを作成してください。この場合、テンプレート名と同名のテーマ(CSS)が必要になります。中身が空っぽでもいいので必ず置いてください。

theme/my_design/ ならば
theme/my_design/_skelton/ に任意のスケルトンを置き
theme/my_design/my_design/my_design.css というテーマファイルが必要

(選択中の)テーマディレクトリのスケルトンはユーザースケルトンよりも優先されます(しかしシステムモードではテンプレート(テーマディレクトリスケルトン)は無視されます)。

スケルトンの文法

adiary は Satsuki system という独自のスケルトンシステムにより作成されています。膨大な機能があるシステムですが、文法を簡単に説明しておきます。プログラム経験のある人ならさほど悩まないとは思いますが。

行コメント

<@> コメント

<@> で始まる行はコメントです。現在の仕様では、行の途中に <@> を書いてもコメントとして扱われますが、今後の仕様変更の可能性がある部分ですので、必ず行頭に書いてください。

実行構文

<$xxxx>
<@xxxx>

これらは「式」として評価されます。コマンドと言ったりもします。<$~>は実行されますが何も出力されません。<@~>は実行後の結果が出力されます。<@~> は次のような変数置換の形で最もよく使われます。

<li><a href="<@v.this_archive_dir><@v.rss_file>">RSS</a>
<li><a href="<@v.myself>?diary_list">過去日記の一覧</a>
<li><a href="<@Myself2><@v.path_info>?theme/_print/_print">印刷用の表示</a>

実行構文のコメントアウト

<#$xxxx>
<#@xxxx>

このように、コマンド内の先頭に # をつけることで、該当コマンドをコメントアウトできます。コメントアウトしても構文内の ( ) 対応や " "対応はチェックされます。

最適化構文

<@20> 最適化on

コンパイル最適化を指示します。基本的に書き換えないでください。

変数(名前空間)

Satsuki-systemでは、変数の名前空間をピリオドで区切ります。変数名は大文字小文字で区別されます

<@Myself>
<@v.rss_file>

前者は、ルートの中の Myself という変数を、後者は v の中の rss_file というものを示します。

Satsuki-systemでは、小文字で始まる変数名(名前空間)はユーザーに解放されていますが、設計時からの慣習で利用時のメインシステム(この場合adiary)を変数 v の中に入れることになっています。adiary のスケルトンではこのほか、変数 s に各ユーザーの日記帳情報(日記帳の設定情報など)を入れる約束になっています。

このことから、vs以外の小文字で始まる変数はカスタマイズ時に自由に使うことができます*2

begin/else/end

これについては、せりかさんの解析記事を参考にしてください。

Satsuki-systemの仕組み

この項目は Perl のオブジェクト指向に理解のある方以外は読まないでください(混乱するだけです)。

Perl では、無名のハッシュリファレンスにライブラリ名(ライブラリ名前空間)を結びつけることでオブジェクト指向を実現しています。Satsuki-system の名前空間というのは、adiary.cgi*3 で生成される Satsuki::Base のオブジェクト $ROBJ の中身そのものです。そしてよく見かける loadpm の実体は new そのものです(ライブラリをロードしてオブジェクトを new して返す)。

Satsuki-system名前空間と実体の対応関係は、次のようになっています。

Satsuki-system実体
<@Myself>$ROBJ->{Myself}
<@v.rss_file>$ROBJ->{v}->{rss_file}
<@call("sub/sub")>$ROBJ->call("sub/sub");
<$v=loadpm("XXX")>$ROBJ->{v} = $ROBJ->loadpm("XXX");

PerlのTemplateライブラリなどではスケルトンに対しハッシュをバインドできるようですが、Satsuki-system では、システム全体をスケルトンシステムの中に配置しています。Satsuki-system の驚異的な柔軟性と開発効率の要はここにあります。*4

Templateライブラリシステム ->テンプレート
Satsuki-systemスケルトン ->システム

実際、adiary.conf.cgi というスタートアップスケルトンを用意しなければ、Satsuki-system はまったく動きませんし、逆にスタートアップスケルトンだけでもある程度のCGIスクリプトを記述するも可能です。

ちなみに adiary.conf.cgi に <$Compile_log_dir="data/log/"> を定義すると、スケルトンが perl スクリプトへコンパイルされる様子をログとして見ることができます(遅くなるので通常はオフにしておきましょう)。

*2 : 一部利用している変数名もありますが、かぶることはないでしょう

*3 : Satsuki-system 共通スタートアップルーチン

*4 : Satsuki-system はいずれは単独公開する予定ですが。

2006/07/17(月)標準パーサ(さつきパーサ)とはてな記法の非互換部

非互換

はてな記法とほとんど互換性がありますが、気になる人のためにおよその非互換部分*1をリストにしておきます。

  • pre記法終わりの、行末|<が使用出来ない(|<のみの行が必要)
  • pタグ停止記法*2
  • カテゴリ記法「*[category]subtitle」は使って問題ありませんが、adiaryでは今のところ意味はありません。
  • id:xxxなどは無効で[id:xxx]などと書かなければならない。
  • [id:xxx][b:xxx]などに対応する記法が[hatena:id:xxx][hatena:b:id:xxx]である*3
  • tex記法使用時は、[[tex:xxx]]と書かないと互換性がないときがある*4
  • URLは自動リンクしない([http://adiary.abk.nu][http://adiary.abk.nu:adiary公式サイト]などと書く)。
  • ウクレレ記法、MML記法、自動リンク停止機能に対応していない。
  • はてなキーワード自動リンク機能はもちろん使えない*5
  • 注釈がセクションごとに出力される

なお、はてなの記事をインポートした場合、これらは自動変換されます。

*1 : はてなでは使えるがadiaryでは使えないもの

*2 : 表記が例外的すぎて対応する気が起きません。adiaryではエスケープ付きdivブロック記法などを使ってください。

*3 : 気になるなら、タグでaliasを設定すればok。

*4 : adiaryでは{}が特殊記号であるため、その処理を行わせないようにする措置が必要です

*5 : はてなAPIや正規表現リストを使えば不可能ではないのですが、いまのところ積極的に対応する必要性が感じられません

対応してなさそうで、互換あり

  • はてなフォトライフ(small表記などにも対応してます)
  • jan/eanコード、idea記法、rakuten記法、はてなRSS記法、はてなブックマーク記法、はてなグラフ記法等
  • はてなキーワード検索、はてな質問検索、はてな書籍/映画/音楽検索、はてなウェブ検索
  • aa記法

記法に対応しているとはいえ、はてなサービスとのシームレスな連携ができるわけではないのでご注意ください*6

その他、ぜひとも対応してほしい表記・対応してるか質問がありましたらコメントにでもどうぞ。

*6 : はてなサービスとのシームレスな連携を望むのならば素直にはてなを使いましょう。