MovableTypeの最近のブログ記事

先ほどエントリしたMovableTypeからTwitterに投稿するPostToTwitterというプラグイン。Windows Live Writerからの投稿でうまくいかなかったのでよくよく調べたら新しいバージョンが出ていた。

http://labs.m-logic.jp/2009/06/movabletypeposttotwitter_v120.html

いくつかオプションが追加されているし、ectoというツールからの投稿がうんたらかんたらと書いてるのできっとWindows Live Writerからでも投稿できるようになったのだろうということでもう一度チャレンジ。

めっきりTwitterが面白くなってきたのでPostToTwitterというMovableTypeのプラグインを入れてみた。

http://labs.m-logic.jp/2007/04/movabletypeposttotwitter_v100.html

これだと、前に書いたTwitterfeedと違ってタイムラグなくTwitterに最新情報をポストできる。

設置も簡単。プラグインをダウンロードして展開し、サーバーにアップロードするだけ。設定もTwitterのアカウントとパスワードを設定するだけ。

というわけでこれが初ポスト。どうかな?

しばらくやってなかったMTのアップデート。ちょっと別のブログを立ち上げようかなと思ったのでついでにやってみた。

いつものようにバックアップとってFTPしてパーミッション変えてプラグインと設定を上書きして完了。

DBの変換なんかも無事終わり問題なし。。。。

と思ったらなぜかこのブログのスタイルがぐちゃぐちゃ。何もしてなかったと思ったのに。。。。最初は今日アップデートしたFirefoxのせいかと思ったら、他のブラウザでも全部だめ。StyleCatcherで新しくスタイル設定しなおしてもう一度再構築したらうまくいった。何でだろう。。。ちなみに、もう一つのブログや嫁のやつは問題ないのに。。。orz

というわけで久々に最新版になりました。これをWindows Live Writerから投稿してOKなら作業終了。^^

mixiSyncForMT4でmixiとブログを共通化してみてしばらくたつが、以外に面倒。なぜならmixiはイメージに対するリンクに制限があったりいろいろするから。

なので、本家ブログにリンクを張りたいのだが、デフォルトだとブログの中身しかコピーしてくれない。で、ちょっと調べてたらコピーするテンプレートをカスタマイズできるというのでやってみた。

やり方は詳しくはこちら。http://proglab.homelinux.net/software/mixiSyncForMT4/

「mixiSyncForMT4 Entry Template」というのをテンプレートモジュールで作成し、テンプレートを書くだけ。下のような感じ。

20080826214030

これでOK。

で、私はいつも追記とか書かないので、ブログの本体を文字数で切れないものかと考えた。JavaScriptなら、ここで「"<Body>".substring(0,100)」みたいな感じでできないかと。でも甘かった。「<Body>」の置換はJavaScriptの中でやっていた。。。。

で、プラグインのコードを読んでみた。200行目近くで、次のようなコードで置換してた。

(e = E('editor-input-content')) && (val = val.replace (/<\\\$?Body\\\$?>/ig, e.value));

なのでここを、

(e = E('editor-input-content')) && (val = val.replace (/<\\\$?Body\\\$?>/ig, e.value.substring(0,100)));

としてみた。見事カットすることに成功。

が、冷静に考えてみた。

どうせmixiの画面でボタン押さなきゃいけないし、カットしたい場所は記事によって違ったりするし、じゃあブログへのリンクだけはいってりゃあとは手で消した方がいいんじゃない?というわけで元に戻した。

嗚呼。

ちなみに、上の置換のところ、ちょっと効率悪げな気がする。ループの外でE()呼んだ方がいいんじゃない?って思ったけど、ループもほとんど回らないしまぁいいのか。

でも、なんとなくこのプラグインは分かった。これ、実はレビューとか対応することもできるんじゃない?時間があるとき試してみよう。

最近どうもブログの調子が悪い。Windows Live Writerからタイムアウトしたり、Movable Typeのダッシュボードが開けなかったり。。。借りてるStepServerが悪いのか、Movable Typeに来てるトラックバックスパムが問題なのか何が問題かよくわからない。なので、4.21も出て再構築とか早くなったらしいのでアップデートしてみた。

いきなりエラー出たけど、アップロードしなおしたり、ブラウザのキャッシュクリア(効果あったのか?)したりしたら一応問題なくアップデートできたっぽい。

Windows Live Writer で投稿すると9時間ずれる件について(ファイナル!)」で修正した時間がずれる不具合も修正されてますね。

これで状況が改善されるといいんだけど。

以前からmixiでは外部ブログとしてこのブログを登録してたけど、やっぱり外部ブログにしてるってのはmixiからだと「外部のURLですなんちゃらかんちゃら」と出て、自分が見てもちょっと嫌な感じはする。

ってので、ちょっと検索したらmixiSyncっていうMTのプラグインがあることを知った。もともとはVersion3系なんだけど、それを4用に修正した人がいて、さらに4.1用にパッチを作った人がここに。

http://www.sfc.wide.ad.jp/~irino/blog/2008/02/mixisync-for-mt441.php

さっそく入れてみたけど結構簡単。pluginフォルダにコピーして、mixiのIDを設定するとこんな感じでボタンが出てくるようになる。

20080721203553 

で、記事を書いてこのボタンをクリックすると、mixiの日記登録画面がブラウザで表示されて、MTの記事の内容がコピーされるので、そこで必要な修正して登録するとmixiの日記が書けるってわけだ。

こうすると、mixiの日記とブログと同じ記事が簡単に書ける。写真とかたくさん貼ってるのはURL書いておけばいいし、mixiだけ、ブログだけに書きたい場合も簡単。結構融通が利いていいかも。

あと、ブログにくらべるとmixiの日記だとコメント書きやすいしね。

ってことで、こんな感じでしばらくはmixiとブログ両方書いていきますです。改めてよろしく。

Windows Live Writer で Movable Type に投稿すると時刻がずれるらしい
Windows Live Writerで時間が9時間ずれる件について(続編)
Windows Live Writerで時間が9時間ずれる件について(続々編)
Windows Live Writerで投稿すると9時間ずれる件について(恥編)

とお送りしてきたMovable Typeと格闘シリーズ。紆余曲折ありましたが、とうとう原因を突き止めました。もうこうなったらプロの意地というか、原因突き止めるまでは諦めへんで!って感じで、ここんとこ、夜も朝もMovable Typeのスクリプトと格闘。結局、最初はWindows Live Writerをかなり疑ってたけど、Movable Typeが悪かったっつーことで。

で、原因はココ。addons/Commercial.pack/lib/CustomFields/XMLRPCServer.pmの中、15行目。

sub APIPostSave_entry {
    my $plugin = shift;
    my ($cb, $mt, $entry, $original) = @_;

ここをコメントアウトするだけ。こんな感じ。

sub APIPostSave_entry {
#    my $plugin = shift;
    my ($cb, $mt, $entry, $original) = @_;

結局、ここ、コールバック関数になってるようなんですが、引数をshiftしてしまってなんだかよくわからなくしてるんです。実体としては、その下の行に渡ってくるものだけなので、shiftが余計。$pluginも使ってないし、どこかからコピペしてきたのだろうか。。。これが原因で、下の方で$entryをsaveするんだけど、実体としては$originalをsaveしてしまって、そこにはblog_idがついてなくて、ブログの時差設定を読み込めずにmt-congif.cgiのTimeOffsetを使っていたというわけ。TimeOffsetを設定すればうまくいくってのも間違ってはなかったわけだが、根本原因はこちらでした。ちなみに、これはMT4.1のお話。他のバージョンではわかりません。

ちなみに、これ、Commercial.packってのに入ってるんですが、MTOSの4.2には入ってませんでした。なので起きなかった。あと、MySQLを使った場合は、今回のように投稿時にいきなりずれるのですが、SQLiteを使った場合には、投稿時はOKで、次を投稿すると前のが9時間ずれるなんてことになってました。これもよくわからないですが、上の修正で直りました。DBによって何か動作が違うんでしょうか。

再現条件をまとめるとこんな感じになるのかな。

  • MT4.1(or それに近いバージョンで)
  • Commercial.packのCustomFieldsが入っていて
  • XMLRPCのAPI、つまりWindows Live Writerなどを使っている

場合に、時間がずれることがある。対策は上の通り、1行コメントアウトするだけ。もしくはTimeOffsetを指定。

ちなみに、ダブル投稿で解決してた理由はよくわからないし、調べる気もないです。^^;

あー、今日はゆっくり眠れる。

と、この投稿がうまくいけばだけど。^^

(追記) やったぜ!成功!

あー、今朝はボーっとしてたみたい。

MovableTypeのバグみたいに書いたけど、ぜんぜん違うじゃん。。Perl忘れすぎ。

sub offset_time_list { gmtime offset_time(@_) }

って書き方、別にgmtimeをoffset_timeに渡すってだけかな。offset_timeにgmtimeと@_を渡すわけじゃないんじゃん。なんかかなり勘違いしてた模様。

で、WindowsにApacheとPerlとMT入れてみてみたけど、ちゃんとしてるね。。

しかも、なんとこの環境だとずれない。。。。まったくずれない。。。。

DBD::mysqlがうまく入んなくてSQLiteにしたせい?それともMTがMTOS4.2のベータなせい?ますますわからん。。。。むぅぅぅぅ

とりあえず4.2の正式版が出るまで待つしかなかろう。。。。さすがに今アップデートはやだ。

(追記) 解決編はこちらへ。

どうも昨日書いたTimeOffsetの件が気になって朝からまたいろいろ調べてみたらバグらしきものを見つけた。Util.pmのiso2tsって関数でoffset_time_listって関数を呼んでるんだけど引数が違う。。。。実は、offset_timeってのがあって、こちらは時刻とブログのIDと時差補正の方向をもらってるんだけど、offset_time_listは時刻は自分で補完してoffset_timeに渡してる。。つまり、時刻データが2重に渡されてるようだ。ガックリ。時刻が二つ渡されれば、当然一つずつ引数がずれてくるわけで、すると下のMT::Blog->loadが失敗して、$offsetは0になる。。。はず。

....

## Now apply the offset for this weblog.
($s, $m, $h, $d, $mo, $y) = offset_time_list($time, $blog);

....

sub offset_time_list { gmtime offset_time(@_) }

sub offset_time {
    my($ts, $blog, $dir) = @_;
    my $offset;
    if (defined $blog) {
        if (!ref($blog)) {
            require MT::Blog;
            $blog = MT::Blog->load($blog);
        }
        $offset = $blog && $blog->server_offset ? $blog->server_offset : 0;
    } else {
        $offset = MT->config->TimeOffset;
    }
    $offset += 1 if (localtime $ts)[8];
    $offset *= -1 if $dir && $dir eq '-';
    $ts += $offset * 3600;
    $ts;
}

で、この呼び出しのところの関数名をoffset_time_listからoffset_timeに変えてみた。が、しかし状況変わらず。。。ソースをgrepしてみると、同じように時刻データをoffset_time_listに渡してるところがたくさんある。。。ここだけじゃないのね。

というわけで、一度ローカルに環境を作って試してみないといまいち確信が持てないし、修正量が多すぎるのでひとまずTimeOffsetでの回避策に戻す。4.2で直ってないのかな?今日の夜にでも試してみよう。

(追記) 解決編はこちらへ。

以前、「Windows Live Writer で Movable Type に投稿すると時刻がずれるらしい」ってんでエントリを書いたら、少数ながら同じ悩みを抱えている方々がいるようでして。。。んで、結局解決策は見つからないようなので、もう少しじっくり調べてみた。

まずは新しくテスト用にブログを作って。。。とやってみると、いつものダブル投稿の技が効かない!なんで???仕方ないのでMySQLに入ってるデータを見てみるものの、新しく作ったブログと以前からのブログでは別段変わりはない。。。元のブログはバージョン3から使い続けてるデータだからか?移行時に何か変わったのだろうか。にしても、新しく作ったブログの方が痛々しい結果である。

で、プロキシ使ってやり取りしてる内容を見てみるも、中身のPerlもいろいろ見てみるも、どうにもこうにもPerlは久し振りなのでよくわからん。。ただ、XMLRPCServerってファイルでぐにょぐにょしているようだけど、サーバーから帰ってきてる時刻に「Z」がついてない。。。おそらくこれが怪しい。。。UTCなら「Z」がつくはず。

で、怪しいあたりでごにょごにょPerlをいじってみるも、まったく見当違いなのか、値を変えることもできない様子。

で、さらにIgnoreISOTimezonesなんて環境設定の値を参照してるので、設定してみたりしても効果はなし。まぁ、効果はないはずなんだけど。

で、さらにさらにMTの環境変数をいろいろ見てたらTimeOffsetというのが。ダメもとで+9を設定してみると、なんと成功!とりあえずテストブログでは1発で正しい時刻に。MTのインターフェースからも問題なし。日本時刻でしかもちろん書かないのでとりあえずこのまま様子を見てみることにする。

いろいろやってみたものの、結局mt-config.cgiに次の1行を追加するだけ。

TimeOffset +9

さてさて、このエントリははたして正しい時刻で投稿されるのか?

(追記) 時刻はバッチリ!

(追記) 解決編はこちらへ。