ラベル Weblog の投稿を表示しています。 すべての投稿を表示
ラベル Weblog の投稿を表示しています。 すべての投稿を表示

2006年9月30日土曜日

MT3.3でBerkeley DBからPostgreSQLへの移行する際の注意点

MTのエントリが多くなりすぎて、再構築ができなくなったと友達から連絡をもらい、確認したところ、DBにBerkeleyDBを使っていたので、それを改善すべくDBをBerkeleyDBからPostgreSQLに移行してみました。
その際、MTのマニュアルにしたがってやってみたところ、そのままではうまくいかなかったので、行った作業をメモ的に残しておきます。

* PostgreSQLの設定

まず、マニュアルをみてPostgreSQLの設定をしました。

基本マニュアルどおりに進めて、mt-config.cgiの設定を変更し、
データベースの作成をおこないました。
DBの文字コードはUTF-8だったので、DB作成の際、文字コードを指定しました。
>

createdb -E UNICODE --owner xxxxx
<

* 移行スクリプトを実行

次にマニュアルどおりMT付属の移行スクリプトを実行したところ、DBの文字コードと違う文字コードのデータを入れようとした旨のエラーメッセージが出て、移行スクリプトを完了できませんでした。
文字コードの違うデータというのは、トラックバックPingのデータで、トラックバック元のブログの文字コードがUTF-8ではないものがエラーではじかれているようでした。
これは、文字コードが違うPingを探し出して削除するのは面倒くさかったので、移行スクリプトのほうを修正して、インサートに失敗しても処理を続行するようにして、回避しました。
修正点は以下のとおり。saveに失敗してもdieしないようにしただけです。MTの方で、DBへのアクセスが高度に抽象化されているので、修正は非常に簡単です。
>

--- ./mt-db2sql.cgi.org Sat Sep 30 00:54:15 2006
+++ ./mt-db2sql.cgi Sat Sep 9 20:09:45 2006
@@ -141,8 +141,8 @@
$obj->allow_comments(0)
if defined $obj->allow_comments && $obj->allow_comments eq '';
}
- $obj->save
- or die $obj->errstr;
+ $obj->save;
+ # or die $obj->errstr;
}

# fix up the category parents
<

この修正版のスクリプトを再度実行したところ、今度は問題なく、データの移行が完了しました。

* シーケンスの作成、更新

これで万事OKかと思ったんですが、この状態でエントリを作成しようとすると、以下のようなエラーがでて、作成できなくなってしまいました。

>

Saving entry failed: ERROR: ExecInsert: Fail to add null value in not null attribute entry_id
<

このエラーでググッてみると、どうやらDB内にシーケンスがないためのようです。
先ほどの移行用スクリプトだと、テーブルは作成されてもシーケンスは作成してくれないみたいです。
そうとわかれば、後はシーケンスを手動で作成するだけです。
以下のSQLを実行し、シーケンスを作成し、格納されている値を現在の最大値にセットしたところ、問題なく動くようになりました。

>

CREATE SEQUENCE mt_author_id;
CREATE SEQUENCE mt_blog_id;
CREATE SEQUENCE mt_category_id;
CREATE SEQUENCE mt_comment_id;
CREATE SEQUENCE mt_config_id;
CREATE SEQUENCE mt_entry_id;
CREATE SEQUENCE mt_fileinfo_id;
CREATE SEQUENCE mt_ipbanlist_id;
CREATE SEQUENCE mt_log_id;
CREATE SEQUENCE mt_notification_id;
CREATE SEQUENCE mt_objecttag_id;
CREATE SEQUENCE mt_permission_id;
CREATE SEQUENCE mt_placement_id;
CREATE SEQUENCE mt_plugindata_id;
CREATE SEQUENCE mt_tag_id;
CREATE SEQUENCE mt_tbping_id;
CREATE SEQUENCE mt_template_id;
CREATE SEQUENCE mt_templatemap_id;
CREATE SEQUENCE mt_trackback_id;

select setval('mt_author_id',(select max(author_id) from mt_author));
select setval('mt_blog_id',(select max(blog_id) from mt_blog));
select setval('mt_category_id',(select max(category_id) from mt_category));
select setval('mt_comment_id',(select max(comment_id) from mt_comment));
select setval('mt_config_id',(select max(config_id) from mt_config));
select setval('mt_entry_id',(select max(entry_id) from mt_entry));
select setval('mt_fileinfo_id',(select max(fileinfo_id) from mt_fileinfo));
select setval('mt_ipbanlist_id',(select max(ipbanlist_id) from mt_ipbanlist));
select setval('mt_log_id',(select max(log_id) from mt_log));
select setval('mt_notification_id',(select max(notification_id) from mt_notification));
select setval('mt_objecttag_id',(select max(objecttag_id) from mt_objecttag));
select setval('mt_permission_id',(select max(permission_id) from mt_permission));
select setval('mt_placement_id',(select max(placement_id) from mt_placement));
select setval('mt_plugindata_id',(select max(plugindata_id) from mt_plugindata));
select setval('mt_tag_id',(select max(tag_id) from mt_tag));
select setval('mt_tbping_id',(select max(tbping_id) from mt_tbping));
select setval('mt_template_id',(select max(template_id) from mt_template));
select setval('mt_templatemap_id',(select max(templatemap_id) from mt_templatemap));
select setval('mt_trackback_id',(select max(trackback_id) from mt_trackback));
<

以上BerkeleyDBからPostgreSQLへの移行の際の注意点をまとめると、

- 文字コードの問題でエラーがでるため、移行スクリプトを修正して、エラーを無視するようにする。
- シーケンスは作成されないので手動で作成する。

の2つを注意しないといけないようです。

2005年10月3日月曜日

MT3.2をapacheのハンドラとして動かす

MT3.2のユーザーインターフェースが秀逸だと聞いて、どうしても見たくなり、hori-uchi.comのMTを3.2へバージョンアップしてみました。


すると、数回アクセスすると、502 Proxy Errorが出るように。。

hori-uchi.comはフロントにApache2.0を置きここでhtmlなどの静的なコンテンツを処理し、バックエンドのapache1.3+mod_perlでApache::Registryを使ったCGIのエミュレート環境でMovableTypeを動かしています。
バックエンドへのリクエストの受け渡しはmod_proxyを使って行っています。

この構成の構築方法は
Techknow Movable Type: Apache 2.0 mod_proxy によるリバース・プロキシの構築
に詳しく解説されています。


502のエラーが出たときのapacheのログを見ると、バックエンドは正常にレスポンスを返していますが、それを受け取るフロントがおかしなレスポンスだと判断し、502をクライアントに返しているようです。


そこで「MT3.2 mod_perl」でググってみると次のようなエントリが見つかりました。

Movable Type 3.2 User Manual: Running Movable Type With mod_perl

MT3.2のマニュアルの一部です。
内容はMT3.2をmod_perlで動かして高速化ってな話ですが、MTをapacheのハンドラとして動かしてより高速化するという内容まで書いてあります。
apacheのハンドラとして動かせばApache::Registryを使ったCGIのエミュレート環境より高速に動きますし、これで502のエラーもなくなるかもと思い、早速実践。


上記エントリの内容をそのまま実践しました。ただ一点、mt.cfgのCGIPathは
http://my.server.com/mt/でなく、http://my.server.com/mt/appにする必要がありました。

訂正:上記マニュアルの内容に加えて、mt.cfgに
>

AdminScript app
<
の一行を追加する必要がありました。


設定を完了し、apacheを再起動すると、MTの動作が高速なったうえ、502のProxyErrorもでなくなりました。めでたしめでたし。

でもなんでProxyErrorが出たのか納得のいく答えがわからず、ちょっと消化不良ぎみ。。

2005年9月30日金曜日

Movable Type 3.2 日本語版の提供を開始

Movable Type 3.2 日本語版がリリースされたみたいですね。
落ち着いたら移行しよっと。

via: Six Apart - MovableType News: Movable Type 3.2 日本語版の提供を開始

2005年9月15日木曜日

Google Blog Search 突然リリース

Googleのブログ検索が突然リリースされたようです。

Google Blog Search

ブログ検索もGoogleがすべて持っていってしまうのか、今後に注目です。



2005年7月20日水曜日

livedoorBlogのAtomAPIが仕様変更

livedoor Blog 開発日誌:リニューアルに伴うランキングの変更、使用できる機能について - livedoor Blog(ブログ)

livedoorBlogのリニューアルに伴い、AtomAPIの仕様も変更されるようです。

>
Atom APIのURLがリニューアルに伴い変更となります。
http://cms.blog.livedoor.com/atom
Atom APIを利用したペットなどのアプリケーションをご利用の場合は上記のURLに変更いただけますようお願いいたします。なお、このAPIのサービスにつきましてはlivedoor Blogとして正式にサポートしておりませんのでお問い合わせ等につきましてはご遠慮いただけますようお願いいたします。
<

エンドポイントが変わるだけなのかなー。






2005年6月15日水曜日

Dreamweaver 拡張機能 for Movable Type 3

Six Apart Japan: マクロメディアとシックス・アパート、Dreamweaver拡張機能 for Movable Type 3を発表

MTのテンプレートカスタマイズが効率的に!タグリファレンスは便利そう。



2005年6月3日金曜日

Enclosure == 入れ物 - Bloglinesの日本語訳

ちょっと前にBloglinesがPodcastに対応して、Enclosureへのリンクが記事の下の方につくようになったんですが、その部分の日本語訳がちょっと変な気がします。「入れ物」って。。もう少しいい訳ないんだろうか。「添付ファイル」とかだとだれでもわかるような気がするけど。。


2005年5月31日火曜日

Technorati Japan ベータリリース

テクノラティ

Technorati Japanのベータがリリースされたようです。



2005年5月29日日曜日

Blog Hackers Conference 2005

Blog Hackers Conference 2005に行ってきました。
先端で活躍している人の話はやっぱりおもしろいし、刺激になります。

今回の話で僕が気になったことをまとめてみます。

*Blogのプラットフォーム化

naoyaさん曰く、ブログは終焉に向かっているのではなく、プラットフォーム化してきたのだということ。ブログの終焉の終焉。ブログがプラットフォーム化してきたことはブログありきのサービスがたくさん出てきていることからもわかります。ブログがプラットフォーム化して、ブログを中心としたサービスがAPIを使って結びついていく。Webはおもしろいですねー。

*RastやSennaといった組込型検索エンジン

yappoさんのプレゼンで出てきた組込型検索エンジンの話。namazuのような独立したアプリケーションではなく、他のアプリに組み込むこと前提に作られています。MySQLによる日本語フルテキストサーチやあいまい検索できるものもあるそうです。あいまい検索を実装中で、PerlAPIもあって、利用が簡単そうなsennaを試してみようかなー。

*memcached

某ブログサービスで使われている。メモリ上にデータやオブジェクトをキャッシュしパフォーマンスを向上させることができる。レプリケーションもできる。PerlAPIも公開されているのでPerlで利用するのが簡単。
これとは別の話で、某商用DBMSよりMySQLの方がパフォーマンスいいとか、興味深い話が聞けました。個人的にはこういう大きなサービスをやるとき画像とか大きなサイズのファイルをどうやって扱っているのかが知りたいです。DBにぶちこむとするとすぐテーブルがでかくなって破綻しちゃうだろうし、ファイルに書き出しておくとすると、拡張性に乏しいし。。画像保存用サーバを用意してそこにためていくのかなー。

*タギング、Folksonomy

Flickrやdel.isio.us、はてなブックマークなんかに使われている。タギング、Folksonomyは個人的に興味がある概念。

*隣にJcodeのDanさん

少し遅れて入ってきたDanさんが僕の隣の席に。いやー、びっくりしました。
さらに前の席には小山さん。




2005年5月17日火曜日

RSSを動的に生成してみた

運営をお手伝いしている鳥海先生のブログ「伯萃庵」の今日の運勢にRSSを配信する機能を追加してみました。サイトの右上に設置されている今日の運勢から取得できる結果ページにRSSがついてます。http://www.toriumihakusui.com/app/daily/rss2?p=197807122 のように生年月日をパラメータとして受け取り、動的にRSSをはき出すタイプで、その日の運勢とラッキーブック、ラッキーDVDなんかを配信しています。リンク先はamazonだったりして、若干アサマシぃことしてます(汗

ところで、今まで、MTのテンプレートを編集してAtomフィードをはき出すよう改造したりとかはやったことありましたが、自分で一からフィードを作ったのはこれが、初めてだったりします。RSSなんて、テンプレート用意してパラメータ埋め込めばOKでしょなんて簡単に考えてましたが、実際に作ってみると、XMLの中に何をセットすればいいかを悩んでしまうような要素があったり、Last-Modifiedヘッダーを吐くのを忘れていて、アグリゲータにデータを持っていってもらえなかったりと意外と手こずりました。
やっぱり、実際手を動かしてみるのが一番勉強になりますね。



2005年3月22日火曜日

mt-ban-nonja-tbping.pl - 日本語を含まないTrackbackPingをはじく

最近トラックバックスパムが頻繁に送られてくるようになりました。最初は手で消していたんですが、スパムの量が一向に減らないので、対策として、日本語を含まないTrackbackPingをはじくようなプラグインを書いて見ました。

mt-ban-nonja-tbping.pl

mt-ban-nonja-com.plと同様に、ひらがなもしくはカタカナの連続する回数と出現箇所をグローバル変数$CharRep、$NofMatchで設定できます。デフォルトは3文字連続する部分が1カ所以上あればOKとなっています。
trackback pingを受け取るとこの設定に従ってexcerptの中身をチェックし、条件をクリアできなければはじきます。

mt-ban-nonja-com.pl - コメントスパム対策プラグイン

以前のエントリーでコメントスパム対策として「コメントにひらがながM回連続している部分がN箇所以上ない場合スパムとみなして、はじく」ということをやりましたが、これをMTプラグイン化してみました。

mt-ban-nonja-com.pl

前回からの変更点として、以前のエントリーではひらがなのみの連続としていたところを、ひらがなもしくはカタカナの連続としています。

上記プラグインをmtのプラグインディレクトリに放り込んでやれば動くと思います。ひらがなの連続する回数と出現箇所はプラグイン内にかかれているグローバル変数$CharRep、$NofMatchで設定できます。デフォルトは3文字連続する部分が1カ所以上あればOKとなっています。
また、$Method = "moderate"; でモデレート、"deny" で投稿を拒否します。このあたりの実装はmiyagawaさんのMTBanASCIIを参考にさせて頂きました。





2005年3月8日火曜日

MovableType with PostgreSQLのインストールでの注意点

MovableTypeのインストールでストレージにPostgreSQLを選択した場合、ある条件でmt-load.cgi実行時に以下のエラーがでました。
>

Insertion test failed on SQL error ERROR: value too long for type character varying(50)
<
上記エラーが発生した条件は以下のとおりです。
-MovableType - 3.151
-PostgreSQL - 7.3.5
-サイトの文字コードはUTF-8
-DBの文字コードがSQL_ASCII

エラーを回避するにはDBの文字コードをUNICODE(サイトの文字コードがEUCの場合はEUC_JP)で作り直せばOKです。
>

createdb -E UNICODE mt_database_name
<

作成したデータベースの文字コードは以下のコマンドで確認できます。
>

psql -l
<

PostgreSQLのVARCHAR型はバイト数でなく文字数で指定できるのでデータベースの文字コードをUNICODEにした場合はバイト数は50バイトを超えていても文字列として50文字以内であればインサートできるようです。








2005年1月26日水曜日

Movable Typeに脆弱性

Movable Type 日本語版サイト: 【重要】 Movable Typeの脆弱性と対策についてによると、現在出荷済みのMovable Typeすべてにスパムメールの送信を幇助してしまう脆弱性が発見されたそうです。
同エントリーに回避策も載っています。対処方法は簡単で、パッチファイルをふつうのMTプラグインと同様pluginディレクトリにおくだけなので、早めに導入しておいたほうがよさそうです。





2005年1月25日火曜日

nofollow pluginを導入

最近Blog業界でホットな話題「rel="nofollow"」ですが、MTユーザーはプラグインを使えば簡単にnofollowに対応できるということで早速導入してみました。

Movable Type Publishing Platform: Movable Type 'nofollow' plugin

ここからダウンロードできます。
導入は簡単で、tarかzipを解凍して出てきたファイルをpuluginディレクトリに放り込むだけです。
これでコメント内のリンクの属性に「rel="nofollow"」がつくようになります。

rel="nofollow"がついているリンクはGoogle,Yahooでページランクの計算対象としないことになったので、コメント内に書かれたリンクに対して、この属性を付加するようにすれば、スパマーにとって、nofollow対応済みのサイトに対するコメントは意味のないものになります。
スパマーはコメント内に自分のサイトへのリンクを書くことで、自分のサイトのページランクを上げて検索結果の上位に表示させようと考えているからです。

このようにnofollowに対応してもすぐにコメントスパムが送りつけらなくなるというものではありませんが、長い目で見るとかなり革命的なスパム対策だと思います。






2005年1月21日金曜日

個別アーカイブの再構築でエラー

突然、個別アーカイブの再構築を行うとこんなエラーがでて再構築に失敗するようになってしまいました。

>

Reading from filehandle failed at /usr/local/www/mt/lib/MT/FileMgr/Local.pm line 128.
<

該当のLocal.pmをのぞくとDigest::MD5のaddfileメソッドでこけているみたいです。

>

124 my $fh = gensym();
125 open $fh, $file or return 1;
126 if (eval { require Digest::MD5; 1 }) {
127 my $ctx = Digest::MD5->new;
128 $ctx->addfile($fh);
129 close $fh;
<

そこで開けないファイルの中身をみようとしたんですが、

>

$ cat 000224.html
cat: 000224.html: Input/output error
<

。。。
う~ん、原因はわかりませんが、ファイルが壊れてしまっていたみたいです。壊れたファイルを削除して再構築をかけたら、今度は問題なく完了しました。めでたしめでたし。



2005年1月4日火曜日

MT3.x+mod_perl環境でMTプラグインのロードに失敗するとエラーになる

結構前からなぜかmod_perl環境でMTが動かなくなってしまっていて、しょうがなくCGI環境で動かしていたんですが、どうにも遅くてやりきれないので、ちょっとMTのソースを追ってみました。

エラーの内容はこんな感じです。
>

Got an error: Can't call method "connection" on an undefined value at /path/to/mt/lib/MT/App.pm line 594.
<

App.pmの該当行ををみてみるとどうやら、apacheのリクエストオブジェクトが空のためエラーになっている模様。さらにソースを追ってみると、親クラスのMT.pmでのinitでこけていることが判明。そこでMT.pmにwarnを仕込んでデバッグしてみたところ、プラグインのロードに失敗した際に呼ばれるlogメソッドが原因だと判明しました。

MT.pmのinitメソッド内では、pluginのreiquireに失敗すると、$mt->logメソッドを呼び出すのですが、このlogメソッドはMT::App.pmで定義されたlogメソッドによりオーバーライドされています。
そのMT::App::logでは$mt->{apache}->connectionを呼び出しているのですが、$mt->{apache}はこの時点ではまだ生成されていないため、最初に書いたようなエラーがでていたのでした。

このエラーを回避し、プラグインのロードに失敗した際もMTが止まらないようにするためには、失敗した際に、$mt->logではなくMT::logを直接呼び出すように書き換えればOKだと思います。とりあえずパッチを書いてみました。

>

--- MT.pm.orig Tue Jan 4 05:27:34 2005
+++ MT.pm Tue Jan 4 05:27:42 2005
@@ -292,7 +292,7 @@
$plugin = $1;
eval { require $plugin };
if ($@) {
- $mt->log("Plugin error: $plugin $@");
+ MT::log("Plugin error: $plugin $@");
return 0;
}
return 1;
<

2004年11月4日木曜日

コメントスパム対策をしました。

数日前にコメントスパム対策としてmt-comment.cgiの名前を変更したんですが、全く効果がなかったので、別の対策を行うことにしました。

他のブログはどんな対策をしているかみてみると、
-TypeKeyを使う
-連続投稿できる間隔を設定
-日本語が含まれていないコメントをブロック
-BanリストによるIP制限
というような方法が一般的みたいです。それぞれの方法をみてみると、TypeKeyは普通にコメント書きたい人にも一手間かけてしまうのがちょっとと思うし、連続投稿できる間隔の設定というのも一回は書き込まれてしまうし、Banリストは作成するのがめんどいしということでいまいち。

そこで今回は日本語が含まれていないコメントをブロックするという方法を少し発展させて全角ひらがなが連続するm文字が、n箇所以上無いコメントはスパムとみなすという対策をとることにしました。

今回修正したファイルはMT::App::CommentsとMT::L10N::jaの2つです。モジュールを直接いじるとMTをバージョンアップするときなんかに困ることになりそうなんで、プラグインとして書こう思ったんですが、プラグインの作り方を調べるのがめんどくさくなって、直接修正に妥協しちゃいました。。

この修正で、ひらがなが3文字連続している部分が2箇所以上ないコメントをPostした場合、エラーメッセージを表示するようになりました。軽くテストしましたがきちんと動いているみたい。

以下のコードをMT::App::Commentsのpostメソッドの上の方に追加し、MT::L10N::jaの%Lexiconに日本語エラーメッセージを追加しました。

>

my ( $m, $n ) = ( 3, 2 ); # ひらがなの文字数, 出現する回数

my $enc = $app->{cfg}->PublishCharset || '';
my $text = MT::I18N::encode_text($q->param('text'), $enc, 'euc');

my @count = $text =~ /(?:\xA4[\xA1-\xF3]){$m,}/g;
return $app->handle_error($app->translate(
"Your comment looks like a spam.[_1][_2]", $m, $n ))
if $text ne "" && scalar (@count) < $n;
<




2004年10月25日月曜日

sukerokuプラグインをテストしてみる

最近はてなの本に影響されて、はてなダイアリをこっそりはじめてみたんですが、*を先頭につけたら見出しになるとか、-とか+でリストを書けるというような、はてなダイアリの日記を書くためのルールがすごく便利でこれをMTでも使えないかなーと思ってググってみたらやっぱりありました。

ささやかなる実験場の開発室(HSJ.jp): MovableType用TextFormatプラグイン mt-sukeroku-plus.pl Ver.1.00公開

早速導入してみました。以下そのテストです。

* sukerokuプラグインをテスト

-リストです
--リストの中身1
--リストの中身2

[google:MT はてな プラグイン]


2004年10月20日水曜日

MT3.1にアップグレードしたけど、、

MTを3.1にアップロードしてみたところmod_perl環境で動かなくなっちゃいました。。エラーログとソースを眺めてみると、なんかApache:::Requestのオブジェクトができてないっぽいです。。原因究明する時間がないのでとりあえずCGI環境で動かすことにします。。