68user's page 掲示板

Prev< No. 3319〜3397> Next  [最新発言に戻る] [過去ログ一覧]
No. 3319 # スナフキン 2003/08/29 (金) 05:22:17
perlでテキスト処理をしていますが、有るリストをキーとしたハッシュ
を生成したんですが、そのキーとなるファイルのサイズが110Mb程、キー数
(レコード数)は約1000万弱のレコードが有ります。

そのハッシュのキーを使い別のCSVのフィールドの中に同じキーが存在
する場合に必要な処理を行なっています。
if(exists $KEY{$csv_key_field}){ 処理 }

で、実際に動かすと500Mbのメモリを使い切り(何故?)、1Gbのスワップ
さえも使いきり止まってしまいます。

根本的にこのアルゴリズム自体が悪いのか、それとも何かメモリ使用量を
抑える解決方法があるのか教えてください。

ちなみに、キーとなるデータを配列に格納して grep で検索するとさらに
べらぼうに時間が掛かります。

具体的には2つのリストの合成処理なんですが、このくらいの規模になると
DBに置き換えて処理した方が良いのでしょうか?
(最終的には何らかのDBに格納されるそうです)

もちろん、変数は可能な限り局所化しています。(つもりです(^^;)

もっと言えば、上記は最大サイズのリストではありますが、キーリストは
複数あり、それらを順繰りに処理しています。

どうぞお助けくださいm(_ _)m

No. 3320 # 68user 2003/08/29 (金) 22:28:24
>>3319 スナフキン
> そのキーとなるファイルのサイズが110Mb程、キー数(レコード数)は
> 約1000万弱のレコードが有ります。
全体のデータ容量がわからないですが、仮に 300MB 程度だとしても、
1.5GB 喰い尽くしてもおかしくないかなぁとは思います。

perl の内部構造は知りませんが、スカラー 1つ、配列の一要素、
ハッシュ 1キーなど、それぞれに必ず何バイトかずつ管理用データを
perl が保持しているからです。

実感としては、100MB 程度でもデータの持ち方次第ではまともに
動かないこともあるんじゃないかと思います。

> このくらいの規模になるとDBに置き換えて処理した方が良いので
> しょうか?
perl でもがんばれば何とかなるかもしれませんが (実データはファイルに
保存し、ハッシュにアクセスされるたびに tie でそのファイルを見にいくとか)、
    1. データが固定長 (もしくは最大長が決まっている)
    2. CSV の項目名や項目長が変わる可能性は少ない
    3. 処理内容が変わる可能性が少しでもある
          (この条件に引っかかるレコードは除外する、とか)
であれば、DB に突っ込んだ方がよろしいのではないでしょうか。
わたしならそうします。

項目名や項目長も変わるかもしれないなら、DBD::CSV モジュールとか
(使ったことないですけど)。

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) = '';
                # ↑リソースデータ取得
        }

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

No. 3327 # ken 2003/09/09 (火) 13:30:18
なるほど…だいたいよくわかりました、ありがとうございます。
でもまだget_domainサブルーチン中の処理がよくわかりませんねぇ…。
while文の最初のif文の中です。

493: if ( ( $len & 0xc0 ) == 0xc0 ){
    494: # 上位 2ビットが立っていたら、もう 1バイト読みこむ (合計 16ビット)。
    495: # そして上位 2ビットを落とし、残り 14ビットを DNS サーバから
    496: # 返された UDP データグラム先頭からのオフセットとして再帰。。
    497:
    498: my $offset = unpack('n', $data) ^ 0xc000;
    499: my $new_data = substr($org_data, $offset);
    500: substr($data, 0, 2) = '';
    501:
    502: my ($domain_part) = get_domain($new_data, $org_data);
    503: push(@domains, $domain_part);
    504: last;
    505:
    506: } else {
    507: # 上位 2ビットが立っていないので、カウンタとして扱う。
    508: substr($data, 0, 1) = '';
    509: }

まず、if文の中で$dataの上位2ビットが立っていたときに、その2ビットを除いた上位14ビットを$offsetに入れて、$org_dataの$offset番目からのデータを$new_dataに入れて、$dataの上位2ビットを落としたところまではわかりました。
そのあと再びget_domainサブルーチンを呼び出すところからが…どうなるのでしょうか??(^^;

また、else文の中の1行はどういった意味を持っているのでしょうか?
ここでいう「カウンタ」という物もよくわからなくて…。

どうか、よろしくお願いします

No. 3328 # 68user 2003/09/09 (火) 21:36:40
>>3327 ken
> そのあと再びget_domainサブルーチンを呼び出すところからが…
> どうなるのでしょうか??(^^;
http://x68000.startshop.co.jp/~68user/net/resolver-2.html#6 の例だと、
最初に get_domain が受け取った $data が
      (0x04)www2(0xC0)(0x13)....
で、一回目の while ループが終了した時点で
        $data = "(0xC0)(0x13)...."
        @domains=('www2');★1
となっています。

二回目の while ループでは
      my $len = unpack('C', $data);
で $len は 0xC0 になり、
      if ( ( $len & 0xc0 ) == 0xc0 ){
が真なので
      my $offset = unpack('n', $data) ^ 0xc000;
          ⇒ $offset は 0x13
      my $new_data = substr($org_data, $offset);
          ⇒ $new_data は、UDP データグラム全体 ($org_data) の 0x13バイト目
      substr($data, 0, 2) = '';
          ⇒ $data は "(0xC0)(0x13)...." から "...." となる (先頭 2バイトを削る)
となります。$new_data には
      (0x09)startshop(0x02)co(0x02)jp(0x00)
が入っています。

ここで
     my ($domain_part) = get_domain($new_data, $org_data);★2
        push(@domains, $domain_part);★3
と get_domain を再帰呼び出しすると、
      sub get_domain {
            my ($data, $org_data) = @_;
の $data には
      (0x09)startshop(0x02)co(0x02)jp(0x00)....
が入っています。再帰呼び出しされた get_domain が処理を終えるときには
        @domains = ('startshop', 'co', 'jp');
となっており、最終的に
        return 'startshop.co.jp';
とドメインの一部を返します。

で、再帰呼び出しした側の get_domain に処理が戻ると、以下のような
流れになります。
    ★1 の @domains にはすでに www2 が入っている
    ★2 の $domain_part には、再帰呼び出しした get_domain から受け取った startshop.co.jp が入っている
    ★3 で @domains = ('www2', 'startshop.co.jp') となる


> また、else文の中の1行はどういった意味を持っているのでしょうか?
> ここでいう「カウンタ」という物もよくわからなくて…。
      (0x03)www(0x02)jp(0x07)FreeBSD(0x03)org(0x00)
の 3・2・7・3・0 がここでいうカウンタです。$len には
その後に続くバイト長が入っており、
      508: substr($data, 0, 1) = '';
はその $len の部分を削っています。

# 説明文で使用していない用語 (カウンタ) を、ソースで使ってはいけませんね。

No. 3329 # tomtom 2003/09/10 (水) 10:17:13
先日質問させていただいた、tomtomです。
クライアントが受信待ちの状態の時に、サーバに
ソケットをクローズされたら、クライアントは、
どうなるのでしょうか?

以前質問させていただいた時に、undefを受信してしまう
という問題があったのですが、サーバ側で勝手にセッションを
終了してしまっていた可能性があるので、その辺が関係している
かどうか疑問に思ったため、再度質問させていただきました。

No. 3330 # ken 2003/09/10 (水) 23:11:50
あ〜っ、なるほど!
わかりました!完璧にわかって疑問が紐解けましたよ〜!
get_domainの再起呼び出し後はそういう処理だったんですね…。
カウンタの意味もわかりましたし(^^;)、もうばっちりです!
長々と本当にありがとうございましたm(_ _)m
もしまた何かありましたら…よろしくお願いいたします(^^;

No. 3331 # lopper [E-mail] 2003/09/12 (金) 18:51:13
こんにちは、今Perl で UDP 通信を行うスクリプトを作っているの
ですが、少し分からないところがあるので質問させてください。

普通に UDP 通信は問題なく行えているのですが、送信元の IP アドレスが
拾えなくて悩んでおります。
recv 関数の戻り値で「送信元のアドレス」は拾えるのですが、送信元が
「どこへ宛てて送信したか?」が分からないのです。
IO::Socket::INET モジュールを使用していますが、peeraddr メソッドを
使っても何も返ってきません。

http://x68000.startshop.co.jp/~68user/net/udp-3.html に UDP で
connect 出来ると書かれていますが、connect すれば送信先アドレスを
拾う事ができますでしょうか?

ご存じの方、よろしくお願いいたします。

No. 3332 # 68user 2003/09/13 (土) 01:35:39
>>3329 tomtom
> クライアントが受信待ちの状態の時に、サーバにソケットを
> クローズされたら、クライアントは、どうなるのでしょうか?
単に相手がソケットをクローズしただけなら、recv は 0 を
返します。

もし
      A が listen → B が connect → A がソケットクローズ
      → B が send → B が recv
なら、B は SIGPIPE を受けます。


>>3331 lopper
> recv 関数の戻り値で「送信元のアドレス」は拾える
> のですが、送信元が「どこへ宛てて送信したか?」が
> 分からないのです。
ソケットが送信先を記憶していないからです。同じ相手に
連続して UDP データグラムを送信する場合、
    socket(SOCKET, PF_INET, SOCK_DGRAM, 0);
    send(SOCKET, "hoge1", 0, $sock_addr);
    send(SOCKET, "hoge2", 0, $sock_addr);
と、毎回 send の引数に宛先である $sock_addr を指定
しなければいけません。なぜなら、一度目の send を
実行した後、SOCKET は $sock_addr に送信したことを
覚えていないからです。

# ソケットの先のアドレスが確定していないので、相手側で
# エラーがあって ICMP メッセージが返ってきても、カーネルは
# どのソケットにエラーを伝えればよいかわからない。だから
# 非 connect な UDP では相手側のエラーを拾えないわけです。

> connect すれば送信先アドレスを拾う事ができますでしょうか?
できます。
    socket(SOCKET, PF_INET, SOCK_DGRAM, 0);
    connect(SOCKET, $sock_addr);
この処理で SOCKET は「宛先が $sock_addr であること」を
覚えます。よって、この後 send する場合は
    send(SOCKET, "hoge1", 0);
と宛先を省略できるのです。

C で言うと、connect(2) することで、sendto(2) ではなく
send(2) が使えるということです。

No. 3333 # lopper [E-mail] 2003/09/13 (土) 22:21:38
68user さん、お返事ありがとうございます。
socket => connect を行う事で send を呼ぶ時に IP アドレスを
指定しなくても良くなるわけですね。

逆に recv などで受信する時はどうなのでしょうか。
例えば 192.168.0.255 宛のブロードキャストメッセージを受信しても
受信側からはブロードキャストメッセージを受信したのか、ユニキャストを
受信したのか分かりません。
Java などで UDP を使う時は相手が送信した IP アドレスと相手の IP
アドレス両方が分かるようですが、Perl では難しいのでしょうか?

No. 3334 # 68user 2003/09/13 (土) 22:25:12
ちょっと前にこのページが移転するかもと言っていましたが、
継続して使わせていただけることになりました。

68user's page は
      Startshop さん http://www.startshop.co.jp/
      両毛インターネットさん http://www.takauji.or.jp/
      Netboy さん
のご厚意により、回線・マシンを無料で使用させていただいて
おります。ここに改めて感謝の意を表したいと思います。

No. 3335 # 68user 2003/09/13 (土) 23:01:58
>>3333 lopper
> 例えば 192.168.0.255 宛のブロードキャストメッセージを受信しても
> 受信側からはブロードキャストメッセージを受信したのか、ユニキャストを
> 受信したのか分かりません。
一般的な BSD ソケットの API を使う以上は判断できないと思っています。

> Java などで UDP を使う時は相手が送信した IP アドレスと相手の IP
> アドレス両方が分かるようですが、Perl では難しいのでしょうか?
Java なら受け取ったデータグラムがブロードキャスト宛かどうかを
判断できるのでしょうか。

もしそうなら、Java が BSD ソケット API を使用せずネットワーク
機能を自前で作っているとは考えづらいので、BSD ソケット API で
実現可能なのだろうと思います。

DatagramSocket や DatagramPacket を見る限りでは、Java であっても
無理ではないかと思いましたが、もし可能なのであれば Java で記述
したサンプルプログラムを見せていただけますでしょうか。

No. 3336 # へにか 2003/09/13 (土) 23:07:33
おお、それはすばらしいですね。
もし私が両毛地方とか県南・県央(一部重複してますが)に住むことに
なったら、率先して両毛インターネットさんを選びたいという気持ち
でいっぱいです。

No. 3337 # lopper [E-mail] 2003/09/14 (日) 00:31:47
お返事ありがとうございます。
確実に Java で宛て先アドレスを取得できるという確認はしていない
のですが、以下の IP Messenger for Java の中では行っている
ようです。

http://www1.ttv.ne.jp/~digitune/Java/IPMsg/
からソースコードをダウンロードして、その中にある IPMProxyEvent.java
ファイルの中にある、getToIPMAddress で見ている見たいです。

P.S.
私は Java には詳しくはないので、確実かどうかわかりません。

No. 3338 # 68user 2003/09/14 (日) 01:12:32
>>3336 へにか
> 率先して両毛インターネットさんを選びたいという気持ちでいっぱいです。
本当に一銭たりともお金を払っていないので申し訳ないことです。
機会があればぜひとも。

>>3337 lopper
> IPMProxyEvent.java ファイルの中にある、getToIPMAddress で
> 見ている見たいです。
ぱっと見、Java 版 IP Messenger 独自機能である proxy 機能の
ソースのように見えます。README には「proxy 機能は TCP で実装
されている」とありましたので、多分違うのではないかと思います。

ちなみに 本家 IP Messenger は、受けたメッセージがブロード
キャストだと、ログに「(多)」などと表示されます。

しかしこれは UDP のレイヤで判別しているのではなくて、IP
Messenger のアプリで使用するコマンドの IPMSG_BROADCASTOPT が
立っているかどうかで判断しています。

No. 3339 # lopper [E-mail] 2003/09/14 (日) 03:13:58
lopper です。
お返事ありがとうございます。
ブロードキャストの件了解しました。なるほど Java版 ではプロキシに TCP を
使用しているので IP アドレスが拾えるのですね。わかりました。

色々とありがとうございました。自分なりに他の道を探してみます。

No. 3340 # tomtom 2003/09/15 (月) 09:10:42
tomtomです。
68userさん、お返事ありがとうございます。
そうですか、、もし、undefを返すなら以前の
説明がつくと思ったのですが、どうやら見当違い
のようですね。
また、色々考えてみる事にします。
原因が分かったら、また書き込みさせていただきます。

No. 3341 # のぐけん。 2003/09/15 (月) 12:15:50
こんにちわ。以前質問させてもらった者です。

それで、また質問なのですが(笑
Perlカテゴリの中のProxy Serverのことで質問です。
SIGPIPEシグナルが飛んで来た時用
ということで、$SIG{PIPE}を作られていますが、
これはどこで使用されているのでしょうか?
作っとけば勝手にってことなのでしょうか?

お忙しいかと思いますが、よろしくお願いします。

No. 3342 # 68user 2003/09/16 (火) 02:54:15
>>3341 のぐけん。
> $SIG{PIPE}を作られていますが、これはどこで使用
> されているのでしょうか? 作っとけば勝手にって
> ことなのでしょうか?
勝手に使用されます。

シグナルを最初に受けるのはカーネルです。カーネルは
プロセスごとに「SIGINT がきたらどーする、SIGPIPE が
きたらこーする」というテーブルを参照し、適切な動作を
行います。

つまり %SIG の書き換えというのは、自分のプロセスの
シグナル処理用テーブルを更新なわけで。

No. 3343 # 68user 2003/09/16 (火) 02:55:24
ところで、
    http://x68000.startshop.co.jp/~68user/net/link-book.html#8
の「UNIX ネットワークベストプログラミング入門」ですが、
    UNIX ネットワークプログラミング入門
        http://www.gihyo.co.jp/books/syoseki.php/4-7741-1754-4
として新版が出版されてるのを見付けました。

買ってませんが、立ち読みした限りでは htons は使われて
いました (笑)。大幅な内容追加というわけではないようなので、
「ベスト」の方を持っている人は不要かなーという感じです。

クライアントとサーバ両方を自作してみるというのは重要な
ことだと思いますので、改めてお勧めしておきます。

No. 3344 # Tsun 2003/09/17 (水) 16:50:41
始めまして、Tsunと申します。

何時も勉強させて頂いております。
共通鍵暗号のページで3DESでの鍵長が56*3にならない訳ですが、3DESは
DESプロセスを3回繰り返すと言う意味で、使う鍵は実は2個なのです。
具体的に言うと、56ビットの鍵AとBを用意して、以下の様に暗号化します。

元データ→鍵Aで暗号化→鍵Bで復号化→鍵Aで暗号化→暗号データ
                        (1)    (2)   (3)

(2)で(1)で暗号化したものとは別の鍵で復号化する訳ですから、当然正しく復号されません、しかし見方を変えれば、これは別の鍵で暗号化したものと、同値となります。ただ鍵としては56ビットを2つ使っているだけなので、鍵の強度としては112ビットの鍵長と同等となります。

この方式の利点は、実質的には56ビットの演算量+αで112ビット相当の鍵強度が得られる所にあります。
鍵長と演算量の比は対数的ですから、112ビットの鍵を使って1回演算するより、56ビットの鍵を使って、3回演算するほうが有利となります。

No. 3345 # asachio [E-mail] 2003/09/24 (水) 00:17:10
お世話になります。UNIXを学びはじめて1か月半の初心者です。grep, findの使用方法を完全理解していないためだと思いますが、(すみません。)ある文字列を含む、ファイル名を検索するにはどのように、grepあるいは、findを使用すればよろしいでしょうか?

No. 3346 # 4lj [E-mail] 2003/09/24 (水) 19:02:31
はじめまして。私は普段、

find ./ -type f | xargs grep -n "foo"

とかやってますが。後はお好みでgrepに-iつけてみたり。

No. 3347 # pranky [E-mail] 2003/09/25 (木) 01:06:50
こんばんは初めまして。pranky と申します。
ここで、いつもネットワークプログラミングなどを勉強させて頂いております。

今回 TCP で実装してあった双方向のプロトコルをファイアウォールにも
対応させなくてはならなくなり、困っているのでご相談させて下さい。
今のところ考えているのは、現在の TCP のプロトコルを HTTP の上に乗せて
HTTP プロキシに対応する事でファイアウォールを越えようと考えています。

開発言語は Perl を使用しておりますので、テスト的に HTTP:Daemon モジュールを
使用してサーバを構築し、LWP::UserAgent でクライアントとして動作を
させてみました。

1. 基本的に既存のプロトコルが Peer to Peer なので、起動時にクライアント側から
サーバ側へ HTTP 接続をし、その起動中はつないだままにしておきたい。

2. 接続中はクライアント側からもサーバ側からも数KB 位のデータのやりとりを
双方向で行いたい。

この上記2 点は両立するものでしょうか?
上の 1. は keepalive を行えばできそうな感じはしますが、下の 2. はできる
のでしょうか。

通常のブラウザを見ていると
1. サーバ側へファイル要求
2. サーバ側がファイル送信
という事の繰り返しですが、MSN Messenger が HTTP を使用している事を
考えると上記の 1. 2. の両立が出来そうな気がします。

No. 3348 # YK 2003/09/25 (木) 10:25:24
はじめまして。
いつもUNIXの情報を参考にさせて頂いております

現在、あるファイルに書かれたファイル名を取得し
そのファイル名が存在するか判定するCシェルを作成しております

set FILE_NAME = `awk '{printf $1}' fileA`

というコマンドでファイル名は取得できたのですが、
ファイル内で改行されている際に改行コードまで取得してしまい
ファイルの存在判定が正しく行えません

改行を除外してファイル名を取得する事は出来ないでしょうか?

ご存知でしたら御教授して頂きたく思います
宜しくお願い致します

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

No. 3349 # 68user 2003/09/25 (木) 15:40:16
>>3344 Tsun
勉強になります。ありがとうございます。

もうちょっと勉強して自分のモノにしてから web の方も
修正したいと思います。

>>3345 asachio
> ある文字列を含む、ファイル名を検索するには
「ある文字列を含むファイル」の名前の一覧がほしいなら
>>3346 4lj
で紹介していただいた方法で。

じゃなくて「ファイル名にある文字列を含むファイル」の名前の
一覧が欲しいのなら
      % find /dir -name \*hoge\* -print
などなど。

>>3347 pranky
> 1. 基本的に既存のプロトコルが Peer to Peer なので、起動時に
> クライアント側からサーバ側へ HTTP 接続をし、その起動中は
> つないだままにしておきたい。
> 2. 接続中はクライアント側からもサーバ側からも数KB 位のデータの
> やりとりを双方向で行いたい。
1 は keep alive を使ったとしても、proxy のタイムアウトが
ある or あるかもしれないので無理ではないかと思います。

2 も HTTP ではサーバプッシュができないので、純粋な意味での
双方向通信は無理ではないでしょうか (サーバから不定期に
クライアントにデータを送るのは不可能だが、クライアントが
定期的にサーバに接続し、そのレスポンスにサーバからのデータを
載せるなら可能)。

> MSN Messenger が HTTP を使用している事を考えると上記の
> 1. 2. の両立が出来そうな気がします。
MSN Messenger は UPnP を使用しており、UPnP が HTTP の上を
流れているだけです。よって、純粋な HTTP では実現不可能では
ないかと思います。

どこまで実現可能かは、プロトコルの詳細がわからないとなんとも
言えないです。

>>3348 YK
> set FILE_NAME = `awk '{printf $1}' fileA`
> ファイル内で改行されている際に改行コードまで取得してしまい、
> ファイルの存在判定が正しく行えません。
csh は set foo=`bar` とした時点で改行コードを除去すると思う
のですが、改行コードまで取得してしまうというのは本当でしょうか?
どういう方法で改行コードが原因だと確認されましたか?

UNIX の改行コードは 0x0a ですが、DOS や Windows は 0x0d 0x0a
です。それが残っているのであれば、tr などで 0x0d を削除してください。
      http://x68000.startshop.co.jp/~68user/unix/pickup?tr

No. 3350 # セルゲイ 2003/09/26 (金) 14:16:15
Solaris8で
(1) 100M Full-Duplex
(2) 1000M Full-Duplex
が混在(共存)している環境を設定するには、どうしたらいいでしょうか。

因みに
(1) hme0
(2) ge0, ge1
という名で認識されるようです。

よろしくお願いします。

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

No. 3351 # 金床 [E-mail] 2003/09/27 (土) 12:46:25
>>3347 pranky
ファイアウォールがHTTP/1.1のCONNECTメソッドの使用を許可している環境で
あればそれを使用すれば解決しますね。

CONNECTの使用ができない場合にはHTTPトンネルと呼ばれるソフトウェアを使用すれば
良いと思います。

私が以前作成したHTTPトンネルが
http://www.jumperz.net/index.php?i=2&a=0&b=0
にあります。

68userさんのおっしゃる

>2 も HTTP ではサーバプッシュができないので、純粋な意味での
> 双方向通信は無理ではないでしょうか (サーバから不定期に
> クライアントにデータを送るのは不可能だが、クライアントが
> 定期的にサーバに接続し、そのレスポンスにサーバからのデータを
> 載せるなら可能)。

を実装したものとなっています。

その他上記URLからリンクしていますが、C言語で書かれたGNU Httptunnelなど同じ種類の
ソフトウェアがいくつか存在します。

No. 3352 # 落合 [E-mail] 2003/09/27 (土) 14:42:32
名づけのページを作っています。
漢字の組み合わせで名前を作るため
例えば 
亜xあyあい
井xい
のようなデーターを作り
while(<FILE>){
chomp;
$key=$_;
($key,$values)= split(/x/, $_);
$t3{$key}=$values;
}
のような連想配列に入れていました。
(色々と考えて漢字のデータはeuc,cgiスクリプトはsjisです)
これを使って名づけのCGIをホームページで公開しているのですがある人から「治」という字が使えないとメールがありなぜかなと考えてみました。
ローカル(windowsXP)な環境ではキチンと表示されます。がプロバイダにアップロードすると使えなくなります。(wakwakとNETAGEどちらも)
そこでアップロードして実験してみました。
@rkey= values %t3;
@rkey2= keys %t3;
これでキチンと配列が作られているか---連想配列は出来ていました。
次に
$nnn='治';
&jcode'convert(*nnn,"euc");
$us=$t3{$nnn};
とやってみたのですがこれだと$usの値が見つかりませんでした。
そこで
コードのせいかと思い単純に
$nnn='治';#これはsjis
&jcode'convert(*nnn,"euc");
として$nnnをHTML(euc)で表示したらコードの変換がうまくいかないようで文字化けします。
そこで
$nnn='治';
&jcode'convert(*nnn,"euc");
$code=&jcode'getcode(*nnn);
としてコードのチェックをしてみたのですが何もコードの判別ができないのです。
ちなみに違う漢字では上の実験はキチンと反応しました。
結果どうも治の文字コードの変換がうまくいかないように思うのですがどうしたらいいのかわからないのです。何かいい方法はありませんか?教えてください。お願いします。

No. 3353 # pranky [E-mail] 2003/09/28 (日) 01:44:07
>>3351 金床
金床さま、はじめまして pranky です。
ありがとうございます!
http tunnel で調べてみたところ CPAN に http-tunnel を実装した
モジュールがありましたので、簡単なソフトを作成して AnHTTPD と
一緒に使用してみたところ、TCP が接続できました!

この方法で試してみます!

No. 3354 # 68user 2003/09/28 (日) 22:51:36
>>3350 セルゲイ
> (1) 100M Full-Duplex
> (2) 1000M Full-Duplex
> が混在(共存)している環境を設定するには、どうしたらいいでしょうか。
100M な NIC と 1000M な NIC の 2枚差しではダメでしょうか。

って、まわりにギガビットな環境が全くないのでわからない
んですけどね。


>>3352 落合
Shift_JIS の「治」は 0x8e 0xa1 ですが、EUC-JP の半角カナの
句点「。」も 0x8e 0xa1 だからです。

> $nnn='治';
> &jcode'convert(*nnn,"euc");
> $code=&jcode'getcode(*nnn);
> としてコードのチェックをしてみたのですが何もコードの
> 判別ができないのです。
jcode.pl を読めばわかりますが、理論的にエンコーディングの
正確な自動判断は不可能なので、
    - EUC-JP として解釈できるバイト数
    - Shift_JIS として解釈できるバイト数
を比べ、バイト数が大きい方を getcode の結果としています。
しかし 0x8e 0xa1 の場合はどちらも 2バイトなので判断がつかず
getcode は undef を返します。

> 色々と考えて漢字のデータはeuc,cgiスクリプトはsjisです
であれば、jcode.pl にエンコーディングを教えてやればよいです。

      &jcode'convert(*nnn, 'euc', 'sjis'); # perl4 的な書き方
      jcode::convert(\nnn, 'euc', 'sjis'); # perl5 的な書き方

と書けば、きっちりと Shift_JIS から EUC-JP に変換してくれます。

No. 3355 # 68user 2003/10/02 (木) 06:16:15
>>3344 Tsun
> 共通鍵暗号のページで3DESでの鍵長が56*3にならない訳ですが
せっかく教えていただいたので、勉強してみました。といっても
    暗号技術大全
          http://www.amazon.co.jp/exec/obidos/ASIN/4797319119/ref%3Db%5Fbb%5F1%5F25/249-2894126-9073950
を読んだだけですが。


「鍵Aで暗号化 → 鍵Bで復号化 → 鍵Aで暗号化」という方法を
EDE (Encrypt-Decrypt-Encrypt) と言う。DES なら DES-EDE
などと書く。

Encrypt-Decrypt-Encrypt が特に解読しづらいわけではないので、
Encrypt-Encrypt-Encrypt でも別に構わない。

ただ、EDE の利点は、鍵A と 鍵B を同じにすれば一度だけ暗号化
したのと同じ結果が得られること (DES-EDE に対応しておけば、
DES にも対応したことになる)。

なぜ 3回必要なのか、2回の暗号化 (つまり 2DES) ではダメな
理由はというと、2回の暗号化では中間値探索 (meet-in-the-middle)
攻撃に弱いため。56bit の DES で 2回暗号化した場合、総当たり
攻撃に限ると 112bit の強さを持つが、中間値探索には 57bit の
強さしかない。


3DES には鍵を 2つ使う方法と、3つ使う方法がある。

鍵を 3つ使う 3DES は総当たりに対しては 56*3=168bit の強度が
あるが、中間値探索に対しては 112bit の相当の強度になる。

一方、鍵を 2つ使う 3DES は中間値探索の弱点はないため、総当たりと
中間値探索のいずれに対しても 112bit の強度になる。

よって、現実的な強さとしては鍵 3つの方が優秀である。

OpenSSL で実装されている暗号で言うと、
    鍵2つの 3DES: des-ede-cbc(=des-ede), des-ede-cfb, des-ede-ofb
    鍵3つの 3DES: des-ede3-cbc(=des-ede3=des3), des-ede3-cfb, des-ede3-ofb
となる。

ただ、
> 鍵長と演算量の比は対数的ですから、112ビットの鍵を使って
> 1回演算するより、56ビットの鍵を使って、3回演算するほうが
> 有利となります。
ここはよくわかりませんでした。DES の鍵は結局は 16ラウンド
それぞれの 48bit 内部鍵の元となるだけなので、対数的ではない
のではないかと思いました。

No. 3356 # has 2003/10/05 (日) 01:56:39
ども。おひさしぶりです。
これまでときどき私のlinux環境からDNSの名前解決ができない
という件でいろいろと相談させて戴いていましたが、今回たまたま
Redhat 9 publisher editionをインストールし試してみたところ、
なぜか無事名前解決できるようになりました。

もしかしたらこれまでインストール時に何かのチェックボックスに
チェックを入れなかったなど、気づいていなかったミスがあったかも
しれませんが、とにかく使えるようになりましたのでまずはご報告
します(もうしないかもしれませんが…^^;)。

というわけでこれまでいろいろアドバイスいただきまして、どうも
ありがとうございました。これで晴れて開発環境を手に入れ、無事
プログラミングにいそしむことができます。今後もどうぞよろしく
お願いします。

No. 3357 # 68user 2003/10/05 (日) 01:58:24
「ネットワークプログラミングの基礎知識」の「リンク集・参考書籍」
      http://x68000.startshop.co.jp/~68user/net/link-book.html
を更新し、以下の書籍の紹介を追加しました。

    - C言語による TCP/IP ネットワークプログラミング
    - IPv6 ネットワークプログラミング
    - 暗号技術大全
    - 暗号解読―ロゼッタストーンから量子暗号まで―

一番お勧めなのは、「暗号解読」のところで触れている
    フェルマーの最終定理
        http://shinchosha.co.jp/cgi-bin/webfind3.cfm?ISBN=539301-4
だったりします。

# 次点が「暗号解読」

No. 3358 # yudai 2003/10/08 (水) 02:19:23
はじめましてyudaiと申します。
突然お邪魔して誠に失礼とは思いますが、ご教授いただけませんでしょうか?

Perlでファイルオープン
    open(TESDAT, "tesdata.txt" ); #エラー処理略
    @list=<TESDAT>;

#testdata.txt内容
m_A9<>太郎<>26歳
f_C5<>花子<>23歳
m_G7<>一郎<>19歳
#ここまで

等として読み込むと
1行ごとに配列の要素となると思うのですが、、この場合に添え字[2]でなく要素の値(f_C5等)で参照する方法はございませんか?
htmlフォームから"f_C5"の入力を受け取りtesdata.txtを読み込み文字列を参照して
$ID="f_C5";
$name="花子";
$old="23歳";
のような結果を得たいのです。
尚、データベースモジュールは使えない環境です。
乱文にて恐縮ではございますがどうかお教えください。

No. 3359 # 68user 2003/10/08 (水) 18:58:09
>>3356 has
> なぜか無事名前解決できるようになりました。
そうですか、原因がわからず解決してしまって残念です :-)

ときにウチの環境でも返ってくる AAAA レコードが壊れていたり、
DNS サーバからの返事がなかなか返ってこなかったり、と思ったら
急になおったり、使用する DNS サーバを変えると再現しなかったり、
でも動作がおかしい DNS サーバはひとつではなかったり、と
なかなか大変です。

>>3358 yudai
案1:
    my $input_id = 'f_C5'; # web からの入力
    open(TESDAT, "tesdata.txt" );
    while (<TESDAT>){
            chomp;
            my ($ID, $name, $old) = split($_, '<>');
            if ( $ID eq $input_id ){
                    # なんらかの処理
            }
    }

案2:
    my $input_id = 'f_C5'; # web からの入力
    my %namehash;
    my %oldhash;
    open(TESDAT, "tesdata.txt" );
    while (<TESDAT>){
            chomp;
            my ($ID, $name, $old) = split($_, '<>');
            $namehash{$ID} = $name;
            $oldhash{$ID} = $old;
    }
    if ( defined $namehash{$input_id} ){
          # なんらかの処理。
          # print "$input_id $namehash{$input_id} $oldhash{$input_id}\n";
          # とか。
    }
というのが回答になっていますか?

No. 3360 # yoshi 2003/10/14 (火) 09:23:49
はじめまして、yoshiと申します。
FTPについてご教授頂きたく思い、書き込ませていただきます。

同一ネットワーク内において、
パソコン(Windows98)→ワークステーション(UNIX)へのFTPでのログインはcmd.exe上からFTPにてログインする事で、可能なのですが、
ワークステーション(UNIX)→パソコン(Windows98)へのFTPでのログインは可能でしょうか?
普通にFTPでログインしようとすると、「接続が拒否されました」と弾かれてしまいます。
可能だとしても、パソコン側で何か設定変更が必要なのでしょうか。

初歩的な質問で申し訳御座いませんが、よろしくお願い致します。

No. 3361 # 68user 2003/10/14 (火) 13:18:43
>>3360 yoshi
Windows98 上で FTP サーバを動かせば可能です。デフォルトでは
FTP サーバは用意されていないでしょう。フリー物がよければ
        http://www.forest.impress.co.jp/library/tinyftpd.html
などがよさそうに見えます。

なので、UNIX マシンに FTP でログインできるのも、
        「その UNIX マシン上で FTP サーバが動いているからログインできる」
ということです。

No. 3362 # しん [E-mail] 2003/10/14 (火) 16:31:16
はじめまして。
UNIXのことについて色々調べていたらこちらにたどり着きました。
以後よろしくお願い致します。

Tarコマンドについて質問があるのですが、
Tarコマンドのディレクトリ数の指定パラメータで
「.」と「./*」があり、
「./*」で指定した場合、ディレクトリ数の上限値があるそう
なのですが、その値はいくつなのでしょうか?

よろしければ教えてください。

No. 3363 # yoshi 2003/10/14 (火) 16:49:31
>>3361 68user

ありがとう御座いました!
そういう事だったのすね、早速やってみます!

No. 3364 # yoshi 2003/10/14 (火) 16:59:34
>>3361 68user
間違えて、書き込んでいる途中で送信してしまいました・・。
しかも脱字でした、すみません。
    ×そういう事だったのすね → ○そういう事だったのですね

家では実験できないので、会社で試してみるつもりです。
結果が分かり次第、報告させて頂きます!

No. 3365 # /tk 2003/10/14 (火) 17:05:39
>>3352 落合
http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse
を読んだ後に cgi-ml で得た情報をコッチにも提供して欲しい気持ち。

>>3359 68user
> my ($ID, $name, $old) = split($_, '<>');
split の引数が逆ですぜ。

No. 3366 # 68user 2003/10/14 (火) 17:20:10
>>3362 しん
> Tarコマンドのディレクトリ数の指定パラメータで
> 「.」と「./*」があり、
> 「./*」で指定した場合、ディレクトリ数の上限値があるそう
> なのですが、その値はいくつなのでしょうか?
「ディレクトリ数の指定パラメータ」というくだりが いまいち
よくわかりませんが、要は
      % tar cf /foo/bar.tar .
だとエラーにならないのに、
      % tar cf /foo/bar.tar ./*
だとエラーになるのはなぜか、ということでしょうか?

であれば
      http://www.jp.freebsd.org/QandA/HTML/2111.html
をどうぞ。

ちなみに ARG_MAX は FreeBSD なら 64KB ですが、Solaris は
1MB です。手元の Linux マシンを見てみると 128KB でしたが、
ディストリビューションごとに異なる可能性はあります。

No. 3367 # 68user 2003/10/14 (火) 17:38:30
>>3365 /tk
> を読んだ後に cgi-ml で得た情報をコッチにも提供して欲しい気持ち。
      http://script.lovely.to/bbs/infolng.cgi?print+200309/03090012.txt
には報告して、こっちには報告してくれないのは嫌われている
からでしょうか。

って、どうせもう読んでないだろうからどうでもいいんですが。

最近は返事がなくても、クイズのつもりで回答しています。
悟りの境地に達したのかもしれない。

>> my ($ID, $name, $old) = split($_, '<>');
> split の引数が逆ですぜ。
おっと失礼しました。
      my ($ID, $name, $old) = split('<>', $_);
ですね。
  

No. 3368 # gaji 2003/10/14 (火) 19:40:36
ftp上のlsの挙動に関する質問です。
ftpサーバのOSはSolaris9です。
Bシェルでクライアント側のプログラムを作成しています。
ftp上で下記のようにワイルドカードでファイルを指定し、その結果をlsresult.txtファイルに出力しようとしています。

ftp>ls ?????.txt lsresult.txt


しかし、?????.txtに該当するファイルが無いと、クライアント側にはlsresult.txtファイルが作成されません。
様々な挙動調査の結果、lsを行うディレクトリがrootユーザーのものだとlsresult.txt自体が作成されませんが、一般ユーザーだと0バイトのlsresult.txtが作成されるという挙動の差異がありました。
lsに該当するファイルがなかった時に表示される「No such file or directory」というメッセージがlsresult.txtに出力される事を期待していますが、そのメッセージが応答されていないようです。
また、プログラムからでなく、コマンドラインから同じ事をしても同様の挙動でした。
なお、Solaris8等の他のマシンで動作確認したところ、lsに該当するファイルが無い場合には、lsresult.txtに「No such file or directory」のエラーメッセージが出力されました。
エラーメッセージの出力に関する設定、ftpdの違い、OSの違い等、疑うところはいろいろあるのですが、ftp上のls自体は機種等の環境に依存してしまうものでしょうか。
上記の説明で何が問題か分かりますでしょうか。
よろしくお願い致します。

No. 3369 # 68user 2003/10/14 (火) 20:12:08
>>3368 gaji
ftp サーバの OS は Solaris9 だと言うことはわかりましたが、
クライアント側の環境は何ですか?

ftp プロトコル自体には結果をファイルに落とすかどうかという
やりとりはありません。よって、ファイルに落とすか処理を行なう
のはクライアント側です。まずはクライアント側の環境を疑った
方がよいと思います。

> lsを行うディレクトリがrootユーザーのものだとlsresult.txt自体が
> 作成されませんが、一般ユーザーだと0バイトのlsresult.txtが作成
> されるという挙動の差異がありました。
「ls を行うディレクトリ」というのは、
        ftp> cd /hoge
        ftp> lcd /fuga
        ftp> ls ?????.txt lsresult.txt
としたときの「/hoge」のことを指していますか? それとも「/fuga」の
ことを指していますか?

また、ftp クライアントを実行するユーザの違いで挙動が変わりますか?

No. 3370 # gaji 2003/10/14 (火) 20:44:36
>>3369 68user
早速回答いただきましてありがとうございます。
今、お答えできる情報のみで申し訳ありませんが回答致します。

>ftp サーバの OS は Solaris9 だと言うことはわかりましたが、
>クライアント側の環境は何ですか?
Solaris2.6です。

>「ls を行うディレクトリ」というのは、
> ftp> cd /hoge
> ftp> lcd /fuga
> ftp> ls ?????.txt lsresult.txt
>としたときの「/hoge」のことを指していますか? それとも「/fuga」>のことを指していますか?
/hogeの事を指しております。

クライアント側は同じ状態にしておいて、FTPサーバ側をいろいろ変えて挙動が変換するので、サーバ側の問題かと思っていましたが、クライアント側も調べてみます。

No. 3371 # gaji 2003/10/15 (水) 21:58:03
>>3370 gaji
ftpのlsを調査した結果、以下の事が分かりました。
---------Solaris8がFTPサーバの時----------------------------
ftp> ls ?????.txt local.txt
200 PORT command successful.
150 ASCII data connection for /bin/ls (192.168.122.8,45207) (0 bytes).
226 ASCII Transfer complete.
local: local.txt remote: ?????.txt
49 bytes received in 0.012 seconds (3.90 Kbytes/s)
---------Solaris9がFTPサーバの時----------------------------
ftp> ls ?????.txt local.txt
200 PORT command successful.
550 ?????.txt: No such file or directory.

Solaris8のケースでは、/bin/lsによって処理されて、該当ファイルが存在しなくてもlocal.txtが作成され、中にエラーメッセージが出力されました。
Solaris9のケースでは、/bin/lsを使用していない?様です。
ftpdの内部コマンドで処理されているのでしょうか。
この場合は、local.txtが作成されていません。
ちなみに、ftp上でls -a等を行うと、Solaris8,9共に/bin/lsで処理されているようです。
lsとls -aでは、FTPプロトコルはNLSTとLISTのように違うと思いますが、インターネットで調べた限りでは「ls -aやdirなどは/bin/lsで処理され、lsはftpdの内部コマンドで処理される事が多い。」との記述がありました。しかし、今回のケースではSolaris8でのlsは/bin/lsで処理されているようです。ftpのNLSTが内部コマンドを使用するか、/bin/lsを使用するかは設定可能なものでしょうか。
もし、Solaris9でのlsも/bin/lsを使用するように設定変更可能なものであれば、設定変更して動作検証したいと思います。
もし、ご存知でしたらご教授いただきたいと思います。

No. 3372 # 68user 2003/10/16 (木) 00:22:37
>>3371 gaji
なるほど、ftpd の挙動が変わったのですね。

> ls -aやdirなどは/bin/lsで処理され、lsはftpdの内部コマンドで
> 処理される事が多い。
そういう実装が多かった、というのは確かかもしれません。
ただ、ProFTPD のように /bin/ls に一切頼らない ftp
サーバもありますので、あくまで「多かった」という程度
だと思います。

> ftpのNLSTが内部コマンドを使用するか、/bin/lsを使用するかは
> 設定可能なものでしょうか。
Solaris8, Solaris9 の ftpd を見る限りでは、そのような
設定はできないようです。
    http://www.freebsd.org/cgi/man.cgi?query=ftpd&&manpath=SunOS+5.8&format=html
    http://www.freebsd.org/cgi/man.cgi?query=ftpd&&manpath=SunOS+5.9&format=html

> ftp> ls ?????.txt local.txt
> 200 PORT command successful.
> 550 ?????.txt: No such file or directory.
もしクライアント側が LIST を発行しているとしたら
(ftp -d で確認できます)、LIST に対して 550 を返すのは
RFC 違反ではないかなぁと思いました。

      http://hp.vector.co.jp/authors/VA002682/rfc959j.htm より引用

      以下の表では、それぞれのコマンドごとの成功・失敗の応答を一覧表にしてあ
      る。これらは、確実に忠実でなくてはならない。サーバーは応答中の文章を変更
      してもよいが、その意味、コード番号により示される動作と指定されたコマンド
      応答シーケンスは変更してはならない。

      コマンド応答シーケンス
              LIST
                    125, 150
                          226, 250
                          425, 426, 451
                    450
                    500, 501, 502, 421, 530

この解釈が正しいなら、Sun に文句を言えば直してくれる
かもしれません。

ただ、ftp は規格が曖昧で、実装依存の塊みたいなものなので、
ls してクライアント側で grep した方が後々のためにもよい
かもしれません。ファイルに落として grep するとか、
      ftp> ls . "|grep ^.....\.txt$ >hoge"
とするとか。

No. 3373 # yoshi 2003/10/16 (木) 23:23:36
>>3361 68user

68userさんのご助言通り、
ftpサーバをPCに入れてみました所、上手くいきました。
ありがとう御座いました!

No. 3374 # とーりすがり 2003/10/20 (月) 17:13:15
>>3371 gaji
確か、Solaris9からwu-ftpdベースになっている筈です。

以下man ftpaccess(4)から...
/etc/ftpd/ftpaccess
lslong /usr/bin/ls
lsshort /usr/bin/ls
lsplain /usr/bin/ls

上記3行を追加してみては如何でしょうか...
外していたらごめなさい。
ではでは

No. 3375 # gaji 2003/10/21 (火) 19:22:13
>>3374 とーりすがり
情報の提供ありがとうございます。
試してみたいと思います。
>確か、Solaris9からwu-ftpdベースになっている筈です。
これは、私も何かの書籍で見た記憶があります。
また、何か情報がございましたらお願いします。

No. 3376 # 新米 2003/10/22 (水) 01:15:16
イーサカード(hme等)のインスタンス番号についてご教授ください。
hme0と認識されているカードをカード実装位置を変えずにhme5のようにインスタンス番号のみ変更することは可能でしょうか?

No. 3377 # foofoo 2003/10/22 (水) 16:02:09
送信サーバ認証が不要な SMTPサーバではサーバ外メール送信は実現できています。
しかし、送信サーバ認証が必要な SMTPサーバではサーバ外メールを送信できません。(Outlook Express ではサーバ外メール送信OK)

SMTP AUTH と POP Before SMTP を試しました。

SMTP AUTH は NONE-SUPPORT のメッセージが返りました。

POP Before SMTP として、POPサーバに USER と PASS コマンドを使い認証を受けた後(正常終了)で QUIT の直後に、SMTPサーバ にconnectし、HELO, MAIL FROM: とコマンドを送信し、RCPT TO: で 550 5.7.1 と Relay エラーを出してしまいます。

POP Before SMTP を実現するためのコマンドシーケンスを教えてください。

VC++ 6.0 Windows98SE

宜しくお願い致します。

No. 3378 # リダイレクションを引きとして渡す 2003/10/22 (水) 20:48:05
関数にリダイレクションを引数として渡したいのですが
どうも上手くいきません。ご教示お願いいたします。(OS:HPUX)

KANNSUU(){
echo "A" $1 tmp.txt
}

KANNSUU >

結果:"A > tmp.txt"と表示されてしまう。

No. 3379 # 68user 2003/10/22 (水) 21:24:53
>>3374 とーりすがり
> 確か、Solaris9からwu-ftpdベースになっている筈です。
おお、ほんとうですね。
      http://docs.sun.com/db/doc/816-3965/6ma7896j8?l=ja&q=wu-ftpd&a=view
知りませんでした。

ってゆーか、まわりに Solaris9 環境がなかったりするんですけどね。

>>3376 新米
> hme0と認識されているカードをカード実装位置を変えずにhme5の
> ようにインスタンス番号のみ変更することは可能でしょうか?
(Solaris かどうか書いてないのでわかりませんが) Solaris の
ifconfig はいろんな設定ができるので、できるかもしれませんし、
できないかもしれません。

>>3377 foofoo
> POP Before SMTP を実現するためのコマンドシーケンスを教えてください。
POP でアクセスすればそれでよいはずです。


その前に、調べ方が効率悪すぎです。

まずはサーバがどういう認証方法を取っているか調べましょう。それが
できないなら、ethereal などのパケットアナライザを使って、Outlook が
どういうふうに接続しているか調べましょう。


>>3378 リダイレクションを引きとして渡す
eval を使って
      KANSUU(){
          eval "echo 'A' $1 tmp.txt"
      }
とします。しかし、そのうちメッセージやファイル名に空白や
シングルクォート・ダブルクォートが入ってたら〜とかいう
話になると思うので、
      KANSUU(){
          if [ $2 = 0 ]; # file 出力モード
                echo $1 > tmp.txt
          else # 標準出力モード
                echo $1
          fi
      }
的な書き方をお勧めしておきます。

No. 3380 # foofoo 2003/10/23 (木) 02:09:44
>>3379 さん、ありがとうございました。

> POP でアクセスすればそれでよいはずです。

何かが悪いのでしょうが、前の記述通り、POP から SMTP の切替て RCPT TO:で 550 が発生してしまいます。

うまく行っている Outlook を ethereal でトレースしようと思います。
ethereal のようなトレースツールも知りたかったので大変うれしく思っています。
早速 ethereal をダウンロードしてトレースしてみます。

テスト後ご報告致します。

foofoo

No. 3381 # foofoo 2003/10/23 (木) 14:10:56
>>3379 68user
68userさん、大変ありがとうございました。

etherealを使いトレースしたところ、Outlook Expressは、POP Before SMTP ではなく、AUTH LOGIN コマンドを使っていることがわかりました。

< EHLO xnn000<CR><LF>
> 250
< AUTH LOGIN
> 334,334,235
< MAIL FROM:
> 250
      :
      :

Outlook Expressと同じ手順でOKにはなりました。

新たに不明な点が出てきました。
AUTH LOGIN の前に発行するEHLO に不明なアドレスのパラメータがついていました。
そのアドレスは、レジストリーで調査してもWindowsに設定されたアドレスでもなく、Outlook Express の設定の中にも無い下記のようなアドレスでした。
EHLO xnn000<CR><LF>
  注:x:a〜zまでの内の1文字 nn:00〜99までの数字

所持メールアドレスは、送信メールサーバで認証の必要なものは1つしか持ち合わせがないため、他のメールサーバの時にどうなるかを確認できません。

このアドレスの根拠についてご存知の方、教えてください。

宜しくお願いします。

No. 3382 # foofoo 2003/10/23 (木) 14:14:38
>>3381 foofoo
記載ミス

失礼しました、コマンドを統一表記していませんでした。
EHLO 以外も、Trailer として <CR><LF> は全て付加されています。

No. 3383 # ふくし [E-mail] 2003/10/23 (木) 15:17:40
お久しぶりです。質問です。
さいきん MovableType に手を染めたのですが、
結構快調に使えていたんですが、rebuild 時に
500 Internal Server Error になるようになりました。
ずっとエラーになっても、再構築はできてたっぽかったんですが、
このたびついに再構築じたいできなくなりました。
(いつまでたっても古いページのまま)

ドキュメントを見ると index.html を index.html.new に
退避してから書き込み動作を行い、
それが終わったら new を index.html に変名するような仕様に
なっているが、この場合 mt ルートディレクトリののパーミッションが
777 になってないといけない、とあったので、
みてみると、たしかに 755 だったので、777 にすると、
今度は書き込み動作をしようとするといきなり 500 になりました。

あわてて 755 に戻すと、書き込み動作時のエラーはなくなりましたが、
相変わらず再構築時にエラーになります。
で、ドキュメントに、index.html.new を作らない設定にするには
mt.cfg の NoTempFiles 1 を非コメント化するようにと言われたので、
しましたが、効きません。

なお、ルートには確かに index.html と index.html.new があって、
index.html のタイムスタンプは最後に再構築できたときです。
パーミッションは両方 666 です。
Perl は 5.005_03、
UNIX は FreeBSD 4.5-RELEASE-p36 #2
です。何かわかりましたら教えてください。
あと、板違いの場合はよさげな板を教えてくだされば幸甚です。
よろしくお願いします。

No. 3384 # ふくし [E-mail] 2003/10/23 (木) 15:29:33
<<3383
ティピカルな問題かも。
http://www2h.biglobe.ne.jp/~hnakamur/technolab/diary/2003/20030810.htm

system 'ulimit'; とかどっかに入れたろか ;;;

No. 3385 # 68user 2003/10/23 (木) 18:49:51
>>3381 foofoo
> EHLO xnn000<CR><LF>
> 注:x:a〜zまでの内の1文字 nn:00〜99までの数字
これについてはわかりません。
        http://www.puni.net/~mimori/smtp/ref.html#ehlo
には
        SMTPサーバは、実際にはTCP/IP接続のIPアドレスなどの情報から
        クライアントを識別すべきである。
とあるので、Outlook Express はあえて適当なホスト名を生成して
いるのかもしれません。

自分の FQDN を知っているならそれを、知らないなら IP アドレスを
渡しておけばいいのではないでしょうか。


>>3383 ふくし
> rebuild 時に 500 Internal Server Error になるようになりました
これだけでは「理由はわからないがエラーになる」と言っているのと
同じなので、原因を調べましょう。

    - web サーバのエラーログには何と出ているか
    - CGI として起動したときの truss や ktrace の結果はどうなるか
    - コマンドラインから実行するとこけるか

もし原因が limit である可能性が濃いなら、さらに以下のことを
調べましょう。

    - CGI として起動したときの limit 値は
        (apache なら設定ファイルに書いてあるかも)
    - コマンドラインから起動したときの limit 値 (シェルの limit 値) は
    - ソフトリミットか、ハードリミットか (ハードリミットなら変更不可)
    - suid などで他の権限になれるか。なれるとしたらそのリミット値は?
    - なぜこけるのか。
            手元の Solaris で試した限りでは、
                - datasize の制限なら、malloc(3) して、brk(2) したときに
                    ENOMEM が返ってきてこける
                - stacksize の制限なら、segmentation fault でこける。
            となりました。FreeBSD でも同じかどうかはわかりません。

> system 'ulimit'; とかどっかに入れたろか ;;;
これだと子プロセスのシェルの limit 値は変わるかもしれませんが、
自分自身の limit 値は変わりません。

CPAN から setrlimit(2) するライブラリを拾ってくるか、自分で
syscall で呼ぶ必要があります。

# ただし、ハードリミットならどうしようもありません。

No. 3386 # ふくし 2003/10/23 (木) 21:27:25
>>3385 68user
さん、いつもありがとうございます。
すみません、レンタルサーバー(さくらウェブ)が
ログを見せてくれません。
telnet は使えるので、もう少しいろいろやってみます。
検索した限りでは同じサーバーで同病の人が多いので
制限のようですが、どのレベルでの制限かはまだわかりません。

No. 3387 # foofoo 2003/10/24 (金) 11:18:10
>>3385 68user
68user さん、ありがとうございました。
コメントを参考に対処していきます。

No. 3388 # peace 2003/10/25 (土) 23:20:56
fork関数とselect関数の違いが分かりません。誰か教えてくれませんか?

No. 3389 # 68user 2003/10/25 (土) 23:24:31
>>3388 peace
fork は子プロセスを生成します。
select は複数の入出力インタフェースを監視するものです。

No. 3390 # peace 2003/10/26 (日) 12:00:38
selectは親プロセス、子プロセスが存在しないのですか?

No. 3391 # 68user 2003/10/26 (日) 12:28:31
>>3390 peace
select は複数のプロセスを扱うためものではなく、1 つの
プロセスが複数のソケット (*1) を同時に扱うためのものです。

たとえば
    http://www.goo.ne.jp
    http://www.yahoo.co.jp
    http://www.asahi.com
を読みたいが、時間短縮のため 3サーバ同時に接続したい、という例が
    http://x68000.startshop.co.jp/~68user/net/http-parallel-1.html
にあります。

ここではプロセスはひとつしか出てきませんが、ソケットは 3つ
使用しています。

*1: 本当はファイルディスクリプタ

No. 3392 # peace 2003/10/26 (日) 14:01:54
ありがとうございました。

No. 3393 # doronjo [E-mail] 2003/10/27 (月) 10:16:36
以下のコマンドの意味が解りません。よろしくお願いします。
jobschmsgevent

jobschcontrol

if ( -f ./renkei.zip ) thenの中の-f ./

No. 3394 # Netboy 2003/10/27 (月) 10:53:24
>>3393 doronjo
jobなんたらは判らないのですが,-fはファイルテスト演算子です.
./renkei.zipがファイルとして存在するとき真を返します.
./は相対パスでrenkei.zipが実行中のスクリプトと
同じディレクトリにあることを示します.

68userさん
hosts.allowの件いかがですか.
どうにもなりませんか...

No. 3395 # 68user 2003/10/27 (月) 13:38:09
>>3393 doronjo
> jobschmsgevent
> jobschcontrol
Systemwalker のコマンドのようですね。付属のマニュアルを
読みましょう (わたしは Systemwalker を持ってないので
わかりません)。

>>3394 Netboy
> hosts.allowの件いかがですか.
ああああすいません、すっかり忘れていました。本日中には必ず。

No. 3396 # doronjo 2003/10/28 (火) 13:10:35
68userさん、ありがとうございました。

No. 3397 # しんさん 2003/11/06 (木) 11:17:37
はじめまして。
LINUX上にて複数のGIFファイルを1つのPDFファイルに
変換指定のですが…。
とりあえず convert コマンドでできますかね…?
こんな感じで…
  convert abc*.gif newfile.pdf

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