Monthly Archives: 1月 2012

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