recently_commented_onの挙動不審について

昨日、recently_commented_onが正常に作動しない(各エントリーの最新のコメントではなく、最初についたコメントの時刻順にソートされてしまう)ことについてエントリーを書いた(「アップグレードしたのはよいが・・・」)。具体的にどのようになるかというと

3.2-ja-2をそのまま適用
recently_commented_on_1.jpg
  ContextHandlers.pmを書き換え
recently_commented_on_2.jpg

ちょっと見づらいかもしれないけど、「「良い一週間」でありますように☆」と「Upgrade!」が逆に表示されているのが分かると思う。
この件について、同じような症状が現れたという47thさんからさっそくコメントをいただいた。ということは・・・この問題は私に固有の問題ではなくて、もしかしてLolipop+SQLiteの場合に現れる症状なのかな?
なにぶんまだ情報が少ないので、可能性の一つとして、ということだけど。
ちなみに私もLolipopのレンタルサーバーを使ってるわけだけど、mt-check.cgiを実行すると

サーバーに、「DBD::Pg」がインストールされていない、古いバージョンがインストールされている、もしくは「DBD::Pg」に必要なモジュールがインストールされていません 「DBI」と「DBD::Pg」は、PostgreSQLを使ってデータを管理するために必要です。「DBD::Pg」をインストールする場合は、インストール手順を参照してください。

と表示される。PostgreSQLは使わないので、私の場合は関係ないはず、と思ってスルーしてるけど、なにかこのへんも関係あるのでしょうか・・・???

念のため、各バージョンでの関係箇所を抜き書きしておく。
Movable Type 3.171 (/lib/MT/Template/Context.pm)

} elsif (my $n = $args->{recently_commented_on}) {
$args{‘join’} = [ ‘MT::Comment’, ‘entry_id’,
{ blog_id => $blog_id, visible => 1 },
{ ‘sort’ => ‘created_on’,
direction => ‘descend’,
unique => 1,
limit => $n } ];
$no_resort = 1;
}
@entries = MT::Entry->load(\%terms, \%args);

Movable Type 3.2 ja (/lib/MT/Template/ContextHandlers.pm)

@entries = MT::Entry->load(\%terms, \%args);
if ($args->{recently_commented_on}) {
my @e = sort {$b->comment_latest->created_on <=> $a->comment_latest->created_on}
grep {$_->comment_latest} @entries;
@entries = splice(@e, 0, $args->{recently_commented_on});
$no_resort = 1;
}

Movable Type 3.2 ja 2 (/lib/MT/Template/ContextHandlers.pm)

} elsif (my $n = $args->{recently_commented_on}) {
if (MT::ConfigMgr->instance()->ObjectDriver !~ /postgres/) {
require MT::Comment;
$args{‘join’} = [ ‘MT::Comment’, ‘entry_id’,
{ blog_id => $blog_id, visible => 1 },
{ ‘sort’ => ‘created_on’,
direction => ‘descend’,
unique => 1,
limit => $n } ];
$no_resort = 1;
} else {
$args{‘join’} = [ ‘MT::Comment’, ‘entry_id’,
{ blog_id => $blog_id, visible => 1 },
{ unique => 1 }];
}
}
@entries = MT::Entry->load(\%terms, \%args);
if ($args->{recently_commented_on}
&& MT::ConfigMgr->instance()->ObjectDriver =~ /postgres/) {
my @e = sort {$b->comment_latest->created_on <=> $a->comment_latest->created_on}
@entries;
@entries = splice(@e, 0, $args->{recently_commented_on});
$no_resort = 1;
}

私の場合、3.171から3.2-ja-2へとアップグレードしたので、3.2でどのように稼働するのかは未確認。
あとはどなたか詳しい人が解決してくれることを待ちましょう!(笑)



アップグレードしたのはよいが・・・

Movable Typeを「3.2日本語版 Release-2」にアップグレードした。
事前にデータベースをSQLiteにしておいたこともあり、アップグレード自体は非常にスムーズに行った。
ダウンロードしてきた「3.2日本語版 Release-2」を解凍後、mt-config.cgiの変更。さらに自分で手を加えていたCMS.pmとTrackback.pmに、必要な変更を行った。そして、説明の手順通りにサーバーにアップロードして、パーミッションの変更後にmt.cgiを実行する。すると、新しくなった管理画面が現れた!
最後に、全体を再構築してアップデート完了。
一応すべてバックアップを取っておいたとはいえ、再構築が終わるまではちょっとドキドキした。
再構築にかかる時間は多少短くなったように感じたが、計ったわけではないので、気のせいかも(笑)
で、ここまではよかったのだが。
しかーし!
「最近のコメント」の動向がおかしい!
新しくコメントがついた記事が上に表示されるようにしてあるのに、ソートされてこないのだ。
あれこれテスト投稿して動向を調べたところ、どうも「最後のコメント」の投稿時刻順ではなくて、そのエントリーについた「最初のコメント」の投稿時刻順でソートされているようだ。
今回のアップデートでは「recently_commented_onの処理を見直し、パフォーマンスが低下していた現象を修正」とあるので、この処理になんらかの手が加えられたことは間違いないのだが、私と同じような症状が出ている人はいないようで、ネットをあさっても情報が見つからない。
泣く泣く自力で解決策を探すことにした。

前回のリリースとは、5つの差分ファイルがあるとのことだった。おそらくそこに解決策があるだろうと踏んで、スクリプト内に「recently_commented_on」関連の記述があるものを探す。すると、「ContextHandlers.pm」なるファイルにそれらしい記述が見つかった。
そのあたりをじーっと見つめていると・・・
どうも、並べ替えの条件のところが、Postgresの場合しか指定されていないような・・・希ガス
自信はなかったけど、883行目あたりを書き換えてみる。
具体的には、ifの条件文から「&& MT::ConfigMgr->instance()->ObjectDriver =~ /postgres/」を削除してやる。

@entries = MT::Entry->load(\%terms, \%args);
if ($args->{recently_commented_on}
&& MT::ConfigMgr->instance()->ObjectDriver =~ /postgres/) {
my @e = sort {$b->comment_latest->created_on <=> $a->comment_latest->created_on}
@entries;
@entries = splice(@e, 0, $args->{recently_commented_on});
$no_resort = 1;
}

これで再構築してみると、あっ、思ったように並びが変わってる!成功、成功!
とりあえずはうまく行ったのだけれど、素人作業なので、今後他のところに影響が出ないか、ちょっと心配。
本当は866?875行目あたりで並べ替えされているような気もするんだが、んーちょっと知識不足で・・・。
それに、これは私に固有の問題なのか、それともSQLite+3.2-ja-2に共通の問題なのかがよく分からない。
他の人は、何ともないんだろうかしら・・・?
【追記】recently_commented_onの挙動不審について



Upgrade!

一念発起。
Movable Typeを最新バージョンにアップしたよ。
うまく行くでしょうか。
テスト投稿です。
どきどき。



(つд`)゜Master Blacklist is down and no more

スパム対策に利用していた「MT-Blacklist/Comment Spam Clearinghouse」。コメントもトラックバックもチェックしてくれるし、チェック用のブラックリストも自動更新される。これを導入してからスパムで困ることが全然なかったので、もう更新しないというインフォメーションをみてかなり焦った。
というのも、データベースをBerkeley DBからSQLiteに変更する際にconfigファイルを書き換えたので、MT-Blacklistも再設定が必要に。設定が全部初期化された後に最新のブラックリストが自動取得される・・・と思いきや、いつまでたってもアップデートしない。ログを見てみると、
Unable to fetch remote blacklist from http://xxxxxxx/xxxx/xxxx/blacklist.txt
で、ブラックファイルのリストblacklist.txtが真っ白になっているのだったorz
データベースを変更したのが10月8日。MT-Blacklistの配布停止が10月5日。時差を考えればほんのタッチの差で、Master Blacklistが入手できなくなってしまったわけだ。
それからよくよくアナウンスメントを読んで、アップデートしなくなってしまったのは、スパム対策が強化されたMT ver3.2が登場したからだと思っていた。
ところがどっこい。
それも一つのきっかけになってはいるのだが、もっと複雑な事情があったのであるよ。
Master blacklist down [October 05, 2005]

  • I have for some time been receiving an enormous number of hits per day for the master blacklist
  • Over the last four days, an average of over 600,000 hits
  • For over a year I have asked developers NOT to use the master blacklist in their tools, but instead the changes file that shows all updates in the last week
  • They obviously have not listened and their programs are effectively causing a distributed denial-of-service attack on my servers
  • My site is being rate-limited by my web host to preserve other customers and my bandwidth bills are skyrocketing from just serving 403 or 404 error pages
  • Hence the Master Blacklist is down and no more

ナナメ読みなんだけど、このスパム対策プラグインで使用しているMaster Blacklist(スパムを送ってくるurlのブラックリスト。casinoだのonline pokerだの・・・)を不正常に利用するプログラムが出回り、サーバーがダウンするほどのアクセスがくるようになったらしい。それで警告のためにやむを得ずIPによるアク禁措置をとったところ、収まるどころか逆に、毎秒アクセスをかけてくるプログラムまで登場して、ついに開発者jayさんも堪忍袋の緒が切れた、と。
まあそういうことではないかな。
jayさんは、ほかのスクリプトの開発者に対してBlacklistの利用を禁じていなかったようだ。ただし、「Master Blacklistではなくて、アップデート用の差分ファイルを使用するように」と要求していたらしい。しかし、「the brain-dead developers」たちはそれをまったく考慮せず、Master Blacklistに頻繁にアクセスするようなプログラムを配布し続けたために今回の事態が起こってしまった。
これまで利用してくれた人には申し訳ないが、MT3.2を使ってもらえば大丈夫ですよ、とのこと。
とりあえずプラグイン自体は正常に動いているので、私の場合は、手動でブラックリストにitemを追加しつつ稼働させている状態。最近はトラックバックスパムが定期的にやってくるので、対策とらない訳にはいかないのでねえ。
とっとと3.2にバージョンアップするか、jayさんがどこかでMaster Blacklistを配布してくれるのを待つか。
悩むところではある・・・。



とりあえずSQLite利用へ

実はMovable Type 3.2へのupgradeを虎視眈々と狙っていたのだけれどw、まだいろいろ不具合があるようだ。
Berkeley DBの環境下でMovable Type 3.2日本語版をご利用のお客様へのお知らせ

去る9月29日より出荷を開始しました、「Movable Type 3.2日本語版」について、Berkeley DBをご利用のお客様で、以下の現象を確認いたしましたので、ご案内いたします。

私もBerkeley DBを利用してるので、ここは少し待つべきかな?
とは思ったのだが、せっかくの機会だし、とりあえずはupgrade前にデータベースをSQLiteに変更することにした。
データベースとして本当はMySQLを使いたいところだし、事実一度はMySQL化したのであるけど、LolipopのSQLサーバーが貧弱なせいか、しばしば構築エラーやトラックバックの遅延が起こったので、結局Berkeley DBに戻した経緯がある。廉価で使ってるサーバーだからしょうがないと言えばしょうがないんだけどね・・・。
SQLiteに変換するのに使ったのは、Movable Typeに標準でインストールされてるmt-db2sql.cgiではなくて、Ogawa::Memorandaさんのmt-db-convert.cgi。mt.cfgを書き換えなくても指定したパスにDBを書き出せるので、失敗がなくて安心かな、と。しかも、逆方向へのコンバートも容易らしいし。
使い方は、解凍してサーバーにアップロードして、コンバート先のDBの種類とコンバート先を指定してやるだけ。あっという間の作業でした。
エラーなしにコンバートできたら、mt.cfgのデータソースの部分を書き換えてやれば桶。これまでのBerkeley DBへのパスを「#」を付けてコメントアウトしてやり、「ObjectDriver」を「DBI::sqlite」にしてパスを書き換えて有効にしてやればよし。
エラーなしに動いてくれてるようだす。



« 前のページ次のページ »

  •  

    ブログパーツの貼り付け方はこちらへ
  • 月別アーカイブ

  • あいさつ掲示板

  • メタ情報