1 名前:nobodyさん mailto:sage [2011/09/09(金) 18:11:49.71 ID:???] Perlのコーディングで困ってる人のスレです。 【投稿する際の注意】 質問するときは内容をよく吟味してから投稿してください。 「コマンドの意味がわかんない」とかはマニュアル見ましょう。 回答者さんは何でも屋じゃありません。 1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。 最低でも1と3が無いと誰も答えられないよ。 良い回答は良い質問から。一緒に勉強しましょう。 お勧めサイトは >>2 以降 前スレ hibari.2ch.net/test/read.cgi/php/1295170172/
48 名前:nobodyさん mailto:sage [2011/09/19(月) 23:13:46.60 ID:???] コンパイルができないと諦めるもんじゃない。 たとえshellが使えなくともtelnet.cgiみたいなのを使って コンパイルすればいいのだ。 サーバーの環境を特定し、それに近い環境で 自宅コンパイルしたものをアップする方法もある。 諦める必要はないぞ!
49 名前:nobodyさん [2011/09/20(火) 00:23:18.16 ID:VRYqCB7t] 初心者です。2ちゃんの統計を出力するスクリプトを作りたくて、色んな場所からつぎはぎして作っていたのですが、問題がでて進めなくなりました。 板の中のスレの内容を表示しようというところまできたんですが、カウンターの i が動いていないような感じで、同じスレ(dat)が何回も表示されてしまいます。 ほかにもツッコミどころがあったら教えてください。 ソースは次のレスです。
50 名前:nobodyさん [2011/09/20(火) 00:24:28.62 ID:VRYqCB7t] 全部は入らないので関わってると思うところだけ抜きました。 use LWP::UserAgent; use HTTP::Request::Common; $url = "hidar.2ch.net/news4vip/subject.txt "; $durl = "hidari.2ch.net/news4vip/dat/ "; &getData($url); $threadlist = $response->content; while($threadlist =~ m|\n(.*?)\.dat<>|g){ push(@dat, $1); } for ($i=0; $i<=$#dat; $i++){ $url = $durl . $dat[i] . ".dat"; &getData($url); $content .= $response->content . "\n"; } print $content; sub getData { $ua = LWP::UserAgent->new; $ua->agent(''); $request = GET($_[0]); $response = $ua->request($request); }
51 名前:nobodyさん [2011/09/20(火) 00:41:47.24 ID:VRYqCB7t] ごめんなさい、>>50 です。 $url = "hidar.2ch.net/news4vip/subject.txt "; $durl = "hidari.2ch.net/news4vip/dat/ "; はそれぞれ $url = "hibari.2ch.net/news4vip/subject.txt "; $durl = "hibari.2ch.net/news4vip/dat/ "; でした。別なURLでテストしてたのをごまかしたので、URLが間違っていたせいじゃないです。 ていうかdatディレクトリがそのまま見られるみたいだからそっちから抽出したほうがよかったかな・・・
52 名前:nobodyさん mailto:sage [2011/09/20(火) 00:41:59.51 ID:???] >>50 コードはともかく、とりあえずiはミスタイプで正しくは$iだね
53 名前:nobodyさん [2011/09/20(火) 00:54:00.21 ID:VRYqCB7t] >>52 できました! ありがとうございます!!!
54 名前:nobodyさん mailto:sage [2011/09/20(火) 02:27:48.40 ID:???] use strict; use warnings; この2つは必須!
55 名前:nobodyさん [2011/09/20(火) 21:27:29.45 ID:P4zYemZJ] 他のスレからこちらに誘導していただきましたのでここでも質問させていただきます。 初心者なのですが、どなたか教えてください。 サーバーに最新のapache(onWindowsXP)をインストールし、Activeperl(最新版) によるcgiで、Win32::OLEをつかって、 サーバー側でAccess起動→マクロを走らせる→Access閉じる を行いたいのですが、上手くいきません。 同じPERLソースで、AN HTTPD だと上手くいくので、apacheの設定の問題だと思うのですが、 どこをどう設定するのかが分かりません。
56 名前:nobodyさん [2011/09/20(火) 21:29:54.54 ID:P4zYemZJ] つづきです。すみません。 ちなみにソースは # Accesオブジェクトを生成、起動 my $access = CreateObject Win32::OLE 'Access.Application' || die "Cannot create Access object\n$!\n"; my $mdb = 'C:/hoge.mdb'; $access -> {'Visible'} = 1; $access -> OpenCurrentDatabase($mdb); $access -> DoCmd -> RunMacro('hoge'); $access-> quit(); undef $access; です。
57 名前:nobodyさん mailto:sage [2011/09/20(火) 21:30:56.13 ID:???] >>55-56 >>1 perldoc.jp/docs/perl/5.10.1/perlfaq9.pod Apache〜嗜みとして〜 Part3 hibari.2ch.net/test/read.cgi/php/1043851302/
58 名前:55 [2011/09/20(火) 21:33:07.43 ID:P4zYemZJ] つづきです。最後です。すみません。 現象としては、ログにもエラーはなく、サーバー側でタスクマネージャで確認すると Accessが起動していることまでは確認できるのですが、そのまま止まってしまいます。 タスクマネージャーからAccessを強制終了すると、それ以後のperlスクリプトが処理されるようです。 どなたか同じようなご経験をお持ちの方はおられませんでしょうか。 宜しくお願い致します。
59 名前:nobodyさん mailto:sage [2011/09/20(火) 21:57:09.80 ID:???] >>56 my $access = CreateObject Win32::OLE 'Access.Application' || die "Cannot create Access object\n$!\n"; は my $access = Win32::OLE->CreateObject('Access.Application' || die "Cannot create Access object\n$!\n"); と等価なので CreateObject() が偽を返しても die しない。 perldoc.jp/docs/perl/5.14.1/perlop.pod#Operator32Precedence32and32Associativity >>58 「それ以後」がどのステップを指していて処理自体は期待通りに終わっているのかどうか不明なので 同じ症状かは分からんが、「perl Win32::OLE access」でググれば www.kaimei.org/read/internal/perl_w32 > 私が Win32::OLE から Excel へアクセスするプログラムを書いてみたところ、 > Perl スクリプトからだと問題ないのに CGI からこれを呼び出すと失敗するケースがあった。 > きちんとした原因まで把握できていないのだが、少なくともオープンする Excel ファイルのパスは > / ではなく \ で区切らないとアプリケーション・オブジェクトの取得に失敗するようである。 という話が出てくる。
60 名前:nobodyさん mailto:sage [2011/09/21(水) 12:11:47.99 ID:???] PSGI に対応した WAF では何が使い易いのでしょうか? それぞれの WAF の特色とか違いとかが分かるサイトとかあるのでしょうか? ご教示いただければと思います。
61 名前:nobodyさん mailto:sage [2011/09/21(水) 15:19:36.21 ID:???] スレッドごとにファイルがあって それをまとめるスレッドリストファイルがある場合のロックについて ファイルロック1 スレッドNファイルへの書き込み スレッドリストファイルへの書き込み ファイルロック1の解除 というようにしなければならないので 例えばスレッド1にだれかが書き込んでいる最中は他スレッドでも書き込みができない ということになる。 ということで間違いないんですか? それとスレッドを誰かが見るだけの場合でも ファイルロック1 スレッドNファイルの読み込み スレッドリストファイルの読み込み ファイルロック1の解除 としなければならないので 誰かが任意のスレッドを見ている間はどこのスレッドにも書き込めない ということでいいんでしょうか? そうするとロックかかりまくりじゃないんですか?
62 名前:nobodyさん mailto:sage [2011/09/21(水) 15:57:23.72 ID:???] それぞれのファイルに対してロックすればいいだろ
63 名前:nobodyさん mailto:sage [2011/09/21(水) 16:36:39.63 ID:???] >>62 それぞれのファイルにロックすると スレッドNファイルには書き込まれて スレッドリストファイルにロックがかかるという場合も考えられる そうするとデータの連動がずれる
64 名前:nobodyさん mailto:sage [2011/09/21(水) 16:43:12.02 ID:???] >>61 マルチスレッドプログラミング相談室 その8 hibari.2ch.net/test/read.cgi/tech/1253521167/
65 名前:nobodyさん mailto:sage [2011/09/21(水) 19:47:38.85 ID:???] >>64 スレッドってそのスレッドじゃないと思うんだw
66 名前:nobodyさん mailto:sage [2011/09/21(水) 20:45:57.38 ID:???] >>61 ロックかかりまくりとはいうけど 実際は各リクエストがケンカしないように順番に処理されていくわけだから特に問題はないだろ。
67 名前:nobodyさん mailto:sage [2011/09/21(水) 21:52:54.67 ID:???] DBMSみたいに、まとめ役のプロセスが1つだけ起動して、もちろん複数起動しないようにして、 そいつが全部取り仕切るように動かせばいいんだ。疑似マルチタスクみたいに。
68 名前:nobodyさん mailto:sage [2011/09/22(木) 00:58:45.67 ID:???] ロックには排他ロックと共有ロックがあってだな ・・という話ではない、これ?
69 名前:nobodyさん mailto:sage [2011/09/22(木) 01:17:49.95 ID:???] シェケナベイベー
70 名前:nobodyさん mailto:sage [2011/09/22(木) 01:23:50.84 ID:???] >>68 この件は全部排他 横からだけど>>61 の解答は気になる
71 名前:nobodyさん [2011/09/22(木) 12:59:33.86 ID:nJD1QeKS] 教えてください Perlで2chの特定のキーワードのスレを自動取得するCGIを改造したいのですが、 #板名「@BoadName」にある、スレッド名に「$KeyWord」を含む板の一覧を表示する。 $BoardName[0] = "大規模MMO"; $BoardName[1] = "ネトゲサロン"; $BoardName[2] = "ネットwatch"; $Keyword = "●○"; この条件のところで、大規模MMO板だけでなく、例えば ニュー速等複数の板を指定するにはどういう風にコードを書き換えれば良いでしょうか? なるべく簡単な方法を教えてください。 スクリプト aceof.s57.xrea.com/?p=sp
72 名前:nobodyさん mailto:sage [2011/09/22(木) 13:11:19.13 ID:???] >>71 正規表現を使えるようにすればいいんじゃないの。
73 名前:71 [2011/09/22(木) 13:39:16.30 ID:nJD1QeKS] >>72 …?どうやるのでしょうか? COBOLは昔習いましたが… 条件のところの $BoardName[0] = "大規模MMO"; を A(大規模MMO) AND B(ニュー速) のような条件にしたいのですが、 parlでの表記が分かりません。 コードを教えてください。
74 名前:71 [2011/09/22(木) 13:54:59.74 ID:nJD1QeKS] 例えば $BoardName[0] = "大規模MMO" AND "涙目ニュース"; ではエラーになりますよね??
75 名前:nobodyさん mailto:sage [2011/09/22(木) 14:45:57.55 ID:???] $BoardName[0] = "大規模MMO"; $BoardName[1] = "ネトゲサロン"; $BoardName[2] = "ネットwatch"; $BoardName[3] = "ニュース速報"; $BoardName[4] = "WebProg"; でいいんじゃないかな? Socket って使ったことないからわかんないけど BoardName で追ってみると www.ff.iij4u.or.jp/~ch2/bbsmenu.html ↑ここから $BoardName[n] でURL取ってるみたいだし 確認してないけど
76 名前:71 [2011/09/22(木) 15:29:52.18 ID:nJD1QeKS] >>75 すみません、基本的に大きな勘違いをしていました $BoardName[0] = "大規模MMO"; 板名 $BoardName[1] = "ネトゲサロン"; スレット名 $BoardName[2] = "ネットwatch"; ? かと思っていましたが、全部板名で、番号を増やしていけばいいだけですよね^^: で、 $Keyword = "●○"; の所を2〜3個指定したいんですが、 複数指定したい場合はどう書けば良いのでしょうか? $Keyword = "●○" "●▲" "××"; $Keyword = "●○" AND "●▲"; でしょうか? ANDの代替がぐぐっても分かりません・・・ ちなみにスレ一覧のURLは移動してましたので書き換えます。
77 名前:nobodyさん mailto:sage [2011/09/22(木) 15:44:33.61 ID:???] >>71-76 【 スクリプト改造依頼スレ 】(丸投げ) part8 hibari.2ch.net/test/read.cgi/php/1314546533/ ★三 【 スクリプト改造工房 PART 9 】 ★三 hibari.2ch.net/test/read.cgi/php/1143834740/ 金出すから改造してよvol.3 hibari.2ch.net/test/read.cgi/php/1162147035/
78 名前:71 [2011/09/22(木) 16:01:22.71 ID:nJD1QeKS] >>77 ありがとうございます。 あと、条件を複数指定する場合にどう記述すれば良いかだけ教えていただければ 十分なのですが…。 $Keyword = "●○" "●▲" "××"; $Keyword = "●○" AND "●▲"; でしょうか? それとも $Keyword = "●○","●▲"; ?
79 名前:nobodyさん mailto:sage [2011/09/22(木) 16:13:15.01 ID:???] うーん COBOLをやってたというのがよく伝わってくる思考だw $Keyword は GetData で if (/$Keyword/){ というふうに正規表現で使われてるから論理演算子は使えないと思われ $Keyword を @Keyword にしていっぱい入れられるようにして正規表現で | を使うか if じゃない関数を使うかじゃないかな〜
80 名前:nobodyさん [2011/09/22(木) 18:12:10.54 ID:5FtK50r8] 読み込んで表示だけのページ=ロックの必要はない 読み込んだデータを更新して書き込むページ= ファイルロック1 ファイル読み込みモードでオープン ファイルを配列に読み込み ファイルを閉じる データ更新 ファイル書き込みモードでオープン 更新したデータをファイルに書き込む ファイルを閉じる ファイルロック1の解除 これでいいはず 仮に読み込んで表示だけのページを ファイルロック1 ファイルを読み込みモードでオープン データを配列に入れる ファイルを閉じる ファイルロック1の解除とすると 表示するだけのページを開く間は書き込みができなくなるから そうすると書き込める隙がなかなかない
81 名前:nobodyさん [2011/09/22(木) 19:43:11.98 ID:7t8BkGQU] use strict; use warnings; my @city = ("東京", "大阪", "名古屋"); delete($city[0]); print "@city"; こんな簡単なので Use of unitialized value in join or string at *** line 6. っていう警告が出たんですが、どうしてですか? それに Use of unitialized ... というエラーしょっちゅう見かけますが、調べてみてもよくわかりませんでした。 教えてくださいm(_ _)m
82 名前:nobodyさん mailto:sage [2011/09/22(木) 19:52:11.16 ID:???] delete $city[0]; で undef になった $city[0] を print するのに使ったから とりあえずexcite翻訳から初めてみたらどうでしょうか
83 名前:nobodyさん mailto:sage [2011/09/22(木) 20:01:45.61 ID:???] >>81-82 perldoc.jp/docs/perl/5.10.0/perldiag.pod
84 名前:nobodyさん [2011/09/22(木) 20:15:05.37 ID:7t8BkGQU] >>82-83 ありがとうごさいます。 @city = grep($_ ne "", @city); で $city[0] を消しても残ってたので不便な関数だなと思いました。 undef の値を消すような操作をすればいいんですね。
85 名前:nobodyさん mailto:sage [2011/09/22(木) 20:16:16.72 ID:???] つshift
86 名前:nobodyさん mailto:sage [2011/09/22(木) 21:48:02.28 ID:???] $city[0] = "東京" を削除して詰めちゃってもいい ($city[0] = "大阪" とずれていい) なら shift @city; 要素をずらさずに $city[0] だけ消したいなら $city[0] = "";
87 名前:nobodyさん mailto:sage [2011/09/22(木) 21:53:14.20 ID:???] あれ、$city[0] = undef;とdelete($city[0]);って同じ?
88 名前:nobodyさん mailto:sage [2011/09/22(木) 22:07:16.08 ID:???] >>87 perldoc.jp/func/delete perldoc.jp/func/undef
89 名前:nobodyさん mailto:sage [2011/09/22(木) 23:43:44.90 ID:???] delete が非推奨とか・・・splice で削除しろとか書いてあるけどさ、 巨大な配列に対して splice すると、すごく遅そう・・・
90 名前:nobodyさん mailto:sage [2011/09/22(木) 23:56:59.38 ID:???] >>89 Perl処理系のソースを見ずに言うが、 そのへんはパフォーマンスがガタ落ちにならん程度にはうまいこと処理してるだろうと思う。
91 名前:nobodyさん mailto:sage [2011/09/23(金) 00:35:13.51 ID:???] ん?配列の要素に対する delete が非推奨なのは別に問題ないっしょ? delete $array[$n] は要素を削除するのではなくて、むしろ undef $array[$n] に近いんだから。
92 名前:nobodyさん mailto:sage [2011/09/23(金) 00:37:24.81 ID:???] spliceは引数多くて邪魔くさい
93 名前:nobodyさん mailto:sage [2011/09/23(金) 00:38:06.92 ID:???] >>89 誤読すんなよ。 (特殊挙動の切り詰めの事を想定してるなら別だが) splice で対処しろってのは、要素を本当に削除するケースに関してだ。 @arr = 1 .. 5 ; => @arr = qw( 1 2 5 ); delete の代りなら、 splice @arr, 2, 2, (undef) x 2 なんてしなくても @arr[2,3] = (undef)x2 ;なりの方法があろう。
94 名前:nobodyさん mailto:sage [2011/09/23(金) 01:21:24.31 ID:???] 8万の配列に長さ1の文字列を入れて、delete、undef、spliceでベンチマーク取ったけど、 spliceが一番遅かったけど大きな速度差は出なかった
95 名前:nobodyさん mailto:sage [2011/09/23(金) 01:24:44.39 ID:???] >>94 あと1つか2つ桁増やしてよろしく。
96 名前:nobodyさん mailto:sage [2011/09/23(金) 07:44:14.40 ID:???] use Benchmark qw( timethese cmpthese ) ; cmpthese timethese ( undef, { delete => sub{ my @arr = ARRAY ; delete @arr[ 99999 .. 999999] }, splice => sub{ my @arr = ARRAY ; splice @arr, 99999, 900000, (undef) x 900000 }, slice => sub{ my @arr = ARRAY ; @arr[99999 .. 999999] = (undef) x 900000 } }); __DATA__ ARRAY => (q{x}) x 1000000 Benchmark: running delete, slice, splice for at least 3 CPU seconds... delete: 3 wallclock secs ( 2.91 usr + 0.15 sys = 3.06 CPU) @ 2.94/s (n=9) slice: 4 wallclock secs ( 3.17 usr + 0.14 sys = 3.31 CPU) @ 2.72/s (n=9) splice: 3 wallclock secs ( 3.06 usr + 0.19 sys = 3.25 CPU) @ 3.08/s (n=10) Rate slice delete splice slice 2.72/s -- -8% -12% delete 2.94/s 8% -- -4% splice 3.08/s 13% 5% -- ARRAY => 1 .. 1000000 Benchmark: running delete, slice, splice for at least 3 CPU seconds... delete: 3 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 12.82/s (n=40) slice: 3 wallclock secs ( 3.02 usr + 0.01 sys = 3.03 CPU) @ 6.93/s (n=21) splice: 3 wallclock secs ( 3.03 usr + 0.07 sys = 3.10 CPU) @ 9.35/s (n=29) Rate slice splice delete slice 6.93/s -- -26% -46% splice 9.35/s 35% -- -27% delete 12.8/s 85% 37% --
97 名前:nobodyさん mailto:sage [2011/09/24(土) 11:44:49.89 ID:???] 文字コードで分からないことがあるのでご教授お願いいたします。 (utf-8 でソースを書いています) utf-8 の半角ア -> EFBDB1 utf-16 の半角ア -> FF71 utf-8 でソースを書いているのだから、print "0xEFBDB1" で半角アが出力されるだろうと思ったら、 print "0xFF71" でないと半角アが表示されませんでした。
98 名前:nobodyさん mailto:sage [2011/09/24(土) 16:12:39.72 ID:???] cryptって絶対に復号化できないんですか? パスワードをこの関数を使って暗号しようと思っていますが この関数を使う上で欠点や注意点がありましたら教えてもらえませんか?
99 名前:nobodyさん mailto:sage [2011/09/24(土) 16:30:15.23 ID:???] >>98 >>1 perldoc.jp/func/crypt
100 名前:nobodyさん mailto:sage [2011/09/24(土) 16:48:02.74 ID:???] >>97 半角のイなら、0xFF72です。
101 名前:nobodyさん mailto:sage [2011/09/24(土) 18:00:52.20 ID:???] >>97 0xは数値に対してなので、\xだと思いますが、\xは2桁までしか拾わないので、 3桁以上の場合は、{ }を使って\x{123}とする必要があります。 2桁の場合は(\x{00B1}としても2桁と解釈されます)、その値そのもののバイナリ 文字列となります。 print "\xEF\xBD\xB1"; これ↑は、UTF-8として解釈すれば「ア」を意味するバイナリ文字列です。 ただし、Perlがこれを文字列処理するときはISO 8859-1という文字コードの3文字 として扱います。 3桁以上の場合は、その値のUnicodeコードポイント(U+FF71)のテキスト文字列となります。 ( Perlは、"\x{FF71}"を「ア」という1文字として扱う) バイナリ文字列(=バイト文字列)とは、バイト単位で処理される文字列のことです。 テキスト文字列とは、文字単位で処理される文字列のことです。
102 名前:nobodyさん mailto:sage [2011/09/24(土) 18:01:21.98 ID:???] >>99 リンクありがとう〜 とりあえずこれ使ってみることにします
103 名前:nobodyさん mailto:sage [2011/09/24(土) 19:43:27.75 ID:???] >>101 ありがとうございます!
104 名前:nobodyさん mailto:sage [2011/09/26(月) 12:35:58.38 ID:???] トリップを生成する仕組みなんですが、 if (length $handle_pass >= 12) { my $mark = substr($handle_pass, 0, 1); if ($mark eq '#' || $mark eq '$') { if ($handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|) { $GB->{TRIPSTRING} = substr(crypt(pack('H*', $1), "$2.."), -10); } 文字列12バイト以上で、先頭が#または$の場合、 $handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|を行なって cryptによって生成していると思います。 しかし、$GB->{TRIPSTRING}や$1や$2をprintすると何も表示されません。 $handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|では何を行なっているのですか? 教えてください。
105 名前:nobodyさん mailto:sage [2011/09/26(月) 12:55:07.21 ID:???] >>104 関係ないけど、これ $ から始まる場合何もしてないよね
106 名前: ◆??? mailto:sage [2011/09/26(月) 13:01:10.88 ID:???] >>104 ##0123456789abcdefxx 形式のトリップキーかどうかのチェックだろ >>105 >>104 は書いてないけど実際はelseがある 2chでは今のところ単に予約としてとってあるだけらしいから???になるだけだけど
107 名前:104 mailto:sage [2011/09/26(月) 14:03:37.14 ID:???] >>105-106 ご回答ありがとうございます。 もう一度正規表現を調べますので、 その後、質問させてください。
108 名前:104 mailto:sage [2011/09/26(月) 17:00:08.24 ID:???] 先頭が#で始まり16進数文字が16個連続し、 末尾は./0-9A-Za-zのいずれかが0個以上2個以下連続する。 ですよね? #0123456789abcdefxxは真 #0123456789abcdefxxxは偽 #0123456789abcdefは真 #0123456789abcdefあ が偽なのは、なぜでしょうか? また、[[:xdigit:]]の[]が二重でくくられている意味を教えてください。
109 名前:104 mailto:sage [2011/09/26(月) 17:01:58.51 ID:???] すみません、書きこんで気づきましたが、 #0123456789abcdefも偽ではないのか?と思います。
110 名前:nobodyさん mailto:sage [2011/09/26(月) 18:06:25.07 ID:???] あ は [a-zA-Z0-9] かどうか f の後ろに続く判断が ? なのか + なのかで意味合いが変わってくるかと。 トリップキーの規格をもっかい調べてみればよいかと。
111 名前:nobodyさん mailto:sage [2011/09/27(火) 00:54:20.16 ID:???] ファイルのロックはmkdirなどでロック用ディレクトリ を作る方法は良く見かけますがディレクトリではなく openでロック用ファイルを作るというのは問題があるんでしょうか?
112 名前:nobodyさん mailto:sage [2011/09/27(火) 01:02:44.10 ID:???] rename とか mkdir はシステムコールを使ってるから、open より割り込まれる余地が少ない。 とかじゃなかったっけ?
113 名前:nobodyさん mailto:sage [2011/09/27(火) 01:31:29.84 ID:???] >>111 www.din.or.jp/~ohzaki/perl.htm#File_Lock 今時 flock を使えない環境に出くわす事も稀だがな。 perldoc.perl.org/perlport.html#flock
114 名前:nobodyさん mailto:sage [2011/09/27(火) 02:07:22.29 ID:???] モジュールを作ってて、そのモジュールの中では use utf8 とか、open(my $in, '<:utf8', '〜') とかしてます。 しかし use utf8 してないスクリプトから呼ばれた時には、これだと文字化けが起きてしまいます。 そのため use utf8 されていない場合にはフラグを落として返したいのですが、 モジュールを呼んだスクリプトで use utf8 されてるかどうか調べる方法はあるのでしょうか? モジュールが特定の文字コードに依存すること自体が駄目だとは分かっては居るのですが・・・
115 名前:nobodyさん mailto:sage [2011/09/27(火) 04:57:52.69 ID:???] >>112 余地が少ないんじゃなくて余地が無い、 つまり処理がアトミックでないとだめなんだよ。 「余地が少ない」んじゃ意味ないの。
116 名前:nobodyさん mailto:sage [2011/09/27(火) 11:02:16.14 ID:???] flock(XX, 2) でデッドロックが発生した場合はどうなるんでしょうか? あと、待ってる間は自動でsleepしてくれるんでしょうか? flock(XX, 6) で自分で実装するのとどちらが良いのか迷ってます。
117 名前:nobodyさん mailto:sage [2011/09/27(火) 19:02:14.19 ID:???] すいません。プログラムを定刻になると自動で実行するようにしたいんですが、できますか? レンタルサーバに置きます。 全体を無限ループをしてsleep()で休むというのを考えたのですが、無限ループは一番やってはいけないらしいですね。 あと検索するとすぐJavaScriptで自動更新する方法が出てきますが、 この方法だと時限以外にもCGIにアクセスされたときに実行してしまうと思います。 JavaScriptだけに実行させたいときはパーミッションをどう設定すればいいですか?
118 名前:nobodyさん mailto:sage [2011/09/27(火) 19:46:39.67 ID:???] >>116 >明白ではないものの、伝統的な flock の動作としては、ロックが得られるまで 無限に待ち続けるものと、単に勧告的に ロックするものの二つがあります。 >>117 cronのことを聞いてる?
119 名前:nobodyさん mailto:sage [2011/09/27(火) 21:07:32.00 ID:???] >>118 その説明を読んで具体的にどうなるのかが分からなかった 伝統的とか無限とか ・複数のプロセスが待ち状態になった場合に、次にロックを得られる順番は? ・デッドロックかかったらプロセスはどうなるのか ・待ってる間の負荷は この辺りが気になる。
120 名前:nobodyさん mailto:sage [2011/09/27(火) 22:48:37.67 ID:???] ・複数のプロセスが待ち状態になった場合に、次にロックを得られる順番は? システムにしか分かりません ・デッドロックかかったらプロセスはどうなるのか flock を待つオプションで呼び、他のプロセスが死ねばロックは外れるので先に進めますが、 mod_perlなどではプロセスは死なないのでflockは掛かったままになります。 なので、flockを呼ぶときは待たないようにしましょう
121 名前:nobodyさん mailto:sage [2011/09/27(火) 23:25:00.27 ID:???] flock呼んだ順番になるのか、ランダムになるのかの2択くらいかと思ったんですが、後者って認識でいいです? 無限に待ち続けるとあるんですが、待たないようにする方法もあるんでしょうか? あと、大量のプロセスが待ち状態になった場合の負荷も気になります。 大人しく待ってるんでしょうか?
122 名前:nobodyさん mailto:sage [2011/09/27(火) 23:54:57.99 ID:???] unlock時に起き上がったプロセスがロックを取れる LOCK_NBだ、ドキュメントぐらい読め sleep以外に何をするのか、それ以前にロック待ちが大量にある時点でどうか
123 名前:nobodyさん mailto:sage [2011/09/28(水) 01:15:39.74 ID:???] >>117 >>118 の書いているとおり通常はcronを使う。と思う。 > あと検索するとすぐJavaScriptで自動更新する方法が出てきますが、 「プログラムを定刻になると自動で実行」させるのにJavaScriptをどうやって使うの? 意味がわからん。 > JavaScriptだけに実行させたいときはパーミッションをどう設定すればいいですか? さらに意味がわからん。
124 名前:nobodyさん mailto:sage [2011/09/28(水) 01:29:17.95 ID:???] >>123 俺は最初、サーバサイドでjavascriptを動かすnode.jsのこと言ってるのかと思った。 cronを扱うためのapiもあるみたいだし。 perl関係ないけど。
125 名前:nobodyさん mailto:sage [2011/09/28(水) 02:00:23.29 ID:???] >>122 ありがとうございました。 LOCK_NB使わずに待たない方法があると勘違いしてました。 素直に自分で実装します。
126 名前:nobodyさん mailto:sage [2011/09/28(水) 13:39:10.69 ID:???] ファイルの読み書きでトランザクションを実現するモジュールを apache が標準で持ってくれるとありがたい
127 名前:nobodyさん mailto:sage [2011/09/28(水) 17:26:59.68 ID:???] ファイルの読み込みは@lines = <IN>で一括して配列に入れていますが while<IN>で1行ずつ読み込む方がいいんですか? 配列を引数にしたり戻り値にしたりする場合が多いから どうしても一括読み込みが多くなってしまいますが 一括読み込みだとそんなにメモリの負担になりますか? ていうか<IN>自体にもファイル全部のデータが格納されているんですよね?
128 名前:nobodyさん mailto:sage [2011/09/28(水) 18:31:25.70 ID:???] GB単位でファイルを処理する人間だと、while で回すなりの工夫は必要だけど、 今のご時世だったら、殆どの人は気にする事は無いでしょ。 >ていうか<IN>自体にもファイル全部のデータが格納されているんですよね? そんなスーパーな挙動を取られたら、5GBファイルを 2GB メモリの PC で解析 出来ないじゃないですかっ
129 名前:nobodyさん mailto:sage [2011/09/28(水) 21:17:17.61 ID:???] 一行づつ読み込んだら遅くなる。
130 名前:nobodyさん mailto:sage [2011/09/28(水) 22:32:03.45 ID:???] % perl -le '$s = q{x} x 1000000 ; $s =~ s/(.{1,50})/$1\n/g; print $s ' > test.txt % cat hoge.pl use Benchmark qw( timethese cmpthese ) ; cmpthese timethese ( undef, { arr => sub { open my $fh, q{<}, q{test.txt} ; my @arr = <$fh> ; close $fh ; @arr }, whi => sub { open my $fh, q{<}, q{test.txt} ; my @arr ; while (<$fh>){ push @arr, $_ } close $fh ; @arr }, aho => sub { open my $fh, q{<}, q{test.txt} ; my @arr ; for (<$fh>){ push @arr, $_ } close $fh ; @arr }, }); % perl hoge.pl Benchmark: running aho, arr, whi for at least 3 CPU seconds... aho: 3 wallclock secs ( 2.76 usr + 0.35 sys = 3.11 CPU) @ 48.87/s (n=152) arr: 3 wallclock secs ( 2.72 usr + 0.41 sys = 3.13 CPU) @ 56.55/s (n=177) whi: 3 wallclock secs ( 2.85 usr + 0.30 sys = 3.15 CPU) @ 70.79/s (n=223) Rate aho arr whi aho 48.9/s -- -14% -31% arr 56.5/s 16% -- -20% whi 70.8/s 45% 25% --
131 名前:nobodyさん mailto:sage [2011/09/28(水) 22:55:36.32 ID:???] >>130 コメントは大事だよー whileが一番速いのか 理由は何なんだろうな
132 名前:nobodyさん mailto:sage [2011/09/28(水) 23:04:50.68 ID:???] whileでファイルの2行目から読み込むのってどうやるんですか?
133 名前:nobodyさん mailto:sage [2011/09/29(木) 00:01:53.09 ID:???] <FH>; while (<FH>) { }
134 名前:nobodyさん mailto:sage [2011/09/29(木) 00:44:49.60 ID:???] >>131 ファイルがメモリにキャッシュされたから。 最後に書いたほうが早くなる。
135 名前:nobodyさん mailto:sage [2011/09/29(木) 00:45:39.00 ID:???] 訂正 最後に処理されたもののほうが早くなる。
136 名前:nobodyさん mailto:sage [2011/09/29(木) 00:54:10.24 ID:???] 最後も何も2回目以降同じじゃね 仮にキャッシュされてるんなら
137 名前:nobodyさん mailto:sage [2011/09/29(木) 01:02:01.08 ID:???] >>135 適当に順番入れ替えてやってみ。 結果はほとんど変わらないから。 ていうかよく見たら一番最後に処理したahoが一番遅いじゃねーか。
138 名前:nobodyさん mailto:sage [2011/09/29(木) 01:09:34.61 ID:???] やっぱり一度に全部読んだほうが2倍以上速かったな。 all => sub { open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')); close $fh ; return split("\n", $buf);},
139 名前:nobodyさん mailto:sage [2011/09/29(木) 01:35:54.32 ID:???] 一度に全部読んだほうが処理がしやすい場合が多い ファイルの下に行くほど新しい書き込みの場合 最新のn件を表示する場合はwhileで1行ずつは難しいな @linesに全部読み込んで@linesの配列の後ろからn番までを切り取って表示すれば簡単だな
140 名前:nobodyさん mailto:sage [2011/09/29(木) 01:40:46.41 ID:???] 結局のところ「用途による」だろ
141 名前:nobodyさん mailto:sage [2011/09/29(木) 01:53:22.20 ID:???] >>139 ファイルの最後の方から読んでいって 改行の数を数えたほうが早いよ。
142 名前:nobodyさん mailto:sage [2011/09/29(木) 02:22:14.02 ID:???] ファイルの最後の行から上の行に向かって1行ずつ取り出せるの? ファイル読み込み位置操作できるのseekしか見つからなかったが これ行単位じゃなく後ろからのバイト数なんだよな
143 名前:nobodyさん mailto:sage [2011/09/29(木) 02:39:16.38 ID:???] ゆとりか。作れよ。
144 名前:nobodyさん mailto:sage [2011/09/29(木) 04:40:11.37 ID:???] >>142 www.din.or.jp/~ohzaki/perl.htm#File_Reverse
145 名前:nobodyさん mailto:sage [2011/09/29(木) 06:43:00.87 ID:???] >>137 一応書いとくが、Benchmarkのサブルーチン実行は記載順じゃないぞ。 勝手にソートされる。 もちろん、135の意見に同意するわけでは無いが。 ahoが遅いのは、明白に(<$fh>)の時点でメモリに確保(無名配列への代入と同等) されてて、その後に@arrにpushしてるから、遅いの当たり前。 サブルーチンの名前が「アホ」な時点でネタだと分る。
146 名前:nobodyさん mailto:sage [2011/09/29(木) 07:40:54.50 ID:???] AWKのAの人ディスってんの……
147 名前:nobodyさん mailto:sage [2011/09/29(木) 08:22:35.67 ID:???] >>130 以下は自分の推測。 正しいかはわからない。 @arr = <$fh>;は、まずreadline関数内で、全行のリストが作られ、それが@arrにコピー されるので「@arr+全行リスト」のメモリを使う。 while (<$fh>){ push @arr, $_ }は、1行だけが$_に入るので、「@arr+1行分」のメモリ しか使っていない。 メモリ使用量の差が速度差に出たと。
148 名前:nobodyさん mailto:sage [2011/09/29(木) 11:31:16.87 ID:???] >>130 7.8MB のテキストファイルでぶん回してみた Benchmark: timing 10000 iterations of aho, arr, whi... aho: 1337 wallclock secs (1157.39 usr + 103.11 sys = 1260.50 CPU) @ 7.93/s (n=10000) arr: 1284 wallclock secs (1118.88 usr + 102.05 sys = 1220.92 CPU) @ 8.19/s (n=10000) whi: 921 wallclock secs (768.06 usr + 104.30 sys = 872.36 CPU) @ 11.46/s (n=10000) Rate aho arr whi aho 7.93/s -- -3% -31% arr 8.19/s 3% -- -29% whi 11.5/s 44% 40% --