Category Archives: 未分類

Perlのお勉強-#6。

 Image::Size では,サイズを変えるのは面倒そうというか,自分でGDを使っていろいろとやらなくてはいけないみたい。まだ,そんな力はない。XREAでは Image::Magick も使えるようなので,これを使ってみる。

 ちょっと注意が必要なのは,Image::Magickはハンドルではなくファイル名を扱うということがあって,ふーんと思っていたけど,PerlMagick APIを読むと使えないわけでもないらしい。確実性に欠けるのかな。

 ググっているときに見つけたどのスクリプトも何の説明もなく, $image = Image::Magick->new; みたいになっていてなんでだろうと思っていたんだが,PerlMagick APIの中に書き方が書いてあって,newそのものが,Image::Magickのメソッドの一つなんだね。

 ひとまず,画像の拡縮にだけ成功したので,今の時点のスクリプトをこんがらないように書いておく。

 今回,今時点でわからないことがひとつある。それは,umaskの件。mkdirのところでパーミッションの指定を0705にしてある。でさ,このサーバのumaskを調べると0022らしいのだが,にもかかわらず,mkdirで0705に設定したそのままで$dir2ができちゃう。mkdirで設定したパーミッションはその時点でのumaskの値の影響を受けると書いてあるから,変わらないとおかしいのではないかと思うんだが,なんか読み落としているのかなぁ。

 さて,スクリプト。今のところエラーチェックが全く入っていない。その辺,問題。

追記(02/21):使っていないFile::Basenameを消すのを忘れていた。

―html―のほう。

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html lang='ja'>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>画像サイズ変更</title>
</head>
<body>
<form action="bgm.cgiのURL" method="post" enctype="multipart/form-data">
<p>画像ファイル名:<input type="file" name="image" /></p>
<p><input type="submit" name="submit" value="送信" /></p>
</form>
</body>
</html>

―bgm.cgi―のほう。

#!/usr/bin/perl

use strict;
use warnings;

use CGI;
use File::Copy;
use Image::Magick;

#ドキュメントルート
my $path = $ENV{'DOCUMENT_ROOT'};

my $dir1 = '/bgm'; #ドキュメントルート直下に手動で作成
my $dir2 = 2; #生成ファイル関連№ ファイル名・フォルダ名
my $siz1 = 0.5; #1未満で縮小,1を超えると拡大
my $blr1 = 0.8; #鮮明度 小さいと鮮明に,大きいとぼやける

#引数格納変数
my $q = new CGI;

chdir("$path$dir1");
mkdir("$dir2" , 0705);

# 元画像ファイル
my $img1 = "$dir2.jpg"; #画像ファイル名
my $fh1 = $q->upload('image');
copy ($fh1, "$path$dir1/$dir2/$img1"); #サーバ上の絶対パスでないといけないようだ。

undef $q; #CGI Objectをundef。

# 画像保存先
my $img2 = "$dir2-s.jpg";

# オブジェクト作成
my $image = Image::Magick->new;

# 元画像読み込み
$image->Read("$path$dir1/$dir2/$img1");

# 元画像縦横サイズ取得
my ($img3, $img4) = $image->Get('width', 'height');

# サイズ変更
$image->Resize(width => int($img3 * $siz1), height => int($img4 * $siz1), blur => $blr1);

# 画像保存
$image->Write("$path$dir1/$dir2/$img2");

#HTML ヘッド出力
print "Content-type: text/html; charset=UTF-8n";
print "Status: 200 OKn";
print "n";

print <<"END";
<html>
<head>
<title>画像サイズ変更</title>
</head>
<body>
画像サイズ変更・保存しました。<br>
<br>
↓保存した画像<br>
<img src='$dir1/$dir2/$img2'><br>
<br>
↓元の画像<br>
<img src='$dir1/$dir2/$img1'><br>
</body>
</html>
END

#終了
exit(0);

Perlのお勉強-#5。

 で,Image::Sizeを使って,スクリプトの側で画像のwidthとheightを取得する練習。

 すごい簡単なんだ。Image::Sizeのありがたさが身に染みる。

 それと,生成物の格納ディレクトリを変更して,一揃いごとにナンバーを付けたディレクトリに収めることにした。あとあと,自動的に格納ディレクトリをつくり,生成物をzipにしたりするのにもその発想のほうがよさそうなので。

 入力値のチェック等はほったらかし。まだよくわからないよー。

―html―のほう。

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html lang='ja'>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>BGMつき画像HTML生成</title>
</head>
<body>
<form action="bgm.cgiの置き場所のURL" method="post" enctype="multipart/form-data">
<p>タイトル:<input type="text" name="title" value="タイトル" size="20" /></p>
<p>キャプション:<input type="text" name="caption" value="説明" size="60" /></p>
<p>画像ファイル名:<input type="file" name="image" /></p>
<p>音楽ファイル名:<input type="file" name="music" /></p>
<p>背景色:<input type="text" name="back" value="#FFFFFF" size="7" /></p>
<p><input type="submit" name="submit" value="送信" /></p>
</form>
</body>
</html>

―bgm.cgi―のほう。

#!/usr/bin/perl

use strict;
use warnings;
use diagnostics;

use CGI;
use File::Basename;
use File::Copy;
use Image::Size qw(imgsize); #widthとheightのゲットにしか使わないので。

#引数格納変数
my $q = new CGI;

#ドキュメントルート
my $path = $ENV{'DOCUMENT_ROOT'};

#生成ファイル格納ディレクトリ
my $dir1 = "/bgm/1"; #パーミッション705

#タイトル&キャプション
my $ttl1 = $q->param('title');
my $ttl2 = $q->param('caption');

#画像・音ファイル名
my $img1 = basename($q->param('image')); #画像ファイル名
my $aud1 = basename($q->param('music')); #音ファイル名

#画像・音ファイル実体アップロード
my $fh1 = $q->upload('image');
copy ($fh1, "$path$dir1/$img1"); #サーバ上の絶対パスでないといけないようだ。
my $fh2 = $q->upload('music');
copy ($fh2, "$path$dir1/$aud1"); #サーバ上の絶対パスでないといけないようだ。

#読み出したイメージのファイルハンドルからwidthとheightを取得する。
my ($img2, $img3) = imgsize($fh1);

#背景色
my $img4 = $q->param('back');

undef $q; #CGI Objectをundef。$fh1と$fh2はScriptの終了時にcloseされるらしい。

#移動元・移動先ファイル名 File::Copyのmoveで使う。
my $from1 = "test.html";
my $to1 = "$path$dir1/bgm.html"; #サーバ上の絶対パスでないといけないようだ。

#ファイル書き込み
open(FILE, ">$from1") or die;
print FILE <<"PREVIEW";
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html lang='ja'>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>$ttl1</title>
</head>
<body bgcolor=$img4>

<p align='center'>$ttl2</p>
<div align='center'><img border='2' src='$dir1/$img1' width='$img2' height='$img3'></div>
<div align='center'><embed src='$dir1/$aud1' autostart='true' loop='false' hidden='true'></div>
</body>
</html>
PREVIEW
close(FILE);

#ファイル読み込み
open(FILE, "$from1") or die;
my @rec = <FILE>;
close(FILE);

#HTML ヘッド出力
print "Content-type: text/html; charset=UTF-8n";
print "Status: 200 OKn";
print "n";

#レコード表示
print @rec;

move($from1,$to1);

#終了
exit(0);

Perlのお勉強-#4。

 Perlのお勉強-#3。のスクリプトでは,画像のアップロード時にwidthとheightを教えてやる形になっている。しかし,当然ながらそんなことをしなくてもいいように,スクリプトの側でこれを取得させたい。

 で,この件に関しても最近のPerlでは簡単らしい。ただ,追加モジュールのImage::Sizeがインストールされていないといけないということで,自鯖についてppmから調べてみたら,Image::Sizeは入っていなかった(いるならインストすればいいわけだ)。

 XREAについてはどうすればいいんだろうとググったら,instmodshの話とExtUtils::Installedが見つかった。instmodshのほうはshellでCGIで使えないのではないかと思う(とにかく初心者なので自信はないです。―爆)ので,ExtUtils::Installedのほうでやってみた。Perl モジュール確認(レンタルサーバー)を参考にさせてもらって,下のようなプログラム作りを走らせた。これで,インストールされているモジュールがすべてわかったのかどうかよくわからないんだが,少なくともImage::Sizeのインストールはされているらしいことは判明した(苦)。

#!/usr/bin/perl
use ExtUtils::Installed;
my $list = ExtUtils::Installed->new;
print "Content-type: text/plainn";
print "n";
printf "%s %sn", $_, $list->version($_) for $list->modules;
exit(0);

Perlのお勉強-#3。

 今の状態。

 フォームからアップロードできるようにした。ただし,入力値のチェックもファイルサイズのチェックもまだだから,このまま設置すると多分えらいことなんだろうな。

 ものすごく久しぶりにPerlを弄っているけど,Perlも5ってなるとmoduleとか使うとずいぶんわかりやすくなっているんだね。感心。

—html—のほう。
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html lang='ja'>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>BGMつき画像HTML生成</title>
</head>
<body>
<form action="bgm.cgiの置き場所のURL" method="post" enctype="multipart/form-data">
<p>タイトル:<input type="text" name="title" value="タイトル" size="20" /></p>
<p>キャプション:<input type="text" name="caption" value="説明" size="60" /></p>
<p>画像ファイル名:<input type="file" name="image" /></p>
<p>画像の幅:<input type="text" name="width" value="500" size="4" />ピクセル
  画像の高さ:<input type="text" name="height" value="375" size="4" />ピクセル</p>
<p>音楽ファイル名:<input type="file" name="music" /></p>
<p>背景色:<input type="text" name="back" value="#FFFFFF" size="7" /></p>
<p><input type="submit" name="submit" value="送信" /></p>
</form>
</body>
</html>

 
 
 
 
—bgm.cgi—のほう。
#!/usr/bin/perl

use strict;
use warnings;

use CGI;
use File::Basename;
use File::Copy;

#引数格納変数
my $q = new CGI;

#ドキュメントルート
my $path = $ENV{'DOCUMENT_ROOT'};

#格納ディレクトリ
my $dir1 = "/html"; #HTMLファイル用 パーミッション705
my $dir2 = "$dir1/img"; #画像ファイル用 パーミッション705
my $dir3 = "$dir1/aud"; #音ファイル用 パーミッション705

#タイトル&キャプション
my $ttl1 = $q->param('title');
my $ttl2 = $q->param('caption');

#画像・音ファイル名
my $img1 = basename($q->param('image')); #画像ファイル名
my $img2 = $q->param('width'); #画像のwidth
my $img3 = $q->param('height'); #画像のheight
my $aud1 = basename($q->param('music')); #音ファイル名

#画像・音ファイル実体アップロード
my $fh1 = $q->upload('image');
copy ($fh1, "$path$dir2/$img1"); #サーバ上の絶対パスでないといけないようだ。
my $fh2 = $q->upload('music');
copy ($fh2, "$path$dir3/$aud1"); #サーバ上の絶対パスでないといけないようだ。

#背景色
my $img4 = $q->param('back');

undef $q;

#移動元・移動先ファイル名 File::Copyのmoveで使う。
my $from1 = "test.html";
my $to1 = "$path$dir1/bgm.html"; #サーバ上の絶対パスでないといけないようだ。

#ファイル書き込み
open(FILE, ">$from1") or die;
print FILE <<"PREVIEW";
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html lang='ja'>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>$ttl1</title>
</head>
<body bgcolor=$img4>

<p align='center'>$ttl2</p>
<div align='center'><img border='2' src='$dir2/$img1' width='$img2' height='$img3'></div>
<div align='center'><embed src='$dir3/$aud1' autostart='true' loop='false' hidden='true'></div>
</body>
</html>
PREVIEW
close(FILE);

#ファイル読み込み
open(FILE, "$from1") or die;
my @rec = <FILE>;
close(FILE);

#HTML ヘッド出力
print "Content-type: text/html; charset=UTF-8n";
print "Status: 200 OKn";
print "n";

#レコード表示
print @rec;

move($from1,$to1);

#終了
exit(0);

Perlのお勉強-#2。

 今の状態。こんなん。

 見ての通り,先にkoi1.jpgとkoiv01.midを別にアップロードしておいて,$img1,$img2,$img3,$aud1を設定したのち,このスクリプトを実行すると,koi.htmlができるというレベル。

#!/usr/bin/perl

use strict;
use warnings;

use File::Copy;

my ($dir1,$dir2,$dir3,$img1,$img2,$img3,$aud1,$from1,$to1,@rec);

#格納ディレクトリ
$dir1 = "/html"; #HTMLファイル用 パーミッション705
$dir2 = "$dir1/img"; #画像ファイル用 パーミッション705
$dir3 = "$dir1/aud"; #音ファイル用 パーミッション705

#画像・音ファイル名
$img1 = "koi1.jpg";
$img2 = "500"; #画像のwidth
$img3 = "375"; #画像のheight
$aud1 = "koiv01.mid";

#移動元・移動先ファイル名 File::Copyのmoveで使う。
$from1 = "test.html";
$to1 = "$ENV{'DOCUMENT_ROOT'}$dir1/koi.html"; #サーバ上の絶対パスでないといけないようだ。

#ファイル書き込み
open(FILE, ">$from1") or die;
print FILE <<"PREVIEW";
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html lang='ja'>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<title>「BGMテスト」</title>
</head>
<body bgcolor='#FF9900'>

<p align='center'>皐月の空を泳ぐこいのぼり(BGM付き)</p>
<div align='center'><img border='2' src='$dir2/$img1' width='$img2' height='$img3'></div>
<div align='center'><embed src='$dir3/$aud1' autostart='true' loop='false' hidden='true'></div>
</body>
</html>
PREVIEW
close(FILE);

#ファイル読み込み
open(FILE, "$from1") or die;
@rec = <FILE>;
close(FILE);

#HTML ヘッド出力
print "Content-type: text/html; charset=UTF-8n";
print "Status: 200 OKn";
print "n";

#レコード表示
print @rec;

move($from1,$to1);

#終了
exit(0);

Perlのお勉強-#1。

XREAサーバーのソフトウェア情報によれば,

Apache Perl PHP MySQL
1.3系 5.8.8 5.2.5 5.1.2

らしい。

CGI設置は大体以下の通りでO.K.
CGI設置ディレクトリ =====> public_htmlの下だったら,何処でもO.K.
           格納ディレクトリを作ったほうが分かりやすくていいね。
CGI格納ディレクトリを作った場合のパーミッション =====> 705
実行パス =====> /usr/bin/perl,または,/usr/local/bin/perl
ファイル拡張子 =====> cgi,または,xcg
cgi,または,xcgのパーミッション =====> 700

画像・音響ファイルディレクトリのパーミッション =====> 705
画像・音響ファイルのパーミッション =====> 604