• ベストアンサー

ランダム表示スクリプトを改造したい

ランダムに画像を表示するソースなのですが、もう一歩進んでhtmファイルに張り付いている画像だけをランダムに変化させたいのです。 つまり例えば画像の下に説明文など表示させている場合、その説明文はそのまま表示させて画像だけを表示させるたびに変化させたいのですが、以下ソースを利用して改造することなどは可能でしょうか? ご教授のほど、どうぞよろしくお願い致します。 #!/usr/local/bin/perl @htm = ( "001.htm", "002.htm", "003.htm", "004.htm", "005.htm", "006.htm", "007.htm", "008.htm", "009.htm" ); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $n = @htm; $n = $sec%$n; print "Location: http://www.hogohoge.jp/$htm[$n]\n\n";

  • Perl
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.4

別の方法として、 <img src="hoge.cgi"> などとし、 hoge.cgiで目的の画像ファイルを読み込んで、「Content-type: image/jpeg」とともに出力する、ということでもできると思います。 サーバーの負荷は少し大きくなるでしょうけど。 http://park15.wakwak.com/~n_i/prog/cgi-img.html

tibox00
質問者

お礼

色々やってたら自分で出来ました! どうもありがとうございました!!

tibox00
質問者

補足

ご回答ありがとうございます! 上記URLのソースも試してみたいのですが、どのようにすれば良いでしょうか? 下にあった 「記述 <IMG SRC="http://~/cgi-bin/img.cgi">」は どこに記述して使用するのかよくわかりません。 お手数おかけしますが、順番をおって具体的にお教え頂けませんでしょうか?よろしくお願い致します。m(_)m

その他の回答 (3)

noname#199778
noname#199778
回答No.3

再び失礼します。 現状では何が直接の原因になっているのかちょっと推測しきれないところがあります。 SSIが問題なく動作しているとしたら、shtmlファイルの方の記述にミスはないでしょうか? もし記述にミスがないとしたら、サーバの設定やテストしているファイルの拡張子を見直す必要があるかもしれません。 とりあえず、ローカルサーバの設定でSSIを許容しているかどうかと、SSIとして認識する拡張子を設定しているかどうか(通常、SSIを実行させるファイルの拡張子として.shtmlを指定するのが一般的だと思います)、サーバの設定を見直してみて下さい。 また、SSIを実行させようとしているHTMLファイルの拡張子を、SSIを実行させるファイルとして設定してある拡張子に直してあるかどうかも確認してみて下さい。 そのファイルをSSIを実行するファイルとしてサーバが認識してくれない場合、SSIを呼び出す記述をしていても、サーバは反応してくれません。 (ローカルサーバを使って、テスト用のHTMLファイルをサーバから開き、そのページでブラウザからソースを表示させてみた時に、SSIを呼び出しているソースがコメント文としてそのまま表示されているとしたら、こちらが原因でしょう。 SSIを実行するファイルとしてサーバが認識していれば、そのSSIを呼び出している部分のコメント文は削除されているはずですので、もしブラウザからソースを表示させた時にそれが元のファイルのソースのままあった場合は、ファイルの拡張子を見直し、SSIが実行される拡張子に修正して下さい(あるいは、サーバの設定をその拡張子でSSIを実行させるように直してください)。) これらの点をもう既にクリアしていて、なお動かないという場合は、ちょっと原因がわかりかねます… その時は、ごめんなさい…

tibox00
質問者

お礼

ご丁寧なアドバイスありがとうございます。 お教え頂いた項目をチェックしてみたいと思います、どうもありがとうございました!

noname#199778
noname#199778
回答No.2

SSIでやる場合は、質問文のスクリプトを生かす形で改造するなら、とりあえずは以下のようにすればよいのではないかと思います。 #!/usr/local/bin/perl @imgs = ( "./001.jpg", "./002.jpg", "./003.jpg", "./004.jpg", "./005.jpg", "./006.jpg", "./007.jpg", "./008.jpg", "./009.jpg" ); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $n = @imgs; $n = $sec%$n; print "<img src=\"$imgs[$n]\">"; exit; これをplファイルかcgiファイルとして保存し、shtmlファイルの側から呼び出せば、複数の画像を自動で差し替えて表示させることができると思います。 一応、呼び出す側は「<!--#exec cmd="SSIの実行ファイルパス"-->」というソースになるはずです。 (SSIはこれまでまったく使った経験がないので、資料を見てテストしながら書いてみました。 不備があったらごめんなさい。) とりあえず、参考まで…

tibox00
質問者

補足

ご回答ありがとうございます!お手数おかけしてすいません。 ごめんなさい、ローカルで試してみたんですけど画像が表示されないみたいなんです。他のCGIで試したら呼び出せるのでSSIはちゃんと機能してるのですが・・。 パスも色々試してみたのですが、ローカルの同フォルダ内に画像を格納する場合画像パスは前の"./"は取って"001.jpg"でよろしいですよね・・? 何がいけないのでしょうか?

noname#199778
noname#199778
回答No.1

私自身Perlを扱う経験が浅いので、知識不足な点があるかもしれませんが… このスクリプトの場合、アクセスされた時間を基準にリダイレクト先のHTMLファイルを切り替えるスクリプトになると思うので、このスクリプトからはHTMLの内容に直接干渉していないために、目的のようにHTMLファイルの一部だけを変更させるということはできないのではないかと思います。 HTMLファイルの中身の一部のみを変更したいという場合は、CGIの側でHTMLを生成する必要があるのではないでしょうか。 HTMLファイルの表示内容の一部分を動的に変化させたいのであれば、HTML全体をCGIの側で動的に生成するか、SSIで画像を表示させる要素を挿入するか、あるいはクライアントサイドに依存してJavascriptで表示内容をランダムに変更させる方法をとる必要があるように思いますが、いかがでしょうか。 どうしてもこのスクリプトで対処するとしたら、同じ説明文・同じレイアウトで、表示している画像だけが違うHTMLファイルを複数用意して、それらのHTMLファイルにリダイレクトするような形にするという方法もありますが… 参考になれば… 見当違いでしたら、ごめんなさい。

tibox00
質問者

補足

分かりやすいご説明どうもありがとうございます! いくつか方法があるのですね、簡単なのはSSIでしょうか? SSI挿入でいちHTMLファイル内に複数画像をランダムに表示させることは可能でしょうか? もし可能ならそのスクリプト例をお教えください、よろしくお願い致します。

関連するQ&A

  • Perlでの Timeの足し算

    時間の足し算をやりたい。訳あってライブラリが使えません。 方法は無いでしょうか? 仮にライブラリが使えるなら、下記のようでうまく行っています。 --------------------------------------------------- use Time::Local; $year=2008; $mon =10; $mday=24; $hours = 23; $min = 0; $sec = 0; $time = timelocal($sec, $min, $hours, $mday, $mon - 1, $year); $a1=($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time ); $mytimeORG= sprintf("%04d/%02d/%02d %2d:%2d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytimeORG\n"; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time + 32400); #9H加算 $mytime9H= sprintf("%04d/%02d/%02d %02d:%02d", $year + 1900, $mon +1, $mday,$hour,$min); print "$mytime9H\n"; ---------------------------------------------

    • ベストアンサー
    • Perl
  • 変更時間を指定したい

    下記スクリプトのhtmの変更間隔を例えば30秒や15分などの時間単位で指定できるようにしたいのですが時間要素を改良することで可能でしょうか? もし可能ならそのソースの記述方法をお教えください。 #!/usr/local/bin/perl @htm = ( "001.htm", "002.htm", "003.htm", "004.htm", "005.htm", "006.htm", "007.htm", "008.htm", "009.htm", "010.htm" ); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $n = @htm; $n = $min%$n; print "Location: http://www.hoge.co.jp/hoge/$htm[$n]\n\n"; exit; ご教授のほど、どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • CGIについて(時間表示)

    CGI初心者ですが、掲示板を作成中です。投稿するたびにメッセージの投稿時間がすべて現在時刻に書き換わります。 メッセージ毎に時間表示させたいのですが、いかのプログラムのどこを変更すればよいのでしょうか?宜しくお願いいたします。 # 時間処理 sub totime { ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time); $year +=1900; $month++; $year = sprintf("%04d", $year); $month = sprintf("%02d", $month); $mday = sprintf("%02d", $mday); $hour = sprintf("%02d", $hour); $min = sprintf("%02d", $min); $sec = sprintf("%02d", $sec); $date = "$month/$mday $hour:$sec"; }

    • ベストアンサー
    • CGI
  • 日付求め

    お世話になります。 早速ですが、perlで以下のように 現在時刻を求め表示するロジックがあります。 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); $year=$year + 1900; $mon =$mon + 1; $date81 = "$year年$mon月$mday日($days[$wday])"; $date82 = "$hour時$min分$sec秒"; この時、 例えば今年末であれば、 2009年1月1日0時と表示されると思います。 これを2008年12月31日24時と表示したいのですが、 何か妙案はあるでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • ランダムスクリプトに時間要素を取り入れたい

    次のような時間要素を下記ソースに取り入れたいのです。 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $n = @imgs; $n = $sec%$n; つまり上記要素を下記ソースに組み込んで画像の変更間隔を秒や分などの時間単位で指定できるようにしたいのですが下記スクリプトを利用して可能でしょうか? #!/usr/local/bin/perl $imgdir="./rndimg/"; if(!opendir(DIR,$imgdir)){ print "Content-type: text/html\n\n"; print "Directory open error.\n"; exit(1);} @file=readdir(DIR); closedir(DIR); $k=0; foreach $fi (@file){ if($fi =~ /(.*)(\.jpg|\.gif)$/){++$k;}} srand();$a=int(rand($k));$j=0; for($i=0;$i<=$a;$j++){ if($file[$j] =~ /(.*)(\.jpg|\.gif)$/){++$i;}} open(IMAGE, "$imgdir$file[$j-1]"); binmode(IMAGE); $size=read(IMAGE,$image, -s IMAGE); close(IMAGE); if($f =~ /\.jpg$/){print "Content-type: image/jpeg\n\n";} else {print "Content-type: image/gif\n\n";} binmode(STDOUT); print $image; exit; 色々考えたのですがどうもよくわかりません。 ご教授のほどどうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • 掲示板への書き込み時間

    掲示板CGIについて質問です。 使おうとしているスクリプトはそのままアップロードすると書き込みした時間の表示が 「4/14 (Sun) 17:10」 のようになります。 これを 「2003 4/14 (日) 17:10:50」 のように年と秒まで加えたいのです。 それで後者のように表示される掲示板CGIを参考にしてみましたが、目立った違いはないように思え、どこをどう変更すれば年や秒まで表示されるようになるかわかりません。 思い当たる部分はこのあたりなのですが…。 ↓このように記述されています ************ $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year = sprintf("%02d",$year + 1900); $month = sprintf("%02d",$mon + 1); $mday = sprintf("%02d",$mday); if ( substr($month,0,1) == 0 ) { $month =~ s/0/ /; } if ( substr($mday,0,1) == 0 ) { $mday =~ s/0/ /; } $hour = sprintf("%02d",$hour); $min = sprintf("%02d",$min); $sec = sprintf("%02d",$sec); $youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; $date_now = "$month/$mday ($youbi) $hour:$min"; ************ CGIに手を加えてレイアウトの変更くらいはいつもやっています。 もし書き換える方法がありましたら教えていただければと思います。 どうぞよろしくお願い致します。

    • ベストアンサー
    • CGI
  • perl qw(aaa bbb ccc)[$hoge]のような記述

    my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $wday = sprintf("%s", qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]); 2行目のsprintfですが、qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]はどのようなことが行われているのでしょうか? sprintf("%s", "hello world!");みたいな基本的なものならsprintfの使い方はわかります。ですが、qw(aaa bbb ccc)[$hoge]のような記述についてがわかりません。 上記の例でいえば、どういう結果になるのかはわかるのですが、どういう過程で代入されているのかがわかりません。 qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]という書式はどういうことが行われているのか教えてください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • localtime()での時間差の計算の仕方

    $ENV{'TZ'} = "JST-9"; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); my $now =sprintf("%04d/%02d/%02d-%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min); とすると 2007/01/28-15:56 のようにデータとして取得できるのですが・・・ これと登録日($date=2006/12/31-12:25)との日数差の計算ができません $now-$date とすると年数のところしか計算できず1としか表示できません 登録7日後以降にイベントを発生させたいのですが計算ができないのでうまくいきません 両方time()でやれば$now-$date>604800 とすればなんとかできるのですが登録日は『2006/12/31-12:25』の形で使いたいのです 登録日と現在の日数の差の計算方法を教えてくださいm(--)m

    • ベストアンサー
    • CGI
  • ファイルのデータの半角スペースが削除できない

    プログラム(1)--------------------------------------------------- @youbi = ('日', '月', '火', '水', '木', '金', '土'); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; open(TIME,">ファイル名"); print TIME "${year}\n"; print TIME "${mon}\n"; ---省略--- close(TIME); プログラム(2)--------------------------------------------------- open(TIME,"ファイル名"); flock(TIME,1); @time=<TIME>; close(TIME); ------------------------------------------------------------- 以上のようなプログラムを使い時間を取得したのですが。 printしてみると、「2007 8 24」のように半角スペースが入ってしまいます。chomp();も試してみたのですが、どうにも削除できません。 どうやれば、半角スペースを削除出来るのでしょうか?もしくは、どうやれば半角スペースが入らないように保存、展開できるのでしょうか? 分かり難い質問かとは思いますが、ご返事お願い申し上げます。

    • ベストアンサー
    • Perl
  • perl print文で日本語表示するには

    perlのプログラムで use utf8が宣言されていない時(test1.pl)は、 print文で日本語が正しく表示されるのですが、 use utf8が宣言されている時(test2.pl)は、 print文で日本語が正しく表示されないかエラーになります。 encode('utf-8', $string)やencode('cp932', $string) も試してみましたがうまくいきませんでした。 どのようにすればよいでしょうか。 ---test1.pl------------------------------------------------ #!C:/perl/bin/perl use strict; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; my $string="$year年$mon月$mday日 $hour時$min分$sec秒\n"; print $string; ----------------------------------------------------------- 実行結果 OK 2018年12月26日 9時36分6秒 ----------------------------------------------------------- ---test2.pl------------------------------------------------ #!C:/perl/bin/perl use strict; use utf8; use Encode; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; my $string="$year年$mon月$mday日 $hour時$min分$sec秒\n"; print $string; #print encode('utf-8', $string); #print encode('cp932', $string); --------------------------------------------------- 実行結果 NG (PC1 Windows7 ActivePerl) Wide character in print at D:\test\test2.pl line 11. Global symbol "$year年" requires explicit package name (did you forget to declare "my $year年"?) at D:\test\test2.pl line 8. Global symbol "$mon月" requires explicit package name (did you forget to declare "my $mon月"?) at D:\test\test2.pl line 8. Global symbol "$mday日" requires explicit package name (did you forget to declare "my $mday日"?) at D:\test\test2.pl line 8. Global symbol "$hour時" requires explicit package name (did you forget to declare "my $hour時"?) at D:\test\test2.pl line 8. Global symbol "$min分" requires explicit package name (did you forget to declare "my $min分"?) at D:\test\test2.pl line 8. Global symbol "$sec秒" requires explicit package name (did you forget to declare "my $sec秒"?) at D:\test\test2.pl line 8. Execution of D:\test\test2.pl aborted due to compilation errors. ----------------------------------------------------- 実行結果 NG (PC2 Windows7 ActivePerl) Malformed UTF-8 character (unexpected continuation byte 0x94, with no precedingstart byte) at C:\test\test2.pl line 8. (略) Malformed UTF-8 character (unexpected continuation byte 0x95, with no precedingstart byte) at C:\test\test2.pl line 8. 2018 N12 26 9 5 4 b ----------------------------------------------------- 期待している実行結果 2018年12月26日 9時36分6秒 ----------------------------------------------------- よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう