mail-entry_0.4.0-test1リリースです

※※※※※※※※※※※※※※※※※※※※※※
2004/6/2追記 単純なバグが混入しています。
601行目
my $latestentry = $iter->(); or return ""; # いちばん最新のエントリ
となっていますが、
my $latestentry = $iter->() or return ""; # いちばん最新のエントリ
というように、()のあとの;(セミコロン)を消してください。
※6月7日0:27追記 修正済みのものをアップしました。この時間以降にダウンロードしたものであれば修正の必要はありません。バージョン番号並びに日付は変わっていません。
※※※※※※※※※※※※※※※※※※※※※※

test1とか付いてます。新機能の動作確認がほとんどとれていません。なぜならテストする環境がないから。
実際はVirtual PCでいくらでも作れるんですけどね~(汗)
かなり不安げなテスト版をダウンロードするにはここをクリック!test2を公開しました。こちらへ

新機能は以下の通りです。

  1. GD(グラフィックライブラリ)による画像縮小機能を実装しました
  2. 画像の自動縮小機能を実装しました(サムネイルではなく元画像を縮小します)
  3. エントリー本文のHTMLを、Setting節で設定できるようにしました

その他、バグ修正なども行っています。

一つずつ解説します。
1.GDによる画像縮小機能
今まではMTのライブラリを通してサムネイルの作成をしていました。そのため、ImageMagickかNetPBMが必須条件でした。
今回GDに対応したことで、必須条件が少しやわらいだと思います。ただし、jpeg以外には対応しません。条件は下記の通りです。

  • GDが使える(Ver.1.6.2で動作確認)
  • PerlのGDモジュール Ver1.26以上が使える
  • もしくはPHP4が使えて、PHPからGDが使える(書いててよくわからん)この場合、mail-entryが同時に実行されるとうまく動かない予想されます(テストしたわけではないですが。処理の流れ上問題ありそうです)。index.cgiやcronを使うなどして同時に実行されないようにしてください。

PerlのGDモジュールがインストールされていれば、GDも当然インストールされていると思われます。モジュールチェックスクリプトをいじって調べてみてください。
PHPが使えるサーバーならば、GDのバージョンチェックが出来ます。jpeg縮小に対応しているかも調べられます。

<?php
phpinfo();
?>

というファイルをinfo.phpとでもしてサーバーに置き、Webブラウザで開くと、GDの項目があります。JPG SupportがEnableとなっていれば、少なくともPHPからはGDが使えます。PerlのGDモジュールが1.26以上だと、Perlだけで完結できます。1.26はGDの1.6.3以上を必要とするはずなので、GDがそれ以下の場合はPerlからは使えないと考えて良いと思います。

私のところもGDのモジュールが古くてですね、PHPを使った方法が実装されているのはそのためです。逆に、GDモジュールによる動作の確認が出来ていません。これがtest1の所以です。
PHPを利用した場合の動作についてはある程度テストしてあります。でも複数画像の添付とか、そういえばチェックしてないなぁ(汗)

設定方法です。

  1. $useGDにGDのバージョンをセット
    1か2です。小数点以下は必要ありません。GDの2が使えると、品質が良くなるらしいです。バージョンが分からない場合はとりあえず1にしてください。ちゃんと動くのを確認したあと、試しに2にして動けば、バンザイと言うこと。ただし、2では動作確認できてません。うまく動いたら教えてください。
  2. サムネイル作成用に$resize_widthに値をセット
  3. Perl用GDモジュールがバージョン1.25未満の場合は、PHPを使うように設定します。そのための設定は
    1. $blog_urlにブログのURLをセット。index.htmlは付けない方が良いと思います。
    2. $usePHPに1をセット
    3. index.cgiを使ってmail-entry.cgiを呼び出している場合は、index.cgiを同梱のindex.cgi.forPHPに置き換えてください。拡張子.forPHPを消して、index.cgiと同様の設定をして、index.cgiのディレクトリに上書きコピーするだけです。mail-entry.cgiのURLを設定する項目が増えています。
    4. cronから実行している場合は、ちょっと大変です。まず、シェル(コマンドライン)からPHPスクリプトを実行できることが必要です。さらに、mail-entryの改造無しではできません。PHPコード生成部分を単独のスクリプトの形にして、画像を読み込むごとにスクリプトを実行させるようにします。需要があれば別エントリで解説するか、コードに組み込みますけど・・・当初はこの形で作って、シェルからはうまくいくのにブラウザからは動かなくて悩んですよね。まだ一週間前なのに、遠い昔のことのように思える・・・

2.画像の自動縮小機能
いつも画像をアップする時って、リサイズしてからアップしますよね。携帯電話のカメラでも最近はサイズ大きいですし。サムネイルを160x120にしたとして、元画像は800x600ぐらいがいいというパターン、多いと思います。

そんなとき。$original_resize_widthというSetting項目に800セットすると、横幅が800を超える画像をメールに添付した場合、横幅800になるように縮小してくれます。高さは自動計算します。もちろん、$resize_widthが設定されていればサムネイルも作られます。
ひと手間省けますよ~、ということです。ただその分サーバーへの負荷が増しますから、追い出されないように気を遣う必要がありますね。

設定方法は、$original_resize_widthに希望の横幅をセットするだけです。縦横の比率は保たれます。

3.エントリー本文のHTMLを、Setting節で設定
エントリー本文のHTMLを、Setting節で設定できるようにしました。

  1. $comment_positionに"style"をセット
  2. $comment_style_htmlにHTML文を記入
    本文を入れたい位置に<_cgi_mail_body>を、画像を入れたい部分に<cgi_comment>を置いてください。MTのスタイルシートに画像表示部分のスタイルをつくっておいて、それを使うようにここで設定すると、スタイルシートを変えるだけで過去投稿分も含めてデザインを変更できる、とか考えられます。あ、でも複数枚の画像を添付した場合はどうなるんだろう・・・
    また、<>の中にcgi_を付けてスクリプト内の変数名を$付けずに書くと、その変数のその時点での値に置換されます。画像の幅などの指定に使えます。
    この機能、The soliloquy of Aoiにて公開されているパッチがヒントになりました。柳葵さんありがとうございます!

4.その他バグ修正など

  • コマンドラインで実行すると分かるのですが、必ず警告が出ていました。それを修正しました。今まで気づいてなかった・・・
  • $commen_postionを$comment_positionに改めました。綴りが違ってました。以前に気づいたことがあった気がしますが、ようやく直しました。動作には全然関係ないんですけどね。

パッチを当てるときの注意点です。
Setting節にいくつか項目が加わっていますので、うまくパッチが当たらないと思います。いくつかの設定値をデフォルト値に戻すことで対処できると思います。以下にデフォルトに戻す必要のある部分を列挙します。

  • my $image_dir = "moblogimages"
  • @auth_mail = ('hoge@hoge.co.jp','hoge@hoge.or.jp')
  • $resize_width = 0
  • $comment_postion = "top"
  • $to_jcode = "utf8"

結構ありますね・・・
参考までに、追加される項目も列挙しておきます。
  • my $blog_url = "";
  • my $useGD = 0;
  • my $usePHP = 0;
  • my $original_resize_width = 0;
  • my $comment_position = "top"; <-新規ではないが綴りが違ってるので修正した部分
  • my $comment_style_html = <<"HERE";
    HERE

こ、これで全部かな?変更が多すぎて自分でも把握しきれてません。漏れがあったらごめんなさい。


PHPを呼び出す方法がずいぶん強引と思われるので、実際にどんな動作をするのか解説しておきます。
画像が添付されていると、PHPのコードをmail-entry内で生成します。ファイル名は画像ファイルのように適当な数字の羅列が付けられます。それをmail-entry.cgiからリダイレクトで呼び出します。system関数で呼び出したいのですが、それだと動作してくれないようです。PHPがモジュールモードでインストールされているとこうなるようです。普通はそうなのかな?処理が終わると、$blog_urlにセットされたURLにリダイレクトします。ですから、実行結果は一切表示されません。これはindex.cgiから呼び出された場合を想定しての仕様です。

index.cgi.forPHPも、同じようにリダイレクトを使用してmail-entry.cgiを呼び出しています。system関数で呼んでしまうと、PHPコードへのリダイレクトが出来ないからです。

流れはこうなります。index.cgi.forPHPをindex.cgiとして設置し、ブログのURLにアクセスすると、

  1. ブラウザが自動的にmail-entry.cgiを開く(リダイレクト)
  2. 画像が添付されていると、自動生成されたPHPスクリプトがブラウザによって開かれる(=実行される)。画像がなければ$blog_urlへリダイレクトされ、トップページが表示される
  3. PHPスクリプトが実行された後、$blog_urlへリダイレクトされ、トップページが表示される

こんな感じです。リダイレクトされている間、ブラウザは真っ白です。URL欄だけが刻々と移り変わっていきます。この方法の問題点は、mail-entry.cgiのURLが晒されてしまうということでしょうか。引数を受け取らないcgiなので問題はないと思いますけど・・・

悪意を持ってmail-entry.cgiを連続で開かれたら、設置したサーバーとPOPサーバーに過負荷を与えることになるでしょう。mail-entry側に前回実行時から何分以内なら実行しないという、index.cgiと同じコードを仕込めば大丈夫そうですね。今思いつきました。

さー、うまく動くかなぁ~
かなり心配です。うまく動いて、ImageMagickが使用できなくて悲しい思いをしている方が一人でも減るとうれしいなぁ。ま、mail-entryの設置が大変ですし、GDがインストールされているサーバーというのも結構な条件みたいですが・・・
どうなんでしょ?

しばらくtest版のまま公開して、動作報告が入りしだい、正式版になる予定です。動かなかったら修正ですね・・・。うまく動いたという方、動かなかったという方、環境などをコメント投稿してくださるとうれしいです。よろしくお願いします。

トラックバック(0)

このブログ記事を参照しているブログ一覧: mail-entry_0.4.0-test1リリースです

このブログ記事に対するトラックバックURL: http://www.mobile-bozu.com/mt/mt-tb.cgi/204

コメント(8)

601行目がSyntax Errorになるようです。

変更前)my $latestentry = $iter->(); or return ""; # いちばん最新のエントリ

変更後)my $latestentry = $iter->() or return ""; # いちばん最新のエントリ

これで一応治ります。

うおっ
ご指摘ありがとうございます!

一度直したつもりだったのですが、調べてみたらどうやら自分のサイトに設置している分だけなおして、公開用のものに修正を加えていなかったようです。。。すいません。
0.3.5の時点で混入してるようです。差し替えねばー・・・

ご指摘通り、セミコロンが余分についてしまっているだけですので、取り払うだけで意図したとおりのコードとなります。
またどこか間違いがありましたら教えてください。よろしくお願いします。

PHPを使ってサムネイルを作ると元画像がなくなってしまいます。261行目付近から

変更前
} elsif ($php_script){ # PHPでサムネイル作成の場合は、公開用フォルダにコピー
if ($original_resize_width) {
$filename .= "_org." . lc($image_type);
} else {
$filename .= ".".lc($image_type);
copy($orgpath, "$outputdir/$filename") or &err_output("ファイルのコピーに失敗しました"); # 拡張子は小文字に統一
}

変更後
} elsif ($php_script){ # PHPでサムネイル作成の場合は、公開用フォルダにコピー
if ($original_resize_width) {
$filename .= "_org." . lc($image_type);
copy($orgpath, "$outputdir/$filename") or &err_output("ファイルのコピーに失敗しました"); # 拡張子は小文字に統一
} else {
$filename .= ".".lc($image_type);
copy($orgpath, "$outputdir/$filename") or &err_output("ファイルのコピーに失敗しました"); # 拡張子は小文字に統一
}


こんな風に変えると一応元画像もできるのですが、なにか問題あるかなぁ?ちょいと不安

みみさんこんにちは。テスト版チャレンジありがとうございます。ほんとうにありがとうございます。

えーと。$resize_witdhと$original_resize_widthを0以外の値にした場合に、ということですよね?
元画像自体を縮小した場合の保存は、縮小時になされているはずなので、ここでコピーする必要はないはずなんです。その時のコードはサムネイル生成の時と全く同じ物を使うので、サムネイルが作れているのなら、縮小された元画像もちゃんと公開フォルダ($image_dir)に作られているはずなのですが・・・

みみさんの作られたコードですと、元画像を縮小したファイルを、元画像で上書きしていることになってしまいます。たぶん。
元画像を縮小したファイル(ファイル名の末尾が_org.jpg or org.jpeg)が存在しない場合は、他の部分の処理がおかしいということになります。

私のところの環境だとうまく動いているんです・・・
ほかにPHPで試してみた方、いませんかー?

こちらの設定は
$resize_witdh = 50
$original_resize_width = 500
です。ちょうど中途の画像を送ると元の画像が見れなくなってしまいます。う~ん私だけなのかな?
とりあえずもう少し頑張ってひねり出したのが次のコードです。

} elsif ($php_script){ # PHPでサムネイル作成の場合は、公開用フォルダにコピー
if ($width $original_resize_width) {
$filename .= "_org." . lc($image_type);
} else {
$filename .= ".".lc($image_type);
copy($orgpath, "$outputdir/$filename") or &err_output("ファイルのコピーに失敗しました"); # 拡張子は小文字に統一
}

さっきのと違い上書きはなくなると思うのですが、言ってることがチンプンカンプンかもしれません。でもウチだとこれでうまく動くんだな。
これもまたイケナイ所があればご指摘もらえるとうれしいです。今度はコードをさらに読み直してもう少し考えて投稿します。

なんか書き込み失敗したので、もういっちょ!


} elsif ($php_script){ # PHPでサムネイル作成の場合は、公開用フォルダにコピー
if ($width < $original_resize_width) {
$filename .= "_org." . lc($image_type);
copy($orgpath, "$outputdir/$filename") or &err_output("ファイルのコピーに失敗しました"); # 拡張子は小文字に統一
} elsif ($width > $original_resize_width) {
$filename .= "_org." . lc($image_type);
} else {
$filename .= ".".lc($image_type);
copy($orgpath, "$outputdir/$filename") or &err_output("ファイルのコピーに失敗しました"); # 拡張子は小文字に統一
}

あーーー!
そうか!

サムネイルを作る場合で元画像を縮小する必要がないときの処理が足りてないんですね。なるほどー
みみさんのコードでばっちりだと思います。
if ($width < $original_resize_width) {
$filename .= "_org." . lc($image_type);
ここは
if ($width < $original_resize_width) {
$filename .= ".".lc($image_type);
この方が元画像を縮小していないというのが後からファイルを見た場合に一目で分かるようになりますね。
その必要があるかどうかは別して(汗)

$resize_widthよりもサイズが小さい場合は大丈夫だよな・・・

ご指摘ありがとうございます!助かります!
作ってる本人がこんな感じであやふやなので、これからもおかしなところがあったらどんどん教えてくださいませ。

というわけで、こうなりました。$original_resize_widthに値がセットされていても、元画像のサイズがそれより小さかったら、元画像を公開フォルダにコピーする、というコードです。
条件分岐って難しい・・・
みみさんありがとうございます~

} elsif ($php_script){ # PHPでサムネイル作成の場合は、公開用フォルダにコピー
if ($width > $original_resize_width) {
$filename .= "_org." . lc($image_type);
} else {
$filename .= ".".lc($image_type);
copy($orgpath, "$outputdir/$filename") or &err_output("ファイルのコピーに失敗しました"); # 拡張子は小文字に統一
}

コメントする

My status

BlogPeople

apple

気になるサイト覚え書き

ウェブページ

Powered by Movable Type 4.1

このブログ記事について

このページは、oshoが2004年6月 1日 10:11に書いたブログ記事です。

ひとつ前のブログ記事は「mail-entry_0.3.5リリースです」です。

次のブログ記事は「mail-entry_0.3.5での件名無しメールへの対応についての制限事項について」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。