68user's page 掲示板

Prev< No. 3620〜3720> Next  [最新発言に戻る] [過去ログ一覧]
No. 3620 # バンガード [URL] [E-mail] 2004/03/12 (金) 19:13:45
>>3616 68user
現在expectで対応する方向で準備中です。
ありがとうございました。

No. 3621 # バンガード [URL] [E-mail] 2004/03/12 (金) 19:17:53
度々申し訳ございません。
今度はkshで教えてください。

======= test_file ========
aix4-r1
aix4-r2
aix4-r3
aix4-r4
aix3-r1
aix3-r2
aix3-r3
aix3-r4
aix2-r1
aix2-r2
aix2-r3
aix2-r4
======= test.ksh ========
#!/usr/bin/ksh

file="test_file"

nawk '{
                if ( (substr($0,1,4) == "aix4") )\
                {\
                                printf "TRUE:%s\n",$0; \
                }\
                else {\
                                printf "FALSE:%s\n",$0; \
                }\
}' $file

上記の様に文字列の先頭数文字のみを見て一致するかの判定を行いたいのですが、ksh単体での実現方法が分からず苦労しています。
やはり、上に示したようにawkを使用して、その中でsubstr関数を使用するしかないでしょうか?

本当に基本的なことで申し訳ございませんが、よろしくお願い致します。

No. 3622 # 68user 2004/03/12 (金) 22:12:33
>>3621 バンガード
こんな感じですかね。

while read line; do
        prefix=${line%-r[0-9]}
        if [ "$prefix" = "aix4" ]; then
                echo "TRUE:$line"
        else
                echo "FALSE:$line"
        fi
done < test_file

No. 3623 # バンガード [URL] [E-mail] 2004/03/15 (月) 09:51:21
>>3622 68user
> prefix=${line%-r[0-9]}
> if [ "$prefix" = "aix4" ]; then
これだと、私が例で示させていただいたパターンにしか対応できませんよね。(そういう意味では私の示した例が悪かったですね)
これを「aix4-r23,aix-r4x3」なども「一致」と見るような方法は無いでしょうか?
たとえば、以下のようなif文は無理でしょうか?
if [ $line = "aix4"* ]; then

No. 3624 # 68user 2004/03/15 (月) 10:41:45
>>3623 バンガード
> 「aix4-r23,aix-r4x3」なども「一致」と見るような方法は無いでしょうか?
> if [ $line = "aix4"* ]; then
aix4* では aix-r4x3 はマッチしないように見えますが、
またしても不適切な例ではありませんか?

> if [ $line = "aix4"* ]; then
if ではできませんが、case ならできます。

while read line; do
    case $line in
        aix4*)
            echo aix4
        ;;
        aix5*)
            echo aix5
        ;;
        *)
            echo others
        ;;
    esac
done < test_file

No. 3625 # バンガード [URL] [E-mail] 2004/03/15 (月) 12:55:51
>>3624 68user
>aix4* では aix-r4x3 はマッチしないように見えますが、
>またしても不適切な例ではありませんか?
おっしゃるとおりです。
重ね重ね申し訳ございません。

>if ではできませんが、case ならできます。
なるほど、caseでなら「aix4*」が可能ですか。
助かりました。

No. 3626 # 裏方 [E-mail] 2004/03/15 (月) 16:35:44
初めまして、裏方と申します。
WinSockを用いたウィンドウズネットワークプログラムで、インター
ネットを介して、私のマシン名からIPアドレスを取得する方法に
ついて悩んでいます。言語はC言語を扱っております。

ローカルネットワークではマシン名からIPアドレスを取得するには
Gethostbyname関数で取得できるのですが、インターネットを介した
遠方のマシンのから私のマシンのIPアドレスを取得する事が出来ま
せん。(私のはサーバマシンでは無いので当然なのですが・・・)

私のマシンは大学で扱っているもので、ネットワークに繋ぐたびに
動的なIPアドレスが割り当てられるのですがサーバプログラム等を
私のマシン上で動かすときにいちいち相手に今のIPアドレスを教え
なければならないので非常に不便です。

どうにかして、私のマシン名からIPアドレスを取得する方法が
あるのでしょうか?どなたかアドバイスをお願いします。

No. 3627 # 68user 2004/03/15 (月) 16:58:12
>>3626 裏方
- 逆引きできないから困っているの?
    (もしそうなら「マシン名」というのは何?)
- IP アドレスがころころ変わるから困っているの?
    (もしそうなら「マシン名」は関係ないのでは?)
- そもそもマシン名って何を指しているの? FQDN?
- DHCP で振られる IP アドレスには FQDN が設定してあるが、
    外部向け DNS サーバには登録してなくて、内部からしか逆引き
    できない、という状況?

などなど疑問はつきませんが、http://www.dyndns.org/ などの
DynamicDNS と呼ばれるサービスを使うのが一つの解でしょう。

ただしこれは、大学とは全く関係ない FQDN を、大学から付与されて
いる IP アドレスに結びつけるということです。管理者が寛容である
ことを期待するか、リスクを負ってこっそりやるのがよいでしょう。

No. 3628 # Tangerine 2004/03/15 (月) 17:11:48
始めまして、UNIX使い始めです。
この度、awkコマンドを使用してファイルを分別して削除するシェルを作成しているのです。

そこでお聞きしたい事がるのです
awkコマンドのifなどの中で変数は使えないのでしょうか?

現在全ファイルに作成日付が付加されており、
指定日より前の物を削除したいいのです
シェルの前半で指定日付を変数へ代入し
lsとawkをパイプで繋いで削除しようとしています
awk内のifなどによる条件判断で変数を宣言すると$0のメンバー名全体が表示されており判別できないのです
(ifを削除しprintで変数を表示させて確認)

出来ないのであれば何か別の方法を考えなくてはいけないのですが
何方かお答えください

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

No. 3629 # zsh 2004/03/15 (月) 17:50:12
>>3628 Tangerine
具体的にどのようなスクリプトなのか見せて頂けませんか?
(そもそもawkを使う必要があるのでしょうか?)

No. 3630 # Tangerine 2004/03/16 (火) 11:02:40
返信遅れてすいません。
えっと、確かに自分もawkを使う必要があるのか微妙ですが

#! /usr/bin/sh

make_date=`date +"%Y%m%d"`
make_date=`echo $make_date"-1" | bc`
echo $make_date
ls *.*.* | awk -F. '{if($2<make_date) print $0}'

問題としているのはこのあたりです。
変数make_dateに昨日の日付けが入り、
それ以前のものを表示させたいのです。

正直なところを言えばawkを使う必要性はまったくといってないです
ただ、自分が色々調べた結果awkを使ってやれば出来るのか?
と、考えて使ってみただけですので

awkじゃなくて別の方法で行えるのであれば
御教授いただけると嬉しいです。

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

No. 3631 # zsh 2004/03/16 (火) 12:48:26
>>3630 Tangerine
単純に昨日以前のファイルを表示するのであればこんな感じで。
(ファイルが無い時を考えるとls使った方がいいのかな?)
------
#!/bin/sh

make_date=`date '+%Y%m%d'`
for f in `echo *.[0-9]*.*` ; do
    d=`echo $f | cut -d. -f2`
    [ $d -lt $make_date ] && echo $f
done
------

awkを使うのであればこんな感じかな。
実装されているawkによって変数の設定の仕方が違うので注意してください。
------
#!/bin/sh

make_date=`date '+%Y%m%d'`
ls *.[0-9]*.* | awk -F. '{if($2 < d) print}' d=$make_date

No. 3632 # Tangerine 2004/03/16 (火) 13:56:36
>>3631 zsh
おおっ!!有難う御座います(T▽T)
なるほど、forですね。なんとも勉強不足でした(^^;
やはりawkでは変数をそのまま引き継げないのですね
awk内で更に変数に入れ込まなければいけないとは(^^;
有難う御座います
教えていただいた方法で作成していきます。
本当に助かりました(w

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

No. 3633 # 68user 2004/03/16 (火) 14:15:32
>>3632 Tangerine
> やはりawkでは変数をそのまま引き継げないのですね。
そういうわけではありません。

> ls *.*.* | awk -F. '{if($2<make_date) print $0}'
awk はどういう引数が欲しいか、というと
      awk -F. '{if($2<$make_date) print $0}'

      awk -F. '{if($2<make_date) print $0}'
ではなくて、
      awk -F. '{if($2<20040315) print $0}'
となってほしいわけです。

で、こうなるように書くにはどうすればよいか。

[方法1]
まず
      awk -F. '{...}'
と '' で囲ってはいけません。'' で囲った時点で中に入っている
変数が展開されなくなります。というわけで、
      awk -F. "{...}"
と "" で囲みます。これで中の変数が展開されます。しかし
      awk -F. "{if($2<$make_date) print $0}"
と書いてしまうと、$2 や $0 まで展開されてしまいます。$2 や $0 は
awk にそのまま渡したいので、
      awk -F. "{if(\$2<$make_date) print \$0}"
と \ でエスケープします。

[方法2]
方法1 のエスケープがうっとうしいなら、まず
      awk -F. '{...}'
と '' で全体を囲みます。そして狙いのところだけ '' の外に出します。例えば
      awk -F. '{if($2<'$make_date') print $0}'
こんな感じ。つまり
      'x'$y'z'
という形にするわけですが、これは 'x' + $y + 'z' というふうに結合されるので
うまく動きます。

いずれの場合であっても、
      % sh -x hoge.sh
と -x オプションを付け、変数が狙い通り展開されているかどうか
チェックする癖をつけましょう。

No. 3634 # Tangerine 2004/03/16 (火) 14:52:46
なるほど〜、ややこしい事になっていたのですね〜
おかげさまで希望の日付以前のファイルを削除することが出来ました、
有難う御座います。

追伸
>% sh -x hoge.sh
使うようにしてみます(^^;

No. 3635 # zsh 2004/03/16 (火) 18:53:22
>>3633 68user
その方法があることをすっかり忘れてました。
(というか使った試しが無い・・・反省)
いつもながら勉強になります。

No. 3636 # tomato 2004/03/19 (金) 18:06:05
初めまして、Perl初心者です。
Socketを使ってUDPのプロキシ機能を作りたいのですが、
Send関数のあて先の指定で、inet_atonを使わずに指定
する方法がわかりません。というのも、あて先IPアドレスは
分かっているのですが、/etc/resolv.confには記述されて
いないからなのですが。
やっぱりinet_aton関数を使ってホスト名からIPアドレスを
取得しないとダメなのでしょうか?
どなたか教えてください。
環境は、Solaris8 、perl5 です。
今はこんな感じなのですが、、、

socket(SOCKET, PF_INET, SOCK_DGRAM, 0);
$ip = '192.168.253.155';
$sock_addr = pack_sockaddr_in(2426, $ip);
send(SOCKET, "test", 0, $sock_addr);

No. 3637 # 68user 2004/03/19 (金) 18:36:10
>>3636 tomato
inet_aton には IP アドレスも渡せます。なので、
    socket(SOCKET, PF_INET, SOCK_DGRAM, 0);
    $ip = '192.168.253.155';
    $iaddr = inet_aton($ip);
    $sock_addr = pack_sockaddr_in(2426, $iaddr);
    send(SOCKET, "test", 0, $sock_addr);
でよいです。

    http://x68000.startshop.co.jp/~68user/net/func.html#inet_aton
ではホスト名しか渡せないような書き方をしていますので、ちょっと
不適切でした。

そもそも、C 言語での inet_aton の機能は、
      aaa.bbb.ccc.ddd という文字列を解析し、in_addr 構造体に格納する
というもので、名前解決は行いません。一方、perl の Socket パッケージの
inet_aton は、ホスト名も受け付けるように機能拡張されているわけです。

No. 3638 # バンガード [URL] [E-mail] 2004/03/19 (金) 23:25:32
    また初歩的なことで申し訳ありません。
    以下のプログラムで、13行目以降で配列(CMD)の内容を表示させて
いるのですが、全てNULLになってしまいます。

        +1 #!/usr/bin/ksh
        +2 INDEX=0
        +3 TEST=`ls -l |
        +4 while read LINE
        +5 do
        +6 CMD[$INDEX]=$LINE
        +7 echo $INDEX":"${CMD[$INDEX]}
        +8 let "INDEX = INDEX + 1"
        +9 done`
      +10 echo "$TEST"
      +11
      +12 INDEX=0
      +13 while [ $INDEX -lt 5 ]
      +14 do
      +15 echo $INDEX":"${CMD[$INDEX]}
      +16 let "INDEX = INDEX + 1"
      +17 done

    このプログラムの3行目から10行目を以下の様に修正すれば、13行目
以降でも配列の中身が正常に表示されます。
        +3 ls -l |
        +4 while read LINE
        +5 do
        +6 CMD[$INDEX]=$LINE
        +7 echo $INDEX":"${CMD[$INDEX]}
        +8 let "INDEX = INDEX + 1"
        +9 done
      +10

    最初のプログラムの様に、最初のループの結果を変数にセットする
場合で、ループから出た以降も配列の中身を保つ方法は無いでしょう
か?

No. 3639 # zsh 2004/03/21 (日) 22:59:40
>>3638 バンガード
バッククォーテーションでくくると別プロセスになるから
変数を保持することはできないと思いますが・・・

No. 3640 # 68user 2004/03/22 (月) 14:19:23
>>3638 バンガード
> このプログラムの3行目から10行目を以下の様に修正すれば
この修正ではなぜダメなのか理由を書いていただかないと、代案が出せないです。

No. 3641 # バンガード [URL] [E-mail] 2004/03/22 (月) 14:51:49
>>3640 68user
3行目から10行目の修正ですとwhile文の出力は標準出力へ出て行くだけです。
これを最初のプログラムの様にwhile文の出力を変数に格納したいと考えています。

No. 3642 # 68user 2004/03/22 (月) 15:27:00
>>3641 バンガード
> while文の出力は標準出力へ出て行くだけ
それは echo しているからでは? echo しなければ OK かと思います。

> while文の出力を変数に格納したいと考えています
修正版の方でも CMD[$INDEX]=$LINE と格納しているように見えます。
また、ループを抜けた後でも参照が可能だと思います。

No. 3643 # バンガード [URL] [E-mail] 2004/03/22 (月) 16:12:09
>>3642 68user
まず、3行目から10行目を修正した場合の結果は以下の通りです。
0:合計 7
1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4
5:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test5
6:-rw-r--r-- 1 furu man 4 Mar 22 16:01 test6
7:-rw-r--r-- 1 furu man 20 Mar 22 16:02 test7

0:合計 7
1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4

次に3行目から10行目を修正しない場合の出力結果です。
0:
1:
2:
3:
4:

ちなみに7行目のecho文をコメントにしても結果は同じです。

この様にwhile文をダブルクォーテーションで囲むかどうかでwhile
文を抜けた後で配列を参照できるかが異なってきます。

No.3639でzshさんが回答されている様にダブルクォーテーションで囲んでいるために別プロセスになってしまうのが原因の様です。
whileの出力を変数に格納した上で、whileから抜けた後も配列の内容が参照出来る様にするにはどうしたら良いのでしょうか?

No. 3644 # 68user 2004/03/22 (月) 17:05:31
>>3643 バンガード
> ちなみに7行目のecho文をコメントにしても結果は同じです。
わたしはありえないと思いますが、そういう ksh もあるんですかね。
当方の HP-UX11i で
    #!/usr/bin/ksh
    INDEX=0
    ls -l |
    while read LINE; do
        CMD[$INDEX]=$LINE
        let "INDEX = INDEX + 1"
    done
    INDEX=0
    while [ $INDEX -lt 5 ]; do
        echo $INDEX":"${CMD[$INDEX]}
        let "INDEX = INDEX + 1"
    done
というのスクリプトを実行したところ、
    0:合計 7
    1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
    2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
    3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
    4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4
というような、先頭 5 行分だけの出力が得られました。

No. 3645 # バンガード [URL] [E-mail] 2004/03/22 (月) 19:34:47
>>3644 68user
御提示いただいたシェルなら当方(AIX 5.1)でも同様の結果が出
ます。

以下の様に修正した場合に配列の中身が2つ目のwhile文で出力され
なくなります。
        #!/usr/bin/ksh
        INDEX=0
        TEST=`ls -l |
        while read LINE; do
                CMD[$INDEX]=$LINE
                let "INDEX = INDEX + 1"
        done`
        INDEX=0
        while [ $INDEX -lt 5 ]; do
                echo $INDEX":"${CMD[$INDEX]}
                let "INDEX = INDEX + 1"
        done

No. 3646 # 68user 2004/03/23 (火) 01:56:23
>>3645 バンガード
> 御提示いただいたシェルなら当方(AIX 5.1)でも同様の結果が出ます。
そうでしょうね。

> 以下の様に修正した場合に配列の中身が2つ目のwhile文で出力されなくなります。
そうなりますね。`〜` とするとサブシェルが起動されますから、
$CMD が設定されるのはサブシェルだけで、親のシェルには反映
されません。

質問を続ける目的が全く見えません。>>3644 のスクリプトは >>3641
の希望を満たしているように見えますが違うのですか? まだ説明して
いない理由があって、>>3644 は採用できないのですか?

No. 3647 # バンガード [URL] [E-mail] 2004/03/23 (火) 03:49:34
>>3646 68user
>質問を続ける目的が全く見えません。>>3644 のスクリプトは >>3641
の希望を満たしているように見えますが違うのですか? まだ説明して
>いない理由があって、>>3644 は採用できないのですか?
3644のスクリプトでは、最初のwhile文の出力を変数に格納していません。
この形式であれば、最初の私の質問で御提示させていただいている通りで
す。(3行目から10行目を修正したもの)
次に質問を続ける理由ですが、3642で「echo しているからでは?
echo しなければ OK かと思います。」
「ループを抜けた後でも参照が可能だと思います。」と回答されているの
で、そんなことは無いと言うことで3643の回答をしています。

それに対して、3644で「わたしはありえないと思いますが」とお答え
いただいていますよね?
ですから、それに対しての回答で3645の回答をさせていただいていま
す。

3642の回答が無ければ、3639の回答で「なるほど」と納得していた
のですが、3640で「なぜだめなのか?」と言う事ですので状況を説
明させていただいている次第です。

結局3640の回答にある通り、バッククォーテーションで囲んでいる
ために別のジョブとして起動されるためにwhileから抜けた後で配
列を参照できないのですよね。

私としては最初のwhile文での出力を変数に格納した上でwhile文の
外でも配列の中身を参照したいと言うのが最終目標です。
しかしながら、バッククォーテーションで囲んだ以上は別タスクに
なるために、while文の外で配列が参照できないとなれば、最初の
while文の出力をファイルに格納するしかないかと考えています。
もし、それ以外の方法があるのであれば、お教えいただけると助か
ります。

No. 3648 # 68user 2004/03/23 (火) 10:26:19
>>3647 バンガード
やっとわかりました。変数に格納って TEST=`…` のことですか。

わたしの読解力が足らないだけでしょうが、
      「変数 TEST に ls の出力全体を、CMD には 1行ずつの
          結果を代入したい」
     「このスクリプトの目的は ls の結果全体を表示しつつ、
          なおかつ先頭 5 行を表示すること」
などと書いていただければもっと早く理解できたと思われます。

で、スクリプトは以下のような感じでしょうか。

#!/usr/bin/ksh
INDEX=0
ls -l |
while read LINE; do
    CMD[$INDEX]="$LINE"
    TEST="$TEST ${INDEX}:$LINE"
    let "INDEX = INDEX + 1"
done
echo "$TEST"
INDEX=0
while [ $INDEX -lt 5 ]; do
    echo "${INDEX}:"${CMD[$INDEX]}
    let "INDEX = INDEX + 1"
done

No. 3649 # バンガード [E-mail] 2004/03/23 (火) 11:50:40
>>3649 バンガード
なるほど、全ては私の質問の書き方が原因だったのですね。
本当に申し訳ありません。
今回御指摘いただいた様な表現を最初からすべきでしたね。

御提示いただいたスクリプトで目的が達成できました。

重ね重ね誠にありがとうございました。

No. 3650 # m16 2004/03/23 (火) 13:18:33
awk(正規表現?)でちょっと行き詰まってしまったので質問します。

OS:Solaris8

やりたいこと
    環境変数の内容で awk を使ってテキストファイルの検索を行う。

検索に使用する環境変数を HOGE として

awk '/ENVIRON["HOGE"]/ {print}' FILE_NAME

を行っても検索されませんでした。
ちなみに {print ENVIRON["HOGE"]} とした場合には値が返りませんでした。

何か根本的なところで間違ってるかもしれませんが・・よろしくお願いします。

#grep $HOGE FILE_NAME とすれば出来るのですが・・awk で実現したいのです。

No. 3651 # 68user 2004/03/23 (火) 18:09:25
>>3650 m16
awk はよくわかりませんが、
      % awk '$0 ~ ENVIRON["HOGE"] {print}' FILE_NAME
ですかね。

No. 3652 # zsh 2004/03/23 (火) 18:47:06
>>3650 m16
/usr/bin配下のawkでは環境変数を参照できなかったと思います。
/usr/xpg4/bin/awkかnawkを使ってください。

% nawk '$0 ~ ENVIRON["HOGE"] {print}' FILE_NAME

No. 3653 # m16 2004/03/24 (水) 09:40:15
68user さん zsh さん レスありがとうございます。

まだうまくいきません。

確認のため
/usr/bin/awk 、/usr/xpg4/bin/awk 、 /usr/bin/nawk で
{ print ENVIRON["HOGE"] } としても空白しか出てきません。

もうちょっと修行してみます

No. 3654 # zsh 2004/03/24 (水) 10:27:06
>>3653 m16
HOGEはちゃんとexportしてますよね?

No. 3655 # すすむ 2004/03/25 (木) 12:50:36
UNIXのtarコマンドについて教えて下さい。
DATテープから任意のファイルをワイルドカード(*)で取り出したいの
ですが上手くいきません。
どのようにすれば取り出せますか。

rwxr-xr-x 0/3 0 2004年 2月 17日 20:55 ./bkup/
rw-r--r-- 0/3 3506495 2003年 6月 5日 15:48 ./bkup/200303031741data_tar.gz
rw-r--r-- 0/3 3511527 2003年 3月 17日 09:20 ./bkup/200303032300data_tar.gz
rw-r--r-- 0/3 3517092 2003年 3月 17日 09:20 ./bkup/200303042300data_tar.gz


rw-r--r-- 0/3 3511527 2003年 3月 17日 09:20 ./bkup/200312302300data_tar.gz
rw-r--r-- 0/3 3517092 2003年 3月 17日 09:20 ./bkup/200312312300data_tar.gz

このリストから200309となっているもファイルをとりだそうといろいろと
やってみたのですが、

# tar -xvf /dev/rmt/1m 200309\*data.tar.gz
# tar -xvf /dev/rmt/1m ./bkup/200309\*data.tar.gz
# tar -xvf /dev/rmt/1m './bkup/200309*data.tar.gz'
# tar -xvf /dev/rmt/1m "./bkup/200309*data.tar.gz"

上手くいきませんでした。



HP-UX11.00です。

No. 3656 # すすむ 2004/03/25 (木) 12:52:19
>>3655 すすむ
すみません
リストのファイル名は、
YYYYMMDDHHMMSSdata_tar.gz

YYYYMMDDHHMMSSdata.tar.gz
です。

No. 3657 # バンガード [E-mail] 2004/03/25 (木) 13:04:02
>>3656 すすむ
tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz
ではどうでしょうか?

No. 3658 # すすむ 2004/03/25 (木) 13:47:55
>>3657 バンガード

>tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz
上手くいきません。

No. 3659 # 68user 2004/03/25 (木) 13:51:31
>>3652 zsh
> /usr/bin配下のawkでは環境変数を参照できなかったと思います。
ご指摘ありがとうございます。まわりに Solaris 環境がなくなってしまった
ため誤ったことを書くことが増えると思いますが、そのときはご指導願います。

>>3653 m16
    % echo abc | /usr/bin/nawk '{ print ENVIRON["HOGE"] }'

    % printenv HOGE
で何も出力されないなら、環境変数の設定ミスでしょう。

>>3655 すすむ
> UNIXのtarコマンドについて教えて下さい。
> DATテープから任意のファイルをワイルドカード(*)で取り出したいの
> ですが上手くいきません。
HP-UX 11i で試した限りでは、HP の tar ではワイルドカードは使用
できないようです。
    - 全部 tar xf で展開し、狙いのファイルを拾う
    - tar tf の結果を grep で拾って tar xf で完全なファイル名を指定する
    - GNU tar をインストールする
などの方法を検討するのがよいかと思われます。

>>3657 バンガード
> tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz
sh 系・csh 系いずれも、カレントディレクトリに bkup というディレクトリが
存在し、その下に 200309*data.tar.gz にマッチするファイルが存在した場合、
存在するファイル名に展開されてしまい、結果として意図とは異なるファイルが
展開されます。

また、sh 系ではマッチしなかった場合 ./bkup/200309*data.tar.gz がそのまま
tar に渡りますが、csh 系ではシェルの glob 展開の時点でエラーになります。

メタキャラクタは必ずエスケープしましょう。

No. 3660 # バンガード [E-mail] 2004/03/25 (木) 13:52:51
>>3658 すすむ
当方はAIX 5.2上で試しましたが、以下の様な結果になります。
(tar でなくて申し訳ありません)
% ls -l ./test_dir
合計 7
-rw-r--r-- 1 furu man 0 Mar 25 13:01 20030901data
-rw-r--r-- 1 furu man 0 Mar 25 13:01 20030902data
-rw-r--r-- 1 furu man 0 Mar 25 13:01 20030903data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20031201data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20031202data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20031203data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20040101data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20040102data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20040103data
-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4
-rw-r--r-- 1 furu man 12 Mar 22 16:01 test5
-rw-r--r-- 1 furu man 4 Mar 22 16:01 test6
-rw-r--r-- 1 furu man 20 Mar 22 16:02 test7
% wc ./test_dir/200309*data
              0 0 0 ./test_dir/20030901data
              0 0 0 ./test_dir/20030902data
              0 0 0 ./test_dir/20030903data
              0 0 0 合計
念のため、csh と ksh で試しましたが、結果は同じです。

No. 3661 # 68user 2004/03/25 (木) 14:10:02
>>3660 バンガード
根本的に誤解があるようです。
> % wc ./test_dir/200309*data
この場合、操作対象ファイルは既に存在するのでエスケープは不要です。
この例ではシェルがメタキャラクタを展開し、wc は
      ./test_dir/20030901data ./test_dir/20030902data ./test_dir/20030903data
というような引数を得ます。

しかし
> # tar -xvf /dev/rmt/1m 200309\*data.tar.gz
の場合は、今から展開しようとしているわけなので、ファイルはまだ
存在しません (仮に存在していたとしても、存在するファイルにマッチ
してもらっては困るわけです)。

よって、シェルが展開しないように \* などとエスケープします。
すると tar は
      -xvf /dev/rmt/1m 200309*data.tar.gz
というふうにメタキャラクタをそのまま受け取るので、それを /dev/rmt/1m
内のデータと比較し、マッチするファイルのみを抽出します。ただし
今回のように tar が自前でメタキャラクタを展開する機能を持っていない
とうまくいきません。

      用語集: ファイルグロブ
          http://x68000.startshop.co.jp/~68user/unix/pickup?%A5%D5%A5%A1%A5%A4%A5%EB%A5%B0%A5%ED%A5%D6

の一読をお勧めします。

No. 3662 # バンガード [E-mail] 2004/03/25 (木) 14:25:24
>>3661 68user
まず最初にお断りさせていただきたいのですが、私が3660の投稿を行ったタイミングでは
まだ3659の発言はありませんでした。
ですので、3660投稿の時点では3659の発言は読んでいませんでした。

ただ、どちらにしても私のテスト自体に思い違いがあった様で御指摘は大変参考になり
ました。
御指摘誠にありがとうございました。
この投稿を送信次第御提示いただいた資料を参照してみます。

No. 3663 # すすむ 2004/03/25 (木) 15:21:18
>>3659 68user
>HP-UX 11i で試した限りでは、HP の tar ではワイルドカードは使用
>できないようです。
> - 全部 tar xf で展開し、狙いのファイルを拾う
> - tar tf の結果を grep で拾って tar xf で完全なファイル名を指定する
> - GNU tar をインストールする
>などの方法を検討するのがよいかと思われます。
tar tvf の結果をgrepで拾って、tar xvf に対して完全なファイル名を
指定する方法でできました。

ありがとうございました。

No. 3664 # Naoki [E-mail] 2004/03/27 (土) 20:37:18
はじめまして。Naokiと申します。
皆さんに教えていただきたいことがあり、書き込ませていただきます。
レンタルサーバーを借りてホームページを開設しようとしているのですが、
最初に読み込まれるトップページを指定したいのですが、どのようにしたらよいのでしょうか?
具体的には、アクセス元がパソコンor携帯かによって、それぞれのトップページを振り分けるCGI
をトップページにしたいと考えています。(ファイル名はindex.cgi)
サーバー会社に問い合わせたところ、『index.cgiやindex.phpをトップページにする方法として、
.fowardファイルにて操作可能』と言われ、それ以上はサポート外なので対応できないということです。
そこで、どのように設定したらよいのか教えてください。
以上、よろしくお願いいたします。

No. 3665 # has 2004/03/28 (日) 23:58:46
こんばんは。
皆様のようにきっちり回答できる自信がなく、時折の書き込みで恐縮ですが、
たまたま一部知っている内容だったので回答させていただきます。

>>3664 Naoki
CGI側でサーバ変数HTTP_USER_AGENTを参考に判定する方法があります。
CGIでよく使われていると思われるサーバ変数を解説しているページが
あったのでご紹介します。
http://www.din.or.jp/~hagi3/Perl/http.htm

Japan Apache Users Groupでの解説個所も見つけました。
http://www.apache.jp/docs/howto/cgi.html#environmentvariables

No. 3666 # samy 2004/03/30 (火) 13:40:12
こんにちわ。
Perlについてのごく初歩的な質問なんですがファイルデータを保存する時の方法についてなんですが
CSV形式なら
open(OUT,">data.dat");
    print OUT "$FORM{'fld1'},$FORM{'fld2'},$FORM{'fld3'},$FORM{'fld4'}\n";
close(OUT);
だと思うのですが固定長の場合はどうしたらよいのでしょうか?
よろしくお願いします。

No. 3667 # 68user 2004/03/30 (火) 13:56:35
>>3666 samy
>固定長の場合はどうしたらよいのでしょうか?
基本は
      printf(OUT "%05d%20s%010d%10s\n",
                    $FORM{'fld1'}, $FORM{'fld2'}, $FORM{'fld3'}, $FORM{'fld4'});
など。%d は数値。%s は文字列。%20d は右詰め。%-20d は左詰め。
%020d はゼロパディング。

項目数が 10〜20 程度ならこの方法でよいでしょう。

もし項目数が 100 を超えるのであれば、出力フォーマットの定義
ファイル化などを検討しましょう。

No. 3668 # samy 2004/03/30 (火) 18:29:45
ありがとうございます。
助かりました。
また、質問があれば投稿しますのでその時はよろしくお願いします。

No. 3669 # Goldwasser [URL] 2004/03/30 (火) 18:58:06
だから私を見て!
http://sgldwssr.hp.infoseek.co.jp/otp.html

No. 3670 # tmr [E-mail] 2004/04/06 (火) 21:38:22
awkについての質問です。

Solaris7上で、nawkを実行する際、

"cat text.txt" | getline var

という構文があるとvarに "cat text.txt" の結果が入るのですが、
同じことを /usr/xpg4/bin/awk で実行すると var に値が
入らないようです。
このあたりの事情をご存知の方、教えてくれませんか?

No. 3671 # tmr 2004/04/07 (水) 15:27:13
下記の件ですが、awkをかける対象のテキストの行数が、
getlineで取り込まれるテキストの行数より少ない場合に
発生することがわかりました。
つまり、getlineで取り込まれるテキストの方が短い場合、
nawkでは最後の行の内容が保持されて、それを利用した置換処理が
行われるが、 /usr/xpg4/bin/awk では行われないということです。

No. 3672 # 68user 2004/04/08 (木) 10:46:06
>>3671 tmr
なるほど。そういう違いがあることは知りませんでした。一般論としては、
getline の戻り値チェックをしっかり行ないましょう、てな感じでしょうか。

No. 3673 # Goldwasser 2004/04/08 (木) 15:38:24
誰かハイホーネットにメールを送信するアプリをくれましたか?(w

No. 3674 # vm 2004/04/12 (月) 22:17:45
はじめましてvmと申します。
UNIXのコマンド処理で質問があるのですが、
何行かあるテキストファイルの指定のカラム位置に文字列を行単位に挿入
するという処理を、UNIXのコマンドだけでやりたいと思っています。

自分で処理を考えてみたのですが、
1. cutコマンドを使用して、指定カラム位置を境にして、
「指定カラム位置より前の文字列が入ったファイル」と
「指定カラム位置より後の文字列が入ったファイル」に分割する。
2. paste コマンドを使用して、セパレータを元のファイルが使用していない文字を指定して、
1で作ったファイルを結合する。
3. sedコマンドでセパレータ文字を挿入したい文字列に置き換える。


ワークファイルができてしまって、UNIXっぽくないので、
これ以外にもっと簡単なやり方がないか探しているのですが、
もしご存知の方いらっしゃいましたら、ご教授いただけないでしょうか。
よろしくお願いします。

No. 3675 # 68user 2004/04/13 (火) 10:35:37
>>3674 vm
やりたいことがよくわからないので、入力と出力のサンプルを
提示してください。

No. 3676 # zsh 2004/04/13 (火) 13:14:57
>>3675 68user
多分このような事を考えているのだと思います。

■入力ファイル
aaaa,bbbb
cc,ddd
eeeeee,ffff

■挿入文字列
00

■出力ファイル
aaaa00bbbb
cc00ddd
eeeeee00ffff

>>3674 vm
で、やりたい事が上記の通りだとすると、
perlとかawkで出来ると思います。

No. 3677 # vm 2004/04/13 (火) 17:42:20
こんにちはvmです。
説明不足でした。

入力データは1ファイルで、

AAAABBBCCCCC
DDDDEEEFFFFF
GGGGHHHIIIII
  :

という感じで項目間の区切り無しのレコードが
いくつか入っているという状態で、

AAAABBB****CCCCC
DDDDEEE****FFFFF
GGGGHHH****IIIII
  :

1行目で見ると、BBBとCCCCCの間に****を挿入するということを、
シェルかUNIX標準コマンドでやりたいと考えています。

先に書いた私の手順ですと、一度cutコマンドで

AAAABBB
DDDDEEE
GGGGHHH
  :

CCCCC
FFFFF
IIIII
  :

2つのワークファイルを作るので手順も多くて面倒なため、
他にやり方がないものかと考えている次第です。
もっと単純化できる方法がありましたら、ご教授ください。
お願いいたします。

No. 3678 # zsh 2004/04/13 (火) 19:10:14
>>3677 vm
区切り文字なしだとすると、文字列の挿入個所は何を基準に判断するのでしょうか?
下の例を見る限りでは、行頭からのバイト数で分割してるように見えますが、あってますか?

後気になった点はUNIXの標準コマンドというのは
どこまでを指すのでしょう?
インストール時点でインストールされるコマンドは、
OS・インストールオプションによって異なると思いますが・・・

No. 3679 # vm 2004/04/14 (水) 21:04:08
こんにちはvmです。

>下の例を見る限りでは、行頭からのバイト数で分割してるように見えますが、あってますか?

すみません。そのとおりです。

>後気になった点はUNIXの標準コマンドというのは
>どこまでを指すのでしょう?

POSIXに準拠しているコマンドのことを指していました。

あれからちょっと調べてみたのですが、

awk '{printf("%s%s%s\n", substr($0,1,2), "TUIKA", substr($0,3));}' target.txt > result.txt

awkコマンドであれば、私のやりたいことがワークファイルを作らずに
実現できそうなことがわかりました。

どうもお騒がせしました。
これより良い方法がございましたら、ご教授ください。

No. 3680 # tgr [URL] [E-mail] 2004/04/15 (木) 09:25:34
gfg

No. 3681 # 馬場 2004/04/15 (木) 10:54:14
宜しくお願いします。

tarコマンドを実行した際に以下のメッセーシ゛が出たんですが、
何を意味しているかわかりません。
ご教授ください。

--------------------------------------------------
cd /
tar -cvf /dev/rmt0n ./usr/*
tar -rvf /dev/rmt0n ./var/* ← メッセーシ゛が出ます
--------------------------------------------------
表示メッセージ
tar:blocksize=0
tar:backspace over record failed
--------------------------------------------------
ご教授ください。宜しくお願いします。

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

No. 3682 # ryo 2004/04/15 (木) 21:47:40
mailxコマンドに関してですが
件名がベース64で本文がJISコードのメールを読む時、
以下の状態になってしまいます。
直す方法を知っている方おりましたらお教えください

1.件名が日本語の長文だと、以降の画面が文字化けします
2.JISコードの本文を開くと
    「---Executing: kterm sh: kterm: 見つかりません」
    とでてしまい表示できません

No. 3683 # 68user 2004/04/16 (金) 04:28:19
>>3679 vm
> これより良い方法がございましたら、ご教授ください。
awk より良い方法かどうかはわかりませんが、
    sed 's/^\(..\)/\1TUIKA/' < target.txt > result.txt
というのもあります。

>>3681 馬場
すでにアーカイブ済のファイルが出現したため、前に戻って
置き換えようとしたが、テープドライブのため前に戻る機能が
なかった、ということではないですかね。

>>3682 ryo
Solaris2.6 ではその症状は出ませんでした。

No. 3684 # Phantom 2004/04/16 (金) 10:02:39
こんにちは。Phantomと申します。

ネットで色々調べた結果ちょっと、見当たらなかったので質問させてください。
アクセスログの話なのですが、Web/FTPサーバのアクセスログでは有りません
(Web/FTPのアクセスログの情報は腐るほど有りました。また、情報が全く無か
ったと言うのは嘘で、高いソフトウェアやASPぐらいの情報しか出てこず、個人
の私としては手が出ません。)。

ローカルのLinux環境内でアクセスされたファイルのログを取りたいと考えて
いるからです(Unix系OSで実現するのが難しいから情報が少ないのでしょうか?)。
当然、アクセスログなのでアクセスしたユーザ名、時間、アクセス先などの情報を
見たいと思っています。
セキュリティの事もあるのですが、私自身が何時ファイル(特に設定ファイル)の
編集を行ったかという履歴を見たいからです。

それで、これに見合った(フリー)ソフトウェアやシェルスクリプト等が存在しまし
たら、紹介していただければ幸いです。(それとも、もしかしてすごく簡単にPerl
とかで組めちゃったりするんでしょうか?)

No. 3685 # 68user 2004/04/16 (金) 11:24:16
>>3684 Phantom
履歴や変更点の確認をしたいということなら、cvs や subversion
などのバージョン管理ツールを使うのがよいでしょう。

履歴を何段階でもとることができ、細かい修正点を記録できるという
利点がありますが、その一方でファイル更新とバージョン管理とが
密に連携しているわけでないので、バージョン管理ツールへの登録
忘れが発生する可能性がある、という欠点があります。

あるいは
> ユーザ名、時間、アクセス先
だけの情報だけでよいなら、
      - ユーザ名、時間、ファイル名を記録する
      - エディタを起動する
      - (必要なら) 編集前と編集後のファイルをどこかに保存する
というファイル編集用スクリプトを作成し、それを使うように
すればよいでしょう。もちろん、このスクリプトを使わずに直接
ファイルを修正してしまうとアウトです。

もっと厳密にやりたいならシステムコールをフックするタイプ
のものが必要です。たとえば Linux Security Module (LSM) や
      Sysrace: http://www.citi.umich.edu/u/provos/systrace/linux.html
など。

しかしこれらの主目的はシステムコールを許可するかしないかを
決めるためのものなので、ログを記録できるような仕組みがある
のかどうかはわかりません。

> Unix系OSで実現するのが難しいから情報が少ないのでしょうか?
Windows なんかだと API のフックが簡単にできますが、UNIX は
そこらへんの機能が弱いのです。

No. 3686 # Phantom 2004/04/16 (金) 12:12:08
>>3685 68user
凄く素早いレス有難う御座いました。
沢山の情報を与えてくださって感謝しております。

> cvs や subversion
成る程。バージョン管理ツールという手が有りましたか。

> ファイル編集用スクリプトを作成
作ってみたいと思います。ただ、仰る通り私、忘れっぽいので直接ファイル
編集しちゃって失敗しそうです。

> LSM や Sysrace
私には難しいみたいですが、一つの手として調べてみます。

No. 3687 # zsh 2004/04/16 (金) 12:53:07
>>3686 Phantom
>作ってみたいと思います。ただ、仰る通り私、忘れっぽいので直接ファイル
>編集しちゃって失敗しそうです。
エディタコマンドと同じ名前のスクリプトを作成し、
スクリプトを格納したディレクトリを環境変数PATHの先頭に追加しては如何なでしょうか?

No. 3688 # scott 2004/04/17 (土) 15:00:50
Solaris7にて/dev/consoleに出力しているログを横取りして
ファイルに落としたいんですが、なにかいい方法はありますか?
ありましたらご教授願います。

No. 3689 # MM 2004/04/21 (水) 00:00:53
こんにちは。

あるSolarisからLinuxにPingすると、

do you want to ping broadcast? Then -b というメッセージがかえってくるのですが、
どういう意味ですか?他にも10台あって、この2台以外はお互いちゃんとPingできるのですが、どうしてでしょうか?

SolarisのIPとホストは172.17.155.01 AT002といいます。
Linuxのほうは172.17.155.17 AI007といいます。

SolarisからLinuxにPingすると"no answer from AI" といわれ。
LinuxからSolarisにPingすると"do you want to ping broadcast? Then -b" なります。

教えてください。
MM

No. 3690 # 68user 2004/04/21 (水) 00:51:00
>>3688 scott
syslog に出力するようにして、syslog.conf の方で
ログファイルにも落とすようにする、という方法しか
思いつきませんでした。

>>3689 MM
> do you want to ping broadcast? Then -b
> どういう意味ですか?
x.y.z.255 などのブロードキャスト宛に ping したいので
あれば、-b オプションを付けなさい、ということです。

とりあえずネットワーク設定がうまくいっていないようなので、
そこを見直すのがよいのではないでしょうか。たとえば
/etc/hosts に変な記述がないかとか、ネットマスクは同じか
とか、IP アドレスを直接指定して ping するとどうなるかとか。


で、質問です>どなたか

質問 1.
「Do you want to ping broadcast」でぐぐると、
    http://licensing.steeleye.com/open_source/diffs/ping.c
が見つかりました。

    #ifdef linux
        if (source.sin_addr.s_addr == 0) {
            int probe_fd = socket(AF_INET, SOCK_DGRAM, 0);
            dst.sin_port = htons(1025);
            if (connect(probe_fd, (struct sockaddr*)&dst, sizeof(dst)) == -1) {
                if (errno == EACCES) {
                    if (broadcast_pings == 0) {
                        fprintf(stderr, "Do you want to ping broadcast? Then -b\n");
                        exit(1);
                    }
                }
            }
        }
        bind(s, (struct sockaddr*)&source, sizeof(source));
    #endif

とありますが、何をやってるのかさっぱりわかりません。
source.sin_addr.s_addr が 0 なら、UDP でポート 1025
に connect? なんのために? connect したら、それを bind?
なんのため?

質問 2.
あるディストリビューションの Linux で採用している ping の
ソースを見たいんですが、どこを探せばいいでしょうか? たとえば
RedHat ならどこを見ればよいですか?

No. 3691 # has 2004/04/22 (木) 00:36:04
>>3690 68user
>質問 2.
>あるディストリビューションの Linux で採用している ping の
>ソースを見たいんですが、どこを探せばいいでしょうか? たとえば
>RedHat ならどこを見ればよいですか?

いつもどおり答えになってませんがDebian GNU/Linuxのは見つかりました。
http://packages.debian.org/stable/net/netkit-ping

linuxは基本的にtar.gzやtar.bzでの配布よりもrpm(redhat package manaer)
形式(ソースなら*.srpm、*.src.rpmの場合もあり)が普通みたいですよ。

なお今回は、[ping srpm ソース]で検索→[netkit-ping]で検索→到達です。
# 本当はもっといろいろ遠回りしてますが…

No. 3692 # 流離のカメソらいだ〜 [E-mail] 2004/04/22 (木) 20:59:55
僕は某高専2年の電気科なんですが,C言語の授業があって学校のPCのOSがunixなんですよね〜。
Windowsで作成した文書ファイル(拡張子.c)をFDでunixに送る場合,文字化けしますよね?
それを防止する方法を教えて下さい。メールで返答していただければ幸いです。

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

No. 3693 # vm 2004/04/23 (金) 13:04:14
>>3692 流離のカメソらいだ〜
一般的にはWindowsの標準文字コードがS-JISで、UnixがEUCだからそうなります。
FDに保存する際にエディタでEUCに変換しておくか、
エディタにその機能がないかUnix上で変換かける場合は、nkfコマンドを使ってください。

No. 3694 # abc 2004/04/24 (土) 13:40:28
texの文書で、dviのファイルをpdh形式に変換したいのですが、人に聞いた
ところGhostscriptを使ってできるとのことで、早速GSを落としてみたので
すが、具体的な操作など教えてもらえれば幸です。

No. 3695 # MM 2004/04/24 (土) 20:58:16
68userさん、ありがとうございます。

>x.y.z.255 などのブロードキャスト宛に ping したいので
>あれば、-b オプションを付けなさい、ということです。

x.y.z.0もブロードキャスト宛ということになるのでしょうか?

No. 3696 # 68user 2004/04/27 (火) 23:02:52
>>3691 has
なるほど、ありがとうございます。Debian の ping は、
      Do you want to ping broadcast? Then -b
というエラーは出さないようですね。

>>3695 MM
> x.y.z.0もブロードキャスト宛ということになるのでしょうか?
x.y.z.0/255.255.255.0 はネットワークアドレスです。

ただ、BSD 系・BSD 系を元にした実装 (Solaris・Linux など) は
ネットワークアドレスに対する ping に対して返事を返します。
Windows 系はたしか返事を返さないはず (ネットワークアドレスに
対する ping だけでなく、ブロードキャストへの ping も返さない)。

だから、ネットワークアドレス宛の ping であっても、ブロード
キャスト宛の ping と同等に機能する環境もあります。

ただし ping は
      「この宛先はブロードキャストアドレスだから `Do you want to
          ping broadcast? Then -b' というメッセージを出そう」
などと判断しているわけではなく、
>>3690 68user
に書いたとおり、connect して errno が EACCES ならこのメッセージを
出力して終了しているだけです。しかしこの connect の意味がさっぱり
わからないので、「ネットワーク設定がおかしいのでは?」以上のアドバイス
はできません。

てゆーか、どなたか >>3690 の意味を教えてください。

>>3694 abc
> texの文書で、dviのファイルをpdh形式に変換したいのですが
pdh は pdf の typo ですか?

gs 付属の ps2pdf はいまいちで、今どきは dvipdfm を使うと
聞いたことがありますが、最新情報や細かなノウハウは知りません。
よって、「dvi pdf 変換」などで検索してみるか、2ch の UNIX 板
などで質問してみてはいかがでしょうか。

No. 3697 # うほほ 2004/04/27 (火) 23:05:16
はじめまして、こんばんは。
LINUX, Apache, PHP, MySQL、HTMLでのシステムを考えているのですが、
ちょっと行き詰まってしまって、、、よろしくお願いいたします。
ページがジャンプした瞬間に、あるフィールドをいきなり入力待ち状態にしたいのです。
通常はページに移動後マウスなどで入力したいフィールドを一度クリックする必要があります。
現在フィールドはフォーム<input>タグで作成しています。

カスタマーは(バーコードを使って>マウス1クリック無しで)
いきなり入力したい!というのがご要望です。

関連のページのご紹介でも何でもかまいませんので、
是非、よろしくお願いいたしますm(_ _)m

No. 3698 # 68user 2004/04/28 (水) 00:06:03
>>3697 うほほ
たとえば http://www.google.co.jp/ がその技を使っています。

ソースを見ていただければわかりますが、
    <body onload="document.hoge.fuga.focus()">
        <form name=hoge>
            <input type=text name=fuga>
        </form>
    </body>
とします。

No. 3699 # has 2004/04/28 (水) 02:45:22
>>3696 68user
>なるほど、ありがとうございます。Debian の ping は、
> Do you want to ping broadcast? Then -b
>というエラーは出さないようですね。
そーゆーことですか、了解です。ならredhat9では次の通りになりました。
% strings /bin/ping | grep Then
Do you want to ping broadcast? Then -b
%

No. 3700 # sagara [E-mail] 2004/04/28 (水) 19:15:37
ファイルをダウンロードするスクリプトを作成していますが、
ファイルサイズが大きいとファイル内容は一部しかダウンロードできません。
sysreadの戻り値$Ret_Lenは、正しい値が返ってきます。
最後のprint文で、全てを出力していません。あるいは、$INBUFに全てが
格納されてないかです。
全ての内容をダウンロードするには、どうすべきなのでしょうか?

    $size = -s $dl_file;
    open(INF, $dl_file) or &CgiError( "Error: Unable to open file $dl_file: $!\n" );
    binmode(INF);
    $Ret_Len = sysread(INF, $INBUF, $size);
    if (defined $Ret_Len) { #エラーではない
        if ($Ret_Len >0) { #読み取りの成功
            ;
        } else { #EOF
            close(INF);
        }
    } elsif ($! == EAGAIN) { #ブロックエラー
        $Ret_Len = sysread(INF, $INBUF, $size);
    } else {
        die "sysread() error: $!";
    }

    $NowMime = substr( $f_name, rindex($f_name, ".")+1, length($f_name) );
    $NowMime =~ tr/a-z/A-Z/;
    $RetMime = "";
# 2001.12.19 added by ishikawa ->
    #$mimeMach = 'dummy';
# 2001.12.19 added end ishikawa <-
    if( $NowMime ne "" ){
        if( open(CB, "./lib/mime.types") ){
            @mimein = <CB>;
            close( CB );
            foreach( @mimein ){
    if(/^[^#\n\r]/){
     s/[\t]+/\t/;
     ($MimeHead,$MimeBody) = split(/\t/);
# 2001.12.19 added by ishikawa ->
     if( defined $MimeBody ){
# 2001.12.19 added end ishikawa <-
     foreach $mimeMach ( split( /\s/, $MimeBody ) ){
     $mimeMach =~ s/\s//g;
     $mimeMach =~ tr/a-z/A-Z/;
     if( $mimeMach eq $NowMime ){
     $RetMime = $MimeHead;
     last;
     }
     }
# 2001.12.19 added by ishikawa ->
     }
# 2001.12.19 added end ishikawa <-
     if( $RetMime ne "" ){ last; }
    }
            }
        }
    }

    if( $RetMime eq "" ){
        print "Content-Type: application/octet-stream\n";
        print "Content-Disposition: inline; filename=\"$f_name\"\n\n";
    }
    else{
        print "Content-Type: $RetMime\n";
        print "Content-Disposition: inline; filename=\"$f_name\"\n\n";
    }

    binmode(STDOUT);
    print $INBUF;

No. 3701 # 68user 2004/04/28 (水) 21:50:48
>>3700 sagara
- 「ファイルサイズが大きい」とは具体的に何バイトですか?
- あるバイト数以上のファイルの場合、常にダウンロードできないのですか?
- 大きいファイルを処理するのに何秒かかりますか?
- length($INBUF) の値は?
- $INBUF の内容をファイルに出力すると、正常に出力できますか?
- 「sysreadの戻り値は正しい」というのは「正常にダウンロード
    できなかった場合でも、sysread の戻り値は正しい」ということ
    ですか?
- sysread ではなく read を使うとどうなりますか?
- OS 名・OS のバージョン・perl のバージョンは何ですか?

あと、コメント部分や関係ない箇所は極力削ってから投稿しましょう。
仕事のソースであれば特に。

No. 3702 # うほほ 2004/04/29 (木) 17:10:34
>68USER様
早々のお返事をありがとうございました。
やってみたら、ばっちりでした〜!
本当にありがとうございました♪

No. 3703 # lock 2004/05/04 (火) 09:58:30
はじめまして。よろしくお願いします。

環境:NetBSD1.5.2、Apache2.0.49

以下に示す接続が、4日くらいたっても消えません。
これは、クライアントがhttpで何かをダウンロード中の状態の1つということでしょうか?
ずっとこの状態のままなのはどういう原因が考えられますでしょうか?

Apacheのログには、このクライアントからのアクセスログは存在しませんでした。
FIN_WAIT_2の状態が終了した後で書き込まれるのでしょうか?


%netstat -an (一部抜粋)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 15964 210.*.*.*.80 133.*.*.*.15241 FIN_WAIT_1
tcp 0 16460 210.*.*.*.80 133.*.*.*.6322 FIN_WAIT_1
tcp 0 16500 210.*.*.*.80 133.*.*.*.19339 FIN_WAIT_1

No. 3704 # 68user 2004/05/04 (火) 19:45:56
>>3703 lock
サーバ側から close すると (正確にはアクティブクローズ
すると) FIN_WAIT_1 になります。普通はこの後にクライアント
から ACK・FIN が帰ってきて FIN_WAIT_2 に遷移しますが、
この辺がうまくいっていないものだと思われます。

> ずっとこの状態のままなのはどういう原因が考えられますでしょうか?
わかりません。普通は FIN_WAIT_1 のままにならないように
タイマか何かがあると思いますが、FIN_WAIT_1 タイマって
存在するのかな? (FIN_WAIT_2 タイマはあるけど)

> FIN_WAIT_2の状態が終了した後で書き込まれるのでしょうか?
これまたわかりません。apache のソースを読みましたが、どこで
ログを吐いてるのかすらわかりませんでした。

とまぁ何の役にも立たない回答になってしまいましたが、
数日様子を見てはいかがでしょうかね。

No. 3705 # hash 2004/05/04 (火) 23:12:07
数日前、FreeBSD 5.2Rをインストールしたのですが、起動時(ログイン前)に

Configuring syscons: keymap blanktime

と表示され、長時間とまってしまって困っています。
その後ログインプロンプトが表示され、ログイン可能ですし、
その他の操作に問題も無い感じなのですが、毎度の事なので釈然としません。

解決方法は無いものでしょうか?それともこういうものなんのでしょうか?
よろしくお願いいたします。

No. 3706 # 68user 2004/05/04 (火) 23:28:38
>>3705 hash
> Configuring syscons: keymap blanktime
の後の sendmail 起動時に固まっているものと思われます。

内容は若干グダグダですが、こちらをどうぞ。
    http://home.jp.freebsd.org/cgi-bin/thread?mesid=%3c200308030422%2eAA02439%40nt%2em8%2edion%2ene%2ejp%3e

てゆーかうちのマシンも sendmail 起動時に固まりますが、
めんどくさいので止まったら Ctrl-C を押してます。

No. 3707 # hash 2004/05/05 (水) 02:07:03
>> 3706
早速のお返事ありがとうございます。
ご指摘頂いた通り、原因はメッセージの後のsendmailの起動でした。
> Configuring syscons: keymap blanktime
のメッセージから検索しても、解決法が見つからないのはあたりまえでしたね。

ご紹介いただいたウェブサイトに目を通すのに時間がかってしまいましたが、
解決することができました。

私の場合はDNSサーバの指定部分で、ADSLモデムの提供しているDNSで解決しようとしていたのですが、
モデムのDNSサービスがIPv6に対応していない為、名前解決できずTime outを待っていたようです。
DNSサーバの指定をプロバイダーのアドレスにしたら解決しました。

起動する度に気になっていたので、すっきりしました。
どうも、ありがとうございます。

No. 3708 # Sjr 2004/05/05 (水) 20:19:41
DESについて質問させて下さい。
OpensslコマンドでDESを使っているのですが、間違った鍵で復号しようとすると
bad decryptというエラーがでます。パリティチェックはOKとします。
これはDESの仕様上、エラーが検出できるということなのでしょうか?
DESというと単にビット単位の置換だと思っているので、エラーが検出できるのが
ちょっと不思議です。
TripleDESの中ででも、いきなり関係無い鍵で復号したりしてますから、さらに
不思議です。

なにか根本的に理解が違っている気もするので、宜しければご教授ください。

No. 3709 # 68user 2004/05/05 (水) 22:59:32
>>3708 Sjr
`bad decrypt' を出しているのは多分 rypto/evp/evp_enc.c の

    int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl){
          b=ctx->cipher->block_size;
          n=ctx->final[b-1];
          if (n > b){
                EVPerr(EVP_F_EVP_DECRYPTFINAL,EVP_R_BAD_DECRYPT);

だと思います。PKCS#5 で定義されている操作に矛盾が発生すると
このエラーが発生すると思っています。

ところで PKCS#5 の日本語訳のありかをご存知の方いらっしゃい
ませんか? (解説している書籍でも可) 以前自分で訳してみたものの、
よく理解していないため何が何だかわからない日本語ができあがって
しまいました。

No. 3710 # Sjr 2004/05/06 (木) 10:56:55
68userさん、ご回答有難うございました。
恥ずかしながらPKCSというのは知りませんでした。PKCS#5というのは、
簡単に言うと文字列を鍵とする場合の決まりごと、みたいなものでしょうか?
頂いたソースやPKCS#5を斜め読みしてもまだ今一つピンときていません。
勉強したいと思います。

今のところなんとなく、PKCS#5でのPS(Padding String)についての記述を
見て、Padding ruleによってはエラーが検出できるのではと予想しています。

やっぱりアルゴリズムを見ていくしかないですねぇ…

No. 3711 # 68user 2004/05/06 (木) 11:54:23
>>3710 Sjr
> 簡単に言うと文字列を鍵とする場合の決まりごと、みたいなものでしょうか?
決まりごとというか、RSA が作った決めごとですね。

DES は 64bit のデータを暗号化・復号化する機能しか持っていません
(だから DES は 64bit ブロック暗号)。

これでは 64bit を超えるデータを暗号化できないので、データを分割して
暗号化する方法の一つが CBC モード (FIPS PUB 81 で規定)。一方、データ
列が 64bit に満たない場合のパディング方法などを規定しているのが
PKCS#5 です。

PKCS#5 でのパディングは
      データ1バイトの場合: A -> A 07 07 07 07 07 07 07 としてから暗号化
      データ2バイトの場合: A B -> A B 06 06 06 06 06 06 としてから暗号化
                  :
      データ7バイトの場合: A B C D E F G -> A B C D E F G 01 としてから暗号化
      データ8バイトの場合: A B C D E F G H -> A B C D E F G H 08 08 08 08 08 08 08 08 としてから暗号化
としていますね。

と書いているうちにわかったような気がしますが、
      http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/crypto/openssl/crypto/evp/evp_enc.c?rev=1.1.1.1.2.4
の EVP_DecryptFinal_ex が呼ばれるときの流れは

      残りブロックサイズ = ctx->cipher->block_size;
      if (残りブロックサイズ > 1){
          /* 残りはパディング部分のみ */
          n=ctx->final[b-1]; /* 最後の 1バイトを読む。その値はパディング長であるはず */
          if (n > b)
              /* パディング長が残りブロックサイズを超えているならエラー */
              for (i=0; i<n; i++)
                    パディング部分の値が全て n であることをチェック
          /* ここまできたら、パディング部分が正しいことがわかる */
          n=ctx->cipher->block_size-n; /* パディング部分を除いたブロックサイズを取得 */
          for (i=0; i<n; i++) /* パディング部分より前のデータについて出力バッファに書き出す */
              out[i]=ctx->final[i];

てな感じでしょうか。

No. 3712 # 68user 2004/05/06 (木) 12:05:05
一応補足。

>>3708 Sjr
> DESというと単にビット単位の置換だと思っているので、エラーが検出できるのが
> ちょっと不思議です。
DES 自体は、鍵に含まれるパリティを以外の誤り検出機能はない、という
理解で正しいと思います。

しかし、PKCS#5 においては誤った鍵を使うと
>>3711 68user
> データ1バイトの場合: A -> A 07 07 07 07 07 07 07 としてから暗号化
> データ2バイトの場合: A B -> A B 06 06 06 06 06 06 としてから暗号化
この最後のデータ列 (06 06 06 06 06 06 など) がめちゃくちゃになって
しまうため、パディングチェック時にエラーとなる、ということですね。


なお、PKCS#5 は DES に限らず、ブロック暗号一般に適用できます。ただし
PKCS#5 は 64bit 暗号に特化した書き方がされているので、64bit 超暗号に
一般化したものが PKCS#7 に規定されています。

# と言っても、mod 8 とか書いてあるか、mod k と書いてあるかの違いしか
# ないような気がしますけど。

No. 3713 # Sjr 2004/05/07 (金) 10:09:34
x168userさん、詳細な説明ありがとうございます。
誤りの検出については、ほぼ理解できたと思います。


>データ8バイトの場合: A B C D E F G H -> A B C D E F G H 08 08 08 08 08 08 08 08 としてから暗号化

のところは意外でした。データが増えてしまうのでしょうか。
確かにこうしないとパディングされているのかされていないのかが
分からない、ということなのでしょうけど。
よくよく見ていくと色々と考えられていて面白いですね。

No. 3714 # SS 2004/05/10 (月) 14:58:25
初歩的な質問です。
複数ファイルを1ファイルにcatで結合しようとしたところ次の問題が発生しました。
各ファイルのファイル名は20文字程あり、それら10ファイルをまとめて作成したい
ファイル名も20文字程あります。cat以下コマンドを入力していくと、255文字で
入力不能となります。環境はSolarisへのTelnet接続、シェルはkshを使っています。
また、結合したい10ファイルは1つのディレクトリにある全てのファイルです。
ファイル名を短くするとか一度にやらないとか方法はあるでしょうが、画期的な方法が
あれば宜しくお願いします。

No. 3715 # ふくし [E-mail] 2004/05/10 (月) 18:01:22
>>3714 SS
さん、

ファイル名に共通点ありますか?

$ cat aaa.txt
a
b
c
$ cat bbb.txt
1
2
3
$ cat ccc.txt
x
y
z
$ cat *.txt
a
b
c
1
2
3
x
y
z

No. 3716 # 68user 2004/05/10 (月) 21:08:55
>>3714 SS
Solaris8 では sh・ksh・csh いずれも 255 文字の制限があるようで、極めて
不愉快ですね。

ワイルドカード (glob) を使う以外の別解としては、文字数の制限がある
のはコマンドラインからの入力時だけのようなので、シェルスクリプト内で
      #!/bin/ksh
      cat file-a file-b ..... > result
などとすれば OK なようです。

あとは、tcsh や bash を使うとか。

No. 3717 # SS 2004/05/11 (火) 13:59:04
シェルスクリプトで実現することにしました。ありがとうございました。

No. 3718 # zsh 2004/05/11 (火) 16:54:18
>>3717 SS
3716で68user様もさらっと書いてますが、ワイルドカードをを使用する事でも回避可能です。
% cat * > outfile

それにしてもこんな制限があるとは知りませんでした。
で、確認してみたところ、255文字ではなく257文字まで入力できました。
・・・・・・なんでこんなに中途半端なんでしょう?

No. 3719 # lock 2004/05/13 (木) 00:00:43
>>3074 68user
返事遅れて申し訳ありません。
回答ありがとうございます。

状況は、全く変化せずFIN_WAIT1の状態のまま残っています。
タイマーはないようです。
OSを再起動すればなくなるのでしょうが、それは出来ないので困っています。
強制的にクローズする方法はありませんでしょうか?

apacheを再起動しても変化なしでした。

No. 3720 # 68user 2004/05/13 (木) 00:18:07
>>3719 lock
であれば、NetBSD のバグだと思われます。

http://www.netbsd.org/Misc/query-pr.html#search
http://www.netbsd.org/MailingLists/ で検索してみましたが、
それっぽいものはありませんでした。

# FIN_WAIT_1 が残るというメールはありましたが、NetBSD 1.3.1
# 以前の問題のようです。

これ以上はわたしには全くわからないので、netbsd.org の
メーリングリストで質問してみてはいかがでしょうか。

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