MovableTypeの最近のブログ記事

先日のMTDDCは部下の結婚式で行けなかったのですが、今週末に広島で行われるMT関連のイベントにスピーカーとして参加します。

いよいよ今週末(8月7日)となりましたが、広島県内Pronetパートナーのメンバー他、藤本壱さん、私(野田純生)が登壇してMTに関するトークディスカッション、講演等で構成されるイベント「第2回広島MT学会inFUKUYAMA」が開催されます。スポンサー企業からのプレゼント等もあります。

西日本ではこのような大規模なイベントは中々開催されませんので、MTユーザーの方、仕事でMTを扱われている方は是非ご参加ください。

「第2回広島MT学会inFUKUYAMA」

(野田のセッションの)テーマは、地方、東京、小規模Web制作事業、MT等

このエントリのタイトルの通りなのですが、せっかく東京でなく地方でやるわけですから、「地方」を切り口にした話をしたいと思いました。最初は「プラグイン」というリクエストで依頼があったのですが、そこは敢えて私から提案させていただきました。

実際、東京でのカンファレンスやCSS NiteのLPの時なんかは北海道とか九州から飛行機で参加したりされてるわけですし、地方でも面白い切り口で話せば参加したいと思ってくださる人もいるんじゃないかと思ってのことです。

このブログでも何度か書いていますが、ウチの会社は1人で大阪で7年前に作った会社ですし(現在は大阪-東京で12名)、つい数年前までは本当にSOHOに毛が生えたような事業を行っていました。Movable Typeを利用して(もちろんMTでなくてもいいと思うのですが)どのようなビジネススキームを企画してどう実行するか、どんな可能性があるのか、また「シックス・アパート」さんとの付き合い方やコミュニティのパワーをうまく仕事に活かすような取り組みの話とか、東京では話せない(話せないことはないですが)、「地方の、東京の、MTの本当のところ」を話したいと思います。今回は中継はないんですよね? ギリギリトークで行きたいと思います。

テーマは今日決定したのでアジェンダはこれからですが、今日のところは思うところを羅列しておきます。MTの技術的な面も絡めながらですが、Web受託、地方、小規模事業者が勝ち抜くためのヒントになれば、あるいは考えるきっかけになれば幸いです。

  • 地方のウェブ制作の原状(大阪にて思うこと)
  • 東京との違い
  • 東京の仕事をどうするか
  • MTで出来ること
  • MTのビジネス
  • 受託++
  • シックス・アパートとの付き合い方(あくまでも自分的に思うところ)
  • Web制作会社の自社サイト戦略
  • アルファサードのビジネススキーム
  • イントラMTで自社を変える

来て良かった、と思っていただけるよう頑張ります。それでは、福山でお会いしましょう!

MTIncludeは遅いのか?

| コメント(0) | トラックバック(0)

結論を先に書きます。遅くない。遅い場合についてもMTIncludeタグ自身の影響は些少。

MTのスタティック・パブリッシングにおける再構築とはつまりこういうことかと思います。

  1. テンプレートをロードしてコンテクストをセットする。
  2. 各タグ内で必要に応じてデータを取得したりコンテクストをセットし、
  3. ブロック(テンプレート)をコンパイルしてビルドしていく。
  4. この時インクルードされているテンプレート(モジュールやウィジェット)があればロードして展開する。

詳しくはlib/MT/Template/WeblogPublisher.pm (lib/MT/Template/Builder.pm とか、あと各テンプレートタグについては lib/MT/Template/ContextHandlers.pmなんか)を見れば理解できると思います。

さて、上記の4番目のロードとは、SQLを発行してデータベースからテンプレートを読み込むことを指します。SELECT * FROM `mt_template` WHERE template_blog_id=2 AND template_name='サイドバー' AND template_type='custom' みたいなやつです。

ですので、当然ながらフラット化されたテンプレートと比較すると遅くなる、重くなると思われがちで、一見この指摘は正しいように思えます。それがMTIncludeが重いといわれる原因でしょうか?

実際にやってみました。

  • 新規にMTをインストール。標準以外のプラグインはなし。
  • クラッシックウェブサイト以下にクラシックブログを作成。
  • このブログをエクスポートしたデータをインポート(エントリー数は588)。
  • ブログ記事の再構築を行う(5回計測。平均3分46.0秒)

3分43秒 / 3分44秒 / 3分48秒 / 3分49秒 / 3分46秒

さて、ブログ記事テンプレートの「サイドバー」モジュールをブログ記事テンプレートの該当箇所にそのまま貼付けて再構築を行いました。MTIncludeを使わないパターンです。結果...

3分55秒 / 3分53秒 / 3分49秒 / 3分47秒 / 3分51秒

変わんなかった(5回計測。平均3分49.2秒)。むしろ遅い?変わらないのはともかく遅くなった原因はわかんないです。が、まぁ誤差の範囲でしょう。

但し、以下の事実は知られていないかもしれないので書いておきます。

インクルードしているテンプレートモジュール(ウィジェット)のロードは1リクエストにつき1回だけ

具体的にはlib/MT/Template/ContextHandlers.pm の3598行目。MT::Requestにキャッシュされていない時だけロードされます。

ちなみに1リクエストというのは、mt.cgiへのリクエストです。MTのブログ記事の再構築は1度のリクエストで環境変数 EntriesPerRebuild の設定値(初期値は40)ずつ実行されます。40ファイル再構築後はリダイレクトして再び40ファイルの再構築を(これをエントリ数を40で割った回数分)繰り返すわけです。 588ファイルの再構築であれば、リクエストは15回です。EntriesPerRebuildの値を100にすればリクエストはわずか6回。つまり、テンプレートをロードするためのSQLのリクエストは100ファイルの再構築時にわずか(インクルードしているモジュールが1つあたり) 1   6 回です。

つまり、インクルードしていることの影響は些少といえます。

さて次。コンパイルです。ビルドする前にコンパイルします。MTIgnore云々の話はこのコンパイル時の話になります。計測のため(というか本当に速くなるんだったらいいなと思って)MTCompileCacheBlockというタグを作ってテストします。


sub _hdlr_compile_cache {
    my ( $ctx, $args, $cond ) = @_;
    require MT::Request;
    my $key = $args->{ key };
    my $id = "compile_cache_$key";
    my $r = MT::Request->instance;
    my $cache = $r->cache( $id );
    my $builder = $ctx->stash( 'builder' );
    my $tokens;
    if ( $cache ) {
        $tokens = $cache;
    } else {
        my $tmpl = $ctx->stash( 'uncompiled' ) || '';
        $tokens = $builder->compile( $ctx, $tmpl );
        $r->cache( $id, $tokens );
    }
    my $res = $builder->build( $ctx, $tokens );
    return $res;
}

テンプレートは以下のようにモジュールを囲む形で書きます。


<MTCompileCacheBlock key="sidebar">
    <$mt:Include module="サイドバー"$>
</MTCompileCacheBlock>

3分51秒 / 3分51秒 / 3分46秒 / 3分46秒 / 3分47秒

3分48.2秒。これも...誤差の範囲じゃないですか?

高速化云々の話をする時には「どこがツボ」かを考えないと無駄な努力に終わる可能性が高い。

ツボは何? そう、ツボは「ビルド」です。テンプレートキャッシュが有効なのはキャッシュした部分のテンプレートをビルドする処理を2回目以降スキップできるから劇的な効果が見込めるわけです。

では何故MTIncludeが重い(遅い)と(しばしば)指摘されるのか?

本当のところはわかりません。推測ですがおそらく「最近のブログ記事」とか「最近のコメント」等の相応に負荷のかかるブロックタグを利用したブロックがモジュール化されているからじゃないかという気がしますが。確かにそういった場合にキャッシュしていない場合に全体的に重くなることは事実で、でもそれはMTIncludeのせいではなくて各ページで共通の結果を出力する部分をキャッシュせずに処理していることが問題なわけです。MT3の頃だったか、モジュールをインデックス・テンプレートにして吐き出しておいてファイルとしてインクルードするようなTipsがあったかと思いますが、確かに劇的に効果的にはたらくケースもあります。

MT4(.xだったか記憶曖昧ですが)から実装されたテンプレートモジュールのキャッシュを使えば一定時間はビルドされずキャッシュが使われますからこれは効果があります。但し、再構築中に間違いに気づいてブログ記事を削除したりしたときに「最新のブログ記事」リストに削除したものが残ってしまうといった問題がないわけではないので、リクエスト毎にキャッシュを生成するようなプラグインなどはお手軽で、データベースでなくメモリへのキャッシュですので(最初の1回しか)クエリも発行されないといったメリットがあり劇的に軽量化できます。

ということで、フロントエンジニアの人はMTIgnoreもMTIncludeも積極的に使って可読性が高くメンテナビリティに優れたテンプレートを書くことに集中すれば良いと思うのです。思うのでした。

追記

モジュールをフラット化した状態でCompile結果をキャッシュして実測。

4分1秒 / 3 分52秒 / 以下省略

あとMTIgnoreタグで囲めば処理しないという幻想がまことしやかにささやかれていた時期がありましたが、
あいつ一旦タグの内容なめてからコメントアウトしてますから、処理時間はその分もかかりますよ。
不要な記述はMTIgnoreするのではなく、テンプレート上から削除しましょう。

おっと、知らなかった。確認。

lib/MT/Template/Tags/Blog.pm の 166行目にちょっと追記。


    MT->log($name);

インデックス・テンプレートを作成


<MTBlogName>

プレビューまたは再構築してログ確認すると、ブログ名がログに残る。

テンプレートを下記のように修正。


<MTIgnore><MTBlogName></MTIgnore>

プレビューまたは再構築してログ確認すると、ブログ名がログに......残りませんね(そりゃそうだろ)。

一応念のため確認。

lib/MT/Template/ContextHandlers.pm の23行目


            Ignore         => sub { '' },

はぁ...

モジュール使わないとか直書きするとかコメント削除とか考えてないで可視性が良くメンテナンスしやすいテンプレートにすることだけ考えてたら良いと思うよ。あとはバックエンドの実装の人とか偉い人とか(ハードにお金出してくれる人とか)が考えたらいい。

こういうのはMovable Typeコンテストに「ダッシュボードの部」ってのを設けたらいいんじゃないかなー

ユーザーダッシュボードの充実を希望 - MTQ | Movable Type 5 ユーザーコミュニティ

WordPress を引き合いに出すのは気分悪くする人もいるかもしれないのでしたくないのですが、しかし、あまりにも違うので議論にお付き合い下さい。

(中略)

Movable Type のユーザーダッシュボードの場合は、今後開発されるのでしょう!というような感じで、ほとんど有用な情報が表示されません。あるいは、あえてシンプルにして初心者に優しくしているのかもしれません。だとしたら、ブログのダッシュボードの方は、充実してもらいたいものです。


ということで、ユーザーダッシュボードを楽しく(そしてちょっとだけ便利に)してくれるプラグイン6種。 既にこれまでに公開済みのものも含みますが新規に2つほど追加して公開済みのものも若干手直しを入れてまとめて公開します(変更のないものもあります)。

ユーザーダッシュボードのキャプチャ

MT_Tags

MTタグを定期的にTweetしてくれるTwitterアカウント「MT_Tags」が紹介するタグをランダムにユーザーダッシュボードのタイトル(こんにちは、Junnamaさん)の代わりに表示します。気が散る方にはお勧めしません。

MTQ

MTQのフィードから新着10件を表示するウィジェットです。

QuickEntry

ダッシュボードからブログ記事を投稿出来るウィジェット(MT5.02でjQueryの扱い方が変更になっている点に対応、右カラム/メインカラムどちらに表示させることも可能にしました(出来てなかったので差し替え済み))。

UserDashboard

ユーザーダッシュボードに左メニューを表示させ、This is Youウィジェットを右カラムへ移動して着脱可能にします(不具合指摘いただいていたのですが5.02で動作確認済みです)。

ViewSite

ユーザーダッシュボード/システムメニューにViewSiteリンク(サイトを別ウィンドウで表示するリンク)を追加します(既に公開しているものと変更はなし)。

LoveRebuild

ユーザーダッシュボード/システムメニューにも再構築リンクを表示するウィジェットです(見栄えの修正 - * ふざけた画像は取り敢えず外したw)。

ちなみにこのエントリはQuickEntryダッシュボードからの投稿です。

Dakiny さんの呼びかけに壱さんが反応する形で何だかスレッドまで立ってますね。以下、引用は主に壱さんのエントリから。

今後のMTへの要望(その1・再構築編)

1.「再構築の重さ」で多くのユーザーを失った

まぁ、これが直接の原因かどうかは僕にはわかんないんですけどね。静的パブリッシングだから採用されるっていうケースも多いのは事実です。個人ブログとしてではなく、そこそこの規模のCMSが前提ですが。

2.MT標準のダイナミックパブリッシングは不十分

多くのプラグインはダイナミックパブリッシングには対応していません。
また、テンプレート内にPHPを記述することもよくありますが、そのテンプレートをダイナミックパブリッシング化する際には、PHPの部分をSmartyの記法に書き換える必要があります。
これらのことから、既存のブログをダイナミックパブリッシングに変えるのは困難です。
実質的に、ダイナミックパブリッシングは使えないと言って良いでしょう。

不十分なのは単にプラグインの書き手の手抜きではあるわけですよね。Power CMS for MTは基本ダイナミック全対応が前提です。確かに2つの言語で書くことの負担はあるわけですが。SAKKさんに落ち度があるとしたら、ドキュメントとかサンプルの少なさですね。ことダイナミックに関しては。

まぁ、前置きはいいです。黙ってコードを書けよってことだよ。

RebildAt1stViewを書き直した

  • MTディレクトリの直下のtools以下に「rebuild-from-fi」を設置して実行可能なパーミッション(755とか)を与える
  • plugins/以下にRebuildAt1stViewディレクトリをコピー(DBのアップグレードあり)
  • mtmlディレクトリのmtview_php.mtmlを出力ファイル名mtview.php、_htaccess.mtmlを出力ファイル名.htaccessとしてテンプレートに登録、再構築
  • 適用したいインデックス/アーカイブテンプレート編集画面で「このテンプレートの再構築を最初のリクエスト時に行う」にチェックを入れます
  • 再構築(チェックを入れてたら一瞬で終わる筈>再構築は単なるファイル削除だから)
  • 最初にリクエストがあった時点でファイルがなければ再構築されファイルが出力されます(で、ビルドされたファイルの内容がブラウザに返されます)

処理はPHPで行います。PHPがPerlスクリプトを介してビルドするから、Perlプラグインがそのまま使えます。吐き出されたファイルがPHPだったら、それもちゃんと処理されます。

何かうまく説明出来ないけどね、Perl版ダイナミックだけどPHPで動いててPHPが使えるソリューション、ってことだね。

QuickEntryプラグイン。

| コメント(3) | トラックバック(0)

ユーザーダッシュボード他各ダッシュボードからブログに投稿できるダッシュボンードウィジェットです。ブログ以外のダッシュボードでは権限を有するブログをSelectメニューから選択してください。

クイックエントリダッシュボードウィジェット

QuickEntry.zip

クイック投稿ってのが目に付いたのでMTプラグイン作ってみた。

クイックエントリダッシュボードウィジェット


QuickEntry.zip

で、これを使って投稿テストしてみます。とはいえ、これってむしろユーザーダッシュボードにあったほうがいいですよね。後で時間があったらそうしてみよう。

5月10日さらに追記:新規に作成したユーザーにも(正確には権限を割り当てた際に)適用するようにしました。

5月10日追記:管理者以外のユーザーのところで表示オプションがおかしなところに出てしまっていたので修正しました。

Twitter / にっく:【緩募】MovableTypeで、Aさん(もしくはシステム管理者)がカスタムフィールドの並び替えをしたときに、他ユーザー(Bさん、Cさん)も強制的にAさんの並び順にさせる方法をご存じの方、いらっしゃいますでしょうか。

Twitter / Seiko Kuchida:@Nick_smallworld カスタムフィールドの並び順に関して私の方でわかってるのはこのくらいですが、少しでも参考になれば。てゆか誰かプラグイン作ってくれないかなあ。 #movabletype

【緩募】って書いてあったので見逃してました...とか。要するにそういうこと(エントリの表示オプションを管理者が変更した時に全対象ユーザーに設定を適用)をするプラグインです。

ただ、単にそうすると管理者以外のユーザーが表示オプションを変更した時に違和感があるので、プラグインを設置すると管理者以外では「表示オプション(Display Options)」のリンクが非表示になるようにしました。

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

あれこれ忙しかったんですが明日の公開になるとエイプリルフールネタにされてしまうので今日公開してみました(ほんとはPower CMS for WPとか、て考えたりもしたけど、何かもうありがちすぎてやめる。僕はMTでいいじゃん派だから)。

最近もちろん仕事でも色々作っているんですが、一番個人的に面白かったのがこれです。

チュートリアル的に丁寧に書いたつもりなので詳細はリンク先を見ていただくとして、僕は基本的にCMSは静的にページを生成できるものが最強だと思ってます。動的生成って色々逃げられる代わりに本当に大きなサイト動かそうと思ったらセキュアに運営しようと思ったら、DB接続が常に前提なものって本当夜も眠れない。負荷がきつくなったら、とかDBがクラッシュしたら、とかDBが落ちた、とか考えるとしんどいんですね。ただ、部分的に動的ってのが好きな人が世の中には一定数いるらしい。

MTの場合はダイナミックパブリッシングのしくみが標準で用意されていて、動的にページを変化させるとか(時間帯によって「おはようございます」とかたとえばそんなものひとつとっても)はテンプレートタグで出来るわけですが、僕自身ダイナミックパブリッシングにはいくつか不満がありました。

MTのダイナミックパブリッシングのキャッシュ

MTのダイナミックパブリッシングでは、一度ページが閲覧されるとビルドされた内容がキャッシュされます(キャッシュを有効にしている場合)。一回目の表示は重いです。いかにもDBにアクセスして表示してますって感じ。ところが一度キャッシュされたページは早い。ファイルを返してるだけですから比較にならない軽さです。

ところが、MTのダイナミックパブリッシング(というよりSmartyのキャッシュかな?)ではクエリ付きのページのキャッシュが出来ない。正確には出来ないんじゃなくて、?query=hoge がついているものとついていないものが同じキャッシュに保存されてしまうため、クエリーなんかで分岐したいケースで使えないのです。同じく時間によってどうとか、常に動的に変化させたい場合は使えない。ところがキャッシュが無効なダイナミックパブリッシングって重いというか、DBが悲鳴を上げているのが伝わってきて痛々しいのです。

なので、共通部分や動的に構築しなくて良い部分をスタティックに吐くようにしてそいつをダイナミックからインクルードして、とかやるんですけど、はっきりいってもっと楽にやりたいじゃないですか。それって「テクニック」的な何かなわけで、そいつを実装・構築する人に考えさせちゃ駄目だと思うんです。また、MTの場合はPHP対応プラグインがまだまだ少なくて、Perlで書いたのが動かないって指摘も良くされるわけで、じゃぁPerlで構築する部分をインクルードして...ってやっぱりそれは何かち・が・うと思うのですね。

MTML使いはもっと自由にサイトを構築できていいと思う

また、出力されるアーカイブをPHP化してどうってのもあんまり好きじゃない。自分で書いててなんだけど、この記事で紹介したみたいな書き方って結局CMS使ってるメリットないもの(MT5のBrand new API(DPAPI)と格闘してみた(続き))。

誰かがどこかで書いてましたけど、一つのファイルやテンプレートの中にHTMLとJavaScriptとCSSだけならまだしもPHPとSQLまで書いてあるって何なんだと思うのです。

で、PHPのコードとか直接書くくらいだったら、MTタグ書いてそいつをビルドできれば敷居がグッと低くなるし、PHPは書けないけどMTMLは書けるって人は嬉しくないかな? と思ったのが発端です。

だってこれ使うと例えばWe○○elease2で作ったページにだってMTタグが書けるんですよ? (僕がそういうこと書いちゃいかんか...)。もちろんDreamweverでページ作成してアップしてるサイトだって、MTタグ書いておけばそれが動いちゃうんだ。単なるテンプレートエンジンとして考えればコードの中にプロラグムとHTMLが混在してるより、MTの場合は「タグ」ですから。

そんでもって、MTMLってもう単なるタグじゃないくらいにプログラミングチックなことも出来るわけですよね。だったらMTML使いはもっと自由に動的なWebサイトの構築が出来ていいんじゃないか?

何だかまとまらないポストになりましたが、これ、面白いと思うんでついカッとなって(嘘)久しぶりにポストした次第です。

無償での利用も出来るようにしてますので、是非試してみてください。これ、面白いです。

Twitterのタイムラインについつい気を取られたりTweetしてばっかりで仕事に集中できていないみなさんこんにちは。今日は、そんなみなさんにMTのユーザーダッシュボードの「こんにちは、junnamaさん」の代わりに複数指定したフィードの中からランダムにタイトルを表示するプラグインを紹介するよ。

ユーザーダッシュボード

フィードは5つまで指定できます。仕事に集中? できない? 多分できないと思うよ。ご利用は自己責任で。だってここからリンク飛ぶとリファラから管理画面のURLとか飛んで行くから嫌な人は気になる発言にカッとなったりしてリンクを踏んだりしないこと(これ約束ね)。

プラグイン設定画面

尚、初期設定で設定されているフィードと僕の趣味嗜好は一切無関係です。

※Feeds.App Liteのライブラリを利用しています。

プラグインのダウンロード

このアーカイブについて

このページには、過去に書かれたブログ記事のうちMovableTypeカテゴリに属しているものが含まれています。

次のカテゴリはMovableTypeプラグインです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。