ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

超初心者向けCGI講座コミュのフォームで添付ファイルを送信!!

  • mixiチェック
  • このエントリーをはてなブックマークに追加
 最近フォームでテキストデータを送るというところまでやっと勉強しました。cgi-lib.plを使って%inで受け取るという奴です。
 そこで、バイナリデータを送信する方法なんですが、これがまた厄介で全然ちんぷんかんぷんなのですが、知っている方、おしえてください。

<input type="file" name="datafile" size="40">
と言う感じでファームに送信する覧を作るとして、cgiのスクリプトでnameを何らかの手段で受け取ることになると思うのですが、初心者CGI本にはそこまで載っていないんです。あるいは、何らかのライブラリーなんかを使うでしょうか?

($dev, $ino, $mode, $nlink, $uid, $gid,
$rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks)
= stat("binary.dat");
open(IN, "binary.dat");
binmode(IN);
sysread(IN, $buf, $size);
close(IN);
@data = unpack("C*", $buf);
for $x (@data) {
:
}
一説によると、こんな感じのプログラムで受け取るらしいのですが、どこがどういう構造になっているのかまだよく理解できないのです。


 写真の投稿できる掲示板なんかを作ってみたいと思います。

コメント(42)

kentさん、ありがとうございます!アップローダーと言うんですね。
 しかし、モジュールを使うとはいえ、ものスゴイ複雑でありますね。cgi-lib.plなんていうライブラリーで何とかなるとか、そういう方法ってありますか?(あろうかとは、思いますが、もの凄く複雑なスクリプトになりそうですね。超初心者には、ちょっと難しいものしれないですね。)
検索はしてみましたか?

「cgi-lib.pl アップロード」でGoogle検索で結構でますよ。
実際にperlで書かれたアップローダーが配布されてたりするんじゃないかな?と思います。

まずは、他の方が実際にどのような処理で行ってるかを参考にすると簡単じゃないかな?と思います。
>みずのさん、kentさん 

 なるほど、勉強になります。なんかCGIのことがちょっとずつわかってきました。そういうものって配布されているんすね。(と、いうことは自分もいつの日か、自分でよいものを作ったら配布できるってことですよね。)
 モジュールとかライブラリーとかいう意味がイマイチ理解できなくて、最近やっと解ってきたところです。
 みんながよく使うような機能は、そうやって探してみると、ライブラリーなりモジュールなりで案外配布されているんですねぇ。

 合体したり、取り込んだり、なんかCGIって、そういう部分で何だか一つの有機体みたいな感じがします。
そうですね、大抵の機能はモジュールやライブラリで実現されてることが多いです。面倒なメールの送信も可能なモジュールはありますし、画像のサイズを調整するモジュールもあります。

phpは結構最初からそういったものが関数として内包されてたりしますね。
↑げげっ!コピーライトが付いていますが、こんなところに載せて大丈夫なんでしょうか?
 大丈夫ですよね。。。
copyright付きはまずいんじゃないですかね・・・割とmixiは著作権とか肖像権を侵害しまくってますけど、一応自分で書いたモノのみを乗せた方がいいとおもいますよ。
著作権云々の前に、他人様のソースをそっくりそのままコピーというのはあまりよろしくないと思います。

一部抜粋などにするといいんじゃないかな?と思います。

また、特にソースを公開する必要がなければ貼り付けなくてもいいのでは?と思います♪
(無駄なところ削除&以下、原文)

なるほど。。。(ばっかり、言ってますね。。(笑))

 Perlはphpを含むけど、phpはPerlを含まない…と聞いたことがあります。ちょっとややこしいけど、難しいPerlの方を何とか勉強しておけばphpはわりに理解しやすいという話でした。
 英語をちゃんとやっておけば、他のフランス語やドイツ語なんかも理解しやすいというのと似てますよね。

 僕でもちょっと改造したりして、なんとか理解できそうなアップローダーがありました。CGI.pmを使う方法です。Perl ver.5では標準で付いているらしいので、そのまま使えそうです。http://tangsten.oops.jp/cgi/text_database/form.htmlこのファームにファイル転送をさせたいと思っています。
 今月はここら辺りを攻略しなくては!です!
>kentさん

 http://www.ss.iij4u.or.jp/~somali/web/_perl_upload.html←このサイト参考にしています。最も簡単な形式でアップロードできるようになりました。自分で作ったプログラムに組み込むのは、週末かな…。あっ、でも日曜出勤だった…。

 スクリプトの意味を上から解読中であります。
 ありがとうござます!!
 そんなこんなで、日曜だったので、こんな感じのプログラムを作りました。勉強を兼ねてなので、自分で意味のわかるところからはじめて、最低限必要な部分は意味がわからなくてもコピーして貰って来て…、という具合でやっとできました。

#!/usr/local/bin/perl -w

# CGI.pmの読み込みです。Perl ver5以上だったら標準で付いているので、呼び出すだけでいいんですよね?
use strict;
use CGI;

# POSTサイズの上限(結構でかいファイルもいけるみたいです。)
$CGI::POST_MAX = 1024 * 1024; # 1MB

my ($buffer);

# オブジェクト作成
# 形式的にコピペしたので、これが一体どういう意味だか自分でもわかりません。
my $query = new CGI;

# ファイル取得
# param();を使うより、今はこっちの方がいいという解説を見つけて、これにしてみました。が、->←この記号の意味がわかりません。
my $fH = $query->upload('filename');

# MIMEタイプ取得
my $mimetype = $query->uploadInfo($fH)->{'Content-Type'};

# ファイルの保存
open (OUT, ">Savefile") || die "Can't open Savefile!";
binmode (OUT);
while(read($fH, $buffer, 1024)){
print OUT $buffer;
}
close (OUT);
close ($fH) if ($CGI::OS ne 'UNIX'); # Windowsプラットフォーム用
chmod (0666, "Savefile");

# HTML出力
print $query->header(-charset=>'EUC-JP'),
$query->start_html(-lang=>'ja', -encoding=>'EUC-JP', -title=>'upload.cgi');

print <<"EOM";
<h1>ファイルアップロード</h1>
<ul>
<li>ファイル名:$fH</li>
<li>MIMEタイプ:$mimetype</li>
</ul>
<p>ファイルのアップロードが完了しました。</p>
EOM

print $query->end_html;
exit;

 一応アップロードされるんですが、拡張子なしなんです。拡張子を付けてやらないといけないのですが、基本的にはこんな感じでCGIが動きました!!
 もし、このプログラムの意味がわかる方がいたら教えてください。
paramよりupload関数を使ったほうがいいんですか。勉強になります。あと、CGIモジュールは大変多機能というだけあって重いので、CGI:Liteを使ったほうがいい場合もあります。

拡張子に関してはmimetypeをキーとして対応表を作っておくのはどうでしょうか。↑で私が挙げたサンプルページでもこうやって取得していたと思います。mimetypeを取得してるのはこのためでしょう。

%ext = (
'text/html' => 'html',
'image/jpeg' => 'jpg',
'image/gif' => 'gif',
)

の様にすれば、取得したファイルの拡張子を$ext{"$mimetype"}で求められるはずです。予期しない拡張子のファイルのアップロードを避けるためにも、ここで設定した以外の拡張子のファイルが来た時はエラーを返すようにした方がいいかもしれませんね。

あと、ファイル名が被るとファイルが破損する恐れがあるので、アップロードCGIを作る時には必ず被らないような名前を作るのが一般的ですかね。大抵は時間を取得してファイル名に付けたりします。

オブジェクトに関してはよく私も解ってないんですけど。「そのものに指示を与えると仕事の過程は見えないけど仕事をしてくれて値を返してくれる」的なものなのでしょうか。
http://www.atmarkit.co.jp/fjava/devs/object01/object01.html
あたりを見ると解るかもです。

->は、リファレンスの展開などにも使われるんですが、この場合はCGIモジュールの中の関数(機能)を呼び出してると考えていいんじゃないでしょうか。

それからstrictは毎回つけたほうがいいです。これを期にクセにした方が良いと思います。
 なるほど。。。もの凄く成長しました!
 しかし、mixiってすごいですね。こうしていろんな情報交換ができる。なかなか周囲にプログラマーがいないので、とても助かります。
 mimetypeと拡張子をハッシュにしておくアイディア!有り難く頂きます!
 ファイルネームは時間で取得するとタブらないですね!

 僕はシステムのナンちゃらという理由は全然わかりませんが、paramよりupload関数を使った方がいいのは、paramは結構昔かみんなが頻繁に使っていて、最近だとアタックされやすくなっていて、uploadの方がセキュリティー的に安全なんだそうです。
 
時間で取得してもダブる場合があるので、上の例ではさらに乱数を発生させて防いでますね。乱数という言い方は正確ではなくて、プロセスIDを示す特別な変数「$$」を使って被らないようにしてます。

rand関数で乱数を発生させてもいいと思いますけどね。

しかし、親切に教えてくれるコミュニティもあればそうでないコミュニティもあります。プログラマの三大美徳といわれるものが合って、それが「怠惰・短気・傲慢」ですから。本格的なプログラムのコミュニティで聞いた場合はそっけない返答が帰ってくる確率は高いです。

そういう意味ではこういった初心者コミュニティは有用だと思いますよ。

ただ、一つ。初心者コミュニティでもまず調べることは大事ですね。調べれば解ることも多いですから。

>uploadの理由
勉強になります。
 なるほど。乱数。試してみます。


kentさんの言うその三大美徳…経験あります。なんでしょうね?あれ?
 僕は数学一家というか理系一家育ちなんですが、何故だか僕だけ文化系人生を歩んでしまった。そんで、今になって、通常の社会人になってみれば、やっぱり理系というか理論系というかそういうものが好きなんですよ。
 結局理系とは言わないまでも、今の僕の職場も男一色…。。
 
 でも、なんだろう…、やっぱりプログラマーは小説とか詩とか読まないんですかね?そういうことなのかな?僕の家庭では、小説・映画・詩…、そして飲み会というものを極端に嫌っていましたから。。。そういう中ですくすくと技術だけ磨いてきたってことなんでしょうかね?
 三大美徳さん達とは、ちょっとつき合いにくいです。はい。
 でも三大美徳さんに言わせると、「礼儀がなってない。」とか「レスしてやったのに、無視されたから俺は悪くない。」とか結構稚拙というか、びっくりするぐらい子供でややびっくり気味の初心者日曜プログラマーの僕であります。
私も詩は読まないですが大槻ケンヂが大好きで歌詞で曲を聴いてたりはします。

一応理系の大学に通ってますが根は文型なのかなーと思うことが多いです。ただ飲み会は嫌いです。酒とタバコが極度にダメなので(笑)

どうでもいいけど三大美徳のうちの二つはキリスト教の言うところの人間の7つの大罪なんですよね。逆説的な意味であえてこういった項目を挙げてるのかと思いますが。

まぁ「三大美徳」さんの言うことも解らないでもないんですよね。
1.最低限質問前に調べる。
2.むやみに初心者であることを強調しない(甘えと取られる)。
3.書き込む時の口調は気を使う。マルチポストなどはしない。
4.答えを貰い、解らなければ具体的にわからない点をいう。
5.解決したら礼を言う。

これだけ守ってれば三大美徳さん相手でもそこまで唐突にキレられることはないと思います。
…なるほど。
 しかし、情報交換というのは、考えてみれば『交換』だから、考えてみれば一方的に情報を奪ってゆくような感じっていくら初心者と言えども失礼といえば、失礼ですよね。
 自分でやっていて、結構苦労することありますから。。。(特にエラーが出て、自分でもわからなくなった時なんか、肩こります。)

 画像とかファイルの送信の話に戻りますが、
 http://tangsten.oops.jp/cgi/text_database/upload.html
こんな簡単なフォームからjpg写真なんかを送信できるようになったのですが、これにテキストを加えたり、写真を3枚アップロードしようとしたりすると、どうもうまくいかないんです。
 初心者が陥りがちな重要な点ってありますか?
 http://tangsten.oops.jp/cgi/text_database/form.html
 ↑ここから3枚ぐらい同時に送信できるようにしたいと思っているんです。
上記の13で書いたものを改造して作っているんですが…。。
…流石超初心者!!
 もの凄い馬鹿みたいなことをしていました。
 フォームから受け取ったデータのテキストをcgi-lib.plで処理しようとして、画像やファイルだけをCGI.pmで処理しようとしていたんです!!
 どこにも何にも基本的過ぎて誰も語ってくれないことでしたが、今日、休日一日使ってやっとわかりました。どちらか一方のモジュールorライブラリーでデータは処理しないと面倒なことになる…。。。
 テキストと画像の送信を一度にやってみるとエラーが出るのはその為でした。ホントにアホでした。

 うむむ。。結構勉強になりました。
 結果として、慣れているcgi-lib.plを使うことにしました。

#------------------------------------------------------
# 画像送信処理
#------------------------------------------------------
$upload_01 = $in{"upload_01"}; # ファイル内容を取得
$name_01 = $incfn{"upload_01"}; # ファイル名を取得
$upload_02 = $in{"upload_02"}; # ファイル内容を取得
$name_02 = $incfn{"upload_02"}; # ファイル名を取得
$upload_03 = $in{"upload_03"}; # ファイル内容を取得
$name_03 = $incfn{"upload_03"}; # ファイル名を取得


$name_01 =~ s/\\/\//g; # パス区切り文字を/に変換
$name_01 = substr($name_01,rindex($name_01,"/")+1); # ファイル名のみを取得
$name_02 =~ s/\\/\//g; # パス区切り文字を/に変換
$name_02 = substr($name_02,rindex($name_02,"/")+1); # ファイル名のみを取得
$name_03 =~ s/\\/\//g; # パス区切り文字を/に変換
$name_03 = substr($name_03,rindex($name_03,"/")+1); # ファイル名のみを取得



if($upload_01 ne "" && $name_01 ne ""){
open(FILE,">$name_01");
binmode(FILE);
print FILE $upload_01;
close(FILE);
}
if($upload_02 ne "" && $name_01 ne ""){
open(FILE,">$name_02");
binmode(FILE);
print FILE $upload_02;
close(FILE);
}
if($upload_03 ne "" && $name_03 ne ""){
open(FILE,">$name_03");
binmode(FILE);
print FILE $upload_03;
close(FILE);
}

…こんな野暮ったい感じなんですが、動きました。本当はwhileかなんかでまとめて処理した方がいいのでないかと思っているですが…。。(保存ディレクトリもまだないし…。)
これはどこかのスクリプトの手法を使ったものですかね?

substr($name_01,rindex($name_01,"/")+1);

というやり方は初めて見ました。

whileとかforeachで処理できるんじゃないでしょうか。

foreach(1..3){
${upload_$_} = $in{"upload_$_"}; # ファイル内容を取得
${name_$_} = $incfn{"upload_$_"}; # ファイル名を取得
}

・・・動くかな?(笑)
foreach(1..3){
${"upload_$_"} = $in{"upload_$_"}; # ファイル内容を取得
${"name_$_"} = $incfn{"upload_$_"}; # ファイル名を取得
}

こうしてダブルクオートしないと動かないみたいですね。
ファイル名取得部ですがこんなのはどうでしょうか。

my $fullpath = '/var/log/messages'; #仮にパス文字が/に置換されているとすればこんな値になってる

##ここから
my @tmp = split('/', $fullpath); #'/'で区切って配列に格納
my $filename = pop(@tmp); #配列の最後の要素を取り出し

同じ処理の部分はsubルーチンにするとよいでしょうね。

P.S.
エラーが出たときはそのメッセージとそのソース(をtxt形式などにして見れるようにしたURL)を提示するといいと思います。見ている人の勉強にもなります。

例)http://finite.littlestar.jp/cgi-bin/view_source.cgi
KIDDさん、ソース見てもかなりやり手ということが解りますね(笑)かなり短く纏まってて良い感じです。

ファイル名の取得はそっちのほうがしっくり来ますね。<配列格納

CGI.pmだとファイル名だけ取り出せるんですがcgi-lib.plだとフルパスで取得しちゃうのでしょうか。
短く纏める と言う目的であれば

my $fullpath = '/var/log/messages';
my $filename = (split('/', $fullpath))[-1];

こんなのや

$name_01 =~ s/(.*)[\x2F\x5C]([^\x2F\x5C]*)$/$+/g;

こんな取り方とかもできるんじゃないかな?と思います。

実はperlでアップロード処理やったこと無いですし、モジュールにも無知な私ですが、ファイル名の文字はEUCですかね?

C:\www\表示.txt
とかのファイルをあげた場合、バグらないでしょうか?
SJISだったら多分文字化けするんじゃないかなと思います。
昨日はロクに調べず書きました

これがスジに一票
use File::Basename;
my $file = '/var/log/messages';
print basename($file);


個人的にはプログラムは意味がわかりやすくなるように書きたい派。なので標準モジュールは使い倒したいところ

ファイル名の文字コード関連もsetなんとかって関数とかでいけそう。パス区切り文字の置換の必要なさそうだし
ごめんなさい文字コードは無理だ(汗)
根本的な問題として、アップロードさせるファイル名に日本語が使える時点でちょっと問題があるかも知れません。

通常、ID.extのような形式だったり、YYYYMMDDHHIISS.extのような形式だったり、それぞれ意味のあるもしくは全く関係のないファイルにしてアップロードするんじゃないかな?と思います。

○ UNIQUEなファイル名を自動生成し作成する
× アップロード時のファイル名をそのまま使う

>個人的にはプログラムは意味がわかりやすくなるように書きたい派。

これにはとても賛成です。
コメントアウトをするのももちろんですが、処理の書き方を短く纏めればいいって物でもないですよね♪

私は30分前に書いたコードを良く忘れます。
>kentさん
>substr($name_01,rindex($name_01,"/")+1);
↑これ、どこかのサイトの一部をコピペしただけです。僕は意味が全然わかりません。初心者本には、まず出ていないようなモノですよね?



>みずのさん。
>C:\www\表示.txt
>とかのファイルをあげた場合、バグらないでしょうか?
>SJISだったら多分文字化けするんじゃないかなと思います。

 見事に化けました。(しかも、「表\示」なんてファイルネーム流石に付けないですよね(汗)。。) EUCでやっています。

>私は30分前に書いたコードを良く忘れます。
うぅ、僕は書いている最中にわからなくなります!!

> KIDD@骨折リハビリ中
>個人的にはプログラムは意味がわかりやすくなるように書き
>たい派。なので標準モジュールは使い倒したいところ
 むむむ。。耳が痛いです。でも、そうですよね?使い倒しまで、後半年ぐらいかな。。勉強してみます。

 みなさん、いろんなアイディアありがとうございます。
 いろいろ考えた末、やはり、
○UNIQUEなファイル名を自動生成し作成する
…という方がいいですね。それに日本語はダメですね。

 kentさんが言っていたように、乱数なんかを組み合わせて、「$乱数_$日時_$シリアルナンバー.jpg」みたいなのがいいのかもしれませんよね?
 またいろいろといじくってみます!!
 ありがとうございます!

 P.S.あの〜、本当にみなさん、”超”初心者なんですか?(といいつつ、本当に超初心者だけだったら、それはそれで困りますが…(笑))
と、いいつつ、また深夜までPCをつついてしまいました。
自分で全部把握できる限りのモノを書いてみました。画像3枚を同時にアップロードできるという風にしたかったので、乱数と日付をつけて、上から順番に番号を振りました。
 やっぱり日本語のファイル名はサーバーにアップすることを考えるとちょっと無理がありました。自動的に名前を振っちゃった方が全然楽ですね。後々HTMLで画像を呼び出すわけですが、その際もパスの設定が楽になる。


$binary = "./binary";#画像ファイルの保存ディレク名

$upload_01 = $in{"upload_01"}; # ファイル内容を取得
$upload_02 = $in{"upload_02"}; # ファイル内容を取得
$upload_03 = $in{"upload_03"}; # ファイル内容を取得

$name_01 = $incfn{"upload_01"}; # ファイル名を取得
$name_02 = $incfn{"upload_02"}; # ファイル名を取得
$name_03 = $incfn{"upload_03"}; # ファイル名を取得

my $tail_01 = substr($name_01,-4,4);#拡張子を取り出す。
my $tail_02 = substr($name_01,-4,4);#拡張子を取り出す。
my $tail_03 = substr($name_01,-4,4);#拡張子を取り出す。


my $ran=rand(10);#乱数を取得
$ran = substr($ran,-4,4);#乱数の下四桁を取得

&get_time();#日にちを取得(サブルーチンです。)

if($upload_01 ne ""){
open(FILE,">$binary/$year$month$mday-$ran-01$tail_01");
binmode(FILE);
print FILE $upload_01;
close(FILE);
}
if($upload_02 ne ""){
open(FILE,">$binary/$year$month$mday-$ran-02$tail_02");
binmode(FILE);
print FILE $upload_02;
close(FILE);
}
if($upload_03 ne ""){
open(FILE,">$binary/$year$month$mday-$ran-03$tail_03");
binmode(FILE);
print FILE $upload_03;
close(FILE);
}

 これで何とかアップされたファイル名の重複を防ぐことができそうです。後は未入力エラーの処理とか、細かいことを付け足してゆくだけ…。。。
 基本的な機能を作れただけで上出来!!という気分です。

 みなさんどうもありがとうございます!
自分は初心者じゃないつもりだったりしてますw

理由はこんな感じw
http://mixi.jp/view_diary.pl?id=22960080&owner_id=121774
私は初心者と中級車の間くらいですかね・・・KIDDさんと同じように人に教えることで自らが得ることもあるんですよね。
 やはり…。超初心者っぽくない感じが…。。
 でも、回答するっていうのはやっぱり自分も勉強なりますね。
 phpやっている友達に「お前はもう初心者じゃないよ。Perlっていうのは、相当面倒なモノよ。」って言われたんだけど、自分では全然そんな気がしないんですよ。
 何というか、半年前にちょこちょこ始めて、一人でやっていたものだから、いわゆる(Perl使いの)共通言語が全然わからないわけです。意味はわかっているし、使ったことのある関数なのに、自分の用途以外になると、全然わからなくなる…。そういう意味では、本当に超初心者なんです。エラーの修正なんて散々やっているのに、デバックという言葉を知らなかったり…。。。
 プログラムって『一人の技術者』イメージがあったけど、結構社会的なもんですよねぇ。。
(うちの嫁さんは、プログラムではなく、mixiで女の子とメールしていると思っているらしいけど。)
中級車←なんだこの変換

自分も一応動く物は作れますけど、効率とかテクニック的なものはほとんど解ってない感じです。

あれです、嫁さんがいるだけマシです(笑)
自分はちなみに初級だと認識してますよ
中級:仕事で使えるくらいのレベル
上級:ライブラリを人に公開できるレベル
これを極めるとCPANとかに登録できたりするわけですよええ

自分にとってのPerlってシェルの強化版くらいの扱いなので、CGIなんて、まともなものは書いたことなかったりしますw
#ってシェルの書き方しらないのでperlで書いてるだけなんですが

PHPと比較してPerlでCGIを書くのは自分も面倒だなぁと感じますよ。Web系に特化したものがPHPには多いですから。

#単純に、本のサンプルからだけじゃなくて自分で仕様を考えて書けるのは「初心者」ではないと言われるのはわかる気がします。
>kentさん
 中級車なんですか?(笑)
 嫁は皆さんが言うように、慣れると本当に慣れます。時折「はじめてのCGI」という本を、珍しい虫でも見るような目で見てます。

>KIDDさん
 そうなんです。僕は始めから自分でプログラムを書いてみようと思ったので、自分の考えた機能が先行して、その機能に使える関数をいつも捜している始末なんです。だから、かなり偏った知識体系で学んでいる感じがします。
 例えば、『シェル』ってわからないんです。
 そんなわけで、こんなところで、何ですが、シェルって何んですか?Perl関連でよく耳にしますが、CGIではないんですよね?
http://mixi.jp/view_bbs.pl?id=1261383
で出てる通りじゃないですかね。

私もよくシェルは解ってませんが・・バッククオートを使うとか見たことがあります。
>シェルって何んですか?

椎名さんの記述の通りだと思いますが、シェルはUNIX系のプロンプト上で使うだけではなく、スクリプトとしても記述が出来たり
します。
繰り返し自動で行う処理とか複数の人が同じ処理を行う必要があるとか。マクロのような物として使ったりするんじゃないかと思います。

>Perl関連でよく耳にしますが、CGIではないんですよね?

基本的にブラウザで表示させるためのプログラムをシェルではやらないです。
apacheに設定して表示させるってのは出来るのですが、実際にやるとそれはもう不便さにイライラすることだと思います。

上記のように厳密に考えると NO ではないですよね。
ただ、普通に考えるとやらないでしょうし、CGIではないと考えてていいのかなと思います。

シェルは基本的にはローカルで利用するものじゃないかな?と思います。

例えば、私の職場では簡単なコマンド処理を自動化させたい場合などにシェルスクリプトとして作成してたりします。

インストール手順が毎回同じ物があった場合、シェルに書いておいて次回から自動化・・・とかって具合に。

デフラグやバックアップなど、データベース処理とかをバックグラウンドで処理したい場合なども使うかな?と思います。

>僕は始めから自分でプログラムを書いてみようと思ったので、自分の考えた機能が先行して、その機能に使える関数をいつも捜している始末なんです。だから、かなり偏った知識体系で学んでいる感じがします。

この辺は私も同じ考えです。
基礎が無いので、深い知識が無いのが悩みです。

私もKIDDさんと同じ意見で、簡単に記述できると言うことで基本的にはシェルではなくperlやPHPで書いちゃいます。

>バッククオートを使うとか見たことがあります。
perlやPHP上からシェルや別の実行プログラムを使いたい時に使うものですね♪
system関数やexec関数なども用意されているので、こちらの方が視認性でいいかもしれません。
みずのさん

> 基本的にブラウザで表示させるためのプログラムをシェルではやらないです。

補足します
最近のApacheはどうか知らないですが/cgi-bin/ディレクトリに
cgi-testというファイルがあります。実はこのファイル、一行目が#!/bin/sh
なんですよね。だから「シェルで動くCGI」なんです。
難しいことをシェルでやるのが難しいので、通常はPerlなどを使う、ってことです。

>>Perl関連でよく耳にしますが、CGIではないんですよね?

#以下、若干むつかしめの大切なことを書きます
なので「CGI」って何なのか、よく調べてみる必要があります。CGIはPerlとか、「言語のことではない」です。
CGI自体は、ブラウザ(など)から受けたリクエストをサーバが解釈し、(さらに一行目を見て、どの処理系(perlなのかシェルなのか)を使うか判断し)その出力をブラウザに行うものです。
#以上

Perlに関しては
バッククォートとsystem,exec関数は種類が違うので適切に使い分ける必要がありますね。

・system関数は子プロセスの完了を待つ
・execとsystemはそれによって利用されるコマンドの戻り値を返す
・バッククォートは出力結果を返す
 とてもよくわかりました!
 CGIってそもそもコモン・ゲートウェイ・インターフェイスだったような…。いろんな言語を使って創り上げたモノの総称ってことですよね?
 シェルもだいたいわかりました。
 これは、Windowsのコマンド・プロンプトに似ているかも。バックアップをとるプログラムなんかは、コマンド・プロンプトを使って(かなり極小ではありますが、僕もWindows環境で作ってみたことあります。かなり幅の広い活用ができる言語なんでしょうね、シェルは。
 いつかは、UNIXサーバーでも立ち上げてみようという夢があるから、この先、どこかでシェルに出会うかもしれません。

 いろいろと情報ありがとうございます!!
 (トピックの話題から離れてしまいましたが…。。)
おさむさん

ウィンドウズではシェルと同じことを「バッチ」で行います。作られたのはこれかしら?

同様に複雑なことはできないのでvbscriptなどを用いていろいろ書きます。もちろんここでperlを使うのもあり。
 まさにそれだと思います。バッチに間違いないと思います。
現在も一太郎の単語登録ファイルのバックアップなんかは、自分で作ったバックアップソフトを使っています。(起動時に自動的に動くので、結構気に入ってます。)
 確かに複雑なことは全然できてません。こっちのフォルダーをあっちのフォルダーにコピーするというコマンドだけで作られているソフトですから。
 なるほど。そこにPerlを使うこともできるんだ…。。。

ログインすると、残り2件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

超初心者向けCGI講座 更新情報

超初心者向けCGI講座のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。