ハンチングのMovableTypeバージョンを2.661にしました。バージョンアップはMilano::Monolog: 引き続き、MT2.661用の日本語化パッチをリリースしましたを参考に、というか書かれてる手順そのままに2.64から2.661へのバージョンアップ作業(2.661パッケージの日本語化、該当ファイルの差し替え、Atom出力テンプレートの作成)を行いまして、無事完了しました。(Milanoさん、ありがとうございます。)
まあ、言ったところで、2.661に変わったからどうだ?って違いも特に無く、メインページに表記されたMovableTypeのバージョン番号が変わったくらいの変化とちょっとばかしのやり遂げ感に充実を感じてみたりするシャイなあんちきしょうの今日の俺であります。
んで、バージョンアップで久々にサーバ側のファイルいじったりしたついでに、MovableTypeコンテンツをケイタイやPDAなどで閲覧できるようにしちまうというイカしたプログラム、「MT4i」を導入してみました。
MT4iは、(MovableTypeのAPIを利用して)MovableTypeのデータベースからデータを直接読み込み、文字コードをShift_JISに変換、携帯電話向けにレイアウトして出力します。言語はPerlです。
talk to oneself 2の太鉄さんが公開されてるプログラムで、最新バージョンはMT4i Version 1.71になります。
MovableTypeで作成したコンテンツ内容は全てデータベースにて管理されていて、そのデータベースに入っているコンテンツ内容(エントリーで書かれてるほぼテキストね。)をMovableTypeAPIを経由させて取得し、文字コードを変換したり画像があれば縮小表示したりして、ケイタイ端末で見ることが出来るカタチ(CHTML等)で出力するCGIプログラムです。エントリー内容だけでなくエントリーに付けられたコメントも見ることが出来るし、なんと、コメント自体をケイタイ端末から書き込むこともできちゃいます。スゲェ!
設置は簡単。MT4iのページにも「設置に関して」という部分で説明がありますが、MovableTypeを自力で用意した人だったらそこを参考にやってもらえれば特に問題無く導入できると思います。普通によくあるPerlのCGI設置と同じです。
と、まあ、導入して動かしてみたのは良かったのですが、ハンチングのサイト用に利用するには少々都合悪い点がありまして、早速、その部分のカスタマイズを簡単にですがやってみました。
(これ以降に紹介する変更箇所のソース内容、ソース行数はすべて、MT4i Version 1.71のものです)
コメント表示のソート順を変更したい。
ハンチングではコメントは「先から後へ古いもの順」の時間順で表示するソート設定(ascend)でMovableTypeの設定をしています。しかし、この設定を引き継ぐように作られてるMT4iを利用した場合、コメントがたくさん書かれているエントリーの最新コメントを見たい場合に、何度もページを進めないと最新分のコメントを見ることが出来ません。ですので、このソート設定を変更してみたいと思います。
コメント取得の際のソート設定を行っている変数は、行数283行目です。
という部分でソート設定を指定しており、この標準の仕様ですとMovableTypeで設定されたコメント表示ソート設定を取得しMT4iでも同様のソート設定をするようになっています。これを強制的に、逆のソート設定(descend)に変更します。変更は以下のようになります。
文字列として$sort_order_commentsにdescendを入れてやることでそのソート設定が有効になります。この変更でMT4iで表示するコメントのソート順が「先から後へ新しいもの順」で表示されるようになりました。
もう一つ、変更箇所があります。
1エントリーに書かれたコメントがたくさんある場合、コメントの閲覧が出来ない。
ハンチングにはおかげさまで、たくさんのコメントを頂いてるエントリーがいくつかあるわけですが、1エントリーにコメントが多く付けられているエントリーコメントを見ようとすると読み込みに異常に時間がかかってるのか、全然表示が返ってこない状態になり、しまいにはCGIプロセスが落ちちゃったり(サーバ側プロセス時間制限か、利用可能メモリ制限に引っかかってる様子)しちゃいます。多くのコメント、というのはいろんなコメント数のエントリーで試した感じ、ハンチングで使ってるサーバ環境上では約50件以上のコメントが付けられてるエントリーの場合に多く発生するように感じました。
で、盛り上がってるエントリーのコメントが見られないのもナンなんで、この部分の処理の改善を行ってみました。
問題のコメント取得部分は654行目以降になります。
my @comments = MT::Comment->load(
{ blog_id => $blog_id,
entry_id => $ent_id },
{ sort => 'created_on',
direction => $sort_order_comments,
unique => 1 });
と書かれてる部分がMovableTypeAPIを利用して該当ウェブログIDの該当エントリーからそのエントリーに付けられてるコメント本文「全部を」取得してるんですけど、この「全部を」というのが問題になっているようです。
@commentsという配列にコメント本文や名前等のコメントオブジェクトを片っ端から入れてるんですけど、コメントの件数が多くなればなる分、そのメモリ利用量も非常に多くなるわけです。また、そのメモリを大量に使ったコメント本文は一気に文字コード変換に突っ込まれるので、その量に比例して処理自体もかなり負荷がかかってるはずです。ですので、このコメント取得に一定の制限を設けて、メモリの使い過ぎ、制限オーバーを回避してみようと思います。
実際の変更作業としては、コメント取得するMovableTypeAPI、「loadメソッド」のパラメータに取得制限を指定するパラメータ、「limit」を追加指定してあげるだけです。変更は以下のようになります。(ちなみにこのメソッドパラメータ、direction値で「$sort_order_comments」と指定されているものは、先に紹介した変更、コメントソート順指定が入っています。)
my @comments = MT::Comment->load(
{ blog_id => $blog_id,
entry_id => $ent_id },
{ sort => 'created_on',
direction => $sort_order_comments,
unique => 1,
limit => $put_comment_count });
limitのパラメータ値で指定している$put_comment_countという変数には、MT4iがコメント表示の際に取得対象とするコメント件数の上限をあらかじめ指定してあげます。MT4iの一番上の設定項目が並んでる中にでも、
という風に追加しておけば、後から変更する際もラクかと思います。(上記の場合は20件が対象の設定)
これでソート順の指定変更と合わせて、「最新のコメントを新着順に20件取得して表示する」という動きが出来るMT4iになりました。
また、特に必要性を感じなかったのでやりませんでしたけど、loadメソッドでoffsetパラメータをlimitパラメータを一緒に利用することで、「各オフセット件数から一定数分コメントを取り出してくる」という動作も可能で、この処理でコメントを取り出すことであまり負荷をかけずにコメント全件を取得することも可能になると思います。
好き勝手にいろいろいじくってみましたが、もし参考に改造されるようでしたらあくまでも自己責任でドウゾ。
改めて、MT4i作者の太鉄さん、素晴らしいプログラムの公開、ありがとうございます。