68user's page 掲示板

Prev< No. 2361〜2400> Next  [最新発言に戻る] [過去ログ一覧]
No. 2361 # 68user 2001/12/11 (火) 15:34:40
>>2360 ふくし
> pcmciacs.3.1.30 以下のディレクトリ構造がソースツリーでは。
Linux も pcmcia も全然知りませんけど、
    http://www.linux.or.jp/JF/JFdocs/PCMCIA-HOWTO-2.html
などを見るに、カーネルソースを展開して、そこに pcmciacs*.tar.gz を
展開して、make config && make all && make install してモジュールを
インストールすべきなのに、カーネルソースツリーが存在していないので
エラーになってるんじゃないでしょうか。

>>2359 kanji
> configエラーが出ます。
具体的にどういうエラーが出るかをちゃんと書けば、何が問題か
わかる人にはわかるでしょう。

# 僕は残念ながら わからない人です。

No. 2362 # kanji 2001/12/11 (火) 15:48:57
>>2360 ふくし
>>2361 68user
すみません、わかりました。
ありがとうございました。

カーネルソースの展開が抜けているのでしょう。
早速やってみます。

No. 2363 # inaba 2001/12/12 (水) 15:01:21
初めまして、inabaと申します。

>>2359 kanji
3com だったら、ディフォルトで認識してくれると思いますが…。
ただ、network と pcmcia の起動順が逆なので失敗しているのかも。
# cd /etc/init.d
# ./pcmcia restart
# ./network restart
と入力してみてください。
# ifconfig
で、eth0 が認識されていませんか?
見当違いだったらすみません。

No. 2364 # わたなべ [E-mail] 2001/12/12 (水) 19:16:45
はじめまして、渡邊と申します。
ネットワークプログラムに興味があり、POP3 クライアントを作ってみよう(2)の POP3 クライアントサンプルを動作させてみました。
お聞きしたいのは、このままでちゃんとメールが表示されるプロバイダーと表示されないプロバイダーがあり、ニフティでは途中で固まってしまいます。認証までは動いているようで、LISTので止まっているようです。
どうすれば、いいか教えていただけませんか?

No. 2365 # 68user 2001/12/12 (水) 22:11:13
>>2364 わたなべ
> LISTので止まっているようです。
http://x68000.startshop.co.jp/~68user/net/sample/pop3-client.pl ですね?

telnet で pop3 サーバと話してみるとどうなりますか?

LIST 送信の後の
    while (<SOCKET>){
        m/^\.\r\n$/ && last;

    while (<SOCKET>){
        print "[$_]";
        m/^\.\r\n$/ && last;
として実行すると何が表示されますか?

Windows マシンで動かしていますか? (環境はちゃんと書きましょう)
もしそうなら
    socket(SOCKET,PF_INET,SOCK_STREAM,0)|| die ...
の後に
    binmode(SOCKET);
という行を追加するとどうなりますか?

No. 2366 # kuw 2001/12/12 (水) 23:55:57
はじめまして。いつも勉強させてもらっています。

>>2364 わたなべ
> LISTので止まっているようです。
私も、pop3 クライアントを自作したときに、同じことを経験しました。
そのときは、pop3 サーバが NT で、
> +OK IMS POP3 Server 0.87 Ready
というものだったのですが、
LIST の返事に、"." のみの行がなかったのです。
> +OK 0 message (0 octets)
> 0 messages (0 octets)
こんな感じでした。

No. 2367 # kuw 2001/12/13 (木) 00:01:49
>>2366 kuw
>LIST の返事に、"." のみの行がなかったのです。
補足です。
その時は、LIST のかわりに STAT を使うようにして回避しました。

No. 2368 # わなたべ 2001/12/13 (木) 00:13:29
>>2365わたなべ
早速ありがとうございます。
試してみましたが、状況は変わりません。
環境は、Windows2000のクライアントで、サーバーはFreeBSDです。

telnet pop.nifty.com 110
USER ******
PASS ******
LIST
とやる分には、NIFTYでもちゃんとリストされます。

print "[$_]";を追加してみると

[+OK <**********>
][+OK
][+OK
と表示されます。
print $_;
にしてみると、
+OK <**********>
+OK
+OK
で止まってしまいます。
いづれも、Ctrl+Cで終了しないと終わりません。

ところがiij4uでは、
+OK IIJ ************
+OK ************
+OK ************
+OK 5 messages****
と言う感じで正常に動いています。

尚、binmode(SOCKET);を追加してみても状況に変化はありません。

iij4uとNIFTYの差は、+OKの後にiij4uの方は文字があるのですが、NIFTYは何も無いことぐらいです。
att.ne.jpでも動きませんでした。
もちろんtelnetで直接タイプすればリストも問題ありません。
よろしくお願いします。

No. 2369 # わなたべ 2001/12/13 (木) 00:22:04
>>2364わたなべ
kuwさんありがとうございます。
STATを使う件、本日世が明けたら試してみます。
ありがとうございます。

No. 2370 # 68user 2001/12/13 (木) 01:07:12
>>2366 kuw
> LIST の返事に、"." のみの行がなかったのです。
>> +OK 0 message (0 octets)
>> 0 messages (0 octets)
なるほど。もう少し詳しくお聞かせ下さい。

それは mail box にメールがたまっていなかったときのみ . が
ないのでしょうか? あるいはメールがたまっていても . がない
のでしょうか?

また、その POP3 サーバアプリケーションの名前は
何かわかりますか?

ちなみに . をもってレスポンスの終了と見なしている根拠は
http://ring.ip-kyoto.ad.jp/pub/doc/RFC/rfc1939.txt
> When all lines of the response have been sent, a
> final line is sent, consisting of a termination octet (decimal code
> 046, ".") and a CRLF pair.

> Examples:
> C: LIST
> S: +OK 2 messages (320 octets)
> S: 1 120
> S: 2 200
> S: .

です。

No. 2371 # kuw 2001/12/13 (木) 06:44:11
>>2370 68user
>それは mail box にメールがたまっていなかったときのみ . が
>ないのでしょうか? あるいはメールがたまっていても . がない
>のでしょうか?
メールがたまっていなかったときのみです。
メールがたまっているときは、
> +OK 1 messages (1146 octets)
> 1 1146
> .
となります。

>また、その POP3 サーバアプリケーションの名前は
>何かわかりますか?
EMWAC の IMS POP3 Server 0.87 です。
5, 6 年前に NT にインストールして以来、そのまま使っているので、
かなり古いものだと思います。
# この数年、NT を全くいじっていないので、最近の事情はわかりませんが・・・

>ちなみに . をもってレスポンスの終了と見なしている
もちろん、これは正しい仕様だと思いますし、
同じ仕様の MUA やメールチェッカーも多いと思います。

No. 2372 # わたなべ 2001/12/13 (木) 09:57:20
>>2364わたなべ
おはようございます。
昨日の続きですが、下記のようシンプルにしてテストしてみましたが、状況に変化はありませんでした。
よろしく御願いします。

---------------------------------------------
print SOCKET "USER $username\r\n";
print SOCKET "PASS $passwd\r\n";

print SOCKET "LIST\r\n";

while (<SOCKET>){
    m/^\.\r\n$/ && last;
        print $_;
}
print SOCKET "QUIT\r\n";
---------------------------------------------

上記の結果
■AT&Tに接続した場合
+OK <283**.10082***86@mail.att.ne.jp>
+OK
+OK
(ここで止まってしまうので Ctrl+C)
^C
%

■iij4uに接続した場合
+OK IIJ POP3 Server (**.iij4u.or.jp) starting. <128**.1008***94@**.iij4u.or.jp>
+OK Password required: ******@**.iij4u.or.jp
+OK ******@**.iij4u.or.jp has 2 messages (2182 octets)
+OK 2 messages (2182 octets)
%

-------------------------------------------------------------------------------
■telnetでAT&Tに接続した場合
telnet ***.att.ne.jp 110
+OK <283**.10082***86@mail.att.ne.jp>
USER ********
+OK
PASS ********
+OK
LIST
+OK
1 958
2 960
.
QUIT
+OK

■telnetでiij4uに接続した場合
telnet **.iij4u.or.jp 110
+OK IIJ POP3 Server (**.iij4u.or.jp) starting. <128**.1008***94@**.iij4u.or.jp>
USER ********
+OK Password required: ******@**.iij4u.or.jp
PASS ********
+OK ******@**.iij4u.or.jp has 2 messages (2182 octets)
LIST
+OK 2 messages (2182 octets)
1 1090
2 1092
.
QUIT
+OK IIJ POP3 Server (w/mdir) (m-**.iij4u.or.jp) signing off

No. 2373 # 68user 2001/12/13 (木) 13:02:37
>>2371 kuw
ありがとうございます。ということは、その POP3 サーバのバグと
判断してもよいようですね。

>>2372 わたなべ
では、残るは改行コードくらいですかね。

    select(SOCKET); $|=1; select(STDOUT);
    $|=1; # 標準出力のバッファリングも OFF
    print SOCKET "USER $username\r\n";
    print SOCKET "PASS $passwd\r\n";
    print SOCKET "LIST\r\n";
    while (sysread(SOCKET, $_, 1) ){ # read(2) を使って読む。
            printf("$_ [%02X] ", unpack('c',$_));
    }
    print SOCKET "QUIT\r\n";

を試して下さい。

No. 2374 # わたなべ 2001/12/13 (木) 15:01:43
>>2373わたなべ
試してみました。

+[2B] O [4F] K [20] ・・・・・・ [3E]
[0D] + [2B] 0 [4F] K [4B] [20]
[0D] + [2B] 0 [4F] K [4B] [20]
[OA]

で止まります。
NIFTYもAT&Tもこうした現象なのですが解決方法は無いものでしょうか?

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 2375 # 68user 2001/12/13 (木) 15:27:01
>>2374 わたなべ
    接続時のリプライは +OK....\r
    USER に対するリプライは +OK \r
    PASS に対するリプライは +OK \n
という変なサーバであることがわかります。
# このサーバは RFC1939 に準拠していないと思います。このサーバ
# アプリの名前を教えていただけますか。

で、\r や \n だけでも行末と見なすように、
    m/^\.\r\n$/ && last;

    m/^\.(\r\n|\r|\n)$/ && last;
として下さい (*A)。

で、これだけの対処では多分挙動は変わらないでしょう。

> [OA] で止まります。
ということは、相手が LIST に対するリプライをしていない、
つまり「LIST を受け取ったと解釈していない」ということなので、
やはり SOCKET がテキストモードになっており、
    print SOCKET "LIST\r\n";

    print SOCKET "LIST\r\r\n";
となって送信されているのではないかと推測します。

*A の変更を行った上で、再度 binmode(SOCKET) を挿入してみて下さい。

# Windows には詳しくないのですが、これでよいんでしたっけ?>どなたか

No. 2376 # わたなべ 2001/12/13 (木) 16:54:32
>>2375わたなべ
試してみましたが、状況は変わりませんでした。
AT&TにPOP3のアプリケーションを確認したところ、qmailだそうです。
サーバーのOSは、教えてくれませんでした。
よろしく御願いします。

No. 2377 # ARGUN 2001/12/13 (木) 21:04:50
初めまして。初めてなのに、こんな事を書くのはあつかましいとも思うんですけど、どうにもならないのでフ゜ロク゛ラムを教えて欲しいんです。
実は、課題がでたんですけど分からないので。
内容ですが
Cのフ゜ロク゛ラムファイル(sourse.c)の英小文字をすべて英大文字に変換し、他のファイル(trans.c)に書き出す。     と言う物です。   それで、
#include <stdio.h>
#include <stdlib.h>

main(int argc, chr*argv[])
{
int i;
FILE *fin;
char ss[256];

if(fin=fopen("sourse","r") == NULL){
printf("オーフ゜ン出来ない.\n");
exit(1);
}
char(

までは出来ました。それから先が全くわかりませんので、宜しくお願いします!

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 2378 # kuw 2001/12/14 (金) 00:06:24
>>2373 68user
>その POP3 サーバのバグ
その通りです。
しかも、今回の件には、まるで関係ない話みたいですね。失礼しました。

>>2377 ARGUN
>Cのフ゜ロク゛ラムファイル(sourse.c)の英小文字をすべて英大文字に変換し、他のファイル(trans.c)に書き出す。
ならば、
cat sourse.c | tr a-z A-Z > trans.c
で良いのでは?

No. 2379 # 68user 2001/12/14 (金) 11:44:19
>>2376 わたなべ
> 試してみましたが、状況は変わりませんでした。
ほほぅ、そうですか。それは困りましたね。

> qmailだそうです。
qmail 付属の qmail-pop3d かな? djb モノがそんな挙動を
するのはあまり考えにくいですが、telnet ではできている
のですから、怪しいのは改行コードです。

現在は sysread で読んでいるのですから、受け取ったデータは
即座に表示されるはずです。ということは、何も表示されない=
送ったリクエストが正しく解釈されていないということなので、
    print SOCKET "LIST\r\n";

    print SOCKET "LIST\n";
にしてみたり、いろいろ試してみて下さい。

どうにもならなかったら、試したスクリプトを見せて下さい。

>>2377 ARGUN
> Cのフ゜ロク゛ラムファイル(sourse.c)の英小文字をすべて英大文字に変換し、
> 他のファイル(trans.c)に書き出す。
まずは、sourse.c の内容を trans.c にコピーするところから
やってみては。

No. 2380 # /tk 2001/12/14 (金) 14:50:00
>>2364 わたなべ
> LISTので止まっているようです。
うちのサーバが qmail + vpopmail だったのでテストしてみたところ
同様の現象が再現しました。

うちの場合
      print SOCKET "LIST\r\n";
の直前の行に
      sleep 1;
を挿入したらうまく動きましたので
試してみてはいかかでしょう。

No. 2381 # わたなべ 2001/12/14 (金) 20:50:32
>>2380わたなべ
/tkさんのアドバイスどおりに
sleep 1;
を入れたら無事に動きました。
本当に有り難うございました。
大変お騒がせしましたが、これで落ち着いて眠れます。
今後ともよろしく御願いします。

No. 2382 # ARGUN 2001/12/16 (日) 22:07:44
68userさん。Kuwさん。有難うございます。
でも、長く入院してたせいで冗談抜きで全く分からないんです。
コピーってどうやるんですか?
甘えだとは思うのですが、迷惑でしょうがプログラム載せて貰いたいのですがおねがいします。聞けるような仲間がいないので。

No. 2383 # kuw 2001/12/17 (月) 04:35:58
>>2382 ARGUN
> プログラム載せて貰いたい
--- a2A.c ここから ---
main () {
        system("tr a-z A-Z < sourse.c > trans.c");
}
--- a2A.c ここまで ---
a2A.c をコンパイルしてできた実行ファイルを、
sourse.c と同じディレクトリにコピーして実行してみてください。
運が良ければ、お望みの trans.c が作成されます。

とりあえず、課題はこれで良いとして、本気でプログラムの勉強を
したいのならば、68user さんのアドバイスを参考にがんばってください。

あとは、
>>2230 68user
> - 課題だからといって、問題をそのまま掲示板に書き込んでも反感を買うだけ、
>  ということを書き込む前に推測できるようになる。
> - 仮に課題だとしても、そうは見えないようにうまくカムフラージュ
>  できるような文章力を身につける。努力しているという姿勢を
>  アピールする。
という金言も参考にされると良いでしょう。

No. 2384 # 68user 2001/12/17 (月) 07:40:47
>>2382 ARGUN
google で「C言語 ファイル コピー」などと検索すれば、
サンプルプログラムなんてたくさん見付かります。
「C言語 小文字」だってたくさん見付かります。

http://pc.2ch.net/test/read.cgi/tech/1007902384/l50
で質問するのもよいでしょう。

ここで回答をもらえることを期待するよりもそっちの方が早いです。

>>2380 /tk
> sleep 1;
うーむ、改行コードは大外しでしたか。ということはその POP サーバは
リクエストを 1行だけ読んでいるのではなく、select か何かでバッファに
たまっているリクエストを全て解釈しようとしていた、ということですかね?

本来 USER 送って +OK を受け取って、PASS 送って +OK を受け取って、その後
LIST を送らねばならないところを、一気に USER、PASS、LIST を送って、その後
リプライを受け取るという手抜きをしていたからまずかった…と。

No. 2385 # hiro 2001/12/18 (火) 13:04:35
こんにちは。
環境は
OSはSolaris 2.6、printerはEPSON LP8200PS2(PSプリンタ)です。

質問は、
lpコマンドで印刷用紙のサイズを指定したいのです。
HELPなどを見てもそれらしきoptionがないのですが、用紙サイズを
A4とかB4とかに任意に設定するoptionはありませんか?

よろしくおねがいします

No. 2386 # cgi超初心者 2001/12/18 (火) 14:35:51
はじめまして。最近cgiの勉強をはじめたんですが、なかなかうまくいきま
せん。
さっそく質問ですがローカルでcgiの動かし方がわからないんです。一通り
関連サイトを回ってみたのですがどうしても駄目なんです。例えば
hello-worldを実行すると

#!C:/Perl/bin/perl print "Content-type:
text/html\n\n; print ""; print "Hello world.; print ";

こうなってしまうんです。プロバイダがcgiの使用を許可してないので
それが原因なのでしょうか?もしそうならなにか方法を教えてください。
よろしくお願いします。

No. 2387 # cgi超初心者 2001/12/18 (火) 14:41:30
ちなみに環境は
windows98,internetexplorer5,プロバイダはocnです。
よろしくお願いします

No. 2388 # CZ 2001/12/18 (火) 18:29:52
>>2386 cgi超初心者
>プロバイダがcgiの使用を許可してない
のは全く関係ありませんので安心してください。
ローカルでCGIの動作確認をする方法を初心者向けに説明したサイトを紹介しておきます。

http://members.tripod.com/~tyanko/s_mokuji.html

No. 2389 # 68user 2001/12/19 (水) 01:45:36
>>2385 hiro
lp -f で できませんでしたっけ。

No. 2390 # スナフキン 2001/12/19 (水) 02:52:22
つかぬ事をお伺いしますが、perlで <+ でファイルオープン時に、開こうとする
ファイルが存在しないとエラーとなりますが、以下の様な処理をしました。
が、どう見てもカッコ悪い(笑)のでこんなケースにはどんな処理をしているか
お聞きしたいのですが・・・

if(!-e $dat_file){# 存在しない時に作成
    if(!open(DAT, ">$dat_file"))
        { &error('オープンエラー', "データファイルの生成に失敗しました。[$dat_file]");}
    close(DAT);
}

#改めて開きなおし
if(!open(DAT, "+<$dat_file"))
    { &error('オープンエラー', "データファイルのオープンに失敗しました。(1)");}
while(<DAT>){
    chomp;
    push(@record, $_);
}

No. 2391 # 68user 2001/12/20 (木) 17:44:24
>>2390 スナフキン
open(DAT, "+<$dat_file") || open(DAT "+>$dat_file") || &error('..');
while(<DAT>){
    ..
}

ってのはどうでしょうね。

あと、perlopentut(1) に参考になることが書いてあるかも
(書いてないかも) しれません。

No. 2392 # スナフキン 2001/12/20 (木) 20:26:30
ウチのマシンの perl はバージョンが古く(5.004_04)なので
perlopentut の情報は見つけられませんでした。

しかしキーワードを検索するといろいろと情報を得る事が出来ました。
if(!open〜 は自分なりの書式なので良く使っていましたが、perlで
杓子定規に覚える事にはあまり意味が無いですね(笑)
いままで使った事の無い sysopen もいろいろ試してみます。

的確なキーワードありがとうございます。

参考になったURL
http://www.wingworld.co.jp/forum/cgi/messages/1931.html
う〜んバージョンを新しくしなければ・・・

No. 2393 # /tk 2001/12/20 (木) 22:11:22
>>2384 68user
> select か何かでバッファに たまっているリクエストを
> 全て解釈しようとしていた、ということですかね?
この辺の仕様(というか実態)は知りませんが
サーバにどのようなリクエストが実際に渡ったのかを
調べるのが、原因究明の早道となるような気がします。
# 実際どのようにすれば, それを調べられるかは分かっていません。

今回の件に関しては, なんとなく
> 一気に USER、PASS、LIST を送って、その後 リプライを受け取る
のが原因かな。 と特に根拠も無くアタリをつけてテストをしました。

別に sleep である必要は全然無いのですが
個別にリプライを受けて -ERR だったら再入力な
スクリプトを書くの面倒だったので…
(あと環境が Windows でしたので)


>>2390 スナフキン
> こんなケースにはどんな処理をしているか
実際にファイルが存在していないのですから
オープンエラーで困る事は無いのだし
むしろエラーになってくれなくては困るという
考え方をしています。

…↑ゴミレスですね。すみません。

No. 2394 # Ka23 2001/12/21 (金) 18:40:42
UNIX プログラミング FAQが以下に移転しています。
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html

http://www.adl.nii.ac.jp/~moro/
暫定っぽいですが(^^;

No. 2395 # Suresh [E-mail] 2001/12/27 (木) 18:08:12
Cクラス(HP UNIX版)ハードDiskをBクラス使用するとき何か
設定必要でしょうか ?
教えって下さい。

No. 2396 # hogehoge 2002/01/02 (水) 09:59:55
access.logは下記のようなもの。$1はエポックタイム
(1970/1/1 00:00:00からの経過秒数)で$3はアクセスした端末のIP。

1009379443.542 20 192.168.16.17 TCP_HIT/200 1694 GET http://www.al4a.com/images/911.gif - NONE/- image/gif
1009379443.604 24 192.168.16.17 TCP_HIT/200 10159 GET http://www.al4a.com/honor.gif - NONE/- image/gif
1009379444.170 11683 192.168.16.17 TCP_REFRESH_HIT/200 59687 GET http://www.al4a.com/links.html - DIRECT/www.al4a.com text/html
1009379446.523 2979 192.168.16.17 TCP_HIT/000 11027 GET http://www.al4a.com/images/al4av2.jpg - NONE/- -
1009379446.526 1472 192.168.16.17 TCP_MISS/000 0 GET http://counter7.tracker.com/c5/id/0/104406 - DIRECT/counter7.tracker.com -
1009379447.026 63 192.168.16.17 TCP_HIT/200 15976 GET http://www.al4a.com/banners/gf1.gif - NONE/- image/gif
1009379447.364 16 192.168.16.17 TCP_HIT/200 10159 GET http://www.al4a.com/honor.gif - NONE/- image/gif
1009379448.331 967 192.168.16.17 TCP_MISS/200 9626 GET http://counter7.tracker.com/c5/id/0/104406 - DIRECT/counter7.tracker.com image/gif
1009379449.997 1504 192.168.16.17 TCP_HIT/200 20456 GET http://www.pornleo.com/banner/pussy10-29.gif - NONE/- image/gif
1009379450.256 3056 192.168.16.17 TCP_HIT/200 15679 GET http://www.al4a.com/images/al4av2.jpg - NONE/- image/jpeg
1009379453.262 148 192.168.16.17 TCP_HIT/200 7049 GET http://www.al4a.com/banners/fc1.jpg - NONE/- image/jpeg
1009379453.301 38 192.168.16.17 TCP_HIT/200 9328 GET http://www.al4a.com/banners/am1.gif - NONE/- image/gif
1009379454.056 1963 192.168.16.17 TCP_HIT/200 21921 GET http://al4a.free6.com/free6.gif - NONE/- image/gif

これを集計して

date time user数
----------------------
2001/12/28 00:00 0
2001/12/28 00:30 0
2001/12/28 01:00 5
2001/12/28 01:30 6

のようにしたいのです。awkファイルは3つあり、それをshellに記述して
一括処理しようとしています。
#syukei.sh
#!/bin/sh
./syukei1.awk access.log|./syukei2.awk|./syukei3.awk > file

#syukei1.awk
#!/bin/gawk -f
{
hour=strftime("%H",$1);minute=strftime("%M",$1);second=strftime("%S",$1)
base=$1-(hour*3600+minute*60+second)
        for(i=1;i<=48;i++){
                if((base+1800*(i-1) <= $1) && ($1 < base+1800*i)){
                        print strftime("%Y/%m/%d %H:%M",base+1800*(i-1)),$3,1
                }
        }
}

#syukei2.awk
#!/bin/gawk -f

{
sum[$2,$3] += $4
}

END {
        for(item in sum){
                split(item, t, SUBSEP );
                printf("%s %s %s %d\n",$1,t[1],t[2],sum[item]);
        }
}

#suykei3.awk
#!/bin/gawk -f
{
        if(length($2) > 0){
                kazu[$2] ++;
        }
}

END{
        for(i in kazu){
                print $1,i,kazu[i]
        }
}

といった感じです。syukei1.awkで
2001/12/28 00:00 192.168.1.2 1
2001/12/28 00:00 192.168.1.1 1(とりあえずエポックタイムを現在時刻に変換し、秒の項はprintしない。あとはIPaddressを取る)
のように加工します。(最後の1は捏造したもの。後々この数をカウントするので)
syukei2.awkで↑の$4を集計。
2001/12/28 00:00 192.168.1.2 5
2001/12/28 00:00 192.168.1.1 6

2001/12/28 00:30 192.168.1.1 2
2001/12/28 00:30 192.168.1.2 4
のように加工します。(userごとに30分刻みで何回アクセスしたか)
最後にsyukei3.awkで↑の$3を集計。
2001/12/28 00:00 2
2001/12/28 00:30 3
のようにdate time user数という形で出力したいんです。
ただ、ここで今問題になっているのが、例えば2001/12/28 01:00〜2001/12/28 01:30の間に一度もアクセスがなかった場合、
その行が表示されません。アクセスがない場合は2001/12/28 01:00 0 0のように表示したいのですが、
どのようにすればいいでしょうか。また、3つファイルがあるんですが、これを一まとめにすることって可能なんでしょうか。
長くなりましたが、ご教授宜しくお願いします。

No. 2397 # ふくし 2002/01/02 (水) 16:16:42
あけましておめでとうございます。
今年もよろしくお願いします。
>>2396 hogehoge
さん:はじめまして
cronで30分に1回httpを叩くクライアントを作っておいて、
そいつ1回しかアクセスしなかったら0アクセス、
そいつも含めてn回アクセスがあったらn-1アクセスではだめですかねー。

No. 2398 # hogehoge 2002/01/02 (水) 17:12:32
あ…、明けましておめでとうございます。
ふくしさんはじめましてです。

今まではcronを使って30分ごとに集計をとる方法でした。
でも、処理に時間がやたらとかかってしまいまして。
それが1日48回もあるかと思ったら…。
それでプログラムの改善と一括処理に切り替えることにしたんですが。
どうにかならないもんですかね…。ふぅ。

No. 2399 # ふくし 2002/01/02 (水) 19:59:37
>>2398 hogehoge
さん:Perl ですいません。こんなんでできそうです。
要は、
ファイルの各レコードについて、
0:00〜0:30、0:30〜1:00、1:00〜1:30、、の各ゾーンに入っているか調べ、
そのゾーンに入っていたら
ゾーン、IP アドレスをキーに持つ2次元ハッシュの値を1にし、
全件調べた後に各ゾーンごとにいくつ IP がたまっているかを出力しています。
ろくにテストしていませんがバグっていたらすみません。


#! perl -w

use Time::Local; # timelocal 関数を使うために必要なモジュールの宣言

(undef,undef, undef, $mday, $mon, $year, undef, undef, undef) = localtime(time); # 今日が何日か
$step = 30 * 60; # 30分刻み

$next = timelocal(0, 0, 0, $mday, $mon, $year); # 今日の0時0分0秒の時刻(epoch からの秒数)
$start = $next - 60 * 60 * 24; # 昨日の0時0分0秒の時刻

%result = ();
while(<DATA>) {
                ($now, undef, $ip) = split;
                for ($from = $start; $from < $next; $from += $step) { # $from は計算開始の時刻
                                $to = $from + $step; # $to は計算終了の時刻
                                if ($from <= $now and $now < $to) {
                                                $result{$from}{$ip} = 1;
                                }
                }
}

for ($from = $start; $from < $next; $from += $step) {
                $num = keys %{$result{$from}};
                ($sec, $min, $hour, $mday, $mon, $year) = localtime($from);
                $year += 1900;
                $mon++;
                print "$year/$mon/$mday $hour:$min:$sec $num\n";
}

No. 2400 # ふくし 2002/01/02 (水) 20:32:15
すいません、<DATA> でなくて
<STDIN> にして標準入力を渡すか、
ファイルハンドルをオープンしてつかってください。
テスト用のコードを修正しわすれました。

Prev< No. 2361〜2400> Next  [最新発言に戻る] [過去ログ一覧]