Perlコーディング初心者質問スレ Part 60
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
2009/09/03(木) 23:51:12ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/
0809nobodyさん
2010/04/24(土) 23:01:11ID:???0810808
2010/04/25(日) 14:09:14ID:???ttp://perldoc.jp/docs/perl/5.10.0/perlsyn.pod
ここにも。
use 5.010;
my @array = qw(1 2 3 4 5);
my $number = 3;
say "found!(1)" if $number ~~ @array;
say "found!(2)" if @array ~~ $number;
say "found!(3)" if grep $_ == $number, @array;
0811nobodyさん
2010/04/25(日) 14:27:40ID:???演算子が増えるとわくわくするよねw
0813nobodyさん
2010/04/25(日) 19:58:29ID:???それ普通に実行されるけど・・・
ちなみにうちの環境
v5.10.0 built for MSWin32-x86-multi-thread
Binary build 1004 [287188] provided by ActiveState
Built Sep 3 2008 13:16:37
0814812
2010/04/25(日) 21:00:28ID:???http://search.cpan.org/~dapm/perl-5.10.1/pod/perl5101delta.pod#Changes_to_type-based_dispatch
> Changes to type-based dispatch
> The smart match operator ~~ is no longer commutative.
0815nobodyさん
2010/04/25(日) 21:50:33ID:???evalで囲っただけじゃOracleの戻りを待っちゃってうまい実装を探してます。
0816nobodyさん
2010/04/26(月) 00:42:37ID:???eval {
local $SIG{ALRM} = sub { die 'timeout'; };
alarm 10;
# ディスパッチ
alarm 0;
};
unless ($@ =~ /timeout/) {
}
0817808
2010/04/26(月) 03:49:45ID:???>>813
>>814
ありがとうございます。
スッキリしました。( ^ー゚)bグッ!
ちなみに私のは、
v5.10.1 built for MSWin32-x86-multi-thread
Binary build 1007 [291969] provided by ActiveState
Built Jan 26 2010 23:15:11
です。
0818nobodyさん
2010/04/26(月) 12:44:34ID:???そです。
でもその実装だと10秒でdieしてくれなくてOrcleから処理が戻ってきてからじゃないとハンドリングできないんですよ。
0819nobodyさん
2010/04/26(月) 13:04:32ID:???DBIのマニュアルにまさしくDBD::Oracleだとうまくいかないからこうしろってのが
書いてあるのでためすといいよ。
0820nobodyさん
2010/04/30(金) 10:50:25ID:???内容的には非常に単純で
<hoge>テスト</hoge>
とすると、
<font style="font-size:x-large">テスト</font>
のように置換するだけです。
ここでみなさんにお伺いしたいことは
テストの文字を取得して加工する
というものです。
以下のような式を考えましたが、
($art) = $mes =~ /<hoge>(.*?)<\/hoge>/;
if($art){
$mes =~ s/<hoge>(.*?)<\/hoge>/<span style=\"font-size:140%;\">$art<\/span><span style=\"font-size:180%;\">$art<\/span>/g;
}
一回の書き込みの中で2回使用しようとすると、
2回目の方まで一回目の内容で適用されてしまいます。
↑よくよく考えてみれば、当たり前ですが。
なんとか、一回の書き込みの中で複数回使用できるようにしたいのですが、
どのようにすればよろしいでしょうか?
宜しくお願い致します。
0821nobodyさん
2010/04/30(金) 10:58:23ID:???0823nobodyさん
2010/04/30(金) 22:13:35ID:???表示用とは別に保存しておくといいよ
0824nobodyさん
2010/05/01(土) 04:35:43ID:???下記で取得が行えません。
my $q = new CGI();
my $fh = $q->upload($fieldname);
my $mime =uploadInfo($fh)->{'Content-Type'};
エラーログには下記がはかれていました。
Premature end of script headers:
Can't use an undefined value as a HASH reference at /image line 82, <DATA>
他にもContent-Typeを取得する方法があればそれでもいいのですが、
このエラーも解決してみたく持ってますので、ご教示いただけますと
幸いです。
0825nobodyさん
2010/05/01(土) 05:00:33ID:???0827nobodyさん
2010/05/01(土) 07:52:23ID:???my $mime = $info->{'Content-Type'};
ようわからんけど uploadInfo から帰ってきた値が undef だと言われてるみたいだけど
0828nobodyさん
2010/05/01(土) 09:41:14ID:???moduleのドキュメント見てみたけど、
uploadInfoに渡すのはfile handleじゃなくファイル名じゃないとダメなんじゃない?
[module doc]
$filename = $q->param('uploaded_file');
$type = $q->uploadInfo($filename)->{'Content-Type'};
unless ($type eq 'text/html') {
die "HTML FILES ONLY!";
}
0829824
2010/05/01(土) 18:35:17ID:???これってフォームからアップロードされた画像を対象にContent-typeの
取得を行うんですね。。根本的に間違えてました。。
指定した画像のContent-Typeを取得する簡単な方法はないもので
しょうか。
拡張子がgifなのに実際はpngであったりとするケースがあるため、
Content-Typeで判定をしたいのですが、ご存知でしたらどうか
教えてください。
0830nobodyさん
2010/05/01(土) 19:30:27ID:3heBO4S1それってUploader云々ではなくて、例えばローカルとかに保存してあるファイルのことかい?
だったらGDでもImage::Magicでも使って、画像を判定すればいいんでね。
まあヘッダの数十〜百バイト程度の判定で済むから、自前でバイナリ読んで解析するとかもあり。
(GDではWindows-bmpに未対応なので、以前自分で書いた)
0831nobodyさん
2010/05/01(土) 20:59:59ID:???はい、そうです。
Image::Magickはサーバに入れられなかったので、GDで
できる方法があれば教えていただけますと幸いです。
よろしくお願いいたします。
0832nobodyさん
2010/05/01(土) 21:32:17ID:???ttp://labs.gmo.jp/blog/ku/2007/05/8.html
phpだがperlに応用可能だろう
0833nobodyさん
2010/05/01(土) 22:50:54ID:???ただ、PNG が無いっていうw
0834nobodyさん
2010/05/01(土) 23:06:47ID:???モジュールあるのね
そこそこ設定の揃ってるマジックファイルって、誰か配布して無いっすかね
0835nobodyさん
2010/05/02(日) 02:25:22ID:???ありがとうございます。
勉強になりました。
最終的には、MMagicを使用させていただきました。
これ便利ですね。
この場をお借りし御礼申し上げます。
0836nobodyさん
2010/05/10(月) 14:42:47ID:???$q = new CGI;
@hoge = $q->param('hoge');
@hoge = ("hoge", "hogehoge")
と同じ方法をCGI.PMをもちいらないで出来ませんか?
read(STDIN, $q, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $q);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
@FORM{$name} = $value;
}
@FORM{$name} = ("hoge", "hogehoge")
みたいな感じで
0837nobodyさん
2010/05/10(月) 14:45:58ID:???0838836
2010/05/10(月) 18:06:05ID:???@pairs = split(/&/, $q);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
push(@hoge, $val) if $key =~ /hoge/;
@FORM{$name} = $value;
}
で自己解決しました。
お邪魔しました。
0839836
2010/05/10(月) 18:07:53ID:???だった。
0840nobodyさん
2010/05/10(月) 20:01:30ID:???0841nobodyさん
2010/05/12(水) 14:33:57ID:l5g8HUnE文字化けしています。どうすれば良いのでしょうか。
Perlのソースに記述した漢字は、パソコンのテキストエディタ表示、
IE上のフォーム表示、サーバのファイル上のいずれでも文字化けして
いません。
フォームを表示するhtmlの<meta>タグではShift-JISを指定しています。
よろしくお願いします。
0842nobodyさん
2010/05/12(水) 21:13:03ID:???ソースが無いことにはなんとも
0844nobodyさん
2010/05/14(金) 23:42:43ID:???変換?してたような気がするんですけど、なんでしたっけ?
ちなみに GD 使ってます
0846nobodyさん
2010/05/15(土) 00:26:24ID:???GD にメモリの中にあるバイナリを GD と結びつける方法は無いのかしら?
一旦ファイルに書き出さないと駄目な感じなんですかね・・・
0847nobodyさん
2010/05/15(土) 00:35:15ID:???SEE GD Manpage
>Alternatively, you may create a GD::Image object based on an existing image by providing an open filehandle, a filename, or the image data itself.
0848nobodyさん
2010/05/15(土) 00:52:53ID:???「ファイルから読め」
って事っすね orz
0849nobodyさん
2010/05/15(土) 02:58:47ID:???〜 ファイル名 $tmp_filename で画像を作る処理 〜 省略 〜
my $imgbin = GD::Image->new($tmp_filename);
こうやるとエラーログに
[Sat May 15 02:42:21 2010] index.cgi: Use of uninitialized value $pkg in concatenation (.) or string at /perl/lib/Symbol.pm line 129.
が出てきます。
Symbol.pm の 129 行目を含む関数は qualify なんですが、 GD.pm のソースを見ても qualify が有るわけも無く、デバッグしようにも負えません。
GD::Image->new($tmp_filename); に必要な引数があるのかと思って、CPAN の GD とこを見ても、サンプル自体がこういう記述の仕方。
コレって解決方法無いんでしょうか?
0850nobodyさん
2010/05/15(土) 13:25:56ID:???これでファイルの読み込みしなくて済むようになった
ImageToBlobみたいのがあるかと思ったら、そのままGDに投げてよかったんですね
0852nobodyさん
2010/05/15(土) 20:30:59ID:???↑
これか!
言われて今気が付いたw
0853nobodyさん
2010/05/15(土) 23:27:44ID:???なぜURLエンコードが必要が教えて下さい
0854nobodyさん
2010/05/16(日) 02:50:47ID:???0856nobodyさん
2010/05/16(日) 08:23:36ID:???あるよ↓
OK World - ?? ???? ?? ?? ??
http://world.okwave.jp/korean/
0857nobodyさん
2010/05/16(日) 18:26:33ID:GMFXnF2Imy $method = 'POST';
$request = HTTP::Request->new( $method, $uri,$header,$xml); --�@
POSTする際に、BASIC認証が必要なのですが、
別のモジュールでいう、
$req->authorization_basic("username","password");
的なことを、
use HTTP::Request;
を使って行いたいと思っています。つまり、�@に追加して認証を行わせたいと思っています。
http://search.cpan.org/~gaas/libwww-perl-5.836/lib/HTTP/Request.pm
何か方法はありますでしょうか?
0858nobodyさん
2010/05/16(日) 19:17:21ID:???http://search.cpan.org/~gaas/libwww-perl-5.836/lwpcook.pod#ACCESS_TO_PROTECTED_DOCUMENTS
0859nobodyさん
2010/05/16(日) 22:43:32ID:GMFXnF2IB(AP SERVER)
A-B 間は、HTTPプロトコルでXMLをやり取りするシステムだとします。
この際、AからBに何らかのXMLを送られてきたときHTTP GET で、
Bには、http://www.geekpage.jp/programming/perl-network/lwp-useragent-0.php
のプログラムがあり、BのAPサーバー上で 上のプログラム.pl とすると、期待通り、htmlファイルを
すべて画面に表示します。
さて、クライアントAから上のCGIにアクセスがあったとき GET でhoge.cgi としてクライアントからサーバーにアクセスします。上の結果をA(クライアント)に帰してやりたいと考えています。
具体的には、AからのレスポンスのXML内に埋め込んでやりたいと考えています。
どうやれればいいでしょうか?
もう少し言うと、
APからのサーバのレスポンスは、
HTTPレスポンスヘッダと、
<XML1>
ここに取得した情報を書きたい
<XM1>
このレスポンスを返したいと思います。
0860nobodyさん
2010/05/17(月) 04:32:17ID:???/img/5/a/7/d/20304495.jp
みたいにすることがありますが、これって技術的な名前ってあるんでしょうか?
ディレクトリ 分散化 でググっても知識として手に入れる例とかが出てこないので・・・
0861nobodyさん
2010/05/17(月) 10:48:50ID:???例えば、はてなブックマークのスクリーンショットはSHA-1で正規化したコードを
ディレクトリとファイル名に使ってる。
0863nobodyさん
2010/05/17(月) 12:40:45ID:???自分が作るサービスに数万ものユーザーが来るわけではないですが、それを見越した設計をするのが良いのかなと思ってたとこでの質問でした。
1時間に数百ものファイルが投稿されたら、1つのディレクトリに1万ものファイルとか余裕でたまるわけで、
全てのサーバーが新しいファイルシステムを採用してるわけではないので、1つのディレクトリあたりのファイル数を
1万未満に制限し、あふれたファイルは別のサブディレクトリというのを考えてます。
純粋に http://〜.com/files/2010/05/17/hh_xxxxxx.xxx の様にしてもいいのかなと思いましたが、
記念日の0時、例えば正月なんてそれで足りるとは思えませんしw
だったら http://〜.com/[a-z]/[a-z]/[a-z]/[a-z]/[a-z]/ のようなディレクトリを先に作ってしまい、偏らないように分散出来ないものかな?
などなど思ってたりするわけです。
ここまで書いて思ったけど、perl の話じゃなかった・・・
0864nobodyさん
2010/05/17(月) 17:36:43ID:???すごく・・・ガッカリです・・・
0865nobodyさん
2010/05/17(月) 23:55:28ID:OKXaqr1FXML::ATOMって多くのモジュール入れるみたいで、エラーになります。環境は普通のWinXPです。
0866nobodyさん
2010/05/18(火) 01:44:50ID:???0867nobodyさん
2010/05/18(火) 01:49:44ID:???0868nobodyさん
2010/05/18(火) 06:45:19ID:???だから俺は使ってない
あとこいつマルチだな
0869nobodyさん
2010/05/18(火) 07:30:05ID:???SHA-1として生成した文字列があった場合、色んなディレクトリにバラけると思うが、
SHA-1から得たディレクトリに収めようとして、そのディレクトリがすでに10000を超えようとしてたら
どうやって違うSHA-1の文字列を得るの?
再生成事態があってはならない事だと思うのだけど?
0870nobodyさん
2010/05/18(火) 14:02:13ID:???頭から一桁ずつ6階層のフォルダを作るだけで16777215通りにバラけるだろ
必要に応じてもっと深くしてもいい
なんでそんなことも思いつかないの?
0871nobodyさん
2010/05/18(火) 19:28:59ID:???それだと、特定のディレクトリに一定数 (今回は1万) 以上溜まらない。 って事になるでしょう。
しかもファイルから保存場所を求めるわけだから、別の値を求められるわけではない。
0872nobodyさん
2010/05/18(火) 22:03:00ID:???ただ単にディレクトリをDBで管理すればいいだけじゃないの?
ランダム文字列/3桁数値
ファイル名とディレクトリ・数値をDBで紐付け
いまいち論点が掴めない
0873nobodyさん
2010/05/19(水) 00:40:36ID:???0875nobodyさん
2010/05/19(水) 08:17:09ID:???ディレクトリあたり2までしか保存させないとする。
ファイルのデータからSHA1を求めて、求めた文字列から保存するディレクトリを決める。
(めんどくさいので文字列は短め&単純にしてます)
ファイル SHA1 保存先
aaa.jpg 123456789 -> 1/2/3/456789.dat
aab.jpg 123456890 -> 1/2/3/456890.dat
acd.jpg 123456000 -> 1/2/3/456000.dat
例えばこうなった場合、3つめのファイル acd.jpg の保存先はどうなるのかなと。
実際の得られる文字列はもっと長いから、ディレクトリ自体を深く掘ればいいでしょうが、
それだけではファイルが溢れないという約束は得られないですよね?
0876nobodyさん
2010/05/19(水) 09:13:26ID:???ファイル名を2文字ずつぐらいに区切ったディレクトリをずんどこ掘って
格納すれば絶対に大丈夫ではある。
たとえば
aaa.jpg → aa/a./jp/aaa.jpg
0877nobodyさん
2010/05/19(水) 09:15:14ID:???最終的なディレクトリに置くファイル数が二つまでなら、1ビットになるまで桁を分割すればいい。
サブディレクトリ数1万までという前提で話すが、
SHA-1で得られる文字列は16進数なので、3桁ずつ使えばサブディレクトリ数は4095個に制限できる。
fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/f.dat
最終的なファイル数を二つに制限したい場合はこうなるな。
000/000/000/000/000/000/000/000/000/000/000/000/000/0/0.dat から
fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/fff/7/1.dat まで
これでもまだ分からないようなら俺は降参するよ。
0878nobodyさん
2010/05/19(水) 09:32:00ID:???SHA-1は160bit(=20バイト)しかないんだから、100文字ぐらいのファイル名なら
いくらでも衝突させられるよ。狙ってファイル名を決めない限り現実にはそうそう
起きないけどね。
0879nobodyさん
2010/05/19(水) 10:35:56ID:???[hoge@foo ~]$ openssl sha1 -c a.txt
SHA1(a.txt)= 5f:e4:3b:0e:3e:95:d4:3c:1f:a4:8b:35:cf:39:e6:9c:62:83:42:81
[hoge@foo ~]$ openssl sha1 -c b.txt
SHA1(b.txt)= 5f:e4:3b:0e:3e:95:d4:3c:1f:a4:8b:35:cf:39:e6:9c:62:83:42:81
試しに2つくらい狙って衝突させてみてくれないか?
0880nobodyさん
2010/05/19(水) 10:48:02ID:???0881nobodyさん
2010/05/19(水) 11:04:11ID:???普通中身で求めるもんだと思うけどな
0882nobodyさん
2010/05/19(水) 11:15:49ID:???目的だよ。単にファイルをディレクトリに分散して置きたいだけなのに
中身のハッシュとるのは重過ぎる。
0883nobodyさん
2010/05/19(水) 11:41:02ID:???データに対してハッシュを取るのは確かに重いですね。
WEB サービスでなければ全然問題ないですが、、、
そう考えると「readme.txt」 をアップする人なんてたくさん出てくる可能性もあるし、
a.avi をアップしようとする人はたくさんいると思う。
みんながみんな、毎回毎回違うファイル名を使ってくれるとは思わない。
どう考えても衝突しますよね・・・
0884nobodyさん
2010/05/19(水) 12:13:20ID:???将来を見越すと、bigintが溢れる不安が残るかもねー。
0885nobodyさん
2010/05/19(水) 13:19:13ID:???0887nobodyさん
2010/05/19(水) 15:30:14ID:???頭おかしいんじゃねえの?
0888nobodyさん
2010/05/19(水) 15:41:50ID:???0889nobodyさん
2010/05/19(水) 17:41:34ID:???何等かの管理ファイルまたはdbには
現在の保存ディレクトリ
現在の保存数
を記録。
ただディレクトリが深くなりすぎず、且多くなりすぎないボーダーがわからん
ext3とかNTFSがパフォーマンス低下しないレベルの数どれぐらいなんだろうな
0890nobodyさん
2010/05/19(水) 17:57:19ID:???の「:」って何?
0892nobodyさん
2010/05/19(水) 22:01:01ID:???とりあえず0〜10000000まで衝突なし。
while( $i < 10000000 ){
$sha1 = sha1($i);
$digest{$sha1}++;
$i++;
}
で衝突有無の確認したんだけど、
たったこれだけでメモリ1GB消費するんだよね。
単体スクリプトで、他に何かいい書き方ってあるのかな?
っつーか、sha1って脆弱性突いて2^52の計算でおk!なんだよね・・・・
まだ2^24未満だよ。このままだと$i = 2^80まで衝突しないんだろうか?
0894nobodyさん
2010/05/20(木) 01:34:31ID:???何か省メモリな方法(知恵?)があったりするんかなーって思っただけだから。
0895nobodyさん
2010/05/20(木) 01:34:50ID:Y0b7Ouqxmy $data = get 'http://search.twitter.com/search.atom?q=java';
use XML::Atom::Syndication;
を使って
my $doc = XML::Atom::Syndication->instance->parse_file($data);ーー�@
として、##XPathを使用して取り出す
my $title = $doc->query("/feed/title")->text_value;のようにして、各要素を取りだそうとおもったのですが、
Can't locate object method "instance" via package "XML::Atom::Syndication"
と�@で、エラーになります。どうすれば、�@で変数に格納できるでしょうか?
0897nobodyさん
2010/05/20(木) 05:12:58ID:???>1万のファイル数制限をかけたいのに4000物ディレクトリなんて使いたくないよママンw
>>863
>1万未満に制限し、あふれたファイルは別のサブディレクトリというのを考えてます。
ここなんか矛盾してない?
0898nobodyさん
2010/05/20(木) 05:38:10ID:???YouTubeがそれやってるね
>>895
XML::Atom::Syndicationはバージョンによって
インタフェースがガラッと変わってるので、まずはバージョンを
0899nobodyさん
2010/05/20(木) 17:06:08ID:???0900nobodyさん
2010/05/20(木) 17:43:39ID:???inode的には全然余裕あるな
もう分ける必要ないね
0901nobodyさん
2010/05/20(木) 18:16:37ID:???0902nobodyさん
2010/05/20(木) 19:07:44ID:???「年月日/時/分/秒/ミリ秒/接続元IP.拡張子」でよくない?
1ミリ秒に5,000〜10,000リクエストなんて処理できないから大丈夫だよ
0903nobodyさん
2010/05/20(木) 19:10:04ID:???0904nobodyさん
2010/05/20(木) 21:48:03ID:???インターネットを見ながら見よう見真似なのですが、ファイルを上手く書き出せません。
Windowsのperl(5.8.8)です。スクリプトはUTF-8でUTF-16でファイルを作りたいのですが、
文字が■□◇みたいになって化けてしまいます(><)何処がおかしいですか?
#!/usr/bin/perl
use strict;
use utf8;
binmode STDIN, ":encoding(cp932)";
binmode STDOUT, ":encoding(cp932)";
open W, ">:encoding(utf-16)", "[TEST].txt" or die $!;
print W <<EOF;
A「もしもしB君?パソコンが動かなくなっちゃったんだけど」
B「どこのメーカーのPCだっけ?」
A「スイッチ押すとピーって言って止まっちゃう」
B「ふーん・・・で、メーカーは?」
A「何回も再起動してるんだけど、ピーって言って止まっちゃう」
B「・・・なんかエラーメッセージ出てない?」
A「まただ・・・またピーって言って止まったよ。なんで?」
B「知るかっ!」
EOF
close W;
print "書き出しました...\n";
exit;
__END__
0908nobodyさん
2010/05/20(木) 22:44:57ID:???秀丸の表示ではスクリプトは[UTF-8][CR+LF]になってます。
書き出されたファイルは↓な感じで部分的に読めます。
秀丸では[Unicode(Big-Endian)][CR]と出ています。
A「もしもしB君?パソコンが動かなくなっちゃったんだけど」
???椰???????????????A「スイッチ押すとピーって言って止まっちゃう」
???田???????????????A「何回も再起動してるんだけど、ピーって言って止まっちゃう」
??????��????????????��????A「まただ・・・またピーって言って止まったよ。なんで?」
??????????
レス数が900を超えています。1000を超えると表示できなくなるよ。