MTエンジニアブログ
ぴろり上西
2011年05月13日
特にプラグインなどの開発中に出くわすことがあって、一般のユーザが普通に使っている分には、おそらく目にすることはないと思います。プラグインのスキーマバージョンが変更されたりすると、データベースのアップグレード処理が走ります。この時、以下のようなエラーが表示されてアップグレードが完了しない、ということがあります。
アップグレード中にエラーが発生しました [Microsoft][SQL Server Native Client X.X][SQL Server]データベースに 'mt_log_upgrade' という名前のオブジェクトが既に存在します。 at C:\vhost\mta\addons\Enterprise.pack\lib/MT/ObjectDriver/Driver/DBD/MSSQLServer.pm line 156.
これはプラグインやMTの論理エラーではなく、データベースに一時テーブルが残ってしまうことが原因です。前回のアップグレード処理の最中に、無理矢理処理を中断するなどすると、mt_xxx_upgrade という一時テーブルが残ってしまい、次のアップグレード処理時に、同名の一時テーブルを作成しようとしてエラーになることが理由です。溜まりに溜まったログなどの巨大なテーブルがある場合に発生しやすいようです。論理バグって感じですかね。
このような時には、SQL サーバに直接ログインして、問題の一時テーブル(mt_xxx_upgrade)を DROP TABLE してやれば解決します。
ぴろり上西
2011年04月22日
MT テンプレートタグの出力結果を Perl の強力な正規表現でゴニョゴニョできる regex_replace モデファイア。みなさん、活用されていますか? この記事では、この regex_replace モディファイアをより簡潔に記述し、より便利に使える小技を紹介します。
本題に入る前に、regex_replace モディファイアの実装をさらっと見ておきます。モディファイアの処理コードは、/lib/MT/Template/Tags/Filters.pm にある _fltr_regex_replace 関数です。最初に、引数の型を調べて、配列変数以外は受け付けません。次に、配列の一つ目の要素($val->[0])を検索パターンとし、配列の二つ目の要素($val->[1])を置換後パターンとしています。検索パターンについては、グローバル処理フラグは特別扱いで、e オプションはセキュリティの面から無視されます。それ以外のオプションはそのまま渡されるようです。置換後のパターンについては、ちょこっと下ごしらえもされただけで、そのまま s/// に渡されて置換後のパターンとして使われています。
もう少し、寄り道をします。regex_replace モディファイアには検索パターン文字列と置換文字列を配列で指定しますが、MT テンプレートタグでの引数の渡し方による制限があります。これは、/lib/MT//Builder.pm の compile 関数にその処理が記述されており、正規表現式を用いてテンプレートタグ中の引数部分を抽出しています。その正規表現式はかなり複雑ですが、端的に言えば「ダブルクォート文字で始まりダブルクォート文字で閉じられるまで、またはシングルクォート文字で始まりシングルクォート文字で閉じられるまでが一つの引数」ということになります。
一般に C 言語や Perl などの多くのプログラミング言語では、クォーテーションされた文字列中にクォート文字自身が含まれる場合、¥ などのエスケープ文字を用いてクォート文字をエスケープすることができますが、MT の引数処理部分では、そういったことが考慮されていません。ダブルクォート文字で始まり、次にダブルクォート文字を見つけると、エスケープの有無に関わらず、無条件で一つの引数の終わりと認識します。つまり、次のような引数指定は不正になります。
# ダブルクォート文字(")をハイフン文字(-)に置換したい
regex_replace="/"/g","-" → ダメ
# エスケープしてみる
regex_replace="/¥"/g","-" → ダメ
# エスケープが足りなかったか?
regex_replace="/¥¥"/g","-" → やっぱりダメ
この問題は以下のように記述することで回避できます。ダブルクォート文字をパラメータ指定の終端として認識されないようにするため、シングルクォート文字を用いてパラメータを指定する方法です。逆にシングルクォート文字が文字列に含まれる場合は、反対にダブルクォート文字でパラメータを指定すればOKです。
# ダブルクォート文字(")をハイフン文字(-)に置換したい
regex_replace='/"/g',"-"
しかし、この方法にも問題が残っており、パラメータ文字列にシングルクォート文字とダブルクォート文字が混在する場合には、同様の問題が発生します。そこで、以下のような記述方法をおすすめします。
<MTSetVarBlock name="regex0">/["']/g</MTSetVarBlock>
<MTSetVarBlock name="regex1">***</MTSetVarBlock>
<MTUnless regex_replace="$regex0","$regex1">"Tom and Jerry"</MTUnless>
→ ***Tom and Jerry***
検索パターンと置換パターンを一旦、変数に保持し、この変数を regex_replace の引数に渡すようにします。この方法を用いることで以下のようなメリットが考えられます。
- 文字列中にシングルクォート文字とダブルクォート文字が混在していても、regex_replace の指定でそれを意識する必要がない
- 複雑になりがちな正規表現式を分離して記述することで、メンテナンス性が向上する
- 長大な正規表現式になると、テンプレート開始タグだけで冗長になり、後続のテンプレート全体の視認性が悪くなる
- MT テンプレートタグを用いて変数展開などを行った結果を正規表現式に取込める
onagatani
2011年04月20日
北海道からこんにちわ。onagataniです。 さて、MovableTypeでは再構築機能により高アクセスにも耐えられるサイトを簡単に構築できますが、マルチブログ機能を多様する事によりエントリーの投稿の度に多数のインデックステンプレートが再構築されてしまい 投稿が非常に重い処理になってしまう事が度々あります。
ということで、
インデックステンプレートを手動で再構築するのはめんどくさいけど、マルチブログで再構築すると重くなる!という場合に便利なIndexRebuilderプラグインを紹介します。
本プラグインを導入する事により、特定のインデックステンプレートを定期的に再構築する事が可能になります。
TOPページにニュースブログの最新記事一覧を載せる場合などに便利かと思います。
但し、TOPページへの反映は1時間に1度になりますので、急いで更新したい場合などには不向きです。
使い方は各Webサイトやブログのプラグインセッティングにて、再構築したいインデックステンプレートのIDをカンマ区切りで入力するだけです。再構築はrun-periodic-tasksが1時間に1度指定されたテンプレートを再構築してくれます。
ダウンロード
IndexRebuilder0.1
インストール
プラグインディレクトリにコピーしてください。
その他いろいろ
-
MT5で動作確認済みです
-
このプラグインはブログウェアです。無償でご利用頂けますが、感想、要望などをあなたのブログで記事として紹介頂けると幸いです。
-
個人利用または商用利用に関わらず無償でご利用いただけます。
-
無保証ですので、十分にテストしてから運用してください。
-
本プラグインをご利用される方は必ずプラグインご利用の際の注意事項をお読みください。
やまかわ
2011年04月15日
MTのテーマエクスポート機能を使っていて以下のようなエラーに遭遇したことはありませんか?

実はMTのテーマでは、theme.yaml でテンプレートファイルを「module/footer」のように指定すると、テーマの配置ディレクトリ内にもう一階層ディレクトリを設けてその下にテンプレートファイルを配置できるのですが、いざそのテーマを適用したブログからテーマをエクスポートしようとすると失敗する、という制限があります。知らずにこの制限に抵触すると、折角作り込んだテーマがエクスポートできず、がっくり来てしまいます。
これを回避する為に、ちょっとしたプラグインを作りました。このプラグインを利用すると、「module/footer」のような階層付きのテーマを適用したブログ/ウェブサイトからもテーマのエクスポートが可能になります。
プラグインのダウンロード
FixThemeExport-1.0.zip
プラグインのインストール
pluginsディレクトリにFixThemeExportディレクトリをアップロードしてください。
プラグインの使い方
このプラグインが有効な場合、エクスポートが出来ないテーマが適用されているブログ/ウェブサイトで「テーマのエクスポート」画面を開くと「テーマのエクスポート」ボタンの代わりに「エクスポート用にテーマを修正」ボタンが表示されます。

このボタンを押すと、正しくテーマがエクスポートできるようにそのブログ/ウェブサイトのテンプレートデータが更新されますので、あとは通常通りテーマをエクスポートしてください。
注意事項
-
MTの制限によりエクスポート時にテーマにディレクトリ階層を持たせられないため、「module/footer.mtml」ならば「module-footer.mtml」という名前にリネームしてエクスポートしています。
-
このプラグインはブログウェアです。どなたでも無償でご利用頂けますが、感想、要望などをあなたのブログで記事として紹介頂けると幸いです。
-
本プラグインをご利用される方は必ず「プラグインご利用の際の注意事項」をお読みください
やまかわ
2011年03月24日
先日3/19に札幌で開催いたしましたMovableType勉強会で、アプリ開発のイントロとJavaScript SDKのデモを行いました。当日の資料をご紹介いたします。
JavaScript SDKのデモで使ったソースについては、http://www12137u.sakura.ne.jp/demo/login.htmlをブラウザで表示し、そのHTMLソースを表示すると見る事ができます。興味がある方はご覧下さい。
FacebookのAPIは基本的にWeb上からしか使えないのですが、一方でAPIで利用するAPIキー等の情報が漏れてもOAuthの仕組み上登録したURLからしか使えないようになっています。この辺りは安心できますね。
# ところでTwitterクライアントのOAuthはどうなってるのかなあ、と思ったのですがxAuthというのでOAuthのアクセストークンを得る形になるそうです。