【Perl】初心者コーナー Part19
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/01/11 13:52ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
あとは>>2-10にまかせた。
00329
03/01/11 15:52ID:???アイディアありがとう御座います。
でも、多くの人に連打される状況下にあるのでちょっと難しいかも…
で、ちょっと考えてみました。
最後のワガママです。
------------------
srand(ここを適当に考えてほしいです);
$aaa = rand;
srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
↑この中に$aaaを追加したいのですが、記述の意味が俺にはイマイチ理解出来ないので考えてほしいです。
------------------
以上。
すごくワガママですが、お願いします。
00339
03/01/11 16:27ID:???>>28
>>同じ条件下で1000回以上「1-100」の整数を求めた時、
>>「連続して同じ数字が出ない」
↓
>矛盾はしてない気がする。千なり一万なり生成して連続して同じ数字が出ない
>様な乱数系列ってほとんどあり得ないと思うんだが。
そうですね。
例えば、1回で1/100になるのだから、
1000回やると
(1/100)×(1000)
って事になります。
結果的に、1000回ループした場合、同じ数字が連続して出るのは「10回前後」と言うのが
もっとも効率が良いランダムって事になります。
そして、それが全然満たされていないのが現状です。
これを言いたかったのです。
0034nobodyさん
03/01/11 16:35ID:???それが意味ないってまだわからないか?
最初のsrandが変わらなければ、$aaaも同じ数字にしかならない。
記述の意味が理解できないってなら、自分で検索するなり何なりで調べろ。
駱駝本買うって言ったなら買って読め。
いい加減しつこい。
0035nobodyさん
03/01/11 16:37ID:???次に実行される時点で時間とプロセスIDがそれぞれ1ずつ増加することになるケースが考えられます。
このようなケースでは、結果 x^y == (X+1)^(Y+1) ということになり、1/3 のかくりつで同じ数が発生することになります。
引用:CGI&Perlポケットリファレンス P.223 TIPSより
(藤田郁、三島俊司著 技術評論社 発行 ISBN-4-7741-0755-7 C3055)
要因はこれのようですね。
0036nobodyさん
03/01/11 16:42ID:???っていうのはどうだろう?
if ($$%10 == 0) { srand( time + $$); }
if ($$%10 == 1) { srand( sin(time + $$)); }
if ($$%10 == 2) { srand( cos(time ^ $$)); }
みたいな。
0037nobodyさん
03/01/11 16:45ID:???いいえ?
少なくともダブルクリック時には変わりますよ?
それと、統計を取ったわけじゃわりませんが、
同じsrandを繰り返しても必ず同じ結果になるわけではありません。
>>32のは分岐点を増やす意義があります。
あと、実際の記述を1つも書いていないのにしつこいとははちょっと…。
答えたくないのなら無視していればどうかと…。
>>35
そうです。
俺のもだいたい1/3くらいでした。
そこで提案したのが>>32なのですが、実際の記述方法が分からないため、
2ちゃんねらーの方々の知恵を借りようと思ってやってきました。
00389
03/01/11 16:49ID:???>>36
$$とはなんでしょうか?
すみません頭弱くて。
連打アクセスでもランダム性が保持出来るのなら、ありがたくちょうだいいたします。
0039nobodyさん
03/01/11 16:53ID:???>>37の突っ込みで思わず笑ってしまった。
>>34記述が書けないならレスするな。
1回も答えてないのにしつこいって…。久々にワラタよ。
0040nobodyさん
03/01/11 16:54ID:???「$$」は、特殊変数です。
んーPerl関連の書籍とかには載っているかと思うけれど(苦笑)
いわゆる、PID、自身のスクリプトがPerlで実行されたときに付与される起動プロセス番号です。(UNIX系のみ?)
0041nobodyさん
03/01/11 16:54ID:???統計を取らない。
実際の記述を出さない。
だから嫌われるのがわからんのか?
1万行あるってなら、txtにしてアプしろよ。
そもそもお前は聞いてばかりで自分で調べようとしてないじゃないか。
まずはsrandやrandが具体的にどういう効果を持っているかも未だに理解してないんだろ?
これだけやりとりして、その間、お前は聞くばかりで自分で調べようとしていない。
1から10までここで聞く気か?
>同じsrandを繰り返しても必ず同じ結果になるわけではありません。
同じ定数なら確実に同じ数値が返る。
お前が言ってるのは、時間などの変化のある数字を使っているから、
srandに渡される数値が変わって、結果的に異なる初期化方法になってるだけ。
つまり、最初のsrandで確実に異なる数値を渡せるなら、その後に$aaaを
使ってsrandしなおす必要はないだろ?
最初のsrandが同じになる → $aaaも同じになる → 2度目のsrandも同じ結果になる
最初のsrandが異なる結果になる → 2度目のsrandをする必要がない
これくらい消防でもわかるわ。
今まで答えて損した気分だ。
宿題は自分で考えな。
0042前スレ998=12=13=21=23=34=41
03/01/11 17:00ID:???結構レスしてると思うんだけどね?
00439
03/01/11 17:05ID:???いえ、別に答えてないとまでは…
>最初のsrandが同じになる → $aaaも同じになる → 2度目のsrandも同じ結果になる
ええと、
連打アクセスでも最初のsrandは同じになるのでしょうか?
分かりました。
srandを調べてみます。
>>40
ありがとうございます。
その方法を一度テストしてみますm(__)m
0045yani ◆saNSktNEdQ
03/01/11 17:14ID:umfOb+ixtime ^ $$ ^ unpack "%L*", `ps axww | gzip`
は何回やっても重複しなかったな。
(毎秒20回以上になると、俺のボロマシンでは重くて「同時」にならない)
ただ、ps とか gzip 起動しているからその分、ちょっとプロセス数を増やして行くと
、Resource temporary unavailableがすぐに出る。
そのときに件の式がどういう挙動しているかはよく分からない。
Perl5自身に任したほうが良いような気がするな。
0046nobodyさん
03/01/11 17:23ID:???言い方悪かったな。
要するにお前は、同じ乱数が出るから困ってるんだろ?
その原因はsrandであると。
同じ順番で乱数が出てる時は、srandが同一である可能性が高いんだよ。
>35さんの言うやり方なら、1/3で同じってことか。
お前さんがやりたいのは、その「1/3の確率で同じになった時に、
別の乱数になるようにしたい」って事じゃないのか?
つまり、その時点ですでにsrandは同じわけだよな。
だとしたら、$aaaに出てくる数字も同じ、その後のsrandも同じになるわけ。
わかる?
連打アクセスの場合はプロセスIDが異なるから同じにならない事がある。
ただ、それでも同じになる場合があるから困ってるんでしょ?
本気で覚えたいなら、srandとrandの事を自分できちんと覚えるしかないのさ。
検索なりなんなりでそういう説明ページ探したか?
そういう努力をしようという姿勢が見えないって事。
こっちだってsrandやrandの説明からまでは付き合えんって事さ。
そこまで回答者に説明させる気?
それくらい自分で調べてから聞いてくれと。
最後に俺の駱駝本に載ってたやり方を参考までに載せとく。
srand(time ^ ($$ + ($$<<15)));
場合によるが、Webサーバー上のCGIであり、同一人物の同時アクセスを想定しないなら、
IPアドレスなりUSER_AGENTなりを式に組み込む手もある。
0047nobodyさん
03/01/11 17:27ID:???ってどうやってやるんですか?
F5連打じゃないっすよね?telnet?専用クライアントでもあるんでしょうか?
0048yani ◆saNSktNEdQ
03/01/11 17:31ID:85OU0JtJ子プロセス20個起動して、ある時刻に一斉に件の式をprint
0049nobodyさん
03/01/11 18:02ID:???>子プロセス20個起動
がすでにわからん。これはどういうところ勉強すればいいんでしょう?
0050nobodyさん
03/01/11 18:33ID:???ttp://www.google.com/search?as_q=perl+%E5%AD%90%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9+%E8%B5%B7%E5%8B%95&num=100&hl=ja&ie=UTF-8&oe=UTF-8&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja&as_ft=i&as_qdr=all&as_occt=any&as_dt=i
こうやって検索すると
tp://mind.f.fiw-web.net/program/perl/tips0301.html
こんなページが見つかる。
0051nobodyさん
03/01/11 19:47ID:???っていうか掲示板なんだから、自分以外にも利益がある(可能性がある)
ことを書けや。。出来ないなら出て行け。
はっきり言わせてもらうと、おまえより賢いやつはこの板には沢山いる。
自分の間違いに気づけ。そして、勘違い発言を増殖させるな。
0052nobodyさん
03/01/11 20:48ID:L83LO6Ji例えば、"<B>hoge</B><B>fuge</B>"
っていうので、hogeってとこだけをまず取りたいのですが、何も考えないで書くと
hoge</B><B>fugeが取れてしまって困っています。何か上手い書き方があったら教えて
下さい。
意味不明だったらすみません。
0053nobodyさん
03/01/11 20:52ID:???正規表現に最小のマッチングというのがある。
調べてみ。
それよりも"<B>hoge<B>hage</B>hige</B>"という文字列だったらどういう処理にするつもり?
それによってかなりやり方が変わるから。
0054nobodyさん
03/01/11 20:59ID:???ありがとうございます!
調べた結果、?を一文字つけるだけで解決できました。
入れ子構造になってるのは・・難しそうだから考えないようにしようかなと思ってます・・。
005554
03/01/11 21:02ID:???hoge<B>hage</B>higeが取れれば、やれることが広がるので、
上手く書く書き方がありましたら教えて頂けると嬉しいです。
0056nobodyさん
03/01/11 21:12ID:???タグでネストは無いと思いますが…。
# 閉じ忘れはあるかもしれないですが。
00599
03/01/11 21:54ID:???イロイロ調べた後に実験しました。
$$は、別に混雑してようとしてまいと関係なく、連打なら「1づつしか増えませんでした」
まだしっかりとsrandの性質を理解出来てないのかもしれませんが、やはりこれに原因があるのではないかと考えます。
で、皆様の書き込みを参考に以下の記述を作ってみました。
-----------------
if ($$ % 2 == 0) { srand(time); }
if ($$ % 2 == 1) { srand($$); }
#↑1づつ増えるた時に困るのだから、奇数か偶数によって変える。
$rand_a = int(rand(9999));
$rand_b = int(rand(9999));
$rand_aa = (time - $rand_a);
$rand_bb = ($$ + $rand_b);
#↑「time」と「$$」は、時間が近いととても似た数字になるため適当に変える。
srand($rand_aa ^ $rand_bb ^ unpack "%L*", `ps axww | gzip`);
#最後にこれを置いて完成。
---------------------
まだこれのテストはしてませんが、取り敢えず完成したので報告しに来ました。
また、問題な点があれば教えて下さい。
0060nobodyさん
03/01/11 21:56ID:???それはまた難しいぞ。
"<B>hoge<B>hage</B>hige</B>fuge</B>"の時はどうするかとか。
"hoge<B>hage</B>hige"でいいのか、"hoge<B>hage</B>hige</B>fuge"まで取るべきか。
>56
プログラマーはユーザーがどんな意表をついた入力をしても大丈夫なようにシステムを考えないといけない。
そういうところで気を抜くとセキュリティホールができたりしちゃうからね。
0061nobodyさん
03/01/11 22:05ID:???みんなが、まともなブラウザ、まともな思考回路を持っているとは限らない。
あと、一番忘れやすいのは、$ENV{HTTP_*}は汚染されているということ。
$ENV{HTTP_USER_AGENT}とかは特に。これをタグの無効化をせずにHTMLでの
出力に使ったりすると、クロスサイトスクリプティングちゅーやつが発生する。
0062nobodyさん
03/01/11 23:05ID:???いやあのそのどのこの、srand を2回以上やっても(以下略^^;)
> if ($$ % 2 == 0) { srand(time); }
> if ($$ % 2 == 1) { srand($$); }
> #↑1づつ増えるた時に困るのだから、奇数か偶数によって変える。
1秒間に3回以上アクセスがあると、$$%2 == 0 の時は重複しまつ。ので却下(^-^*)
そもそも、time ^ $$ に問題があるので、この部分をえろえろと変えてみればどないでし?
例えば・・・
my $pid = $$;
srand((time & 0xFFFF) ^ (($pid << 8) | ($pid & 0x00FF) ^ 0xFFFF));
とか。
(65536通りの種。同位置時刻に複数アクセスがあっても、PIDを奇数と偶数バイトを入れ替えてからビット反転しているので、連続した種は256以上のアクセスが来たとき以外は出てこない。ん?あってるのか?)
ところでPerlに、ビットのローテートできる演算子ってあるのかな?無いのかな?
0063nobodyさん
03/01/11 23:39ID:???びっとのローテートは >> << だよん。
$unko>>1 で、1さんに……じゃなくて、$unkoを右に1ビットシフト。空いたビットは0で埋め立て。
しかしまぁ、以前にも「完全な乱数は無理」ってレスがあったはずなのに、しつこいのがいるね。
コンピューターの作る乱数なんぞ「計算」で求めてるにすぎないのだから、いくら種を工夫した
ところで、分布に偏りができてしまうのは仕方が無い。
00649は必ず読むこと。
03/01/12 00:07ID:pN++dQ77Crypt::Randomになるのかな。他にもあるかも。
>>9にはこれをseedに使うことを勧める。ゲームのためにコストのかかる乱数
を作るのは、もったいないと思うけど。
それに、おそらく標準のrand()の線形合同法(?)の周期も気になるだろうから、
Math::Random::MT(究極の擬似乱数生成のモジュール)も併せて使っていただきたい。
FreeBSDなら、rndcontrolでIRQを設定しておかないと、/dev/randomのエントロピープール(?)
がなかなかたまらないから注意すること。
0065nobodyさん
03/01/12 00:25ID:???open(MD5FILE,">$md5datefile");
my $data = "";
sysopen(RANDOM, "/dev/random", O_READ) || die "cannot open /dev/random $!\n";
sysread(RANDOM, $data, 16);
close(RANDOM);
print MD5FILE "$MD5DATE<>$data";
close(MD5FILE);
$md5->add($data);
bbs.cgi(2ch) での ID 生成ルーチンの中で、こんなことをやっているのがありますた。
参考程度に。
0066nobodyさん
03/01/12 00:30ID:pN++dQ77これでは満足できないでしょ。
0067nobodyさん
03/01/12 01:35ID:???0068貧乏パーラー
03/01/12 02:48ID:???rep.plとして作成
-----
while(<STDIN>) {
print eval($_)."\n";
print $@ if ($@);
}
1;
-----------
これで
perl rep.plで起動し
試したい式を入れれば評価結果が表示猿。
0070nobodyさん
03/01/12 11:57ID:oJAGmVM6ってやったら、この$aは暗黙で $main::a と扱われるんだよね?
じゃあ
my $a = 'グローバル変数です';
for(0..10){
my $a = 'これはfor内のローカル変数です';
}
ってやった場合、もちろんこのふたつの$aは区別されると思うけど、
forの外にあるのは $main::a
じゃあfor内の$aは何? これも暗黙のうちに $main::a になるの?
0071nobodyさん
03/01/12 12:19ID:tUI5W5YDフルパスからファイル名だけを取り出す方法が分かりません。
OSによって:\/など区切りが違いますけど
どうやって取り出せばいいのでしょうか?
0073nobodyさん
03/01/12 12:25ID:eJ8Igs3Eきてるとします、それでその人数を、b.htmに表示したいんです。
それでhttp://shena.myako.net/strangelady/cgijs/imakoko/imakoko.html
っていうのをみつけたんですがこれはa.htmにきている人数をa.htmにしか表示できないみたい
なんです、このスクリプトを変更してb.htmにでも人数を表示するということはできませんか?
もしそういうことができるなら誰かアドバイスください★
0074nobodyさん
03/01/12 12:30ID:???$fullpath = 'c:\hoge/hoge:hoge\aaa.ccc';
($file) = $fullpath =~ m|([^:\\/]*$)|;
print $file;
0076nobodyさん
03/01/12 12:54ID:pN++dQ77our $a;なら、そうなる。
00779
03/01/12 12:57ID:???イロイロありがとうございます。
モジュールについても調べて(探して)みてます。
(英語に苦戦してますが…)
それと
>それに、おそらく標準のrand()の線形合同法(?)の周期も気になるだろうから、
これについても、testしてみましたが、そのようです。
わざわざご丁寧にありがとうございました。
日頃からほとんどモジュールを使わないのに加えて、複数調べているので理解に時間がかかりそうですが、
解決できそうな感じです。
とても勉強になりました。(イロイロな意味で)
007871
03/01/12 13:01ID:tUI5W5YDありがとうございました。
無事取得できました。
0079nobodyさん
03/01/12 13:12ID:???> $unko >> 1 で、1さんに……じゃなくて、$unkoを右に1ビットシフト。空いたビットは0で埋め立て。
いやあのそのそれだと「ビットシフト」なのではないかと(苦笑)
01001011 RightRoll.b ===> 10100101
なんて具合になるのがあればと(苦笑)@キャリーフラグが立ってもよい(笑)
> ところで、分布に偏りができてしまうのは仕方が無い。
それをどれだけうまく誤魔化せるかが思案のしどころですヨね(^-^*)
>>77
エロエロがんばってくらさいです(^-^)
0080nobodyさん
03/01/12 13:28ID:eJ8Igs3Eすみません。
マルチポストってマナー違反ってしりませんでした。
ごめんなさい。
0081nobodyさん
03/01/12 13:34ID:5wjAToqi川o・-・)ノ <先生!こんなのがありました!
__/ / /
\(_ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄||
...|| ̄ ̄ ̄ ̄||
http://web2001.kakiko.com/koma/
008258
03/01/12 13:54ID:???まったくその通りでした。
<div><div><div></div></div></div>
<div><div><p></p></div></div>
等が正しいです。
008463
03/01/12 22:24ID:???うわっ!おっしゃる通り、シフトとローテートを勘違いしてますた!(恥ずかしい…)
ビット演算子を駆使すればローテートは実現可能だけど、あんまりスマートじゃない。
Perlにもキャリーフラグがあればなあ(w
0085nobody
03/01/13 11:10ID:CGEjRZ/e質問させてください。
@a,@b,@cという3つの配列があり、全部の値をどの配列から渡されたかわかるように
1つの関数に渡したいのですが渡し方がわかりません。
なお、配列の要素数は場合によって変動します(0〜20程度)。
どなたか、上手い方法をご教授願えますでしょうか。
0086nobodyさん
03/01/13 11:26ID:???0087nobodyさん
03/01/13 11:27ID:eXLsypXqhttp://dx1.kakiko.com/sonota/335/3352/index.html
0088nobodyさん
03/01/13 12:08ID:???my @a = ('A', 'B', 'C');
my @b = ('a', 'b', 'c');
my @c = ('11', '2', '3');
&abc(C => \@c, B => \@b);
sub abc
{
my %abc = (
A => undef,
B => undef,
C => undef,
@_
);
print "@{$abc{A}}\n"; # undef
print "@{$abc{B}}\n"; # a b c
print "${$abc{C}}[1]\n"; # 2
}
0089nobodyさん
03/01/13 12:24ID:???こっちの方が要望に近いのかな?
my @a = ('A', 'B', 'C');
my @b = ('a', 'b', 'c');
my @c = ('1', '2', '3');
&abc2('b', @b); # array=b a b c
&abc2('a', @a); # array=a A B C
&abc2('c', @c); # array=c 1 2 3
sub abc2
{
my $ary = shift;
my @abc = @_;
print "array=$ary @abc\n";
}
0090nobodyさん
03/01/13 12:53ID:W4AV/IuUそれは違うじゃろ。
&hoge(@a, @b, @c);とかやって、混ざってしまうから、困ったんだと思う。
じゃあもう一つ提案。凝った事をしてあるのは、-wで怒られないようにするため
sub abc3 {
my ($a, $b, $c) = @_;
my @a = (ref $a ? @$a : undef);
my @b = (ref $b ? @$b : undef);
my @c = (ref $c ? @$c : undef);
}
&abc3(\@a, \@b, undef); #アドレスをそのまま渡す。参照渡し?
&abc3([ @a ], undef, [ @b ]); #コピーを作って渡す
0092nobodyさん
03/01/13 14:26ID:???open(〜)||〜;
で後者には $hogehoge = 1; とかは掛けないのでしょうか?
一応自分でやった限りは dieとexit と &hogehoge 等のサブルーチン
しか使えませんでした。
0094nobodyさん
03/01/13 14:48ID:???ちなみに優先順位の違いです
open(〜) || $hogehoge = 1;
は
(open(〜) || $hogehoge) = 1;
となり
orは=より優先順位が低いので
open(〜) || ($hogehoge = 1);
と同じになります。。
0095nobodyさん
03/01/13 20:39ID:vdJkNLtHCGI_Lite.pmを使ってファイルのアップロードをさせたいのですがわからないところがあります。
$upload = new CGI_Lite;
、、、略
$filename = $upload->filter_filename(\&conv);
$upload->close_all_files;
%dat = $upload->parse_form_data;
でとりあえずファイルがアップロードされる事はわかりました。
<FORM ACTION="up.cgi" ENCTYPE="multipart/form-data" METHOD="POST">
<INPUT TYPE="text" NAME="Text">
<INPUT TYPE="file" NAME="File">
<INPUT TYPE="submit" VALUE="送信">
</FORM>
フォームの部分をこのようにしてみたのですが、この場合textに入力した文字はどのような処理がされるのですか?
一応$dat{Text}で取り出せることは確認できたのですが、Fileの方とは別の処理になるのでしょうか?
よろしくお願いします。
0096nobodyさん
03/01/13 21:48ID:7xzy2NEr/:\.____\
|: ̄\(∩´∀`) \ <先生!こんなのがありました!
|:在 |: ̄ ̄ U ̄:|
http://saitama.gasuki.com/mona/
0097nobody
03/01/13 23:16ID:CGEjRZ/erefを使えばいいのですね。
調べて使って行こうと思います。
質問の言葉が足りない中、正確に類推してくださった90さんには
格別の感謝を。
他の方々もありがとうございました。
0098貧乏パーラー
03/01/13 23:31ID:???----ここから
_=_
_=_ Part 001 of 001 of file testdbi.zip
_=_
begin 666 testdbi.zip
M4$L#!!0````(`."Z+"YQ\[Y:G0```-,````*````=&5S=&1B:2YP;"V.L0K"
M,!"&]T+?X2@=4C!@=2P)*H*X.KAHD9I>24#2D*94D;Z[B>EP</]]W\$_#@C'
MP[E*D[Q]:I;O+Z?K;5W'+)E'E(M>:Q2.!&,5C;)>EDU=!'=PDH4'RHU%TU@D
M$6__6'5`@D(YOE&,#@OXI@E,4KV0[&P_L4@[=$+Z^&BL;3Y1`C!6:0=9\.XZ
MJ\)M3I,Y-J2\5<-2T*/2SP]02P$"%``4````"`#@NBPN<?.^6IT```#3````
M"@`````````!`"``MH$`````=&5S=&1B:2YP;%!+!08``````0`!`#@```#%
%````````
`
end
----ここまで
0099yani ◆saNSktNEdQ
03/01/13 23:33ID:ziR7v8Q2$seed = unpack "%L*", md5(join '.', gettimeofday, $$, `ps axww |gzip`);
というのはどうだろう。
実用的にはには
$seed = unpack "%L*", md5(join '.', gettimeofday);
で十分なようで、こちらのほうが相当速い。
# Time::HiRes, Digest::MD5とも perl5では標準モジュール
問題は$seedが16bit整数になることだが、、、なぜだ???
0100yani ◆saNSktNEdQ
03/01/13 23:34ID:ziR7v8Q2◯ # Time::HiRes, Digest::MD5とも perl5.8では標準モジュール
010190
03/01/13 23:35ID:W4AV/IuU渡しちゃうとコンパイルエラーになる・・。あと三項演算子の優先順位
をちゃんと理解していなかったから、無駄な括弧が・・
修正版:
sub abc3 {
my ($a, $b, $c) = @_;
my @a = ref $a eq 'ARRAY' ? @$a : undef;
my @b = ref $b eq 'ARRAY' ? @$b : undef;
my @c = ref $c eq 'ARRAY' ? @$c : undef;
}
010290
03/01/13 23:42ID:???0104nobodyさん
03/01/14 00:21ID:uaEPu1zEプログラムを書いているのですが、
初めてアップロードする場合はよいのですが、
ファイルを書き換える(上書き)時、
どうも、ブラウザのキャッシュが悪さをしているようで
ファイル上では書き変わっているのに、ブラウザ表示上では
以前の画像ファイルが表示されてしまう事があります。
(この場合何度かリロードしないと本来のファイルを表示してくれません)
これを、書き換えた後はキャッシュを利用しないようには出来ないでしょうか?
0105nobodyさん
03/01/14 00:25ID:yqTa2j5Q0106yani ◆saNSktNEdQ
03/01/14 01:29ID:HMXRNLis事故レス
当たり前だった。
0108nobodyさん
03/01/14 02:49ID:???ファイル名にtimeのクエリを取り付けるとよかと。
(ただし、JavaScriptかSSIが必要)
読み込みたい画像が、
a20030114025535.jpg
だとするとき。
本来ならば、
<img src="a20030114025535.jpg" width="100" height="100" alt="img">
のところを、JavaScriptで排泄しる。
<script type="text/javascript"><!--
var T = new Date();
document.write('<img src="a20030114025535.jpg?' + T.getTime() + '" width="100" height="100" alt="img">')
// -->
</script>
など。
SSIならば、
表示させたいところに、
<img src="a20030114025535.jpg?time関数の値" width="100" height="100" alt="img">
を吐き出す .cgi を描く。
ブラウザの中には Pragma:no-cache 等を無視してくれよるのもおるから。
0109104
03/01/14 03:54ID:???ほぉほぉなるほど!!
それならば、別ファイル(?)として扱われるわけですね。
HTMLのヘッダに
Pragma:no-cache
cache-control:no-cache
入れてまして、HTMLの方は非キャッシュOKだったんですけど
画像の方がどうもうまくいっておりませんでした。
今日は遅いので明日にでも試させて頂きますー。
0110NOBODYたん
03/01/14 04:04ID:???>>85
関数を先に宣言するのであれば、
--
sub hoge(\@\@\@)
{
...
}
hoge(@a0, @a1, @a2);
--
と書いたとき、hoge(\@a0, \@a1, \@a2); と同じ効果を得られる。
たとえば、以下のように pop 関数を再実装することが可能。
(mypop(\@array) と書く必要はない。)
--
sub mypop(\@)
{
my $ar = shift;
my $last = $ar->[-1];
$#$ar--;
return $last;
}
$x = mypop(@array);
--
0111nobodyさん
03/01/14 04:58ID:/jKmOe0i0112nobodyさん
03/01/14 05:00ID:???0113NOBODYたん
03/01/14 05:44ID:???use LWP::Simple;
$html = get "http://www.perl.com/";
or
use LWP::UserAgent;
$html = wget("http://www.perl.com/");
sub wget
{
my $url = shift;
my $request = new HTTP::Request(GET => $url);
my $ua = new LWP::UserAgent;
my $response = $ua->request($request);
if ($response->is_success) {
return $response->content;
} else {
return undef
}
}
cf. http://search.cpan.org/author/GAAS/libwww-perl-5.68/
0114nobodyさん
03/01/14 05:45ID:KVuhYoblhttp://www6.ocn.ne.jp/~endou/ten.html
0115nobodyさん
03/01/14 06:42ID:/jKmOe0iありがとうございます。
LWPを使って読めるようになりました。
作っているのは、よくある○○弁変換みたいな奴なんですが、
読み込むサイズによって過負荷になってしまいますよね。
サイズのチェック(一定量処理したらやめるような)は
どうすればいいのでしょうか。
Simpleのheadを使ってみたのですが
yahooさえcontent-lengthを返さないのでダメでした。
0116111
03/01/14 06:53ID:???0117nobodyさん
03/01/14 07:19ID:ea2A6+p/あまりに時間がかかりすぎるようなら、サーバーが500を返して勝手に止まるから、
それでいいじゃねえか
0118nobodyさん
03/01/14 10:37ID:???ないだろ。そういうCGIが増殖するから、あんまり
CGIがまともにつかえそうなところがなくなるんだよ。
0119nobodyさん
03/01/14 10:39ID:???とりあえず貧乏パーラは人にものを頼むときに「お願いします」って
言うってことを覚えとけ。
ほれ、
$ cat testdbi.pl
use DBI;
$dbn=$ARGV[0];
$dbh=DBI->connect($dbn,$ARGV[1],$ARGV[2]);
$sth=$dbh->prepare($ARGV[3]);
if ($sth->execute) {
while(@row=$sth->fetchrow_array) {
print "@row\n";
}
}
$dbh->disconnect;
1;
0120nobodyさん
03/01/14 13:10ID:xMMJe1Ufうまくいきません。
■スクリプトはこんな感じ
-------------------------------------
%hoge = ('unko' => 5,
'chinko' => 3,
'manko' =>9);
foreach my $k(sort{$hoge{$a} <=> $hoge{$b}}%hoge) {
print("$hoge{$k}" . "\t" . $k . "\n");
}
-------------------------------------
■出力結果はこんな感じ
-------------------------------------
9
3
5
3 chinko
5 unko
9 manko
-------------------------------------
いちおう値でソートしてくれてるんですが、目的の出力の前になぜか値の一覧が出てしまいます。
どうすればいいですか?( ´・∀・`)
0121 ◆PxAOHU.zVE
03/01/14 13:49ID:pln/ogcF%hogeの前にkeysをいれる。
0122nobodyさん
03/01/15 00:32ID:AlO2VnQaせっかく文字出力ができるので、webdingsなどのフォントにある外字を
使おうと思ったのですが、文字の指定方法がわかりません。
普通の文字なら
$NEWIMG->Annotate( text=>'A', pointsize=>14, fill=>'#000000',
x=>$posX, y=>$posY, font=>'img/ariblk.ttf' );
とやればいけるのですが、使いたい文字をアクセサリの「文字コード表」
から拾ってきても「?」になってしまいます。
文字コードはわかるからそこから指定できるのではないかと思いますが
その指定方法がわかりません。
どのように指定したらいいでしょうか?
0124nobodyさん
03/01/15 02:08ID:ybtk15GBhttp://click.dtiserv2.com/Click5/1-45-2963
0126貧乏パーラー
03/01/15 05:28ID:???SELECTでフィールド8個以上をクエリするとエラーなります。
DBをMySQLにしてDBD::mysqlPPにしたらフィールド33個をクエリしてもOKでした
クライアント、DB共にWinXPです。
DBD::PgPPはこういう制限があるという事でしょうか?宜しくお願いします。
0127nobodyさん
03/01/15 07:39ID:???どうすればよろしいでしょうか。
今は、chop $str;chop $str;でやっています。
VBAでいう、left(string,2)の様な関数?はありますか?
0128nobodyさん
03/01/15 07:59ID:???VBAは良く知らんがN88BasicのMIDの感じだな。
0130nobodyさん
03/01/15 09:56ID:2BGcsgzZ作者日本人メール汁
0131nobodyさん
03/01/15 10:22ID:wVEDeB5Sという投票・ランキングcgiを設置しようと出来合いの探したところ
項目が140あるので検索機能がついたvote.cgiを探したところ、
ttp://www.c-5.ne.jp/~hamachan/cgihtm/jiten.htm
上記↑で配布されている「簡易データーベース」というものにたどり着きました。
プログラムが古いので
require './jcode.pl';
#-----------------------------------------------------------------
↑これの次の行に↓この一行を追加しました。
open STDOUT, '>-';
jcode.plも新しいバージョンに変えて、説明書きにあったとおり
「ずっこけ物知り辞典」という表示がページに出るところまでは
うまくいったのですが、実際に登録・検索しようとすると、
「ページが見つかりません」、との表示が出ます。
ちなみに、Tripodを使っています。
FTPソフトで見ると、cgi-binフォルダの中に
jiten.cgi、jcode.pl、jiten.docが入っていますが
jiten.docのファイルサイズは0になっています。
count.docファイルは生成されていないようです。
どこをどう改善すればよいのか、ご指導よろしくお願いします。
0132nobodyさん
03/01/15 10:45ID:???データファイルを別ディレクトリにしてみたら?
TripodのCGI設置の説明をちょっと読んだけど、cgi-bin 直下に画像ファイルなどは
置けないとあるので、.cgi .pl 以外のファイルは全滅なのかもしれん。
あと、ここはPerlスレだからCGIに関する質問はできるだけ他のスレでやってな。
■ このスレッドは過去ログ倉庫に格納されています