68user's page 掲示板

Prev< No. 3321〜3326> Next  [最新発言に戻る] [過去ログ一覧]
No. 3321 # スナフキン 2003/08/29 (金) 23:36:11
助言ありがとうございます。

>仮に 300MB 程度だとしても、1.5GB 喰い尽くしてもおかしくないかなぁとは思います。
うーんやはりそうですか。

データの持ち方の影響も大きいとは思いますが、ハッシュは内部で
キーのインデックスを作っているために、キー全体のデータよりも
相当数のメモリを食うのかな?となんとなく考えていましたが、
まさかこれほどとは思いませんでした。

> 1. データが固定長 (もしくは最大長が決まっている)
> 2. CSV の項目名や項目長が変わる可能性は少ない
> 3. 処理内容が変わる可能性が少しでもある
> (この条件に引っかかるレコードは除外する、とか)
>であれば、DB に突っ込んだ方がよろしいのではないでしょうか。
2と3は該当するので、DBに変換して処理する方向でやってみます。

ただ、元の入力ソースの総合計が2.6Gbも有るので、DB化する事に
かかる時間やファイル占有量がわからなくてその選択肢を選びま
せんでした。

全て書き直しになりそうだ・・・汗

No. 3322 # 岩崎 [E-mail] 2003/09/01 (月) 13:06:04
突然のメールですみません。
岩崎と申します。

実は、WebでMewの操作について探していたところ、貴殿を拝見し、
もしかしたら、下記の対応方法をご存じなのではないかと思い、
メールをお送りさせていただいております。

お忙しいとは思われますが、もし、ご存じでしたならば対処方法を
教えてください。

----
質問
----
現在、MewにてMailチェックをしております。
emacs上でM-x Mewとタイプするとパスワードが聞かれると同時に
過去のMail(以前受信したMail)も表示されます。

しかし、昨晩より、M-x Mewと打ち込んでも新規に受信したmail
しか閲覧できません。おかしいとおもい、Mail/inbox配下を
見たところ、確かに1〜3500件までは入っております。

再度、「i」コマンドで新しいMailを受信すると、受信したMailは
3501件目と表示されますが、3500件目より以前のmailは見えません。
「Shift-O」で順番を整理すると、整理はできるようです。

Mewにて何故か?見えなくなった過去のMailを見えるようにするには
どのようにすればよろしいのでしょうか?

ご存じであれば、教えてください。
よろしくお願いいたします。

また、できれば、CCでiwanov@relief.ne.jpまで情報を転送
いただければ幸甚です。、

No. 3323 # pyontan [E-mail] 2003/09/02 (火) 08:07:32
ご存知の方がいらっしゃれば、教えてください。
UNIXサーバで、あるファイルがなくなりました。
いつ、どのように消えてしまったかを知る術はあるのでしょうか?
領域不足で、優先度が低く削除されたとか、
誰かがrmコマンドを実行したとか…。
教えてください。

No. 3324 # 68user 2003/09/05 (金) 01:04:28
>>3322 岩崎
Mew のことは http://www.mew.org で質問した方が早く解決すると思います。


>>3323 pyontan
> いつ、どのように消えてしまったかを知る術はあるのでしょうか?
残念ながら、よっぽど特別な仕掛けでも仕込んでおかない限り
無理だと思います。

> 領域不足で、優先度が低く削除されたとか、
さすがにこれはないでしょう。ちなみに UNIX では、ファイルに
優先度という概念はないです。

> 誰かがrmコマンドを実行したとか…。
というようなログも、一般的な UNIX では用意されていないです。

No. 3325 # ken 2003/09/07 (日) 21:51:47
こんばんは。
現在、DNSクライアントを勉強中です。
サンプルをまだ解析中なんですけど、どうしてもわからない箇所がいくつかあるので…質問させていただきます。

まず、フラグについてです。
えっと…少し説明しにくいんですけど、何故、16ビットと書いてあるのに第15ビットまでの説明までしかないのでしょうか?

次に、ネットワークバイトオーダについてです。
サンプル中で、質問数、回答数、権威数などはpackするときにネットワークバイトオーダに変換しているのに、IDとフラグを変換しないのは何故でしょうか?
どういう物をネットワークバイトオーダに変換しなければいけないのかよくわからなくて…。

最後に、サンプル中に出てくる$restについてです。
データを受信した時、細かく言うと$restにはどういった順番でデータが入っているのでしょうか?
それがよくわからなく、get_domainサブルーチンに渡したときの処理の仕方がよくわかりません…(−−;

以上長々と申し訳ありませんが、どうかよろしくお願いしますm(_ _)m

No. 3326 # 68user 2003/09/08 (月) 13:02:19
>>3325 ken
> 何故、16ビットと書いてあるのに第15ビットまでの説明までしか
> ないのでしょうか?
http://x68000.startshop.co.jp/~68user/net/resolver-2.html#flag
のところですね。わたくしの誤りです。RCODE が 3ビットとなって
いますが、正しくは4ビットです。近いうちに直します。

# 表の部分で「1……15bit」とあるところも、「1……16bit」の
# 誤りですね。

> 質問数、回答数、権威数などはpackするときにネットワークバイト
> オーダに変換しているのに、IDとフラグを変換しないのは何故でしょうか?
http://x68000.startshop.co.jp/~68user/net/resolver-3.html#4
の以下の部分ですね (一部略)。

        sub make_query {
                my ($type, $class) = @_;

                # 識別子設定
                my $id = pack('B16', '0000000000000000');

                  # フラグを構成する各要素を設定
                  my $qr = QR::Query; # 0:質問
                  my $opcode = OPCODE::StandardQuery; # 0:標準照会
                  my $aa = 0; # Authoritative Answer (応答時にセット)

                  # フラグ (0 と 1 の文字列)
                  my $flg_binary = sprintf("%d%04d%d%d%d%d%03d%d", $qr, $opcode, $aa, (略));

                  # フラグ (2バイトのバイナリ)
                  my $flg = pack("B16", $flg_binary);

                  # 質問数のみ 1。回答数、権威数、追加情報数はいずれも 0。
                  my $question_count = pack('n', 1);
                  my $response_count = pack('n', 0);

                  # foo.example.com というホスト名を 3foo7example3com という形に変換。
                  my $query_name = &make_domain($query_host);

                  # リクエストは「識別子+フラグ+質問数+回答数+権威数+追加情報数+質問」からなる。
                  my $request = $id.$flg.$question_count.$response_count.$auth_count.$ext_count.$question;

                  return $request;
          }

ID やフラグは pack('B16') でバイナリデータに変換していますが、
その際に順番が入れ替わることはありません。
          pack('B16', '1111000000000011')
は順序を保持したまま
          1111000000000011
となります。
          0000001111110000
となることはありません。

ただし数値の場合は、Short 値を作ろうとして素直に
            my $question_count = pack('s', 1);
などとしてしまうと、リトルエンディアンな Intel 系では 0x01 0x00、
ビッグエンディアンな Motorola・Sparc 系では 0x00 0x01 となって
しまいます。よってこの場合は
            my $question_count = pack('n', 1);
と n を使って、どの環境でも 0x00 0x01 となるようにするわけです。


> データを受信した時、細かく言うと$restにはどういった順番でデータが
> 入っているのでしょうか?
以下、http://x68000.startshop.co.jp/~68user/net/sample/resolver-1.pl
sub parse_response 関数の説明をします。

        my ($id, $flg, $question_count, $response_count, $auth_count, $ext_count, $rest)
            = unpack('nnnnnna*', $org_dgram);

の時点では、$rest には「(7)質問レコード以降のデータ」(回答レコード・権威
レコード・追加情報レコードも含む) が入っています。

データの順序は
      http://x68000.startshop.co.jp/~68user/net/resolver-2.html#4
の「解析した応答の構成」の順のとおりです。


$rest の先頭のデータは「(7)質問レコード」ですが、「(7)質問レコード」は
      (7.1)照会名 (可変長)
      (7.2)照会タイプ
      (7.3)照会クラス
から成り立っていますので、$rest の先頭データは「(7.1)照会名」であるとも
言えます。

その後、

        foreach my $count ($question_count){
                my $domain;
                # この時点で $rest の先頭データは「(7.1)照会名」
                ($domain, $rest) = get_domain($rest, $org_dgram);
                # この時点で $rest の先頭データは「(7.2)照会タイプ」
                my ($type, $class) = unpack('nn', $rest);
                # ↑「(7.2)照会タイプ」と「(7.3)照会クラス」を取り出す。
                substr($rest, 0, 4) = '';
                # ↑取り出した「(7.2)照会タイプ」と「(7.3)照会クラス」を削る。

                printf "質問: ドメイン名: %s\n", $domain;
                printf "質問: タイプ: %d (%s)\n", $type, TYPE::getName($type);
                printf "質問: クラス: %d (%s)\n", $class, CLASS::getName($class);
                print $hr_line;
        }

といったふうに、$rest の先頭部分から順に、データを取り出す⇒削る
という処理を繰り返します。

質問部分を読み終わると、$rest にはリソースレコード (回答・権威・追加情報) が
残っています。リソースレコードは
      ドメイン名 (可変長)
      タイプ
      クラス
      生存時間 (TTL)
      リソースデータ長
      リソースデータ (可変長)
から成っていますので、

        foreach (1 .. $count){
                my $domain;

                ($domain, $rest) = get_domain($rest, $org_dgram);
                # ↑ここでドメインを切り出す。
                my ($type, $class, $ttl, $rdata_length) = unpack('nnNn', $rest);
                # ↑タイプ・クラス・生存時間・リソースデータ長を取り出す。
                substr($rest, 0, 10) = '';
                # ↑タイプ・クラス・生存時間・リソースデータ長の分を削る。

                my ($rdata) = substr($rest, 0, $rdata_length);
                substr($rest, 0, $rdata_length) = '';
                # ↑リソースデータ取得
        }

と、ここでもやはり「データを先頭から取り出し、削る」の繰り返している
わけです。

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