そんなわけで静的出力至上主義派の私から再構築の時間を短縮するための超基本をささっとクリスマスプレゼントします。
MT ユーザは皆知ってる再構築をおさらいしておくと。
このページなど登録したデータを、テンプレートの内容を元に、HTML ファイルなどのファイルを出力するための機能・操作が再構築です。
データの更新やテンプレートの変更をサイトへ反映させるには再構築が必要です。
操作を行うとファイル出力が終わるまで待たされるのも再構築の醍醐味、帰るまでが遠足、待ち時間もデート、みたいな
ものですが、短時間で終わることに困る人はいないと思います。
再構築の時間もパフォーマンスもテンプレートの内容や設定に大きく影響を受けます。
そのためテンプレートの工夫次第で、時間を短くできますが、それにはテンプレート構築のテクニックが必要になるため誰でもとはいきません。
今回はテクニックが必要ないかんたんな設定を紹介します。
今回はこのブログのデータを使いました。
再構築にかかった時間は、再構築ウィンドウに表示されるものを確認しました。
Movable Type Pro | 6.2.2 |
---|---|
記事 | 961件 |
ウェブページ | 0件 |
アイテム | 10件 |
テーマ | 自家製 |
サーバーモデル | CGI |
この時間がどれだけ短くなるか見ていきます。
45式::雑記を再構築しました。 処理時間: 15 分, 8 秒
テンプレートの中に必要ないもの、何らかのテストに使ったテンプレートなどが残ってませんか?
必要ないテンプレートからファイルを出漁するのは無駄だと思います。
そういうテンプレートは、バックアップしてから、思い切って削除するか「公開しない」設定へ変更しましょう。
変更はテンプレートの編集画面で行えます。
このブログにはそういうテンプレートがないため実施できませんでした。
テンプレートの中には CSS や JavaScript などもページ以外のものを出力している場合もあると思います。
そのテンプレート、毎回更新する必要がありますか?
毎回更新する必要がないものは「手動」へ変更しましょう。
手動へ変更するとテンプレートの一覧か編集画面からしか再構築できないようになり、再構築ウィンドウから操作した場合の対象から除外されます。
このブログには CSS を2つ、JavaScript を1つ、出力するテンプレートがあったので「手動」へ変更しました。
が、全く効果が見られませんでした。
しょぼいファイルを出力しているのでボトルネックになっていなかったようです。
EntriesPerRebuild は1回の再構築で処理する記事の数を設定できます。
mt-config.cgi に未指定の場合、初期値は 40 です。
この設定はサーバに負荷をかけることもありますが、現在のサーバはかなり安定していて余裕もあるので思い切って 1000 を設定しました。
EntriesPerRebuild 1000
mt-config.cgi へ設定したあとの再構築の結果は、思った以上に効果がありました。
45式::雑記を再構築しました。 処理時間: 11 分, 3 秒
RebuildOffsetSeconds は再構築時のタイムアウトを防ぐためのリクエスト間隔を設定できます。
mt-config.cgi に未指定の場合、初期値は 20 です。
現在のサーバはタイムアウトの設定をだいぶ延ばしているので、思い切って 300 を設定しました。
RebuildOffsetSeconds 300
mt-config.cgi へ設定したあとの再構築の結果は、思った以上に効果がありました。
45式::雑記を再構築しました。 処理時間: 9 分, 50 秒
設定前は効果があるのか半信半疑でしたが、少しだけ効果が出ました。
ちなみにこの RebuildOffsetSeconds ですが、EntriesPerRebuild を初期値のまま設定しても全く効果が見られませんでした。
なので RebuildOffsetSeconds は EntriesPerRebuild とあわせて変更するのがよいと思います。
ウェブサイト/ブログの全般設定画面に「モジュールのキャッシュ」という設定があります。
この設定を有効にするとテンプレートモジュール毎にキャッシュの設定ができるようになります。
キャッシュの設定はサイトによって異なると思いますが、とりあえず今回は設定をオンにするだけで結果を見てみました。
45式::雑記を再構築しました。 処理時間: 4 分, 36 秒
んんんん、テンプレートモジュールでキャッシュの設定をしていないのに、かなり効果が出ました。
もう少しこの設定について調べたいところですが、とりあえず今回は効果があった結果として記載します。
もう検証ができないのですが、再構築時間の短縮に効果があるものとして SSD の利用があります。
現在、私はさくらの VPS の、 SSD を使っています。
SSD の前もさくらの VPS を利用していましたがその頃は HDD で、再構築に 20 分近くかかってました。
そこから SSD に移行しただけで 2/3 ぐらいに時間が短縮されました。
ディスク I/O は早い方が再構築時間の短縮に繋がるようですので、選択できる場合には SSD を選択することをおすすめします。
下記については高速化の手段ではありますが、再構築に特化したものではないので今回は検証しませんでした。
下記についても検証しましたが再構築時間を短縮する結果は見られませんでした。
それではまた来年お会いしましょう。
]]>テーマはMTのリリースノートに名前を載せる秘訣Movable Typeの環境変数です。
どうもMTのインストールやアップグレードの敷居が高く思われているようで、ちゃんとコツを覚えておけばそう難しくはないんですが、それをすこーし低くしてみたいなと思っているのですが、その事前知識として環境変数を知っておくとよいです。
MTの環境変数がどのようなものかはmt-config.cgiの内容を少しでもみたことがあれば何となくわかっているかと思います。
環境変数を端的に説明するものとして公式っぽいドキュメントには次のような説明があります。
誤解を恐れず一言で表すと「mt-config.cgiで設定できる項目」になります。
もう少し言葉を足すと、Movable Typeの設定で「環境変数」と呼ばれ、mt-config.cgiで設定を行います。
Movable Type の設定ファイル mt-config.cgi で設定可能な環境変数の紹介
以前は私も上記のように認識していましたが今は少し違っていて、環境変数は環境で一意の設定という説明が適切ではないかと考えています。
環境変数は主にmt-config.cgiファイル内に記述して使います。
なぜ「主に」かというと、環境変数はデータベースにも保存されているためですが、まずはmt-config.cgiの内容を見てみましょう。
サンプルとしてはこんな感じ。
CGIPath /cgi-bin/mt/ EmainAdressMain mail@example.com DebugMode 0 #ExelionMode 1 PluginPath plugins PluginPath plugin2
設定内容はパス、1か0によるオンオフ、メールアドレスなど自由入力、などなど様々な指定があります。中には複数行に記述することで配列として機能するものもあります。
mt-config.cgi内では以下のフォーマットを守って記述します。
上記のサンプルでいえばCGIPathが環境変数名、/cgi-bin/mt/が「設定する値」です。行頭が#のExelionModeはコメント行となり、指定した1は機能しません。区切りである半角スペースの数に制限はないのでサンプルのように設定の桁を揃えることも可能です。
さきほどちらっと触れましたが、環境変数の値はデータベースにも保存されています。
保存されている場所はmt_configテーブル内のレコードです。
たとえば私の環境のmt_configをのぞいてみるとこんな感じです。
見ての通り、mt-config.cgiと同様に、環境変数名+半角スペース+値、というフォーマットです。
このmt_configテーブルについて間違えてはいけないのは、mt-config.cgiの設定が保存されるのではないという事です。
mt_configテーブルの設定はmt-config.cgiとは別に保存されています。
たとえばシステムレベルの全般設定画面の設定のほとんどは環境変数としてmt_configテーブルに保存されます。
環境変数はmt-config.cgiに設定し、データベースのmt_configテーブルにも保存されていると説明しました。
では、両方に設定があるときはどうなるのか、環境変数の設定は次の優先順位で決定します。
環境変数には初期値が存在するものがあり、mt-config.cgiとmt_configのどちらにも設定がない場合には初期値が利用されます。
私が環境変数を環境で一意の設定と感じるのはこの動作が理由です。
ここまで押さえておけば環境変数については大丈夫でしょう。
環境変数に興味がわいた方は環境変数リファレンスをのぞいてみると新しい発見があるかもしれません。
環境変数をもう少し深く知りたい方は、もう少しだけおつきあいください。
環境変数は定義の必要がなく、プラグインなどを作らなくても自由な宣言ができます。
たとえばmt-config.cgiに環境変数リファレンスにないSuperModeを設定してもエラーになったりはしません。
(※もし環境変数SuperModeをご利用のプラグインがありましたらお知らせ願います)
SuperMode 1
必要に応じて自由に設定してください。
とはいえ好きに書いて何に使えるのか、というと……。
環境変数はテンプレートタグで取得することができます。
取得するために専用のテンプレートタグはありませんが、少し独特な書き方をします。
たとえば、環境変数EmailAddressMainを取得したい場合には次のようなテンプレートを記述します。
<$MTGetVar name="config.EmailAddressMain"$>
このように変数を扱うタグでconfig.環境変数名(コンフィグドット変数名)という書式で変数名を指定すると環境変数の値が扱えます。
環境変数の値で分岐する記述も可能です。
<$MTIf name="config.DebugMode"$>
DebugMode が有効です
<MTElse>
DebugMode ではありません
</MTIf>
ここで自由に宣言した環境変数の出番です。
<$MTIf name="config.developer"$>
ここは開発環境です。
</MTIf>
このように環境固有の分岐を行うことができます。
これはデータに手を加えたくない場合、プラグインの追加など構成を変更したくない場合に有効です。
本当はもう少し書きたいんですが、12日目が過ぎてしまいそうなので今日はここまで。
では、またいつの日か。
]]>ちょっとMTを弄っていたら、新規ユーザー向けウェブサイトという見慣れないものが作られた。
お仕事でMTの環境はよく作りますが、これを見たのは初めてだったので少し調べました。
MTではユーザを登録した際にそのユーザ用のブログを自動作成する事が可能なようで、そのブログを作成するための親ウェブサイトが新規ユーザー向けウェブサイトのようです。
なので、別にシステムにウェブサイトを作ってもらう必要はなく、管理者が任意に指定することも可能ですし、またユーザー用のブログを自動作成しない設定も可能です。
自動作成される条件は複数あり、下記を全て満たされた場合に自動作成されます。
環境変数DefaultSiteURLに値が設定されている
環境変数DefaultSiteRootに値が設定されている
環境変数NewUserDefaultWebsiteIdに値が設定されていない
各所で紹介されている方法だと思うので説明は省略します簡単に説明すると、現在の記事と一つ前の記事の日付けを比較し、それが異なった場合に見出しを出力しています。
<MTEntries>
<MTEntriesHeader>
<p><$MTEntryDate format="%Y年%m月"$></p>
<ul>
<$MTEntryDate format="%Y%m" setvar="prev_date"$>
</MTEntriesHeader>
<$MTEntryDate format="%Y%m" setvar="entry_date"$>
<MTIf name="entry_date" ne="$prev_date">
</ul>
<p><$MTEntryDate format="%Y年%m月"$></p>
<ul>
</MTIf>
<li><$MTEntryTitle$></li>
<$MTEntryDate format="%Y%m" setvar="prev_date"$>
<MTEntriesFooter>
</ul>
</MTEntriesFooter>
</MTEntries>
上記のソースを出力した場合、月ごとの見出しが表示されます。
<p>2010年07月</p>
<ul>
<li>Action Streams 2.3</li>
</ul>
<p>2010年06月</p>
<ul>
<li>投稿日時順の記事一覧から最新更新日時を探す方法</li>
<li>MTタグで日時を比較する方法とMTDateタグとtsモディファイア</li>
<li>文字列の比較</li>
<li>電撃大王GENESIS 2010SPRING('10#06)</li>
<li>Atom/RSSフィードにウェブページを追加する簡単な方法</li>
<li>MTPagesタグ中でMTEntry*タグが動作する</li>
<li>MTEntriesタグのclass_typeモディファイア</li>
</ul>
<p>2010年05月</p>
<ul>
<li>月刊少年シリウス '10#06</li>
<li>twicliのユーザースタイルシート(試作中) #twicliJP</li>
<li>Feeds.AppLiteからFeedExへ乗り換え</li>
<li>run-periodic-tasksのvオプションでエラー箇所をテンプレートまで絞る</li>
</ul>
掲題は「見出しを入れる方法」ですが、上記出力例の通り、エントリーを日付けごとにまとめる方法でもあります。
<MTEntries>
<MTEntriesHeader>
<table>
<caption><$MTEntryDate format="%Y年%m月"$></caption>
<$MTEntryDate format="%Y%m" setvar="prev_date"$>
</MTEntriesHeader>
<$MTEntryDate format="%Y%m" setvar="entry_date"$>
<MTIf name="entry_date" ne="$prev_date">
</table>
<table>
<caption><$MTEntryDate format="%Y年%m月"$></caption>
</MTIf>
<tr><td><$MTEntryTitle$></td></tr>
<$MTEntryDate format="%Y%m" setvar="prev_date"$>
<MTEntriesFooter>
</table>
</MTEntriesFooter>
</MTEntries>
<table>
<caption>2010年07月</caption>
<tr><td>Action Streams 2.3</td></tr>
</table>
<table>
<caption>2010年06月</caption>
<tr><td>投稿日時順の記事一覧から最新更新日時を探す方法</td></tr>
<tr><td>MTタグで日時を比較する方法とMTDateタグとtsモディファイア</td></tr>
<tr><td>文字列の比較</td></tr>
<tr><td>電撃大王GENESIS 2010SPRING('10#06)</td></tr>
<tr><td>Atom/RSSフィードにウェブページを追加する簡単な方法</td></tr>
<tr><td>MTPagesタグ中でMTEntry*タグが動作する</td></tr>
<tr><td>MTEntriesタグのclass_typeモディファイア</td></tr>
</table>
<table>
<caption>2010年05月</caption>
<tr><td>月刊少年シリウス '10#06</td></tr>
<tr><td>twicliのユーザースタイルシート(試作中) #twicliJP</td></tr>
<tr><td>Feeds.AppLiteからFeedExへ乗り換え</td></tr>
<tr><td>run-periodic-tasksのvオプションでエラー箇所をテンプレートまで絞る</td></tr>
</table>
]]>
じゃあ、MT4は斬り捨て御免?
GitHubを確認したら……MT4は切り捨てられてなくて一安心。
This plugin works both with Movable Type 5 and Movable Type 4.
- Movable Type 5.02 or higher
- Movable Type 4.2 or higher
- Scheduled task or cron job to execute the Periodic Tasks script (see below)
ところがどっこい、このAction Streams2.3はMT5に対応しただけではないようです。
MT4ユーザも見過ごす事無かれ。
Action Streams2.2で不具合の修正がいくつか行われたようです。
Forked from the original repository.
Improved Delicious stream.
Fixed error when rebuilding blogs with deactivated templates.
Support for "not" operator in mt:ActionStreams "service" and "stream" tag attributes when used individually.
Quieter operation when used with Log4MT.
Fixed bug that prevented use of methods other than get() with the HTTP caching system.
リリース情報によると対応サービスからいくつかが削除されたようです。
Removed : TwitterSearch, Technorati Search, Google Blogs, Dodgeball, Ma.gnolia and Google News
削除された理由は不明です。
Action Streams2.3にはイベントの削除という新機能が追加されています。
MT4.27に同梱されているAction Streams2.1には無かった機能ですよ!
私が最も欲していた念願の機能です。
これでイベントデータの肥大化を抑制できます。
この機能を使うには自動削除の有効化と間隔(日数)の設定が、システムプラグイン設定で必要です。
(システムプラグイン設定はシステム > ツール > プラグインと進みます)
自動削除はcronによって行われ、メッセージを受信する場合には次のような内容が届きます。
]]>メッセージ: ****個のアクションストリームのイベントデータが削除されました
メッセージ: スケジュールされたタスク
Atomフィードの更新日時を出力するコードが気になりました。
テンプレートは自作ではなく、規定のブログテンプレートセットから拝借したものです。
<updated><MTEntries lastn="1"><$MTEntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></MTEntries></updated>
どうしてフィードの更新日時に、最新記事の更新日時を使っているのでしょうか。
最新記事に拘って参照するなら投稿日時、MTEntryDate
タグの方が相応しいと思うのです。
<updated><MTEntries lastn="1"><$MTEntryDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></MTEntries></updated>
でも更新日時に拘って参照するなら、それは最新記事からではなく配信している記事中で一番新しい更新日時の方が相応しいと私は思います。
そんなわけで、投稿日時順中の記事一覧から最新の更新日時を取得してみました。
私が思いついた方法は二つです。
こちらの方法では、更新日時を一件ずつ比較して、最新のものを探しています。
<MTEntries sort_by="created_on" lastn="15">
<$MTEntryModifiedDate format="%Y%m%d%H%M%S" setvar="entry_date"$>
<MTIf name="entry_date" ge="$date"$>
<$MTEntryModifiedDate format="%Y%m%d%H%M%S" setvar="date"$>
</MTIf>
</MTEntries>
<updated><MTDate ts="$date" utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></updated>
こちらの方法では、ハッシュを利用して更新日時の一覧を作り、時系列に並べ替え、最新のものを探しています。
<MTSetHashVar name="date">
<MTEntries sort_by="created_on" lastn="15">
<$MTEntryModifiedDate format="%Y%m%d%H%M%S" setvar="$__counter__"$>
</MTEntries>
</MTSetHashVar>
<MTLoop name="date" sort_by="value numeric reverse">
<MTIf name="__first__">
<updated><$MTDate ts="$__value__" utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></updated>
</MTIf>
</MTLoop>
MTIf
タグで行います。<$MTSetVar name="foo" value="2000年9月 9日 01:00"$>
<$MTSetVar name="bar" value="2000年9月13日 01:00"$>
<MTIf name="foo" lt="$bar">
<$MTGetVar name="foo"$> より <$MTGetVar name="bar"$> の方が未来です
<MTElse name="bar" lt="$foo">
<$MTGetVar name="bar"$> より <$MTGetVar name="foo"$> の方が未来です
</MTIf>
2000年9月 9日 01:00 より 2000年9月13日 01:00 の方が未来です
ところがどっこい、正しい比較ができない場合もあります。
比較の式は上記と同じなので省略します。
その一。
<$MTSetVar name="foo" value="2000年9月9日"$>
<$MTSetVar name="bar" value="2000年9月13日"$>
2000年9月13日 より 2000年9月9日 の方が未来です
その二。
<$MTSetVar name="foo" value="Wed, 13 Sep 2000 01:00:00 +0900"$>
<$MTSetVar name="bar" value="Thu, 14 Sep 2000 01:00:00 +0900"$>
Thu, 14 Sep 2000 01:00:00 +0900 より Wed, 13 Sep 2000 01:00:00 +0900 の方が未来です
以上の成功例と失敗例から次のような条件が必要だと考えられます。
この条件を満たしていないと数値の比較ではなく、文字列の比較(ソート)になってしまうのだと思います。
条件さえ満たしていれば、次のような比較も可能です。
<MTIf tag="EntryDate" gt="Date">
この記事は未来のものです
<MTElse tag="EntryDate" lt="Date">
この記事は過去のものです
<MTElse tag="EntryDate" eq="Date">
この記事は現在のものです
</MTIf>
この場合は日付の言語のフォーマットで比較されています。
それでは、月名を含む言語のlanguage="en"
や曜日名を含むformat_name="rfc822"
の出力形式をした日時は比較できないのでしょうか。
<$MTSetVar name="foo" value="September 13, 2000 1:00 AM"$>
<$MTSetVar name="bar" value="Wed, 13 Sep 2000 01:00:00 +0900"$>
このままでは非常に難しいです。
(regex_replaceモディファイアで形式を変換すれば可能だと思います、非常に手間ですが)
しかし出力する前なら、先に日時を比較、後で任意の形式に出力、する方法があります。
そのためにはMTDate
タグの利用が不可欠です。
MTDate
タグとts
モディファイアMTDate
タグには、任意の時間を任意の形式に出力できる、ts
モディファイアがあります。
ts="YYYYMMDDhhmmss"
値に指定した日付を利用して、任意のフォーマットで出力できます。設定する日付は
YYYYMMDDhhmmss
というフォーマットで記述します。
設定するフォーマットにさえ注意すれば難しくはありません。
<$MTDate ts="20000913010000" language="ja"$>
2000年9月13日 01:00
設定には変数の値を参照する事もできます。
<$MTSetVar name="second_impact" value="20000913010000"$>
<$MTDate ts="$second_impact" language="ja"$>
format="%Y%m%d%H%M%S"
ts
モディファイアのフォーマットをformat
モディファイアで用意すれば、他のMT*Date
タグの値も簡単に扱えます。
<$MTEntryDate format="%Y%m%d%H%M%S" setvar="date"$>
<$MTDate ts="$date" language="ja"$>
(す、すみません。良い例が考え付きませんでした)
MTDate
タグを利用した日時比較の例先の失敗例もMTDate
タグを使えばこの通りです。
<$MTSetVar name="foo" value="20000913010000"$>
<$MTSetVar name="bar" value="20000914010000"$>
<MTIf name="foo" lt="$bar">
<$MTDate ts="$foo" format_name="rfc822"$> より <$MTDate ts="$bar" format_name="rfc822"$> の方が未来です
<MTElse name="bar" lt="$foo">
<$MTDate ts="$bar" format_name="rfc822"$> より <$MTDate ts="$foo" format_name="rfc822"$> の方が未来です
</MTIf>
Wed, 13 Sep 2000 01:00:00 +0900 より Thu, 14 Sep 2000 01:00:00 +0900 の方が未来です
ts
モディファイアのフォーマットは数値のみなので、比較するのに便利で、任意のフォーマットに再変換しやすい事がさらに便利です。
この場合は日時の比較を使わない方法もありますが、答え合わせができる例をと考えました。
まあ、管理画面でブログ記事を25件ずつ表示させればすぐに確認できるんですけどね。
で、まずは日時の比較を使わない方法を二つ。
<MTEntries sort_by="created_on" sort_order="descend" offset="24" lastn="1">
<p><$MTEntryTitle$></p>
<p><$MTEntryDate language="en"$></p>
</MTEntries>
<MTEntries sort_by="created_on" sort_order="descend" lastn="25">
<MTEntriesFooter>
<p><$MTEntryTitle$></p>
<p><$MTEntryDate language="en"$></p>
</MTEntriesFooter>
</MTEntries>
簡単な構造なので解説は省略です。
そして本題、日時の比較を使った方法です。
<MTEntries sort_by="created_on" sort_order="descend" lastn="25">
<MTEntriesHeader>
<$MTEntryTitle setvar="title"$>
<$MTEntryDate format="%Y%m%d%H%M%S" setvar="date"$>
</MTEntriesHeader>
<$MTEntryDate format="%Y%m%d%H%M%S" setvar="entry_date"$>
<MTIf name="entry_date" le="$date"$>
<$MTEntryTitle setvar="title"$>
<MTSetVarBlock name="date"><$MTGetVar name="entry_date"$></MTSetVarBlock>
</MTIf>
</MTEntries>
<p><$MTGetvar name="title"$></p>
<p><$MTDate ts="$date" language="en"$></p>
ざっくり解説すると、まずMTEntriesHeader
タグ中で暫定チャンピオンを決めます。
変数entry_date
は挑戦者です。
そして、MTIf
タグで対決、挑戦者が勝ったらチャンピオンの交代です。
先の方法と同じ結果が出力されれば、日時の比較ができている事になります。
下記の方法は日時を比較するためのデモンストレーションであり、実用には向かない欠陥を抱えています。
(欠陥については解説の続きを参照して下さい)
先の場合と違って、今度は日時を比較しないと無理だと思います。
(MT4.27現在、MTEntries
タグでoffset
とdays
モディファイアの併用ができません)
<$MTDate format="%Y%m%d%H%M%S" setvar="date"$>
<$MTSetVar name="date" op="-" value="7000000"$>
<MTEntries sort_by="created_on" sort_order="descend" lastn="25">
<$MTEntryDate format="%Y%m%d%H%M%S" setvar="entry_date"$>
<MTIf name="entry_date" lt="$date"$>
<p><$MTEntryTitle$></p>
<p><$MTDate ts="$entry_date" language="ja"$></p>
</MTIf>
</MTEntries>
ざっくり解説します。
まず、MTDate
タグで現在の日時を変数date
に格納します。
そこからMTSetVar
タグで1週間分(7日)を引いて、比較する基準の日時が準備できます。
記事の投稿日時は同じ形式で変数entry_date
に格納します。
後は、MTIf
タグで投稿日時が基準より過去か判断し、過去であれば記事名と投稿日時を出力します。
現在日時の1週間前を計算するのに、7000000
を引いているのが駄目です。
例えば、同様の方法で2000年9月13日の14日前を用意しようとすると次のようなコードになります。
<$MTSetVar name="date" value="20000901010000"$>
<$MTSetVar name="date" op="-" value="7000000"$>
<$MTDate ts="$date" language="ja"$>
実行するとあり得ない日時が出力されます。
2000年8月87日 01:00
ts
モディファイアのフォーマットは進法がごちゃまぜなので、あ、当たり前ですよね……。
……出直してきます。
文字列の比較は知らない内に使っています。
例えばMTEntries
タグのsort_by
モディファイアで名前順にソートした時、内部では文字列の比較が行われています。
同じsort_by
モディファイアを持つMTLoop
タグで確認してみましょう。
<MTSetHashVar name="monat">
<$MTSetVar name="01" value="Januar"$>
<$MTSetVar name="02" value="Februar"$>
<$MTSetVar name="03" value="Maerz"$>
<$MTSetVar name="04" value="April"$>
<$MTSetVar name="05" value="Mai"$>
<$MTSetVar name="06" value="Juni"$>
<$MTSetVar name="07" value="Juli"$>
<$MTSetVar name="08" value="August"$>
<$MTSetVar name="09" value="September"$>
<$MTSetVar name="10" value="Oktober"$>
<$MTSetVar name="11" value="November"$>
<$MTSetVar name="12" value="Dezember"$>
</MTSetHashVar>
<MTLoop name="monat" sort_by="value">
<$MTGetVar name="__value__"$>
</MTLoop>
上記のコードを実行した結果が下になります。
April
August
Dezember
Februar
Januar
Juli
Juni
Maerz
Mai
November
Oktober
September
April
からSeptember
まで順に並んで出力されました。
さらに、英字以外も取り混ぜた場合も試してみましょう。
<MTSetHashVar name="chara">
<$MTSetVar name="01" value="1"$>
<$MTSetVar name="02" value="a"$>
<$MTSetVar name="03" value="A"$>
<$MTSetVar name="04" value="あ"$>
<$MTSetVar name="05" value="ア"$>
<$MTSetVar name="06" value="9"$>
<$MTSetVar name="07" value="z"$>
<$MTSetVar name="08" value="Z"$>
<$MTSetVar name="09" value="ん"$>
<$MTSetVar name="10" value="ン"$>
<$MTSetVar name="11" value="0"$>
<$MTSetVar name="12" value="式"$>
</MTSetHashVar>
<MTLoop name="chara" sort_by="value">
<$MTGetVar name="__value__"$>
</MTLoop>
(やらしい感じがしなくもない)実行結果。
0
1
9
A
Z
a
z
あ
ん
ア
ン
式
数字、大文字、小文字、ひらがな、カタカナ、漢字という順になりました。
並べ替えられた結果では文字列の比較がどうも実感できません。
そこで今度は個別の比較をして見ましょう。
比較にはMTIf
タグの比較モディファイアを使います。
MTIf
タグでは数値の比較だけでなく、文字列の比較もできます。
例として、aとzを比較してみます。
<$MTSetVar name="foo" value="a"$>
<$MTSetVar name="bar" value="z"$>
<MTIf name="foo" lt="$bar">
<$MTGetVar name="foo"$> < <$MTGetVar name="bar"$>
<MTElse name="bar" lt="$foo">
<$MTGetVar name="bar"$> < <$MTGetVar name="foo"$>
</MTIf>
実行結果です。
a < z
先ほどのごちゃ混ぜの結果を不等式で表すと次のようになります。
0 < 1 < 9 < A < Z < a < z < あ < ん < ア < ン < 式
この式から実行結果が正しい事がわかります。
そしてこれは、文字列の比較ができた事を意味しています。
文字列の比較では空白に注意して下さい。
下は、記事冒頭の例を、変数の文字数が揃うように空白を挿入したものです。
<MTSetHashVar name="monat">
<$MTSetVar name="01" value=" Januar"$>
<$MTSetVar name="02" value=" Februar"$>
<$MTSetVar name="03" value=" Maerz"$>
<$MTSetVar name="04" value=" April"$>
<$MTSetVar name="05" value=" Mai"$>
<$MTSetVar name="06" value=" Juni"$>
<$MTSetVar name="07" value=" Juli"$>
<$MTSetVar name="08" value=" August"$>
<$MTSetVar name="09" value="September"$>
<$MTSetVar name="10" value=" Oktober"$>
<$MTSetVar name="11" value=" November"$>
<$MTSetVar name="12" value=" Dezember"$>
</MTSetHashVar>
<MTLoop name="monat" sort_by="value">
<$MTGetVar name="__value__"$>
</MTLoop>
実行結果は空白を挿入する前と異なったものになります。
Mai
Juli
Juni
April
Maerz
August
Januar
Februar
Oktober
Dezember
November
September
April
からSeptember
だった順が、今度はMai
からSeptember
になりました。
研究、草壁、広瀬と問題が山積する朝永だが、遠野の協力にって広瀬の嫌がらせを終わらせた。
授業の難易度を思い出して笑みがこぼれる草壁。
貞操の危機と誤解して怯える広瀬。
酒に呑まれて上機嫌の加山先生。
みんなかわいい。
朝永がコンニャクのダメージで凹んでる時に「しっかり」と声をかけている生徒がいる事に平和を感じた。
今回で広瀬との距離は縮まったからもうこじれる事はないげ。
いよいよ草壁の出番か。
草壁の家族は冷え切った感じだが、草壁自身の能力とは関係なさげ。
吹奏楽部で周りとうまくいかない明津は河原で一人、トランペット吹いていた。
しばらくすると、小太鼓を叩く小学生と、泣きながら歌う女子高生が乱入してくる。
話の中盤、明津自身が恥ずかしくなる部分では、読んでるこっちも目を伏せたかった。
女子高生の遠本倫はある日突然、ハトやカラスが寄って来るようになる。
その原因はモテ期にあった。
前号の読み切り『御縁がありますように』の前日談っぽい感じ。
新しいモテ期だ。
動物が寄ってくるのは、動物好きには羨ましいテモ期。
シルフレイヴとの同居を望むアンジェリカに危機感は全くなかった。
シルフレイヴの危惧する事が伝わらないのはアンジェリカが無防備なだけ。
でもこの先に起こりえそうなハプニングは命懸けっぽい。
賊を滅ぼしたナナベルティカの魔法をきっかけに、帝国が動く。
オヴの能力が高すぎて、逆に怖い。
草原の民は伏線かな。
彩花は学院を支配するトカレフと相対する。
学院の規則は目的がわからない。
sengoku jidai.
前号のモブだったお姉さんがいない……。
艶やかに銃を纏った貴婦人。
歩く武器庫とは呼び難い華やかさがある。
水没した鉄道駅?
辛うじて見える建物の名前が「DA LEVEL9」。
たぶん、「GRANADA LEVEL9」だろう。
MTEntries
タグ以下の構造をMTPage*
タグで再現する事になると思います。MTPage*
タグを使いません。MTPages
タグは使いますよ。
複雑な方法ではないので編集前は省略して、編集後のテンプレートソースです。
<$MTHTTPContentType type="application/atom+xml"$><?xml version="1.0" encoding="<$MTPublishCharset$>"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><$MTBlogName remove_html="1" encode_xml="1"$></title>
<link rel="alternate" type="text/html" href="<$MTBlogURL encode_xml="1"$>" />
<link rel="self" type="application/atom+xml" href="<$MTLink template="feed_recent"$>" />
<id>tag:<$MTBlogHost exclude_port="1" encode_xml="1"$>,<$MTTemplateCreatedOn format="%Y-%m-%d"$>:<$MTBlogRelativeURL encode_xml="1"$>/<$MTBlogID$></id>
<updated><MTEntries lastn="1"><$MTEntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></MTEntries></updated>
<MTIf tag="BlogDescription">
<subtitle><$MTBlogDescription remove_html="1" encode_xml="1"$></subtitle>
</MTIf>
<generator uri="http://www.sixapart.com/movabletype/"><$MTProductName version="1"$></generator>
<MTSetVarTemplate name="entry_block">
<entry>
<title><$MTEntryTitle remove_html="1" encode_xml="1"$></title>
<link rel="alternate" type="text/html" href="<$MTEntryPermalink encode_xml="1"$>" />
<id><$MTEntryAtomID$></id>
<published><$MTEntryDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></published>
<updated><$MTEntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></updated>
<summary><$MTEntryExcerpt remove_html="1" encode_xml="1"$></summary>
<author>
<name><$MTEntryAuthorDisplayName encode_xml="1"$></name>
<MTIf tag="EntryAuthorURL">
<uri><$MTEntryAuthorURL encode_xml="1"$></uri>
</MTIf>
</author>
<MTEntryCategories>
<category term="<$MTCategoryLabel encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#category" />
</MTEntryCategories>
<MTEntryIfTagged><MTEntryTags>
<category term="<$MTTagName normalize="1" encode_xml="1"$>" label="<$MTTagName encode_xml="1"$>" scheme="http://www.sixapart.com/ns/types#tag" />
</MTEntryTags></MTEntryIfTagged>
<content type="html" xml:lang="<$MTBlogLanguage ietf="1"$>" xml:base="<$MTBlogURL encode_xml="1"$>">
<$MTEntryBody encode_xml="1"$>
<$MTEntryMore encode_xml="1"$>
</content>
</entry>
</MTSetVarTemplate>
<MTEntries lastn="15">
<$MTGetVar name="entry_block"$>
</MTEntries>
<MTPages lastn="15">
<$MTGetVar name="entry_block"$>
</MTPages>
</feed>
この方法のポイントはMTSetVarTemplate
タグです。
entry
要素を変数化した事によってブログ記事とウェブページの両方を同じ型で出力できるのです。
MTPages
タグの使い方が不思議に思える方は拙記事のMTPages
タグ中でMTEntry*
タグが動作するを参照して下さい。
簡単な方法なので不要とも思いましたが、念のためにRSS 2.0フィードの編集例です。
<$MTHTTPContentType type="application/rss+xml"$><?xml version="1.0" encoding="<$MTPublishCharset$>"?>
<rss version="2.0">
<channel>
<title><$MTBlogName remove_html="1" encode_xml="1"$></title>
<link><$MTBlogURL$></link>
<description><$MTBlogDescription remove_html="1" encode_xml="1"$></description>
<language><$MTBlogLanguage ietf="1"$></language>
<copyright>Copyright <$MTDate format="%Y"$></copyright>
<lastBuildDate><MTEntries lastn="1"><$MTEntryDate format_name="rfc822"$></MTEntries></lastBuildDate>
<generator>http://www.sixapart.com/movabletype/</generator>
<docs>http://www.rssboard.org/rss-specification</docs>
<MTSetVarTemplate name="item_block">
<item>
<title><$MTEntryTitle remove_html="1" encode_xml="1"$></title>
<description><$MTEntryBody encode_xml="1"$></description>
<link><$MTEntryPermalink encode_xml="1"$></link>
<guid><$MTEntryPermalink encode_xml="1"$></guid>
<MTEntryCategories>
<category domain="http://www.sixapart.com/ns/types#category"><$MTCategoryLabel remove_html="1" encode_xml="1"$></category>
</MTEntryCategories>
<MTEntryIfTagged><MTEntryTags>
<category domain="http://www.sixapart.com/ns/types#tag"><$MTTagName remove_html="1" encode_xml="1"$></category>
</MTEntryTags></MTEntryIfTagged>
<pubDate><$MTEntryDate format_name="rfc822"$></pubDate>
</item>
</MTSetVarTemplate>
<MTEntries lastn="15">
<$MTGetVar name="item_block"$>
</MTEntries>
<MTPages lastn="15">
<$MTGetVar name="item_block"$>
</MTPages>
</channel>
</rss>
]]>
MTPages
タグ中ではMTPage*
タグだけでなく、MTEntry*
タグも動作します。
次の例ではMTPages
タグ中にMTPage*
タグを一切使っていませんが、ウェブページの一覧が出力されます。
<MTPages>
<MTEntriesHeader>
<ul>
</MTEntriesHeader>
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
<MTEntriesFooter>
</ul>
</MTEntriesFooter>
</MTPages>
MT4.27で試した限りでは、正常に動作しました。
それでも全てのMTEntry*
タグを試したわけではありません。
しかし、データベースの構造とMTPages
タグの内部処理を見た限り、MT4.*までなら問題なく動作すると思います。
変数を使い、ブログ記事とウェブページを同じ構造で出力させる事ができます。
<MTSetVarTemplate name="entry_block">
<MTEntriesHeader>
<ul>
</MTEntriesHeader>
<li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
<MTEntriesFooter>
</ul>
</MTEntriesFooter>
</MTSetVarTemplate>
<MTEntries>
<$MTGetVar name="entry_block"$>
</MTEntries>
<MTPages>
<$MTGetVar name="entry_block"$>
</MTPages>
もっと複雑な構造の場合でないと十分な効果を発揮できないと思います。
他に、欲しいMTPage*
タグがない場合に、MTEntry*
タグで代用する事ができます。
MTEntry*
タグに比べてMTPage*
タグはまだまだ少ないです。
ちなみに、MTEntries
タグ中でMTPage*
タグを使おうとするとエラーになります。
ただ、MTEntries
タグでウェブページを出力する事ならclass_type
モディファイアで可能です。
MTEntry*
タグとMTPage*
タグの対応表MTEntry*
タグで代用する時のために、対応するMTEntry*
タグとMTPage*
タグを表に並べてみました。
MovableType.jpのタグリファレンスから大まかに抽出しただけですが、参考にはなると思います。
カスタムフィールドなどのプラグインによって拡張されるMTタグは除外してあります。
MTEntryClass
タグがブログ記事側のみで、MTEntryClassLabel
タグが両方に跨いでいるのは、タグリファレンスでの扱いに準じているからです。
ブログ記事 | ウェブページ |
---|---|
MTEntries | MTPages |
MTEntriesCount | |
MTEntriesFooter | MTPagesFooter |
MTEntriesHeader | MTPagesHeader |
MTEntriesWithSubCategories | |
MTEntryAdditionalCategories | |
MTEntryAssets | MTPageAssets |
MTEntryAtomID | |
MTEntryAuthor | |
MTEntryAuthorDisplayName | MTPageAuthorDisplayName |
MTEntryAuthorEmail | MTPageAuthorEmail |
MTEntryAuthorID | |
MTEntryAuthorLink | MTPageAuthorLink |
MTEntryAuthorNickname | |
MTEntryAuthorURL | MTPageAuthorURL |
MTEntryAuthorUsername | |
MTEntryAuthorUserpic | |
MTEntryAuthorUserpicAsset | |
MTEntryAuthorUserpicURL | |
MTEntryBasename | |
MTEntryBlogDescription | |
MTEntryBlogID | |
MTEntryBlogName | MTPageBasename |
MTEntryBlogURL | |
MTEntryBody | MTPageBody |
MTEntryCategories | |
MTEntryCategory | MTPageFolder |
MTEntryClass | |
MTEntryClassLabel | |
MTEntryCommentCount | |
MTEntryCreatedDate | |
MTEntryDate | MTPageDate |
MTEntryEditLink | |
MTEntryExcerpt | MTPageExcerpt |
MTEntryFlag | |
MTEntryID | MTPageID |
MTEntryIfAllowComments | |
MTEntryIfAllowPings | |
MTEntryIfCategory | |
MTEntryIfCommentsOpen | |
MTEntryIfExtended | |
MTEntryIfTagged | MTPageIfTagged |
MTEntryKeywords | MTPageKeywords |
MTEntryLink | |
MTEntryModifiedDate | MTPageModifiedDate |
MTEntryMore | MTPageMore |
MTEntryNext | MTPageNext |
MTEntryPermalink | MTPagePermalink |
MTEntryPrevious | MTPagePrevious |
MTEntryRank | |
MTEntryScore | |
MTEntryScoreAvg | |
MTEntryScoreCount | |
MTEntryScoreHigh | |
MTEntryScoreLow | |
MTEntryStatus | |
MTEntryTags | MTPageTags |
MTEntryTitle | MTPageTitle |
MTEntryTrackbackCount | |
MTEntryTrackbackData | |
MTEntryTrackbackID | |
MTEntryTrackbackLink |
実際に並べてみるとMTPage*
タグの少なさが目立ちます。
MTEntries
タグにclass_type
というモディファイアが使える事を知っていますか?
「Movable Type品質保証チーム」の説明によるとclass_type
は内部的な利用のためのモディファイア
だそうです。
一時期、MovableType.jpのタグリファレンスに載っていた事があり、私はその時期に存在を知りました。
class_type
モディファイアの値にentry
かpage
を設定すると、それに応じてブログ記事かウェブページのデータを出力します。
<MTEntries class_type="page">
この場合はウェブページを出力します
</MTEntries>
class_type="page"
を使う場合、わざわざMTPage*
タグを使う必要はなく、MTEntry*
タグでウェブページのデータを出力できます。
つまり、下のような関係が成り立ちます。
<MTEntries class_type="page">
= <MTPages>
<MTEntries class_type="page">
+ <$MTEntryTitle$>
= <$MTPageTitle$>
ここまで書いておいて何なのですが、良い使い道を知りません。
以前は次のように使っていました。
<feed>
<MTSetVarTemplate name="entry_block">
<entry>
<title><$MTEntryTitle remove_html="1"$></title>
<link rel="alternate" type="text/html" href="<$MTEntryPermalink encode_xml="1"$>" />
<id><$MTEntryAtomID$></id>
<published><$MTEntryDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></published>
<updated><$MTEntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></updated>
<summary><$MTEntryExcerpt remove_html="1" encode_xml="1"$></summary>
<author>
<name><$MTEntryAuthorDisplayName encode_xml="1"$></name>
</author>
<content>
<$MTEntryBody encode_xml="1" convert_breaks="0"$>
<$MTEntryMore encode_xml="1" convert_breaks="0"$>
</content>
</entry>
</MTSetVarTemplate>
<MTEntries>
<$MTGetVar name="entry_block"$>
</MTEntries>
<MTEntries class_type="page">
<$MTGetVar name="entry_block"$>
</MTEntries>
</feed>
ところがこの場合、class_type
モディファイアの要らない方法が存在するのでベストな使い道とは思えません。
アイデア募集中。
どういうわけか、めっちゃピンク。
シリウスのロゴも、表紙を飾る夜桜四重奏・りらの格好も、夜桜四重奏の扉絵も、夜桜四重奏の着せ替えカバーも。
酷い内容(笑
単行本8巻限定版の付録だったCD『桜真町町内放送局』の完全な延長戦。
続けて聞く分には問題ないが、そうでないと退いてしまいそうな程、ゲスト四名のテンションが高過ぎ(笑
(なんで藤田咲は8巻のCDには出れないのー?)
診療所を襲った魔法使い・りらは姉・じゅりに半妖の力を見せつける。
りらは魔法使いより手品師っぽい、半妖という嘘も含めて。
夜なのに、クマさんは何処にいるのやら。
ざくろはゴーレムを「一人乗り」と言いつつ、後からアオを乗せてた。
ことはに厳しくアオに甘い?
将王バラバンの訃報が届かぬ戦場では、兵力の勝る三将国軍が圧倒的していた。
命を賭けて時間を稼ぐアイシェに対してオルハンが情けない。
そんなだから、アイシェが思い浮かべたのはその場にいるオルハンではなくマフムートとバヤジットだったんだよ。
まあでも、そんな感じで釣り合いが取れていると言えなくもない。
鞘を手に入れたハルだったが、じつは抜刀の基本すら知らなかった。
第二部のエピローグと第三部のプロローグ。
第三部は衝撃過ぎる展開。
特に丁髷。
でも丁髷以外の被害者もいるようで……むむむ。
桜木コーポを襲うウルルと七夜の前にレイとシンが立ち塞がる。
イチャイチャと、戦いが迫っているというのに緊迫感が無い。
新学期。
テシ子、純情派。
あ、いつも通りか。
舞台で殺される少女は公演の度に、死に、蘇生していた。
びっくりする程、普通に良い話。
しかし、プレーネの特性はよくわからなかった。
得られた教訓は、小切手の扱いに慎重さが要求されるという事。
とは言え、システムがstyleを操作する所があるので極端なレイアウトはできません。
なのでデフォルトのレイアウトに手を加える方向で我慢しています。
そして下が現在試作中のユーザースタイルシートです。
OperaとFirefoxでしか試してません。
まあ、そのまま使うのではなくて、セレクタとか自分のを作る参考になれば幸いです。
html,
body {
margin: 0;
padding: 0;
border: none;
background-image: none;
color: #333333;
font-size: 14px;
line-height: 1.3;
}
form {
margin: 0;
}
input {
border: 1px solid #999999;
padding: 1px 2px;
font-size: 14px;
line-height: 14px;
margin: 1px 2px;
}
textarea {
margin: 0;
padding: 1px 2px;
border: 1px solid #999999;
font-size: 14px;
line-height: 15px;
}
input[type="image"],
input[type="radio"],
input[type="checkbox"],
input[type="radio"] {
margin: 0 4px 0 0;
border: none;
padding: 0;
}
input[type="button"],
input[type="submit"] {
background-color: #eeeeee;
}
a {
color: #0033cc;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
hr.spacer {
margin: 14px 0;
border: none;
padding: 0;
height: 2px;
background-color: #999999;
color: #999999;
}
#control {
border-bottom-color: #999999;
}
#loading {
}
#fst {
top: 2px;
left: 2px;
margin: 0;
font-size: 12px;
}
#go {
top: 3px;
margin: 0;
padding: 0;
}
#rst {
top: 17px;
margin: 0;
padding: 0;
}
#menu {
max-width: 100%;
left: 0;
right: 0;
text-align: center;
}
#menu a {
height: 19px;
border: 1px solid #999999;
background-color: #dddddd;
color: #333333;
}
#menu a.sel {
height: 19px;
border: 1px solid #999999;
background-color: #ffffdd;
color: inherit;
}
#menu a.new {
background-color: #ffdddd;
}
.tw {
right: 0;
width: auto;
font-size: 14px;
}
#tw2 {
background-color: #ffffee;
}
#tw2h > div:only-child > a:only-child {
display:block;
background-color: #cccccc;
text-align: center;
cursor: pointer;
}
#tw2h a[target="twitter"][href="index.html"],
#tw2h a[target="twitter"][href="index.html"] ~ * {
margin-left: 14px;
margin-right: 14px;
}
#tw > div {
border-bottom: 1px solid #cccccc;
}
.tw-parent > div > div {
position: relative;
padding: 6px 14px;
border-bottom: 1px solid #cccccc;
}
.dummy {
border-bottom: 0;
padding: 0;
height: 0;
clear: both;
}
.fav {
float: none;
position: absolute;
right: 6px;
bottom: 6px;
visibility: hidden;
}
div:hover > .fav {
visibility: visible;
}
.uicon {
width: 48px;
height: 48px;
border: 2px solid #ffffff;
}
a .uicon {
border-width: 1px;
}
.fav + :not(.thumbnail-link) {
margin-right: 6px;
}
.fav + a:not(.thumbnail-link) {
float: left;
border: 1px solid #99ccff;
}
.uid {
font-weight: bold;
}
#tw .uid,
.fromme .uid {
display: none;
}
a .uid:only-child,
a:hover .uid {
display: inline !important;
}
.uname {
font-weight: bold;
}
.fromme .uid {
display: none;
}
.dir {
color: #cc9966;
font-weight: bold;
margin-left: 6px;
}
.status {
}
.status a.link {
border: none;
font-size: 12px;
background-color: transparent;
color: #0033cc;
}
.status a.link:hover {
background-color: transparent;
text-decoration: underline;
}
/*
.status a[href^="https://twitter.com/"][onclick],
.status a[href^="http://search.twitter.com/search?q="][onclick] {
font-weight: bold;
}
*/
.utils {
text-align: left;
}
.prop,
.prop a {
font-size: 12px;
color: #999999;
}
.date {
}
.separator {
}
.button {
visibility: hidden;
}
div:hover > span > .button {
visibility: visible;
}
.fromme {
background-color: #ddffee;
}
.tome {
background-color: #ffeedd;
}
.emp {
background-color: #ffeedd;
}
.non-follower {
color: #333399;
}
.retweeted {
color: #339966;
}
.popup {
padding: 0;
color: #999999;
font-size: 10px;
}
.popup small {
font-size: inherit;
}
.lock {
position: static;
margin-left: 6px;
}
.close {
color: red;
}
.get-next {
background-color: #cccccc;
color: #ffffee;
border: none;
}
#rep {
top: 50%;
right: 4%;
width: auot;
font-size: 14px;
}
#reps {
padding: 0 12px 4px;
}
#popup {
}
#popup a {
}
#popup a:hover {
}
#popup a.row2 {
}
#popup_hide {
}
#user_info {
margin: 6px 20%;
border: 1px solid #999999;
padding: 6px;
}
#user_info td {
font-size: 13px;
}
.uicon2 {
margin-right: 6px;
}
#user_info a:hover {
}
#counter-div {
}
#counter-p1 {
}
#counter-p2 {
}
#counter {
}
.thumbnail-link {
border-color: #999999;
margin-left: 6px;
margin-right: 14px;
}
.thumbnail-image {
width: auto;
height: 46px;
}
.thumbnail-link:hover img {
height: auto;
}
run-periodic-tasks経由で再構築する際に、次のメッセージがメールで届く。
Cannot decode string with wide characters at /usr/local/lib/perl5/5.8.9/mach/Encode.pm line 190.
Cannot decode string with wide characters at /usr/local/lib/perl5/5.8.9/mach/Encode.pm line 190.
Cannot decode string with wide characters at /usr/local/lib/perl5/5.8.9/mach/Encode.pm line 190.
Cannot decode string with wide characters at /usr/local/lib/perl5/5.8.9/mach/Encode.pm line 190.
Cannot decode string with wide characters at /usr/local/lib/perl5/5.8.9/mach/Encode.pm line 190.
メッセージが届くものの再構築は行われている。
手動で再構築する際にメッセージは出力されず、ログにも記録されない。
つまり、実害がない。
メッセージが届く事を除けば。
うん、やはりメッセージは邪魔くさい。
調べたら原因がMTFeed
タグ、つまりFeeds.App Liteプラグインだとわかった。
フィードの文字コードは関係ないらしく、もうお手上げ。
それで、手っ取り早い対策として、プラグインをFeeds.App LiteからFeedExへ乗り換えた。
Feeds.App Liteは高機能版のFeeds.Appが有償で提供されています。
が、私は機能に不満があるわけではないので、Feeds.App Liteと同等の機能を有するFeedExを選びました。
Feeds.App LiteとFeeds.Appは共存できませんが、FeedExはどちらとも共存できます。
なので両方を試してからどちらかに決める事もできます。
MTタグも似ているので書き換えも簡単、一括置換すれば一瞬です。
次の表はプラグインのタグを纏めたもので、Feeds.App Lite1.03とFeedEx0.6については全てのMTタグが載せてあります。
MTタグの概要 | Feeds.App Lite 1.03 | FeedEx 0.6 | Feeds.App 3.01 |
---|---|---|---|
フィード | MTFeed | MTFeedEx | MTFeed |
フィード内のアイテム | MTFeedEntries | MTFeedExEntries | MTFeedEntries |
アイテムの投稿日時 | MTFeedExEntryDate | MTFeedEntryPublished | |
アイテムの更新日時 | MTFeedEntryUpdated | ||
アイテムの概要 | MTFeedExEntryDescription | MTFeedEntrySummary | |
アイテムのリンク | MTFeedEntryLink | MTFeedExEntryLink | MTFeedEntryLink |
アイテムのタイトル | MTFeedEntryTitle | MTFeedExEntryTitle | MTFeedEntryTitle |
簡単表示 | MTFeedInclude | MTFeedInclude | |
フィードのリンク | MTFeedLink | MTFeedExLink | MTFeedLink |
フィードのタイトル | MTFeedTitle | MTFeedExTitle | MTFeedTitle |
迷惑コメント/トラックバックの評価値 | MTFeedbackScore |
補足しておきますが、Feeds.App3.01のMTタグは上記の他に80個くらいあります。
さらにフィードのキャッシュもできるようで、$40の価格は伊達じゃない!
($40なのはPersonal Licenseで、Commercial Licenseは$125です。)