Perlコーディング初心者質問スレ Part 52
1 :
nobodyさん :
2006/09/15(金) 14:01:51 ID:gobry0n2
2 :
nobodyさん :2006/09/15(金) 14:02:17 ID:gobry0n2
3 :
nobodyさん :2006/09/15(金) 14:02:58 ID:gobry0n2
4 :
nobodyさん :2006/09/15(金) 14:05:07 ID:gobry0n2
>>1 s/(.*'-')o/~~otukare-/;
8 :
nobodyさん :2006/09/16(土) 11:00:05 ID:vjnDDSY/
chomp(@lines = <STDIN>); @lines = sort @lines; print "@lines\n"; がソートされたものを表示して @lines = sort chomp(@lines = <STDIN>); print "@lines\n"; が要素の個数を表示するのは 前者は配列をダブルクォーテーションの中で展開していて 後者はリストをスカラーコンテキストで使っているから という解釈で正しいでしょうか?
9 :
nobodyさん :2006/09/16(土) 11:18:12 ID:??? BE:283008184-BRZ(3000)
chompの戻り値は切り落とした文字数だからね
10 :
nobodyさん :2006/09/16(土) 11:37:13 ID:vjnDDSY/
一行にしたいなら: chomp(@list = sort <STDIN>);
STDINに直接sort指定できるんだ。 その発想は無かった。
そりゃsortが要求するのはLISTであってARRAYじゃないしね。 普段はあんまり意識しないけど、LISTとARRAYの違いは重要。
>>12 STDIN を直接ソートしてるわけじゃなくて、
リストコンテキストで評価することでファイルの中身をソートしてるだけ。
なるへそ。 そういう動作の仕方を知ってると色々応用できるし参考になるよ。
Shift_JIS でコーディングをする場合のセキュリティについての質問です。
例えば、次のようにユーザ入力の値をダブルクォート内に代入したとします。
この時エスケープする文字列は、 & と < と > と " と ' です。
<a href="
http://$hoge ">
バイナリエディタで解析した " (ダブルクォート) の 16進表記は、"22" です。
ここで、$hoge に バイナリレベルで "82" をいれてみるとどうなるかやってみました。(バイナリファイルを一般のテキストエディタで表示したときの、"・"(半角) と表示されるあれです。)
それを出力して、IE と Firefox と Opera で表示したところ、 "82 22" で 1つの不正な文字 "・"(全角) として表示され、ダブルクォートが消えうせていました。
当然、掲示板のURL欄にこういう文字列をいれられたら、それ以降のデータがダブルクォート内のものと扱われますし、
その後の投稿内容の一部が " (ダブルクォート) 外にすることも可能で、"onload" イベントなどを使った、XSS攻撃も可能になるわけです。
大手CGI配布サイトのCGIで実験してみたところ、なんと実際にXSS攻撃が可能でした。
つまり、下記の条件を満たしてるPerlには脆弱性があることになります。
・文字コードとしてShift_JISを使っている。
・ダブルクォート内に正規表現などで入力内容を規制していない文字列が代入される。
(所謂、< とか > とか " のサニタイズをしていてもこの攻撃は可能。)
・Shift_JIS に存在しないコードを含む文字列が存在しないかの確認をしてない。
17 :
16 :2006/09/19(火) 06:56:55 ID:???
上の脆弱性を要約すると、
「"(ダブルクォート) は 1バイト文字だけど、ユーザが送る文字列の最後に不正な1バイトコードをいれることで、
その1バイトコードと、ダブルクォートが合体した、不正な文字化けした2バイトデータと扱われ、ダブルクォートが消失してしまう(文字化けした・になる)」ということです。
こういった「文字化けを悪用した攻撃」に関する解説サイトはなかなか見つからず困っています。(上の情報は自分で検証した結果です。)
これの対処についていくつか質問があります。
・ユーザから送られてきた文字列が、Shift_JIS として正当であることを確認する、モジュールなどはないでしょうか?
それができたら、文字化けを悪用した攻撃は防げるかと思います。
・EUC-JP や UFT-8 ではこのような問題は発生しないのでしょうか?
参考:
http://www2d.biglobe.ne.jp/~msyk/cgi-bin/charcode/bbs.cgi?past=1&c=r&n=82 ・もし、EUC-JP などなら問題が生じないのであれば、スクリプトの文字コードの変換をやろうかと思います。
Shift_JIS の駄目文字を "\" でエスケープしているコードを自動的に変換するソフトはないでしょうか?
ご教示お願い致します。
18 :
16 :2006/09/19(火) 06:58:25 ID:???
XSSはブラウザ依存だからなぁ。 「このサイトはテキストブラウザ専用です」と書いておけばおk。 完全に排除したいなら最後に半角スペースを入れるくらいしかないと思う。 なぜならクライアントはページ製作者の指定したエンコードで表示するとは限らないから。
>"onload" イベントなど s/=/?/g; >Shift_JIS として正当であることを確認 正規表現
表示されてない… s/=/=/g;
>>16 てーか普通URLに \x7f 以上の文字あるときはそれ全部エスケープするだろ?
あのくだらない日本語ドメインかなんかですか?(^ω^;
>>17 > ・ユーザから送られてきた文字列が、Shift_JIS として正当であることを確認する、モジュールなどはないでしょうか?
正規表現一行で実現できるよ。
if構文でandとorなんですが、 AでかつBでかつCの場合、のような全部andというわけではなく AでかつBかCの場合、という混合の書き方はありますでしょうか? 現在は if($foo eq 'A'){ if($bar eq 'B' or $bench eq 'C'){ print $foobar; } } みたいに入れ子にしてます。
25 :
nobodyさん :2006/09/19(火) 18:27:03 ID:tgpbfNw0
>>24 ($foo eq 'A') && ($bar eq 'B' or $bench eq 'C')
>>25 即答有難う御座いました。
使っていきます。
27 :
nobodyさん :2006/09/19(火) 18:39:53 ID:LgUjbLc5
>>28 $str = qr/^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$/;
実際に使ってるのはこんな感じ。
Perlでのセッション管理で汎用的に使用されているような モジュール・ライブラリがあれば教えていただきたい次第 です。 CGI::SessionやWalrus::Session::Lite等が検索で出てきま すが、環境によって動作する・しないというものもあるみた いなので一番安全で手軽に導入できるものがあれば 有り難いです。
32 :
nobodyさん :2006/09/21(木) 06:44:43 ID:31FpoYel
CGIで使うんならCGI::Sessionが無難と思われ
foreach構文についてなのですが、 1万行に渡るデータを、一行ずつ拾って、という処理をさせていると、 foreach構文の後ろを実行せずブラウザが完了と返してきます。 1万行が多いのか、foreach構文の中身の処理が多いのか、判別つきませんが、 ちゃんときっちり完了させる書き方ってありますでしょうか? (タイムアウトなのでしょうか?) foreachに送る@配列を1000ずつとかに切って、それの処理が終わるのを待ってから次の1000を処理する、とか、 いろいろ考えたのですがその待たせるという処理の仕方も思いつかなかったです。 なにか方法ありませんでしょうか? お教えくださいますようお願いいたします。
34 :
33 :2006/09/21(木) 08:04:08 ID:???
ちなみに、 foreachの中で行ってる処理も途中で中断されてるみたいです。 出力結果は途中まででした。 これはコーディングで解決できるような問題なのでしょうか? @配列の行を20行ほどにして試してみたら普通に処理されたので、 構文ミスではないと思います。
>>33-34 高負荷(実行時間が長すぎる)なので途中で実行停止されるように
鯖で設定されているのでは。
36 :
33 :2006/09/21(木) 08:50:05 ID:???
>>35 なるほどやはりタイムアウトのような感じの処理をされているんですね。
ありがとうございます。
foreach $foo(@foo[0...200])
とかぶつ切りにすればそれぞれの処理は軽くなるような気がしますが、
それを
for ($bar = 0; $bar < 10000; $bar+200){
}
内で処理させたら同じになっちゃいますでしょうか。
($john = $bar+200;
foreach $foo( @foo[$bar...$john])
のような切り方にして)
テスト環境がもろいので、あまり何度も試す事ができなくて困ってます。
何か方法御座いませんでしょうか?
実行時間で切られてるんだからどう切っても全体の処理量が変わらなければ 何の効果もない。1回あたりの処理が短い時間で終わるようにがんばって書き 直すしかないだろう
>>33 ループ回数だけで言うと、10000回くらいなら一瞬で終わるよ、こんなのなら
my $i;
foreach (0..9999) { $i++ }
print $i;
なのでループの回数そのものの問題ではないでしょう。
起動時から完了までどのくらい時間がかかっているのですか?
ループの中の処理はどんなことをしているのですか?
子プロセス起動させてバックグラウンド処理ができるなら、そのようにするとか。
小分けにして、処理後にリダイレクトさせるようにして、続けるとか。
do.cgi→do.cgi?1000→do.cgi?2000→…
39 :
33 :2006/09/21(木) 09:12:56 ID:???
>37 やはり、一回の処理にはかわりはないんですね。 ありがとうございます。 >38 会員制サイトのメールマガジンのシステムなんですが、 1万件のアドレスを切って、メール送信、次のアドレス、という風に処理してるんです。 以前この質問をしたとき、なにに使ってるかを最初に書いたら「スパム業者に力は貸せない」と一蹴されてしまったので、書くのを躊躇してしまいました。 やはりsendmailの処理が重いのでしょうか。
>>39 メールマガジンなら BCC で1回で送るのでは不都合あるかな?
制限はずせばいいんじゃないの? 制限を自分でいじれない貸し鯖なら そもそもやるべきではない。
42 :
33 :2006/09/21(木) 09:28:54 ID:???
>>40 う
最近携帯ばっか触ってたので、bccが4つまでしか使えないと勝手に脳内で設定されてました。
ありがとうございます。それでやってみます。
みなさま有難う御座いました。
43 :
33 :2006/09/21(木) 10:58:40 ID:???
えと、初歩的なことのような気もするんですが、 foreach $mail(@mail){ print MAIL "Bcc: $mail\n"; (受け取った$mailに配信) } とループしてたのを、 print MAIL "Bcc: $mail\n"; ($mailにBCCの内容を) とするつもりなんですが、 BCCの区切り子って,(カンマ)じゃないんですか? $mail = join(/,/,@mail); とすると、 open(MAIL,"| $sendmail -t"); print MAIL "Bcc: $mail\n"; print MAIL "From: $from\n"; print MAIL "Subject: $title\n\n"; print MAIL "$message\n"; close(MAIL); のデータのsubject、Fromが空になって、本文に表示されるようになってしまいました。 本文に、ずれ込んだ件名なども表示されてます。 なんか根本的に間違ってるのでしょうか?
根本的な間違い: 事故の元だからBccで送るな。
45 :
33 :2006/09/21(木) 11:46:43 ID:???
$mail =~ tr/\r\n//d; で改行したらいけました。 有難う御座いました。
1万のメルマガをBCCで送るなんて怖くてできねーww
47 :
33 :2006/09/21(木) 11:50:02 ID:???
>>46 すみません、後学のためにBCCの恐怖をお教えいただけないでしょうか?
他に軽く出来る処理のヒントになるかもしれないですし。
48 :
46 :2006/09/21(木) 12:00:24 ID:???
>>47 BCCで送るつもりがCCになっててメルアド流出ってニュース聞いたことないですか?
「事故の元」って
>>44 が言ってるのもそういうことだと思いますよ
49 :
33 :2006/09/21(木) 12:04:51 ID:???
>>48 あー、そっちの意味ですか。
それは大丈夫です。
>>44 は
>Bccで送るな。
と言ってますからBccで送ってはいけない、って意味なので違う事を危惧してくださっていると思います。
大丈夫大丈夫って飲酒運転して人を轢き殺すタイプだな
これはとあるシリアル制御機器にコマンドを送る命令である ○ $test->printf("%c%c",0x1b,0x40); これでは問題なく動いてくれるが、 ちょっとコマンドを長めに投入するとだめ。 原因はなんだろう × $test->printf("%c%c%c%c%c%c",0x1b,0x40,0x1f,0x03,0x1b,0x40);
52 :
33 :2006/09/21(木) 12:30:16 ID:???
53 :
46 :2006/09/21(木) 12:34:25 ID:xRtMaydf
はいはい妄想乙。
54 :
nobodyさん :2006/09/21(木) 12:46:46 ID:rVJ008ap
55 :
nobodyさん :2006/09/21(木) 12:50:01 ID:rVJ008ap
| | | /-------------石綿-------------
| | |/| ∧ | lllllllllll |
▲| schindler / | シュレッダー |雪| | パロマ | l| ̄ ̄ ̄|
▽| | //l . | |アイリス | |印| | O。O | ||___| アメリカ産牛肉
| |// │ | |オーヤマ|  ̄ `┬┬_´ ..||ε(;; ;)3|\ __
| /..│ | | __ ̄ ̄ ___ . / ┌┘/l . ||ε(;; ;)3|. || |#|イトーヨーカドー電気ストーブ
_|_/ │ | | |Mac ||_ |:|デル|:| lニニニl/ .||ε(;; ;)3|. || ~~~
. / . | | | /__/l|:.. : |ニニニ|.::.:.:.||.:..:::..::..:  ̄ ̄ ̄\|| _/ ̄ ̄\_三菱
./ . |0, | |::_||.::..:...||:..::.SH902iS::::.[PS2]::::: /\\ : | | . └-○--○- ┘
設計 | |/.::.↓
>>52 .:..::::./ヽ-、.:(PSP): .| \| ̄|=| |コ= /\\ : _/ ̄ ̄\_トヨタ
姉歯事務所| ./.::..:..:<⌒/ ヽ.::..:..:◎..:...::.. .| \| |: | | 松下| .| \| ̄| └-○--○- ┘
. |/.::..:..:..::::.<_/____/.::.: ソニーBMG:..\.|_|: | | FF式 . .| \| | ファイヤストンタイヤ
____ ___ _____ ________...\.|_|:サンヨー石油ファンヒーター
>>47 メールアドレスに改行仕込まれるとそれ以降のアドレスが駄々漏れになる。
sendmailの引数で指定すれば(シェルに解釈させないように注する)、その心配はまったく無くなる。
付録:
一行の長さの制限とか考えてないでしょ。
>>56 Sendmail の引数で指定するのは、一般的にはやっちゃいけない方法と言われてるね
リスクとしては、
OSインジェクション >>> メールアドレス漏洩 だし、
シェルに解釈されないようにする&RFC準拠のメルアドを全て使えるようにする手間 >>> 改行コードとカンマとスペースを排除する手間
シェルコマンドは色々あるからね。
まぁシェルコマンドを全部エスケープすればすむだけだとは思うけど。
そもそもメールマガジンで1万って考えられないな。 スパムじゃないの?
>53 >54 >55 おいおいいきなりID出して別人工作か。 もちっと頭使え。
>>58 メールマガジンで1万ってのは普通だろ
むしろ、スパムで「たった」1万通なわけないじゃん
スパムのアクション率なんて、0.00001% とかだぞ。
スパムするなら、最低500万通/日、業者なら1億通/日は送っているだろ。
>>58 また出た。
お前がツクリャ30人が関の山だろうが、俺の文章読みたさにがんがん登録があるってわけ。
貧相な想像力でねちねち言ってんじゃねーっつーの。
62 :
nobodyさん :2006/09/21(木) 14:22:11 ID:xRtMaydf
wwwwwww
でも個人のメールマガジンで1万の登録が有るってのもな。
てか、みんな一応質問に答えてやってんだから それぐらいで着火するようなら自分で考えて自分でやれ ちょっと調べればいくらでも出てくるぞ
↓そろそろ釣りでした宣言
本日の営業時間終ったから、レスは明日じゃないかな
スパマーも一応仕事だからな。
68 :
33 :2006/09/22(金) 06:53:12 ID:???
回答ありがとうございます。
>>56 仰るとおり長さの制限に引っ掛かりました。
ヘッダーが32kb超えてる、みたいな感じのエラーが出たので、10件ほどでのテストでは判明しない問題でした。
>>38 が提案してくださったようなプロセスの小分けの方向で模索してみます。
>>57 シェルコマンドをエスケープですか。
難しそうですが、勉強してみます。
69 :
33 :2006/09/22(金) 07:18:25 ID:???
自分の頭の整理も含め、もう一度書き直しますね。
1: 自分はこういう事がしたい。
1万件のメールアドレス(@配列にいれてあります)にメールを送信したい。
2: それでこんな風にやってみたが・・・
a.foreach構文で1万回sendmailをやってみた
b.全部を$mailに入れてBccとして送らせてみた
3: こんなエラーが出て上手く行かなかった。
a.実行時間が長すぎて、途中で切られた
b.ヘッダーが長すぎると言われた
ヘッダーを短くするには繰り返し構文を使うしか思いつきません。
>>38 の案を模索してみたんですが、バックグラウンド処理、リダイレクトというのがさっぱりわからなかったです。
一回の処理を短く行う方法は御座いませんでしょうか?
お教えくださいますようお願いします。
71 :
33 :2006/09/22(金) 09:55:43 ID:???
ない知恵を絞ってみました。 @maill[0..99]←([]の中身は変数で変更可能) で100回だけループするようにして、 htmlのリフレシュを使って、@mail[100..200]を処理する(getメソッドで数値を渡しておく)ようにして、 それが@mailの行数を超えるまでリフレシュさせまくる、というのは不安定でしょうか? それか、100件ごとに sleep 5; などを入れて休憩させるといけるのか、とかも考えましたが、 これだと「一回の処理の時間の長さが50秒追加されるだけで余計長くなってる」ってことになるでしょうか? 100件ごとに一回の処理として扱われるなら最後までいけると思うんですが。
72 :
33 :2006/09/22(金) 09:57:18 ID:???
>>70 昨日の結局何も答えてはいないだけのクズか。
しつけーぞ。しゃしゃり出るならなんか回答してみせろ無能め。
73 :
38 :2006/09/22(金) 10:13:02 ID:???
> 1万件のメールアドレス(@配列にいれてあります)にメールを送信したい。 もうこの時点で目的は何であれスパムだよな。 そうじゃないんだったらメルマガやメーリングリストでも使えばいいじゃん。
>>72-73 >>35 と
>>40 を書いた者だが、
もうおまえ去れ。
スパム業者でないという保証もないし。
これだけヒントもらってるんだから自分でやれよ。
>>74 そういうシステム使うと、その業者を儲けさせるだけ
やつらは、人様が苦労して作成したコンテンツに広告を載せて配信し、ぼろ儲けしている
77 :
33 :2006/09/22(金) 10:50:43 ID:???
>>73 > プログラムで送ろうとせずに、eml形式のメールデータをローカルなperl環境で1万個作ってメーラーにインポートして一斉に送ってはいかが?
ありがとうございます。
最終段階で送信プログラムを実行するんじゃなく、
<p><a href="mailto:foo\@bar.com?bcc=$mail&subject=$subject$body=$body">SUBMIT</a></p>
というHTMLを吐き出すことにしました。
>>74 >> 1万件のメールアドレス(@配列にいれてあります)にメールを送信したい。
> もうこの時点で目的は何であれスパムだよな。
配信希望者に送る場合もでもスパムというのでしょうか?
> そうじゃないんだったらメルマガやメーリングリストでも使えばいいじゃん。
そのメルマガのコーディングについての質問です。
>>75 いただいたヒントを参考に解決しました。
みなさま、本当に有難う御座いました。
78 :
nobodyさん :2006/09/22(金) 11:04:03 ID:d6rNV+wj
ID出して否定しないし33の名前は全部同一人物だろ
結局mailtoでBCCwwwww
Perl関係ないじゃんww
解決乙。もう来るなよ
>>75 >>73 は33とは別の人ね。すげー親切で泣ける
79 :
75 :2006/09/22(金) 11:10:34 ID:???
80 :
33 :2006/09/22(金) 11:12:12 ID:???
>>78 > ID出して否定しないし33の名前は全部同一人物だろ
最初にIDを出していないので、否定しようと騒いでも余計に悪化すると思いまして。
お陰様で解決しました。
変ななりすましはスルーでOK
だが、否定ぐらいはしとけと。
>>57 最近のperl使ってシェルを経由させずに起動すれば良いだけ。
> Sendmail の引数で指定するのは、一般的にはやっちゃいけない方法と言われてるね
無知をさらけ出されても困る。
85 :
nobodyさん :2006/09/22(金) 16:20:39 ID:URN28btq
post データが a0=1&b0=1&a1=4&b1=2&a2=2&b2=2&・・・&an=8&bn=9 と"a".$i =数字と"b".$i=数字となっているものを postgresql にperl でupdateしたいのですが、 for($i=0;$i < n; $i++){ $str ="update table set a=$html->param('\"a\".$i') where b=$html->param('\"b\".$i)"; $sth=$dbh->prepare($str); $sth->execute(); } こんな感じでupdateしたいのですが,試行錯誤の上に挫折中です。 うまい方法はないですか?
86 :
nobodyさん :2006/09/22(金) 16:31:12 ID:d6rNV+wj
$html->param('\"a\".$i') をprintしてみたらどうでしょうかね
$html->paramはなんですか?文字列ですか?メソッドですか? $strに何が代入されてるんですか?
>>87 どうみても $html は CGI のインスタンスだし、$str には SQL 文が代入されてるがな。(´・ω・)
文字列の中でメソッド呼び出しってできたっけ?
一旦 param の内容を変数に代入してから $str に埋め込んでみては?
89 :
nobodyさん :2006/09/22(金) 16:50:53 ID:URN28btq
>>87 >$html->param
は
$html=new CGI;
です。
>$str
にはpostgresqlに対するupdate のストリングが入って欲しいものです。
>>86 CGI=HASH(0x804c914)->param('"a".1')
となりました。
てか、パラメータを直接 SQL 文に埋め込むと SQL インジェクションできるんじゃね?
流石○○板だな
92 :
86 :2006/09/22(金) 16:58:56 ID:???
>>89 いや意味的には
>>88 と同じで変数を確認ってことです
っつーかbのシングルクォート
$html->paramはなんですか?クォートの中から呼び出せるんですか? $strに何が代入されてるんですか? 確認しましたか?
アッー!
>>85 $htmlってのは
use CGI;
my $html = new CGI;
したもんだと仮定しますた。それから、
$dbh は、DBI/DBD::Pgで接続したときのインスタンスと仮定しますた。んで、
まず、$html->param('\"a\".$i') ってのがおかしい。全体をシングルクォートしてしまうと$iは展開されません。
まあ、$html->param("a$i") だとします。
そんで、ダブルクォーテーションの中に $html->param("a$i") を入れちゃうと、
$html と ->param("a$i") とに分かれて解釈されちゃうので、外に出してください。
だけれど、せっかくprepare使うんなら
my $sth = $dbh->prepare("update table set a=? where b=?");
for ( $i=0; $i < n; $i++) {
$sth->execute($html->param("a$i"), $html->param("b$i"));
}
などとしてはいかがでしょうか?
※上記のソースで n が裸で出てくるのはおかしいです。use strictすれば教えてくれます。
※SQL-injectionのチェックはしてくださいね。
96 :
nobodyさん :2006/09/23(土) 06:00:23 ID:08cXFZbB
Perlで、サニタイズするときの定番の関数は何ですか? PHPだとhtmlspecialchars()というのが標準で備わっているんですけど、Perlでそれに相当するものは何になるんでしょうか。 (自分で書くのは簡単なんですけど、できればPerl標準のものがあればそれを使ったほうがいいかなと考えています。)
PHPのそれに相当するビルトイン関数はないよ
>>97 ライブラリ関数で結構ですので、教えていただけませんか。
Perl標準もデファクタスタンダードと呼べるものもないと思うよ HTMLを使用するモジュールには大概あるから(CGI、TT、HTML::Templateなど) あとは自前で用意するんじゃないかな
サニタイズゆうな。クズ。
102 :
16 :2006/09/23(土) 16:17:05 ID:???
ねーよw
>>29 じゃだめなんかい。
そんなに面倒だったら、受け取った文字列の後ろにスペース一個くっつけとけば?
107 :
105 :2006/09/23(土) 18:02:03 ID:???
>>106 なるほど
それでできるのか
ありがとうございます
108 :
105 :2006/09/23(土) 18:15:29 ID:???
$str = qr/^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$/
の qr ってなんだろう。と調べてみました。
http://psst.jp/syn/archives/000199.html つまり、
>>29 は、「^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$」を、正規表現としてコンパイルしているわけですね。
実際に $GET_hoge の無効な文字列を削除するには、
$GET_hoge =~ s/$str//g
とすればいいわけですね。
ありがとうございます。
この脆弱性、CGI配布サイトで配られている大部分の掲示板スクリプトとかにとかに影響していますね・・・
漏れの使っている Child Tree とかはもろ影響してるし
実はphpユーザなんでPerlのことよくわからないや(´・ω・`)
しかも自分で書いたスクリプトじゃないから修正が大変です><
本来出力時のエスケープがいいと思うのですが、、print 内の変数を全て書き換えるのは大変なので、
GET と POST として送られてきた全てのデータに
>>29 の正規表現を適用させる方法は無いでしょうか
どうかお願いします
110 :
105 :2006/09/23(土) 18:33:56 ID:???
あれ、動かしてみたけど、駄目でした。
> つまり、
>>29 は、「^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$」を、正規表現としてコンパイルしているわけですね。
まではいいんですが、
> 実際に $GET_hoge の無効な文字列を削除するには、
> $GET_hoge =~ s/$str//g
は違ったようですね。
「^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$」は正しいパターンなので、
if ($GET_hoge !~ $str) {
&error("貴方が送信した文字列はShift_JISとしてValidではありません。");
}
みたいに使うってことだったようです。
Encode.pmでは無理か?
113 :
nobodyさん :2006/09/23(土) 18:52:41 ID:9+jKDZxZ
指定したファイルを読み込んで、そのファイル内に記述された$aaa等の変数をperl内の内部変数に置き換えるにはどうすれば良いですか?
>>110 最後の1バイトがゴミかどうか調べてみれば?
>>113 while(<DATA>){
${$1} = $2 if /^(\w+)=(.*)/;
}
print $aa;
__END__
aa=bb
^([\n\x20-\x7e\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])*$ の意味を考えてみた "\n" は改行文字、"\x" はなんだか良く分からないけど、バイナリレベルで調査するって宣言かな "\x20-\x7e" は、16進数の "20" から "7e" ってことか 2桁の16進数だから、 16^2 = 256 = 2^8 = 1バイト つまり、この [] の1ブロックで、1バイトってことだね 1ブロック目、2ブロック目、3ブロック目全てが 1バイトのよう これを括弧でかこって繰り返しにしている あれ? ってことは、3バイトの文字列で始まり、それが0回以上繰り返される? 例えば、ユーザ入力値が "ab" だったら不正扱い? でも試してみたらそうならないし う〜ん
正規表現ってそんなわかりにくいのかな。
>>110 ,115
その場合こう。
というかちょっと数行に分けて書き換えてみるからこれでわかって。
my $reg_alpha = qr/(?>[\t\r\n\x20-\x7e]+)/; # アルファベットの連続
my $reg_han_kana = qr/(?>[\xa1-\xdf]+)/; # 半角カナの連続
my $reg_multi = qr/(?>(?:[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])+)/; # 2バイト文字の連続
$GET_hoge =~ s/^((?:$reg_alpha|$reg_multi|$reg_han_kana)*).*$/$1/;
テストはしてない。
>>113 状況がよくわからんが、
・require
・eval
・正規表現
お好きなのを使ってどうぞ
>>116 あー、o 修飾子つけた方がよかったかもしらん。たいしてかわらんかもだけど。;
>>115 全然違う…。
[¥n¥x20-¥x7e¥xa1-¥xdf]
が、ASCIIキャラクタとsjis半角カナ ... A
[¥x81-¥x9f¥xe0-¥xfc][¥x40-¥x7e¥x80-¥xfd]
がsjis2バイト文字 ... B
/^(A|B)*$/
だから、1バイト文字と2バイト文字で構成されている文字列にマッチする。
(sjisのみ対応)
正規表現の2バイト目の最後、0xfdまで文字あるから直しておいた。
>>116 (´・ω・)
$GET_hoge =~ s/^((?:$reg_alpha|$reg_multi|$reg_han_kana)*).*$/$1/os;
121 :
115 :2006/09/23(土) 20:10:01 ID:???
>>116 ご親切にありがとうございます。
あとでそれぞれの修飾子の意味を調べながら解読してみようかと思います。
>>119 なるほど。
プロポーショナルフォントなせいで "|" を見落としていました。
そのせいで、3バイトを意味すると思って混乱していたようです。
誤解が解けてすっきりしました。
本当にありがとうございます。
「ASCIIキャラクタとsjis半角カナ」 と 「sjis2バイト文字」 では当たり前かもですが、1バイト目が重複することはありえないわけですから、
Shift_JIS の [?x81-?x9f?xe0-?xfc] で終わっているようなのは不正ですね。
#
http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino02.html の
# [マルチバイト文字の1バイト目(0x82)] ってどういうことなんでしょう。
# "82" がマルチバイト文字の1バイト目ということは分かるんだけど、"0x" って・・・。
# マルチバイト文字の1バイト目が "82" であるということを、"0x82" と表記するって決まりがあるんだろうか。
122 :
115 :2006/09/23(土) 20:10:35 ID:???
2chブラウザでコピペしたときに正規表現が変になっちゃいました
おまえらおもしろいな use Encode qw/encode decode/; encode( 'sjis', decode( 'sjis', $q->param('query') ) );
>>121 0x の接頭辞は、16進数である事を示す。
0x82 で16進数の82を指す。
まあ、いちいち変換→逆変換するのは無駄い気もするけどね。
127 :
121 :2006/09/23(土) 21:39:58 ID:???
PERL5ってこのスレでいいの?
>>123 あーEncodeって半端なマルチバイトを落としてくれるのか知らなんだ
入力された文字コードのチェックするしコストにはならないよね
Encode.pmはjcode.plよりも劣るから使ってない jcodeにはutfパッチのやつとかあるしさ
>>130 凄い釣りですね^^
次はPerl5はPerl4より劣るから使ってないとか言い出すんですか?
ワロス
そんなエサに俺様がクマー
勉強になるなぁ。
釣りの?(´・ω・`)
=チラシの裏 最近 perl の my $this = shift or return; $hoge ||= 'hogehoge'; $piyo &&= piyopiyo($piyo); こういう書き方にエクスタシーを感じてきた。 if文いらないのステキすぎ。 =cut
139 :
nobodyさん :2006/09/25(月) 00:34:54 ID:wf+gGDeG
21:00pmにc:\beta.exeを終了させるプログラムはどのようなソースになりますか?
>>139 >>1 ぐらい読め。
> 【投稿する際の注意】
> 質問するときは内容をよく吟味してから投稿してください。
> 「コマンドの意味がわかんない」とかはマニュアル見ましょう。
> 回答者さんは何でも屋じゃありません。
>
> 1: 自分はこういう事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
ひさびさにPerlメモ見たら、 ※上記の内容について 最近の perl(perl5.8.8等)では,index 関数を使うよりも, /\Q$keyword\E/ という正規表現を使った方が速いようです.実行速度は perl のバージョンや実行環境,スクリプト等に影響されるため,必要に応じてベンチマークをとるのがよいでしょう. って書かれてた。7月下旬に更新されたらしい。 数年越しでも書き換えなきゃいけない情報をちゃんと更新するのは偉いなあ・・・。ちょっと遅いけど、まあGJ!
正規表現を使わないなら関数を使うより速いことが多い
日本語でおk
/\Qpenis\E/ ⇒ 正規表現なし ⇒ 高速 /^pen(?: )?is$/ ⇒ 正規表現あり ⇒ 低速 C言語のstrcmp()に置き換えできるような場合、Perlでは/〜/を使う方が速い …とどこかのサイトに書いてあったがURLを紛失してしまった
でも誤差程度ならindexでいい気が。
@new_word_list = keys %new_bad_hash; print "new_word = $new_word","\n"; print "last_bad_hash{new_word} = $last_bad_hash{$new_word}","\n"; とすると $new_wordはちゃんと入っているのですが、ハッシュの値が表示されません。 @new_word_list = keys %new_bad_hash;を @new_word_list = ("A","B","C");と直に書くとうまく表示されます。 printで表示すると両者ともA B Cと表示されます。 前者と後者の違いはなんだろうと思い、 chomp、=~ s/\s/ /g;をしてみたり、lengthで長さを確認してみたのですがいっこうに 違いがみいだせません。 この違いは何なんでしょうか?
すみません
>>147 の$new_wordは@new_word_listから適当にとってきたものです。
$new_word もそうだが、
%last_bad_hash は %new_bad_hash と関係あるのか
>>147 じゃわからないんだがw
情報小出しにしないで、自分で質問文読んで理解できるように書いてね・・・
えと、%last_bad_hash は %new_bad_hashとキー($new_word)が同じハッシュで、 %new_bad_hashからキーを取り出して$last_bad_hashのハッシュ値を得ようとしています。 しばらくいじってたんですが、 キーが全部アルファベットだとうまくいくみたいです。 日本語だと前者はダメで、直に書いた後者は大丈夫でした。
>>147 整理すると、
$new_word の値は、%last_bad_hash のキーであるはずなのに、$last_bad_hash{$new_word} の値が表示されないのですね。
%last_bad_hash のキーの中に $new_word の値が存在しないからそのような現象が起きるので、$new_word の値と、
%last_bad_hash のキーをすべて表示させてみてはいかがですか。値の中にスペースが入っているということはないんですか?
2バイト文字の場合文字コードの問題もありますよ。
print unpack("H*", $new_word);
print unpack("H*", join(",", keys %last_bad_hash));
とでもやって値を比較してはどうですか。
文字コードの問題でした。。。。EUCとJISが混在してました。 すみません。ありがとうございます。
はじめまして。 スレ違いでしたら、申し訳ありません。 社内で使用するために、掲示板を設置する作業を請け負いました。 フリーの添付ファイルアップロード機能付きの掲示板を設置したのですが、 添付ファイル名に日本語が使用したいという希望により、 レス番などを用いたユニークなファイル名に変換して、 サーバーへ保存する改造を行いました。 すると、ダウンロードする際に名前が変わってしまうので(当たり前ですよね;) どうにかならないかとの希望が出て、どうすればいいか迷っています。 コメント文を保存しているファイルには、 『添付ファイルの元の名前』『サーバー保存用に変換している名前』も書き出しています。 添付ファイルのダウンロードは、単純に<a></a>で直接ファイル名を指定しております。 ダウンロードの際に、元のファイル名に変換するという事が出来るのでしょうか? また他に何かいい方法があれば、お知恵を貸していただきたいのですが。 よろしくお願いします。
> また他に何かいい方法があれば、お知恵を貸していただきたいのですが。 > よろしくお願いします。 御社の出入り業者に発注すればよろしいのではないかと。
>>153 できるよ。
ファイル名に変換するんじゃなく、保存するときのデフォルトのファイル名を変えるってだけだけど。
簡単に言うとこうか print "Content-Disposition: attachment; filename=\"$filename\"\n"; くわしくは ↑ でぐぐって。
日本語ファイル名だとさらにひとひねり必要だが、↑をぐぐってよく調べれば その辺もわかるだろう。
>>154-158 レスありがとうございます。
頭こんがらまくりですが、がんばって調べてみます。
でも多分、私なぞの頭では無理そうなので、
「出来ません!」と開き直る率高しです。(;´Д`)
>>154 さんのご指摘の通り、
こんなHP担当もどきに頼まず、ケチってないで外注さんに依頼しろ!って感じです。
グチってもしかたないですがw
ありがとうございました!
> でも多分、私なぞの頭では無理そうなので、 > 「出来ません!」と開き直る率高しです。(;´Д`) 坊や頭大丈夫かい?
>>160 ああああ ごめんなさい。
書き方悪かったですね。
私に依頼してきた、社内の人にです。
私には分不相応ですので、ファイル名には気をつけてくださいと伝えるつもりです。
教えてくださった事は、勉強しています。
162 :
nobodyさん :2006/09/29(金) 00:22:15 ID:CoNVbZUT
$HOUSYUGAKU = "-892-4305-2940"; $KOSUU = "-4-1-2"; $GOUKEI_HOUSYUGAKU = "-3568-4305-5880"; $SYOHIN_CODE = "-CODEA-CODEB-CODEC"; @housygaku_list = split(/\-/,$HOUSYUGAKU); @kosuu_list = split(/\-/,$KOSUU); @goukei_housygaku_list = split(/\-/,$GOUKEI_HOUSYUGAKU); @syohin_code_list = split(/\-/,$SYOHIN_CODE); for($i = 0; $i < @housygaku_list; $i++) { $TOTAL .= "&si=" . $housygaku_list[$i] . "." . $kosuu_list[$i] . "." . $goukei_housygaku_list[$i] . "." . $syohin_code_list[$i]; } として、$TOTALの値を&si=892.4.3568.CODEA&si=4305.1.4305.CODEB&si=2940.2.5880.CODEC としたいのですが、&si=...&si=892.4.3568.CODEA&si=4305.1.4305.CODEB&si=2940.2.5880.CODEC となってしまいます。 どのようにすれば問題解消するでしょうか? ご教授お願いします。
自宅サーバ板で聞いたら鯖関係なかったみたいなので
こちらで質問します
↓これ自分です
948 名前:DNS未登録さん :2006/09/26(火) 20:33:39 ID:szdp6kC6
質問です。ググッたけど分かんなかったです
環境はWinXP Home SP2 apache1.3.27
画像をアップロードして掲示板から参照するCGIを
作ったんですが、日本語ファイル名をSJISで
アクセスしようとすると、FORBIDDENになります
例えば
猫.jpgに
http://%94L%2ejpgでアクセスできない あ.jpgにはできる
ログを見ると罵.jpgにアクセスしようとしています
罵.jpgは%94l%2ejpgなので、SJISの2バイト目のL大文字がl小文字になってる事が
原因だと思うんですが、何か解決策はないでしょうか?
もしやWindowsが大文字と小文字区別しないから無理、とかですか?
どなたかお願いします
いただいたレスでLを%4Cにすればイイとあったんで
$filename =~ s/(\W)/'%' . unpack('H2', $1)/eg;
$filename =~ s/([A-Z])/'%' . unpack('H2', $1)/eg;
↑の様にして見ましたが結局%94%4c%2ejpgでアクセスしても
Apacheのエラーログに罵.jpgにアクセスしていると書かれます
これってこういうものなんでしょうか?
HTML に URL エンコードされた文字列を書くんじゃなくて、直接日本語ファイル名を HREF に書いてみ
165 :
163 :2006/09/29(金) 01:24:30 ID:???
レスありがとうです 猫.jpgにアクセスしてみたんですが同じでした エラーログも (2)No such file or directory: file permissions deny server access: と出るのが気になります。なんでパーミッションエラー? ファイル名が違うのなら404だと思うんですが…
うちの IEタン と Fxタン では %94L.txt 、 %94l.txt 両方とも普通に判別してできたけど? 何が違うんだろうねえ。 windows でも、たとえば 猫.txt と 罵.txt は同じフォルダに共存できてるので、そのせいじゃないっぽい気がするけどね。 もしかしたらブラウザのせいかもしれないよ。
向こうでも見たけど、普通にアクセス権がないだけとかじゃねーかよ。
あるあるwww
まじかよw 「Apacheのエラーログに罵.jpgにアクセスしていると書かれます」 が全てにおいてなってるって信じてそれは除外してたのにw
170 :
ソケット :2006/09/30(土) 01:35:35 ID:jL8SsxbP
次のコードでソケットが生成できないです。ヒントでも欲しい。。。 どうもサーバの問題な気もするけど。。。 $proto = getprotobyname('tcp'); unless($iaddr = Socket::inet_aton($host)){return;} $sock_addr = Socket::sockaddr_in($port, $iaddr); unless(socket(SOCKET, Socket::PF_INET, Socket::SOCK_STREAM, $proto)) { print "error"; return; } でerrorになります。スクリプトはコピペじゃなくて手書きなので、 万一誤記があったら申し訳ありません。 ただし、問題のコードは別のレンタルサーバで動いていたので、 実機に誤記はないはずなんです。 $hostはlocalhostです。 環境:fedora core4 perl5.8
172 :
ソケット :2006/09/30(土) 01:51:07 ID:jL8SsxbP
申し訳御座いませんでした。 perlのバージョン:5.8 インストールされているライブラリは多くて書き込めないのですが、 fedora core 4 の「サーバインストールモード」でインストールして、 その後sendmail-cf、qpopper、gccをrpmで入れました。 すみません。他にどんな情報が必要なのかが。。。 サーバ関係の板かな?
そんな断片的なコードで動く動かないと言われても、 誰も答えることができないよという意味。 ぼくのちんちんで彼女がイってくれません。どうしてでしょう?と同じだもん。 最小のテストコードで試して何が悪いか追求しましょう。
174 :
ソケット :2006/09/30(土) 03:31:10 ID:???
不快な思いをさせまして、すみませんでした。 追求してみます。
>ぼくのちんちんで彼女がイってくれません。どうしてでしょう?と同じだもん。 例えが素晴らしい
176 :
163 :2006/09/30(土) 13:43:31 ID:???
>>167-169 レスありがとうです
猫.jpgと 罵.jpgを同じフォルダに置いて
http ://%94%4c%2ejpgにアクセスすると罵.jpgが表示されます
しかもその際他の画像よりロードが長いです
また、http ://猫.jpgでも罵.jpgが表示できました
%94%4c%2ejpg→%94L%2ejpg→%94l%2ejpg→罵.jpg
こういう流れなのでしょうか…?
正規表現に、ー(長音記号)を使うにはどうしたら いいのでしょうか?
???
>178 日本語でおk
181 :
178 :2006/10/01(日) 17:57:37 ID:???
すみません。 perlのCGIでhtmlファイルを標準出力に出力しようとしています。 それでhtmlのformのvalueに「カラー」と入れています。 そしてCGI側で変数に $color = "カラー"; としていて、$colorとマッチした行を書き換えたいのです。 それで $line =~ s/$color/xxxxx/; と書いているのですが、 htmlファイルが上手く出力されません。 この行をコメントアウトするとhtmlがすべて出力されるので この行に問題があるようなのです。
>>181 「カラー」が「color」ならうまくいきません?
それでうまくいったら文字コードの関係でしょう。
$color = quotemeta $color; あるいは $line =~ s/\Q$color\E/xxxxx/;
俺も初心者だけど。。。 Shift-JISだと、”ー”の第2バイトが”[”ってことかな〜? 後々の事を考えると、EUCかUTF-8がいいかもね。 use encoding "shiftjis";
use encoding なんか薦めないでくれwww
>>184 初心者に不用意に encoding.pm を教えるなよ。
encoding って負の遺産だろ・・・
さんざんでわろたw
189 :
178 :2006/10/01(日) 22:43:04 ID:???
みなさんアドバイスありがとうございます。
ということは
>>183 さんのやり方がいいのでしょうか?
明日試してみます。ありがとうございました。
190 :
163 :2006/10/02(月) 00:08:50 ID:???
>>177 遅れましたがレスありがd
ちょっと調べたんですが、Windows版のApache1.3用mod_encodingって
もしかして無いんでしょうか?
自分でビルドするしかないって事になるのでしょうか
あ、自宅サバ行った方がいいかな
191 :
nobodyさん :2006/10/02(月) 18:06:42 ID:NJMhk9xt
ASCIIコードを文字に変換するのってどうすんの? "\x20"→" "みたいな感じ
perl -e 'print +( chr( "¥x20")) . "¥n"'
おおまちがい orz...
ハッシュのアドレスを使ってそのアドレス先のハッシュのキーを取り出すことは可能ですか? $ref_hashがハッシュのリファレンスだとすると keysはハッシュしか受け付けてくれないので、 $ref_hashからハッシュを復元(?)してkeysで取り出したりできないだろうかと 思っているのですが
?
196 :
194 :2006/10/02(月) 19:03:04 ID:???
あるハッシュへのアドレスがあって、そのアドレスが$ref_hashです。 それで、そのハッシュのキー値がしりたいのですが、 無名ハッシュなので、なんとかしてアドレスからわからないだろうかと・・・
197 :
nobodyさん :2006/10/02(月) 19:15:47 ID:??? BE:264939146-BRZ(1100)
デリファレンスってどうやんだっけ?
$ref_hashがハッシュのリファレンスなら keys %$ref_hash だがアドレスといっているので何か違う世界の話かもしれないな...
リファレンスを文字列にすると、"型(アドレス)" が得られるけど、このアドレスの事? perl -e "print [123];" → ARRAY(0x123456) まあリファレンスの事だろうけど
encoding って使うとまずのですか?
201 :
194 :2006/10/02(月) 20:01:46 ID:???
いやリファレンスのことです。。。 すみません、ありがとうございました。
>>200 まずくありません。よく知られた罠があり、使う場面を選ぶというだけです。しかしそのため、
「よくわからないけれどとにかく動くようにしたい人」に勧めると、二日ほど経ってから「今度は思わぬところがアッー! で困っています」と泣き付かれるかもしれず、
「プログラムやライブラリを配布して社会に貢献したい人」に勧めると、膨大な数の配布先が use encoding の罠に汚染されてしまうかもしれず、
「夢と希望と探究心に溢れた初心者」に勧めると、貴重な学習曲線の序盤でつまらない無駄足を踏ませてしまうかもしれず、
などの事情で大抵は勧めにくいということです。
適切な使いどころがわからないなら使わないほうが無難でしょう。
203 :
nobodyさん :2006/10/02(月) 21:30:58 ID:kJiDkda9
すみません、他スレから誘導されてきました。 ホスト名が検索できない海外の串からのアクセスが多くて困っています。 そこでそのようなアクセスを弾くようにするにはどのような手を加えたらよいでしょうか? 良く見かける言葉では ・ホスト名が無い時に弾く ・逆引きできないホストからのアクセス禁止 のようになるとおもいます。 難しい事は分からないので出来るだけ簡単に何かないでしょうか? よろしくお願いします。
>>202 ありがとう。
よく知られた罠とは何でしょうか?
少しググって見ましたが、こんな感じのやつしょうか?
Allen's diary(2005-04)
http://www.tokimeki.st/diary/?date=200504 Perlで何だか妙なエラーが出て悩まされた件について。
具体的には、"Wide character in subroutine entry"って何やねんっ!と悩んでたけど、
よくよく考えたら
use encoding "shift-jis"してるから標準入力から取り込んだ文字列は既にUnicodeに
なってるというのに、わざわざEncode::from_to($str, "shiftjis", "euc-jp");とかやってた
複数ファイルへのリダイレクトのために標準出力を一旦閉じて開きなおす際に文字コードを
指定しなおしてなかった(出力はeuc-jpだけど、use encoding "shift-jis", STDOUT=>'euc-jp';で
満足してた)という二重障害が原因と判明。慣れないことをするからこんな恥ずかしいバグが
出るんだよ_| ̄|○
>>203 それは 「自分ではperlコードなんか作りたくないけど、どこかそういうコードを配布してるところを知りませんか?」 ってこと?
自分でやるなら、$ENV{REMOTE_ADDR} と $ENV{REMOTE_HOST} 、
それに gethostbyaddr や gethostbyname でぐぐってみていろいろ自分で考えて、
それでもわからなかったら聞きにおいで。
>>204 そのひと、いろんな意味で何やってるのかわからんねw
>>204 概ねそれです。しかし実際にはもっと大きな罠です。
「use encoding の効果は use encoding されたプロセスの I/O 全てに効いてくる」というのがその理由です。
つまり自分だけでなく、他人の書いたコードの "use encoding" safe を気にしなければなりません。
use や require で読込まれたコードがそれっぽい処理をしているとアウトですから。
そんなのイヤでしょ?
>>206 ああ、なるほど。
納得しました。
サンクスです。
208 :
203 :2006/10/02(月) 23:49:15 ID:???
>>205 >それは 「自分ではperlコードなんか作りたくないけど、どこかそういうコードを配布してるところを知りませんか?」 ってこと?
配布している所があれば是非活用したいですのでもしあれば教えていただけませんか?
210 :
nobodyさん :2006/10/04(水) 12:12:04 ID:zNjB8ynb
どうにもうまく行かないバグが発生しており、自分では原因が分からないところまで来てしまったので質問させて下さい。 自分のはてなブックマークからRSSを取得して、ブックマークしているURLを抽出→そのURL(合計30件)をブックマークしている全てのユーザーを抽出→上位を表示というスクリプトを組んだのですが特定のURLからユーザー情報を抽出出来ないバグが発生しています。 少し長いのですが以下にコードを載せます。
211 :
nobodyさん :2006/10/04(水) 12:13:19 ID:zNjB8ynb
#!/usr/bin/perl
use LWP::Simple;
$base = get('
http://b.hatena.ne.jp/Marathon/ rss'); #ここのMarathon部分を自分のユーザーIDに変更
@splited_base = split /\n/, $base;
foreach $i (@splited_base) {
if ($i =~ m|a href="
http:// b.hatena.ne.jp/entry/(.+?)"|) {
$data = get('
http:// b.hatena.ne.jp/entry/rss/'.$1);
push(@splited_rss, split /
\n/, $data);
}
}
#続く
212 :
nobodyさん :2006/10/04(水) 12:14:47 ID:zNjB8ynb
#続き foreach $i (@splited_rss) { if ($i =~ m|<title>([a-zA-Z0-9].*[a-zA- Z0-9])</title>|) { push (@fav_user_list, $1); } } foreach $i (sort { $a cmp $b } @fav_user_list) { if ($i eq $prev) { $per++; } else { push (@sorted_favlist, ($per*3.33)."%\t$prev"); $prev = $i; $per = 1; } } push (@sorted_favlist, ($per*3.33)."%\t$prev"); foreach $i (sort { $b <=> $a } @sorted_favlist) { print "$i\n"; if ($j == 10) { last; } else { $j++; } } exit;
213 :
210-212 :2006/10/04(水) 12:20:38 ID:t51HyLJW
>個別に抽出出来る状態にも関わらず、それをループさせると問題が出る じゃあループに問題があるのでは? 読んでないけどww
これだけ長いといちいち追いかける気もしないので、途中結果を確認して おかしい所を特定してから示してくれ。
216 :
nobodyさん :2006/10/04(水) 16:14:40 ID:mTQmplV+
>>214-215 恐らく↓のルーチンでget出来ていないか
foreach $i (@splited_base) {
if ($i =~ m|a href="
http:// b.hatena.ne.jp/entry/(.+?)"|) {
$data = get('
http:// b.hatena.ne.jp/entry/rss/'.$1);
push(@splited_rss, split /
\n/, $data);
}
}
↓のルーチンで抽出が出来ていないか
foreach $i (@splited_rss) {
if ($i =~ m|<title>([a-zA-Z0-9].*[a-zA-
Z0-9])</title>|) {
push (@fav_user_list, $1);
}
}
のどちらかが問題だと考えています
ただ、上のルーチンで応答コードを返させると全て200が返ってくるので連続取得で弾かれてる線は薄いんじゃないかんと自分では考えています。 下のルーチンは問題の有るURLを個別にgetしてから入れると問題なくユーザーIDを抽出してきます。 そうすると、上のルーチンも下のルーチンも正常に動作していることになり、原因が存在しないことになってしまっているのが現状です 長いコードを貼り付けて申し訳ありませんでした。
だからお前がどう勝手に思い込んでるかはどうでもよくて、、変数の値が期待してる通りになってるか ちゃんと表示させて追いかけろと....
219 :
nobodyさん :2006/10/04(水) 18:01:45 ID:8AfjfVrQ
220 :
nobodyさん :2006/10/04(水) 18:53:53 ID:XYwup9WL
素人:perlってどうやってデバッグやんの プロ:間接的には可能ですが厳密なデバッグはできません。仕様外です。w
わざわざスクレイピングせずに XML::RSS とかCPANモジュール使えば?
#!/usr/bin/perl
use LWP::Simple;
use XML::RSS;
my $hatena_id = "Marathon";
my $rss = new XML::RSS;
$rss->parse( get("
http://b.hatena.ne.jp/$hatena_id/rss ") );
my $items = $rss->{items};
my %count;
for my $item (@$items) {
my $item_rss = new XML::RSS;
$item_rss->parse( get("
http://b.hatena.ne.jp/entry/rss/$item- >{link}") );
$count{ $_->{title} }++ for (@{ $item_rss->{items} });
}
my @ranking = sort { $count{$b} <=> $count{$a} } keys %count;
for my $user (splice @ranking, 0, 10) {
my $per = $count{$user} / @$items * 100;
printf "%.2f%%\t%s\n", $per, $user;
}
222 :
178 :2006/10/04(水) 20:49:29 ID:???
正規表現で変数を使う際に、その変数の中に長音記号が入っている場合 についてお聞きします。 作っているCGIの内容というのは 入力画面→確認画面→登録完了画面という流れになっています。 入力画面ではラジオボタンで参加したいセミナーを選択します。 <INPUT type="radio" name="xxx" value="セミナー1"> <INPUT type="radio" name="xxx" value="セミナー2"> というようになっています。 そして確認画面に<!--xxx-->と記述しておき valueの値と置換して選択したセミナーを表示するという処理を 行いたいのです。 CGIに下の記述をしています。 $seminar1 = "セミナー1"; $seminar2 = "セミナー2"; $seminar1 = quotemeta($seminar1); $seminar2 = quotemeta($seminar2); quotemetaを行っているので value="\セ\ソ~\ナ\―[\2" というふうになってしまい、 確認画面に「セミナー2」と表示できずに 「\セ\ソ~\ナ\―[\2」と表示されてしまいます。 何かいい方法ありませんでしょうか? わかりづらかったらすみません。
>>222 /\Q$seminar1\E/ とすれば quotemeta は必要ない
生で表示すると、パラメータとして xxx=<script>alert("Hello")</script> を渡したりしても大丈夫?
てか、テンプレートエンジン使おうよ...
224 :
178 :2006/10/04(水) 21:02:53 ID:???
>>223 アドバイスありがとうございます。
テンプレートエンジンて初めて聞きました。。
勉強してみます。
ありがとうございました。
>>221 だとURL中の # がエスケープされなくてだめだね 直したら 100% になった
my %count;
for my $item (@$items) {
my $item_rss = new XML::RSS;
(my $item_link = $item->{link}) =~ s|([^\w:/.])| '%' . unpack('H2', $1) |eg;
$item_rss->parse( get("
http://b.hatena.ne.jp/entry/rss/$item_link ") );
$count{ $_->{title} }++ for (@{ $item_rss->{items} });
}
226 :
nobodyさん :2006/10/04(水) 23:15:47 ID:1QuMr0io
>>221 ,225
助言有り難うございます!
&、#絡みの問題であることが把握出来ました
モジュールをLWPしか使用していないのは、公開を前提に組んでいたので少しでも動作を軽くしようと考えて正規表現をしようしてのが理由です。
XML::RSSを使用すると処理が重くなっていたので・・・
(`-´).。oO(そういえば<title lang="ja">ってゆータグではまったことあったっけ…)
>>226 XML::LibXMLでXPath試してみれば?
229 :
nobodyさん :2006/10/05(木) 05:21:07 ID:2/YXra1Q
230 :
229 :2006/10/05(木) 06:14:01 ID:???
VIPからきますた
それくらいググればいくらでも出てくる
>>229 おまえmixiで同じ質問しただろ^^;
234 :
nobodyさん :2006/10/05(木) 14:27:16 ID:ei8slwkX
質問させて頂きます、 $CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4']) をヒアドキュメント内に直接(的に)展開したくて #!/usr/local/bin/perl use CGI; print "Content-Type: text/html;\n\n"; $CGI=new CGI; print $CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4']).'<hr>'; print $CGI->popup_menu(-name=>'poptest',-values=>['val1','val2','val3','val4']).'<hr>'; print <<"EOF"; $CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4'])<hr> ${\$CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4'])}<hr> $CGI->popup_menu(-name=>'poptest',-values=>['val1','val2','val3','val4'])<hr> ${\$CGI->popup_menu(-name=>'poptest',-values=>['val1','val2','val3','val4'])}<hr> EOF な感じでやってみたところ ${\$CGI->radio_group(-name=>'radiotest',-values=>['val1','val2','val3','val4'])} の部分がうまく展開されません。 この理由、または別の解法をご存知の方はぜひ回答をお願いします。
236 :
234 :2006/10/05(木) 17:10:48 ID:ei8slwkX
>>235 あ、しまった、コンテキスト・・・
ありがとうございました!
237 :
nobodyさん :2006/10/06(金) 10:59:57 ID:tVeHJJaR
$dataの中に dwdewdjewd dewewd dwedrgv wdcsdc といった具合に文字列がたくさん入ってて 一番最後の下の行だけ削除したいときは どうすればいいですか
$data=~ s/.+$//;
239 :
238 :2006/10/06(金) 11:16:22 ID:???
chomp($data); $data=~ s/.+\z//;
240 :
nobodyさん :2006/10/06(金) 11:26:07 ID:tVeHJJaR
241 :
238 :2006/10/06(金) 11:47:58 ID:???
$data=~ s/.+\n?\z//; これがいいかもね
242 :
nobodyさん :2006/10/06(金) 12:02:34 ID:tVeHJJaR
>>241 どうしてですか?上の2つとどう違うの?
>242 なんでそれぐらい自分で調べないんだ?
244 :
nobodyさん :2006/10/06(金) 19:14:14 ID:PWke1HN3
どなたか、お願いします。 下のようなフレームを使ったページでA,B,Cそれぞれに A-abcd.cgi B-bcde.cgi C-cdef.cgi が動いてます。Bのフォームから送信ボタンを押したときに、Cのcgiにデータを送ろうと 色々と検索し、試したのですがうまくいきません。 ┌───────┐ Bにはラジオボタン数個あり、送信が押されると │A │ 選択された値をCで受け取り処理するようにした ├──┬────┤ いのです。最初はactionでCのcdef.cgiを指定したら │B │C │ Bの枠にcdef.cgiが展開されてww(当たり前でした) │ │ │ └──┴────┘ お願いします。
試してないけど、targetでCのフレームを指定してあげれば良いんじゃね?
perl関係ないじゃん 他所行けよ
フレームが廃止の方向とあったのでやめることにした。
>>247 お前には聞いてないww
これはHTMLの話なので確かにここでは板違い。 <form action="cdef.cgi" method="post/get" target="C"> (略) </form> で正解だとして、今後はWeb制作板の方に行きなさい。
もうこねーよwwwwwwww
251 :
nobodyさん :2006/10/06(金) 23:44:30 ID:1oLHpAqB
スレ違いだったらすみません
CGIで画像を表示させてるんですが、CGI設置してるサーバーとは別のサーバーに
アップロードしている画像を表示させようとしたらPCとVodafoneのみ画像が
表示されなくて・・・なぜでしょうか?
for($i = 1; $i < 画像枚数; $i++){
print "<img src=
http:// 〜/$i.jpg>";
}
こんな感じで連番画像を表示させてます
表示できる環境があるというのであれば
タグの書き方やファイルのパスに問題はなさそうだが…
その中の適当な一枚だけを表示するHTMLを吐くようなCGIを試しに設置してみそ。
こんなやつ。
print "Content-type: text/html\n\n";
print "<html><body>\n";
print "<img src=\"
http://画像のパス.jpg\ ">\n";
print "</body></html>\n";
exit;
253 :
nobodyさん :2006/10/07(土) 08:20:28 ID:582rzz9a
すみません、教えてください。 キーワード検索式でパターンマッチをperlにて組んでいます。 入力ボックスからしかインプットは受け付けないのですが PERLソースの中身が見れた!、ソースきたねぇwww って言う人がいます。 これってホラなんですか?それともPERLのソースの中身を見ることって 可能なんですか??? 初心者過ぎて、ごめんなさい。
>>253 if your code has weak point, that's possible.
255 :
nobodyさん :2006/10/07(土) 08:26:01 ID:582rzz9a
>>254 ほんとに!??!?
具体的にいうと、入力された変数の部分にコマンド打たれるんですか?
>>255 yes.
> キーワード検索式でパターンマッチをperlにて組んで
this can be a weak point.
use quotemeta function.
257 :
nobodyさん :2006/10/07(土) 08:39:53 ID:582rzz9a
簡単に言えば読み込んでいる INPUTに関しては すべて処理を施さないといけないってことですか? 他にもFORMからのINPUTで入れてるのがあるんですが キーワード検索のみ $in{'keyword'} =~ s/,/、/g; $in{'keyword'} =~ s/</</g; $in{'keyword'} =~ s/>/>/g; $in{'keyword'} =~ s/\r\n/<br>/g; # Windows系(\r\n) $in{'keyword'} =~ s/\r/<br>/g; # Mac系(\r) $in{'keyword'} =~ s/\n/<br>/g; $in{'keyword'} =~ s/\n/<br>/g; $in{'keyword'} =~ s/&/&/g; $in{'keyword'} =~ s/\|//g; ってしてます
キーワード検索以外にも入力あるんならそっちが悪いかもしれないしね。 きちんと注意して書けばそうめったにやられるものではないが。
quotemeta しないとまずハックされると思うねえ
ただのマッチならuse re 'eval'してなけりゃ大丈夫だろ。 問題は他のところにありそうな気がする
鯖が不安定で、PerlがCGIとして扱われずソースが流れるとか。
262 :
nobodyさん :2006/10/07(土) 09:15:02 ID:582rzz9a
みなさん、親身に相談にのってくれて、ありがとう T_T
もう既にハックされたかも。。。
なんかソースを見たって言われてるんです。
とりあえず
>>257 の keywordは検索入力ボックスからの受付ですが
その他にいろんな変数をクリックで選ばせて読み込ませています。
ちなみにGETでFORMデータは取得しています。
>>257 の表記を全ての変数にかませば大丈夫ですか?
もしかしたらURLで
cgi?size=○○○ ←のような部分にコマンド打たれたのかも・・・
ソース見れるってのは、どっちかっていうとサーバーの設定の問題じゃないの? CGIが実行されずにテキストとして送られてるわけなんだから。 他には、パラメータでファイル名を受け取って、その内容を加工して表示したりするCGIに 好きなファイル名を渡せちゃう、みたいな脆弱性も考えられる。
>>252 あっ
一回目は表示されましたがリロードしたら表示されなくなりました
266 :
nobodyさん :2006/10/07(土) 10:58:54 ID:582rzz9a
>>263 ちがうんです。CGIは問題なく動いてますし
エラーが出たことも、いまのところまだないです。
またエラーがでたとしても、この鯖はエラーが表示されないで
他のエラーページに転送されるようになっていますよ。
>他には、パラメータでファイル名を受け取って、その内容を加工して表示したりするCGIに
>好きなファイル名を渡せちゃう、みたいな脆弱性も考えられる。
そんなことできるんですか?パラメーターには
>>257 みたいな
クォートメタは使わないで受信しています
>>266 >>257 のコードによって安全性が得られると考えているなら、それは間違いです。
Perl の組込関数 quotemeta()、文字列に対する \Q エスケープ、そして CGI における外部データの安全な取扱、及び関連するモジュールについて調べましょう。
CGI で運用されるコードは一般にあらゆる (都合の悪い) 入力に備えておく必要があります。
なぜならそれは、そこにアクセスできる全ての人によって実行可能なプログラムだからです (あなたはそのようにパーミッションを設定したはずです。忘れたとは言わせませんよ?)。
>>266 mixiだってCGIが実行されずにソースが表示されちゃったからねぇ〜
昔々だと
http:// 〜〜.cgi/
のように最後にスラッシュを入れたらソースが表示されたアホな鯖があったねぇ〜
270 :
nobodyさん :2006/10/07(土) 12:25:11 ID:582rzz9a
quotemeta調べてるのですが難しいですね。 要するにquotemetaをしないと、入力されたパラメーターとかキーワードは 取り入れちゃいけないのですね
PerlのCGIは最低限汚染チェック(-t とか -T とか)を有効にしたほうが... #!/usr/local/bin/perl -T
>>271 そんなの初めて知った
どういう効果があるんですか?
>>272 人に尋ねる前に調べる癖をつけましょうよ。
「Perl 汚染チェック」で検索すれば、解説しているページが山ほどでてきます。
簡単に言えば、外部からの入力が「汚染されているもの」という前提で
そのまま表示されていたり、正規表現に埋め込まれていたりしないか
チェックしてくれるオプションです。
(もちろん、機械的なチェックなので、頼りすぎるのは危険です)
いくら汚染チェックしてもめんどくさいから/(.*)/なんてやって 汚染はずしてたら意味ないけど、まじめに使えばうっかりミスは かなり防げる。オススメ。
mixiはPerlだがCGIではない
277 :
nobodyさん :2006/10/07(土) 14:17:31 ID:582rzz9a
はじめまして 目的のURL $url を使って URL先の拡張子を取得する方法ってありますか? また拡張子はrarとかになってても、実際クリックするとphpページ経由して ダウンロードしろとかありますが、それにも対応できるのでしょうか?
>>276 mod_perlも知らんのか
>>277 >URL先の拡張子
意味がわからん
>対応できるのでしょうか
できます
>>279 ちげえ。
そんなこと聞いてないのに知った風な口ぶりで
「mixiはPerlだがCGIではない (キリ+)」
とか得意げに言ってるから逆に恥ずかしいんだよw
>>253 >PERLソースの中身が見れた!、ソースきたねぇwww
ライブラリ覗けちゃった みたいなノリなキガス
283 :
277 :2006/10/07(土) 14:27:58 ID:582rzz9a
284 :
nobodyさん :2006/10/07(土) 14:32:19 ID:582rzz9a
>.282 ライブライリって私がつかってるlibrary.plですか?
-tとか-TってSTDINを読み取ったら、速攻でs/</</gとかかけちゃう奴らには無意味じゃね?
>>283 LWPでHEAD取得したらどうかな? それでも飛ばされるんだろか
>>285 見事に判りやすいw
まさかそのライブラリが覗けちゃう訳じゃないでしょ?
自作じゃなかったり、見られても問題なければって話は置いとく。
汚染チェックもやってないようだから穴だらけ
全ての入力はチェックしとけ
とりあえず今すぐコードに修正加えるべき
あ、HEADから Content-Type 取得して image/jpeg かどうか判断するってことね
>>286 の件
>cgi?size=○○○ ←のような部分にコマンド打たれたのかも・・・ で打たれて困るようなコード書いてるのか? セキュリティに関する書籍一冊買って一から出直せ
s/</</g
>>265 そろそろ相手側のサーバに何かあるんじゃないのかと思うが…外部からの直接参照拒否を半端に実行してるとか。
まあ以下のスクリプトで画像が表示される時とされない時の違いを探してみそ。
print "Content-type: text/html\n\n";
print "<html><body>\n";
print "<img src=\"
http://画像のパス.jpg\ ">\n";
print "<hr />\n";
print "<table border=\"1\">\n";
foreach $key (sort(keys(%ENV))) {
print "<tr><td>$key</td><td>$ENV{$key}</td></tr>\n";
}
print "</table>\n";
print "</body></html>\n";
exit;
292 :
nobodyさん :2006/10/07(土) 15:37:41 ID:582rzz9a
>>286 どうなるんでしょうね。rarのヘッダがとれるんでしょうか
>>287 修正したいんだけど、どこをどうすればいいのか分かりません。
とりあえず外部から読み込むのは
パラメーターが $in{'size'}と$in{'refreshtime'}で
キーワードが $int{'keyword'}です
>>292 とりあえず quotemeta はしなくちゃだめだね。
>>257 のエスケープ処理だと、例えば (??{ code }) を埋め込まれると実行しちゃうよね?
もちろん他の入力値も全部チェックしないと。
正直 CGI プログラム組むなら最低限のセキュリティは勉強したほうがいいよ。
CGI 入門の本が多いから、とっつきやすそうなイメージがあるけど、下手をすると
自分だけじゃなく、周り(サーバーの管理者、サーバーの他の利用者、サイト利用者)に迷惑をかける。
あと、質問を連投しているように見られるのが嫌だからって「はじめまして」はどうかと思う。
>>291 リモートポートとか以外は違いがありませんでした
ちなみにCGI設置はロリピンク、画像をロリポップとFC2に置いて試してみたんですが
どっちも見れなかったんで参照拒否とかではないみたいです
あと画像が最初だけ見れたのはその前に画像URLに直接接続していて
キャッシュが残ってた?からみたいです
perl の問題じゃないでしょそれ。 perl の問題は吐いたHTMLソースがヘンになるかどうかでしょ。それ見てヘンじゃなけりゃ他の問題。
ロリポって直接呼び出すと403になるんじゃなかったっけ? >どっちも見れなかったんで参照拒否とかではないみたいです どっちも参照拒否っていう可能性は考えてないの?
>>295 じゃぁやっぱりサーバーのほうに問題があるんですかね・・・
>>296 >どっちも参照拒否っていう可能性は考えてないの?
自分ではそういった設定?はしていなかったのでそう思いました
あと普通にHTMLにimgタグで呼び出したら見れましたので
そう思ったんですが・・・やはり何かしら設定されてるんですかね?
ソース見ておかしなところがないのなら、このスレで言うことはもうないね。 そのperlが吐いたソースを丸々コピーして、HTMLに貼り付けてアップして、それ見たら見れたわけなんでしょ? 簡単なのだったら答えるかもだけど、そんなサーバの設定や挙動なんて調べなきゃわかるわけないし。
> > どっちも見れなかったんで参照拒否とかではないみたいです > どっちも参照拒否っていう可能性は考えてないの? いやまて、そのロリピンクとやらが出力HTML中に外部サーバのファイルへの直接参照を検知すると 強制的にタグを書き換えて参照ブロックするようになっている可能性もあr(ry まあ外のサーバにあるリソースを直接覗きに行くってのは 決してお行儀がよろしいとは言えんわね。
Perlで、いわゆる注文フォームというものを作っています。 注文フォーム→確認画面→OKだったら(ボタン)→注文完了画面(データをログに保存) という流れになるようにしたいのですが、確認画面から注文完了画面を表示するCGIへ入力されたデータを渡す方法がわかりません。 hiddenフィールドを使用しようかと思ったのですが、セキュリティの面でやや不安なので他の方法を探しています。 どうしたらできるのでしょうか。
注文フォーム→確認画面 の所はどうしてるの?
>>301 <form action=get.cgi target=_blank method=post>
・・・・としてフォームに入力された情報を確認画面を表示させるCGIに送っています。
俺ならhiddenじゃない方がむしろ不安だ…
こういう処で作り方質問するような奴が作ったショッピングカートを 使うことになるユーザの行く末が不安だ。
>>302 そこはセキュリティーの不安は、ないの??
hiddenフィールどで送るのとの差はないんだけど。
306 :
300 :2006/10/07(土) 22:28:14 ID:???
このやり方自体に問題があったとは・・・。 教えてくれてありがとうございました。うっかり危険なミスをしてしまうところでした。 いったいどうしたらよいのでしょうか・・・。
ここで簡単に説明できるようなことじゃないしまじめに勉強してわかるようになるか、 既にわかっている人に作ってもらうかどっちかじゃないか。
308 :
300 :2006/10/07(土) 23:04:15 ID:???
そのようなフリーのCGIを探してみますね・・。勉強はゆっくりと。 ありがとうございました。
いや・・ショッピングカートつーか普通に注文→確認→完了の3段階だけなんでしょ? hiddenでやって確認用にメール送信でもしておけばそれで良いと思うんだけど…。
それじゃ、別のサイトからいたずらが出来そうですね
311 :
300 :2006/10/07(土) 23:49:32 ID:???
よさそうなCGIを見つけましたがやっぱり自分で作りたい・・・。 仕組みを知らないで使うのはちょっと・・・。 どこのサイトで紹介されてるのもform actionでinput type = text やらばっかりで・・・。 hiddenもダメらしいしなあ・・・。
既存の公開されたものの方が、安定していて動作保障も付いていることを忘れるな
そもそもhiddenでダメってどこからの情報なんだ?
315 :
300 :2006/10/08(日) 00:06:51 ID:???
そもそも、注文フォーム→確認画面までしか進めてない段階では注文とかは何もしてないんだろ? リクエストを変なのに書き換えられても注文完了画面を出すCGIで変なリクエスト弾けばいいだけだじゃないのか?
317 :
300 :2006/10/08(日) 00:13:14 ID:???
あるサイトの特定部分の文字列を取得して、自サイトにHTMLで整形・出力する場合 相手サーバに負荷ってどのくらいかかるものですか?
>>318 特定部分の文字列ってのがよくわからないけどHTMLだとすると
画像とか取得しない分ブラウザでアクセスするより負荷は小さい
複数回同じページを取得するような場合はキャッシュを使うことでさらに負荷が小さくなる
/tmp/hoge/foo/bar.txtやC:\temp\a\bar.txtのような文字列から、ディレクトリが存在していなければ生成し、bar.txtを生成するようなモジュールはありますか?
>>315 2個目で吹いた。
hiddenが『何故』危険と言われているのかをちゃんと理解しようね。
>>318 相手サイトの特定部分とやらを含む全てのファイルを
普通のブラウザで読み込みに行くくらいかかると思いねえ。
322 :
319 :2006/10/08(日) 00:24:42 ID:???
書き忘れた 特定部分の文字列ってのの開始位置がわかっているなら レジューム(対応してない鯖もあるし対応しててもCGIとかだと無理)を使うとさらに負荷を小さくできる(かもしれない)
323 :
318 :2006/10/08(日) 00:25:33 ID:???
ありがとうございました。
>>320 モジュールは知らんが簡単に書けると思うぞ。
if (ディレクトリ無い) {
ディレクトリつくーる;
bar.txtつくーる;
}
要はこれだけでしょ?
325 :
318 :2006/10/08(日) 00:27:27 ID:???
会社の上司がWikipediaの説明部分をPerlかなにかで取得して 2000以上もの用語集サイトを作って、それのデザインを頼まれまして。 2000以上のページにアクセスしたからこそ用語集が作れるわけで そんときの負荷ってどんなもんだったのかなあ・・・と思い、質問しましたです。
hiddenとCookieはどっちの方が糞ですか? 自分の手にかかればどっちも糞のような気がしますが、どうなんでしょ?
327 :
300 :2006/10/08(日) 00:41:15 ID:???
>>321 値段が改ざんされるから危険なのか。ただのフォームなら変な文字列にすることぐらいしか出来ないか。
個人情報を扱うから漏洩させてしまいそうで怖くて。
>>325 そういう場合は一度にどれだけ連続的なアクセスをしたかが問題になる。
2000項目全てを一気に全部取りに行ったりしたら流石にどうかと思うけど、
数ヶ月かけて順番に2000ページにアクセスしたんじゃ負荷は全く些細なものだろう。
ところでその上司にはライセンスまわりは大丈夫なのかと聞いておいた方がいいw
GFDLって結構ややこしいんだよなー
>>327 相当テンパってるなあ…。話に出ている入力→確認→完了の流れで、
確認画面のhiddenの値をどう書き換えれば他人の個人情報を漏洩できるのかちょっと考えてみ?
>>327 値段なんて鯖側に保存されているものだから外部からフォームで入力する意味が全くない
httpとかの仕組みを理解してないからhiddenが危険とかいうところだけ拾って読んで それが自分の場合にあてはまるかどうか判断もつかないんだろうな。Perl以前の 問題な気がする
「hidden が危険」 ということでなく、単に 「hiddenが安全だと思ってると危険」 ってことなんじゃないかと思うんだがなあ。 hidden の安全性はページにtextなりで公開されてるのと同じだと思え、というだけでしょ。 そのときだけ本人に公開して困るもんじゃなけりゃいいと思うが。 つまり CGI で (クッキーから読んだ) パスワードなんかを method=get 内での hidden に入れるととても危うい。
hiddenは危険だからCookieにすればいいってのも危険だよね?
hiddenだろうとcookieだろうとなんでもいいけど CSRF対策はちゃんとやっとけよ
337 :
nobodyさん :2006/10/08(日) 05:05:23 ID:o6JUYv0D
すみません。MySQL内のあるカラムにutf-8で保存されていて、 16進数になっているデータをPerl を使って日本語にデコードし直すのはどうしたらいいでしょうか? データの内容は「今日は晴れてるよ。」と入っていて、 16進数で 0xc3a4c2bbc5a0c3a6e28094c2a5c3a3c281c2afc3a6e284a2c2b4c3a3e2809ac592c3a3c281c2a6c3a3e2809ae280b9c3a3e2809acb86c3a3e282ace2809a となっています。 データの内容が日本語でなければ、以下のようにやれば、見れる事がわかったのですが、 (例えば、16進数 0x54455354 で TESTと表示される) #!/usr/bin/perl $char = pack("H*",$ARGV[0]); print "$char\n"; > ./test.pl 0x54455354 TEST 案の定日本語だと表示が上手くできません。jcode.pl でも使って、 #!/usr/bin/perl require "jcode.pl"; $char = pack("H*",$ARGV[0]); jcode::convert(\$char,'euc'); print "$char\n"; と記述すればいいのかと思ったのですが、できませんでした。 誰かご教授頂けないでしょうか?よろしくお願い致します。
>>337 ちょっとまて、「今日は晴れてるよ。」がそんなに長くなるわけない。
その16進数をデコードしても、どの文字コードにも該当しないけど、本当にあってる?
utf8 で c3a4 とかなわけないなあw
340 :
300 :2006/10/08(日) 09:50:04 ID:???
お騒がせいたしました。確かにフォームから入力する場合では、本人以外に見られないので 大丈夫ですね。もっと勉強しつつ作ることにします。ありがとうございました。
わかったのかわかってないのかわからないけどまあいいかw がんばれw
以下のソースはJavaですが、これをPerlで書くにはどうすればよいのでしょうか? byte[] b = new byte[32]; b[0] = 45; b[1] = 123; b[2] = 0xAB; for (int i=0; i<b.length; i++) System.out.println(b[i]); 文字と数字の自動変換や、byte配列の表し方などで詰まっています。
343 :
momo :2006/10/08(日) 12:34:11 ID:psSjFhxx
単純にperlの質問になるとおもうのですが、 $REC1には予め"a,b,c"があるとする。(カンマのみで区切られたデータ) $REC2には予め"あ,い,う"があるとする。(カンマのみで区切られたデータ) これを 下記の様に出力したいのですが、どの様に記述すればできますか? <table> <tr> <td>a</td><td>あ</td> <td>b</td><td>い</td> <td>c</td><td>う</td> </tr> </table> どうぞ教えてください。
>>342 それが意図する動作を説明しない限り
PerlもJavaもできてなおかつ親切な人の出現を永久に待ち続ける事になるぞ。
とCを勉強中の俺が言ってみた。
>>343 $REC1 = "a,b,c";
$REC2 = "あ,い,う";
@abc = split(/,/, $REC1);
@aiu = split(/,/, $REC2);
print "<table>\n";
print "<tr>\n";
for ($n = 0; $n < @abc; $n ++) {
print "<td>" . $abc[$n] . "</td><td>" . $aiu[$n] . "</td>\n";
}
print "</tr>\n";
print "</table>\n";
# 出力:
# <table>
# <tr>
# <td>a</td><td>あ</td>
# <td>b</td><td>い</td>
# <td>c</td><td>う</td>
# </tr>
# </table>
>>344 たんにバイナリデータを出力してクライアント側のソフトと通信したいだけなんです。
相手がC++のintで受けるので、それにあうバイナリを吐きたいです。
Cではこんな感じです。
#include <stdio.h>
int main(void) {
int i;
byte b[32] = { 45, 123, 0xAB };
for ( i = 0; i < sizeof(b) / sizeof(b[0]); i++ )
printf("%d", b[i]);
return 0;
}
hiddenに単価入れ込む設計って・・・ hiddenが悪いんじゃなくて設計がわるすぎw
>>342 my @b = ();
$b[0] = 45;
b[1] = 123;
b[2] = 0xAB;
for( my i=0; i<=$#b; i++){ print $b[i]; }
foreach my $i(0..$#b){ print $b[i]; }
こんな感じ?
壮大な勘違いしてた packとかunpackつかえばいいんじゃね?
PrintStream に println(byte b) なんてあったっけ?…と思って試してみた。
public class Test {
public static void main(String[] args) {
byte b = 0x20;
System.out.println(b);
}
}
# => 32
これなら
>>348 でいい気が…。
byte b = 0xAB に至っては、精度が落ちている可能性があると言われて
byte にキャストしないとエラー。多分、MSB が立ってるからだと思うが。
好意的に解釈するなら元プログラムがこう。 public class Test { public static void main(String[] args) { byte[] b = { 45, 123, (byte)0xAB }; System.out.write(b, 0, 3); } } んで、Perl で書くとこう。 my @b = (45, 123, 0xAB); print pack('C*', @b); もうちょっと質問の仕方、考えような。
pack/unpackの存在をすっかり忘れていました。 なんとかできそうです。ありがとうございました。
353 :
momo :2006/10/08(日) 21:40:47 ID:psSjFhxx
343>> 本当に感謝です。 どなたか分かりませんがありがとうございます。 大好きです!
結婚汁!
use warningsでなぜエラーが出るのか教えてください。 [hoge.pl] package Hoge; our $moge = 'a'; [test.pl] require "hoge.pl"; my $t = $Hoge::moge; Name "Hoge::moge" used only once : possible typo at test.pl
こんばんわ PERLにてパターンマッチ処理をしたいのですが「 >>レス番 」をキーワードにしてパターンマッチしたとき うまくひっかかりません $KEYS=">>".$resno; if ($data =~ /$KEYS/) { 処理・・・ } としているのですが、どうすればいいでしょうか?
>355 $Hoge::moge が 1 回しか使われてないから、ひょっとしたら打ち間違いじゃない?という警告が出ている。 hoge.pl 内で設定して require してるなじゃいか、と思うかもしれないが、test.pl の構文解析時には require は 評価されないので、hoge.pl の中身は perl には分からない。 ということで、$Hoge::moge が 1 度だけ使われているように見える。 use を使うようにするか、BEGIN { require 'hoge.pl'; } すると、構文解析時に評価されるようになるため、警告は出なくなる。 >356 引っかけたい文字列は元のデータ内で >> になってる? DAT ファイルや HTML なんかだと >> になってると思うけど。
>>356 さん
ずばり、そのとおりでした^^;
>>になってますねw
ちなみに
>>356 ですると
$resnoが1で
「
>>1 」のレスをひろってきたいのですが
>>123 とかもひろってきます。
どう対処すればよいのでしょうか^^;
>>347 最初からセキュアプログラミングをしていない hidden に価格データ入れているプログラムで、
後付けの「サニタイズ」をするにはどうすればいいのだろうか…。
・hiddenに十分な強度の共通鍵暗号で暗号化した価格データを入れる。
→任意の価格データには詐称はできないけど、他の商品の価格とすり替えが可能に。
・hiddenに 「商品ID」 やら 「セッションID」 やら 「価格データ」 やらを全部まとめて十分な強度の共通鍵暗号で暗号化したデータを入れる。
→これで完璧、ですよね?
>>360 その 「価格データ」 がユーザーが何やっても操作できないものならそれでいいんでない?
>>361 強度の高い暗号化を導入していればユーザが何やっても操作できるわけないよね
256bit AES とか。
いや、ってかページにいれるのは セッションID だけでいいやんそれ。
>>363 それだと、アクセシビリティ上の問題が発生するじゃん
例えばセッションの保有期間が1時間だったとしよう。
個人情報の入力中にご飯を食べにいって、帰ってきてから続きいれて決定押して
「セッションの有効期間がすぎました。お手数ですが最初からやり直して下さい。」
なんて言われたら腹がたつだろ?
下手したら、その店には二度といかないかもしれない。
有効期限を延ばしすぎると、サーバ負荷が高まるし、例え2日にしたとしても
決算確認画面まで来てで「やっぱ、購入するのは3日後にしよ。それまでブラウザは開いたままにするか。」という客がいるかもしれない。
P2PやIRC、ネットゲームの露天、タブブラウザの普及も関係してか、PCつけっぱなしの人、ブラウザのタブを長期間開く人も予想以上に増えている。
情報を全て暗号化した上で hidden にいれとけば、
・セッション使用に比べてサーバ負荷が少ない
・強度の暗号を使用すればセキュリティ上の問題も無い
・セッションタイムアウトでユーザがいらつくことがない
というメリットがある
>>360 鯖側で商品と価格が一致するかのチェックを再度すれば良いだけじゃない?
367 :
355 :2006/10/09(月) 09:37:13 ID:???
>>357 スッキリしました。
ありがとうございました。
>>365 それじゃマジで何のためにhiddenに値段埋め込んでるのかわからないじゃねえか
商品IDだけで買う商品が特定できないわけじゃあるまいし
だから普通は商品IDだけあればよくて、商品IDから引っ張れる情報は冗長だからもちまわらない
>>369-370 IDから引っ張る設計にしたら、
太郎くんが買い物かごに 500円のお米をいれました。
そして購入確認画面で内容をじっくり確認していました。
その時にサイト管理者が商品の価格を80円値上げしました。
そんな時に 「購入」 ボタンを押すと、確かに500円で注文したはずなのに、580円太郎くんのクレジットカードから引き落とされました。
こんなことがおこるわけだが?
そして太郎くんは消費生活センターに苦情を申し立て、2chでそのショップを誹謗しまくり(詐欺だの価格詐称だの)、ついでに、
新聞に投書までしました、ってことにもなりかねないぞw
値上げは別IDにしろよ
まぁあれだ、小学生相手に例えて言うと商品IDっていうのはバーコードなんだよ。 わかったよな?
>>373 なるほど
そういうことでしたか
よくわかりました>A<
POSの話ならレジで値段調整するし、値段を変更する前に値札を変更するんだが。
商品ID一つで値段別の複数IDを持ったっていい気がするんだがw
その程度のことさえ考えずにやってるって、有る意味怖いな。 どんな実装されるやら・・・
マジレスすると、期間と価格を設定したテーブルを作っておくから、 突然のセールでも対応可能。
その500円を保持しているデータを持ってるってのは誰が保証してくれるんだ?
だいたい
>>364 の理論でいくと、1ヶ月とか数ヶ月くらいそのデータ保持してても問題ないってことになるよな。
店で期間限定のチラシの値札もってきてその値段で買わせろってヤツがどこにいるんだ? 大陸か?
xrea s201サーバです。 #!/usr/bin/perl print "Hello" ; この2行を記述してtest.cgiとしてアップロード・パーミッションは755に でもScript Error The script did not produce proper HTTP headers って出ます。 対処法を教えてくださいまし
>>381 その書き方を開設してるサイトかリファレンスありますか?
二行目 print"<meta http-equiv='Content-Type' content='text/html'; charset='SHIFT-JIS'>";
>382 ぐぐれ あるいは適当な配布cgiスクリプトでもダウンロードして、 文字出力の前にどういうことをやってるかでも見てみりゃいい
>>383 ( ´_ゝ`)
>>382 自分で調べようという努力をしない香具師、自力で調べる能力の無い香具師はプログラミングに向かない。
お前さんはどうやらプログラミングに向いてないようなので、さっさとやめましょう。
print "Content-type: text/html\n\n"; これをつけたら直りました。 サンクス
改行についてです #!/usr/bin/perl print "Content-type: text/html\n\n"; print "Hello\n"; $count = 1; print"$count\n"; $count = 100; print"$count"; と、 #!/usr/bin/perl print "Content-type: text/html\n\n"; print "Hello<br>\n"; $count = 1; print"$count\n"; $count = 100; print"$count"; では、表示させたさい、Helloのあとに改行がつくかつかないかの違いなのですが 解説サイト等ではダブルクォーテーション内で\nをつかば改行とか書いてあるんですけど 実際には改行されず、スペースキーを打ったような状態になってます、 なんででしょうか?
print "Content-type: text/html\n\n"; って指定してるんだろ? 『html』なら<br>でなきゃ改行にならない。 『html』ではない別の指定でなら、\nで改行になる。 その解説サイトの解説をすみずみまでよく読んだか? あるいはその解説サイトがいいかげんな可能性もあるが。
>>389 その説明もかなりいい加減だと思うが...
htmlの仕様を勉強した方がいいよ。 改行コードは半角スペースとして認識されるとか。
は…?
こんばんは。 モジュールを評価して欲しいのですが、 どこのスレがいいでしょうか?
ここでいいよ
CGIが関わると拒絶されるところを紹介しても(ry
>>397 このスレの最近の流れを遡ってみたよ。
>>388 # HTML の記法
>>380 # HTTP
>>318 # に至っては
>>325 「Perlかなにかで」
>>300 からの hidden 云々 # Web アプリに特有の安全性の問題
>>253 # Perl による Web アプリケーション実装における安全性の問題
# (そして CGI の文脈でしか考えてくれないため
>>270 のようなトンチンカンなことに)
>>251 # サーバ間のリソース参照
これ全部あっちでも取扱わなきゃダメかなあ?
できれば勘弁して欲しいなあ。
嫌なら見なければいい
WebProg板にあるのに何をw
>>399 うん、もっともだけど、僕両方見てるのでそういうんでもないんだよ。
ただ僕は、あちらでは「Perl の話」をしたいと思っていて、こちらでは Perl/CGI を軸とした Web アプリケーション開発全般の話題を期待しているわけよ。
で、両方を混ぜちゃうと
>>398 で挙げたようないわば「Perl 外」の話が「Perl の話」とごっちゃになってしまい、僕にとってあまりうれしくない、ということなんだ。だから決して「Perl 外」の話が嫌で見たくない、ということではないのよ。
初歩的だと思うのですが質問させてください。 $hogeに1〜3の数字が入るのですが(「123」や「13」「2」だけのときもあります) 1がふくまれていたら「あか」、2が含まれていたら「あお」、3なら「きいろ」というような置換をしたいのですが、 s///; 1行でまとめて記述できますか? できなければ $hoge =~ s/1/あか/; $hoge =~ s/2/あお/; $hoge =~ s/3/きいろ/; と書くしかないのでしょうか〜? 調べてみたのですがイマイチわかりません・・・。
!無理ですか・・・ 即レスありがとうございました・・・orz
>>402 できる。 s///ge を使いなされ。
>>402 ごめん。準備に一行使ったので二行になっちゃった。
@colors = ('あか', 'あお', 'きいろ');
$hoge =~ s/([1-3])/$colors[$1 - 1]/eg;
$hoge =~ s/([1-3])/('あか', 'あお', 'きいろ')[$1 - 1]/eg;
408 :
406 :2006/10/10(火) 01:03:57 ID:???
409 :
402 :2006/10/10(火) 01:05:03 ID:???
411 :
402 :2006/10/10(火) 03:00:05 ID:???
再びつまりました・・・。 $hogeに1〜3の数字が入るのですが(「123」や「13」「2」だけのときもあります) if( $hoge =~ /1/){$check[1] = 'checked';} if( $hoge =~ /2/){$check[2] = 'checked';} if( $hoge =~ /3/){$check[3] = 'checked';} これと同じようなことをできるだけ短い行でしたいのですが ためしに if ($c_hp =~ /([1-3])/){ $checked[$1] = 'checked';} にしてみましたが、初めの数字しか反応しません・・・(あたりまえですが) if以外を使えばいいのでしょうか、、、やり方が思いつきません。
412 :
402 :2006/10/10(火) 03:12:46 ID:???
↑$c_hp は $hoge の間違いで、さらに $checked は $check の間違いです・・・orz
$hoge =~ /$_/ and $check[$_] = 'checked' for qw(1 2 3); とか $check[$1] = 'checked' while $hoge =~ /([1-3])/g; とか? 二番目のほうは同じ数字が複数回出てくる場合無駄が出るね 逆に一番目のほうは三回別のパターンで頭から調べなおしだから、 それ以外の場合では効率が悪そうな気がする。
414 :
402 :2006/10/10(火) 03:57:19 ID:???
>>413 ありがとうございました!!
同じ数字は複数出ない設定なので2番目のほう利用させていただきます!
>>405-407 おまえらハッシュの存在忘れてね? e なくてもできるほうがいいと思うんだが。
%colors = (1 => 'あか', ・・・);
$hoge = s/([1-3])/$colors{$1}/g;
>>415 ハッシュにしなくとも
>>406 なら /e は要らない。
変数展開コンテキスト中でも配列の添え字やハッシュのキーには
式を使える。
うわ、ほんとだw しらんかったw
418 :
nobodyさん :2006/10/10(火) 14:23:04 ID:M4r4Q87U
すみません教えてください。 $REC1 = (1,2,3,4,5); @test1=split(/\,/, $REC1); for($i=0; $i<@test1; $i++){ @aaa = $test1[$i] } とすると、わたしのイメージでは$iが変化する度に$test1[0]から$test1[4] が@aaaに12345と代入されていくと 思ったのですが実際は一文字しか表示されませんでした。 変数が変化する度に配列に入れていく方法はどうしたらできますか。
$REC1= '1,2,3,4,5'; push(@aaa, $test1[$i]);
420 :
nobodyさん :2006/10/10(火) 14:53:37 ID:M4r4Q87U
419さん 早速できてしまいました。 おかげさまです。ありがとうございました。
配列を別の配列に入れるのに添え字でループまわしてpushってしないだろ。 @aaa = @test1か@aaa=split ... で十分だと思うのだが。 ここで書いてない部分になにか必要な処理がはさまるのかもしれんけど。
C言語の配列のアドレスは int型4バイトの場合s[1]のアドレス = s[0]のアドレス+4という風に 順当に増えていきますが、Perlの配列の場合どうなっているのでしょうか? @c = (1,2,3);のとき SCALAR(0x804c380)、SCALAR(0x804c464)、SCALAR(0x804c494)となりました。 それどころか自分で作ったあるプログラム中の配列では $ref2 = \@$ref[2]; $ref3 = \@ref[3]; $ref2 = SCALAR(0x8063634) $ref3 = SCALAR(0x8063610)という風にインデックスは増えているのに アドレスの値は減ってしまいました。
気にしちゃいけません
その辺に興味があるのなら処理系のソース読むか「実用Perlプログラミング」(第2版じゃなくて Sriram Srinivasanが書いた方)の20章「Perlの内部構造」を読むといい。 かいつまんでいると、Perlの配列はCのようにいろいろな型を要素にもった配列ではなくて、全て Perlのスカラー型をあらわす構造体へのポインタの配列になっている。アドレス順に並んでる のはこのポインタが並んだ部分だが、君がリファレンスとって見ているのはポインタが入ったハコ のアドレスではなく、そこに入ったポインタがさした先のスカラーのアドレスなので、これがどういう 順番になっているかはPerlのメモリ割り当てシステムの気分しだい。
425 :
nobodyさん :2006/10/10(火) 19:24:30 ID:kpxOKRmy
youtubeのファイルを読み出してプレイヤーとサムネイルの表示がうまく出来ません。
http:// check 2ch.is.land.to/ 2chsea rcher.cgi?page=0&mobile=&view=10&category=youtube&keyword=&selecttype=all&TARGETADDRESS=
http://pc7.2ch.net/streaming/dat/1155343107.dat ↑を保存してそれをhtmlで保存したもの はサムネイルが表示される!
http:// check 2ch .is.land.to/ testing.html
cgiからyoutubeファイルにアクセスするとサムネイルが取得できないのかと思って
上の保存したものを、ただcgiで吐き出すページでも サムネイルが表示できる
http:// check 2ch .is.land.to/ testing.cgi
なんで一番上のcgiだけサムネイルが表示されないか分かる方いたら教えてください。
上のとき、画像のプロパティで見れる画像のアドレスは何になってるん?
427 :
nobodyさん :2006/10/10(火) 19:35:49 ID:kpxOKRmy
>>426 アドレスとかタグに関して全く同じ記述なんです
428 :
nobodyさん :2006/10/10(火) 19:38:04 ID:kpxOKRmy
>>426 表示したての1ページ目は真っ黒でサムネイルは表示されず
2ページ目からはサムネイル表示されます
そして、また1ページに戻るをしたら1ページ目も表示される
なんででしょう^^;
謎すぎです
じゃーyoutube側で何かしてるとかじゃね? 情報少ないんでなんともいえないけど、違うのがアドレスだけ、ってことなら、 とりあえずその長いアドレスをどうにか直してみたら?
430 :
nobodyさん :2006/10/10(火) 19:54:09 ID:kpxOKRmy
>>429 一度
index.cgiに変えましたけど 同じでした
なのでソースの中身なのかもしれません。
とりあえずブラウザからyoutubeに対して同じリクエストを出しているかどうかを 切り分けた方がいいんじゃないか。
432 :
nobodyさん :2006/10/10(火) 20:15:37 ID:kpxOKRmy
>>431 どういう意味ですか?
何と何を切り分けるの?
youtube話題は終了 去れ
>>434 お前みたいなキモいのがいるから俺らまで勘違いされちまうじゃねーか!
スレ違い指摘されただけでムキなるなやチョン
438 :
422 :2006/10/10(火) 21:55:48 ID:???
>>424 @a = (1,2,3);
と宣言した時点で1、2、3が適当なアドレスに振り分けられて
配列の要素の中にそのスカラー値へのポインタが格納されているのですかー
ありがとうございましたm(_ _)m
めんどくせーから youtube-dl でも落として、`youtube-dl` しとけ。
質問です。 アップローダーのCGIなどよくありますが、 これらにアップロード中の進行状況表示(転送速度あるいは転送済量) を表示する機能を追加することが出来ないかと考えております。 javaなどの可能性も含めて どなたか知恵を拝借させてください。 よろしくおねがいいたします。
441 :
406 :2006/10/11(水) 20:46:56 ID:???
>>411 すごい勢いで遅れたけどこれで。e にこだわる係。未テスト。
$c_hp =~ s/([1-3])/ $checked[$1] ||= 'checked'; ('あか', 'あお', 'きいろ')[$1 - 1] /eg;
>440 java アプレット Flash (MX以降かも) ActiveX で実装可能 上から順番に汎用性は高いかと思う
>>440 javascriptかjavaかflashでも使えばなんとかなるかもしれん。
特に鯖側に機能はいらないのでそれらのスレで聞いたほうが
いいよ。
鯖側は通常のあぷろだスクリプトのままでOK(若干の手直しは必要かも) まぁftp開けて転送しちゃうのも手
Ajax
446 :
440 :2006/10/12(木) 02:52:06 ID:???
多くのレスありがとうございます。 やはりjavaが実用的かと思うので 試行錯誤してみたいと思います ありがとうございました。
mod_uploader
ご主人様?
mod_uploaderが原因不明の暴走起こして apacheはもちろん 全てのサービスが通信不能になった私が来ましたがなにか。 ちなみに原因判明まで1週間もかかった自分も自分だがなorz
>>449 怖くて使えない自分よりも漢だ。
元気出せ!
453 :
451 :2006/10/12(木) 22:04:51 ID:???
ヒアドキュメント内でコメントアウトすることできますでしょうか?
>>454 Perl処理系が認識するコメントにはできないが、ヒアドキュメントで得られた文字列を適当に加工する
コードを追加する、という手はなくもない。
print strip_comment(<<FOO);
hoge
# hoge
hogehoge # hoge
FOO
sub strip_comment {
my($s) = @_;
$s =~ s/\s*#.*$//gm;
return $s;
}
>>454 答えようとしたら同ネタが既に出てたので正規表現だけ。
$s =~ s/(^)?[\t ]*#.*(?(1)\n)//gm;
>>455 大昔にベンチ取った時、サブルーチン末で値を返す場合は
陽に return しない方が有為な差が出る程度に速かったんだけど、
今の環境だとどうなんだろうね。興味あったら計ってみて下さい。
変に最適化するより分かりやすいコードを書く方がいいと思うなぁ
そんな処理速度が問題になるようなところはXSで書けばいいのに。
>>458 XSってなんでしょう…。
XSSなら知ってますが、XSなんて聞いたことないですね〜。
>>449 ご主人様と呼ばれて喜んでいるようなキモい人間が書いたソフトを
よく自分のマシンで動かせたね。w
ググれ
引数みたいにしてある @ は何でしょうか? sub md5_hex(@) { unpack 'H*', &md5; }
>>463 perlsub の Prototypes 参照。
>>464 引数の型を定義しているということですか。
サンクス。
掲示板での投稿の処理で現在 $FORM{$name} = $value でフォーム内容をわけていますが、 hp だけ情報を結合したいのですが if($name eq 'hp'){$FORM{'hp'} .=$value;} else{$FORM{$name} = $value;} としてみましたがうまく動きません。(hpの最後の情報だけ取得されます) if($name eq 'hp'){$FORM{'$name'} .=$value;} else{$FORM{$name} = $value;} としてみても結果は同じです(当たり前ですが・・・) どのようにすればいいのでしょうか。orz
468 :
466 :2006/10/15(日) 23:57:14 ID:???
レスありがとうございます・・・(・ω・`) しかし、思いのとおりに入っていないのですが… ちなみにhpの指定をせずに $FORM{$name} .= $value; にすると ちゃんとhpに連結したデータが入ることは確認しています。。
たぶん、 $name が純粋に 'hp' ではないんじゃないかな。 後ろにスペースが入ってるとか、改行がついてるとか、大文字小文字が違うとか。 if($name =~ /\bhp\b/i){$FORM{$name} .=$value;} else{$FORM{$name} = $value;} だとどう?
470 :
466 :2006/10/16(月) 00:20:30 ID:???
>>469 できました・・・!!
=~ //i はわかるのですが、\bは何を意味するのか
調べてみたのですがいまいちわかりません…!
よければなんと言う呼び名か教えていただけませんか?
自分で調べたいので…!
>>470 動いたようでよかったです。
\b は正規表現での単語境界を表すメタシンボルです。
473 :
466 :2006/10/16(月) 00:49:49 ID:???
ちなみに/iは無くてもできましたが、
>>469 を使うと
後にでてくる
if ($FORM{'hp'} !~ /[1-5]/){&error("hpwo選択してください");}
が反応しなくなってしまいました…。
(
>>468 の場合だと動いていました)
hpには1から5の数値がランダムで入るのですが…
連投すいません。
>>473 そのコードだと、
> hpには1から5の数値がランダムで入るのですが…
が真である限り、$FORM{'hp'} !~ /[1-5]/ は必ず偽になるため &error() が実行される事はありません。
そういうことではなくて?
475 :
466 :2006/10/16(月) 01:01:49 ID:???
>>474 あぁ、書き方がわるかったです、申し訳ない!
必ず偽になるようにテストしているのですが
&error() が返されてしまうのです。
あー、そういう風に使うつもりなら $name からスペースや改行などをとりのぞいて小文字で統一するなりして ちゃんと 'hp' になるようにしたほうが、バグにはならないね。chomp、s///、lcとかでやってみて。 てか、条件の後出しはやめましょう。
477 :
466 :2006/10/16(月) 01:07:01 ID:???
>>476 そうですね、色々ややこしくなってそうです。
改めて内容の見直ししてみます。
>>466 の状態でできていれば問題なかったのですが・・・(・ω・`)
レスありがとうございました。助かりました。
478 :
Perl初心者の中学生 :2006/10/16(月) 19:34:27 ID:1M63qM8/
はじめまして。PerlでCGIを作成したのですが疑問があったので質問にきました。
スレ違いなら誘導してくれるとありがたいです。
質問の内容はカウンターを作っていたのですが、作成途中にできた二つのソースが
同じ内容なのに動作に違いがあることに気づき、原因がわからない。ということです。
以下のソースを見てください。
http://love.meganebu.com/~freedomworld2006/count.txt このソースはCGI形式にして実行すると、
<img src="img/0.png" alt="0> <img src="img/0.png" alt="0> <img src="img/0.png" alt="0> <img src="img/1.png" alt="1>
と、そのまんまブラウザに表示されてしまいます。ですがカウントはしているようです。
http://love.meganebu.com/~freedomworld2006/count2.txt しかし、こちらは上の失敗したソースと同じなのにちゃんと画像が表示され動作します。
違いといったら半角のスペースや改行があるかないかです。
なんでこんなことが起こるのか全くわかりません。ちなみにインタプリンタパスは省略してあります。
わかる方、どうか教えてください。お願いします。
今帰宅中だから帰ったら見てみるよ
>>478 count.txt 19行目:
alt=\"$n\>\n";
count2.txt 18行目:
alt=\"$n\">\n";
>>480 やはりソースミスでしたか・・・こういうのは人に言われて初めて気づくんですよね・・・。
ご指摘ありがとうございました。
本当に助かりました。
482 :
nobodyさん :2006/10/16(月) 23:51:46 ID:ZHxCJrpx
すみません。ネットショップを運営してるのですが、 掲示板とショッピングカートはレンタルのサーバーをかりて、 HPからリンクして使っています。ところが掲示板荒らしで困っています。 改行を繰り返し、とても見にくくて、アクセス拒否してもネットカフェなどから 投稿してきたりで、どうしようもありません。 文字数の制限は設定サービスにあるのですが改行制限はサービスにないといわれ、 $value =~ s/\r\n/<BR>/g; $value =~ s/\r/<BR>/g; $value =~ s/\n/<BR>/g; $value =~ s/(<BR>){5,}//g; ↑ これを使えと言われたのですが、本当に初心者でよくわかりません。 サーバーを代えたほうが早いですか??
てーか、ショップってことは掲示板とかもどこかに作ってもらったものなんでしょ? そのひとが 「改行制限はサービスにない」 とかゆってんの? ワロスww そしてこれを使えの例がひどくてさらにワロスwww 参考までに作者のサイトおしえてください>< 〜.cgi のソース内を 「$value =~ s/\r/<BR>/g;」 で検索すればそれっぽいとこがあるから追加すればいいんじゃない? kwskはわからんけど あとサーバ変えても同じだと思うんだけど。
えっと、作ってもらったんじゃなくて掲示板をかりています。
ttp://advenbbs.net/ ↑
ここのです。
$value =~ s/\r\n/<BR>/g;
$value =~ s/\r/<BR>/g;
$value =~ s/\n/<BR>/g;
$value =~ s/(<BR>){5,}//g;
↑
コレを使えと言ったのは、元PCの先生なんですが。
なんか、自分が無知すぎて恥ずかしいので、
他に対策をとってみます。
すぐレス下さり本当に有難うございました。
まずは、勉強してみます。
うすうすそうかとは思っていたが・・・ >ベースはKENT-WEBの人気レス式アイコン掲示板YY-BOARDで見た目も使いやすさはバツグン! (ノД`)アチャー
まあ、「レンタル掲示板」 じゃソース書き換えもできないので、 他の、しっかり対応してくれるとこから借りるのをオススメしますー。
有難うございました m(__)m PS.なんでみなさん、IDが???なんでしょう???
動作が違うなら内容が違う→同じかどうかチェック→diffって流れね、たぶん。
diffとは何でしょうか。 調べてみたのですがよくわからない部分もあったのです。 できたらやり方を教えてくれませんか?
>>490 >>調べてみたのですがよくわからない部分もあったのです。
を
調べてみたのですがよくわからない部分もあったので。
に訂正します。。。
「diff コマンド」
>>493 windowsには付属してないから、diffとかでぐぐってwindowsで使えるそれっぽいのを使ってみるといいよ
某秀○とかでも内容比較できるけどスレ違い
>>490 目視でのチェックは必ず見落とすからdiffというプログラムを使って比較する。
Windowsだったら、FCというコマンドがある。MSDOSの頃からある古いプログラムだけど、
目視より100万倍まし。
コマンドプロンプトで
fc file1 file2
499 :
497 :2006/10/17(火) 23:55:16 ID:???
>>498 あ、……ああ、ほら、練習も兼ねて、な?
> あ、……ああ、ほら、練習も兼ねて、な? ゴミ生産して何かいいことあんの?
それなりに経験になる。
> それなりに経験になる。 K*NT 的な人間を増やしてどうなるんかね。w
色々と検索していたらDFというよさそうなソフトを見つけたのでこれを使っていきたいと思います。 機会があったらPerlで作ってみたいです。 スレ違いの話題になってしまいましたが皆さんお答えしていただきどうもありがとうございました。
504 :
nobodyさん :2006/10/18(水) 17:13:18 ID:ZtKQFgfZ
お小遣いサイトを作りたいんだすが、お小遣いサイトにあるような ユーザー登録、マイページ、広告サイトに登録するとポイントがあがる、 クリック広告をクリックするとポイントがあがる。 などそのような機能のスクリプトがわかりません・・。 どうしたらいいでしょうか??^^;
しねばいいとおもうよ
マルチだから死んでいいよ。つーか死ね。
$site = '(?:www.yourfilehost.com)';
$ext = '(?:zip)'
while($data~ m/((mms|h?ttp):\/\/(?:[\w\/\.\?\=\-\&\:]*($site)?(\/)?([\w\/\.\?\-\=\&\:]*|[\w\/\.\?\=\-\&\:]*\.$ext[\w\/\.\?\=\-\:]*)))/g) {
$output = $1;
}
だと $dataに入っている ttpから始まるどのようなアドレスでも抽出して$1に入れてしまいます。
そうではなく
mms://アドレス;ポート番号 ←や
http://アドレス ;ポート番号 ←や
ttp://アドレス ;ポート番号 ←や
$siteに含まれてるサイト先 や
$extに含まれてる拡張子が あるときだけ $outputには入れられないですか?
できますよ。 それよりまずバックスラッシュとか見通しがひどいんで、 m/〜/ → m{〜} にして [\w\/\.\?\=\-\&\:]* とかも $変数 = qr/〜/ にして書き直してきて。
>>508 スキームが http, ttp, mms の何れかで、且つ
$site のドメインで、且つ
$ext の拡張子を持つファイルの URL という意味なら
$scheme = qr{(?:h?ttp|mms)};
$site = qr{(?:www\.yourfilehost\.com)};
$ext = qr{(?:zip)};
@output = $data =~ m{$scheme://$site(?:\d+)?/[\w!\$&-;=@-\[\]~]+\.$ext}g;
511 :
510 :2006/10/19(木) 12:17:14 ID:???
訂正。正規表現中の @ の前に \
>>509-510 亀レスすみません。
一応↓のようにして出来たには出来たのですが
http://203.111.199.131:8080/test.m3u ←を拾ったとき、test.m3uまで含めたいのですが 8080の後ろで切れてしまい
それを$outputの中に入れてしまいます。
↓ここの表記に問題がありますか?
while ($data=~ m/(((?:$site_m)[\:\d\w\-\.\/\=\?\!\-\%\&\_\#]+\:[\d]+)|h?
ttp:\/\/ (?:[\w\/\.\?\-\%\&\=]*$site\/[\w\/\.\?\-\%\&\=]*|[\w\/\.\?\-\%\&\=]*\.$ext[\w\/\.\%\&\-\?\=]*))/g) {
$output = $1;
}
>512 問題ありません。
エスケープしすぎだろ常識的に考えて・・・
>>509 にレスはしてるが読んでないんだね
質問してるのに何でアドバイスは無視してるの?
ブラケットの中はエスケープしなくていいだろ常識的にk(ry
質問させてください 私がPERLで作ったCGIをPCにて閲覧している時、「戻る」ボタンを押したら 前ページのキャッシュを読み込むので、ロード時間がかからず表示が速いのですが 携帯電話で「戻る」をすると毎回CGIをロードしなおして時間がかかります。 携帯電話でも前ページを表示した時にキャッシュを読み込ませる方法はありますか?
質問です。 AAA BBB CCC というファイルがあります。 一行目がAAAであるときのAAAとCCCを AAA CCCというならびで抽出したい場合 foreach(<STDIN>){ if(/(AAA)/){ print "$1"; foreach(<STDIN>){ if(/(CCC)/){ print " $1\n"; last; } } } } で上手くいきません。 ご教授お願いします。
>>519 魔法のiランドとかaspとかですよね?
魔法のiランドとかなら 戻るしても キャッシュが読み込まれてるっぽいので
携帯電話にはキャッシュ機能はついてそうですね
Perl の話じゃなくて、携帯電話向けの開発の話だから、 他のスレでやった方が御互いのためだと思うが。
>>521 PERLで組んでてそうなってるんだから
ここでもいいんじゃね?
教えて下さい 文字コードをjisからeucに書き直したのですが GETで送る文字が受け取り側で化けてしまいます。 いろいろやってみたのですが上手くいきません 対処法ありましたら教えて下さい。
>>523 特別なこと書いてないからFORMからの送信だと思うけど
送信側の文字コードは確認したのですか?ヘッダの指定はしてありますか?
>>524 説明不足ですみません。
送信側の文字コードはEUCです。
FORMからではなくhtmlリンクに *.cgi?abc=あいうえお と記述しています。
(本当はpostしたいのですが別窓を開いて表示させたいので仕方なく)
526 :
523 :2006/10/21(土) 06:16:03 ID:???
正確に書くと<a href="javascript:openwin('*****.cgi?title=$aaaa[1]')">です。 スクリプトや格納してあるデータは全てEUCにしてあります。
すみません^^; 受け側のヘッダもEUCです。
528 :
nobodyさん :2006/10/21(土) 07:00:16 ID:??? BE:596111696-BRZ(3600)
直接、日本語を入れてるんですか? それは文字コードやPerlの問題ではないですよ URLエンコードしないと駄目ですよ
529 :
523 :2006/10/21(土) 07:51:25 ID:???
すみません勉強してきます^^; ありがとうございました。
アクセスカウンタを製作しています。 動くには動くのですが、ほんのたまにリセットされてしまい、また0からカウントしはじめます。 対処方法などご存知でしたら教えてください
533 :
nobodyさん :2006/10/22(日) 02:09:49 ID:Wr8nDhA3
タイムスリップなんてことになってる...。 @array = qw(0 1 2 3); foreach my $hoge(@array){ push @new_array,$hoge } my $x_array =[]; foreach my $hoge(@array){ push @$x_array,$hoge } print @new_array; print @$x_array; どなたか、これらの違いを教えてください。 速度? 予約済み変数とかいろいろ調べてみたんですが、 "[]"って何か知ってる方がいらっしゃったら よろしくお願いします。 print []; ->ARRAY(0x274f18) ナニコレ?
無名配列へのリファレンス
536 :
nobodyさん :2006/10/22(日) 02:50:36 ID:Wr8nDhA3
537 :
nobodyさん :2006/10/22(日) 13:54:06 ID:envKHppf
シロートですが、どなたか教えて下さい。 if ( @list1[2] eq @list2[3] ){ とやってて、@list1[2]と@list2[3]にはそれぞれ"00001"が入っているのですが、 条件に一致しません。 if ( @list1[2] == @list2[3] ){ とすると一致します。 この例では値が"00001"ですが、実際は文字の場合もあるので、eq をつかいたいのですが、 どうしたらよいでしょうか? Perlは文字とか数値とかあんまり意識せずに使えると思ってましたが、こういう場合は 別なんでしょうか?
すみません、質問です。 ppmでモジュールをインストールしたいです。 モジュールはSOAP::Liteです。 >search SOAP::Lite から調べていくと、以下まで達しました。 ppm> search ResourcePool-Resource-SOAP-L Using cached search result set 7. 1. ResourcePool-Resource-SOAP-~ [1.0101] SOAP::Lite bindings for ResourcePool 2. ResourcePool-Resource-SOAP-~ [1.0101] ResourcePool-Resource-SOAP-Lite ここで、正式名称が分からないので、インストール/確認ができない状態です。 チルダで省略されている部分を参照するにはどうすれば良いでしょうか? 宜しくお願いします。
ここまでマルチが多いのは、誰かが質問を転載してるんだろうな。 恐らくマルチして指摘された奴が腹いせでやってるんだろう。
ここまでマルチが多いのは、誰かが質問を転載してるんだろうな。 恐らくマルチして指摘された奴が腹いせでやってるんだろう。
必死だな
コピペウゼー('A`)
ID表示して質問するようにすればいいよ。
CGI::Sessionを使用したいのですが 1, ユーザ→CGI だと上手くいくのですが、 2, ユーザ→CGI→モジュール→CGI のモジュールで my $session=CGI::Session->new(undef,$sid,{Directory=>'../session'}) でデータを取得出来ないのですが、どうすれば取得出来るのでしょうか?
> 1, ユーザ→CGI だと上手くいくのですが、 > 2, ユーザ→CGI→モジュール→CGI これが意味不明だけど、$sidにはなにが入ってるの? 第2引数ってCGI.pmのオブジェクトじゃ駄目なの?
質問です。 $MOJIRETSU="<太字>テスト1</太字><太字>テスト2</太字><太字>テスト3</太字><太字>テスト4</太字>"; とあったときに<太字>〜</太字>を→<b>〜<b>にして出力したいです。 そこで $MOJIRETSU =~ s/<太字>(.*)/太字/<b>$1<\/b>/; にして実行したら <b>テスト1</太字><太字>テスト2</太字><太字>テスト3</太字><太字>テスト4</b> というように最初の「太字」と最後の「/太字」を参照にして置き換えをします。 それぞれで置き換えを行って <b>テスト1</b><b>テスト2</b><b>テスト3</b><b>テスト4</b> という結果が欲しいのですがどうすればよいでしょうか?
/太字/b/ //b/\/b/
>>549 $MOJIRETSU =~ s|<\Q太字\E>(.*?)<\Q/太字\E>|<b>$1</b>|g;
>>550-
>>551 ありがとうございました。その方法だと出来ました。
もう1つ質問させていただいてもいいですか?
ダメです! って言ったらどうすんだろ
,. ‐''三ヾ´彡シ,=`丶、 /'".:=≡ミ_≧_尨彡三:ヽ、 //.:;:彡:f'"´‐------ ``'r=:l /〃彡_彡′,.=、 ̄ ̄ ,.=、 |ミ:〉 'y=、、:f´===tr==、.___,. ==、._ゞ{ {´yヘl'′ | /⌒l′ |`Y} ゙、ゝ) `''''ツ_ _;`ー‐'゙:::::l{ あきらめたら . ヽ.__ ,ィnmmm、 .:::|! そこで試合終了ですよ・・・・ ,.ィ'´ト.´ ´`"`"`゙″ .::::;' イ´::ノ|::::l \ "' :::/ ::::::::::::|:::::l ヽ、 ..:: .:::/.、 :::::: ::: |:::::ヽ ヽ、.......::::/..:::/!\\ ::::::::::: |::::::::ヽ ``''‐--ァt''′ |!:::ヽ:::\ :::::::::::::|::::::::::::ヽ、 /i|iト、 |l:::::::ヽ:::::\ :::::::::::::|::::::::::::::/:ヽ、 ∧|i|i|i|〉. ||::::::::::ヽ:::::::\
すごい初心者なことなんですが^^; フォーム入力から取得した $in{'address'}の最後が「 .zip 」で終わっているか確認するためには if($in{'address'}){ # .zipで終わってないときのエラー処理 } どういうふうにifを組めばいいですか?
if( $in{'address'} !~ /zip$/){
$data =~ s/<a href=(.*?)>(.*?)<\/a>/開始$2終了/g;
562 :
nobodyさん :2006/10/23(月) 19:12:11 ID:I2ot/ZmI
これは酷い
3日ぐらい考えてくれ
おれから言えることは まず煮詰まったら外の空気に触れながら景色を見ろ
>>563 おまえmixiで同じ質問してるだろ。死ねよ。
568 :
nobodyさん :2006/10/24(火) 17:56:30 ID:S0nwA48Z
Perlを始めて間もなくて、分からないことがあって困っています。質問させてください。 現在ウェブメーラーを自作しようとしておりまして、POP3サーバにアクセスしてメールの差出人のメールアドレス、件名、受信時刻、本文を表示しようとしているんですが、件名だけがデコードの仕方が分からずに困っています。本文は Encode::from_to($body,"iso-2022-jp","shiftjis"); だけでなんとかなってしまったのですが、件名はこれだけだとうまくいかず、デコード前の =?ISO-2022-JP?B?〜〜〜?= と表示されてしまいます(〜〜〜は任意の内容)。調べたところヘッダー部はエンコードの方法が異なっているというようなことを見たので、 $Subject = decode_base64($Subject); としてみたのですが正しい表示はされません。どうしたらうまくいくでしょうか。初心者ゆえくだらない質問かもしれませんが、どうかご教示ください。
570 :
nobodyさん :2006/10/24(火) 19:44:51 ID:FUbqOCaM
ここで尋ねていい物かどうか迷ったんですが質問。 掲示板CGIについて。 2ちゃんねるでは半角カタカナを使っても文字化けってしないですよね。 でも私の掲示板(ベースはKENTのMiniBBSとか、PrismWebのテンプレ掲示板とか) では、半角カタカナを投稿すると???などという風に化けてしまいます(ログに記録する時点で化けてる)。 この違いって、どこから来るんでしょう? エンコード方法?それともサーバの問題?jcodeモジュールの問題?
2chはSJIS以外は受け付けない
エンコードとデコードが一致してない
573 :
nobodyさん :2006/10/24(火) 20:10:58 ID:myoH6Gq+
ここには能力が足らず答えられない奴ばかりですか?まぁ自分もわからんが、
>>568 の質問放置で可哀想
メールの仕様をちょっと調べれば済むような事で質問するから放置されるのだよ。
>>568 キーワードはMIME header
詳細はスレ違い
これでいいのか?
576 :
nobodyさん :2006/10/24(火) 21:13:31 ID:/nLWiTuI
perlにてtxtファイルを生成しています。 perlソース自体はEUCで記入しており、生成されたファイルも EUCコードなのですが、このファイルをブラウザ(IE)で開くと SJISエンコードで開いてしまい文字化けしてしまいます。 ブラウザがEUCエンコードで表記されたファイルという事を 認識していないようなのですが、どのようにすればEUCとして 認識してくれるのでしょうか?
>>576 IEを窓から投げ捨てる♪
か、適切なcharsetを指定してあげる♪
> IEを窓から投げ捨てる♪ なにそれ?
なにって、そのままの意味にしかとれんが…
イミフ。
>>576 EUC-JP のファイルを IE で確実に読みたいなら、IE のエンコード設定を EUC に固定すると良いでしょう。
方法は、あらかじめ IE のメニューから「表示」→「エンコード」→「日本語 (EUC)」を選んでおくだけです。
できれば次は Perl の質問をしに来てください。待ってます。
582 :
nobodyさん :2006/10/24(火) 22:19:35 ID:Aum0PYqJ
Content-type: text/html; charset=euc-jp
> EUC-JP のファイルを IE で確実に読みたいなら、IE のエンコード設定を EUC に固定すると良いでしょう。 なんで固定するの?バカじゃね?
585 :
581 :2006/10/24(火) 23:26:18 ID:???
>>584 ローカルファイルを開く場合には HTTP レスポンスヘッダによるメタ情報の供給を期待できないからです。
また HTTP 越しに text/plain なファイルを直接要求する場合であって、サーバの設定が原因で文字化けする場合には、サーバの設定変更が必要になるでしょう。
その権限が与えられていないか、または方法がわからない場合、「文字化けしないようにブラウザでファイルを開く」確実な方法はやはり
>>581 で述べたとおりになります。
そろそろ Perl の質問をしてくれるとうれしいです。
保存してエディタで開けばいい ただそれだけじゃないか・・・
他人にネット上で見せたいんでしょ。
588 :
nobodyさん :2006/10/25(水) 07:42:09 ID:JgcYGtyQ
ただ出力時に見る人の環境に合わせて文字コード変換するだけでいい
goto じゃw
公開してるならSJISで出力するcgi組んでそこを叩かせればいい ローカルなら画面右クリック→エンコード 文字化け相談スレはここですか?
ひがみ根性まるだしの奴が このスレは多いね 見てて、すっげぇ香ばしいw
誤爆?
VIPから出張してきてるやつがいるのな ごくろうさまですお
>>592 そんなの業界ではあたりまえ
プログラマでまともな性格になれるわけねーじゃん
自演乙 質問の仕方が悪いだけ。
VIPからキマスタ
VIPPERLER最強
ν速でやれ
このスレVIPで晒されてるんだが
お?どこ?
VIPからキマスタ
603 :
nobodyさん :2006/10/25(水) 17:50:16 ID:??? BE:132469362-BRZ(3696)
遊びにきましたお
俺も俺もwwwwうぇうwっうぇww
VIPから来た? だ か ら ど う し た
まあ折角来てくれたんだからお茶でもどうぞ。 つ旦
どうみても自演だwほっとけw
608 :
nobodyさん :2006/10/26(木) 17:17:15 ID:QapkI+o5
ファイル名の一部のみを調べて、一致するファイル全てを一度に削除する 方法はあるのでしょうか? $delfile = "../test/test_*"; unlink($delfile) 上記ではもちろん成功しませんが、行いたい事はこのような事です。
readdir
unlink foreach(glob($delfile));
open(DIR, TARGET); while(my $file = readdir(DIR)){ next if -d $file; unlink($file) if $file =~ /DELFILES/; } 適当すぎるなこれ (;´д`)
open じゃなくて opendir だし、対応する closedir がないので留年。
閉じ忘れは投稿したあとには気が付いたんだけどね
rm rf/
掲示板に返信したら親記事が消えてしまったと言われたのですが、 以下のファイルロックでは何か不備があるのでしょうか? フリーから取ってきた掲示板なのでファイルロックなどは良くわからないんですが・・・。 sub filelock { foreach (1 .. 5) { if (-e $lockfile) { sleep(1); } else {open(LOCK,">$lockfile");close(LOCK);return;} } &error("只今他の方が書き込み中です。"); }
>>615 ロックファイルの存在テストと作成がアトミックでないので全然だめだな。
>>615 sub filelock {
foreach (1 .. 5) { # 以下の処理を5回繰り返す。
if (-e $lockfile) { # もし$lockfileが既に存在したら(A)
sleep(1); # 1秒待機して(A)に戻る。
} else { # そうでなければ
open(LOCK, ">$lockfile"); # $lockfileを
close(LOCK); # 作って
return; # サブルーチンを抜ける。
}
}
&error("只今他の方が書き込み中です。"); # 5秒待っても$lockfileが存在し続ける場合は諦める。
}
このサブルーチン自体に問題があるとは思えないな。
ファイルロック処理の挿入場所に問題があるかたまたま起こった事故か或いは他の何かだと思う。
というか普通はファイルロックに失敗したくらいで親記事は消えないだろう。
あ、あれ(´・ω・)
うわほんとだ、よく見たらifの中でファイル作って茄子。俺恥ずかし…
>>622 ロックファイルでググったら、これがトップだったからどうなのかな?と思って。
とりあえずflockしとけばいい
626 :
615 :2006/10/27(金) 00:30:08 ID:???
レスありがとうございます。
自分ではif文が程度の知識しかないのでとりあえず
>>616 さん参考になんとかできないか考えて見ます。
大学の課題で、「ある言葉を入力したらこれこれこういう言葉を返すようにしたい」プログラムを作りたいのですが上手く行きません。 サンプルはこんな感じです。 #!/usr/bin/perl @a = ('kon','hazimemasite','gennki','gennkidesu','baka','bakatohananiyo','sayonara','jaane'); for(;;){ print "Please input sentences :"; chomp($n=<STDIN>); if($n eq $a[0]){ print $a[1],"\n"; redo; }elsif($n eq $a[2]){ print $a[3],"\n"; redo; }elsif($n eq $a[4]){ print $a[5],"\n"; redo; }elsif($n eq $a[6]){ print $a[7],"\n"; exit; }else{ print "What is 「$n」?\n"; exit; } }
628 :
627 :2006/10/27(金) 00:47:04 ID:???
で、これをハッシュを使って上のプログラムと同じ実行結果にしたいのですが・・・ 指定された文字を入力しても上手くいきません。 #!/usr/bin/perl %a = ('kon','hazimemasite','gennki','gennkidesu','baka','bakatohananiyo','sayonara','jaane'); for(;;){ print "Please input sentences :"; chomp($n=<STDIN>); if($n eq $a[0]){ print $a{kon},"\n"; redo; }elsif($n eq $a[2]){ print $a{gennki},"\n"; redo; }elsif($n eq $a[4]){ print $a{baka},"\n"; redo; }elsif($n eq $a[6]){ print $a{sayonara},"\n"; exit; }else{ print "What is 「$n」?\n"; exit; } } 自分ではif文内の「$a[x]」がおかしいのかなとは思ったりしてますが・・・ どなたかご教授お願いします。
>>628 配列をハッシュにしてるんだから、
$a[0]は未定義を参照しようとしてる。
use strictすればすぐ分かる間違いなので、使い慣れておくことお勧め。
で、書き直すならこんな感じ。
#!/usr/bin/perl
%a = ('kon','hazimemasite','gennki','gennkidesu','baka','bakatohananiyo','sayonara','jaane');
while (1) {
print 'Please input sentences :';
chomp ( $n = <STDIN> );
print "$a{$n}\n" if $a{$n};
exit if $n eq 'sayonara';
unless ($a{$n}) { print "What is 「$n」?\n" }
redo;
}
exit;
630 :
nobodyさん :2006/10/27(金) 01:19:02 ID:??? BE:112944454-BRZ(5753)
if (exists $a{$n}){ print $a{$n},"\n"; } else { print "What is [$n]?\n"; }
こっちがスマートだったか。 while (1) { print 'Please input sentences :'; chomp ( $n = <STDIN> ); print "$a{$n}\n" if $a{$n}; unless ($a{$n}) { print "What is 「$n」?\n" } exit if $n eq 'sayonara'; }
>>621 うわ。。。 いつの間にかterra大先生復活してたのか。
セキュリティホール開けっ放しのCGI配って逃亡した前歴のある人ね。
>>629-631 ありがとうございます。usetstrict参考にします。
ですが実行するとコマンドプロンプトが終了されてしまいます。
何より、
>>630 の
print "$a{$n}\n" if $a{$n}; #ここと
exit if $n eq 'sayonara';
unless ($a{$n}) { print "What is 「$n」?\n" } #この行
が理解できませんf- -;)
『print "$a{$n}\n";』は
「配列aの$n番目?を参照する」という意味でしょうか?
print "$hoge{$foo}\n"; は print $hoge{$foo}, "\n"; や print $hoge{$foo}; print "\n"; と同じ。 print "$name君はオナニー大好き"; と print $name, "君はオナニー大好き"; や print $name; print "君はオナニー大好き"; が同じであるように。
@aは配列 %aはハッシュ 書き直したほうが見やすいかも %a = ( kon => 'hazimemasite', gennki => 'gennkidesu', baka => 'bakatohananiyo', sayonara =>'jaane' ); $a{$n}はchomp($n=<STDIN>)より、 入力された文字をキーにしてハッシュを参照する。
636 :
633 :2006/10/27(金) 10:25:36 ID:???
>>634-635 ありがとうございます。
ですが、「chomp($n=<STDIN>)」で文字を入力する画面にすら行かず終了してしまいます
コマンドプロンプトだからいけないのでしょうか?
637 :
633 :2006/10/27(金) 12:32:36 ID:???
全角じゃ駄目なんですね・・・勉強になります exit if $n eq 'sayonara'; unless ($a{$n}) { print "What is 「$n」?\n" } この部分をもう少し無駄のある(これなら省略できるだろうってくらい)表現にするには どうすればいいでしょうか? 出きればunlessを違う形に出来たらいいなとは思ってますが・・・
セミコロンを省略しちゃ駄目でしょ
while (1) { print 'Please input sentences :'; chomp ( $n=<STDIN> ); if ( $a{$n} ) { print "$a{$n}\n" } else { print "What is 「$n」?\n" } if ( $n eq 'sayonara' ) { last } }
>>639 > {}の中では省略可能
正確にはブロックの最後のステートメントな
気持ち悪い
大丈夫?吐いたほうが楽だよ
初心者の俺から見ても、これ以上ないぐらいわかりやすい書き方なんだけど・・・
645 :
633 :2006/10/27(金) 21:25:59 ID:???
できました!!
>>640 のがすさまじくわかりやすかったです。
最終的に
------------------------------------------------------------
%a = qw( kon konnnichiwa
gennki gennkidesu
baka bakatohananiyo
sayonara jaane
);
while (1) {
print "Please input sentences :";
chomp ( $n=<STDIN> );
if ( $a{$n} ) { print "$a{$n}\n" }
else { print "What is 「$n」?\n" }
exit if ($n eq "sayonara");
}
--------------------------------------------------------------------
と、しました。
色々と教えてくださった方、本当にありがとうございました。
ハッシュの書き方例 %a = ( kon => 'konnnichiwa', gennki => 'gennkidesu', baka => 'bakatohananiyo', sayonara => 'jaane', );
決して間違った書き方じゃないからいいじゃん
他の書き方の"例"を書いただけど?
csvからユーザIDと情報を読み込んで、自分のサーバ領域内のユーザ名.txtに反映させる cgiを作ろうと思うのですが。 (1)forかwhileで中でcsvの一行ずつopen関数で書き込む (2)ハッシュに一度格納しておいて後で書き込むか(foreachを使いますが) どちらの方がサーバに負担が少ないでしょうか? ユーザが重複している場合、後ろのやり方の方がopen関数を使うのが少なくて済みます。
残念ながら、openでは書き込めない。
ユーザーが何万も居て、秒間何回も実行するわけじゃないんだから好きに組めばいいじゃん
ハッシュに格納しておいてDBI使って書き込むのがいいんじゃないでしょうか
653 :
633 :2006/10/28(土) 15:46:29 ID:???
ゼミの先生に提出したら
「お前、どっかのサイト見たんちゃうか?」って言われました・・・
まあ、その通りなんですがorz
>>627 を素直に配列二つ使って表してみろといわれました。
んで、一応
----------------------------------------------------
@a = ('kon','gennki','baka','sayonara');
@b = ('hazimemasite','gennkidesu','bakatohananiyo','jaane');
for(;;){
print "Please input sentences :";
chomp($n=<STDIN>);
if($n eq $a[0]){
print $b[0],"\n";
redo;
}elsif($n eq $a[1]){
print $b[1],"\n";
redo;
}elsif($n eq $a[2]){
print $b[2],"\n";
redo;
}elsif($n eq $a[3]){
print $b[3],"\n";
exit;
}else{
print "What is 「$n」?\n";
exit;
}
}
----------------------------------------------------------
に、したのですが、もう少しまとめた感じにするにはどうすればいいでしょうか?f- -;)
@a = qw/kon gennki baka sayonara/; @b = qw/hazimemasite gekkidesu bakatohananiyo jaane/; OUTER: while (1) { print 'Please input sentences: '; chomp($n = <STDIN>); for ($i; $i <= @a ; $i++) { if ($n = $a[$i]) { print $b[$i]; redo OUTER; } } print "What is $n?\n"; exit; } がんばって自分で書けよ。そのほうがお前のためだ。
>>653 宿題だったのかよw 金輪際きくなw
ヒントとしては、@a と @b から %a 作ればおk
cronか必ずアクセスするcgiから時間見て消す
659 :
657 :2006/11/01(水) 12:17:05 ID:???
>>658 うーん やっぱり、そういう手法しかないんですかねー
ぐぐれ
コマンドプロンプトから環境変数を見てもIPアドレスが出てこない のはなぜなんでしょうか?
氏ねよお前www
>>661 スタンドアロンでの起動って事?
端末間の通信って事ならソケットに何かあったような希ガス
664 :
657 :2006/11/01(水) 23:34:18 ID:???
opendir(SESSDIR, "./.session"); my @filelist = readdir(SESSDIR); closedir(SESSDIR); foreach (@filelist) { if (/^cgisess_(\w)+$/ && $1 ne $sid) { unlink("./.session/$_"); } } 多分これで解決しました
665 :
657 :2006/11/01(水) 23:35:57 ID:???
あ、同時にログインするユーザーは1人だけのものを想定してたので……
え?CGI::Sessionってセッションファイルの後始末しないの? クソじゃん
668 :
nobodyさん :2006/11/02(木) 14:41:12 ID:CDbXzZTv
一日以上更新されてないディレクトリとそのディレクトリに入ってるファイルを一括して削除するperlスクリプトが欲しいんですが、 どういう風に書いたらいいのか全く想像も付きません。どうか作っていただけないでしょうか?
ここは質問スレ
作っていただけないでしょうか? ってのが質問なんだろ。
ここは質問スレ?ってのが質問なんだろ。
673 :
661 :2006/11/02(木) 21:04:15 ID:???
>>673 >>663 を無視するな
というか、押したら開かないドアを引いたら開きました。どうやれば押したら開きますか?って質問してるんだぞ。
675 :
661 :2006/11/02(木) 23:06:07 ID:???
>>674 いまだに例えの意味がわかっていないのですが
use strict;
use Socket;
を入れたらBBQが動くのを確認できました。ヒントありがとうございました。
>>675 自分で出来ない理由をしっかり書いておいて、なぜ出来ないかを聞いてたから。
まぁ、動いたなら一歩前進だ。乙。
677 :
nobodyさん :2006/11/03(金) 19:30:08 ID:4xbbPPPU
こんばんは。質問です。 現在ホームページを作っていて、CGIでHTMLとCSSとJavaScriptを出力しようと思っているんですが。 何故かエラーが出ます。 因みに出力の方法はヒアドキュメントでくくって出力しています。 エスケープの問題でしょうか? それともCGIスクリプトの中にJavaScriptを記述すること自体が不可能なんでしょうか? どなたか教えてください。
>>643 これでいいんか?
open my $fh, ">>count.dat";
print $fh "\n";
close $fh;
print "Content-Type: text/plain\n\n";
print -s "count.dat";
>>668 sub{$_[0]->(@_)}->(sub{
my($code,$path,$del)=@_;
if(-d $path){
my $del2 = time-(stat$path)[9]>60*60*24;
opendir my $dh,$path;
while(my $dir = readdir $dh){
if($dir ne '.' && $dir ne '..'){
$code->($code,"$path/$dir",$del2);
}
}
closedir $dh;
rmdir $path if $del2;
}else{
unlink $path if $del;
}
},$_) for @ARGV;
>677 とりあえずコード晒してみ?
682 :
nobodyさん :2006/11/03(金) 20:19:39 ID:4xbbPPPU
>>681 長すぎてここには貼れません。
とりあえずCGIでJacaScriptが出力可能かどうか教えてください。
683 :
nobodyさん :2006/11/03(金) 20:25:52 ID:QgsncqtF
>>682 Javascriptといってもただのテキストデータだろ
もちろん可能
どうせ単にエスケープのミスしてるだけだろ。 $とか@とか%とか\とか。全部確認してみな。
>>677 エラーというのが、perl実行時のエラーなのか。
ブラウザに出力はされるが、javascriptの実行エラーなのか。
どんなエラーなのか。エラーメッセージはなにか。
ヒアドキュメントの内部で出ているエラーなのか。
などをまずは書きなされ。
「なぜかエラーが出る」といいなさるが、
プログラムは、意図したとおりにではなく、書いたとおりに動くのじゃ。
686 :
nobodyさん :2006/11/04(土) 00:20:52 ID:h08SADSk
意図した通りに動かない。これを「なぜか」と表現。 エラーメッセージはline5に書かれたヒアドキュメント print >>END; の部分。恐らく既に上がっているがエスケープをしてない文字列によるもののエラー。 実はエスケープは全くしてなかったのでerrorになるのは必然。 今回ここで聞きたかったのはそこではなくCGIでもJavaScriptは動くだろうというあやふやな知識を 確立しはたかった為。 問題は解決された。協力してくれた諸君に感謝する。
687 :
nobodyさん :2006/11/04(土) 03:39:17 ID:P6wQxe1H
sjisに変換する処理なのですが、Jcodeを使って下記のようにしています。 $value2 = Jcode::convert(\$value1, 'sjis'); これを、Encodeを使って書き直したいのですが、上記のように変換前の文字コード を指定せずに処理する方法がわかりません。 検索して探したりしてみると、たとえば、utf8からeuc-jpに変換するコードとして、 Encode::from_to($text, "utf8", "euc-jp" ); などといったものがありますが、第一引数(この場合utf8)を省略しての記述方法 はありませんでしょうか?
>>687 Encode::Guess
省略というかエンコーディング名に"Guess"を指定する
>>688 とりあえずうまくいったようです。
ありがとうございました!
php で HTMLのヘッダーなどを require_once するようなことを、Perl でやりたいと考えています。 理由は、今まで Perl + SSI でやっていたので、2重に実行環境が呼び出されて負荷が高いと思われるので、(SSIの負荷はPerlに比べれば少ないですが) Perlのみでやってみたいからです。 ----- test.cgi ----- #!/usr/bin/perl print 'Content-Type: text/html' . "\n\n"; require 'test.html'; exit; ----- test.html ----- print << '_HTML_'; <html> <head> <title>テスト</title> </head> <body> <h1>テスト</h1> <p>ちゃんと表示されるかな。</p> </body> </html> _HTML_ 1; ヒアドキュメント部分を print << "_HTML_"; では無く、print << "_HTML_"; にしたら、 文字コードが Shift_JIS であっても、駄目文字が使えてこのままでも結構いいのですが、 test.html に HTML以外のPerl命令 (上1行と下2行) をいれないといけないのが、 美しくないかなーと思いまして。 綺麗なコードでこのようなことをやる方法をご存知の方がいたら教えてください。
HTML::Templete
>>690 意図が今一つかめんのだが以下の方法じゃあかんのか?
----- test.cgi -----
#!/usr/bin/perl
print 'Content-Type: text/html' . "\n\n";
print <DATA> ;
__DATA__
<html>
<head>
<title>テスト</title>
</head>
<body>
<h1>テスト</h1>
<p>ちゃんと表示されるかな。</p>
</body>
</html>
693 :
690 :2006/11/04(土) 14:05:18 ID:???
>>691 ありがとうございます。
そのモジュールにも興味が出てきたので、機会があったら使ってみます。
>>692 多数のCGI (とHTMLファイルに含まれるSSI) から include したいので、別ファイルにしたいと思ってたんです。
教えていただいた通りのコードで、やりたいことができそうです。
ありがとうございました。
----- test.cgi -----
#!/usr/bin/perl
print 'Content-Type: text/html' . "\n\n";
open DATA "test.html";
print <DATA>;
exit;
----- test.html -----
<html>
<head>
<title>テスト</title>
</head>
<body>
<h1>テスト</h1>
<p>ちゃんと表示されるかな。</p>
</body>
</html>
695 :
690 :2006/11/04(土) 14:44:33 ID:???
実行したらエラーにorz test.cgi のソースに問題があったようです。 修正版は次の通りです。 ----- test.cgi ----- #!/usr/bin/perl print 'Content-Type: text/html' . "\n\n"; open(DATA, "< test.html"); print <DATA>; close(DATA); exit;
>>694 結局どちらもOSのopenに行くところは一緒で余計な機能がない分
sysopenの方が軽いともいえるが普通は気にするほどの差はない。
しかしこれ書いた人3引数open知らないのだろうか?
697 :
nobodyさん :2006/11/04(土) 21:40:25 ID:foW9asSJ
ホームページをcgiで全てのページを表示していますが、
mixiのように
http:// 〜.plの様にしたいのです。
そのままperlを表示しようとするとダウンロードになったしまいます。
よろしくお願いいたします。
>>697 それはPerlではなくサーバー側の設定によります。
例えば Apache の場合 .htaccess で設定できる可能性があります。
詳しい方法は、検索するなり、お使いのサーバーソフトウェアのスレにいくなり、
借りているウェブスペースの管理者に問い合わせるなりしましょう。
699 :
nobodyさん :2006/11/04(土) 22:59:12 ID:foW9asSJ
>>698 さん
有難うございます。
結構調べたんですが、全く出てきませんでした。
サーバーはApacheなんで調べてみます。
つ AddHandler cgi-script .cgi .pl
アクセスの多いサイト (10万PV/day) で CGI のマルチバイトXSS対策したらその時期から負荷(uptime) が一気に倍近くなりました。
(因果関係はまだはっきりしていませんが、時期が一致したし、CGIの負荷が増えたと思われるので、その可能性が高いと考えてます。)
Perl のバージョンは v5.8.6 で OS は Fedora Core 4 です。
CGI に加えたコードは、モジュール "Encode" の読み込み (use Encode;) と、
POST時に送信されたデータに対して "$_ = encode('sjis', decode('sjis', $_));" を加えたぐらいです。
後者のロジックではせいぜい10程度のデータに対して encode と decode をしているだけだし POST数はそんな多くないんで、
"use Encode;" が負荷の原因だと思われます。
DoCoMoのケータイからのアクセスで最後の方に Shift_JIS として不正なデータが含まれてしまったりすることもあるんで、(DoCoMoのブラウザのバグか電波が不安定なのかは知りません。)
Shift_JISとして不正なデータが含まれた場合にも「エラー処理」でなく「不正な文字列の削除(エスケープ)」としての対処を行いたいです。
"use Encode;" を使わずに、低負荷でこの処理を行う方法はないでしょうか?
>>116 で大丈夫ですかね。
>>701 > CGI のマルチバイトXSS対策
前スレか前々スレでその話題があったので参考にするとよろし
>>701 たとえ10万PV/dayであろうとも、POST数がそんなに多くないのならCGIの負荷が
多少かわったところで影響は大きくなさそうなものだ。それともPOST以外でも
CGIがkickされまくっていて不要なuse Encodeをしているという話だろうか??
性能問題は本当に性能のボトルネックになってるところを突き止めて対策しないと
骨折り損になるよ。
「不正な文字コードが見つかれば、以降の文字はすべて無効」でOKなら116で問題ないかと。 場合によっては \t \r \n も不正な文字として扱う必要があるかもしれないけど。 use Encodeって結構コストが高いからなぁ。 まぁ、因果関係がまだはっきりしてないんだったら、もう少し調べてみたほうがよいかもね。
ちょいと調べてみたがuse EncodingはうちのP3-1GHzといういささか時代遅れなPCで50msぐらい CPU食うようだ。これはちょうどuse CGIと同じぐらい。無視できる量ではないがとてつもなく大きい わけでもないな。もとがぎりぎりならきびしいかもしれないが。
ごめん、use Encodingじゃなくてuse Encode。
Win+Active Perlで、コマンドプロンプトを開いて、 Encode、Jcode、CGI、GD、IO::Handle、Time::HiRes… とどんどんuseしていくと一気に遅くなるのが分かる
これでTemplate Toolkitなんか使った日にはCGIじゃ重すぎなわけだが、 モジュール削って不便なプログラミングで苦労するよりはmod_perlなり fastcgiなり使ったほうが幸せになれる気がする。
709 :
701 :2006/11/06(月) 17:45:18 ID:???
>>702 このスレにあったようなので読みました。
>>703 > それともPOST以外でもCGIがkickされまくっていて不要なuse Encodeをしているという話だろうか??
#!/usr/bin/perl の次の行で use Encode; をしています。(10万PV/日の CGIで)
マルチバイトXSSの対策前の部分で use Encode; しても大丈夫なんでしょうか? 試してみます。
use は一番上でやるもんだと思ってました。
ただ、ループ内でやると、use Encode が何度も実行されることになるので、変数でフラグたてて1回のみやるようにしてみますね。
それでうまく動かなかったら正規表現でやってみます。
> 性能問題は本当に性能のボトルネックになってるところを突き止めて対策しないと
> 骨折り損になるよ。
ですね。
さっき当該部分(マルチバイトXSS対策)のコードを消してしばらく動かしているんですが、負荷は少し減っているような気がします
グラフのデータが少なくてまだ確実とはいえないので、1日ぐらいこのまま動かしてMRTGのグラフで比較してみますね。
>>705 もとがぎりぎりではないんですが、MRTGのグラフ (Load Average 5min 15min) でいままでピークでも60%ぐらいが上限だったのに、
ピークで100%ぐらいにいくようになったんです。面積をよくみると、2倍まではいってなくて、もとの1.5倍ぐらいかも。
>>707 なるほど
>>708 自分が作ったのではないコードが含まれていてぐちゃぐちゃなので mod_perl はきびしそうです
グローバル変数多用、同じようなコードを関数を使わずに何度もかいていたり同じエスケープ処理を何箇所かでやってたりで
とにかくぐちゃぐちゃです;;
>>709 CGIはたくさん起動されているが本当にEncodeモジュールを必要とする場合が少ないのならば、
確かにもったいないね。可能なら機能ごとに別のプログラムに分離したほうがいいんじゃないか
とも思うが、いまさらそれも無理なら小手先の対策として、Encodeモジュールを必要とするとき
のみuseするのがいいだろう。
ただし普通にuse書いてしまうとどこに書いてあっても最初にプログラム読み込むときにuseされて
しまうので、必要なときだけ eval 'use Encode;';するのがいいと思われる。ブロックではなく
文字列のevalを使うのが肝。
712 :
701 :2006/11/06(月) 20:56:58 ID:???
>>711 レスありがとうございます。
教えていただいたサイトを読ませていただきました。
不正なデータを 「サニタイズ」 した結果、他の有害なデータになってしまうということは良くありますね。
上位のファイルの読み出しを禁止するために 「../」 を削除するコードにしたら、「..././」 → 「../」 となってしまうというのが有名な例です。
こういった問題が発生しないよう良く考えてみることにします。
不正な文字コードが含まれていたらエラーを返す、というのが理想かもしれませんが、それをやるとアクセシビリティ上の問題が発生してしまいます。
例えば、そのサイトで推奨している mb_check_encoding 関数の場合でもそうですが、「@」とか「T」が含まれていただけでも、エラーになりますし、
ケータイからですと顔文字が1つ含まれただけでエラーになります。(Shift_JISの場合に確認、他の文字コードでも発生すると思われます。)
データベースは使っていないし、データベースについての知識はないのでそれについては分かりませんが、HTMLとして出力したりファイルに出力したりする
普通のCGIで入力段階 (他のチェック前) で不正な文字列を 「削除」 した場合には、発生するおそれのある脆弱性がおもいあたりません。
勿論、他のチェックのあとでやればそれによって、他のチェックが無効になり危険ですが…。
壊れた文字は「絶対」に削除しない。ってのは誤解を招きそうな表現だね。 正常な文字以外は通すな。 削除しただけで正常な文字になると思うな。 って、言いたかったんでないかの。 文字コードのチェック→(不正文字は排除済みとみなした上で)サニタイズ。 この流れで十分でしょう。
714 :
701 :2006/11/06(月) 21:31:38 ID:???
>>713 解説ありがとうございます
UTF-8 の構造は複雑でまだ理解できていませんが、Shift_JIS や EUC-JP の場合には
バイナリレベルで 「2バイトで1文字となる範囲のバイナリデータが1文字目にある(単独で存在する)」 場合にそれを削除すれば、
マルチバイトでのXSS問題に限れば完璧に回避できますね。(2バイト連結文字の1バイト目の文字がなければ問題は発生するわけがないので。)
また、1バイト=8bit を区切りにして操作を行えば、削除によってまた他の不正なマルチバイト文字列ができあがることはないはずです。
eucには3バイト文字もあるわけだが
○の1をEUCにすると3バイトじゃなかったか XSS脆弱性はそんなに単純じゃない。たとえば、0x5Cの問題。
>>716 > たとえば、0x5Cの問題。
それについて興味があるので詳細を教えていただけないでしょうか?
もし、無理ならば Shift_JIS の問題か EUC-JP の問題かだけでも教えていただけたらさいわいです。
0x5C でググれ
ありえないぐらい低レベル
初心者質問スレなんだからイインダヨ
721 :
701 :2006/11/08(水) 00:25:38 ID:???
>>715-716 EUC-JPには3バイト文字もあったんですか・・・。
EUC-JPに関する知識が不十分で申し訳ありませんでした。
お詫び申し上げます。
謝る必要はないだろ…
>>716 > XSS脆弱性はそんなに単純じゃない。たとえば、0x5Cの問題。
0x5C 問題 (表示が文字化けするなど) は、XSS (マルチバイト文字列でのXSSも含む) には全く関係ないと思うんですけど・・・。
そもそもこの問題は、エスケープシーケンス (\) が解釈される場所のみで問題が発生するわけで、エスケープシーケンスを解釈しないWebブラウザでは問題無いですよね。
そして、エスケープシーケンスを解釈するブラウザなんて見たことないし、あったとしたら問題です。
<strong>この商品は \1000だよ</strong> って書いただけで不具合起こすんです?
データベースなどのエスケープシーケンスを解釈する場所に、
>>714 の処理をしたデータを突っ込んだ場合には問題は発生するかもしれないけど、Perl単独ではありえない。
(ファイルに出力したPerl文を実行するなどの特殊な場合を除く)
$hoge = "テスト\\"; // $hoge に "test\" が入る。
print "$hoge"; // $hoge を出力する。
たとえば、こう書いた場合に、$hoge が test\ に書き換わって、
print "test\";
となって、" が排除されエラーになることはないからね。
「2バイトで1文字となる範囲のバイナリデータが1文字目にある(単独で存在する)」 場合にそれを削除 でマルチバイトXSS問題は完璧に解決すると思う。(Shift_JIS限定)
不正な1バイトデータが残ったところで、それがマルチバイトとして扱われることはないから、問題ない。
724 :
723 :2006/11/08(水) 00:36:38 ID:???
もちろん、DBの連携なども考えれば、不正な文字列が少しでも含まれていたらエラーを返すのが理想ですね
簡易HTTPブラウザを作っています。
以下のHTMLを受け取った時に解析して 送信 を送信するといった処理を望んでいますが、
今のソースでは 取り消し が送信されます。
送信、取り消しの違いはokの有無ですが、これを区別する方法を教えてください。
<FORM ACTION="hoge.cgi" method="POST">
<INPUT TYPE=HIDDEN NAME=huga VALUE="huge">
<INPUT TYPE=SUBMIT NAME=ok VALUE="送信">
<INPUT TYPE=SUBMIT VALUE="取り消し">
</FORM>
use LWP::UserAgent;
use
HTTP::Request::Common qw(POST);
$string = "上のHTML";
$url = '
http://hoge/hoge.cgi ';
$string =~ /NAME=huga\sVALUE="(.*?)"/;
%formdata = ('huga' => $1);
$ua = LWP::UserAgent->new;
$req = POST($url, [%formdata]);
res = $ua->request($req);
726 :
nobodyさん :2006/11/08(水) 03:11:43 ID:Z752EjWS
727 :
nobodyさん :2006/11/08(水) 04:32:08 ID:CtUHOCOJ
$string =~ /NAME=huga\sVALUE="(.*?)"/; %formdataはhugeが入ってるんじゃね?
728 :
725 :2006/11/08(水) 04:32:26 ID:x1PlsJ4C
>>726 submitボタンが複数ある時の選択方法を教えてください。
729 :
725 :2006/11/08(水) 04:33:59 ID:???
>>728 prog板から来たよんw
submitも普通のエレメントと一緒だよ。
nameがあってvalueがある。
submitの場合は押された部品のname&valueが渡される。
押されていないsubmitは渡されない。
この説明で分かるかしら。
731 :
725 :2006/11/08(水) 04:43:05 ID:x1PlsJ4C
>>730 できましたw
ありがとうございました。
ある画像掲示板に画像を自動アップロードするスクリプトを作っています。
例として、
http://some.kind.of.uploader/upload.phpのページにある <form enctype="multipart/form-data" action="upload.php" method="post">
<input type="file" name="userfile" size=50>
<input type="submit" value="SUBMIT">
</form>
というフォームに対して、ローカルの/path/to/file/にあるtest.jpgをアップロードす
るとします。
my $url = '
http://some.kind.of.uploader/upload.php ';
my $ua = LWP::UserAgent->new();
my $response = $ua->post($url, ['userfile' => '/path/to/file/test.jpg']);
としてみましたがうまくアップロードできません。
できない理由として考えられることは何がありますでしょうか?
また、同様の趣旨でもっといい方法がありましたら御教授お願いします。
どう、うまくないのかを書け。 つ php.ini
>>732 ファイルデータじゃなくて"/path/to/file/test.jpg"って文字列で飛んでるんじゃ
>>733 サーバーからのメッセージとしては、手動で行なった場合にファイル名を入力しなかっ
たのと同じ「アップロードするファイルを入力してください」というものです。
>>734 そんな感じですね。
と、言うわけで自己解決しました。requestを使用します。
my $file = '/path/to/file/test.png';
my $response = $ua->request(POST $url,
Content_Type => 'form-data',
Content => ['userfile' => [$file]]
);
特定のIPを拒否したい場合に以下を記述したら一応機能したんですけど、 何か問題ありますか? @deny = ("0.0.0.0","1.1.1.1"); $addr = $ENV{'REMOTE_ADDR'}; foreach $ip (@deny) { if ($addr eq $ip) {print "エラー"; last;} }
my $addr = $ENV{'REMOTE_ADDR'}; my @deny = ( "0.0.0.0", "1.1.1.1", ); foreach my $ip (@deny) { if ($addr eq $ip) { print "error"; last; } }
739 :
736 :2006/11/08(水) 23:41:20 ID:???
|
|⌒σ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
|冫、) <
>>737-738 ありがとう。 |
|` / \_________/
| |
|/| |
| ∪
|
| / ̄ ̄ ̄ ̄\
|< さらばじゃ |
| \____/
|)彡 サッ
|
|
|
|
禁止IPが多いなら、ハッシュ使った方がよさそう my %deny = ( "0.0.0.0" => 1, "1.1.1.1" => 1, ); if ($deny{ $ENV{'REMOTE_ADDR'} }) { print "error"; last; }
ハッシュだとlast;が不要な予感。
exitと書きたかったんだろ
CGIでprint "error"だけなのには誰も突っ込まないのか?
そこまで面倒見きれんw
$deny = '0.0.0.0/1.1.1.1'; error() if index($deny, $ENV{REMOTE_ADDR}) >= 0;
| |⌒σ |冫、) |` / | | |/| | | ∪ |
コーディングとはちょっと違うんですが・・・ WindowsでGDを使いたいのですが、同時にインストール必要なモジュールって他にありますか? ppmでGDをインストールして、サンプルを参考に 画像を読み込んで表示するだけのスクリプトを書いてみたのですが GD::Imageで指定したサイズの黒い四角は表示されるものの、画像そのものは表示されません。 UNIXでは他にも複数のライブラリのインスコが必要という記事を見つけたので調べているんですが Windows(ActivePerl)ではどうなんでしょうか。
確かMRTGはGD突っ込んで難なく動いてたから、それを参考にしてみれば?
あっ、ごめん。 MRTGでグラフを書いてるのはEXEバイナリだったorz
うちでは普通に動いてるし、入れ方かサンプルソースが悪いんじや?
751 :
701 :2006/11/09(木) 20:52:58 ID:???
ご回答いただきありがとうございます。
use Encode; と $_ = encode('sjis', decode('sjis', $_)); を外しただけで、
サーバ全体の負荷(5min, 15min uptime) が MRTG のグラフで目視して明らかに分かる程度に減ったので、
CGI負荷の増大の原因はそれにあったことがほぼ決定しました。
>>116 の方法を採用してみます。
752 :
747 :2006/11/09(木) 20:56:36 ID:???
>>748-749 どもです。余裕見て参照してみます。
>>750 ホントですかー。動いてるんですね。
でもそれがわかっただけでも大助かりです。
おかげで絞り込めてきましたので、なお見直してみます。
ありがとうございました!
753 :
701 :2006/11/09(木) 21:29:43 ID:???
実際に
>>116 の方法を実装してみました。
>>704 に
> 「不正な文字コードが見つかれば、以降の文字はすべて無効」でOKなら116で問題ないかと。
とありましたが、
116の方法では、不正な文字列(マルチバイト文字列の1バイト目が単独で存在) が 文の中央付近に入っていた場合でも、
その不正な文字列の除去のみが行われて、それ以降の文字列は正常に受け取れました。
(※不正な文字列はきちんと除去されていました。)
ちなみに、$_ = encode('sjis', decode('sjis', $_)); 方式と違って、丸付き文字 @AB なども正常に受け取れるようです。
(よいか悪いかは別にして…)
負荷の問題はもうちょっと運用してみて結果が出たら報告させていただきます。
回答してくださったみなさまありがとうございました
754 :
nobodyさん :2006/11/09(木) 22:17:24 ID:3KxQ4Dio
すでに動作しているコードを、-wオプションをつけて修正してるのですが、 local宣言して別パッケージから参照している変数がtypoと言われて しまいます。 現在、 > local $main::upload_dir = './attach_file/'; と書いてあるものを > local $main::upload_dir; > $main::upload_dir = './attach_file/'; とすると警告が出なくなります。typoだけ警告をきるようなことは可能でしょうか。 よろしくお願いします!
perlで会員全員にメールを送信したいのですが、sendmailで送信した場合負荷はどのくらいかかるのでしょうか。 プログラムの概要は、 フォルダ内の「会員ID.txt」(中身はメールアドレス)をopendirで会員IDの配列を作る。 forの中で、open(会員ID)→メールアドレス格納→sendmailで送信。 会員IDの配列分だけ繰り返し。 といった感じです。 メールの内容にも会員IDを埋め込みたいのでこのような方法にしています。 ブラウザからアクセスして実行してみましたが、現在会員数は20人足らずにもかかわらず 少し重そうだったので他にいい方法はないかと質問させていただきました。
それは負荷がかかってるわけじゃない 時間がかかってるだけ 送信先メールサーバの名前解決をしてユーザがそんざいするかとか 今送れるかどうか問い合わせたり 相手が忙しいと待たされたり とにかくメール送信が負荷よりも時間のほうがかかる もし自サーバになんらかの負荷がかかってればsendmailは自動的に待ち状態になる設定になってるはず
>>754 no warnings 'once';
761 :
nobodyさん :2006/11/11(土) 17:04:01 ID:jBOZHEcG
ファイルハンドルからファイル名をgetする方法を押しててください。
うんとこしょー!(押
そもそもファイル名もわからないファイルハンドル使う処理があるのか?
□ orz
どんなファイルを開いてるか不明になれるのか? それはそれですげぇな
>>761 発想を変えて、open したファイル名を保存しておいてはどうかな。
うーん、ぼくってしんせつ!
767 :
766 :2006/11/11(土) 20:43:59 ID:???
で、それもやってくれる FileHandle::Deluxe を CPAN からインストール。
statすればデバイスとinode番号がわかるので、File::Findを使うなりして 探せばわからなくもない。ただしopenしたあとに削除されてたらアウト。
769 :
nobodyさん :2006/11/11(土) 21:39:58 ID:srC1L817
$foo->hoge( aaa => @aaa, bbb => @bbb, ccc => @ccc ); のように、fooオブジェクトのhogeメソッドに配列を渡す時、 sub hoge { my $self = shift; my %args = @_; $self->{aaa} = ?; // @aaaを入れたい $self->{bbb} = ?; // @bbbを入れたい $self->{ccc} = ?; // @cccを入れたい ・ ・ ・ } とした場合、%argsからどのようにして@aaa、@bbb、@cccを受け取るのでしょうか。
いや、それもう呼び出し方からしてダメだし。 $foo->hoge( { aaa => ¥@aaa, bbb => ¥@bbb, ccc => ¥@ccc } ); sub hoge { my $self = shift; my $args = shift; $self->{aaa} = $args->{aaa}; ・ ・ } まあ実際の処理ではこんな事しないと思うよ。 してたら設計ミスを疑った方が。
別にハッシュのリファレンスとして渡す必要はないような。 my $self = shift; my %args = @_; $self->{aaa} = $args{aaa};
772 :
nobodyさん :2006/11/11(土) 22:01:07 ID:srC1L817
>>770 ありがとうございます。
では、OOPにおいてメソッドの呼び出し時に配列を渡す場合の受け渡しはどうなるのでしょうか?m(_ _)m
773 :
nobodyさん :2006/11/11(土) 22:04:15 ID:srC1L817
>>771 ありがとうございます。
その方法は試しましたが、受け取り側($self->{aaa})が配列の要素数を受け取ってしまいました。。。
774 :
nobodyさん :2006/11/11(土) 22:15:26 ID:dAHcCPkr
残念だが
>>771 はうまくいかない。
>>772 >>770 のとおりで良いと思う。
hashの要素としてlistを直接持てないから、listのリファレンスにするわけ。
775 :
nobodyさん :2006/11/11(土) 22:25:12 ID:srC1L817
>>774 $self = {
aaa => undef
};
として受け取った場合、$self->{aaa}を配列として扱うことは可能なのですか?
ああ、ごめん、ちゃんと読んでなかった><
>>771 では
$self->{aaa} = @{$args{aaa}};
と配列変数のリファレンスを受け取るって書いたつもりでした。
そうすれば、引数のリストを
>>770 のように匿名ハッシュで囲わなくてもいいんじゃないか、と。
>>775 $self->{aaa}を配列として
配列として、は無理。配列のリファレンスとして、扱う。
ちなみに
>>770 氏は引数全体をhashのリファレンスにし、且つ個々のlist(@aaa とかの部分)も
listのリファレンスにしてるけど、後者は必須だが、前者はただのhashにもできるね。
$foo->hoge(
aaa => ¥@aaa,
bbb => ¥@bbb,
ccc => ¥@ccc
);
sub hoge {
my $self = shift;
my %args = @_;
foreach my $key (keys %args) {
$self->{$key} = $args{$key};
}
}
# @{$self->{$key}} で配列全体を、$#{$self->{$key}} で要素数-1を、$self->{$key}->[0] で個々の値を参照できる
>>776 I see.
>>769 @_ にはサブルーチンの引数がフラットなリストとして展開・格納されます。
また "=>" は本質的に "," のエイリアスに過ぎません。
すなわち @aaa = ( 'xxx', 'yyy', 'zzz' ) である時、hoge( aaa => @aaa ) は hoge( 'aaa', 'xxx', yy'y', 'zzz' ) と等価です。
さらには %args = ( aaa => @aaa ) とやってしまうと、
$args{aaa} == 'xxx'
$args{yyy} == 'zzz'
という内容のハッシュが出来上がります。これは恐らくあなたが望むものではないでしょう。
サブルーチン引数やハッシュ代入における配列 (より正確には全ての非スカラー) の独立性を保つには、偶然にも同じ解決策が使えます。
「リファレンス」がそれで、
>>770 で実装の一例が述べられています。
perlref, perllol, perlsub などのマニュアルが役に立つでしょう。
# 他の言語から Perl に移行する場合は混乱するよな、実際。
779 :
nobodyさん :2006/11/11(土) 23:07:00 ID:5mpuYPBZ
なるほど・・・上記の方々、ご返信ありがとうございます! 理解するまでしばらくかかりそうなので、理解してまた返信させていただきますm(_ _)m
780 :
nobodyさん :2006/11/11(土) 23:28:01 ID:t9lEuzhq
つまり、ハッシュのvalueを配列として渡すと渡す側のkeyも渡ってしまい意図しない値を受け取ってしまう、という訳でしょうか。 (なんか良く分からなくなってきましたが・・・) 質問に答えていただいた方、ありがとうございました。 ところで、こういう細かいことが書かれているオンラインのマニュアルなどはあるのでしょうか?
>>780 >>779 特に perlref。ぐぐればいいよ。
listもhashも、複数の値でできてる。複数の値なんで、それを一つの値であるかのように、
$a{'aaa'} = @aaa;
とすることはできない。
しかし、リファレンスっていうのはそれ自体は一つ。なので、
$a{'aaa'} = ¥@aaa;
は可能なんですよ。
%aa = ('aa' => 'AA', 'aaa' => 'AAA');
%bb = ('bb' => 'BB', 'bbb' => 'BBB', 'bbbb' => 'BBBB');
hoge(%aaa, %bbb);
はhogeに10個の引数を渡していることになるけど、
hoge(¥%aaa, ¥%bbb);
は2個の引数を渡してるんですよ。
まちがった orz %aa = ('aa' => 'AA', 'aaa' => 'AAA'); %bb = ('bb' => 'BB', 'bbb' => 'BBB', 'bbbb' => 'BBBB'); hoge(%aa, %bb); はhogeに10個の引数を渡していることになるけど、 hoge(¥%aa, ¥%bb); は2個の引数を渡してるんですよ。
質問 Perlで作られた日本語版のWEB CGIゲームを 英語版に改造しようとしているのですが、(作者の許可は取得済み) 作業の進め方がわかりません。 どうしたらいいですか? 二人のチームでやるのですが、 自分が翻訳担当で、もうひとりが技術担当です。 まず日本語の用語を全部リストに洗い出して、 それをかたっぱしから英語に直していって、 翻訳が終わった分から、技術者に渡して、 技術者はできあがった翻訳を受け取ったら、 正規表現か何かでガァーーっと 英語に置換していけばいいのですか?
てか英語版に改造するも何も翻訳するだけやん
>>784 ソースの中の日本語部分を英語に翻訳すればいいだけなのか。
あるいはCGIで生成される日本語も英語に翻訳しなければならないのか、
あと、一つの用語を翻訳して、それを28のファイル全部に
行き渡らせるにはどうしたらいいのか。
改造が許されてるなら、テンプレートシステムなりなんなり導入してリソースを分離したら? それが難しいってなら、普通にソース中の文字列リテラルを地道に翻訳するしかないだろうね。
>>786 ようはいきなりソース中にべた書きされてる日本語を英語訳するよりも、
「言語パック」
みたいのをつくって、エンジン部分は翻訳者はまったくさわらずに
すむような状況を作ってから、翻訳者に仕事をさせたほうがいいと?
>>784 ↑って
>>783 か?
なんか質問の仕方がなってない。
「〜いのか。」
> ソースの中の日本語部分を英語に翻訳すればいいだけなのか。
他に何かする必要あるのかよ。
> あるいはCGIで生成される日本語も英語に翻訳しなければならないのか
それって「ソースの中の日本語部分を英語に翻訳」じゃないの?
> あと、一つの用語を翻訳して、それを28のファイル全部に
> 行き渡らせるにはどうしたらいいのか。
行き渡らせるの意味が不明。
28のファイルなんて言われてもこっちは知らない。
もし、28個のファイルに同じ用語(日本語)があってそれを
英語に置き換えたいというのなら正攻法でひとつひとつ
やってけ。
もしくは
http://akky.cjb.net/download/speeeeed.html みたいなソフト
使って置き換えれば?
> 技術者はできあがった翻訳を受け取ったら、
> 正規表現か何かでガァーーっと
> 英語に置換していけばいいのですか?
技術者なのにそんなことも分からんのかい。
日本語に依存する処理(例えばjcode.plやJcode.pmによる文字コード変換)
をしているところは削ったりとか英語用に変えるとかも必要になったりするでしょ。
>技術者なのにそんなことも分からんのかい らめぇええええ 漏れ技術者じゃないぃいいいい ただの翻訳者ぁああああ
>>789 技術者出てこい、じゃないかな。
ハードコードしてあるリテラルを翻訳者が訳して地道に修正するのか、
リソースとして外出しにするにか、ってのは技術者が判断しなきゃないんじゃ?
何で翻訳者がここに居るんだ?
plファイルについて質問です 使用中の掲示板のスクリプトに、ログ機能を追加するためplファイルを作り、 読み込み開始直前に require 'xx.pl '; を挿入しました このままだと自分の記録も入ってしまうのでキャンセルするようにif条件で ログ記録を部分を以下のようにしたところエラーが出てしまいました if($name ne "自分"){ --ログファイルへの読み書き部分-- } 仕方なくjcode.plの最後を参考にし、 } 1; としました、これで動作しました この最後の1;はどうして必要なのでしょうか?
'〜が'.$n.'個あります' みたいなのは順番も変えなくちゃだから、 ただリテラルを直すだけじゃ足りないかもしれない。
794 :
nobodyさん :2006/11/12(日) 12:11:30 ID:JI5vE2Zg
>>781-782 ありがとうございます!
本当にPerlって奥が深いですね・・・もっと勉強しますm(_ _)m
まずは翻訳してから改造しれや ただそれだけだろ? で、何人かが書いている通りリソースを分離できるなら (1)分離できるところは分離する (2)(1)の作業中に分離できないところを翻訳 (3)分離後ソースを改造開始し、(2)で分離したリソースの翻訳 これがベストか?
>>792 > ログ記録を部分を以下のようにしたところエラーが出てしまいました
Internal Server Errorだったら文法ミスとかでしょ。
鯖のエラーログ見るか文法チェックしてみ。
肝心な部分が省略されてるから答えられるのはこの程度しかない。
> この最後の1;はどうして必要なのでしょうか?
"requireしたファイルの最後"を明示しないとエラーになることがあるから。
1;がその役割。
>>796 if構文を入れなければ、「1;」を省略しても実行されるので
文法ミスではないと思いますが、if(){}を使ったことで
>ファイルの最後"を明示しないとエラーになる
が発生したものと思われます
有り難うございました
>>797 細かいとこなんだけれど一応。スルー力不足を露呈してみる。
>>796 の説明には若干の誤解があります。
require が読込むファイルは最後に真を返す必要があります。
より正確には、require されるコードが正しく実行されたかどうかの真偽を、そのコードから返す機能の名残ですが、今では誰も覚えていませんし、覚える必要もありません。
require はファイルが偽を返した場合、require されたコードの初期化に失敗したものと見なし、例外を吐いて死にます。
>>791 ここで解決できたら Perl のドキュメントを和訳して公開してくれるんだよ。
なんで1なんだろう?と思ってたけど納得できた。 ありがとう、胸がすっとしたぜ!
いつもお世話になっています。 CGI/Perl のデバッグをしたい (phpのWARNINGのような詳細なエラーを出したい) のですが、良い方法は無いでしょうか? エラーが出たときにApacheのエラーログを見ても、「Premature end of script headers: example.cgi」 程度の記述しか表示されません。 サーバは、Fedora Core 4 + Apache 2.2.0 + Perl 5.8.6 (SuExecは使っていません。) と一般的な構成です。 ご教示お願いします。
次のようなスクリプトを実行すると、「CGI開始」 は出力されますが、「CGI終了」 は出力されません。 このCGIには問題点があり、if ("検索対象文章" =~ /$hoge/i) の $hoge が "+" なので、正規表現として不正になっています。 本来ならば、500 Internet Sever Error となるべきだと思うのですが、何故かエラーにならず、スクリプトが強制終了されるだけになります。 これは何故でしょうか? if ("検索対象文章" =~ /+/i) と書けば、当然 500 Internet Sever Error になります。 --------------- test.cgi --------------- #!/usr/bin/perl print "Content-Type: text/html\n\n"; print "CGI開始"; $hoge = "+"; if ("検索対象文章" =~ /$hoge/i) { print "マッチしました。"; } else { print "マッチしませんでした。"; } print "CGIエンド"; exit; ---------------------------------------- ちなみに、この $hoge は実際にはCGIのユーザ入力の値です。 OSインジェクションやSQLインジェクションは聞いた事がありますが、Perl正規表現インジェクションという話は聞いた事はありませんが、 もしこの実装に、スクリプトの強制終了以外のセキュリティ上の問題点がありましたら教えていただけたら幸いです。 また、ようするに検索エンジンのように文章の検索を行いたいわけですが、ユーザ入力の正規表現のメタ文字の無効化方法がありましたら 教えて下さい。 お願いします。
803 :
802 :2006/11/13(月) 05:00:38 ID:???
> ユーザ入力の正規表現のメタ文字の無効化方法 これに関しましては、自分で知っているメタ文字をエスケープするコードを書いてみました。 もし、エスケープ漏れがあったら教えて下さい。 $_ =~ s/\\/\\\\/g; $_ =~ s/\^/\\\^/g; $_ =~ s/\./\\\./g; $_ =~ s/\$/\\\$/g; $_ =~ s/\*/\\\*/g; $_ =~ s/\?/\\\?/g; $_ =~ s/\|/\\\|/g; $_ =~ s/\(/\\\(/g; $_ =~ s/\)/\\\)/g; $_ =~ s/\[/\\\[/g; $_ =~ s/\]/\\\]/g; $_ =~ s/\{/\\\{/g; $_ =~ s/\}/\\\}/g; $_ =~ s/\+/\\\+/g;
>>801 use CGI::Carp qw(fatalsToBrowser);
をCGIファイルの先頭付近に。他にもKCatchとかあるから探してみそ
>>802 ヘッダを吐き出していればdieしようが何しようが表示されるのね。
/+/だと500エラーになるのは、解釈段階でエラーが発生するため。
対して/$hoge/だと$hogeの値は評価段階にならないと決定されないから
先にヘッダが出力される。よって500エラーにならない。
Perlは正規表現中に任意のコードを含めることが可能なのは事実だけれど(?{ ... })、
それなりに安全対策がしてあるので、許可しなければ外部コードが
実行されてしまうということは無いと思われる。
see also: perlre,
ttp://search.cpan.org/~nwclark/perl-5.8.8/ext/re/re.pm 強制終了しないようにするためにはevalブロックを用いるといい。
そのユーザの入力というのは正規表現を期待してるのだよね?
正規表現的に意味のある文字を全てエスケープしてしまうという意味なら、
quotemeta関数なり、/\Q$hoge\E/なりがあるけれど。その場合ならindex関数を使う手もある。
805 :
804 :2006/11/13(月) 05:12:29 ID:???
>>801 スマソ、思いっきり勘違いした警告か。
use warnings;
もしくはShebang行にこのように-wをつける。
#!/usr/bin/perl -w
で、さっきのと組み合わせて
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
...
warningsToBrowser(1);
のようにすると出力上にコメントとして出てくる。
806 :
802 :2006/11/13(月) 05:46:37 ID:???
>>804-805 ご丁寧な回答ありがとうございます。
#!/usr/bin/perl -w
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
を試してみます。
また、evalブロックについてのページも参考になりました。
> Perlは正規表現中に任意のコードを含めることが可能なのは事実だけれど(?{ ... })、
これはちょっと気になるので、もしよろしければ参考URLを教えていただけたら幸いです。
> その場合ならindex関数を使う手もある。
結局それに気がついて index 関数使っちゃいました。
大文字小文字を区別することができなくなりましたが、そこは諦めます。
>>806 (?{ ... })については参考URLをさがすまでもなくperldoc perlreにちゃんと書いてあるが。
808 :
802 :2006/11/13(月) 11:06:39 ID:???
SQLインジェクションみたいな脆弱性?
>>801 てゆかapacheのログ見れる立場にいるならLogLevelの設定変えられないの?
apacheのエラーログみて「Premature end of script headers: example.cgi」 しかないのなら、 いくらwarningsToBrowserやfatalsToBrowserしてもやっぱり何もでないんじゃないか。 ログみられなかったり見るのが面倒な人がつかうもんだろ? 処理系が検出するようなエラーはないがそもそもロジックがおかしい予感。
>>809 ようするに任意のコマンドが実行できる脆弱性ってことでしょ
use re 'eval';
$a =~ /$GET['search']/
こういうことしていると、「(?{open("| cat /etc/passwd >
[email protected] "})」 を送信されたときに
/etc/passwd がクラッカーに渡ってしまう。
正規表現インジェクションとでも呼べばいいだろうか
対策は正規表現のメタ文字のエスケープだね。
最新のActivePerlを入れたらppmがGUIになっててビビった。 コンソール版はなしですか?
>>813 以前の対話形式はppm-shell
コマンドラインなら
ppm command arg
でも行ける
# 殆どGUI版使ってないや
ppm ってインストール済のモジュールを一括してアップグレードできないんですか?
>>816 ppm upgrade -install
Perlは入門書を一冊読んで簡単な掲示板がやっと作れる程度のかなりの初心者なのですが、 CGIその1内のデータを、CGIその2に受け渡すにはどうしたらいいのでしょうか? 「アドレス?パラメータ」の形で、フォームのデータをやり取りするようにデータが渡せると 書いてあったので、「アドレス?a=$a&b=$b&c=$c」というようにすれば、CGIその1で 変数aに代入したデータをCGIその2に送ることが出来るかと思ったので、 require 'cgi-lib.pl'; &ReadParse( *form ); $a = $form{'a'}; $b = $form{'b'}; $c = $form{'c'}; として、 print "${a}${b}${c}\n"; と表示してみようとしても、どの変数も空のままなのか何も表示されません。 どうすれば、変数データ等はやり取りできるようになるのでしょうか?
>>818 <input type="hdden" name="a" value="value of a">
みたいにフォームに仕込むのが簡単かな。
クライアント側でいじれちゃうというデメリットがあるけどね。
>>819 早い回答ありがとうございます。
それでやってみます。
質問です my $file = "no001.jpg"; print -s $file; 上記のようにファイルサイズを出力するスクリプトで 正規表現を用いて no???.jpg にマッチするファイルのサイズを表示させたいのですが 方法が思いつきません 分かるかたいましたらご指導お願いいたします。
言っとくがオレはopendir派だ
CGI出力時の改行コードは指定するにはどうすればよいのでしょう。 LFにしたいのですが、どうやってもCRLFになってしまいます。 自宅のwindows上でも、xreaでもCRLFで出力されてしまいます。
自己解決しました。 ちゃんと出力されていました。 ブラウザでの保存時に勝手に改行コードが変えられていたようです。
>>821 loopで回して同じことして加算すれば。loopは opendir 派でなければ
foreach $hoge (<no???.jpg>) {
}
コマンドラインでなら ls -l と awk で One Liner するけどね
Perlで特定のHTMLファイルの一部を抜き出して出力したいと考えています。 随時更新される Yahoo! のトップのソースぐらいぐちゃぐちゃ (文法もぐちゃぐちゃでテーブルレイアウト、勿論適切なidはついていません) なHTMLから 特定の場所のデータを抜き出して、変数に代入したいといった感じです。 <table> <tr> <td>AAA</td> <td>BBB</td> <td>CCC</td> </tr> <tr> <td>DDD</td> <td>EEE</td> <td>FFF</td> </tr> </table> 例えば、上のようなテーブルのBBBの部分が随時かわるとして、それを動的に取得するかんじですね。 実際には外部のサーバのデータとなりますが、wget+cronで取得するつもりなのでそこはいいんですが、HTMLから 一部のデータを抜き出すのに便利なモジュールなどはありますでしょうか? なかったら地味に自分でロジック組んで見ます。
$n= 1; $get=($html=~ m#<td>(.*?)</td>#g)[$n]; そんなもんわざわざモジュール使わなくて書いたほうがシンプルじゃん
そんな単純なHTMLソースなわけないだろwww でも正規表現でひっぱってくるしかないと思う ソースの書き方が変わったら終わりだけど。 HTML::Parserみたいなのではないだろうし・・・
それpla(ry
miyagawa乙
自作のライブラリ、またはモジュールを用意しまして、 呼び元から利用可能なサブルーチンの一覧を得る方法はありますか?
オブジェクト指向を勉強するためにムーバブルタイプのソース見てるんですが、 これってお手本にしていいんでしょうか。 お手本的なコードを紹介してもらえないでしょうか。
my $name= 'test'; &$name; sub test { print 'test'; } 2行目ゎうそんこ。$nameを使って&testを実行することはできますか?
>831
main.plからFoo.pmを呼んでいるとして、
@Foo::EXPORTと@Foo::EXPORT_OKを確認したらいいんじゃないかと思う。
存在するとは限らないけど。オブジェクト指向なモジュールとかだとなにもエクスポートしないしね。
そうでなかったら直接シンボルテーブルを覗くとか。
>832
つ
ttp://search.cpan.org/
>>833 それ自分で書いて、実行してみた?
use strict 'refs' してなければそれでいけるよ。
文字列をデリファレンスすると、自動的にシンボルテーブルからひっぱってくる。
>>833 $name = ¥&test; # use strict 'refs' OK
$name->();
$name = 'test'; # use strict 'refs' NG
$name->();
$name = 'test';
eval "$name()";
$name = 'test()';
eval $name;
>>835 ありがとうございます!!ちなみに3件ともわたくしでした。
833はuse strictしてる場合、エラーになりました。
'refs'はよくわからないので調べてみます。
そこだけno strictするのは素人ですか?
>>832 オレの書いたソース。
悪い例としてな。
いっそ無名で my $name = sub { print "test"; }; $name->();
ああ、意味わかんないや。837=831=832=833で834=835と決め付けてました。 834さんと836さんありがとう!!
>>837 'refs' を付けると、シンボリックリファレンス(文字列をデリファレンス)だけを制限できる。
この辺は perldoc strict 参照。
ちゃんと理解してて no strict するなら問題ないと思うよ。むしろ常套手段。
>>841 詳しいご説明、ありがとうございます!
外部ファイルからプラグイン的なものを自動取得する方法を考えてたんですが、
できそうな気がしてきました。サブルーチンを全部飲み込もうかと。
後から間違いだったと気づくかも知れませんが。
プラグイン使うようなコードかくんなら、Module::Plugableとか検討してもいいかもね。
Plaggerもプラグイン使えるから参考になるかもね
わぉ、たくさん情報ありがとうございます! 今回たくさんWIKI系を参考にしてたんですが、FreeStyleはコメントが日本語なのもあって 見やすいですね。そしてざっと見ただけでも参考なるコーディングがすでに沢山見つかってます。
質問なのですが、
>>827 の
(.*?) はどういう意味でしょうか?
「perl ".*?"」で5個以上の検索エンジンで検索したのに、全部記号部分が無視されましたorz
. = 任意の文字
* = 直前の文字を0回以上にマッチ
? = 直前の文字を0又は1回にマッチ
ですが、「.*?」 にする意味が分からないです。
848 :
847 :2006/11/17(金) 11:46:48 ID:???
ついでに "m#" "#g" と囲ってあるのも意味が分からない…。 m は 改行無視、gは繰り返しマッチ、だと思うんですが /mg をかっこよく左右に分離させて バランス良く美しく書いている感じでしょうか? 何かいい解説サイトがありましたら教えていただけたら幸いです。
さんこーしょに普通に載ってるでしょ、、正規表現のとこ ネットでも「Perl 正規表現」で複合検索かければイパーイあるでし
>>848 $get=($html=~ m#<td>(.*?)</td>#g)[$n];
$get=($html=~ /<td>(.*?)<\/td>/g)[$n];
同じ。
セパレータが違うのと、m演算子はセパレータが/の時だけ省略できる
(.*?)は任意の文字列
検索しても、読まないと意味が無いぞ!!
ふぅ…
任意の文字列なら .* でいいんじゃないの?
853 :
852 :2006/11/17(金) 13:09:29 ID:???
あ、量指定子での最短マッチか。 そまそ。
最短マッチってそうやるんだ・・・ ([^<]+)<とかやってたよ
855 :
nobodyさん :2006/11/17(金) 20:02:23 ID:3ps2NDUf
my と local の違いをおしえてください
localのつかいかた $hoge = 'ぺにす'; { local $hoge; # ちょっとどいてね $hoge = 'わぎな'; } print $hoge; myのつかいかた { my $hoge = 'ちんぽ'; # ぶろっくの中だけ使えるね } print $hoge;
卑猥だな
858 :
nobodyさん :2006/11/18(土) 01:14:14 ID:gJVNJgdH
SQLの話になってしまうのですが、SQL総合やSQL初心者的なスレッドがなかったので、 ややスレ違いかもしれませんが質問させてもらいます。 Perl+MySQLでプログラムを書いていまして、IDとしてオートインクリメントされる フィールドを設けているのですが、INSERTでレコードを挿入したあとに、 オートインクリメントされた値を知りたい(変数に格納したい)のですが、何か簡単 な方法はありますか?
859 :
858 :2006/11/18(土) 02:19:05 ID:gJVNJgdH
自己解決しました。
LWPを使ったリンクチェッカーを作りたいのですが、どの関数を使ったらいいか迷っています。 404だけでなく、ファイルが無ければ特定URLに転送される場合にも対応したいと思っています。 LWP::Simpleを使ってgetとheadで実験してみたところ、 共にリンク先が無い場合、転送先のページに飛んでそれを取得してきました。 head関数では($content_type, $document_length, $modified_time, $expires, $server)の配列が 返されるとのことですが、 $document_length→body部分の文字数 $modified_time→取得にかかった時間 という理解でよいのでしょうか?(質問1) 現在$document_lengthでリンク先の状態を判別しようと思っていますが、さらに精度のよい判別が できる関数がありましたらご教授願いたいです。(質問2)
document_length ヘッダ除く本文の長さ modified_time 最終更新時間 $response -> status_line;
863 :
861 :2006/11/19(日) 02:39:50 ID:???
LWP::UserAgentを使ってみました。
こんな感じのソースです。
#!/usr/local/bin/perl
# モジュールを保存した場所を指定
use lib qw(../../../perl/lib/perl5/site_perl/5.8.4);
# モジュールを使う
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$req =
HTTP::Request- >new('GET', '
http://yahoo.co.jp/ ');
$res = $ua->request($req);
$res->content;
print "Content-type: text/html\n\n";
print "<html><head><title></title></head><body>";
print "$res";
print "</body></html>";
すると、画面に「
HTTP::Response=HASH (0x8309728)」とだけ表示されました。
16進数で何かしらのデータが受信して表示されていると思うのですが、$resが何なのか分かるように
表示するにはどうしたらいいのでしょうか?
perlのオブジェクト指向に慣れてないね。$resはオブジェクト。 だからrequestでgetしたデータは「$res->content」で返される。 つまりこうすれば良い↓ print "Content-type: text/html\n\n"; print "<html><head><title></title></head><body>"; print $res->content; print "</body></html>";
865 :
861 :2006/11/19(日) 03:35:42 ID:???
なるほど、できました。
ご丁寧にありがとうございます。
$ua = LWP::UserAgent->new;
$req =
HTTP::Request- >new('GET', '
http://yahoo.co.jp/ ');
$res = $ua->request($req);
この場合だと、ここのスレッドが完了した時点で$res(物理的にはメモリ)に
「
http://yahoo.co.jp/ 」からのソースが保持されていて、
$res->contentその中からbody部分のデータを持った変数。
という理解でいいでしょうか?
オブジェクトと変数はだいぶ違うが、まぁ流れはそんな感じ。ただ、 >$res->contentその中からbody部分のデータを持った変数。 これは「$resの"content"に入ってるデータを引っ張り出す」と考えたほうが良い。 あとbody部分だけじゃなくて、head含めて全部だから。
オンメモリじゃなくて、LWPはファイルにも書き出せたはずだよ
質問させて下さい。 package Hoge; use IO::File; sub load { my $fh = IO::File->new('test.txt','r'); my @tmp = $fh->getlines(); $fh->close(); } 1; #!/usr/bin/perl use IO::File; my $fh = IO::File->new('test.txt','r'); my @tmp = $fh->getlines(); $fh->close(); パッケージだと $fh->getlines(); でエラーになります。 パッケージにする時って何か特殊な事をしないと駄目ですか?
>>868 どんなエラーですか?
Hogeパッケージの方はload()というサブルーチンのようですが、呼び出している部分がないので
どう使っているかわかりません。
Can't call method "getlines" on an undefined value
というエラーなら、newに失敗しているということでしょう。$fhをチェックすべきです。
870 :
nobodyさん :2006/11/19(日) 17:19:22 ID:Hl3UB+5J
Template-ToolKitで、一つのhtmlテンプレートの中で FOREACHによるループ部分とそれ以外の差し替え部分を 同時にprocessするにはどうしたらいいんでしょうか?
871 :
868 :2006/11/19(日) 17:53:17 ID:???
>>869 >Can't call method "getlines" on an undefined value
このエラーです。
呼び出しは
#!/usr/bin/perl
use Hoge;
Hoge->load();
です。
>>871 私のところで動作させてみたら、エラーは出ずに動きましたよ。
IO::File->new の返り値を確かめましたか?
Hoge.pm
--------
package Hoge;
use IO::File;
sub load {
my $fh = IO::File->new('test.txt','r') or die $!;
my @tmp = $fh->getlines();
$fh->close();
return @tmp;
}
1;
--------
hoge.pl
--------
use Hoge;
print Hoge->load();
--------
>>872 らくだ本を買いに行ってました...
もう一度よく確認してみます。
ありがとうございました。
質問ですCarpでCGIのデバッグを行っているのですが local $method = @_; のように宣言する行で Global symbol "$method" requires explicit package name at test.cgi line 74. とエラーが出てしまいます これはどういった原因が考えられるのでしょうか 分かるかたいましたらお願いいたします。
スカラ変数の中身が数値かそれ以外かを判断するにはどうしたらいいんでしょうか?
>>875 Scalar::Utilのlooks_like_number
>>874 エラーメッセージ読めばだいたいわかると思うが、さらに詳しくしりたければ
perldiag(1)を読め。
Global symbol "%s" requires explicit package name
(F) You've said "use strict vars", which indicates that all vari-
ables must either be lexically scoped (using "my"), declared
beforehand using "our", or explicitly qualified to say which pack-
age the global variable is in (using "::").
'use strict vars'が指定されているので、すべての変数は("my"を用いた)
レキシカルスコープの変数か、事前に"our"で宣言されるか、("::"を用いて)
明示的に修飾することでどのパッケージに所属するかを示したグローバル
変数でなければなりません。
878 :
875 :2006/11/20(月) 15:51:17 ID:???
>874 サブルーチン 呼び出してるときに、値が入っていないのでは? shiftしれば、その結果でわかるかと思う
>>879 use strict 下で宣言されてない変数を使おうとした時のエラーだって
>>877 で書いてあるじゃない。
local は既に宣言されてる変数の値の変化を局所化するだけで、変数の宣言にはならないんだってば。
my か our で宣言しないとダメ。あやふやな回答は質問者を混乱させるだけだよ(´・ω・)
881 :
TORA :2006/11/20(月) 22:44:57 ID:a7JS476D
はじめまして 最近Perlを勉強しはじめたものなんですが 「数列を配列に入れ、偶数だけ表示させてください」 配列とかわかるのですが偶数だけ表示とかっていうのがわかりません。 周りの人に聞いても知らない人が多いので助けてください><
>>881 宿題は自分でやりなさい。
ヒント
1 % 2 = 1
4 % 2 = 0
>>881 考えるんだ
偶数と奇数の違いを考えるんだ
算数からか・・・
こうですか!?わかりません! use strict; use Math::BigInt; use Tie::LazyList; tie my @seq, 'Tie::LazyList', [ 1 ], sub { my($array_ref, $n) = @_; $n }; for my $n (1..20) { my $x = Math::BigInt->new($seq[$n]); print "$x\n" if $x->is_even; }
% 2 より & 1 の方がいいと思うんだけど、何か問題あったりする?
どっちでもいい ただ、4 % 2 = 0 じゃなくて 4 % 2 == 0
>>886 $ perl -e 'print 1000000000000 & 1'
1
2.0とかでも大丈夫?
あっちで使った技を取り入れつつ♪ my @Array = ( 1.. 1000 ); my %number; @number{@Array} = (1) x @Array; printf qq|%d\n|, $_ for grep not( $_ % 2), keys %number; # 乱数っぽく♪
foreach(@rndnums){ print $_ if !($_ % 2); }
田村清姫さんと空英彦さんが結婚しました。さてお嫁さんのなまえは何でしょう
895 :
TORA :2006/11/21(火) 00:11:22 ID:???
みなさん迷惑かけてすいませんでした。 みなさんの出してくれているソースがまったく理解できずにいます。 まだ勉強して無いところが多かったみたいです。 本当に迷惑かけてすいません。
井上順太郎
本当にどれも理解できないの? だったら0から勉強しなおしなよ
だから初心者スレ来てるんじゃ
899 :
TORA :2006/11/21(火) 00:20:49 ID:???
0から始めたばかりなんですがmy@Array my%numberまだとか見たことないので
正規表現でHTMLタグを簡易的に表すことについて質問です! 1. <a href=~> 2. </a> 上記の二つを簡潔に表すのに、</?a\s*.*?>としてみたものの<a>というのにもマッチしてしまいます。 /があったら属性なし、/がなければ属性必須にするような後方参照は可能でしょうか。 よろしくお願いします! # <a>がHTMLの文法として正しいのかどうかは知りません
>989 そんなんググるか、リファレンスとか持ってれば必ず載ってるべ? 理解しようとしない・調べようとしないでは、ここで聞くだけ無駄では? >990 </?a\s*.+?> はどう?
\s*←空白が無くてもマッチ .*?←文字が無くてもマッチ
903 :
900 :2006/11/21(火) 00:32:26 ID:???
</?a\s*.+?>だと</a>がマッチしないんですよ。 /の有無で分岐するみたいな巧妙な文法ってないでしょうかね。
普通に|使えよ
あぁそっか+じゃだめだな テキトーすぎですまそ
=~ #<a\s+.*?>|</a>#i
907 :
900 :2006/11/21(火) 00:51:46 ID:???
やっぱそれしかないですかね。正規表現はまだしらない機能がいっぱいなので、 ひょっとしてと思ったんですが。ありがとうございます。
>>900 実直に書いてみた。
my @str = ('<a href=...>', '</a>' , '<a>', '</a hoge>' ) ;
for my $str ( @str ){
my $flag = 0 ;
if ( $str =~ m{\<
(/(?{ $flag = 1 })|(?{ $flag = 0 }))
a
(??{ $flag == 0 ? '\s+\S+.*?' : '' })
\>}x ){
print $str . "\n" ;
}
}
アホす。
>>908 > (/(?{ $flag = 1 })|(?{ $flag = 0 }))
なるほど、|を使ってマッチしなかったときはフラグを上書きすりゃいいのか。勉強になった
m{</?(?(?<=/)a|a\s+.+?)>} # で実現できるけど、でも読める? ^^;
911 :
900 :2006/11/21(火) 01:14:10 ID:???
>>908 すごいっす!今のところ全然意味が分からないですが、いずれ役に立ちそうな予感がします。
912 :
900 :2006/11/21(火) 01:28:08 ID:???
>>910 これだ!2つ目の?がif文になってるんですね。勉強になりました。
aを何とか一回に収めたいところですが、自分で考えてみます。
コーディングとはちょっと違うんですが、質問です。 CPANでモジュールをインストールしたいのですが、File::Copyというモジュールがインストールできません。 エラーコードは以下の通りでした。 cpan > install File::Copy CPAN: Storable loaded ok Going to read /home/account/.cpan/Metadata Database was generated on Mon, 20 Nov 2006 05:24:36 GMT Running install for module File::Copy Running make for N/NW/NWCLARK/perl-5.8.8.tar.gz The most recent version "2.09" of the module "File::Copy" comes with the current version of perl (5.8.8). I'll build that only if you ask for something like force install File::Copy or isntall N/NW/NWCLARK/perl-5.8.8.tar.gz Running make test Make had some probrem, maybe interrupted?Won't test Has no own directory Running make install Has no own directory Make had some probrem, maybe interrupted?Won't install サーバはさくらサーバです。 LWPモジュールはインストールできました。そのモジュールは5.8.4というフォルダ以下に入っています。 ご回答お願い致します。
標準で入ってないの?
915 :
908 :2006/11/21(火) 07:58:15 ID:???
>>911 知って数年になるが役に立ったことなどないよw
そんな読みにくいコードは遊びでしか書かないわな。
>>913 夜間中学で学びなおして、読めるようになれ。
>>913 ずばりのメッセージが出てますよ?
一応大雑把に解説。
> [The most recent version "2.09" of the module "File::Copy"]
> comes with [the current version of perl (5.8.8)].
モジュール "File::Copy"の最新版である "2.09" は現行版のperl (5.8.8) に含まれます。
> I'll build that [only if you ask for something like
> force install File::Copy
> or
> isntall N/NW/NWCLARK/perl-5.8.8.tar.gz]
"force install File::Copy" や、"install N/NW/NWCLARK/perl-5.8.8.tar.gz" のような
(通常とは違う) 要求があったあった場合にだけビルドします。
http://www.excite.co.jp/world/english/ 上手く解釈できない単語をちょっと置き換えるだけでそれなりの日本語が出てきます。
File::Copy -> File_Copy
"2.09" -> 2.09
(5.8.8) -> 5.8.8
など。
perlはじめたばかりなんですが、スクリプト作ってると 何行目でエラーでたのかわかりません。 どんなエラーか知る方法ありますでしょうか。
ログ見ろ それかブラウザにエラーを表示するモジュールがある それかKENTでスクリプトエラーを表示するスクリプトが置いてある お好きなのをどうぞ
>>920 さっそく、ありがとうございます。
見てみます。
じゃあ、とりあえずは use strict; use warnings; 最初にこの2行を入れておけ。 CGI書いてるんなら、 use CGI::Carp qw/fatalsToBrowser/; これも追加。
Apache 2.2.3 を Linux (Fedora Core 4) 上で動かしています。 Perl のバージョンは v5.8.6 です。 Apache の設定で 「LogLevel debug」 にしても (warnの場合でも)、Apache のログに Perl のエラー箇所が出力されません。 何行目にエラーがある、といった情報が欲しいのですが、この程度のエラーのみとなります。 [Wed Nov 22 18:51:19 2006] [error] [client 127.0.0.1] Premature end of script headers: test.cgi 詳しいエラーを出力する方法は無いでしょうか? CGI/Perl のソースは次の通りです。 ----------------------------------- #!/usr/bin/perl print "Content-Type: text/html\n\n"; hoge; # 意図的にエラーを発生させてます。 -----------------------------------
925 :
924 :2006/11/22(水) 19:03:09 ID:???
ちなみに、
>>923 の3行を書いても、ブラウザには Internet Server Error で
Apache のエラーログには [Wed Nov 22 18:51:19 2006] [error] [client 127.0.0.1] Premature end of script headers: test.cgi が出力されるだけです。
926 :
924 :2006/11/22(水) 19:06:27 ID:???
すみません、Perl の改行コードが間違っていたようですorz
927 :
924 :2006/11/22(水) 19:15:19 ID:???
ほんとに申し訳ないです。 use warnings; use CGI::Carp qw/fatalsToBrowser/; のどちらも書かなくても、Apache のエラーログにはCGIエラーが記録されていたようです。 CGIエラーなんてもんはバーチャルホストのエラーログに記録されるに決まっている、と考えていたのですが Apache全体のエラーログに出力されていたようです。
>>923 use strict; は 宣言されていない変数の使用などをエラーとするなどの厳格な処理をするということであることは分かっていて、
use CGI::Carp qw/fatalsToBrowser/; はエラーをブラウザに出力する、ってことは分かるんだけど、
use warnings; って具体的にどういう時に役にたつんでしょうか?
ヘルプを見た限りでは可能な限り警告を出力する、だそうですが、
use strict; のみで出ないエラーが use warnings; で出たという経験はありません。
>>928 横レス
perldoc perllexwarn
してみろ。例も山ほど載ってる。
>>928 > use strict; のみで出ないエラーが use warnings; で出たという経験はありません。
大丈夫。そのうち経験できるから。
特定のサイトのソースを定期的に取得するスクリプトを作ったんだけど、 ブラウザを閉じてもスクリプトを動かし続けるにはどうしたらいいの?
cron
毎日ある時間になったらログファイルを削除するようにしたいのですが cron使えないので、そのある時間以降の最初のアクセス時に消すようにしたいです 例えば毎日6時とすると if( $now_date{'hour'} < 6){ $dtp = 1; } if( $now_date{'hour'} >= 6 && $dtp == 1){ unlink 'log.dat'; $dtp = 0; } 個別に時間の取得やフラグ判定では削除はできるのですが これを組み合わせるとうまくいきません どうすればいいでしょうか?
最初のアクセスかどうかはどうやって判定してるの? あと、2つのif文の間に何かの処理があるのか知らないけど、2つ目のif文に 時刻の判定は不要では?一回目でフラグたったんだから。
フラグをファイルかなんかに保存すれば?
時間取得して、6時以降だったら6時の日時を書き出しし、 その日にちで判断しかない?
938 :
934 :2006/11/23(木) 02:14:59 ID:???
6時前だったらフラグを1にする 6時過ぎてフラグが1だったらログを消す フラグを0にする それ以降の6時過ぎのアクセスはフラグは0なので ログ削除は実行されない これじゃだめなのかな
本人ならやってみなされ
フラグってひょっとして変数のこと言ってるでしょ。いろいろ誤解してるよ。 フラグは外部にファイルか何かで残さないとだめ。下記、雰囲気のみ。 ### タイムスタンプの古いフラグを削除 (-d 'flag' and (stat('flag'))[10] < $threshold_time) and rmdir 'flag'; ### フラグがなければ最初のアクセス unless (-d 'flag') { unlink 'log.dat'; mkdir 'flag'; }
941 :
934 :2006/11/23(木) 03:11:45 ID:???
なるほどわかりました ありがとうございます
>>919 #!/usr/bin/perl
...
あなたの記述したperlコード
...
↓上のコードを下のように書き換えればエラーがブラウザで見えるから。
注:エラーの行数は__END__の真下の行を1行目としてカウントされるよ。
#!/usr/bin/perl
use strict;
use warnings;
print "Content-Type: text/html\n\n";
eval join'',<DATA>;
print $@;
__END__
...
あなたの記述したperlコード
...
943 :
nobodyさん :2006/11/23(木) 20:42:06 ID:Hjnm2TEJ
2chの名前欄に何かの文字を入力したらオミクジが引けたりするやつあるじゃないですか? あれを掲示板につけたいんですけど 掲示板の文の中になにかの文字を入れて、オミクジの結果を表示するところまではできるんですけど それは書き込むたびにランダムに表示が変わっちゃうんですけど。 それを1日ごとに変わるようにできないでしょうか?
ちょっと↑の流れを読んでヒントにするんだ
$random = int(time/60/60/24) ^ unpack "%C*", $name; とか? ただし、深夜の12時が区切りになるけど。 正確に24時間以上、という条件なら cookie でホゲ。
946 :
nobodyさん :2006/11/23(木) 21:13:07 ID:Hjnm2TEJ
947 :
nobodyさん :2006/11/23(木) 21:13:49 ID:Hjnm2TEJ
948 :
nobodyさん :2006/11/23(木) 21:14:19 ID:Hjnm2TEJ
最後に「r」入力したらもう一度ってのをやりたかったんですが 1度しか入力できません 何がいけないのでしょうか?簡単にやるのはどうしたらいいのでしょうか? use strict; my $key = 'r'; do{ #色々と print "再実行はrを入力\n"; $key = getc; }while($key eq 'r');
\nがバッファされているから。一行まるごと読むべし。
訂正。 \nが、ではなく、\nまで
>>949 1key コマンドをやりたいなら Term::ReadKey の利用も検討してみよう。
結局使わなかったとしても、調べる過程でいくつかの事を学べるよ。
サイトAにアクセスすると自動的にサイトBに転送される状況で、 スクリプトにサイトAのアドレスが入力された場合に、 サイトBのアドレスを表示するにはどうしたらいいの?
転送されない状況なら何を表示するの?
考え方としてはリンク集の登録 転送URLだったら転送後のURLとして処理 非転送URLだったらそのまま 見たいな感じ
httpのrfcでも読めば?
959 :
949 :2006/11/24(金) 22:01:46 ID:???
>>950-952 ありがとうございました
chomp($key = <STDIN>);でうまくいきました
Term::ReadKey;の使った方もできました
でも仕組みはよくわかりませんが
がんばって勉強します・・・
>>958 違うよw
この文章でエロサイトが思い浮かぶなんて相当あれだな
相当あれじゃなくて、その程度も思いつかないのがあれでしょ
ま、アレってことでひとつ…
httpのrfcとか言ってるようじゃまだまだだな
フォームから送られてきたデータを分解する時に、 $value =~ tr/+/ /; がよく使われてるんだけど、 複数の文字じゃないのに「$value =~ s/+/ /;」を使わない理由、 そもそもなぜ「+」をスペースに変換する必要があるのか 教えて
1つ上も読めないのか?
常識的に考えて、文字の置換(変換)するだけなら s/// より tr/// の方が速いだろ・・・ 「+」をスペースに変換する必要があるのは、スペースが「+」に変換されてるからだろ・・・
967 :
nobodyさん :2006/11/25(土) 16:06:45 ID:5hW/EMoW
2chのおみくじあるじゃないですか? あれってどうすればいいですかね?
↑ダメな質問の例
名前が!omikujiなら、ランダムで結果に変換。
970 :
nobodyさん :2006/11/25(土) 16:23:19 ID:5hW/EMoW
(´・ω・`)そこを考えるのを楽しめないんだったら、、、
973 :
nobodyさん :2006/11/25(土) 16:54:42 ID:5hW/EMoW
975 :
nobodyさん :2006/11/25(土) 20:26:36 ID:Nft95t5x
jcode.pmはモジュールだからサーバにインストールして使うものだと聞いてたんだけど、 jcode.pmとjcodeのディレクトリをアップしてuse libでパスを指定したら動いた この使い方は推奨されてない?
jcode.pmなんて知りません><
標準モジュールに Encode があるから推奨されないっちゃされないが、 Encode で期待する動作が得られないならそれも仕方無いかと思う。 あと、Encode はコスト高いって聞くし、Jcode.pm が軽いならいいんじゃないかな。
>>977 Jcodeに限らず、必要なモジュールが導入されていない場合に自前で用意して use lib して使用するのは普通です。
ただし、
>>979 で書かれている通り、可能であればEncodeを利用するべきでしょう。
>>979 2.0 <= $Jcode::VERSION and 5.008001 <= $] の環境では、JcodeはEncodeのwrapperとして動作します。
したがって、速度はほぼ変わりません。
# Encodeが標準ではない環境もまだあるので、一概にEncodeを使うべきとは言い切れないところ。
981 :
nobodyさん :2006/11/26(日) 12:07:09 ID:Y4Eo2nyo
連続投稿規制のようなものをつけるにはどうすればいいですか?
983 :
nobodyさん :2006/11/26(日) 12:19:07 ID:Y4Eo2nyo
読んだ
読んだやつがそんなレスはしないけどな。おかしいなあ
読んだやつはそんなレスをするよ
987 :
nobodyさん :2006/11/26(日) 12:32:46 ID:Y4Eo2nyo
Encodeモジュールって使わない方が良いって話じゃなかったっけ?
encoding は使わないほうが良いって話はあるけど。
mod_perlとかだと他の人まで影響与えちゃうってのはencode?
新スレおつ
そして埋め1
埋め2
梅
とりゃあ
1000なら今日中に仕事が終わる
なにこの余裕の1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。