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

2006/07/14(金)TeX記法について

TeXの数式を書ける記法です。使用にはmimeTeXが必要です(詳細

[[tex:l=\sqrt{a^2+b^2}]]
[[tex:\frac{2a}{-b\pm\sqrt{b^2-4ac}]

と書くと、

l=\sqrt{a^2+b^2}

\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}]]

を実際に表示させると

x_i+x_i+1+x_i+2

x_{i}+x_{i+1}+x_{i+2}

という違いとして現れます。最初の例では、{ }がタグとして処理されてしまっているわけです。(この仕様はβ7以降で有効です)

*1 : ここで説明する違いのほかに、裸の[[キーワード]]は[[キーワード]]のようにはてなキーワードへのリンクになるという違いがあります

TeX記法中の":"の扱い 2008/12/26

adiary Ver2.03以前には、TeX記法中に : が書けない問題があります。Ver2.04以降、[[ ]]環境中の":"は引数の区切りではなくそのまま処理されるようになりました。

[tex:f\:A \ni a \rightarrow b \in B]
[[tex:f:A \ni a \rightarrow b \in B]]

を表示させると、

#f: is not allow

#f: is not allow

となります。通常は後者の記述を使用してください

2006/07/12(水)7/12版スナップショット

  • コメントの新着判別が特定条件下で誤っていたので修正しました。
  • 記事keyや日付で記事を指定する[key:xxx]タグ[day:xxx]タグを作成しました。→詳細情報

今後カラム変更しないことを見据えて、カラム変更に関わりそうな改変を先行しました。β1を使用しているユーザーはまだいないと思いますが、「一度記事をエクスポートして日記を削除後インポートする」か、データベースの変更方法をお教えしますので、使用データベースの種類と共にお知らせください。

本レンタルサービス固有

  • アルバムのフォーム処理関連を最新ソースに更新しました。(→詳細
  • アップロード画面にアップロード最大サイズを表示するようにしました。*1

*1 : 表示位置がアレですが(;;

コメントSPAMがやってきた

レンタルサービスを開始して3ヶ月ぐらい(?)ですか。やっと、SPAMがやってきてくれました(拍手)*2。何をそんなに喜んでいるのかという話になりますが、この手の対策は実際に来ないと分析しにくいのです。もちろん、ネット上で有効な対策として、

  • 日本語を含まないものを弾く
  • 禁止キーワード/URL

などなどがありますが、あれこれと無闇に対策をとるよりも、有効かつシンプルな手だてに絞って実装したいと考えています。そのためには詳細な手口(ログ)が必要で、こればっかりは実際にSPAMロボットにやってきてもらうしかない。

というわけで、トラックバックSPAMも早く来ないかな(笑)

*2 : 非公開コメントで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この記事へと書けます。
  • 他人の日記の場合は kaedekaede: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以降で対応)。

追記。コメントで指摘された件、修正しました。

2006/07/08(土)Satsuki-system技術情報

はてな技術者のnaoyaさんのPerl技術記事見てたんですが

adiary関連の技術情報=マニュアルも本格的にまとめ始めたほうかいいなぁーと思ったりしたりしました。数日中にもβ版公開しましすが、ソースみただけではわからないところが多々ありますし。

比較的短期間かつ少人数(一人か)でこれだけのシステムになったのかってのは訳があって、生産性を担保するシステム構成によるところがとても大きいのです。それを担保してくれる Satsuki-system(スケルトンシステム)がなかったらadiaryの開発は不可能でしたし、そもそも「自作のスケルトンシステムがあまりに便利かつ有用なので、これを有効活用する手だて」としてblog(adiary)を開発したという、なんとも本末転倒な話だったりします(笑)*1

*1 : もっともSatsukiシステム自体も、adiary開発の過程で大きく進化したわけですが、基本コンセプトは何ら変わっていません。それぐらいコロンブスの卵的なコンセプトでした(自画自賛

Satsuki-systemとTemplate Toolkitの比較

スケルトンシステムというのは何度も申し上げているとおりで、Perlの変数埋め込みを一歩進めて簡単な命令を書けるようにしたものです。この考え方の有名な例として、Movable Typeにも使われている*2 Template Toolkitがあります。このTemplate Toolkitは変数置換の他、簡単な条件構文やループなどをHTMLテンプレート中に記述できます。

Template Toolkitでは読み込まれたHTMLファイルを、Perlで実行可能なプログラムとしてテンポラリに吐き出します。次以降は、そのコンパイルされたファイルを実行するわけです(mod_perlのときはキャッシュされるのかな?)。Satsuki-systemも紆余曲折の上、現在はその形に落ち着いています。

でも、Satsuki-systemとTemplate Toolkitは決定的に違うところがあります。Template Toolkitのキャッシュはperlプログラムとして実行することでそのまま出力HTMLが得られますが、Satsuki-systemのそれは、そのまま実行することは不可能なプログラムになっています。Satsuki-system本体とコンパイル済のプログラムの2つが合わさって初めて意味を持つわけです。

なんだ「使いにくいだけじゃないか……」と言われるかもしれませんが、実はそこが最大のミソなのです。Satsuki-systemはスケルトンシステムでありフレームワークでもあります。スケルトンシステムから参照する必要なルーチン(ライブラリ)は、システム本体に納められており、そのライブラリ部分を自由に拡張できることこそが最大の特徴です。

以下はスケルトンのコメント表示部分を抜き出したものです。

<p><span class="canchor"><a href="<@t.this_diary_url>#c<@t2.pkey>#">#</a></span>
<span class="commentator"><span<@if(t2.id, " title=<@t2.id>")>><@t2.name></span></span>
『<@t2.text_short>』 <span class="comment-date">(<@tm_printf('%Y/%m/%d %J:%M', t2.tm)>)</span></p>

強調表示のところが埋め込みです。大半はただの変数置換だと思って問題ありません。一番最後の、tm_printf が関数呼び出しとなっていて、この実体はSatsuki-system本体(Base.pm)に含まれます。この関数に相当するものを増やしていくことで、システム全体を構築します。*3

つまり、Template Toolkitキットでは「Perlプログラムの付属品としてのHTMLテンプレート」であったわけですが、Satsuki-systemでは「スケルトン(HTML)の付属品がPerlプログラム」なのです。

*2 : Movable Typeはより簡易なHTML::Template のようです。

*3 : 厳密にはちと違います

Satsuki-systemとPHPの比較

そこまで、スケルトン万歳ならはじめからPHPみたいな埋め込み言語を使えばいいじゃないかという話になります。PHPは使ったことはないのですが、一つそして決定的にPHPを使いたくない理由があります。プログラムとHTMLのソースが一緒になっててメンテしずらい。きちんと書かれた(?)PHPのソースならばそうはならないのかもしれませんが、1画面=1HTML=1プログラム主義のように感じます。

というわけで、もちろんSatsuki-systemだって同じだろうというツッコミもあります。adiaryの日記一覧のような部分は、実際にHTML内にPHPのようにプログラム的動作を記述してページ送りなどを実装していますから、同じといえば同じです。ですが、それは推奨される形ではなく、ほとんどの場合1ページに対して1つのPerlのサブルーチンが付属しています。

RoRのモデル・ビュー・コントローラー的な考えからいえば、Viewがスケルトンで、ControllerがPerlのコードということになります。PHPとの大きな違いはここですが、PHPのプログラム部を外部ファイルとして追い出したとしたら(本体には呼び出しのみ残る)、似たようなものだと思います。

Satsuki-systemとRuby on Railsの比較

比較も何も……似たもの同士です*4。これは別にRoR的思想を取り込んだわけではなくて、Satsuki-systemの「変数埋め込みHTMLの拡張」を突き進めた結果、似たようなものにたどり着いたというわけです*5。もっとも、最初の思想からMVCなRoRとはスタート地点で負けているわけですが、そこを敢えて比較すると

  • Satsuki-systemはPerl用である。開発時点でRubyよりPerlの方が処理が速かったのがPerlになった理由ですが、Ruby 2.0 YARVが登場すると立場逆転しそうです(汗
  • RoRの方が思想的にOO(オブジェクト指向)として綺麗である。そもそもPerlのOOはやっつけなので、これもスタート地点で負けてます。

となります。勝ち目ないですけど(汗) 後ろ向きなアドバンテージは、

  • 今この時点においては、Perlの方が速く動作する。*6
  • Perlの方が普及してるし、ユーザーも多い*7
  • 必ずしも「データ(データベース)」対応でなくてもよい分、Satsuki-systemの方が汎用的かもしれない。
  • 昔ながらのきついルールーより実用主義的なプログラマには…ry(^^;;

*4 : RoRがコードジェネレーターなどの周辺ツールを含む本格的なフレームワークかつ、より徹底されたMVCということを別とすれば、全体的な設計思想としては似てるということです

*5 : RoRの存在を知ったのはつい最近のこと

*6 : でもPerl6はそうそう出そうもないなぁ……

*7 : だからどうした的なモノですね……

まとめると

んー……Perl版フレームワークのないRoRの出来損ない?(ぉぃぉぃ*8

もっとも、

  • 可能な限り高速に動作するよう設計されている*9
  • mod_perl (prefork/worker)でもcgiでもSatuki-systemが差を吸収してくれる(ただし若干気を遣って書く必要はあり)

ですけども。早くマニュアル整備しろってことですね(汗)*10

*8 : 簡単なフレームワークスクリプトを後々作成するといいかなぁ。実際、プログラムの一番最初の書き出しだけが若干面倒で(苦笑)

*9 : そういえば、Template Toolkitのはき出すソースが結果出力をスカラ変数に文字列連結してるのはいかがなものかと思うんだけどなぁ……個人的に

*10 : 機能ありすぎ&内部構造まで書き始めると、いろいろと細かい技がありまして(^^

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

  • 標準テーマ以外でも、システムモードで使用できるように変更しました*1
  • 【画像アルバム】アルバム用アップローダの実装方式を変更しました(使い勝手に変更はありません)。
  • 標準添付の「画像アップローダー」を作成しました。ImageMagickがあるとき、サムネイルを自動生成します。
  • その他、細かいバグの修正

これでやっと、adiaryの本体機能の開発に復帰できます(苦笑

*1 : テーマファイルの方でシステムモードでの動作を許可するフラグが必要です。

追記

と思ったらIE5/6でCSS関連の表示が楽しいことになってる(汗) 特にIE5は感動的なまでにすばらしい。これをまず直すのかぁ……(かなりやりたくない