毎秒1000リクエスト を捌く超高速CMS「adiary」
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などで使用しています。
特殊な役割をするスケルトン
まず重要なのが外側のフレームを生成するスケルトンです。通常、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 に各ユーザーの日記帳情報(日記帳の設定情報など)を入れる約束になっています。
このことから、vとs以外の小文字で始まる変数はカスタマイズ時に自由に使うことができます*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 スクリプトへコンパイルされる様子をログとして見ることができます(遅くなるので通常はオフにしておきましょう)。
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
- 注釈がセクションごとに出力される
なお、はてなの記事をインポートした場合、これらは自動変換されます。
対応してなさそうで、互換あり
- はてなフォトライフ(small表記などにも対応してます)
- jan/eanコード、idea記法、rakuten記法、はてなRSS記法、はてなブックマーク記法、はてなグラフ記法等
- はてなキーワード検索、はてな質問検索、はてな書籍/映画/音楽検索、はてなウェブ検索
- aa記法
記法に対応しているとはいえ、はてなサービスとのシームレスな連携ができるわけではないのでご注意ください*6。
その他、ぜひとも対応してほしい表記・対応してるか質問がありましたらコメントにでもどうぞ。
2006/07/14(金)TeX記法について
TeXの数式を書ける記法です。使用にはmimeTeXが必要です(詳細)
[[tex:l=\sqrt{a^2+b^2}]] [[tex:\frac{2a}{-b\pm\sqrt{b^2-4ac}]
と書くと、
となります。
TeX記法は [ ]ではなく[[ ]] の中に書くことに注意してください。両者はほぼ同じ働きをしますが*1、後者は{ }によるmini-pre、mini-varbatimが処理されません(無効化されます)。
つまり、
[tex:x_{i}+x_{i+1}+x_{i+2}] [[tex:x_{i}+x_{i+1}+x_{i+2}]]
を実際に表示させると
という違いとして現れます。最初の例では、{ }がタグとして処理されてしまっているわけです。(この仕様はβ7以降で有効です)
TeX記法中の":"の扱い
adiary Ver2.03以前には、TeX記法中に : が書けない問題があります。Ver2.04以降、[[ ]]環境中の":"は引数の区切りではなくそのまま処理されるようになりました。
[tex:f\:A \ni a \rightarrow b \in B] [[tex:f:A \ni a \rightarrow b \in B]]
を表示させると、
となります。通常は後者の記述を使用してください。
2006/07/12(水)7/12版スナップショット
- コメントの新着判別が特定条件下で誤っていたので修正しました。
- 記事keyや日付で記事を指定する[key:xxx]タグ[day:xxx]タグを作成しました。→詳細情報
今後カラム変更しないことを見据えて、カラム変更に関わりそうな改変を先行しました。β1を使用しているユーザーはまだいないと思いますが、「一度記事をエクスポートして日記を削除後インポートする」か、データベースの変更方法をお教えしますので、使用データベースの種類と共にお知らせください。
本レンタルサービス固有
コメントSPAMがやってきた
レンタルサービスを開始して3ヶ月ぐらい(?)ですか。やっと、SPAMがやってきてくれました(拍手)*2。何をそんなに喜んでいるのかという話になりますが、この手の対策は実際に来ないと分析しにくいのです。もちろん、ネット上で有効な対策として、
- 日本語を含まないものを弾く
- 禁止キーワード/URL
などなどがありますが、あれこれと無闇に対策をとるよりも、有効かつシンプルな手だてに絞って実装したいと考えています。そのためには詳細な手口(ログ)が必要で、こればっかりは実際にSPAMロボットにやってきてもらうしかない。
というわけで、トラックバックSPAMも早く来ないかな(笑)
2006/07/12(水)記事key指定機能、日付指定機能
key記法、day記法
記事keyおよび日付指定を指定する機能を付けました。例えばこの記事のURLは
(a)http://adiary.blog.abk.nu/060
(b)http://adiary.blog.abk.nu/xxx
ですが、このとき記事keyは 60 番になります(トラックバックURLでも分かります)。以下は例。
-(a)へのリンクは[key:060]や、ほかのタグと同様に[key:60:この記事へ]とも書けます。 -(b)へのリンクは[key:xxx]や[key:xxx:この記事へ]と書けます。 -他人の日記の場合は [id:kaede] や [id:kaede:158] とします。 -日付指定は [day:7:7日の記事] や [day:7/7]、そのほか[day:2006/6]とも書けます。 -その日を指定したい場合は単純に [day:] や [day:今日の日記] で行けます。 -他人の日記は、[day:kaede] [day:kaede:7/7] という風に書けます。 -アンカー指定は [day:kaede:0142:#p1] や [key:15:#p2] という風に書きます。 -当日の日記は [key:#p1] や [this:#p1] で指定できます(β7以降で対応)。
- (a)へのリンクは記事key指定機能、日付指定機能や、ほかのタグと同様にこの記事へとも書けます。
- (b)へのリンクはxxxやこの記事へと書けます。
- 他人の日記の場合は kaede や kaede:158 とします。
- 日付指定は [date:(format error)] や [date:(format error)]、そのほか[date:(format error)]とも書けます。
- その日を指定したい場合は単純に [date:(format error)] や [date:(format error)] で行けます。
- 他人の日記は、[date:(format error)] [date:(format error)] という風に書けます。
- アンカー指定は [date:(format error)] や 日記記法の説明 という風に書きます。
- 当日の日記は #p1 や #p1 で指定できます(β7以降で対応)。
追記。コメントで指摘された件、修正しました。