ランダムスクリプトに時間要素を取り入れたい

このQ&Aのポイント
  • 次のような時間要素をソースコードに組み込み、画像の変更間隔を秒や分などの時間単位で指定できるようにしたいです。
  • 現在のスクリプトでは、ランダムに画像を表示していますが、時間要素を取り入れることで指定した時間ごとに画像を変更できるようになります。
  • 具体的には、ローカルタイムを取得し、画像の数で割った余りを使ってランダムな画像を選ぶようになります。
回答を見る
  • ベストアンサー

ランダムスクリプトに時間要素を取り入れたい

次のような時間要素を下記ソースに取り入れたいのです。 ($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
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

> これで試したのですがうまく表示されません。 試されたスクリプトには、元の readdir と closedir、open の行が残ってますので、そこも削除してください。 また、Content-Type の出力部分でファイルの拡張子を調べている部分も、「$f =~ 」から「$file[$a] =~ 」に変更してください。 #!/usr/local/bin/perl $n = 5; # 画像を変更する秒数 $imgdir="./rndimg/"; if(!opendir(DIR,$imgdir)){ print "Content-type: text/html\n\n"; print "Directory open error.\n"; exit(1);} $k = @file = grep /\.(?:jpg|gif)$/, readdir(DIR); closedir(DIR); $a = int(time / $n) % $k; open(IMAGE, "$imgdir$file[$a]"); binmode(IMAGE); $size=read(IMAGE,$image, -s IMAGE); close(IMAGE); if($file[$a] =~ /\.jpg$/){print "Content-type: image/jpeg\n\n";} else {print "Content-type: image/gif\n\n";} binmode(STDOUT); print $image; exit;

tibox00
質問者

補足

ご回答ありがとうございます!おかげさまで無事表示されました。 これは画像を変更する間隔を秒から時間にしたい場合、時間を秒に直して、例えば3時間後に画像を変更するに10800(秒)と書き換えればうまく機能するのでしょうか? よろしくお願いします。

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

> これは画像を変更する間隔を秒から時間にしたい場合、時間を秒に直して、例えば3時間後に画像を変更するに10800(秒)と書き換えればうまく機能するのでしょうか? はい、その通りです。 その際、  $n = 3 * 60 * 60; のように書いておくと分かりやすく間違いも減り、変更もしやすくなります。

tibox00
質問者

お礼

ご親切なご回答に感謝いたします! この度は分かりやすいご説明ありがとうございました。また機会がありましたらどうぞよろしくお願い致しますm(_)m

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

$n 秒単位で画像を順番に表示するならば、  $a=int(rand($k)); の代わりに  $a = int(time / $n) % $k; とすればOKです。 例えば5秒単位で変更するなら、事前に  $n = 5; としておきます。 localtime などで秒や分を取り出すのではなく、time の値を直接使うのがポイント。 ちなみに、@file には画像ファイルだけが入っている状態に加工してから処理すると、もっとラクできます。 ※以下は readdir(DIR) ~ open(IMAGE, ...) まで $k = @file = grep /\.(?:jpg|gif)$/, readdir(DIR); closedir(DIR); $a = int(time / $n) % $k; open(IMAGE, "$imgdir$file[$a]");

tibox00
質問者

補足

ご回答ありがとうございます! 以下のようにclosedir(DIR) ~ open(IMAGE, ...) の間をお教え頂いたソースに差し替えるだけでよいのでしょうか? #!/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 = @file = grep /\.(?:jpg|gif)$/, readdir(DIR); closedir(DIR); $a = int(time / $n) % $k; open(IMAGE, "$imgdir$file[$a]"); 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; これで試したのですがうまく表示されません。 時間単位で変更させる値はどの位置に挿入すればよいでしょうか? お手数おかけして申し訳ございません。初心者なもので具体的にソース表示の形にして教えて頂けますでしょうか?よろしくお願い致しますm(_)m

関連するQ&A

  • ランダムスクリプトの仕様を変更したい

    以下ソースはランダムに画像を差し替えるスクリプトですが、これを利用して画像ではなくhtmlファイルを差し替えるようにしたいのですが可能でしょうか? #!/usr/bin/perl $n = 3*60*60; # 画像を変更する秒数 $imgdir="./image/"; if(!opendir(DIR,$imgdir)){ print "Content-type: text/html\n\n"; print "Directory open error.\n"; exit(1);} $k = @file = grep /\.(?:jpg|gif)$/, readdir(DIR); closedir(DIR); $a = int(time / $n) % $k; open(IMAGE, "$imgdir$file[$a]"); binmode(IMAGE); $size=read(IMAGE,$image, -s IMAGE); close(IMAGE); if($file[$a] =~ /\.jpg$/){print "Content-type: image/jpeg\n\n";} else {print "Content-type: image/gif\n\n";} binmode(STDOUT); print $image; exit; ど素人なもので試行錯誤しております(汗)。どうぞよろしくお願い致します。m(_)m

  • perl初心者 「カウンタ」の2

    「とほほ」さんのgif画像連結ライブラリを使ってカウンタを作成中、行き詰ってしまいました。 下のスクリプトはあるサイトで配布されているカウンタのスクリプトの一部です。 1 while (length($count) < $fig) { $count = '0' . $count; } 2 $length = length($count); 3 @GIF=(); 4 foreach (0 .. $length-1) { 5 $n = substr($count,$_,1); 6 push(@GIF, "$imgdir/$n\.gif"); 7 } 8 9 print "Content-type: image/gif\n\n"; 10 binmode(STDOUT); 11 print &gifcat'gifcat(@GIF); * $figはカウンタ表示桁数です。 * $imgdirはカウンタ画像のディレクトリです。 このスクリプトを組み込んだらうまいことカウンタを表示することができました。 でもスクリプトの理解ができず悩んでいます。 お暇がありましたらぜひ教えてください。

  • perl-cgiのリネームについて

    Perl-CGIで ABCという、ディレクトリの中のファイルの名前を、ランダムな名前に変換したいのですがうまくいきません。 これを動作させるたびになぜか、どんどんファイルが減っていってしまいます。 どなたか、教えていただけないでしょうか? 宜しくお願い致します。 #!/usr/local/bin/perl print "Content-Type: text/plain\n\n"; $| = 1; my ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); my ($nowtime) = sprintf("%02d_%02d_%02d_%02d_%02d_",$year+1900,$mon+1,$mday,$hour,$min,$sec); #ディレクトリのファイル個数を記録する $dir = "./ABC/"; # ← ディレクトリを変数にセットする opendir DIR, $dir; @files = grep { !m/^(\.|\.\.)$/g } readdir DIR; # ← 「.」 「..」 以外のファイルを取得 close DIR; srand; for (my $i = @files; --$i; ) { my $j = int rand ($i + 1); next if $i == $j; @files[$i, $j] = @files[$j, $i]; } $num = 0; use File::Copy; foreach(@files){ $getpath = "$dir"."$_"; if( copy($getpath, "$dir".$nowtime.$num++.'.dat') eq 1){ $num++; unlink($getpath);}else{print "Copy Error"; exit;} }

    • ベストアンサー
    • CGI
  • perlで画像表示

    htmlファイルから<img src="./aa.cgi">と書いて連続した画像を表示させたいのですが @aa =(1,2,3); foreach(@aa){ open(IMG, "./$_.gif"); binmode(IMG); binmode(STDOUT); print "Content-type: image/gif\n\n"; read(IMG, $img, 1024); print $img; close(IMG); } こう書いたらだめなのでしょうか?

    • ベストアンサー
    • Perl
  • フォルダの画像一覧

    下記の画像一覧のcgiを下位フォルダをリンク表示して下位フォルダにも進んでいけるようにしたいのですが、どのようにしたらよいでしょうか。下記も教えていただいたものを利用している素人です。よろしくお願いいたします。 $width_height = 'WIDTH=40 HEIGHT=55'; $dir = './'; #################### print "Content-type: text/html;CHARSET=x-sjis\n\n"; print "$dir の jpg一覧<P>\n"; print "<TABLE BORDER>\n"; print "<TR><TH>イメージ<TH>ファイル名<TH>サイズ(k)\n"; opendir(DIR, "$dir"); while ($_ = readdir(DIR)) { if (substr($_,-4,4) eq "\.jpg") { # jpgだけ出力 ($size) = (stat("$dir/$_"))[7]; # ファイルサイズ所得 print "<TR>"; print "<TD><A HREF=\"$dir/$_\" TARGET=\"jpg\"><IMG SRC=\"$dir/$_\" $width_height></A>"; # 画像(リンクあり) print "<TD><A HREF=\"$dir/$_\" TARGET=\"jpg\">$_</A>"; # ファイル名(リンクあり) print "<TD ALIGN=RIGHT>$size\n"; # サイズ } } closedir(DIR); print "</TABLE>\n"; exit:

    • ベストアンサー
    • Perl
  • ファイル一覧表示で、ディレクトリを非表示

    ディレクトリ内の画像ファイルの一覧を表示させたいです。 検索したところ、以下の物を発見しました。 #!/usr/bin/perl $filename=$ENV{QUERY_STRING}; $lookdir = "../../image/event/"; $mime{html}="text/html"; $mime{htm}="text/html"; $mime{txt}="text/plain"; $mime{jpg}="image/jpeg"; if($filename eq '') { print "Content-type: text/html\n\n"; print "<html><body>\n"; opendir(DIR,"../../image/event/"); while($dir=readdir(DIR)) { print "<a href=\"$lookdir$dir\">$dir</a><br>\n"; } closedir(DIR); print "</body></html>\n"; } else { $ext=$filename; $ext=~s/.*\.//g; if($mime{$ext} ne '') { print "Content-type: $mime{$ext}\n\n"; open(R,$filename); print <R>; close(R); } } これで、ほぼOKなのですが、"."や".."が表示されてしまってます。 これを消したいのですが、良い方法は無いでしょうか?

    • ベストアンサー
    • Perl
  • HTMLのファイルにCGI処理結果を表示する

    まずトップページはhtmlで作ります。 そのトップページにいつも変化する所があるのでcgiで処理を施したものをhtmlに貼り付けたいと思っています。 その場合に例えば画像を出力させる場合は <IMG src="cgi-local/top.cgi"> で指定し、 #!/usr/local/bin/perl print "Content-type: image/jpeg\n\n"; open FH,"<../image.jpg"; binmode FH; binmode STDOUT; print while(<FH>); close FH; をやれば動かせますが、これを画像ではなくhtmlを表示させるためには print "Content-type: image/jpeg\n\n"; を print "Content-type: text/html\n\n"; に変更する事により可能だと思いやってみたのですが、うまく出力できませんでした。 cgi処理をうまくhtmlに貼り付ける方法があるのでしょうか。どうか教えて頂けないでしょうか?お願します。(涙)

    • ベストアンサー
    • CGI
  • 普通の html に cgi を使って画像を・・

    ソースお手本表を見ながら質問タイトルのようなことをやりたいと思いました。 結果はHTMLを実行すると通信が1分から3分ぐらい通信を行い、最後には画像を表示しないようなります。 どこがおかしいのかおしえていただけないでしょうか? どうかお願いします。 ------------------------------------------------ #!/usr/local/bin/perl #use DBI; print "Content-type: image/jpeg\n\n"; open FH,"<image.jpg"; binmode FH; binmode STDOUT; print while(FH); close FH; ------------------------------------------------

    • 締切済み
    • CGI
  • cgiで動画ファイルをアップロードするには?

    みなさん、はじめまして。 私は今、HP製作中のおやじです。 昨日、フリーのCGIダウンロードしました。 このCGIは、PC上のJPG、GIFファイルを自動で連番.JPG,連番.GIFという具合に元のファイル名を連番にしてサーバーにアップロードしてくれる「日記帳的」CGIです。 *そこでチョット加工してWORD,EXCELファイルもアップロード出来る様にしました。 *ついでに動画ファイル(MPG,AVI,MOV)も アップロード出来る様にしたいのですが、どうしたらいいのか解かりません。この辺がもうおやじの限界です。 どなたか、ヘルプお願いいたします。 *ちなみにCGIソースはこうなっています。  これだけでわかるでしょうか? sub img { $type = ''; foreach (@in) { if ($_ =~ /Content-type:(.+)/i) { if ($1 =~ /image\/.*jpg/i) {$type = 'jpg';} elsif ($1 =~ /image\/gif/i) {$type = 'gif';} elsif ($1 =~ /msword/i) {$type = 'doc';} elsif ($1 =~ /ms-excel/i) {$type = 'xls';} elsif ($1 =~ /pdf/i) {$type = 'pdf';} last; } } if (!$type) {&error("このファイルはアップロードできません");} $img_file = "$_[0].$type"; open(OUT,">$img_file") || &error("画像ファイルを作成できません"); binmode OUT; print OUT $in{'img'}; close OUT; chmod (0666,$img_file); } ---------以上--------------------------------

    • ベストアンサー
    • CGI
  • 画像のランダム表示

    初心者です。。 画像のランダム表示で、下のものを使っているのですが、 画像の上にカーソルをもっていったときに手のマークにしたいのですが、 どのようにすればできるのでしょうか? onclickを使っているからだと思うのですが、 A href=を使えばできるのでしょうか? よろしくお願いします。 <script type="text/javascript"> <!-- var imgs = new Array; var n = 5; var i; for(i=0;i<n;i++){ imgs[i] = new Image(); } imgs[0].src="image/001.jpg"; imgs[1].src="image/002.jpg"; imgs[2].src="image/003.jpg"; imgs[3].src="image/004.jpg"; imgs[4].src="image/005.jpg"; function disp(img){ img.src=imgs[Math.round(Math.random()*(n-1))].src; } //--> </script> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> </head> <body> <div align="center"> <img src="image/001.jpg" border="0" onclick="disp(this)"> </div> </body> </html>