About this page
カテゴリー Movable Typeに属する記事の一覧ページです。
現在このカテゴリーには28本の記事があります。 カテゴリー Movable Typeの説明: MovableTypeについて、インストールメモや工夫したことを書いてあります。 Latest 5 Entries
モバイルサイトマップの追加 と MT4iの改造僕の携帯には電話が滅多にかかってこないどころか、メールもほとんど全くこない(せいぜい2日に1通ペースのでメールが来たことすら気づかないことが多い)と、携帯的には圏外な生活をしています。ところが、近頃携帯でブラウザをする頻度が多くなってきました。電車に乗っているちょっとした時間に『はてな』でブックマークコメントを流し読みしたり、アキバにて過去の自分の行動をこのサイトのモバイル版で遡ったりする(特に過去の回路図とかパーツ情報)のが結構多くなりました。そういうわけで、このサイトのモバイル版も使いやすくしようという気になり、2つほど作業をしてみました。なおモバイル版は、MT4iというMovableTypeのデータベースを直接叩いて携帯向けHTMLを生成してくれるcgiを有難く使わせていただいています。 まず一つ目はGoogle先生からモバイルの記事も検索対象になるように、モバイル版のサイトマップを仕込んでみることにしました。方法はGoogle先生のサイトにあるとおりのXMLを作成、登録すればよいのですが、このサイトを生成してくれているMovableTypeにテンプレートを足すことでモバイル版サイトマップも自動生成しようと思います。 MovableType 2.661では管理画面を開いて[Templateの編集]で『新しいインデックステンプレートを作る』を選択、テンプレートの名前、出力ファイル名、自動的に再構築、リンクするファイルをそれぞれ Google Mobile SiteMap、sitemap_mobile.xml、チェック有、空欄にし、テンプレートの中身を以下のようにしました。 <?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0"> <url> <loc><$MTBlogURL encode_xml="1"$>cgi/mt4i/mt4i.cgi</loc> <mobile:mobile /> </url> <MTEntries lastn="9999"> <url> <loc><$MTBlogURL encode_xml="1"$>cgi/mt4i/mt4i.cgi?mode=individual&eid=<$MTEntryID$></loc> <mobile:mobile/> </url> </MTEntries> </urlset> あとは保存、再構築でGoogleのウェブマスターツールからこのXMLのURLを登録すれば完了です。少しつまずいたのは、locタグのURLをXMLエンコード(アンド記号&などが使えない)しなければならないことでした。 もう一つ行った改造は、MT4iのリダイレクト機能についてです。MT4iではリンクが本文中に含まれていると、そのリンクのURLを修正しゲートウェイを通すことでPC向けサイトでも携帯で見られるようにする機能があります。外部のサイトなら勿論これで問題がないのですが、自身のサイトでもこの機能が働いてしまい、自身の携帯記事から自身のPC記事へ飛んでしまうのが不快でした。そこでこの機能を実現している部分のプログラムを書き換えことで、この問題を修正しました。MT4i.cgiを修正します。 MT4i.cgiの_conv_url_to_redirector関数(修正前、3553行目)
# Convert sorce URL to redirector my $tmpurl = &make_href("redirect", $rowid, 0, 0, $eid); # URL encode $url = MT4i::Func::url_encode($url); $url = $tmpurl . '&url=' . $url; MT4i.cgiの_conv_url_to_redirector関数(修正後)
my $archive_url = $blog->archive_url; if($url =~ /^$archive_url(\d{6})\.html/){ $url = &make_href("individual", $rowid, 0, $1 + 0, 0); }else{ # Convert sorce URL to redirector my $tmpurl = &make_href("redirect", $rowid, 0, 0, $eid); # URL encode $url = MT4i::Func::url_encode($url); $url = $tmpurl . '&url=' . $url; } このサイトのPC記事は(アーカイブディレクトリ)/(6桁のID番号).htmlで保存されているので、その形式のリンクに突き当たった際は、PC記事のURLから携帯記事をURLを割り出すようにしました。PC記事の保存方法が異なる場合でも似たような方法がとれると思います。 今後もモバイル版ともどもよろしくお願いします。 ※後になって、最近のコメントがうまく表示されない問題があることに気づきました。その場合は以下の修正を試みてください。 MT4i.cgiのget_comments関数の一部(修正前、1564行目付近)
$args{'limit'} = ((!$_[0] || $cfg{NonDispCat}) && $_[1]) ? $_[1] * 10 # Limit for recent comment and non-display category specified. : ($_[1] && !$cfg{NonDispCat}) ? $_[1] : ''; MT4i.cgiの_conv_url_to_redirector関数の一部(修正後)
$args{'limit'} = $_[1] ? ($_[1] * ($cfg{NonDispCat} ? 10 : 1)) : ''; MT4i.cgiのget_comments関数の一部(修正前、1574行目付近)
if ($_[0] && !$cfg{NonDispCat}) { MT4i.cgiの_conv_url_to_redirector関数の一部(修正後)
if (!$cfg{NonDispCat}) { MovableType 2.661をapache2+mod_perl2で動作させるリクエストを戴きましたので、MovableType 2.661(以下MT 2.661)をapache2+mod_perl2上で動作させるまでに行った記録を記しておこうと思います。おそらく相当ニッチな要望だと思いますが(笑)。 コトの経緯を軽く説明しておきますと、MT 2.661はかなり古いCMSですが、このサイトのMT 2.661は自分の使い勝手がいいようにかなり改造を施してしまったので、なかなか最新バージョンに移ろうという気になれないでいました。そうこうしているうちにサーバーを最近立て替えたこともあり、以前のapache1.3 + mod_perl1.3環境から卒業してapache2+mod_perl2に対応する必要がてできました。その後MT自体は進化をとげメジャーバージョンが4になり、新しい環境にも標準で対応しているようなのですが、やはり使い慣れたMT 2.661を使い続けたい、だから移植しよう、というのがこの記事の動機となっています。 とりあえずapache1.3+mod_per1.3からapache2+mod_perl2にl変更するにあたってポイントとなる点は大きく2つに大別できると思います。 1つはapache2では並行動作のモードが複雑になった(従来のprefork動作以外にもmulti-thread動作等が選べる)ため、その上で動くmod_perl2がスクリプトを起動方法が変更になったようです。特にスクリプトを書く側にとって深刻な点は、起動時のディレクトリが必ずしもスクリプトの存在するディレクトリにならないことです。MT 2.661においても例外ではなく、MT 2.661では動作に必要となるサブモジュールの位置を、スクリプトが存在するディレクトリからの相対パスで求めているため、これは非常に大きな問題となります。先達はchdirでなんとか解決しようとされたり、apache2の構成方法にもよりますが従来どおりの動作が期待されるPrefork版のPerlハンドラを渡して解決しようとされたりしています(chdirが好ましくないことやPrefork版モジュールは本家mod_perl2のサイトで言及されています)。 もう一つの問題はmod_perl2でAPIの名前や動作がかなり変更されたことです。名前が変更されたことは書き換えで対応すればよいようで、これも先達によって『MT3.3をmod_perl2で動かすpatch(その1)』等で書き換え方法が公開されています。動作の変更点としては、MT 2.661で状態遷移を記録するために使用していたApache::Request::paramというものがありますが、Apache2::Request::paramでは変数を足すことができなくなった(『Apache2::Request PORTING from 1.X』参照)のが響いています。 以上2点を踏まえて、apache2+mod_perl2上でMT 2.661を動作するようにしました。変更点をまとめたdiffファイル(patchコマンドで適用可能形式)を公開するとともに、apache2+mod_perl2側の設定を以下に示します。 PerlSetEnv MT_DIR /usr/local/share/web/MovableType/
PerlSetEnv MTConfig /usr/local/share/web/MovableType/mt.cfg Alias /mt/ "/where/to/mt/" PerlModule ModPerl::Registry PerlModule Apache::DBI <Directory "/where/to/mt/"> <Files *.cgi> SetHandler perl-script PerlResponseHandler ModPerl::Registry PerlSendHeader Off </Files> </Directory> <Location /mt> Options ExecCGI Order Allow,Deny Allow from all </Location> <Location /mt/db> Order Deny,Allow Deny from all </Location> 1つ目の問題点、実行時のディレクトリの問題については環境変数渡し+@INCをスクリプト内で変更することでサブモジュールを見えるようにしました。@INCの変更はBEGINブロックで対応しないようにしましたが、これは『[perl]ModPerl::{PerlRun,Registry,RegistryPrefork}でのカレントディレクトリ、BEGINブロック、@INCの扱いメモ』に基づいています。 2つ目の問題点は、先達の書き換え方法、並びにApache2::Requestに対して、paramが書き換え可能なApache2::RequestSubclassというラッパークラスを定義することで対応しました。このアイデアは『Apache2::Request::param で set / add できない』より戴きました。 問題点がでてきたら変更を考えていますが、以上の作業で現在のところ問題なく動作しています。 ※ファイルのアップロードでこけることがありました。またしてもメソッド名が変更(size => upload_size、fh => upload_fh)になっていたようです。上記diffに追加してMT-2.661.CMS.pm.diffも mt/lib/MT/App/CMS.pm に対して適用してください。 トラックバックでBus Error (10)久しぶりのサーバやサイトの管理をしてみました。Webサーバのバージョンをあげてみたりとか、リンク切れを修正してみたりとか、見た目的には何も変わらないので非常に報われない作業です。そんな中でWebサーバのエラーログを見たのですが、あまり見たくないエラーがありました。ありえない領域をアクセスした際に発生するBus Errorというエラーが。 このサイトにもしトラックバックを送られていた方がいたら本当にごめんなさい。現在鋭意作業中ですが、また解決には至っていません。以下、その闘いの記録です。 ※その後、strstr()の問題とわかり、mod_encodingのソースを修正することで解決しました。 続きを読む "トラックバックでBus Error (10)"英語コメントスパムへの対処今までコメントスパムの対処方法として『HTMLタグを徹底的に認めない』や『禁止IPに登録されたのをわからなくする』、『MD5等を使ってコメント欄を偽装する(こちらは記事にしていません)』などを行ってきましたが、先日等々大量の英語スパムに見回れました。仕方がないので、英語スパムを駆除する方法を考えることにしました。 方法としては、日本語の文字が入っていないものをはじく方法を採用することにしました。特定の人が投稿できなくなる可能性があることに抵抗があったため、今までやらなかったのですが、とうとう諦めることにしました。 どうやらこの手の対策はプラグインでできるようですが、それらのプラグインはMovableType 3を要求しているようです。このサイトは未だにMovableType 2.661で運営されているので、動作するかわかりません。 そこで、いつものことながらソースをハックします。 use Jcode;
すると$str_encodingに英語のみの場合は'ascii'が、日本語が含まれる場合は'UTF-8'等が代入されます。詳しくはJcodeのマニュアルをどうぞ。my $str_encoding = getcode($str); そこで以下の改造をしました。 /path/to/MT/lib/MT/App/Comments.pm(MT2.661だと162行目付近)に追加 use Jcode;
my $comment_encoding = getcode($q->param('text')); if ($comment_encoding eq 'ascii') { return $app->redirect($entry->permalink); } これで英語コメントを無条件にはじけます。 Trackback SPAMがやってきた最近トラックバックスパムがめちゃくちゃ来まくっています。最終的にはコメントスパムのときと同じようにソースを改変(うちはこんなやり方をしています、効果絶大)することによって解決をはかりたいと思っていますが、なかなかよいアイデアが思いつきません。とりあえず巷にはコメントと同じように、連続投稿を禁止するパッチはあるようなのでそれをしましたが、それだけでは納得がいかないので、一時的にmt-tb.cgiを使えない状態にしました。従って現在Trackback、ならびにTrackbackされたURLへ飛ぶことが出来なくなっています。ご不便をおかけします。(→2/13、対策を施し復活させました。) このトラックバックスパムというのは今回がはじめてきたのですが、どうやらコメントスパムと同じ系統のようですね。問題のスパムのタイトルは『online casino』やらで、これは今まできたことのあるコメントスパムのタイトルと一致します。1時間に200回近くTrackback pingしてきました。Trackbackを受信するごとにリビルドする関係上、スパムというよりかDoS攻撃のような感じです。かなり頭にきています…。 とりあえず、コメントスパムと違ってトラックバックスパムはMovable Typeの管理画面から直接的に消すことができないので大変ですがデータベースをいじれば簡単に大量に消すことが可能です(データベースを直にいじることは危険をともないます、自信がない場合はお勧めできませんし、またここに書いてある方法を行うことも自己責任で願います)。 $ psql -d mtDB -U mtdbuser
(ログイン、以下mtDBではじまる行が入力行です) mtDB=> ¥dt # データベースのテーブル一覧が表示される、その中のmt_tbpingにトラックバックされた情報が詰まっている mtDB=> SELECT * FROM mt_tbping; # これでトラックバックされた情報の一覧をみることができる mtDB=> DELETE FROM mt_tbping WHERE tbping_id = 100; # 例えばIDが100のトラックバックを消してみる、IDとは上のSELECT文で一番左に表示された数字 mtDB=> DELETE FROM mt_tbping WHERE tbping_id >= 101; # 例2、IDが101以降のトラックバックを消してみる mtDB=> ¥q # psqlを終了する この後管理画面でリビルドをすれば反映されます。 Old Entries @ Movable Type
|
スポンサード リンク
|