Perlコーディング初心者質問スレ Part 60
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
2009/09/03(木) 23:51:12ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/
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「まただ・・・またピーって言って止まったよ。なんで?」
??????????
0909nobodyさん
2010/05/20(木) 22:47:27ID:???0912nobodyさん
2010/05/21(金) 03:02:13ID:???5000個ごとに分けたいだけなのに1000ディレクトリもわけないといけないなんて
と嘆くのが今回の質問者
cronで定期的にファイルの数かぞえて、(たとえば)4500を超えていたら新しいディレクトリを作成して、
シンボリックリンク(たとえばcurrent)を張り替えるのがいいかもしれん
0913902
2010/05/21(金) 04:19:19ID:???SHA-1以外のなにかで、280とおりもとめられればおよそ問題ないハズなのでそっちから検討するのもあり
(誕生日問題を含む)偶然まで考慮するなら他のアルゴリズムを採用するべき
ただし、どの場合でも(衝突率が誕生日問題で崩壊してるので)ファイル名はキーになりえない。
0914902
2010/05/21(金) 04:21:28ID:???1. ベストは「要件に合わせて適切な処理をする」なのでこんな大雑把な質問にベストの解は無いので
小でも動くけど大まで見越すのであれば大がある程度基準になってしまうのはしょうがないと思う。
「小でも〜」を考慮するとあらかじめ保存先をすべて作っておくよりなければ都度作る方が効率がいいと思う。
>アクセスに依存する考えなので「1000に分けないで〜」と言う要件は解決
2.FAT16やext2世代より以前のファイルシステム使ってるようなサーバなら
そもそもそんなにトランザクションさばけないので要件を満たす。
現状の良いスペックでも要件を満たす。
将来性もある程度考えた仕組みを考える。
>勝手に作った前提
3. 株とかFXみたいにものすごいトランザクションでは無い投稿系の処理なら
msまでわけないで秒までにしておいて衝突するようなら攻撃的なアクセスとみなしてエラーにしちゃえばいい
4. ディレクトリ数は秒までなら366*24*60*60ディレクトリ(合計31,622,400)となるので
ひとつのディレクトリは1000こえないのでext2でも十分機能する
もっと古いFSを考慮するなら255こえないほうが安全なので年/月/日にすればいい
>msまで考えると1000になりえるので破綻
5. 最近のハードでも1台で運用するのであれば5000〜10000UU/秒をさばける構成は思いつかない。
将来的(5〜10年後)もよほど画期的な何かがでてこない限り要件を満たすハズ。
画期的なアイデアがでたとしても普及には時間がかかるので見直して修正する時間は十分にある。
「一台で」という勝手に作った前提がくずれて複数のフロントエンド、1つのファイルサーバとみても
フロントエンドのIPを要件にあわせて必要な位置に足せば十分機能する。
6. (プログラムの性質にもよるけど一般的に)拡張性を考えても頭の方の「年月日」を「年/月/日」にして
当年ディレクトリまたは当月ディレクトリ辺りを早いデバイスにすれば十分な速度が得られる
0915nobodyさん
2010/05/21(金) 07:37:40ID:???に対する考察ってことでOK?
0916nobodyさん
2010/05/21(金) 17:19:06ID:???0917nobodyさん
2010/05/21(金) 23:24:55ID:???280 って何じゃそりゃ?
SHA-1 の衝突(#)困難性の脆弱化は、 総当たり攻撃で
2**80 の計算で一回起ると言われていたが、現在
2**52 で起るとの報告がされてる。
「4.5035996273705e+15」の計算だ。
「 280 回の施行で衝突を起こせる」つーのはググって、
ソース元にアクセスせずに鵜呑みで書いてるだろ。
ま、一つほど大歩危カマしてる .jpg ファイルは見つけたけど。
== 余談 # の事 ==
SHA-1 の話題で「衝突」と言えば、
「異る2つの対象ファイルが同一のハッシュ値を持つ事」
を意味する。
決して「偶然同じ名前を付けられた二つのファイルの
ハッシュ値が同じ」などの意味では使わない。
んなもん一回の計算で衝突させられるに決まってる。
ネットワークデータ通信で衝突と言う言葉も使われるが、
混同しない様に注意しながら文を書くのが礼儀じゃねーの?
スレ違い失礼。
0918nobodyさん
2010/05/21(金) 23:36:08ID:???ハッシュ値が同じ」
0919902
2010/05/21(金) 23:44:50ID:???0920nobodyさん
2010/05/22(土) 00:13:35ID:???>>892氏が既に呟いてる事柄を見落したりして、
適当に調べた事を、平気で書く人間の文を真面目に
読む気にはならんよ。
0921nobodyさん
2010/05/22(土) 19:18:04ID:VfPIyjHK配布されてるCGIのゲームをホームページにつくり、そのスクリプト改造しながら勉強してます。
最初は改造方法とか書いてあるページでいろいろやってましたが。。
そろそろ基本的なことを着実にやらないとと思い、ちまちまやってます。
学生でお金もあまりないので参考書とかあまり買えないです。ネットで勉強してます。
なので恐ろしく馬鹿馬鹿しい質問するかもしれませんが許してやってください。意欲だけなら底なしです。。
ゲームの内容は普通にプレイヤーがモンスターを倒す(ダメージをあたえる)ようなもんです。
そこでプレイヤーの技に「〜〜という文字が含まれているモンスターには普通より多いダメージを与える」というものを作りたかったんです。
それで
if ($xx =~ /ABC/){ ・・・の文法を使おうとしたんです。
でもABCのところにいざモンスターの名前をいれようと全角カナを使ったらエラーです。
どうにかできないかと""で囲ったりいろいろやってたらどんどん迷いこんでしまいました。
jcodeとかあるなーなんてやってみてもjcode呼び出す文とかがぜんぜん分からなくて・・・
解決方法と解説、よろしければお願いします。m(__)m
※全部半角でいこうかと考えましたが、これのほかに解決方法がなければそうしたいなと思ってます。
0922nobodyさん
2010/05/22(土) 20:06:15ID:???0923nobodyさん
2010/05/22(土) 20:14:20ID:???とりあえず、技名は全て決め、その技名に対してユニークな (重複の無い) な ID を振る。
その技がどんなタイプなのかを決めておくといいかも。
例えば、スライム系に対して攻撃力何パーセント上乗せみたいな。
my $SPAttack = {
'00001' => {
'name' => 'アイスアロー',
'base_power' => 30,
'type' => {'magick' => 1, 'physical' => 1}, # 技が魔法、物理かどうか
'attribute' => 'ice',
'target_attribute' => {'slime' => 120, 'dragon' => -30, } # base_power に対するパーセンテージ。 存在しない属性は±0
}
}
みたいな感じはどうでしょ?
参照は $SPAttack{'00001'}->{'name'} で出来る。
敵のパラメータにどんな属性が弱いのかを持たせておけばいいのかなと。
my $monsters = {
'00001' => {
'name' => 'スライム',
'def' => 10,
'str' => 5,
'attribute' => 'slime',
'weak' => ['ice, 'fire'],
'strong' => ['poison']
}
};
などなど
とにかく、技名とか武器とか敵とかにはそれぞれで重複しない固有の ID を割り振るのが鉄則かと。 (属性も ID 振っても良いのかなとは思う)
0924nobodyさん
2010/05/22(土) 20:17:02ID:???は
'weak' => {'ice' => 1, 'fire' => 1},
にした方がいいのかな
0925921
2010/05/23(日) 12:29:26ID:IxcMBDCuIDを振るっていうのがよくわからなかったんですけども
とりあえず技の特定の属性に対してのダメージ増減とモンスターの属性設定だけしてやってみました。
やっぱ文字設定よりこっちのほうが便利ですね。最初は大変ですが。
0926nobodyさん
2010/05/24(月) 14:15:12ID:???「今のはメラゾーマではない・・・メラだ・・・」
って演出が出来ない。
id, name, power
101, メラ, 10
103, メラゾーマ, 180
104, メラ, 200 #魔王専用
ってやるのがデータを扱う定石。
0927nobodyさん
2010/05/25(火) 12:37:02ID:???空白有りにも対応するには、どうすれば良いでしょうか。
system "soft.exe $file";
0928nobodyさん
2010/05/25(火) 13:33:10ID:???0929nobodyさん
2010/05/25(火) 14:20:58ID:???0930nobodyさん
2010/05/25(火) 15:35:08ID:???Windowsなら system "soft.exe \"$file\""; か system qq(soft.exe "$file"); でどうか
他のOSは知らん
0931nobodyさん
2010/05/25(火) 17:07:23ID:???"を二重に囲うような方法が分からなくて。
教えて頂いた方法でエラーなく動作しました。
ありがとうございました。
0932nobodyさん
2010/05/25(火) 19:44:20ID:???0933nobodyさん
2010/05/25(火) 20:40:06ID:???エスケープすることが多い
0934nobodyさん
2010/05/25(火) 20:46:05ID:???print 'Hello, ', $name, " san!\n"; とかw
>>931
なるほどエスケープの方法が訊きたかったわけね
0935nobodyさん
2010/05/25(火) 22:22:42ID:???qw//とかqr//は普通に使うんだけど
0936nobodyさん
2010/05/26(水) 01:36:17ID:???なにー、マジで? ちょっと今度ベンチとって見よう。
いや、最近php絡みの案件でHTMLやJavascriptを出力する時なんか、
' と " が多重に出現するのでヒアドキュメントとかを使うんだが、
そんな時Perlのqq() が使えればなー、ってよく思う。
0937nobodyさん
2010/05/26(水) 13:16:36ID:???読みづらくなるからなぁ
>いや、最近php絡みの案件でHTMLやJavascriptを出力する時なんか、
うちの場合JavaScriptやcssは全部外部に置いてるから打ち出すのはイベントで関数を呼ぶ部分ぐらい
HTMLはヒアかSmarty
0938nobodyさん
2010/05/26(水) 18:52:28ID:???リストを頭から出力していくだけの , 区切りに比べて遅いんじゃないの?
どっちにしても相当長い文字列で何千万、何億回とか回してみてやっと差が出るぐらいだろうけど
0939nobodyさん
2010/05/26(水) 21:09:03ID:???'comma1' => sub { print 'πは ', $num, ' だもにゅ', "\r" },
'comma2' => sub { print "πは ", $num, " だもにゅ\r" },
'dot1' => sub { print 'πは ' . $num . ' だもにゅ' . "\r" },
'dot2' => sub { print "πは " . $num . " だもにゅ\r" },
'merge' => sub { print "πは $num だもにゅ\r" },
}, 'none',);
cmpthese($results);
print;
Rate dot1 dot2 comma2 merge comma1
dot1 323719/s -- -4% -6% -7% -11%
dot2 337029/s 4% -- -2% -3% -7%
comma2 342618/s 6% 2% -- -2% -5%
merge 348578/s 8% 3% 2% -- -4%
comma1 362188/s 12% 7% 6% 4% --
0940nobodyさん
2010/05/26(水) 21:09:16ID:???Rate dot1 merge dot2 comma1 comma2
dot1 1488538/s -- -13% -15% -46% -51%
merge 1720578/s 16% -- -1% -38% -44%
dot2 1743679/s 17% 1% -- -37% -43%
comma1 2770851/s 86% 61% 59% -- -10%
comma2 3061849/s 106% 78% 76% 11% --
0941nobodyさん
2010/05/26(水) 21:20:16ID:???ってことかな?
ってことで sprintf でメモリ内の処理でベンチ
(そもそも sprintf の使い方を間違えてけどwww)
" " で囲むより ' ' で囲ったほうが高速
変数展開を無視する分、それだ早い?
カンマで区切った方が遅いのは、カンマで区切る分だけ print が発生してるのでは? と思った
ちなみに perl 5.10 で計測しました
使用されたメモリ含めてのベンチって取れないのかしら?
0942nobodyさん
2010/05/26(水) 21:37:06ID:???0943nobodyさん
2010/05/26(水) 22:23:39ID:???ぶっちゃけ、環境依存。俺の環境だと以下。
% cat hoge.pl
use Getopt::Long ;
use Benchmark qw( timethese cmpthese ) ;
GetOptions( 'c=i' => \my $cnt ) ;
die if ! $cnt ;
my @arr = (q{a} x $cnt ) x 10 ;
cmpthese timethese ( undef, {
'concat' => sub {
print STDERR $arr[0] . $arr[1] . $arr[2] . $arr[3] . $arr[4] . $arr[5] . $arr[6] . $arr[7] . $arr[8] . $arr[9] . qq{\n} ;
},
'list' => sub {
print STDERR $arr[0] , $arr[1] , $arr[2] , $arr[3] , $arr[4] , $arr[5] , $arr[6] , $arr[7] , $arr[8] , $arr[9] , qq{\n} ;
},
'quote' => sub {
print STDERR qq{$arr[0]$arr[1]$arr[2]$arr[3]$arr[4]$arr[5]$arr[6]$arr[7]$arr[8]$arr[9]\n};
},
});
% perl hoge.pl -c 10 2> /dev/null
(略)
list 67414/s -- -83% -83%
concat 385602/s 472% -- -1%
quote 389251/s 477% 1% --
% perl hoge.pl -c 1000000 2> /dev/null
(略)
concat 95.0/s -- -0% -50%
quote 95.3/s 0% -- -50%
list 189/s 99% 98% --
0944nobodyさん
2010/05/26(水) 22:24:37ID:???失礼。
0945nobodyさん
2010/05/26(水) 22:49:18ID:???http://d.hatena.ne.jp/dayflower/20060603/1149311938
これのサンプルちょっといじったけど、
test_1_の方は、シングルクォート最強他は糞状態。
test_2_の方は、qrだけアウト。クォート有/無、シングル/ダブル、qqでほぼ一緒。
リテラルでの比較は危険ってことか?とにかくシングルクォートが一番安定かも。
0946945
2010/05/26(水) 23:02:10ID:???とにかく上記test_1_は、シングルクォート以外糞遅い。
環境:XP home SP3, ActivePerl-v5.10.1 built for MSWin32-x86-multi-thread
0947nobodyさん
2010/05/27(木) 12:45:24ID:4E5NJ/2Pよろしくお願いします。
Windows2000 + ActivePerl です。
CPANで初めてモジュールをインストールしました。
cpan> install Net::Twitter したところ、
各種ファイルが C:\Perl\cpan\build 以下に配置され、
Net::Twitter は C:\Perl\cpan\build\Net-Twitter-3.13003-Pu89O8\lib\Net\Twitter
にインストールされました。
当然、そのままでは
Can't locate Net/Twitter.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib
. C:\Perl\cpan\build) at test.cgi line 48.
と怒られてしまい、使えません。
普通に@INC 以下のディレクトリに配置されると思っていたのですが、
インストール時に何か指定を間違えましたでしょうか?
また、この後どうしたらよいか教えていただけると助かります。
0948nobodyさん
2010/05/27(木) 17:00:17ID:???入ってなかったら、ppm install Net::Twitterでppmからインストール。
いじょ。
0949947
2010/05/27(木) 17:56:53ID:rbfUMQUI0950nobodyさん
2010/05/31(月) 13:14:59ID:jC7AE+TDドキュメント通り
my $graph = GD::Graph::chart->new(400, 300);
と書くと、
Can't locate object method "new" via package "GD::Graph::chart" (perhaps you for
got to load "GD::Graph::chart"?) at test.cgi line 42.
と怒られます。
GD::Graph::chartは確かに入って無さそうなのでinstallしようとして
ppmとCPANで調べると、 GD::Graph::chartそのものがなさそうなのですが
どうしたら良いでしょう。
use Chart; の方がいいんでしょうか。
0951nobodyさん
2010/05/31(月) 13:28:06ID:???chart is bars, hbars, lines, points, linespoints, mixed or pie
0952nobodyさん
2010/05/31(月) 16:08:22ID:???「linesとかbarsとかのチャート機能をnewして・・・」ってつもりで書いてあるんだなw
紛らわしいドキュメントだ
>>950
こういうときは「Perl モジュール名」で検索して、ひとまず動作する実例を探すって手もあるよ
2004年の記事だけどここなんかどうかな
GD::Graphを使ったPerlグラフ生成 - SourceForge.JP Magazine : オープンソースの話題満載
ttp://sourceforge.jp/magazine/04/04/15/0110216
0954951
2010/05/31(月) 16:49:18ID:???うむ。
# CHART is bars, hbars, lines, points, linespoints, mixed or pie.
my $graph = GD::Graph::CHART->new(400, 300);
こう書いてくれたら、だいぶ分かりやすくなるのになぁ。
0955nobodyさん
2010/05/31(月) 17:08:15ID:GblyjBgz在日の40%の生活保護者所帯への援助は年間平均一所帯600万円。
年計2兆3千億円が「在日朝鮮人の生活保護費」になっている。
≪都市部の30代母親と小学生子供2人の生活保護費の内訳≫
生活費として月に『15万円』
母子家庭なら母子加算と呼ばれる追加支給が月に『2万3千円』
教育費として給食費・教材費など『7千円』
住宅費は上限が決まっているが『5万円』全額支給される。
これだけで合計月に『23万円』
国民年金全額免除。上下水道基本料金免除。NHK受信料全額免除。
医療費は保険診療内なら全額免除。通院費も認められれば全額支給。
都営交通無料乗車券。JRの定期券割引。
年金は支払い免除のうえ“掛け金無しで”年金受給が可能である。
他にも名目を変え様々な給付や免除がある。
民潭の統計では在日朝鮮人約64万人中、約46万人が『無職』という。
つまり4分の3が無職である。 在日は「特権は存在しない」というが、
民潭が自ら「46万人が無職」と公言しているのである。
無職がどのように飯を食っているか考えればそんな嘘は通じない。
http://www.koreanantijapan.comze.com/index.html
0956950
2010/06/01(火) 15:43:22ID:0JV8JwVp引き続き申し訳ないのですが、ActivePerl GD::Graphで質問です。
GD::Graphの文字がデフォルトの文字がカクカクで読みにくいので
use GD::Text;
GD::Text->font_path('C:/WINNT/Fonts');
$graph->set_title_font('arial.ttl','40');
など、arial.ttfをカレントディレクトリに移動したり色々変更してやってみてるのですが、
文字に全く変化ありません。
アドバイスいただけると助かります。m(_)m
0957nobodyさん
2010/06/01(火) 19:50:00ID:???0958950
2010/06/02(水) 13:52:42ID:VCaPMnRA$graph->set_title_font('arial.ttf,'40');
修正して、以前状況かわりませんが、
自分でももう少し頑張ってみています。
0960950
2010/06/02(水) 15:21:58ID:VCaPMnRA途中で気が付き直しました。スミマセン。
フォントをカレントディレクトリに移して
GD::Text->font_path('./');
$graph->set_title_font('ARIAL' , 16)
$graph->set_title_font('ARIAL.TTF' , 16)
や、
$graph->set_title_font('C:\WINNT\Fonts\ARIAL.TTF' , 16);
も試したのですが、上手く行かないので
$graph->set_title_font(gdGiantFont);
としたら、フォントは見づらいのですが文字が大きくなって若干マシになりました orz
0961nobodyさん
2010/06/02(水) 21:25:05ID:???libgd was not built with FreeType font support と出るんじゃないの
0962nobodyさん
2010/06/02(水) 22:32:28ID:???このような使い方はできるのでしょうか。
どうか教えてください。
0963nobodyさん
2010/06/02(水) 22:54:03ID:???http://perldoc.perl.org/functions/undef.html
0965nobodyさん
2010/06/02(水) 23:54:43ID:???0966nobodyさん
2010/06/03(木) 09:40:00ID:???0967nobodyさん
2010/06/03(木) 16:49:28ID:???http://www.tohoho-web.com/soft/wsrch.htm
英数字の全角半角を同一視する素人発想のルーチンを入れると極端に遅くなってしまいます。
★まず、入力フォームのルーチン内で、キーワード$wordに英数字が含まれているかどうか、
(ここを通る前に、入力されたキーワードの全角英数字は半角英数字に変換済です。)
if ($word =~ /[0-9A-Za-z]/) {
$wordeisu = 1; #英数字あり(検索時に全角→半角に統一)
} else {
$wordeisu = 0; #英数字なし(検索時の全角→半角をせず、スピードアップ)
}
★そして、検索ルーチン内で以下の処理を追加... $lineは、全文を一行づづ取り出したものです。
if ( $wordeisu eq "1") { #検索語に英数字が含まれる場合、すべて半角英数字に統一
&jcode'tr(\$line,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0-9A-Za-z');
#ここはeucではないので、&jcode'tr(\$line,'0-9A-Za-z', '0-9A-Za-z');だと上手くいきません。
}
これで、入力された$wordも全文の一行$lineも半角英数字に統一され、
検索結果としては正しく出来るのですが、時間が10倍以上かかってしまいます。
(もちろん、この改造をしても英数字を含まない場合は時間がかかりません。)
なにか良い方法がありますでしょうか?
0968nobodyさん
2010/06/03(木) 17:30:16ID:???日本語でもtrできるから書きなおすのお勧め。
0969nobodyさん
2010/06/03(木) 17:43:34ID:???この関数を使う以外にIPアドレスからホスト名を取得する方法ってありませんか
0970nobodyさん
2010/06/03(木) 17:46:44ID:???それを防ぐ理由は名前を引くコストを削減したいから。
IP からホスト名を返す仕組みを他に用意するか、自分でゴリゴリ書くか。
0971nobodyさん
2010/06/03(木) 17:54:09ID:???↑の関数が使えなくてもWHOIS?とかいうのを使えばどうにかなるのかな?
0972nobodyさん
2010/06/03(木) 18:20:16ID:???0973nobodyさん
2010/06/03(木) 19:10:30ID:???ただ、タイムアウトが厳しいサーバーだとやらないほうがいいのでは?
とは思う
ログの活用なら、ローカルに落として活用するとかとか
0974nobodyさん
2010/06/03(木) 19:43:21ID:???0975nobodyさん
2010/06/03(木) 21:38:54ID:???0976nobodyさん
2010/06/03(木) 22:24:04ID:???DNS 問い合わせ辺りでぐぐれば分かりますか
0977nobodyさん
2010/06/03(木) 22:40:53ID:???がいいとおもいます。
0978nobodyさん
2010/06/03(木) 22:46:09ID:???なんかUDPも通らないという制限もあったし。
0979950
2010/06/03(木) 22:57:17ID:oT6XV7cd$graph->set_title_font(略) or die $graph->error; すると、
何もエラー文字吐かずにdie してしまうので
原因が判らなかったんですよね。
Fontが対応していないということでしょうかね。
ちょっと探してみます。
ありがとうございます。
0981921
2010/06/04(金) 18:54:41ID:jTzgRcFesub send_item2 {
my($kind, $no) = @_;
$send_id = unpack 'H*', $m{guild};
if (-f "$guilddir/$send_id/depot_g.cgi") {
open my $fh, ">> $guilddir/$send_id/depot_g.cgi";
print $fh "$kind<>$no<>\n";
close $fh;
}
}
長すぎエラーなので続きます。
0982921
2010/06/04(金) 18:56:26ID:jTzgRcFemy $target = shift;
if ($m{is_full_g}) {
$mes = "$max_depot_g個までしか保管することはできません";
return; }
if ($weas[$m{wea}][1] eq $target) {
$npc_com = "$weas[$m{wea}][1]を倉庫にいれました";
&send_item2($m,1, $m{wea});
$m{wea} = 0; }
elsif ($arms[$m{arm}][1] eq $target) {
$npc_com = "$arms[$m{arm}][1]を倉庫にいれました";
&send_item2($m,2, $m{arm});
$m{arm} = 0; }
elsif ($ites[$m{ite}][1] eq $target) {
$npc_com = "$items[$m{ite}][1]を倉庫にいれました\n";
&send_item2(3, $m{ite});
$m{ite} = 0; }
if ($npc_com) {
&get_depot_cg;
return; }
$mes = qq|どれを倉庫にいれますか?<br />|;
$mes .= qq|<span onclick="text_set('@ほかん>$weas[$m{wea}][1] ')">$weas[$m{wea}][1]</span> / | if $m{wea};
$mes .= qq|<span onclick="text_set('@ほかん>$arms[$m{arm}][1] ')">$arms[$m{arm}][1]</span> / | if $m{arm};
$mes .= qq|<span onclick="text_set('@ほかん>$ites[$m{ite}][1] ')">$ites[$m{ite}][1]</span> / | if $m{ite};
$act_time = 0;
}
0983921
2010/06/04(金) 18:57:38ID:jTzgRcFe$kindはアイテムの種類(武器か防具か道具か)、$noはアイテムのナンバーです。$mは自分(プレイヤー)
アイテムを倉庫にいれるスクリプトを作ってみたのですが
どうもうまくいきません。
文法上のミスはないのですが暗転エラーが起きます。
$max_depot_gとか&get_depot_cgとかはこれより前に指定しています。
エラーの具合からsub send_item2で何か呼び出せないのかなと思い
いろいろ書き方も変えてみたのですけどもやっぱりエラーが起きます。
どこをどういう風に変えたほうがいいのでしょうか?
説明下手ですみません
0984976
2010/06/04(金) 19:10:22ID:???これでサーバを調べてみたんですがNet::DNSモジュールは使えないみたいです
逆引きについては諦めた方がいいんでしょうか
0985nobodyさん
2010/06/04(金) 19:31:58ID:???>&send_item2(3, $m{ite});
とりあえず、斜め見ただけでもここは
&send_item2($m, 3, $m{ite});
じゃねーのか?
それにしても、すっげー、気持ち悪いコード。
元コードがそれなら、悪癖が付くだけだから今すぐ止めるのをお勧めする。
勉強の為なら、1から rewrite すれば良いかも知れん。
レス数が950を超えています。1000を超えると書き込みができなくなります。