Movable Type 備忘録

 MovableType 3.3 標準のタグ機能について

MovableType(ムーバブルタイプ) 3.3から追加された新機能の1つにエントリ・タグがあります。 エントリ・タグとはカンタンに言えば、エントリに関連するキーワード…といったところでしょうか。 この標準のタグ機能を使ったタグクラウドを作ってみました。

結論から言うと、わたしのブログでは標準のタグ機能はしばらく使わないことにしました。

標準のタグ機能でタグクラウドを作ってみて不満だったのが、

  • 出現頻度によるタグの強調しかできない
  • タグ数が増えると、再構築の時間が異様に掛かる( 失敗することがある )

という理由からです。

出現頻度によるタグの強調しかできない

例えば、わたしのブログではMovableTypeというタグ( キーワード )がもっとも多く出現しているわけですが、このMovableTypeというタグ( キーワード )が仮に半年以上使われていなかったとしても、1番目立つ( 大きく表示される )ような表現しかできないみたいです。

その点、tagwireプラグインを使ったタグクラウドなら、出現頻度を文字の大きさで表して、更新頻度を文字の色で表現することが可能です。 先ほどの例だと、半年以上使われていないタグ( キーワード )の場合には、文字の大きさはそのままですが、更新頻度で薄い色で表示されることで、まわりのタグ( キーワード )よりも目立たなくなるわけです。

タグ数が増えると、再構築の時間が異様に掛かる(失敗することがある)

- 2006.09.02 追記 -

エラーが発生していたバージョンはMovableType(ムーバブルタイプ) 3.31で、それ以降のバージョンでは改善されました。 ですので、以下のパッチもあてる必要がなくなりました。

わたしのブログでも先日からMovableType(ムーバブルタイプ) 3.3にアップグレー ドして使っています。 β版のときは気づかなかったのですが、再構築すると「500 Internal Server Error」エラーが発生します。

実は、アップグレード前からmagnet:..さんから、この現象について教えていただいていたので、すぐに対処することができたんです。 magnetさんが調べたところによると、どうやら新機能であるタグが原因とのことです。 テンプレート内にエントリのタグを表示するコードをコメント( 削除 )することで対処できました。

わたしのブログでさえ、やたら時間がかかるのですから、もっとエントリ数が多いブログではそれなりにかかっているのではないでしょうか。

ということで、わたしのブログでは標準のタグ機能を使わないようにしています。 でも、一応エントリの「タグ」入力欄には関連するタグ( キーワード )を入れてますけどね。

ちなみに、Ogawa::Memorandaさんのところから、エントリの「キーワード」を「タグ」に変換するツールが公開されています。

- 2006.07.15 追記 -

Ogawa::Memorandaさんから、この現象に関する修正パッチが公開されました。

さっそく、わたしもパッチをあてて標準タグを確認してみました。 結果、正常arrowに再構築もできて、エントリのタグ一覧、タグクラウドも表示することができました。
詳しいことは、Ogawa::MemorandaさんのMT 3.31のMTEntryTagsの性能バグをご覧ください。

そして、以下がわたしが実際にパッチをあてて確認したコードになります。 以下のコードは、やっぱりOgawa::Memorandaさんの3.31-ja UO PatchのWiki(ウィキ)を読んでから作りました。必ずパッチを当てる前によく読んでから行ってください。

mt/lib/MT/Template/ContextHandlers.pm を修正します。

  1. 567行目
  2. # 2006.07.15 modify
  3. # my $blog_id = $ctx->stash('blog_id');
  4. # my $tags = _tags_for_blog($blog_id, $type);
  5. # my $min = 0;
  6. # my $max = 0;
  7. # foreach my $tag (@$tags) {
  8. # my $count = MT::Entry->count({
  9. # status => MT::Entry::RELEASE()
  10. # }, { join => [ 'MT::ObjectTag', 'object_id', {
  11. # tag_id => $tag->id,
  12. # blog_id => $blog_id,
  13. # object_datasource => $type
  14. # } ],
  15. # unique => 1
  16. # });
  17. # $tag->{__entry_count} = $count;
  18. # $min = $count if ($count && ($count < $min)) || $min == 0;
  19. # $max = $count if $count && ($count > $max);
  20. # }
  21. # @$tags = grep { $_->{__entry_count} } @$tags;
  22. #
  23. # local $ctx->{__stash}{tag_max_count} = $max;
  24. # local $ctx->{__stash}{tag_min_count} = $min;
  25. #
  26. # 2006.07.15 modify
  27. local $ctx->{__stash}{tag_max_count} = undef;
  28.     local $ctx->{__stash}{tag_min_count} = undef;
  29. # 2006.07.15 modify end
  30. my $iter = MT::Tag->load_iter(undef, { 'sort' => 'name',
  31.     join => ['MT::ObjectTag', 'tag_id',
  32.     { object_id => $entry->id, blog_id => $entry->blog_id, object_datasource => MT::Entry->datasource }, { unique => 1 } ]});

青い字の部分が元のコードで、ごっそりとコメント(削除)にしました。 そして、赤い字のコードを追加しています。

  1. 562行目
  2. require MT::ObjectTag;
  3. require MT::Entry;
  4. # 2006.07.15 delete
  5. # my $type = MT::Entry->datasource;
  6. # 2006.07.15 delete end
  7. my $entry = $ctx->stash('entry');
  8. return '' unless $entry;
  9. my $glue = $args->{glue} || '';

青い字の1行をコメント(削除)しました。

  1. 532行目
  2. my $min = $ctx->stash('tag_min_count');
  3. my $max = $ctx->stash('tag_max_count');
  4. # 2006.07.15 addition
  5. unless (defined $min && defined $max) {
  6.         my $tags = _tags_for_blog($blog_id, MT::Entry->datasource);
  7.         $min = $max = 0;
  8.         foreach my $tag (@$tags) {
  9.             my $count = MT::Entry->count({
  10.                 status => MT::Entry::RELEASE()
  11.             }, { join => [ 'MT::ObjectTag', 'object_id', {
  12.                            tag_id => $tag->id,
  13.                            blog_id => $blog_id,
  14.                            object_datasource => MT::Entry->datasource
  15.                          } ],
  16.                  unique => 1
  17.             });
  18.             $min = $count if ($count && ($count < $min)) || $min == 0;
  19.             $max = $count if $count && ($count > $max);
  20.         }
  21.         $ctx->stash('tag_max_count', $max);
  22.         $ctx->stash('tag_min_count', $min);
  23.     }
  24. # 2006.07.15 addition end
  25. my $factor;

赤い字のコードを追加しました。

 Trackback Pings(1)

from relish *

ひっそりこっそり、そしておっかなびっくり、Movable Type 3.31にアップデートしました。

 Comments(19)

#1: Posted by oscar @ July 12, 2006 [REPLY]
user-pic

こんにちは。
アップグレード時にmt-config.cgiはどうされたんでしょうか。
新しいmt-config.cgiには「EntriesPerRebuild」ほか、色んな部分が削られてますよね。そのせいで再構築エラーが起きてるのもあったりしませんでしょうか?

#2: Posted by bzbell @ July 12, 2006 [REPLY]
user-pic

>>1 oscar さん

こんにちわ^^

>そのせいで再構築エラーが起きてるのもあったりしませんでしょうか?

はい。わたしもそう思って、EntriesPerRebuild でエントリ数を減らしてみたのですが、頻度は減りました。でも、やっぱりエラーするときはエラーしてたので、しばらくは使用を控えることにしたんです。

それに、x-searchプラグインが使えることが分かったので、元々使っていたtagwireプラグインでタグ検索など行うことにしたんです。

#3: Posted by bzbell @ July 12, 2006 [REPLY]
user-pic

>>1 oscar さん

- 補足 -

タグクラウドは表示させることはできました。
でも、再構築時にエラーはしませんが、やっぱり時間がやたらとかかっていました。

ここでいうエラーしてしまう…というのは、エントリに付けられたタグを表示するコードを含んだページ(index.html)の再構築時にエラーが連発したんです。

#4: Posted by oscar @ July 13, 2006 [REPLY]
user-pic

Ogawa::Memorandaさんの所に、この話出てましたね。
http://as-is.net/blog/archives/001144.html
バグ(と言っていいかは別にして)らしいです。
チューニングのハック載ってます。

#5: Posted by bzbell @ July 13, 2006 [REPLY]
user-pic

>>4 oscar さん

さすがOgawa::Memorandaさんですね。
わたしなんか原因分からないですもん…ホント参考になりますね。

さっそく試してみます♪

#6: Posted by MOVEMENT @ August 5, 2006 [REPLY]
user-pic

こんにちは~、ご無沙汰しております。

またまた質問があります。

MovableType備忘録サンのサイトはすでに3.3にアップデート
されたようですが「Tag Cloud」のページはtagwire Pluginを使わ
ずに3.3の標準のタグ機能を使われているんですか?

実は3.3が最初に出た時に一度アップデートしたんですが、その
時タグを書き込んでも「Tag Cloud」のページに反映されなかった
ですよね...(どうもtagwire Pluginが機能していなかったと思います)
これってアップデートが上手くいってなかったんでしょうか?

標準のタグ機能で再度「Tag Cloud」のページを作り直す時間もなく
結局、その他諸々の理由で現在は3.2に戻しています。

お忙しい所申し訳ありませんがアドバイス、よろしくお願いします。

#7: Posted by bzbell @ August 6, 2006 [REPLY]
user-pic

>>6 MOVEMENT さん

こんにちわ^^

ご質問の件ですが、わたしは tagwireプラグインを使用しています。
標準のタグ機能にちょっと不満あるし、それに不具合もあるので…。

> タグを書き込んでも「Tag Cloud」のページに反映されなかったですよね

このときMOVEMENTさんは tagwireプラグインをインストールしたまま、標準のtag機能を使っていませんでしたか?

標準のタグ機能とtagwireプラグインは共存できないというか、MTTagなどの
タグ名がかぶってしまうものもあって、tagwire プラグインが入っているとそちらが有効になるようです。

ですので、既にご存知のように tagwireプラグインはエントリ編集ページのキーワード欄で入力されたtagを取得しますから、タグ入力欄のtagは反映されず、結果的にタグクラウドに表示されなかった…というかんじではないでしょうか。

ちなみにわたしは、キーワード、タグ入力欄両方にtagを入力しています。

#8: Posted by Reiko @ August 14, 2006 [REPLY]
user-pic

はじめまして。こんにちは。

まだ、難しいことはわからにのですが、
今までの、最近のコメントと最近のトラックバックを表示すると、
エラーになってしまって、落ち込んでいるところでした。

わたしは、先日、3.31jaにアップしたので、
デザインをいろいろ変更しているうちに、500エラーがでました。
もう一つ公開しているのですが、データが少ないせいか大丈夫なんです。
1日以上、考えて
デザイン変更が原因のことがわかってきました。

ところが、メインで今まで使用していたのが、500エラーになってしまいます。

レンタルサーバーなので、そこに問い合わせしてみたら、
メモリを多量に使用されていて500エラーがでることがわかりました。

現在、MovableTypeのほうに問い合わせ中です。
返事があるといいのですが。

#9: Posted by bzbell @ August 14, 2006 [REPLY]
user-pic

>>8 Reiko さん

はじめまして^^

> デザイン変更が原因のことがわかってきました。
> ところが、メインで今まで使用していたのが、500エラーになってしまいます。

たとえば、

  • トップページで表示する記事数を減らしてみるとか…。
  • 個々の記事を本文と追記に分けてみるとか…。
  • ブログをPHP化してみるとか…。

などが、トップページ再構築時のサーバへの負担を軽減できるかな…と思います。
機会があったら試してみるといいですよ( ̄∇ ̄)b

> 現在、MovableTypeのほうに問い合わせ中です。
> 返事があるといいのですが。

返事あるといいですね♪

#10: Posted by Reiko @ August 16, 2006 [REPLY]
user-pic

bzbellさん、こんにちは。

アドバイスありがとうございました。

>トップページで表示する記事数を減らしてみるとか…。
>個々の記事を本文と追記に分けてみるとか…。
>ブログをPHP化してみるとか…。

トップページで表示する記事数を減らし、
個々の記事を本文と追記、途中までわけて
ブログをPHP化に挑戦してみました。

PHP化はできたのですが、リダイレクトが、うまくいかなくって、
.htaccessにして有効、URLも確認したのですが、
うまくいきませんでした。
とりあえず、htmlにもどしました。
また、時間のあるときに、挑戦してみようと思います。

最近のコメントはできないので、応急策でアップしました。(笑)

プラグインも挑戦していきたいと思います。
これからも、いろいろ参考にさせてくださいね。
今後ともよろしくお願いします。

#11: Posted by bzbell @ August 16, 2006 [REPLY]
user-pic

>>10 Reiko さん

こんにちわ^^

> また、時間のあるときに、挑戦してみようと思います。
> 最近のコメントはできないので、応急策でアップしました。(笑)

はは(*≧∀≦*)でも、何ででしょうね。
ちょっと原因に興味ありありです。
以下のコードは実際にわたしが使用しているコメント一覧のコードです。
わたしのところではとりあえず、問題なくコメント一覧を表示できています。
違いなどありましたら、参考にしてくみてください。

<ul>
<MTEntries recently_commented_on="5">
<li><a href="<$MTEntryLink$>"><MTEntryTitle></a>
<ul>
<MTComments lastn="5">
<li><a href="<$MTEntryLink$>#c<$MTCommentID$>" title="c<$MTCommentID$>"> <$MTCommentAuthor$></a> <$MTCommentDate format="%m/%d"$></li>
</MTComments>
</ul>
</li>
</MTEntries>
</ul>

> これからも、いろいろ参考にさせてくださいね。

はい。できる限りのことはしますよぉ( ̄∇ ̄)v
こちらこそよろしくお願いします♪

#12: Posted by Reiko @ August 16, 2006 [REPLY]
user-pic

bzbellさん、どうもです。
ありがとうございます。

<MTEntries recently_commented_on="5"> を使用すると、500エラーがでてしまいます。 わたしのは
<h2>Recent Comment</h2>
<ul>
<MTEntries recently_commented_on="5">
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><br />
<MTComments lastn="5">
<$MTCommentAuthor$>[<$MTCommentDate format="%x" language="en"$>]<br />
</MTComments>
</li>
</MTEntries>
</ul>

<MTComments>または<MTComments lastn="5">で試してみました。
どちらもエラーがでてしまいます。

ほんと、不思議なんです。

また、時間のあるときにまた考えてみます。

#13: Posted by bzbell @ August 17, 2006 [REPLY]
user-pic

>>12 Reiko さん

こんにちわ^^

> <MTEntries recently_commented_on="5"> を使用すると、500エラーがでてしまいます。わたしのは

ムムッ( ̄Д ̄;)
recently_commented_on 妖しいですねぇ。
MT3.2の頃にもrecently_commented_on関連でトラブルありましたので。
500エラーがでるってことは、何らかのCGIなどでエラーしたってことですよねぇ。
以下の項目をmt-config.cgi内に追加してみるってのはどうでしょう。

DebugMode 1

これは、MovableTypeをデバッグモードにする項目なんです。
1 にすることでデバッグモードとなり、ログに何らかの情報が出力されるようです。

時間があるときにでも試してみてください♪

#14: Posted by Reiko @ August 17, 2006 [REPLY]
user-pic

bzbellさん、こんばんは。
何度もありがとうございます。

試してみました。エラーの内容が

Use of uninitialized value in subroutine entry at lib/MT/ObjectDriver/DBM.pm line 318.

わたしには、直し方がわかりません。
lib/MT/ObjectDriver/DBM.pmが、どこにあるのかわからないし。
何か対処があるんのでしょうか?
ほんと、いい勉強になりました。

#15: Posted by bzbell @ August 17, 2006 [REPLY]
user-pic

>>14 Reiko さん

こんにちわ^^

Σ( ̄Д ̄;)上記エラーってデータベース絡みのエラーではないでしょうか。
そういえば、最近MT3.31にアップグレードした( >>8 )って言ってましたね。

Reikoさんが使われているデータベースって何でしょう。
わたしがMT使い始めた頃はBerkeleyDBを使ってて、その時はよく500エラー多発してました(つω-`。)とほほ

BerkeleyDBもエントリ数が増えるとサーバに負荷がかるようです…なんだか「間違いない!」ような気がしてきました( ̄∇ ̄)v

#16: Posted by Reiko @ August 18, 2006 [REPLY]
user-pic

bzbellさん
ほんとうにありがとうございます。

> BerkeleyDBもエントリ数が増えるとサーバに負荷がかるようです…なんだか「間違いない!」ような気がしてきました( ̄∇ ̄)v

最初わからなくて、レンタルサーバーのMovableTypeのマニュアルで、
データベースを使用しない設定をしたら、確か管理画面がデータベースが開けませんのような
メッセージがでて開けなかったので、BerkeleyDBの設定にしていたようです。
今、わかったりして、、、ん情けない、大丈夫か、、、

MySQLとSQLiteも使用できるのでどちらかに変更してみようと思います。
先程SQLiteでの設定をして管理画面を開いたら、
ベータベースを初期化してインストールします。
ような画面でてきたので、ちょっとこわいので、後日変更するとにしました。
とりあえず、元にもどしました。
MySQLのほうがいいでしょうか?

そうそう、今頃DBM.pmの場所わかりました。
いい勉強になりました。

#17: Posted by bzbell @ August 18, 2006 [REPLY]
user-pic

>>16 Reiko さん

こんにちわ^^

> MySQLとSQLiteも使用できるのでどちらかに変更してみようと思います。
> 先程SQLiteでの設定をして管理画面を開いたら、ベータベースを初期化してインストールします。
> ような画面でてきたので、ちょっとこわいので、後日変更するとにしました。

BerkeleyDB -> SQLite( MySQL )への変換なら、わたしも経験済みなのでこちらの記事を参考にしてみてください。
記事の内容はSQLite -> MySQLへの変換について記述してますが、BerkeleyDB -> SQLiteに置き換えてお読みください。
バックアップは必ずとってくださいね。
BerkeleyDBなら、dbディレクトリを丸ごとバックアップすれば問題ないです。

> MySQLのほうがいいでしょうか?

う~ん(つω-`。)…わたしは一応MySQLを使っていますが、再構築時は重たいです。
その点、SQLiteの再構築はサクサクですよねぇ( ̄∇ ̄)b

わたしが重たいMySQLを使う理由は、データベースのデータを扱うのが容易だからなんです。
わたしのブログの性質上、プラグインなどいろいろ実験したりするので(; ̄- ̄)はは

Reikoさんが「そんなことしないよ!」ということでしたらSQLiteが無難かも、です。

#18: Posted by Reiko @ August 18, 2006 [REPLY]
user-pic

bzbellさん、こんにちは〜
お世話になっています。

SQLiteに移行して、最近のコメント表示できました。(^^
MySQLは、システムチェックではインストールされていましたが、
サーバーのWebで調べたら、オプションで1個付いていますが、
申し込みが必要で、先程申し込みました。
1週間は、かかりそうです。
MySQL、挑戦してみようと思います。

ありがとうございました。
これからもよろしくお願いします。

#19: Posted by Author Profile Page bzbell @ August 18, 2006 [REPLY]
user-pic

>>18 Reiko さん

> SQLiteに移行して、最近のコメント表示できました。(^^

ヽ(∇⌒ヽ)やったぁ~♪(ノ⌒∇)ノ
良かったですね!!

> MySQL、挑戦してみようと思います。

がんばってください(*≧∀≦*)あは

> ありがとうございました。
> これからもよろしくお願いします。

ご苦労様でしたぁ、こちらこそよろしくお願い致します。

 Post a Comment

 

コメント用フィード