トップページ⇒php
1001コメント371KB

Perlコーディング初心者質問スレ Part 43

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/08/12(金) 01:26:47ID:mHnZWvqz
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
02382322005/08/30(火) 00:03:14ID:x5m98we0
>>236

ありがとうございます。
その方法でやってみます。
確かめていないのでうごくかはわかりませんが、
取次ぎお礼まで!
ありがとうございました。
0239nobodyさん2005/08/30(火) 01:18:03ID:???
宿題くさいな
0240nobodyさん2005/08/30(火) 11:27:34ID:???
>>237
とか、テキストにしときたいなら Data::Dumper とかのほうが簡単
0241nobodyさん2005/08/31(水) 14:49:41ID:2aj3BZHt
変数のサイズを知りたい時は何を使えばいいんでしたっけ?
0242nobodyさん2005/08/31(水) 14:56:42ID:???
すいません、思い出しました。lengthでした。
0243nobodyさん2005/08/31(水) 16:24:59ID:???
ソースの中に
-----
next if (!$acl{$base_remote_user,$minfo->{'dir'}} &&
!$acl{$base_remote_user,"*"});
-----
という箇所があったのですが、中括弧($acl{})の中の意味が分かりません。
中括弧でかこって中にカンマというのはどういう意味でしょうか?
0244nobodyさん2005/08/31(水) 16:38:21ID:???
>>243
多次元配列のエミュレーション用の機能で
$foo{$a,$b,$c}
は
$foo{join($;, $a, $b, $c)}
と同じ。詳しくはperlvar(1)の$;の項などを参照されたい。
0245nobodyさん2005/08/31(水) 18:22:07ID:???
文字(A,a)をコード(\x41,\x61)に変換したいのですがどのようにすればいいでしょうか?
また、逆にコードを文字に戻したりもしたいのです。
0246nobodyさん2005/08/31(水) 18:23:01ID:???
ageます
0247nobodyさん2005/08/31(水) 18:30:58ID:???
>>245
pack、unpack、ordあたり調べてきな。
# 実際に '\x' も付けて表記してるならevalで戻せるけどな。
02482432005/08/31(水) 18:46:38ID:???
>>244さん
なるほど、分かりました。
どうもありがとうございました。
0249nobodyさん2005/08/31(水) 19:01:48ID:???
>>245
あまりきれいに書けてないけど。例を。

for ('A', 'a') {
  print '\x' . unpack('H2', $_);
}
for ('\x41', '\x61') {
  /\\x(..)/;
  print pack('H2', $1);
}
0250nobodyさん2005/08/31(水) 19:11:24ID:4hPwGNyx
XMLRPC::Liteを使ってブログにを投稿しようとしてるんですが
日本語使うと文字化けしちゃって読めません。
# どうやらbase64に強制変換されてる様子。
どうすれば日本語を使えるようになるでしょうか。
なお現在のソースはイカの感じです。

use strict;
use XMLRPC::Lite;
use Jcode;

my $name = "name";
my $pass = "pass";
my $title = "たいとる";
my $description = "ほんぶん";

#&Jcode::convert(\$title,'utf-8');
#&Jcode::convert(\$description,'utf-8');

print $title;

my $msgresult = XMLRPC::Lite
-> proxy('http://blog.fc2.com/xmlrpc.php')
-> call('metaWeblog.newPost', "0", $name, $pass,
{
'title' => $title,
'description' => $description,
'mt_allow_comments' => 1, # must be int, not string
'mt_allow_pings' => 1 # must be int, not string
},
1
)
-> result;
0251nobodyさん2005/08/31(水) 21:12:32ID:HyyIksuT
ほんとに初歩的な事だと思うんですが…
if( $a == 0 || $a == 1 || $a == 2 || $a == 3 ){

$aに0、1、2、3のどれかが入っていたら…、という文なんですが、
これをもう少し簡潔に書くとどうなるでしょうか?
数字が0、1、2、3……10くらいまで続き、また別のグループで11〜20、21〜30までを
今はそれぞれelsifで処理しています。
効率が悪いかな?と思いまして…。よろしくお願いします。
0252nobodyさん2005/08/31(水) 21:19:36ID:ihFBKKnR
>>251
TIMTOWDI

if $a =~ /(\d+)/ and 0 <= $1 and $1 <= 30
if defined $a and 0 <= $1 and $1 <= 30
0253nobodyさん2005/08/31(水) 21:19:58ID:???
>>251
if ( 0 <= $a && $a <= 10 ) { }
elsif ( 11 <= $a && $a <= 20 ) { }
elsif ( 21 <= $a && $a <= 30 ) { }
0254nobodyさん2005/08/31(水) 21:24:22ID:???
>>251
書き方云々ではなく、その処理自体を何とかできんのか
02552512005/08/31(水) 22:24:49ID:???
レスありがとうございます!
>254
すみません、なんかこの処理を他に変える方法が今の自分にはわからなくて…
スキル不足ですね。勉強します。
0256nobodyさん2005/08/31(水) 22:28:33ID:ihFBKKnR
あとで思いついた
10ごとに区切る前提なら
my $flag = int $a / 10;
if ( $flag = 0 ) {}
...
if ( $flag = 3 ) {}

は?
0257nobodyさん2005/08/31(水) 23:09:37ID:???
if ($a =~ /[0-9]/) {}
if ($a =~ /1[0-9]/) {}
if ($a =~ /2[0-9]/) {}
0258nobodyさん2005/08/31(水) 23:15:40ID:???
こういう回りくどい処理が必要になったら
どこか設計が間違ってると疑った方がいい。
0259nobodyさん2005/09/01(木) 09:17:57ID:???
>>256
$flag という変数名を使う習慣は捨てたほうがいい。
(そもそも割り算の商はフラグじゃないし)

もし意味がフラグだったとしても何のフラグなのかあらわす単語を名前にしる。
02602502005/09/01(木) 10:18:56ID:pBV3XGF+
自己レスです。

'title' => $title,
'description' => $description,

の所を

'title' => XMLRPC::Data->type('string', $title),
'description' => XMLRPC::Data->type('string', $description),
とする事で解決しました。
# $title及び$descriptionの中身はutf-8に変換してます。
0261nobodyさん2005/09/01(木) 14:07:05ID:???
Linuxのコマンドをperlで実行させて、その結果を変数に格納したいのですが
下記のようなやり方だと出来ません
どのようにしたらよいのでしょうか?

$b = system("vuserinfo -l $a");
print $b;
0262nobodyさん2005/09/01(木) 14:37:00ID:???
>>261
$b = `vuserinfo -l $a`;
print $b;

systemはコマンドの戻り値が返されるのかな。
あと、openかsystem関数かでパイプを使う方法等もあったと思う。
0263nobodyさん2005/09/01(木) 14:49:32ID:???
>>262
ありがとうございました!とても助かりました・・
0264nobodyさん2005/09/01(木) 17:46:03ID:???
初心者スレなので一応言っておくけど、
>>252>>256>>257は色々間違ってるよ。
0265nobodyさん2005/09/01(木) 18:28:04ID:???
>>264
ほんとだ。すべて微妙に間違ってる…。
0266nobodyさん2005/09/01(木) 18:37:12ID:???
夏休みの宿題に正解教える訳なかろう・・
0267nobodyさん2005/09/01(木) 19:34:23ID:???
>>265
微妙どころじゃない気が…
0268nobodyさん2005/09/01(木) 21:28:02ID:???
しかし誰も間違っている箇所を指摘できない罠wwwm9(^Д^)プギャーーーー
0269nobodyさん2005/09/01(木) 21:29:53ID:???
そんなもん必死に指摘するほどでもないだろうに・・・
0270nobodyさん2005/09/02(金) 01:43:26ID:5yfALZxB
while($line = <FILE>) {
 push(@tmp, $line);
}
close(FILE);

で、

print @data;

とすると、2行目以降、各行の先頭に半角スペースが入ってしまうのですが、
何が原因でしょうか?
0271nobodyさん2005/09/02(金) 01:48:22ID:???
ファイルの2行目以降の先頭に半角スペースがあるから
02722702005/09/02(金) 01:50:31ID:5yfALZxB
>>271さん
それはないです。。。
1行ずつ

while($line = <FILE>) {
 print $line;
}
close(FILE);

とすると大丈夫なので。
0273nobodyさん2005/09/02(金) 01:54:04ID:???
マジレスすると、>>270のを実行しても、何も出てこない
0274nobodyさん2005/09/02(金) 01:54:19ID:???
ほんとは print FH "$newline\n@array"; みたいなことしてんだろ。
02752702005/09/02(金) 01:54:19ID:5yfALZxB
$line =~ s/ //g;

とやっても変化無しです。
0276nobodyさん2005/09/02(金) 01:54:50ID:???
@tmpに詰め込んで@dataを出力している点について
02772702005/09/02(金) 01:55:26ID:5yfALZxB
>>273さん
すみません、

open(FILE, $file);

が抜けてましたorz
0278nobodyさん2005/09/02(金) 01:56:30ID:???
>>273の言いたい事は>>276が言ってることだと思われ
02792702005/09/02(金) 01:57:14ID:5yfALZxB
>>276さん
すみません、書き込む時に間違えました。
手元のは大丈夫です。

あぁ、もうだめぽ。
0280nobodyさん2005/09/02(金) 01:58:11ID:???
もう一回ゼロから勉強してこような
0281nobodyさん2005/09/02(金) 02:00:22ID:???
print @temp;


print "@temp";



以上の違いを説明せよ
0282民主党2005/09/02(金) 02:36:21ID:9iT1X8+f
  ★★★ また韓国、意図的な、でっち上げ反日報道 ★★★
 韓国大手テレビ局の8月15日番組「日本軍731部隊の生体実験」が、実は真っ赤なウソ、中国映画の盗用でっち上げだった。
 韓国マスコミは反日番組で、この種のでっち上げ「歴史歪曲(わいきょく)」をよく行うが、今回の事件で 「日本糾弾ならウソも平気」 という腐敗体質が改めて確認された。

 番組では実験の様子を「白黒の記録フィルム風」に紹介したが、視聴者から「映画の場面と同じだ」との声が上がり、悪質なでっち上げが露呈した。
 この中国映画はカラー作品だが、テレビでは本物に見せかけて「白黒」に変えられており、意図的なでっち上げであることは明白。

 日本の 民 主 党 【岡田党首】 は、日本国内に数十万人もいる反日的な在日韓国・朝鮮人に、日本の選挙権を与え、 民 主 党 に投票させようと画策している。
 在日韓国・朝鮮人の大部分は、戦後のドサクサで勝手に密入国した不法滞在者とその子孫だが、「強制連行された」とウソをつき、被害者のフリをして日本国内に居座っている。
 収入があっても税金は一切払わず、さらに毎月二十数万円の生活保護をもらい、日本人の悪口を言いながら遊び暮らしている。
0283nobodyさん2005/09/02(金) 10:04:13ID:???
まずやらないとは思うが$,に空白を設定すればprint @tempでも空白入るよ。

% perl -e '@temp=("a\n", "b\n"); $,=" "; print @temp;'
a
b

0284nobodyさん2005/09/02(金) 12:41:24ID:???
>>270
Perlのバージョンは?
それから、問題が再現する最小のコードを作ってそのまま貼ってもらえると
アドバイスしやすいかな。

おれは昔(1〜2年ほど前)、print @hoge; とすると最初の行だけ先頭に
半角スペースが入ったことがあった。
print にスカラーやリストを渡した場合等は大丈夫なんだが、配列1つだけ
(もしくは先頭に配列変数だったかな)を渡すとそうなった。
(270さんと逆だなぁ。)
今、win & Linux 上で試してみたけど、そういう現象は起こらなかった。

もしかすると、Perl の、print あたりの実装上の問題かも。

# 今試して再現しなかったと書いたけど、なにぶん昔のことなので
# 方法を間違えているだけかも。
0285nobodyさん2005/09/02(金) 12:56:58ID:???
>>284だが、

どうやらおれが書いた問題は
>>281さんが指摘したことだったみたいだ。

多分、自分の場合は、ヒアドキュメントの中で変数展開を使おうとして
先頭に改行が入っていたのだった。

print <<END;
@hoge
END

これだと改行が入るので、苦し紛れにリファレンスとデリファレンスを
使って次のように回避していたのを思い出した。

print <<END;
${ \join('', @a) }
END

>>281
文字列中での配列変数の展開では、要素間に半角スペースを入れて
結合されるのかな。
一方、引数として配列変数を指定した場合(前者)は、最初にリストに展開される
ため期待通りに処理される、と。
0286nobodyさん2005/09/02(金) 14:02:12ID:???
>>285
文字列中での変数展開では$"が間に挿入される。デフォルト値は空白。

printでは要素間に$,が挿入される。デフォルト値は空文字列。
0287nobodyさん2005/09/02(金) 23:01:28ID:???
>>281
「ひょっとして、ダブルクォート文字列の中に、chomp していない配列を入れていませんか?」
というやつだね。
0288nobodyさん2005/09/03(土) 03:59:11ID:???
アップロードされた画像をftpで別のサーバに転送して表示する画像掲示板のサンプルか何かはありませんか?
0289nobodyさん2005/09/03(土) 05:05:43ID:???
2chの串チェックの一つにtorチェックがありますが
あれはいったいどうやってtor経由か判断しているのでしょうか
0290nobodyさん2005/09/03(土) 15:37:23ID:???
>288
スレ違い
0291nobodyさん2005/09/03(土) 15:49:52ID:???
>>289
これでも参考に

風呂敷確認君 弐式 2.07
http://sv2ch.baila6.jp/chk_proxy.cgi
http://sv2ch.baila6.jp/chk_proxy.cgi?source
0292nobodyさん2005/09/04(日) 03:20:49ID:pmMRy4XZ
「項目区切りはHex(09)でお願いします」といわれましたが、
意味がわかりません。

「$v1 . hex(09) . $v2」というように項目の区切りとしてhex関数
を指定してみましたが、エラーが出てしまいます。

質問すると怒られるので焦ってます、、
ご教示いただけますと幸いです。
0293nobodyさん2005/09/04(日) 03:36:22ID:???
>>292
$v1 . "\x09" . $v2

hex 関数は、引数の文字列を16進数とみなし整数を返す関数。
0294nobodyさん2005/09/04(日) 04:03:51ID:???
>>293
本当に有難うございます。

「受付データの区切りはタブ(\t)を入れており、
項目区切りはHex(09)となってますので」

と言われた意味がようやくわかりました。
Hex(09)=\tということなんですね。

勉強になりました。
0295nobodyさん2005/09/04(日) 04:45:50ID:???
>>294
えーと、まぁ正確には

hex 関数は 「16進数 → 10進数 変換」する関数
(例: print hex('0a'); # 10 と表示される)

なので今回の例では hex は使えず。
代わりに、「10進数 → バイナリ 変換」 できる chr 関数、pack 関数、\x?? の表記
あたりのいずれかを使えばOKということです。

(例: print chr(9); # tab文字が表示される)

今回の例だと、

・$v1 . chr(0x09) . $v2
・"$v1\x09$v2"
・$v1 . "\t" . $v2
・"$v1\t$v2"

辺りでもOK。
0296nobodyさん2005/09/04(日) 08:02:46ID:???
区切りってことなら join "\t",@list; も忘れずに
0297nobodyさん2005/09/04(日) 12:20:52ID:???
>>291
ありがとうございます
見たところ単純にリストと照合してるだけのようですが
そのリストをどうやって作ってるのかがなぞですね
0298nobodyさん2005/09/04(日) 13:47:14ID:???
>>295-296
勉強になるお話、ありがとうございます。

なぜ指示した人は「Hex(09)で」といったのでしょうかね。
「\x09で」と自然に結び付けていったつもりだったのでしょうか。
言い方は間違ってないかと思いますが、少しおかしいとも思いました。
というか僕が混乱しているせいもありますが。。

素直に\tを使うことにします。
0299nobodyさん2005/09/04(日) 13:58:15ID:???
>>298
一般的に hex は 16進法の という意味で(語源の英語 hexadecimal がそういう意味)、
担当の人は 16進表記での09 というつもりで Hex(09) と書いたのかもしれないね。

でもまぁ、開発言語がPerlと限定されてるなら、hex と chr 関数を間違えた可能性も。
おれも普段はそこらへんは曖昧だしなぁ。
Perlでhex(09)で と指定されたら、あまり慣れてない人なら少々誤解してもある程度無理ない罠。

開発&上達ガンガレ。
0300nobodyさん2005/09/04(日) 17:23:14ID:???
>>299
今後の知識として今回のご教示は非常にためになりました。
最後までご親切に有難うございます。
ガンガリマス
0301nobodyさん2005/09/04(日) 22:22:16ID:???
サーバーから転送量激しいから何とかしてくれってメールきて画像系CGIの転送量がやばいらしいから該当CGIにトラフィック制御を付けようと思ってます。
そこで次のサブルーチンを作成してみました
[ $Trafic_Timeout ]秒間に [ $Trafic_min_limit ] バイト転送したら転送量エラーと封\示したいとしbト &TraficPlus(画像サイズ); って感じで呼び出したいと思っています。
全くスマートなプログラムではありませんが、これでいけると思ってやった見て、何度か改良しましたがうまくいきません。
どなたか改良又は知恵をかしていただけませんか?宜しくお願いします。

sub TracficPlus{
$plus = $_[0];
my $size;
&filelock('tr.lock');
$Trafic_min_limit = 202400;
$Trafic_Timeout = 60;
my $nowtime=time;
open(IN,"time.trafick");$mtime = <IN>; close(IN);
open(IN,"now.trafick");$total = <IN>;close(IN);
$time = $nowtime - $mtime ;
if($time > $Trafic_Timeout){
$total = 0;
open(IN,">time.trafick");print IN $nowtime; close(IN);
}
$total += $plus ;
open(IN,">now.trafick");print IN $total;close(IN);
open(IN,"total.trafick");$ttt = <IN>;close(IN);
$ttt += $plus;
open(IN,">total.trafick");print IN $ttt;close(IN);
&fileunlock('tr.lock');
if($total > $Trafic_min_limit){&Error($Limit);}
return $size;
}

(http://pc8.2ch.net/test/read.cgi/tech/1121804136/658 からのスレ違いとのことでこちらにマルチっぽくなってしまっていますが宜しくお願いします。)
0302nobodyさん2005/09/04(日) 22:52:45ID:???
>>301
とりあえずすぐに気づくのは、$size に値が代入されずに return されてることだなぁ。

1. 各 .trafick ファイルの役割
2. どういうふうに うまくいかないのか

を書いてもらえれば、アドバイスしやすいかも。
0303nobodyさん2005/09/04(日) 22:57:53ID:???
わざと変えてるなら余計なお世話かもしれんが
トラフィックの綴りはtraffic
0304nobodyさん2005/09/04(日) 23:10:18ID:???
>>303
真剣に綴りミスしてました。忠告サンキューです。

>>302
えと、今もう一度プログラム書き直しているので>>301の物はおいとかしてください。
今やろうとしているのは、 n 秒間に m バイトのデータが転送されたら n 秒経過するまで転送量エラー画面で止めておくプログラムを組みたいと思っています。
03053042005/09/05(月) 00:04:16ID:???
ちょっと書き直してみましたが、やはりうまいこと生きませんでした。
この状態で、$Trafic_min_limitの値を0にして、実行しても記録はされているもののエラーには飛びませんでした。
各行で何をやろうとしているのかは注釈を入れておきました。宜しくお願いいたします。

sub TrafficPlus{
$plus = $_[0];
$Trafic_min_limit = 202400;
$Trafic_Timeout = 60;
my $Traffic_now   = 'traffic.now.hidden'; #現在の転送量保存
my $Traffic_total = 'traffic.total.hidden'; #全体の転送量保存
my $Traffic_time  = 'traffic.time.hidden' #現在の転送量を保存したときの時間
my $nowTime=time;  #現在の時間
&filelock('tr.lock');
$ntraffic = `cat $Traffic_now`; #現在の転送量取得
$straffic = `cat $Traffic_time`; #保存したときの時間を取得
$ptime   = $nowTime - $straffic; #現在の時間と保存したときの時間差取得
if($ptime > $Trafic_Timeout){$ntraffic = 0;} #指定時間を超えていた場合リセット
$ntraffic += $plus; $straffic += $plus; #現在の転送量に新たな転送量を加える
#現在の転送量をファイルに記録する
`echo '$ntraffic' > $Traffic_now`;
`echo '$straffic' > $Traffic_total`;
`echo '$nowtime' > $Traffic_time`;
&fileunlock('tr.lock');
if($Traffic_now > $Trafic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
0306nobodyさん2005/09/05(月) 00:12:17ID:???
正規表現で
\0
というのは何を表しているのでしょうか?
ぐぐって見たのですが、見つかりませんでした。
(あまりにも単純すぎて、検索するのが意外と難しい)
0307nobodyさん2005/09/05(月) 00:13:24ID:???
>>306
ヌル文字
0308nobodyさん2005/09/05(月) 00:19:28ID:???
圧縮転送はダメなん?
03093062005/09/05(月) 00:23:07ID:???
>>307
ありがとうございます。
javascriptでnull文字使って結合か・・・
頭が痛い
03103042005/09/05(月) 00:24:11ID:???
既にgzip圧縮されてるっぽいです
日転送量が3GBぐらい行ってるらしくて。普通の鯖なら蹴られて当然な数値ってことはすぐ分かりました。
まだ許してくれてるので早急に対応したいなと。とりあえず今は画像の表示にsleepで時間差を付けて耐えております。
0311nobodyさん2005/09/05(月) 00:39:15ID:???
>>305
とりあえず最後のif文で、$Traffic_now(ファイル名)と
$Traffic_min_limit(バイト数)を比較してるのはおかしいだろ。
$ntrafficじゃないのか?

あと$ntrafficがリセットされるのが、リクエスト間が$Traffic_Timeout秒
あいたときだけなんだが、これはそういう仕様なのか? $Traffic_Timeout秒
以下の間隔でリクエストが来続けるといったん制限かかったらかかりっぱなし
になりそうだが。
0312nobodyさん2005/09/05(月) 00:55:25ID:???
>>311
すっゲー間違いしてました。サンキューです。
修正してみましたがまだ正しく動かないっす・・・。
とりあえずできるまで粘ってみます。
0313nobodyさん2005/09/05(月) 01:20:29ID:???
>>305

>>311が書いてるけど、各秒ごとの転送量を保存しないと、
指定時間内の転送量が出せないね。

↓文法チェックもしてないけど。ファイルロック処理等も無し。
0314nobodyさん2005/09/05(月) 01:21:54ID:???
sub TrafficPlus {
  my $plus = shift;  # 増加量
  my $Trafic_min_limit = 202400;
  my $Trafic_Timeout = 60;
  my $now = time;  # 現在時刻

  my %traffic;  # 転送量

  # ファイルから転送量情報を読み込む。
  open(IN, 'traffic.dat');
  my %in = split(/,/, <IN>);
  close(IN);
  for ( keys %in ) {  # $Trafic_Timeout秒以前の情報を捨てる
    $traffic{$_} = $in{$_} if ( $_ > $now - $Trafic_Timeout );
  }
  $traffic{$now} += $plus;

  my $sum;  # 指定時間内の転送量合計
  for ( keys %traffic ) {
    $sum += $traffic{$_};
  }

  # 転送量情報を保存。
  open(OUT, '> traffic.dat');
  print OUT join(',', %traffic);
  close(OUT);

  if ( $Trafic_min_limit > $sum ) {
    TrafficError();
  }
}
0315nobodyさん2005/09/05(月) 06:55:48ID:???
perl 5.8 でPPMを使ってGDをインストールしようとしたのですが出来ませんでした
GDインストール解説サイトに5.8はまだPPMが使えないのでActivePerlは5.6をインストールするように書いてありました
その解説は2004年9月に書かれたものですが
現在も5.8ではPPMは使えないのでしょうか
0316nobodyさん2005/09/05(月) 08:41:06ID:???
GD 2.25ならあるみたい。ppmで
rep add theoryx5 http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer58
としてから
search GD
で見つかると思う
0317nobodyさん2005/09/05(月) 10:34:21ID:???
>>315
有難う御座います
いまから試してみます
03183042005/09/05(月) 11:26:42ID:???
転送量の件できたっぽいので一応報告しときます。↓の奴で今のところ正常に動いてます。ありがとうございました。
sub TrafficPlus{
$plus = $_[0];
#現在の転送量保存
 my $Traffic_now = 'traffic.now.hidden';
#全体の転送量保存
 my $Traffic_total = 'traffic.total.hidden';
#現在の転送量を保存したときの時間
 my $Traffic_time= 'traffic.time.hidden';
#現在の時間
 my $nowTime=time;
&filelock('tr.lock');
 #現在の転送量取得
  $ntraffic = `cat $Traffic_now`;
 #保存したときの時間を取得
  $straffic = `cat $Traffic_time`;
 #現在の時間と保存したときの時間差取得
  $ptime = $nowTime - $straffic;
 #指定時間を超えていた場合リセット
  if($ptime > $Traffic_Timeout){$ntraffic = 0;$straffic = $noTime;}
 #現在の転送量に新たな転送量を加える
  $ntraffic += $plus;
  $straffic += $plus;
 #現在の転送量をファイルに記録する
  `echo '$ntraffic' > $Traffic_now`;
  `echo '$straffic' > $Traffic_total`;
  `echo '$nowTime' > $Traffic_time`;
&fileunlock('tr.lock');
if($ntraffic > $Traffic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
0319nobodyさん2005/09/05(月) 11:34:24ID:???
あーチョッと2行書き忘れていたので行数の関係上注釈無しで入れときます。

sub TrafficPlus{
$plus = $_[0];
  $Traffic_min_limit = 500000;
  $Traffic_Timeout = 60;
  my $Traffic_now  = 'traffic.now.hidden';
  my $Traffic_total  = 'traffic.total.hidden';
  my $Traffic_time  = 'traffic.time.hidden';
  my $nowTime=time;
&filelock('tr.lock');
    $ntraffic   = `cat $Traffic_now`;
    $straffic   = `cat $Traffic_time`;
    $ptime    = $nowTime - $straffic;
    if($ptime > $Traffic_Timeout){
        $ntraffic = 0;
        $straffic = $noTime;
    }
    $ntraffic += $plus;
    $straffic += $plus;
    `echo '$ntraffic' > $Traffic_now`;
    `echo '$straffic' > $Traffic_total`;
    `echo '$nowTime' > $Traffic_time`;
&fileunlock('tr.lock');
    if($ntraffic > $Traffic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
0320nobodyさん2005/09/07(水) 13:59:48ID:oYntvDxu
NFSとかサーバ設定関係は一切いじらず、2サーバのファイルを
同時に書き込むような仕組みでなにかよい方法はございます
でしょうか。
この2サーバはロードバランサーで動作しております。

現在は各サーバに受け側CGIを設置(ファイル書き込みCGI)。
それぞれのサーバにアクセスがあった場合、SOCKET通信で
もう一方のサーバのCGIを叩く仕組みでファイルの同期を取って
いるのですが、アクセスが集中したりすると
「Resource temporarily unavailable」とエラーが出たりしてしまい、
多少怒られております。

何かよい案があればご教示いただけますでしょうか。
宜しくお願いいたします。
0321nobodyさん2005/09/07(水) 20:41:36ID:3mQbsuSc
シロートな質問ですいませんが、どなたか教えて下さい。

<A href=http://a.jp/abc.cgi?menu=1>;メール</A>
というリンクでabc.cgiへ移るとき、メニュー番号をmenu=1で渡すと同時に
<INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=$wk_id >でIDとパスワード
も渡すことはできないでしょうか?そもそもhiddenはフォームのボタン等
がクリックされた場合のみで、リンクの場合には渡せないのでしょうか?
リンクでID、パスワードを渡すとアドレスに表示されるので、できれば
hidden等が良いのですが。

よろしくお願い致します。
0322nobodyさん2005/09/07(水) 20:50:01ID:???
Perl関係ねーぞ

<A>のリンクでhrefにアドレスを設定するのではなく、
onClickでJavascriptのfunctionよんで、そこでsubmitさせる
0323nobodyさん2005/09/07(水) 20:50:14ID:???
>>320
CGIを動かしてる鯖以外に、ファイルサーバを導入する。しかないような…。

しかも、Resource temporarily unavailableのメッセージはhttpdが出してるやつでしょ?
単なるアクセス制限だからCGIのコーディングと関係ない。
0324nobodyさん2005/09/07(水) 20:53:03ID:???
>>321
JavaScript を使えばできますよ。

<a href="http://hoge/abc.cgi?menu=1" onclick=〜>
# onclick で呼ばれる関数で post メソッドで submit (CGI呼び出し)。

それか素直に、button にしておくか。この場合でも、
<form method=POST action="./abc.cgi?menu=1">
としておくと、URLには menu=1 が現れる。

上記いずれの場合でも、CGI側で menu と id の値を両方取得可。

# JavaScript と HTML の細部の記憶は曖昧なのでスペルミス等あれば悪しからず。
0325nobodyさん2005/09/07(水) 23:53:10ID:???
>>323
ご返答有難うございます。

アクセス制限ですか。
とくに認証等はかけてないのですが、接続数制限という意味でしょうか。
0326nobodyさん2005/09/07(水) 23:59:39ID:???
>>325
他で管理している鯖ですか?

認証は関係ありません。
制限自体は、その鯖の設定によりけりです。
単位時間あたりの接続数、ヒット数、転送量、など
いろいろな情報を元に制限をかけることが可能です。

制限がヒット数になっていて、そのページに画像が多い場合、
すべてヒットとカウントされて制限に引っかかることもあります。
0327nobodyさん2005/09/08(木) 00:24:20ID:???
>>320
あれ?ちょっと変じゃないですか??

ロードバランサ入れてるんですよね。
一方のCGIが叩かれた時に、もう一方のCGI叩いたらダメでしょ。
負荷分散してる意味が無いような…。
0328nobodyさん2005/09/08(木) 01:46:08ID:???
>>326
CGI側ではどうすることもできないんですね。
サーバの設定を見直してもらいます。

>>327
一部だけファイルを同期する必要があるので、この手法を
とりました。
0329nobodyさん2005/09/08(木) 03:24:01ID:vnFPn7Ff
%test = (
2 => '2です',
6 => '6です',
'Y' => '12です'
);

このようなハッシュを

foreach my $key (sort { $a <=> $b || $a cmp $b } keys %test) {
print "$key\n";
}

こう並べ替えますと、なぜか

Y
2
6

になってしまいます。

2
6
Y

にしたいのですが、
ご教示いただけますと幸いです。
0330nobodyさん2005/09/08(木) 04:23:02ID:???
>>329
Yは数値じゃないから$a <=> $bの時点で0と見なされてる。
0331nobodyさん2005/09/08(木) 04:24:19ID:???
そのハッシュキーだけなら
sort { $a cmp $b }
でいいんじゃね?
0332nobodyさん2005/09/08(木) 04:27:51ID:???
むしろデフォルトのsort keys %testでいいっしょ。
03333292005/09/08(木) 11:27:17ID:???
皆様、ご返答有難うございます。

実はこの部分、サブルーチン化していて使いまわして
いるので何かよい方法はないかと思っていたのですが、
$a <=> $b の数値比較のあとに $a cmp $bが評価されて
いないのではなく、$a <=> $bの時点でYが0になっていたの
ですね。

このルーチンは多くのところで使われておりますが、$a cmp $b
に統一するよう検討してみたいと思います。

本当に有難うございました。
0334nobodyさん2005/09/08(木) 13:51:44ID:+KUBGHaQ
会員登録のシステムを製作中です。
ログをどうするか悩んでいます。
プレインテキストで数千件の登録を管理するのは可能でしょうか。
また不可能だとすればどういう方法があるでしょうか。
是非ご教示願います。
0335nobodyさん2005/09/08(木) 15:06:45ID:???
>>334
コーディングと関係の無い話だと思います。
0336nobodyさん2005/09/08(木) 15:35:52ID:???
>>334
数千程度なら平気じゃないかな。
しかし信頼性は低いので、SQL使うのが速いし安全かと。
0337nobodyさん2005/09/08(木) 19:09:08ID:vnFPn7Ff
負荷について教えていただきたく思っているのですが、

sub send_socket{
 use Socket;
 my ($host, $filename, $data) = @_;
 my $path = "$filename?$data";
 my $return_value;
 my $port = getservbyname('http','tcp');
 my $iaddr = inet_aton("$host") or return 0;
 my $sock_addr = pack_sockaddr_in(80,$iaddr);
 socket(SOCKET,PF_INET,SOCK_STREAM,0) or return 0;
 connect(SOCKET,$sock_addr) or return 0;
 select(SOCKET);
 $| = 1;
 select(STDOUT);
 print SOCKET "GET /$path HTTP/1.0\r\n\r\n";
 while(<SOCKET>) {m/^\r\n$/ and last;}
 while(<SOCKET>) {$return_value .= $_;}
 close SOCKET;
 return $return_value;
}

これで内容を取得するのと

sub send_socket{
 my @wget_status = `/usr/bin/wget -q -O - "http://$host/$path"`;
 foreach (@wget_status){ $return_value .= $_; }
 return $return_value;
}

これで取得するのとでは同等という考えではございませんでしょうか。
ご教示いただけますと幸いです。
■ このスレッドは過去ログ倉庫に格納されています