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 してやれば解決します。

投稿者 ぴろり上西 : 05/13

regex_replaceを安全簡潔に書く小技

ぴろり上西 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.pmcompile 関数にその処理が記述されており、正規表現式を用いてテンプレートタグ中の引数部分を抽出しています。その正規表現式はかなり複雑ですが、端的に言えば「ダブルクォート文字で始まりダブルクォート文字で閉じられるまで、またはシングルクォート文字で始まりシングルクォート文字で閉じられるまでが一つの引数」ということになります。
 一般に 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 テンプレートタグを用いて変数展開などを行った結果を正規表現式に取込める
投稿者 ぴろり上西 : 04/22

定期的にインデックステンプレートを再構築するMovableTypeプラグイン:IndexRebuilder

onagatani 2011年04月20日

北海道からこんにちわ。onagataniです。 さて、MovableTypeでは再構築機能により高アクセスにも耐えられるサイトを簡単に構築できますが、マルチブログ機能を多様する事によりエントリーの投稿の度に多数のインデックステンプレートが再構築されてしまい 投稿が非常に重い処理になってしまう事が度々あります。

ということで、
インデックステンプレートを手動で再構築するのはめんどくさいけど、マルチブログで再構築すると重くなる!という場合に便利なIndexRebuilderプラグインを紹介します。

本プラグインを導入する事により、特定のインデックステンプレートを定期的に再構築する事が可能になります。
TOPページにニュースブログの最新記事一覧を載せる場合などに便利かと思います。
但し、TOPページへの反映は1時間に1度になりますので、急いで更新したい場合などには不向きです。

使い方は各Webサイトやブログのプラグインセッティングにて、再構築したいインデックステンプレートのIDをカンマ区切りで入力するだけです。再構築はrun-periodic-tasksが1時間に1度指定されたテンプレートを再構築してくれます。

ダウンロード

IndexRebuilder0.1

インストール

プラグインディレクトリにコピーしてください。

その他いろいろ

  • MT5で動作確認済みです
  • このプラグインはブログウェアです。無償でご利用頂けますが、感想、要望などをあなたのブログで記事として紹介頂けると幸いです。
  • 個人利用または商用利用に関わらず無償でご利用いただけます。
  • 無保証ですので、十分にテストしてから運用してください。
  • 本プラグインをご利用される方は必ずプラグインご利用の際の注意事項をお読みください。
投稿者 onagatani : 04/20

テーマのエクスポートができないときのプラグイン:FixThemeExport

logo2.gif やまかわ 2011年04月15日

MTのテーマエクスポート機能を使っていて以下のようなエラーに遭遇したことはありませんか?

theme_error.png


実はMTのテーマでは、theme.yaml でテンプレートファイルを「module/footer」のように指定すると、テーマの配置ディレクトリ内にもう一階層ディレクトリを設けてその下にテンプレートファイルを配置できるのですが、いざそのテーマを適用したブログからテーマをエクスポートしようとすると失敗する、という制限があります。知らずにこの制限に抵触すると、折角作り込んだテーマがエクスポートできず、がっくり来てしまいます。

これを回避する為に、ちょっとしたプラグインを作りました。このプラグインを利用すると、「module/footer」のような階層付きのテーマを適用したブログ/ウェブサイトからもテーマのエクスポートが可能になります。

プラグインのダウンロード

FixThemeExport-1.0.zip

プラグインのインストール

pluginsディレクトリにFixThemeExportディレクトリをアップロードしてください。

プラグインの使い方

このプラグインが有効な場合、エクスポートが出来ないテーマが適用されているブログ/ウェブサイトで「テーマのエクスポート」画面を開くと「テーマのエクスポート」ボタンの代わりに「エクスポート用にテーマを修正」ボタンが表示されます。

 

fix_theme.png

このボタンを押すと、正しくテーマがエクスポートできるようにそのブログ/ウェブサイトのテンプレートデータが更新されますので、あとは通常通りテーマをエクスポートしてください。

 注意事項

  • MTの制限によりエクスポート時にテーマにディレクトリ階層を持たせられないため、「module/footer.mtml」ならば「module-footer.mtml」という名前にリネームしてエクスポートしています。
  • このプラグインはブログウェアです。どなたでも無償でご利用頂けますが、感想、要望などをあなたのブログで記事として紹介頂けると幸いです。
  • 本プラグインをご利用される方は必ず「プラグインご利用の際の注意事項」をお読みください
投稿者 やまかわ : 04/15

Facebook Apps 開発入門 + JavaScript SDK API デモ

logo2.gif やまかわ 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のアクセストークンを得る形になるそうです。

投稿者 やまかわ : 03/24
お問い合わせはこちらから お電話でのお問い合わせ03-5475-5101

MTエンジニアブログ

MTCMS Smartキャンペーン!
承認フロー付きCMS「MTCMS Smart(98,000円)」をお買い上げの方、MTライセンス1本がタダに!

配布プラグイン一覧

MultiFileUploader
複数ファイルを一括でアップロードできるMovable Typeプラグイン
ParentalInclude
MT5でウェブサイトとブログのテンプレート連携を便利にするプラグイン
DuplicateEntry
ブログ記事を複製または移動するMovableTypeプラグイン
NotifyAnythingChanged
何かが起きたらメールで通知するMovableTypeプラグイン
rssEntry
取込んだRSSをエントリとして書き出すMovableTypeプラグイン
AutoTagging
面倒な記事のタグ付けを自動化する
FutureRebuild
日時を指定してページを再構築する
EntryImExporter
エントリをCSVに書出したり、CSVから一括登録するMovableTypeプラグイン
MailPack
Movable Typeで簡単携帯投稿!メール投稿プラグイン
DirectoryUtility
カテゴリ・フォルダの階層を表示したり、親フォルダを表示したり、何かと便利なプラグイン
CSVList
CSVデータを整形して表示する
PageBute
静的ページ用ページ分割プラグイン

注目記事

RSS

ページの先頭へ戻る