Warning: Error while sending QUERY packet. PID=26731 in /home/uls/public_html/wordpress/wp-includes/class-wpdb.php on line 2351 FreeBSDな生活

2005.02.06

post2blog・・・(Movabletype)

携帯電話を含めてメールからBlogが書き込めるツールとして、post2blogを使わせていただいている。
post2blogの載っているサーバ以外のBlogにも書き込めるという優れものだし、無駄のない素晴らしいコードです。
まず、以下のpackageを入れておく。

(1) packageのdevelからp5-POE-Component-Server-XMLRPC
(2) graphicsからp5-Image-Info

これで、動くが、以下のような2つの改造を加えることとした。順次示す。
なお、最後に私が作った修正版を以下に載せて置くのでご希望の方は自由にご利用ください。
(1) 投稿可能なメールアドレスを規定

オリジナルなpost2blogは受信するためのメールアドレスが漏洩すると誰でも書き込み可能である。
厳密に守る必要も無いとは思うが、受け付けるメールアドレスを規制したいと思い以下を追加した。
まず、最初の部分に@authadresの記入を追加。 ここに許可するメールアドレスを”,”で区切って書いておく。 それとflag用の変数$authを宣言。

my $url = 'http://TARGET/URL/DIRECTRY/MT/mt-xmlrpc.cgi';
# CGIPath + 'mt-xmlrpc.cgi'
my $blog_id = 8;
my $username = 'USERNAME';
my $password = 'PASSWORD';
my $MT_DIR = '/YOUR_DIRECTRY_TO/mt/';
my $parse_path = '/tmp/post2blog';
my @authadrs = ('abcd@xxxx.yyyy.com','aabbcc@yyyy.xxxx.co.jp');
my $auth;

そして、判定文を書く。
Mail Addressの取り出しは簡易な方法であるが、厳密に行いたいなら正規なmail_regexを利用するのが良いが、単純に自分が設定したアドレスだけが取り出せれば良いので、これでも十分だろう。

if($from =~ /([-,0-9,a-z,A-Z,-,_,.]+@[-,0-9,a-z,A-Z,-,.]+)/){
foreach (@authadrs){
if($_ eq $1){$auth = 1;}
}
}
if($auth != 1){print "Not authorized mail address : $fromn";exit;}

(2) サムネイルの作成

post2blogでは画像はサムネイルを作らず、オリジナルの画像を表示の”width”と”height”を指定することで横幅を330pixで表示している。
これでも表示上は問題ないが、Blogのページを表示するのに元の大きな画像ファイルを読み込むことになるので、たくさんの画像を貼り付けたページでは表示速度が遅くなる。
この改良のため、横幅が330pixel以上の画像はサムネイルを作ることとし、さらに横幅が800pixel以上の画像は元の画像も800pixelに縮小した(これは好みの問題でもあろう)。

use Image::Size;
use Image::Magick;
foreach my $fileref (@attachs) {
my ($file, $orgfilename) = @$fileref;
my ($filename, $filepath, $suffix) = fileparse($file,
'.(jpe?g|gif|png)');
##################################
       $mkthumb = 0;
my ($imgx, $imgy) = imgsize($file);
if($imgx > 330){$mkthumb = 1;}
if($mkthumb == 1){
$thumbfile = $filepath . 'tn_' . $filename . $suffix;
my $i =  Image::Magick->new;
$i->Read("$file");
$i = $i->Transform(geometry=>330);
$i->Write("$thumbfile");
undef $i;
my ($imgx, $imgy) = imgsize($file);
if($imgx > 800){
$i =  Image::Magick->new;
$i->Read("$file");
$i = $i->Transform(geometry=>800);
$i->Write("$file");
undef $i;
}
}

画像のサイズ変更はImageMagickのmoduleを使用した。
なお、変数の$mkthumb, $thumbfileなども最初の部分に宣言を入れておく必要がある。
そして、サムネイルを作ったときは、これもBlogに転送する必要があるので以下を追加。

        close(BIN);
my $ret = $rpc->call('metaWeblog.newMediaObject',
$blog_id,
$username,
$password,
{
'bits' => $bindata,
'name' => $filename.$suffix
},
1
);
   if($mkthumb == 1){
($thumbfilename, $filepath, $suffix) = fileparse($thumbfile,
'.(jpe?g|gif|png)');
open(BIN, $thumbfile);
$bindata ="";
while (<BIN>) {
$bindata = $bindata.$_;
}
}
$returl = $ret->result->{url};
        close(BIN);
$ret = $rpc->call('metaWeblog.newMediaObject',
$blog_id,
$username,
$password,
{
'bits' => $bindata,
'name' => $thumbfilename.$suffix
},
1
);
#print Dumper $ret->result;
#print Dumper $ret->fault;
      if($mkthumb == 1){
$tnreturl = $ret->result->{url};
}
      if ($returl =~ /.jpe?g$/i) {
my $info = image_info($file);
if (ref $info) {
my @lats = $info->{GPSLatitude};

そして、最後に画像へのリンク方法を修正する。

        if ($returl =~ /.(jpe?g|gif|png)$/i) {
           if($mkthumb != 1){$tnreturl = $returl;}
$description = "<a href="$returl">
<img src="$tnreturl" alt="$orgfilename" border="0"></a>
<br/>$description";
} else {
$description = "<a href="$returl">$orgfilename</a>
<br />$description";
}
}

最後に私が作った修正版を以下に載せて置く。
Download file


2005.02.03

Movabletype 画像枠線の削除・・・(Movabletype)

1. 画像の枠線の削除

Movable Type 3.122に入れ替えたら、画像の枠線が付いている。
2.66のときはついていなかったので、同じにしたいと思って調べたら、以下のところをを修正すればよい事がわかった。

mtディレクトリー内の/lib/MT/App/CMS.pmを修正

HTML
} elsif ($q->param('include')) {
(my $fname = $url) =~ s!^.*/!!;
if ($thumb) {
return <<HTML;
<a href="$url">
<img alt="$fname" src="$thumb" width="$thumb_width"
height="$thumb_height" border="0"/></a>
HTML
} else {
return <<HTML;
<img alt="$fname" src="$url" width="$width" height="$height"
border="0">

ついでに、最近mail-entry.cgiから乗り換えて使わせてもらっているpost2blogにもborder=”0″を追加しておこう。

$description = "<a href="$returl"><img src="$returl" width=
"$imgx"height="$imgy" alt="$orgfilename" border="0"></a><br/>
$description";

2. 編集ボタンの追加

おー、今度はMozillaでもエントリーBodyの記入枠の上にBold, Italic, Undeline, Link, Blockquoteなどの挿入アイコンが付く。
ファイルのアップロードが新設されたのも便利に使えそうだ。
あとは、Preを付けておくのだが、今回は簡単で・・・mt/tmpl/cms内のedit_entry.tmplをQuote(blockquote)の記述をコピーして追加しQuoteをPreに’blockquote’を’pre’とするだけでよい。
2箇所ある。

        write('<a title="<MT_TRANS phrase="Pre">"
href="#" onclick="return formatStr(document.entry_form.text,
'pre')"><img src="<TMPL_VAR NAME=STATIC_URI>
images/html-pre.gif" alt="<MT_TRANS phrase="Pre">"
width="22" height="16" /></a>');

ついでに赤字を指定する”Red”も付けておこう。
しかし、赤字は閉じるタグは開始タグに”/”をつければ良いとは行かない。
<font color=#ff0000>文が入る< /font>としなければならない。
結局mt.cgiと同じディレクトリにあるmt.jsに以下のようなformatStr2を追加した。

function formatStr2 (e, v) {
if (!canFormat) return;
var str = getSelection(e);
if (!str) return;
setSelection(e, '<' + v + '>' + str + '</font>');
return false;
}

これで準備が整ったのでedit-entry.tmplに以下を追加する。
formatStr2にして、新しくmt.jsに追加したfunctionを呼んでいるのに注意。

write('<a title="<MT_TRANS phrase="Red">" href="#" onclick="return
formatStr2(document.entry_form.text, 'font
color=#ff0000')"><img src="<TMPL_VAR NAM
E=STATIC_URI>images/html-red.gif"
alt="<MT_TRANS phrase="Red">" width="22" heigh
t="16" /></a>');

2005.01.30

Movabletype 3.122への入れ替え・・・(Movabletype)

いままで、Movable Typeの2.66版を使っていたが、UTFでメールを送るとデータベースが破壊されて回復不能の致命的な状態に陥ることがある。
わたしも、やってしまってバックアップしていたのを用いて回復させたことがある。
最近のものは直っているらしいので3.122版に入れ替えた。
しばらく、使ってみたりテストしないと直ったか否か分からないが・・・


2005.01.23

MajordomoのSequencerの改造(2)・・・(mail)

またまたまた、Majordomoの改造の話です。
sequencerを改造してOutlook Expressでもメールシーケンスの重なりを起こらないようにしたが、Eudoraでは重なりが起こる事が分かった。

EudoraのSubjectはSubject:のWordの直後に改行が入るので、最初の方法ではシーケンス番号を取り除けない。

Subject:
=?ISO-2022-JP?・・・

のようになっているので、Subject:行の次の行もmimedecodeしてmimeencodeしシーケンスを取り除く必要がある。
Subject:行の次の行も処理すべき対象か、それ以外の行かは、mimeencodeされた行には=?が現れる事で判別しているが、Subjectの継続行以外でmimeencodeされている可能性はFrom, To, Reply行であるので、これらは除く。 
また、メールの本文中にシーケンスの重なり除去のアルゴリズムに引っかかるものが存在すると困るのでシーケンス番号の除去はメールのheader部だけに作用させるようにした。
これらの条件を考慮した結果が次である。

$in_header = 1;
while (<STDIN>) {
     if ($in_header){
if (/^s*$/) {$in_header =0 ;}
if (/^Subject:/ || (/=?/ && !/From|To|Reply/)) {
$_ = &mimedecode($_);
$_ = &mimeencode($_);
s/[rR][eE]:.*[([].*d+[)]]/Re:/;
s/[rR][eE]:s*[rR][eE]:/Re:/g;
           }
}
#############################################
if(/out-of-the-office/i){$taboo = 1;}
############################################
print IN $_;
}

どうも、スッキリした方法では無いですね。
誰か、良いアイデアがあればお教えください。


2005.01.15

Majordomoのsequencerの改造・・・(mail)

またまた、Majordomoです。
メーリングリストでタイトルにシーケンスナンバーを付けるのが一般化しています。
このため、Majordomoではresendの変わりにsequencerを使うが改造が必要なのは既に書いた
ところが、これでもOutlook ExpressではMIME decodeのルールに違反しているため、シーケンスナンバーの重なり防止が出来ない。
そこで、mime-decodeして改めてmime-encodeして正しいMIMEに直してやる必要がある。
このためにはmimer.plとmimew.plを取ってきて、sequencerの67行目あたりに次のように使用を宣言する。

require "shlock.pl";
+require "mimer.pl";
+require "mimew.pl";

そして、158行あたりを以下のように改造する。

&open_temp(IN, "/tmp/sequencer.$$.in") ||
&abort("sequencer: Can't open /tmp/sequencer.$$.in: $!");
while (<STDIN>) {
+       # by nob & tamotsu
+       if (/^Subject:/) {

+               $_ = &mimedecode($_);
+               $_ = &mimeencode($_);
+               s/[rR][eE]:.*[([].*d+[)]]/Re:/;
+               s/[rR][eE]:s*[rR][eE]:/Re:/g;
+       }
print IN $_;
}

さて、これで終わりだと思ったら、sequencerを使うとtaboo headerやtaboo bodyの「禁句」の指定が有効にならない。
taboo headerは添付ファイルの禁止する場合など、便利に使え是非欲しい機能である。
しかし、幸いにもsequencerはsequencerそのものに指定できる場所がある。

275行目あたりに下の赤字部分を挿入して添付ファイル(multipart/mixed)を禁止する。

                      /^subject:s*Failed mailb/ ||
/^subject:s.*bchangeb.*baddressb/ ||
/^subject:s*requestb.*badditionb/i ||
                            /^Content-Type:s*multipart/mixed/i   )) { 
&bounce("Admin request");
}

次にtaboo bodyであるが、私の運営しているMLで最近、出張に際して自動不在メール設定をした人がいて、メールがループする事故が起こった。
元来、長期にメールが受け取れないときは一時的にMLから退会して戻ったら入り直すべきとは思うがMLの運営側でも対策を考えることにした。
そこで、前述のシーケンス重なり防止の後ろに以下を挿入した。
自動応答不在メールの本文のどこかに必ずout-of-the-officeの語句を入れてもらい、これを引っ掛けてBounce mailにして逃げようというものである。

               s/[rR][eE]:s*[rR][eE]:/Re:/g;
s/[rR][eE]:s*[rR][eE]:/Re:/g;
}
#############################################
          if(/out-of-the-office/i){$taboo = 1;}
############################################
print IN $_;
}

さらに、taboo headerで追加した前述の後ろに以下のようにBounce mailを発行させる行を追加する。

                      /^subject:s*requestb.*badditionb/i ||
/^Content-Type:s*multipart/i   )) {
&bounce("Admin request");
}
#############################
if($taboo == 1){&bounce("Auto reply mail");}
############################

管理者には誰かMLに投稿する度にBounce mailが届くが、これは良しとした。
やれやれ、これで目的は達したか???