Movable Type 自習部屋
このサイト,Movable Typeで構築しているわけですが,当然の事ながらデフォルトのまま使用しているわけもなく,様々で大小雑多なカスタマイズをしながら使用しています.
なにしろhimaの趣味はジャンルを問わず「カスタマイズ」ですから.
でもですね,そのつど感覚的にカスタマイズを繰り返してきているので,何をどういじったのかが後から見て全く不明,想像も付きません.過去の自分と現在の自分は別人であり,概ね過去の自分の方が創造的で且つ突発的でありますので,そんな自分の記録を記録として残しておきたし.
というわけで,IdlingSpace.comに於けるMovableTypeのカスタマイズの記録.
2006. 1. 22 (SUN)
カテゴリーのソート
日記ならともかく,通常のコンテンツをMovableTypeで作ろうと思ったときに,エントリー・カテゴリーのソートが出来ないのはイタイ,というハナシですが調査及びカスタマイズの結果,とりあえず動いている?感じ
エントリーに関しては日付順になるので,日付を表示していないコンテンツ用Blogでは,日付を適当に操作して意図通りの順番になるようにしております.ていうか普通に上から順番に入力していけばその通りの順番になるので,まあよい,と.
問題はカテゴリー.デフォルトでは多分文字コード順にソートされているわけですが,それだとカテゴリーリストの表示の際に意図してない順番になってしまいます.かといってカテゴリー名の頭に数字つけるのもなんだか美観を損なうし……
というようなことを解決!
どうやらカテゴリー名は内部で持っている名前と実際に表示・参照時に出力する名前は変えることが可能な模様.
では,内部では頭に数字を付けておいて, <$MTCategoryLabel$> とかの出力時には,その数字を取り去ってから出力.とすれば大丈夫かも.ディレクトリ名がどちらにされるのかちょっと不安があったけれど,試してみたら大丈夫そうだし,きっと大丈夫でしょう.
で,直すのは(MovableType3.2)
($MovableType)/lib/MT/Template/ContextHandlers.pm というファイルの
「sub _hdlr_archive_title」 の中の値を返す部分を次のように,頭に「_9999_」があったらその部分を削除して返すよう変更(2カ所)
return $ctx->stash('archive_category')->label;
↓
my $title = $ctx->stash('archive_category')->label;
return ($title =~ /_\d+_(.*)/) ? $1 : $title;
defined $title ? $title : '';
↓
$title = ($title =~ /_\d+_(.*)/) ? $1 : $title;
return (defined $title) ? $title : '';
同じく 「sub _hdlr_category_label」 の中も同様に変更.
$label;
↓
return ($label =~ /_\d+_(.*)/) ? $1 : $label;
これで,たとえばここのカテゴリー 「_4201_MovableType」 も,内部的にはこのまま扱われて,エントリー作成の時などはこのカテゴリー名で作成しているけれど, <$MTCategoryLabel$>タグとか <$MTArchiveTitle$>タグでの出力は 「MovableType」 になっているって寸法.他にカテゴリー名を出力するようなタグは無いと思うのだけど,どうであろう.
とりあえず無ければ大丈夫だし,あっても同様に変更すれば大丈夫???
※MT3.31-ja の変更点
上に加えて「sub _hdlr_category_basename」の中も以下のとおり。その他あまり未テスト。
$basename;
↓
return ($basename =~ /_\d+_(.*)/) ? $1 : $basename;
2006. 1. 24 (TUE)
26時台は今日だ!
【ToDo】
以前からこのサイトで使っている掲示板系はそうなっているのですが,午前0時台→前日の24時台,午前1時台→前日の25時台,午前2時台→前日の26時台,という時間表示.
一日の区切りは午前3時ぐらいだと思うのです.生活パターン的にもテレビ欄的にも.
ということでMovableTypeもそういう区切りで生活してほしいと思い,改造を試みようと思うも,該当部分のソースを探すだけでイヤンな感じ
時間を置き換えるだけなら簡単(多分該当部分も発見)なのだけれど,その際「日付を一日戻す」という作業もしなければなりませぬ.
しかし調査の結果,エントリーの記録時刻はUTCで持っているのかと思いつつDBを覗いてみたら
comment_created_on : 2005-12-28 00:18:50
comment_modified_on : 20051228001850
などという持ち方をしているのね・・・
どっちにしてもそんなに単純にはいかないようです(TT ソース読まねば
2006. 1. 30 (MON)
プラグイン作るまでもない
プラグインのMTPerlScriptが愉快.
テンプレート中に仕込んだ <MTPerlScript> ~ </MTPerlScript> ではさんだ Perlのソースがそのまま実行可能です.
プラグインを作るほどでもない程度のことをするには,まさにうってつけという感じです.
たとえば,全部のエントリーを10個ごとに区切って表示してみるには
<MTPerlScript>
my $ec = <$MTBlogEntryCount$>;
my $lc = int($ec / 10);
my $m = "MT";
for ($i = 0; $i <= $lc; $i++) {
$ofs = $i * 10;
printf("<p>Entries: No.%d ~ No.%d (Number from last entry)</p>\n", $ofs+1, ($ofs+11 < $ec)? $ofs+11 : $ec);
print qq|<ul><${m}Entries lastn="10" offset="${ofs}">\n|;
print qq|<li>[<\$${m}EntryDate language="en" format=" %Y/%m/%d(%a) %H:%M"\$>] <a href="<\$${m}EntryPermalink\$>"><\$${m}EntryTitle\$></a></li>\n|;
print qq|</${m}Entries></ul><br /><br />\n|;
}
</MTPerlScript>
みたいな感じです.これを使えば,静的ページ生成をしているhimaには使えないPaginate(PHP必須)のようなページ分割ができるかも!・・・かも.でも果てしなくめんどくさそうでもあります.
※MTPerlScript について
パース順は MTのタグ → (<MTPerlScript>に反応)Perlのソース → MTのタグ となっている模様,サンプルのコードで言うと
1) <$MTBlogEntryCount$> が解釈されて エントリーの個数が $ec に代入される式になる.
2) perlを実行して "<p>Entries: ~ </MTEntries></ul><br /><br />" という出力が得られる.
3) 得られた出力をMTが解釈してくれ,エントリーのタイトルとか投稿月日が出力される.
ちなみに,print文内の "<\$${m}EntryTitle\$>" というような回りくどい記述は,一番最初のMTのタグのパースで解釈されないため,ということです.
※※さらに
"<MTPerlScript> ~ </MTPerlScript>" の中のコードでさらに "<MTPerlScript> ~ </MTPerlScript>" を出力するようなマネをしたらどうなるか.ってことで
<MTPerlScript>
my $mm = '${m}';
my $m = "MT";
print qq|<${m}PerlScript>\n|;
print qq|my \$m = "MT";|;
print qq|my \$u = "<\$${m}BlogURL\$>";|;
print qq|print "Blog name (recursive): <a href=\\"\$u\\"><\\\$${mm}BlogName\\\$></a>";|;
print qq|</${m}PerlScript>\n|;
</MTPerlScript>
ってこれの最終的な出力が
Blog name (recursive): <a href="http://idlingspace.com/">IdlingSpace.com</a>
ってなってるので多分ちゃんと動いたんですけどね,めためためんどくさい.
2008. 11. 22 (SAT)
あぶなかった?
前々から,MovableTypeのデフォルトのファイル名ってどうなのかと思っていたところですけど,やればできんじゃん。変えられるんですね。皆さんもドキュメント類はちゃんと読みましょう,書いてありました。mt-checkとか実行されると人のところのサーバの情報がそこそこ見れたりしてよさげですよ(何に?
で,古いバージョンのmt-config.cgiの中に
# By default, the script that Movable Type uses for comments is called
# mt-comments.cgi, the TrackBack script is called mt-tb.cgi, the
# search engine script is called mt-search.cgi, the XML-RPC server
# script is called mt-xmlrpc.cgi, and the dynamic blog view script is
# called F<mt-view.cgi>. In
# some situations--for example, if you are running MT under mod_perl, or if
# your server requires that your Perl scripts have the extension .pl--you
# may need different names for these scripts. You can set the names that will
# be used throughout the default templates and Movable Type code by changing
# these values.
って書いてあるんですが,単に拡張子が違うときとか変えれますよって書き方。
MovableTypeの管理画面って一応ユーザー認証があるわけですけど,多分パスワードとかってcookie使って保存してあるから,これまた多分簡単に抜かれかねない。そこでファイル名ぐらい変えておけば何となく少しは安心した気分に浸れるのじゃないでしょうか。
ということで,mt-config.cgi の中に
AdminScript nimda.cgi (適宜管理用ファイルの名前)
CheckScript kcehc.cgi (適宜チェック用スクリプトの名前)
UpgradeScript edargpu.cgi (適宜アップデート用スクリプトの名前)
などということを書いておけばよいのでは。と思ってやってみました。
その他にも,CommentScript, TrackbackScript, SearchScript, XMLRPCScript, ViewScript, AtomScriptなどある模様。あと肝心のファイル名変えるのも忘れるな!
2008.12. 7 (SUN)
「前。」と「次。」
PC用ページはカテゴリー毎のページに全部のエントリーを詰め込んで表示しているので,個別エントリーページは存在してませんでした。
が,
携帯用ページは容量が多分限られるので,エントリー毎にページを用意してあげることにしました。
するとですね,MTEntryNext と MTEntryPrev というタグの仕様が,カテゴリーを無視してくれると言うことに気付かされるわけです。普通同一カテゴリーで次の記事とかページ遷移したいじゃない?それって普通の考え方じゃない?なんか変なこと言ってる?
で,とりあえずヘルプでいろいろ探しても見つからなかったんだけど,ぐぐったら一発。やっぱりみんな考えること同じ。ていうか標準の機能たるべきではないのかということでは?
お目当てのページは,(多分)元スタンフォード大情報科学科の学生だったアレクセイが作ったMTEntryCategoryLinksというプラグイン。
MTEntryPrimaryCategoryは現在のメインカテゴリーを出力するブロックタグで,MTEntryPrevInCategoryとMTEntryNextInCategoryがカテゴリー内での前と次のエントリーを出力するブロックタグだ。
と書いたところで非常に分かりにくい事この上ないので実際のコード
<MTEntryPrimaryCategory>
<MTEntryPrevInCategory>
<a href="http://m.idlingspace.com/<$MTSubCategoryPath$>/<$MTEntryID pad="1"$>.html">[4]前</a>>
</MTEntryPrevInCategory>
<a href="http://m.idlingspace.com/<$MTSubCategoryPath$>/" accesskey="5">[5]目次</a>
<MTEntryNextInCategory>
|<a href="http://m.idlingspace.com/<$MTSubCategoryPath$>/<$MTEntryID pad="1"$>.html">[6]次</a>
</MTEntryNextInCategory>
</MTEntryPrimaryCategory>
MTEntryPrimaryCategoryコンテナの中で,現在のパスを表すMTSubCategoryPathだとか
前のエントリーを表すMTEntryPrevInCategoryだとかを使っております。
これで携帯で良くありがちな
[4] 前 | [5] 上 | [6] 次
が実現できるという寸法です。やっぱり普通は標準機能でしょコレ?
これ使うためには,EntryCategoryLinks.plをMovableTypeをインストールしてるディレクトリのpluginに突っ込んでおけばそれでOK,簡単です。
ていうか Alexei,今はWordPress使ってるっぽいぞ・・つまりはそういうことか。
------------------
前言撤回!
------------------
ちょっと待った!
全然OKじゃなかったです。
EntryCategoryLinks.pl中で次のエントリーを探す部分のコードが以下のとおり
do {
$adj = $is_next ? $adj->next : $adj->previous;
} while ($adj && !$adj->is_in_category($cat));
つまりは一個ずつポインタを辿っていきながらカテゴリーが同じエントリーを探しておるわけですね。ここのサイト,現在エントリー数が1800,カテゴリー数が100ぐらいある感じで,カテゴリー内にエントリーが1個しかないなんてこともざらです。こんなサイトで全部再構築をしたらもう全然終わりませんでした・・
おかげさまで,サーバの負荷率1710ptとかもう管理者に怒られるレベル。罠だ罠。
というわけでカテゴリー内遷移リンクは外しました。そのうち時が解決するかもしれません。
2009. 1. 18 (SUN)
permission でないど。
やっぱりドキュメントは良く読もう。
MovableType環境変数リファレンス
今回の課題,というか読んでるうちに解決した事項及び使った環境変数です。
すべて mt-config.cgi の中に適当に書いておけば効くような感じです
本当は管理画面の設定で是非設定できて欲しいものばかりなわけですが。
- DBUmask, DirUmask, HTMLUmask, UploadUmask
Movable Type は、ファイルとディレクトリの作成時に、umask の設定値を使ってファイルのパーミッションを設定します。 cgiwrap と suexec 下で実行している場合、これらの設定はすべて 0022 の値にしてください。 - MaxResults
検索で返される結果の最大数を示します。 通常の検索の場合、結果数はブログひとつについての数を示します。たとえば、MaxResults を 5 に設定すると、あなたのシステム上の各ブログは、最大5個までの検索結果が返されるようになります。 新しいコメント検索の場合、最大数は新しいコメントが付けられたブログ記事の数になります。 - MailTransfer
メール送信のプログラムを sendmail ではなく SMTP にしたい場合は、MailTransfer の設定値を smtp にしてください。初期値は sendmail です。debug を設定すれば、デバッグ用にメールメッセージを書き出すことができます。 - SendMailPath
デフォルトで Movable Type は 3 つの場所 (/usr/lib/sendmail, /usr/sbin/sendmail, /usr/ucblib/sendmail) でsendmailを探します。 sendmail が別の場所にある場合は、SendMailPath の設定を調整することができます。
だそうです。分かる人がちゃんと読んで設定すればよいのでしょうけれど,分かる人は既に知っていることだと思うところが悩ましいですね。
まずは ~Umask について,無条件で rwxrwxrwxにされるのがどうにも納得いかなかったんだけど,設定可能だったわけですね。設定値ですけど
DirUmask は 0022 (= rwxr-xr-x)ぐらい
HTMLUmask は 0133(= rw-r--r--)ぐらい
UploadUmask も 0133ぐらい
でいいですかね。数字の意味とかは "パーミッション"とか "chmod" とかいう単語で調べて下さい。
MaxResultはそのまんまですね。サーバの負荷と相談して決めて下さい。
MailTransfer と SendMailPath は,なんか動いたからいいや。ぐらいな感じなのですが・・
多分,MovableTypeの3.3ぐらいまではコメントとかトラックバックがあったときに設定したメールアドレスにメールを出してくれていたんだけど,なんか MovableType4.x にアップグレードしてから以降,この機能が効いていないような気が・・
どうせスパムコメントばっかりだからいいかな,と放置していたんだけれどこれを設定したらなんとなく解決!
が!設定した値が問題!設定値そのまま晒してみますけど
MailTransfer sendmail
SendMailPath /usr/sbin/sendmail
なんですよ。でもどっちも説明を良く読むとデフォルト値なんですよねぇ・・・
一体誰が嘘をついているの?
