68user's page 掲示板

Prev< No. 3512〜3742> Next  [最新発言に戻る] [過去ログ一覧]
No. 3512 # ブラウン 2004/01/14 (水) 12:45:26
>>3511 ブラウン
シェルについて2点教えて下さい。
1.フィールドの区切がカンマ「,」となっている行から
        例えば、
        山田 太郎,ヤマタ゛ タロウ,Yamda Taro,18,1760/12/24
        山田 花子,ヤマタ゛ ハナコ,Yamda HANAKO,18,1760/12/24
        から、
        先頭のフィールドから順にとか、フィールドの3,4,5を取り出したい
        のですが、awkを使う以外にないのでしょうか。
        awkを使わないで出来る方法と、awkを使ってできる方法を教えて
        下さい。

2.シェルで、今日から10日前の日付や、指定した日付の10日前を
    取得することはできるのでしょうか

環境は、HP-UX11.00、Bシェルです。

No. 3513 # 68user 2004/01/14 (水) 13:09:06
>>3511 ブラウン
質問したら必ず結果を書いてください。
      http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse

No. 3514 # hanzen 2004/01/14 (水) 21:57:22
賢いやり方か、上手いやり方か分からないが
こうすればできる。

--------------------------------------------
#!/bin/sh

back_to_day() {
        case $MM in
            0)
                MM=12
                MAX=31
                ;;
            1|3|5|7|8|10)
                MAX=31
                ;;
            4|6|9|11)
                MAX=30
                ;;
            2)
                if [ `expr $YYYY % 4` -eq 0 ]; then
                    MAX=29
                else
                    MAX=28
                fi
                ;;
        esac
}

YYYY=`echo $1 | cut -c1-4`
MM=`echo $1 | cut -c5-6`
DD=`echo $1 | cut -c7-`

DD=$((DD-7))
if [ ${DD} -le 0 ] ; then
        MM=$((MM-1))
        if [ ${MM} -eq 0 ] ; then
                YYYY=$((YYYY-1))
                back_to_day
                DD=$((DD*-1))
                DD=$((MAX-DD))
        fi
fi

printf "%d%02d%02d\n" $YYYY $MM $DD

exit 0

No. 3515 # zsh 2004/01/15 (木) 20:20:12
>>3512 ブラウン
区切り文字がカンマで、awkを使用しない場合。
------
$ cat data.txt
山田 太郎,ヤマタ゛ タロウ,Yamda Taro,18,1760/12/24
山田 花子,ヤマタ゛ ハナコ,Yamda HANAKO,18,1760/12/24
$ cat sam1.sh
#!/bin/sh

OIFS="$IFS"
i=0
while read line ; do
                IFS=","
                i=`expr $i + 1`
                set -- $line
                j=0
                while [ $# -gt 0 ] ; do
                                j=`expr $j + 1`
                                echo "$i - $j : $1"
                                shift
                done
                IFS="$OIFS"
done < data.txt
$ sh sam1.sh
1 - 1 : 山田 太郎
1 - 2 : ヤマタ゛ タロウ
1 - 3 : Yamda Taro
1 - 4 : 18
1 - 5 : 1760/12/24
2 - 1 : 山田 花子
2 - 2 : ヤマタ゛ ハナコ
2 - 3 : Yamda HANAKO
2 - 4 : 18
2 - 5 : 1760/12/24
------

指定された日付の10日前の日付を取得するのは面倒そうなのでパス。
単純に今日から10日前を取得する方法については、
下(↓)を良く読みましょう。
http://x68000.startshop.co.jp/~68user/unix/prgmemo.html#date

No. 3516 # ブラウン 2004/01/16 (金) 09:20:37
>>3515 zsh
ありがとうございます。
行の編集についてはできました。

しかし、日付の操作については、
http://x68000.startshop.co.jp/~68user/unix/prgmemo.html#date
を参考にしてやって見ました。
タイムゾーンを設定して、URLの例にあるのでは、上手くいったのですが
% env TZ=JST+15 date (1日前の時刻を表示)
% env TZ=JST-33 date (1日後の時刻を表示)

2日前では、
-9+48=39
% env TZ=JST+39 date
は上手く行きませんでした。
環境は、HP-UX11.00、Bシェルです。

No. 3517 # せんべい [E-mail] 2004/01/19 (月) 13:15:09
初めて投稿いたします。
UNIXのコマンドで、split というファイル分割コマンドがありますが、分割後のファイルをWindowsで結合させるための、MS-DOS コマンド、あるいは、フリーのソフトを知らないでしょうか。

No. 3518 # 68user 2004/01/20 (火) 10:21:31
>>3517 せんべい
> 分割後のファイルをWindowsで結合させるための、MS-DOS コマンド
copy a.txt+b.txt+c.txt out.txt でできたような気がします。

> あるいは、フリーのソフトを知らないでしょうか。
http://www.so-net.ne.jp/download/win/util/file/spl_mrg/ など。

No. 3519 # 初心者 2004/01/20 (火) 16:51:15
はじめまして,unix初心者です,教えて下さい。
異常終了させてしまい,1つのハードがmountされません。fsckを使って修復しようとしたのですが,エラーメッセージによると部分的なセクターが破損しているため修復できないとの内容でした。破損している箇所だけのフォーマットは可能なのでしょうか?もしあれば方法を教えて下さい。お願い致します。

No. 3520 # 68user 2004/01/20 (火) 21:24:58
>>3519 初心者
詳しくないのでなんともいえませんが (これまで fsck でこけた
経験がないので)、少なくとも以下の情報は必要でしょう。
    - OS 名とバージョン
    - ファイルシステム名 (ufs, ext2 など)
    - 正確なエラーメッセージ (エラーメッセージで検索できるよう原文を提示する)

検索のキーワードとしては「スーパーブロック」ですかねぇ。

No. 3521 # yabu 2004/01/20 (火) 22:42:46
unixのfindコマンドについて教えて下さい。
findを使用するとファイルの検索ができますが、
自分がいるカレントのみを検索し、その配下にあるディレクトリ
を検索したくないのですが、どうすれば可能でしょうか。

例えば、
現在位置
cd /tmp/tool/bin
/tmp/tool/bin 入るとします。
find .. -name ".log" -type f -print
と行うと、tool及び、bin配下やよのたのディレクトリを検索

find .. ! -depth -name "*.log" -print
と行うと検索しない。
1つもだった、ところのファイルのみを検索したい

No. 3522 # 68user 2004/01/20 (火) 23:34:40
>>3521 yabu
-maxdepth 1 でいけるでしょうが、-maxdepth に対応
していない find もあります。

単にファイル名でマッチさせたいだけあれば、
        % echo *.log
でもいいでしょう。

No. 3523 # moko 2004/01/21 (水) 00:08:04
Sunでaliasの設定でつまづいてます。。(alias rm="rm -i")
シェルはshなので.profileに記述しましたが効きません。

ネット検索しましたがshでのalias設定なしとありました。

shでのalias設定はどう行えばいいでしょうか?
ご教授お願いします

No. 3524 # yabu 2004/01/21 (水) 13:17:13
>>3522 68user

>-maxdepth 1 でいけるでしょうが、-maxdepth に対応
>していない find もあります。
HP-UX、SunOSともに対応していませんでした。

>単にファイル名でマッチさせたいだけあれば、
> % echo *.log
>でもいいでしょう。
でやらせていただきました。

No. 3525 # external 2004/01/22 (木) 16:39:29
IE などブラウザ上のボタンなどの操作を外部からしたいのですがしたいのですが、可能でしょうか?

例、VC++ のソフトで、Yahoo の検索を検索キーワードを入力や検索ボタンを押したい。
例、証券会社のHPで定期的に株価更新のため株価ボタンを押す。

などです。
ここの主旨から外れるかも知れませんが、宜しくお願いします。

No. 3526 # 68user 2004/01/23 (金) 02:53:00
>>3523 moko
まずは
      $ . $HOME/.profile
としましょう。それで alias が効かないなら .profile
の書き方が悪い。alias が効くなら .profile が読み込まれ
ていないか、.profile 読み込み後に unalias されている
んでしょう。

>>3525 external
詳しいところは知らないので、キーワードだけ並べておきます。
      COM (Component Object Model)
      OLE (Object Linking and Embedding)
      ActiveX

No. 3527 # yuki 2004/01/26 (月) 17:55:06
初歩的な質問ですが、Solarisのhostsについて教えて下さい。
他の端末と通信する為には/etc/inet/hostsにIPを書くと思っています。
でも、/etc/hostsにも同じhostsがあり、両方直しています。
/etc/hostsには/etc/inet/hostsと違った意味があるのでしょうか。
宜しくお願いします。

No. 3528 # 68user 2004/01/26 (月) 18:04:45
>>3527 yuki
http://www.freebsd.org/cgi/man.cgi?query=hosts&manpath=SunOS+5.9
    NOTES
        /etc/inet/hosts is the official SVR4 name of the hosts file.
        The symbolic link /etc/hosts exists for BSD compatibility.

というわけで、同じでしょう。

No. 3529 # kai 2004/01/26 (月) 18:58:03
Volumeの初期化に関して,どうのような操作をすれば良いか教えてください。digital unix 4.0

No. 3530 # momo 2004/01/27 (火) 16:07:08
crontabを実行した時間がわかるようにするためにはどのような書き方をしたらよいかわかりません。教えていただけないでしょうか。
よろしくお願いいたします。

No. 3531 # ken 2004/01/27 (火) 23:04:41
こんばんは。
Perlのほうが文字列処理などが書きやすい、でもCのほうが速度が速かったりするなどの理由から、XSを使用して二つの言語を合わせてみようと思いました。
そこで、CのヘッダをXSにかけてからPerlを実行したのですが、
"Your vendor has not defined Prime macro Prime"
というエラーが出てしまいます。

XSによって生成されたのはPrimeというディレクトリで、その中にあるPrime.pmに、Perlから第一引数として数字を渡すものでした。
Perlのほうからは、
Prime::Prime($ARGV[0])
として呼び出しましたが、何がいけなかったのか、教えていただきたく思います。
よろしくお願いします。

No. 3532 # Hiro 2004/01/28 (水) 00:54:41
AIXに付いて教えて!
AIXマシンでは、gettimeofday()関数が使えない!
よくよく調べると、コンパイル時、XOPEN_SOURCEを指定している為
である事が判ったが、XOPEN_SOURCEを外す訳にもいかず困ってます。
gettimeofday()関数と同じ機能で、置き換えられる関数ってないでしょうか?

No. 3533 # 68user 2004/01/28 (水) 02:06:01
>>3529 kai
Volume ってなんですか? 音量のことですか? であれば
わかりません (ioctl とか使うんですかね)。

>>3530 momo
1. cron から実行するスクリプト内でファイルに時刻を記録する
2. * * * * * date>>/foo/bar/log; command とする。
3. /var/cron/logs などにあるログを見る。

>>3531 ken
XS はよく知りませんが、perl のバージョンも、何をどうやったの
かも書かれていないので何ともいえません。

下記は perl 5.005_03 の例ですが、まずはここからでしょう。

    % h2xs -A -n Prime
    % cd Prime
    int
    Prime(num)
            int num;
    CODE:
            RETVAL = 2*num;
    OUTPUT:
                RETVAL
    % perl Makefile.pl
    % make
    hoge.pl を作成
    % cat hoge.pl
    use ExtUtils::testlib;
    use Prime;
    print Prime::Prime(123),"\n";
    % perl hoge.pl
    246

>>3532 Hiro
なぜ XOPEN_SOURCE が指定されていると gettimeofday が使えない
のかよくわかりませんが、古い形のプロトタイプ宣言が〜とかいう
話ではないかと思うので、mygettimeofday.c を作って、
        #include <sys/time.h>
        int gettimeofday (struct timeval *, void *) #undef XOPEN_SOURCE

        int mygettimeofday (struct timeval *Tp, void *Tzp){
                return gettimeofday(Tp, Tzp);
        }
とするとか。

No. 3534 # 68user 2004/01/28 (水) 02:10:03
>>3533 68user
> int gettimeofday (struct timeval *, void *) #undef XOPEN_SOURCE
        int gettimeofday (struct timeval *, void *);
        #undef XOPEN_SOURCE
のタイプミスです。

No. 3535 # ken 2004/01/28 (水) 02:15:32
さきほどXSのことを質問させていただいたのですが、なんとか解決しました(汗
どうやら、根本的に思い違いをしていたのが原因のようで...。
わざわざのご回答、ありがとうございます。
もう少しぼくが早く解決して書き込んでいれば良かったのですけどね。

No. 3536 # yuki 2004/01/28 (水) 13:36:44
>>3528 68user
The symbolic linkでしたか。
ぜんぜん気がつきませんでした。有難うございました。

No. 3537 # タカ 2004/01/29 (木) 14:52:55
はじめまして。タカと申します。
Perl関連について御教授ください。
Windows端末にてActivePerl-5.8.2.808-MSWin32-x86をインストールし
Perlを作成しております。
そこで、PerlでExcelファイルに出力するプログラムを
作ろうと思っております。
その為、Spreadsheet-WriteExcel-0.42モジュールを、
ダウンロードしました。
本モジュールはWindowsでも機能すると表示されているのですが、
どうやって使用すればいいのか分かりません。
Spreadsheet::WriteExcel version 0.33(日本語訳)の
HPを見ているのですが、私の知識不足で不明です。

もしご存知であれば御教授いただきたいのですが、
よろしくお願いいたします。

No. 3538 # 68user 2004/01/29 (木) 15:15:28
>>3537 タカ
http://member.nifty.ne.jp/hippo2000/perltips/module_install.htm
によると、ActivePerl の場合は PPM なるものを使うそうです。

# わたしは使ったことはありません。

No. 3539 # タカ 2004/01/29 (木) 15:56:06
ありがとうございました。
ちょっと試してみます。

No. 3540 # has 2004/01/29 (木) 17:02:12
クッキーに関する↓の冒頭でRFCに盛り込まれていないとありますが、
どうも2109で触れているそうですよ。
http://x68000.startshop.co.jp/~68user/webcgi/cookie.html

参考にさせていただいたサイト:
http://www.nonki.net/technical/report/http-cookie/
http://www.ietf.org/rfc/rfc2109.txt

No. 3541 # 68user 2004/01/29 (木) 18:48:20
>>3540 has
ありがとうございます。とりあえずそこだけ直しておきます。

> どうも2109で触れているそうですよ。
RFC 2109 は obsolete で、今は RFC 2965 です。
      http://www.studyinghttp.net/rfc_ja/rfc2965_ja.html

でもまぁ、Set-Cookie2 は全然流行っていませんけどね。

No. 3542 # 右院堂 2004/02/01 (日) 21:42:44
はじめまして 右院堂 と申します。
いきなり質問で エゴ丸出しで申し訳ないですが
ASP には Response.Buffer = True というのがあって、
ある html の form から 呼ばれた asp が 呼び元へ 自分の form を
Response.Redirect で 返す時、Response.Redirect が実行されるまで HTMLヘッダーの出力を引き伸ばすことが出来ます。
これをやらないと HTMLヘッダーが 自分自身として Redirectされる前に出力されてしまうからです。
Perl では これに相当する記述はあるんでしょうか。

No. 3543 # 68user 2004/02/01 (日) 22:11:49
>>3542 右院堂
ASP はよく知りませんが、素の perl を使う場合は (そういう機能を
持つモジュールを使わない限りは) 相当する機能はないです (そういう
機能を持つモジュールの存在は知りません)。

      $buf .= "出力文字列1";
      $buf .= "出力文字列2";
      ...
      print $buf;

や、

      open(STDOUT, "> /foo/bar/tmp.$$");
      print "出力文字列1";
      print "出力文字列2";
      ...
      close(STDOUT);

      open(IN, "/foo/bar/tmp.$$");
      print <IN>;
      close(IN);

などと自分でバッファに保存し、最終的に出力するのが
よいと思われます。

No. 3544 # yuki 2004/02/04 (水) 17:58:59
ポートに関しては初心者です。
すいませんが、ポート番号について教えて下さい。

Solarisを使用していますが、ポート番号は任意の決め事ですか?
現在使用しているSolarisは下記設定になっているようです。
WEBサーバはポート=80、FTP=20、プリントサーバ=9100

これらは、標準で決まっているのでしょうか?
また、相手側を意識せず勝手にきめてもよいのでしょうか?

他に、ポートの設定をみる方法とかありましたらご教授下さい。
宜しくお願いします。

No. 3545 # 68user 2004/02/04 (水) 18:10:08
>>3544 yuki
> Solarisを使用していますが、ポート番号は任意の決め事ですか?
おおまかな指針はありますが、任意です。

> WEBサーバはポート=80、FTP=20、プリントサーバ=9100
デフォルトではそのような設定になっていますが、ほとんどの
場合は (サーバソフトウェアが対応していれば) ポートは変更
できるでしょう。ポート変更方法は各サーバソフトウェアの
マニュアルに書いてあるはずです。

> また、相手側を意識せず勝手にきめてもよいのでしょうか?
標準的でないポートを使用するよう設定変更してもいいですが、
利用者に通知しないと使うことができません。

例えば web サーバであれば
        http://www.example.co.jp/
ではなく
        http://www.example.co.jp:8080/
にアクセスするようアナウンスしないといけませんし、プリンタで
あれば自組織の環境設定手順書に
    「プリンタの設定時に、ポート xxxx を使用するように設定してください」
と書いておく必要がある、といった感じです。

というわけで、標準的でないポートを使うことはできますが、
なにかとめんどくさい、という感じです。また、外部向けの
サービスであれば、ファイアウォールで弾かれたりする危険性は
高まりますね。

No. 3546 # yosi [E-mail] 2004/02/06 (金) 12:22:43
irix使ってますが、ls -lでfileの詳細を見ると、拡張子の後に*が表示されてます。これはなにを意味するのでしょうか?

No. 3547 # 68user 2004/02/06 (金) 22:17:48
>>3546 yosi
実行ファイルと思われます。ls の -F オプションの説明を読んでください。

No. 3548 # つくも 2004/02/07 (土) 15:13:42
UNIXのCシェル2点につてい教えて下さい。

1点目
以下の、a.txtファイルから第1フィールドの値を
先頭の'0' or "> 0 "のゴミを取って、10桁(先頭0なし)だけを
また、第1フィールドの文末の半角スペースや’|’を取ってとり
だしたいのですが、第1フィールはawkを使って取得できますが、
その後に編集ができません。たしか、sedの何かを使えば数字のみ
だけを取り出せたと思うのですが、浮かんできません。
教えていただけないでしょうか。

cat a.txt | awk -F"," '{ print $1 }' | sed

a.txt
09012345678,aaaa
07055593850,bbbb
9098765432,cccc
7012345678,ddddd
> 07012345679 | ,eeeee
07012345670 ,ffff

出力結果
9012345678
7055593850
9098765432
7012345678
7012345679
7012345670

2点目
Cシェルで定義ファイルに設定してある項目を読み込むには
どうしたらよいのですか。
定義ファイル
MN=ABCDEFG
FILE=/work/temp.txt

set PARM1 = `grep ^MN 定義ファイル| awk -F"=" '{ print $1 }'`
set PARM2 = `grep ^FILE 定義ファイル| awk -F"=" '{ print $1 }'`
と繰り返すかないのでしょうか。
また、何も、タブとか半角スペースから始まっている場合もあると思うの
ですが、どうすればよいのですか。

No. 3549 # zsh 2004/02/09 (月) 08:22:34
>>3548 つくも
1点目はawkのみで可能。
(古いawkではダメとかあるかも知れないけど。)
------
awk 'BEGIN {
                FS = "," ;
} {
                i = match($1,"[1-9]");
                print substr($1,i,10);
}' a.txt
------

2点目は、こんな事が許されるのか判りませんが
------
eval `awk 'BEGIN{ FS="=" }{ if(NF != 0) print "set " $1 " " $2}' param.txt`
------
大人しく定義ファイルで「set A=val」と書いて
sourceすべきだと思いますが・・・

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

No. 3550 # zsh 2004/02/09 (月) 08:28:33
>>3549 zsh
2点目は以下の間違い。
------
eval `awk 'BEGIN{ FS="=" }{ if(NF != 0) print "set " $1 "=" $2 }' param.txt`
------

>68user様
半角カナ失礼しました。

No. 3551 # つくも 2004/02/09 (月) 13:54:08
>>3549 zsh
>>3550 zsh
ありがとうございました。
両方ともできました。

ただ、2点目については、定義ファイルでの変数名とシェル内での設定
する変数名がことなっていたので最初は誤ってしまいました。

No. 3552 # 恵美 2004/02/12 (木) 19:48:32
はじめまして、恵美といいます。
いろいろ検索していましたら、このページにたどり着きました。
私は某会社のSE見習いなのですけれど、perlのリファレンスでつまづき悩んでいます。
ハッシュのリファレンスを上手にコピーする方法がよく、...いえ...さっぱりわからないです。
会社の人にきいたら、リファレンスは知らないと言われ、ダブルショックでした。

リファレンスを、1つ1つコピーすると

$hash->{'str'} = $hash2->{'str'};

これだけなのですが、複数の値を同時にコピーするといつも失敗してます。

普通のハッシュでスライスを使うと、

my %hash = (a=>1,b=>2,c=>3);
my %hash2 = (x=>11,y=>12,z=>13);

@hash{'a','c'} = @hash2{'x','z'};

print $hash{'a'},$hash{'c'},"\n";

  11 13 となるのですけれど、同じことをリファレンスでやると失敗するんですよ。

$hash = {a=>1,b=>2,c=>3};
$hash2 = {x=>11,y=>12,z=>13}

このとき、
print $hash->{'a'},$hash->{'c'},"\n";

の答えはどうしたら、 11 13 になるのでしょうか。

よろしくお願いします。

No. 3553 # 68user 2004/02/12 (木) 23:04:41
>>3552 恵美
    - ($x{'k1'}, $x{'k2'}) は @x{'k1','k2'} と等価 (*1)。
    - ハッシュのリファレンス $y のデリファレンスは $$y{'k1'}
        ($y->{'k1'} と同じ)。

をふまえた上で、今回は ($$y{'k1'}, $$y{'k2'}) を代入したい
ので、*1 を素直に置き換えると
        @$hash{'a','c'} = @$hash2{'x','z'};
となります。

てゆーか、ハッシュスライスは使わない方がいいですよ。配列と
間違えやすいので、可読性低すぎです。わたしなら 2 項目であれば
      $hash->{'a'} = $hash2->{'x'};
      $hash->{'c'} = $hash2->{'z'};
と 2行で書きます。

どうしても短く書きたい場合でも
      ($hash->{'a'}, $hash->{'c'}) = ($hash2->{'x'}, $hash2->{'z'});
とします。

項目数が多いなら
      my %map_table = ('x'=>'a', 'z'=>'c');
      while (my ($fromkey, $tokey) = each %map_table){
            $hash->{$tokey} = $hash2{$fromkey};
      }
とか。長くはなりますが、項目の対応がもっともわかりやすく、タイプ
ミス ($hash と $hash2 を書き間違えるとか) の可能性も減ります。

No. 3554 # 恵美 2004/02/13 (金) 01:33:24
こんにちは恵美です。
どうもありがとうです(^^)v
すっかり解決して嬉しいです。
リファレンスはいまいちよくわかってないけど...

複数行で記述するのを1行でって思ってずっと悩んでいたんだけど、心の中を読まれちゃったかな...

なんか、すごすぎるページなのでちょくちょく見に来ます。

おやすみなさい。
今日はありがとう(^^)

No. 3555 # 瀧上 2004/02/15 (日) 21:46:41
はじめまして、瀧上と申します。
現在UNIX環境でのバッチ処理方式・環境設計を行っています。
開発経験はあるのですが、環境構築からやるのは初めてで頭を悩ましています。宜しければ下記の点についてご教授下さい。

デバッグメッセージの出力有無の切替について教えて下さい。
開発言語はCシェル&Cです。
以前のプロジェクトではC言語におけるデバッグメッセージを出力するしないを、環境変数で設定してしました。おそらく、これを見る事によりデバッグメッセージ出力用の共通関数にデバッグのON/OFFを切り替えさせていたのだと思います。
もし、上記以外に一般的な(適切)な方法があるなら教えて下さい。
レベルの低い質問で申し訳ないのですが、よろしくお願い致します。

※UNIXの環境構築や、ジョブスケジューラにおけるNET設計の参考となる
    URLをご存知であれば教えていただきたいです。
    

No. 3556 # 68user 2004/02/16 (月) 10:23:10
>>3555 瀧上
> 上記以外に一般的な(適切)な方法があるなら教えて下さい。
しょせん決め事なので、一般解はありませんが、
      - コマンドオプション (--debug や -d など) を指定する
      - make debug で、デバッグ用バイナリを生成する
      - make install すると ~/bin/ に通常バイナリを、~/bin/debug/
          にデバッグ用バイナリを格納する
などの方法があります。

どれでもいいので、いずれかをプロジェクトのルールとして決定して
おくのがよいでしょう。

わたしの場合、
        「デバッグモードは開発時のためのモードではなく、通常運用時や
            後々のバグ追及時にこそ有用なもの」
という考え方なので、わたしが好む方法は以下の通りです。

      - デバッグモードを実装する。デバッグモードの場合、rollback
          するなどして、データを一切更新しないようにする (まわりの環境に
          一切影響を与えない)
      - デバッグモードとは別に、冗長なメッセージを出すだけの冗長
          モード (verbose モード) を実装する。冗長モードの場合は、
          通常どおりデータを更新する。
      - エラー発生に気づきやすいよう、ログに吐いたメッセージは
          標準出力・標準エラー出力にも吐くようにする。
      - オプションでデバッグモード・冗長モードを切り替えられること。
          例えば --debug でデバッグモード、--verbose で冗長モード、など。
          デバッグモードの場合、自動的に冗長モードも有効にするようにする。

コード例は以下の通り。

          int debug_flg = 0;
          int verbose_flg = 0;
          for ( i=1 ; i<argc ; i++ ){
                  if ( strcmp(argv[i], "--debug") == 0 ){
                          debug_flg = 1;
                          verbose_flg = 1;
                  }
                  if ( strcmp(argv[i], "--verbose") == 0 ){
                          verbose_flg = 1;
                  }
          }

          /* こんな感じで各種情報を出力 */
          verbose("ほげほげ foo=[%d]", foo);

          ....
          if ( debug_flg ){
                  EXEC SQL ROLLBACK RELEASE WORK;
          } else {
                  EXEC SQL COMMIT RELEASE WORK;
          }

          void
          verbose(char *fmt, ... ){
                  va_list ap;
                  char buf[8192];

                  /* verbose モードでなければ、何もしない */
                  if ( ! verbose_flg ){ return; }

                  va_start(ap, fmt);
                  vsnprintf(buf, sizeof(buf-1), fmt, ap);
                  va_end(ap);

                  fprintf(stderr, "debug: %s", buf);
          }

使い方としては、
      - 単に詳細なメッセージを表示したい場合は冗長モードを使う。
      - まわりの環境に影響を与えず、とりあえずうまく動くか確かめたい
          場合はデバッグモードを使う。
となります。


> UNIXの環境構築
UNIX の環境構築と言っても範囲が広すぎるので、なんともいえません。

> ジョブスケジューラにおけるNET設計
これは何でしょうか? JP1 とかの話?

No. 3557 # 瀧上 2004/02/16 (月) 12:32:15
大変参考になります。
方式だけでなく、考え方とコードまで載せていただいたのは恐縮です。
参考例を深慮して方式を定めます。
ありがとうございました。

> UNIXの環境構築
UNIX の環境構築と言っても範囲が広すぎるので、なんともいえません。
→そうですね、すみません、主にUNIX環境でのバッチ処理におけるShellの置き場所や構成の最適な方式を調査できるHPを探していました。「コンパイラ等、ツールの環境(変数)設定ファイルは全て別で持つのが好ましいのか」、、とか、「バッチ処理起動shellでsourceする環境設定ファイルにディレクトリとOracleSIDを考えているが、これが最適なのか?」等です。。。開発、本番時に必要な要件を洗い出していけばおのずと出てくると思うので、考えてみます。 開発とUNIXでの開発経験が乏しいので、自分の知っている方式を、プロジェクトの標準として使っていいのか不安なのです(^^;)

> ジョブスケジューラにおけるNET設計
これは何でしょうか? JP1 とかの話?
そうです。本日書籍購入しました。上記と同じで、もし有効なHP等ご存知であれば教えてもらいたいと思ったので。。。。
    

No. 3558 # 68user 2004/02/16 (月) 15:45:23
>>3557 瀧上
> 主にUNIX環境でのバッチ処理におけるShellの置き場所や
> 構成の最適な方式を調査できるHPを探していました。
そういうことを書いている web は見たことないですね。基本的に趣味で
やってる人には関係ないし、それを知ってる企業は「ノウハウ」として
隠してしまいますので。

# しょーもないやり方を「ノウハウ」などと称しているところも
# 多いわけですが。

ちょっと長くなりますが、まぁひととおり書いてみます。


まず、ユーザを複数作ります。例えばユーザ名が hoge なら、
      hogedevel (開発環境)
      hogesi (SI (結合テスト) 環境)
      hogert (RT (受入テスト) 環境)
の 3つくらい。それぞれのホームディレクトリは /home/hogedevel,
/home/hogesi, /home/hogert などとします。

さらに DB が必要であれば、これも 3つ (hogedevel, hogesi,
hogert) 作ります。

通常の開発は hogedevel を使います。hogesi や hogert は
テストの段階で初めて使います。
      「開発者は基本的に hogedevel しか使ってはいけない」
というシバリを入れるのもよいでしょう。


各ホームディレクトリの下には
        src/ ソース置き場。CVS などでソース管理すること。
        conf/ 手で管理する設定ファイルなどを置く場所。
        bin/ バイナリ置き場。src で make install すると作成される。
        lib/ バイナリ以外の設定ファイルやデータファイルなど。
                  src で make install すると作成されるものに限る。
        log/ ログファイル置き場
        dat/ 生成するデータファイル・他から送られてきたデータファイル
とします。

つまり src/ で make install すると bin/, lib/ が作成される
わけなので、bin/ や lib/ は消しても src/ を元に再作成する
ことができます。

しかし conf/ は手動管理の設定ファイル群なので、こちらは
消してはいけません (conf/ も CVS などで管理するのがよい
でしょう)。

lib/ には、プログラムで生成する雛型のファイルとか、SQL*Loader
用に喰わせるファイルなど、devel, si, rt で共用のファイルを置き
ます (実行形式のバイナリではないけど、プログラムの一部と見なして
よいものを置く)。


で、環境変数は
      /home/hogedevel/conf/env.sh
      /home/hogesi/conf/env.sh
      /home/hogert/conf/env.sh

      ORACLE_SID=hogedevel
      HOME=/home/hogedevel
      PATH=/home/hogedevel/bin
      ORACLE_HOME=...
書きます。

これを source して各アプリが起動し、
      - DB の接続先は $ORACLE_SID とする
      - $HOME/log/ にログを吐く
      - $HOME/data/ にデータファイルを作成する
とします。


というわけで、基本的には
> バッチ処理起動shellでsourceする環境設定ファイルにディレクトリと
> OracleSIDを考えているが、これが最適なのか?
それでよいと思います。

> コンパイラ等、ツールの環境(変数)設定ファイルは全て別で持つのが
> 好ましいのか
どういうファイルのことを指しているのかよくわかりませんが、
      $ORACLE_HOME/precomp/lib/env_precomp.mk
とかですか?

基本的に、この辺は共通でよいのではないでしょうか。もし、一部の
プログラムで特殊なことをしたければ Makefile 内で上書きすればよい
わけで。

あと、いくつか気をつけるポイントをあげておきます。

      - ディレクトリやファイルは絶対に手で作成しない。

          手で作成するとかならずミスするので、全て Makefile に
          記述する。

      - CVS などのソース管理ツールを活用する。

          /home/hoge{si,rt}/src/ に手でソースを配置し、手で make install
          する、というやり方は極力避ける。CVS などでマスタ管理し、
                  毎日朝 AM6:00 に、自動的に ~hoge{si,rt}/src にソースを
                  checkout し、make install
          などと、全てを自動化するのがベスト。

この他に何か質問があれば、もう少しポイントを絞って、具体例を
あげてください。

>> これは何でしょうか? JP1 とかの話?
> そうです。本日書籍購入しました。
非オープン系なアプリの場合、web 上からの情報収集は厳しいかと
思います。

JP1 は使ったことがないのでわかりません (わたしは cron の代替品、程度の
認識しかありませんが)。やっぱり便利なんですかねぇ。

No. 3559 # 68user 2004/02/16 (月) 15:54:18
>>3558 68user
> しかし conf/ は手動管理の設定ファイル群なので、こちらは
> 消してはいけません (conf/ も CVS などで管理するのがよい
> でしょう)。
lib/ との違いがわかりづらい気がするので補足。

hoge{devel,si,rt} で異なる設定ファイルは conf/ に、そうでない
ものは lib/ に置く、という意味です。

もちろん make 時に環境によって異なるファイルを lib/ にインス
トールできれば conf/ などいらないのですが、それを実現するためにMakefile に複雑な細工をしなければいけないケースがあったりするので。

No. 3560 # ふくし [E-mail] 2004/02/17 (火) 19:43:42
おひさしぶりです。困ったときばっかり登場してすみません。
たぶんあけましておめでとうございます。

ここ5年ぐらいメンテしてる CGI なんですが、
根本的な改革を迫られました。

A.cgi が生成するページにおいて、
ボタンを押したら(可変パラメータ付きで)
B.cgi が生成するページに進み、
リンクを押したら(可変パラメータなしで)
C.cgi が生成するページに進むという実装になっています。

ところが、ここで C.cgi にも
A.cgi で選択入力する可変パラメータを渡さなければ
ならなくなったのです。

A、B、C 非常に肥大化していて、安易な解決法が欲しい状況です。
CGI のみで解決できればうれしいですが、
場合によっては JavaScript でもかまいません。
なにかあればご教示願えれば幸甚です。よろしくお願いします。

No. 3561 # 68user 2004/02/17 (火) 22:06:10
>>3560 ふくし
これを機にリファクタリングした方が、のちのち幸せになれると
思いますよ。

…というのは十分承知しておられると思うので、その場
しのぎな案を 2つばかり。

1. B.cgi で受けたパラメータを
            print qq(<input type=hidden name="param_from_a"
                                value="$ENV{QUERY_STRING}">\n);
      などとまるごと C.cgi に渡す。

2. 隠しフレームを作っておいて、A.cgi で選択されたら
      onClick などでフォーム内容を隠しフレームに転記して
      おき、(B.cgi は無修正で) C.cgi がその隠しフレームを読む。

No. 3562 # 瀧上 2004/02/17 (火) 23:41:32
アクセスが遅くなり申し訳ありません。瀧上です。
丁寧なご回答ありがとうございます。
工程別のユーザの切り分けは私の方でも近い形で考えており、ご回答に近い形で定めようと思っています。→開発環境ではユーザを分けますが。
とりあえず考え方に大きなずれが無い事が判明してほっとしています。
ディレクトリですがConfの概念は無くこれはこちらを参考に構成を考えようと思います。CVSはシステム標準で構成管理ツールとして使用することが決定しています。デバッグモードの考え方は、色濃く方式に出そうです(^^;)

ところで申し訳ないのですがもう少し勉強させてもらいたい事がありまして、お言葉に甘えていくつか質問させてください。

→たとえばログイン時に「.cshrc」から「環境変数設定ファイル」をSourceしたとして、この時「環境変数設定ファイル」から設定した環境変数は、サーバDOWNかそれを書き換えるまで確実に保証されるのでしょうか?

→LIBがmakeInstall時に取り込まれるものだとしたら、
    動的なライブラリはUNIXにおける開発ではあまり使用しないものなのですしょうか?システム共通部品等は動的ライブラリから呼び出すのが一般的かなと思っているのですが。

    /COMMON/bin/xxxxx.so←拡張子も「.so」一般的なのか疑問ですが、
                                                 dllでは無いと思うので。。。
                                                 もしくは実行ファイルとしてbinに持つ?

No. 3563 # ふくし [E-mail] 2004/02/18 (水) 11:20:50
>>3651 68user
すいません、題意を間違えて伝えたかもしれません。
これでよかったです。

  A.CGI
    start_form(action="B.CGI");
        フォーム要素1;
    end_form;
    start_form(action="C.CGI");
        フォーム要素2;
    end_form;

要は B と C に別の可変要素を渡すのなら、これでできたんですね。
昨日それでできるんじゃないカナと思ってたんですが、
コードにバグをつくっていました。

なお、ボタンを submit にしないで、name をつけ、
name を JavaScript で読み取って切り分ける、という方法も
あるようです。これならフォーム要素を共有できるな。
http://webmaster.hatena.ne.jp/1069376628



事情を説明すると、5年越しということでおわかりいただけると
思いますが、FileMaker で作っていた経理システムが 2000 年問題で
止まる(私製のテンプレートがダサくて)という話があり、
その時個人的に見積書を CGI で出していたことがバレ、
2000 年の 3 月にはちゃんとした業者ウェアを入れるから
それまでそれっぽいものを動かしてよ、と言われました。
で、2000 年の 3 月に、業者ウェアの日本語対応ができないと分かり
(ガイシ系なんで・・・)
その年いっぱい動かすことになりました。
以下、同じことが 200年、2001年、2002年、2003年に起こりました。
いよいよ今年の5月にこのシステムが正式に引退させることが
決定した(・・・)のですが、その前にどうしても大きな山を
乗り越えるためにプログラムを改造することになったのです。
でも「どうせ5月に引退すると決まっているシステムに大金を
投じるわけにはいかない」ので、それだけに長い時間を避けないんです。
人生いろいろですね:)

No. 3564 # たけ 2004/02/18 (水) 12:34:47
教えてください。
指定したポートを開放するために必要なinetd.confの設定方法を教えてください。また、他に必要な設定が必要でしょうか。
ご教授お願い致します。

No. 3565 # 68user 2004/02/18 (水) 22:27:42
>>3562 瀧上
> たとえばログイン時に「.cshrc」から「環境変数設定ファイル」を
> Sourceしたとして、この時「環境変数設定ファイル」から設定した
> 環境変数は、サーバDOWNかそれを書き換えるまで確実に保証される
> のでしょうか?
setenv で更新したら変更されます。.cshrc を更新しても、
明示的に source したり、ログインしなおさないと反映
されません。

よって、プログラムの先頭で source するか、cron であれば
        * * * * * . /home/hoge/env.sh && /home/hoge/bin/foo
としておくのがよいでしょう (JP1 でも何かしら環境変数を
指定するような設定があるのではないかと想像します)。

> LIBがmakeInstall時に取り込まれるものだとしたら、
そういう意図ではなく、実行時に必要ないろいろなファイルの
置き場所、として書きました。

もし動的ライブラリを使うなら lib/ に置くことになる
でしょうね。

でなくて、静的にリンクするなら、ライブラリは src/ の
下だけ置いて、アプリのmake install 時にリンクしmasu.
ライブラリ自体は lib/ に make install しません (実行時
には必要ないので)。

で、それはそれとして
> 動的なライブラリはUNIXにおける開発ではあまり使用しない
> ものなのですしょうか?
についてですが、わたしの場合は静的にリンクする方法を
好みますが、別に動的リンクがダメと言うほどではないです。

業務系では多少のメモリ使用量の多寡ははどうでもよいので、
構成管理のやりやすさだけを考慮すれば構わないと考えます。

で、例えば、

    1. ライブラリ関数 func をプログラム A・B・C が使用している。
    2. プログラム A に不具合が発生。すぐに修正版をリリース
          しなければならない。
    3. 原因は func であることが判明。しかし func の呼び出し方の
          違いから、プログラム B・C ではこの現象は発生しない。

という状況を考えます。

静的にリンクしている場合、もし人的リソースに余裕があり、
func 修正時にプログラム A・B・C のテストをすることができる
なら、修正版 func のリリース時にプログラム A・B・C を再
コンパイルすることができます (これが最も望ましい)。

しかし、プログラム B・C をテストする余裕がない場合、
      func を修正して再コンパイルし、プログラム A を再コンパイル
とすることで、プログラム B・C に影響を与えず func を修正
するという選択肢をとることができます。

ただしこれは
        プログラム A が使用している func と、プログラム
        B・C が使用している func が異なる
という管理しづらい状況になるため、次期リリース時に全てを
再コンパイルするまでの時間かせぎです。


つまり、静的リンクの場合、
      目の前のリスクを少なくしたいなら
          → プログラム A のみを再コンパイル
      構成を単純にしたいなら
          → プログラム A・B・C を再コンパイル
と、状況に応じた選択が可能です。

しかし動的ライブラリだと、動的ライブラリを入れ替えて、
プログラム B・C に不具合が出るかもしれないリスクを負う
という選択肢しかありません。

よって、わたしは静的にリンクする方を選びます。


ただし静的リンクの場合、再コンパイル忘れなどで各プログラムが
使用しているライブラリのバージョンが異なる、という状況が発生
する可能性がありますが、この対策として、定期リリース時に商用
環境の
      - 全ソース・全プログラムを削除
      - 最新版のソースを全て再コンパイル
      - 全プログラムを make install
とすれば OK でしょう (最上位ディレクトリで make && make install
すれば全アプリ入れ替え完了)。

# 仮に動的リンクを選択したとしても、上記の「定期リリース
# ごとに全部インストールしなおす」というやり方は強く
# おすすめしておきます。

No. 3566 # 68user 2004/02/18 (水) 22:32:15
>>3564 たけ
> 指定したポートを開放するために必要なinetd.confの
> 設定方法を教えてください。
質問が曖昧すぎて答えられません。inetd のマニュアルと
/etc/inetd.conf にある他の設定例を見てください。

それでもわからなければ、何がしたいのかを明記した上で
再度質問してください。

No. 3567 # うこん 2004/02/19 (木) 20:31:09
はじめまして。初心者ですが、コマンドはどこに打てばいいんですか?

No. 3568 # すすむ 2004/02/19 (木) 23:45:42
以下のようなファイルからaddとmodとdelのerrrorがある行を
取り出したいのですが、

------ ここから -----------
---- server1 ----
add:yamada:success
add:saito:error
mod:yamamoto:success
mod:ikeda:error
del:yamaguchi:success
del:butou:error

---- server2 -----
add:yamada:success
add:saito:error
mod:yamamoto:success
mod:ikeda:error
del:yamaguchi:success
del:butou:error

------ ここまで ----------

grep -v "\-\-\-" ファイル名 | grep -v success

で一応とりだせるのですが、改行の2行が含まれて
しまいます。空改行を含まず1回の処理でやりたいのですが
どうすればよいのですか。

No. 3569 # すすむ 2004/02/20 (金) 02:12:12
>>3568 すすむ

環境を書き忘れました。
SunOSで、Bシェルです。

No. 3570 # zsh 2004/02/20 (金) 10:53:37
>>3568 すすむ
errorを取り出したいなら素直に
grep ":error" filename
とすれば良いのでは?

まぁ名前にerrorが含まれる人がいると引っかかってしまうので
正規表現使うべきなんだろうけど。

No. 3571 # つくも 2004/02/20 (金) 12:14:56
>>3568 すすむ
賢いかはわかりませんが、

grep -v "\-----" ファイル名 | grep -v success | awk '{ if(NF != 0) print $0 }'

でできませんか。

No. 3572 # すすむ 2004/02/20 (金) 12:17:41
>>3568 すすむ

「success」と「error」と簡単に書きましたが、
成功の場合は、「success」で、失敗の場合は、エラーメッセージが
でます。
「error」だけでは、引っ掛けられません。

No. 3573 # 68user 2004/02/20 (金) 12:54:19
>>3567 うこん
あなたが置かれている状況がわからないので、回答できません。

>>3568 すすむ
わたしなら
      egrep '^(add|mod|del):' | grep -v ':success$'
とします。

No. 3574 # zsh 2004/02/20 (金) 13:15:19
>>3572 すすむ
であれば、
egrep -v '^(-|$|.*:success$)' filename
とか?

No. 3575 # すすむ 2004/02/20 (金) 16:00:58
>>3573 68user
>>3574 zsh

zshさん、68userさん
ありがとうございます。
egrepですか。

使用したことがないのですが、
「'^(-|$|.*:success$)' 」
の使い方につてい教えてください。

No. 3576 # /tk 2004/02/20 (金) 16:06:04
>>3561 68user
> 1. B.cgi で受けたパラメータを
> print qq(<input type=hidden name="param_from_a"
> value="$ENV{QUERY_STRING}">\n);
> などとまるごと C.cgi に渡す。
「などと」と書いてあるので, 細かいところは省略してあるのでしょうが
このままの記述ですと, パラメータの区切りが「&」という前提にて
パラメータの名前が「copy」や「reg」だった時に悲しい結果が待ってます。

理由はこのへん
http://www.ne.jp/asahi/minazuki/bakera/html/opinion/ampersand

No. 3577 # 瀧上 2004/02/21 (土) 19:01:34
>>3565 
ご回答ありがとうございます。
ライブラリの考え方は参考になります。
要件が無ければ原則禁止にしてしまおうかななんて。。。検討中です。。

ところでshellでバッチを走らせる時はユーザ設定を行わないようにするのがいいのですね。UNIXの部屋にある↓を見て気づきました。
「#!/bin/csh -f というのをよく見かけるが、その場合ユーザ独自の ~/.cshrc は読まれないので、エイリアスやシェル変数は使用できなくなる。」
なので今回はshellの構成は下記の様にするつもりです。ご報告まで。。。
----------------------------------
#!/bin/csh -f
#-------------------
#shell
#
#-------------------
source COMMON.src #→システム共通のパス(oracle等)や文字指定(LANG等)
source 環境.env   #→システム共通環境変数設定等

処理・・・・
-----------------------

No. 3578 # 瀧上 2004/02/22 (日) 18:22:17
Makeの環境について教えて下さい。
現在下記のディレクトリを作成して開発環境としようと考えていました。

/src /* makefileとsrcを保管     */
/obj /* make時の中間ファイルを保管 */
/bin /* 実行ファイルを保管     */

するとあるガイドに「.oと.cを別ディレクトリに置くとmake時のタイムスタンプの比較が困難になるのでやめるべきだ」、と書いてありました。
「個々の依存関係をいちいち指定しなければならない。」ともあり、「いちいち」等と書かれると非常に非効率な事の様に感じるのですが。。。

「.cと.oは同一ディレクトリに持つ」が一般開発業務で用いられる主要な方式なのでしょうか?
単体環境だと不特定多数の人間が多様なsrcファイルを作るのであまり余計なファイルを置いてごちゃごちゃさせたくないと言うのが理由で分けてるだけなので同一ディレクトリも特に問題は無いのですが。。。(消されても問題は無いファイルですし。。)
依存関係をmakefileに指定して別ディレクトリ管理と言うのはやらないのですかね?

No. 3579 # UNIX10ヶ月目 2004/02/22 (日) 21:19:06
No.3568さんに似たような質問なんですが、

ファイルが以下のようにあったとします。
_________________________________________
aaa bb ccc 02/22 ddd e1.3 fff
_________________________________________
その時に、実行するたびにe1.3の数字をe1.4、e1.5と実行
するたびに数字を0.1ずつ変更したいんですがCシェルで
そのような事をしたいのですが、どうしたらいいのでしょうか。
ご教授お願いします。

No. 3580 # zsh 2004/02/23 (月) 18:19:24
>>3579 UNIX10ヶ月目
例えば、0.0から9.9まで表示するには以下のような方法があります。
------
@ i = 0
while ( $i < 10 )
    @ j = 0
    @ n = $i * 10
    while ( $j < 10 )
        @ m = $n + $j
        set cnt = `echo "scale=1; $m/10" | bc`
        printf "0.1f\n" $cnt
        @ j++
    end
    @ i++
end
------
※:シェル変数cntに代入してprintfしているのは、0.0を出力するためです。

>>3575 すすむ
申し訳ありませんが、正規表現について解説された書籍を見るか
Webサイト等を探してください。
自分で回答しておいてなんですが、68user様の方法が良いと思います。
自分のはコマンドを強引に1つにまとめただけですので。

No. 3581 # つとむ 2004/02/24 (火) 11:14:23
Bシェルにつてい教えて下さい。

Bシェルで一次元配列を使用しているのですが、
HP-UX11.00で動いていたシェルスクリプトをSunOS5.8に移して
動かしたのですが上手くうごきません。

MONTHES[0]=Dec: 見つかりません。
MONTHES[1]=Jan: 見つかりません。
        :
置換が正しくありません。

となります。
どうのように修正すれば、動きますか。

------------------
#!/bin/sh
#

MONTHES[0]="Dec"
MONTHES[1]="Jan"
MONTHES[2]="Feb"
MONTHES[3]="Mar"
MONTHES[4]="Apr"
MONTHES[5]="May"
MONTHES[6]="Jun"
MONTHES[7]="Jul"
MONTHES[8]="Aug"
MONTHES[9]="Sep"
MONTHES[10]="Oct"
MONTHES[11]="Nov"

i=0
while [ $i -le 11 ]
do
        echo ${MONTHES[$i]}
        i=`expr $i + 1`
done

No. 3582 # zsh 2004/02/24 (火) 18:29:28
これなら動く筈。(未確認)

------------------
#!/bin/sh
#

MONTHES0="Dec"
MONTHES1="Jan"
MONTHES2="Feb"
MONTHES3="Mar"
MONTHES4="Apr"
MONTHES5="May"
MONTHES6="Jun"
MONTHES7="Jul"
MONTHES8="Aug"
MONTHES9="Sep"
MONTHES10="Oct"
MONTHES11="Nov"

i=0
while [ $i -le 11 ]
do
                eval echo $"MONTHES$i"
                i=`expr $i + 1`
done

No. 3583 # すすむ 2004/02/24 (火) 22:06:04
>3582

zshさん
ありがとうございます。
上手くいきました。

No. 3584 # つとむ 2004/02/25 (水) 01:54:25
>3582

UNIXといってもHP-UXとSunOS(Solaris)で違うのだから
Bシェルだからといって同じ機能jが使えるわけではない
のですね。

No. 3585 # zsh 2004/02/25 (水) 17:58:19
>>3584 つとむ
HP-UXは知らないのですが、配列使えるあたりがkshっぽいですね。

他の部分(スクリプト)がどうなっているかにもよりますが
kshに変えたほうが修正が少なくて済むかも知れません。
下ののシェルだったら、
一行目を「#!/bin/ksh」に変えるだけで動きそうです。

No. 3586 # まさどん 2004/02/25 (水) 23:48:27
はじめまして。本日暗号化について調べていたらこのホームページにたどり着きました。暗号化したいのは会社でPOPメールの受信ができないためメールを受信して暗号化し、Webメールなどに投げるようなプログラムでも作ろうかと思い立っていたため、こちらのホームページの内容は非常に役に立ちました。ありがとうございます。

No. 3587 # 68user 2004/02/26 (木) 02:38:49
>>3577 瀧上
> 「.oと.cを別ディレクトリに置くとmake時のタイムスタンプの
> 比較が困難になるのでやめるべきだ」
かどうかは知りませんが、とりあえずわたしは .o と
.c を別にするやり方を知りません。

# *BSD などは .c と .o が別になっているので、やろうと
# 思えばできるとは思いますが。

で、分ける必要があるかどうかですが、
> あまり余計なファイルを置いてごちゃごちゃさせたくない
という理由であれば、cvs add しなければリポジトリに
登録されないので、「*.o は cvs add してはいけない」
という教育さえしておけば十分ではないでしょうか。

時間が経つにつれソース置き場にゴミがたまるのが嫌だ
ということであれば、定期的にソース置き場を削除し、
checkout することをお勧めします。

わたしは開発環境であっても、毎日ソース置き場を削除、
checkout、make、make install して、まっさらにする
方法が好みです。

# メンバ全員のアカウントをあらかじめ作成しておき、
# 開発は、各メンバのホームディレクトリで行わせる。


>>3585 zsh
> HP-UXは知らないのですが、配列使えるあたりがksh
> っぽいですね。
/usr/xpg4/ に POSIX 系を集めている Solaris とは
違い、HP-UX は OS 全体として POSIX を重視している
ような印象を受けます。sh と ksh は別コマンドに
なってはいますが、sh はかなり POSIX 寄りです。

Bourne shell は /usr/old/bin/sh にあったりします。


>>3575 すすむ
> 「'^(-|$|.*:success$)' 」
'a(x|y|z)' は ax か ay か az にマッチするので、
'^(-|$|.*:success$)' は ^- か ^$ か ^.*:success$
にマッチします。後は正規表現を勉強してください。

No. 3588 # 68user 2004/02/27 (金) 00:11:08
>>3586 まさどん
ありがとうございます。

ついでと言ってはアレですが、掲示板の名称を
    「UNIX、CGI、ネットワーク、Java Servlet についての掲示板」
改め
    「UNIX、CGI、ネットワーク、暗号技術についての掲示板」
としました。


ついでに今日調べたことのメモ。OpenSSL を使って RSA で暗号化 & 復号化。

--------- ここから ---------
#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/engine.h>
int
main(){
    unsigned char plain_str[]="hogehoge";
    unsigned char crypted_str[200];
    unsigned char decrypted_str[200];
    char errbuf[1024];
    RSA *rsa;
    int n;

    ERR_load_crypto_strings();

    rsa = RSA_generate_key(1024, 65537, NULL, NULL);
    printf("rsa->n = 0x"); BN_print_fp(stdout, rsa->n); putchar('\n');
    printf("rsa->e = 0x"); BN_print_fp(stdout, rsa->e); putchar('\n');
    printf("rsa->d = 0x"); BN_print_fp(stdout, rsa->d); putchar('\n');
    printf("rsa->p = 0x"); BN_print_fp(stdout, rsa->p); putchar('\n');
    printf("rsa->q = 0x"); BN_print_fp(stdout, rsa->q); putchar('\n');
    
    /* printf("RSA_size(rsa)=%d\n", RSA_size(rsa)); */

    /* 暗号化 */
    n = RSA_private_encrypt(strlen(plain_str), plain_str, crypted_str, rsa, RSA_PKCS1_PADDING);
    if ( n == -1 ){
        printf("in encrypt: err=%s\n", ERR_error_string(ERR_get_error(), errbuf));
        goto ERR;
    }
    /* printf("%s\n", crypted_str);*/

    /* 復号化 */
    n = RSA_public_decrypt(n, crypted_str, decrypted_str, rsa, RSA_PKCS1_PADDING);
    if ( n == -1 ){
        printf("in decrypt: err=%s\n", ERR_error_string(ERR_get_error(), errbuf));
        goto ERR;
    }
    /* 検証 */
    if ( strncmp(plain_str, decrypted_str, n) == 0 ){
        printf("OK! plain_str=[%s] decrypted_str=[%.*s]\n", plain_str, n, decrypted_str);
    } else {
        printf("NG! plain_str=[%s] decrypted_str=[%.*s]\n", plain_str, n, decrypted_str);
        goto ERR;
    }
    return 1;

  ERR:
    RSA_free(rsa);
    return 0;
}
--------- ここまで ---------

実行例:
      rsa->n = 0xCA0CBEC6C0384F0387557A9E27A60A9039AB9FAC4D4AE1DA1E08F00093632FAA734AF75E86632E7AFC660A00BF1D703902B57B64CFACD0069314A105295F7624157D3A484C6E1FEBA5A46047E6AE91161DCD51BA7D75B83358F3506D069AEB987D183C0FC21C1BE1F2DF5A0BFF991DB13EFD1E9F079E92BE25CB2BB7D7AD703F
      rsa->e = 0x10001
      rsa->d = 0x35DA87CEF9D5085A6C6C002EBF6AA64E22D0F7D23917C87316A653321416CFD1A2C14C85C9540E43819AC0F7C9F8D2BC9F5837F77AD318EF67AC8BEE90447D7C4F705C57130095BFB51697ECB64CF686414980E1BC814F6AD3EDB3BC2232F88D32892592093E6103AAF89C23B9544254386611B145B9327AA074398D15E60A41
      rsa->p = 0xE4A4D51718E83BF3CF91E0C187EB910FFAED34C37858667A6C27F83020DCF7D2DABA5D0B2CD0FAD0A075E06938420F09111F0A5DEA9B443CAAF6674C343944E7
      rsa->q = 0xE2395BC32DAA75945F637F88F9BB7C05157464C99168E229E5ED86A3A1EE19498BC357E849505F3C2CA7DC868068880E14FA7ADA01B7BD9897A18FB3573336E9
      OK! plain_str=[hogehoge] decrypted_str=[hogehoge]


RSA_generate_key() で RSA 鍵を生成できる。
      引数:
          鍵の bit 数 (この例では 1024 bit)、e (3,17,65537 など)、その他

鍵長についてはよくわからない。上記の例 (平文が hogehoge) では、bit 数を
145 以上にしないと encyrypt 時にエラーになる。なぜ 145? 平文を m として、
m<n ならよいのではないの?

戻り値は
      typedef struct {
            BIGNUM *n;
            BIGNUM *e;
            BIGNUM *d;
            BIGNUM *p;
      } RSA;
的な構造体のポインタ。これが RSA 鍵。詳細は rsa(3)。

それぞれ、以下のような感じ。
    e: encryption exponent (OpenSSL 的には public exponent。暗号化指数)
          ここでは 65537 (=0x10001)。
    n: RSA-modules (OpenSSL 的には public modulus と表記)
    d: decryption exponent (OpenSSL 的には private exponent。復号化指数)
    p,q: 素数のペア

公開鍵は e,n。秘密鍵は d,n。ただし、「秘密鍵は d」と定義している
web・本も散見される。どちらが正しい? まぁ n は公開するわけなので、
どっちでもいいのか?

BIGNUM は OpenSSL 付属の多倍長整数ライブラリ。上記の例のように BN_print_fp
などを使うことで、内容を確認できる。詳細は bn(3)。
ちなみに BIO は OpenSSL 付属の I/O 抽象化レイヤ。詳細は bio(3)。

crypto 関係のエラーコードは unsigned long ERR_get_error(void) を
使うことで取得できる。そのコードを ERR_get_string() に喰わせると
      error:0407006A:lib(4):func(112):reason(106)
という文字列が得られるが、これではわけがわからん。そこで、あらかじめ
      ERR_load_crypto_strings();
としておけば、ERR_get_string() の結果が
      error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01
という文字列になる。ちなみに
      % openssl errstr 0407006A
      error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01
とすればコマンドラインからでも取得可能。

RSA の秘密鍵による暗号化は RSA_private_encrypt() を使う。
第四引数はパディング方式。ここでは RSA_PKCS1_PADDING として
いるので、PKCS#1 の方式で勝手にパディングしてくれる。
RSA_NO_PADDING を選ぶとパディングが行われないので、呼び出し側が
平文を適切な長さにパディングする必要がある。RSA_private_encrypt の
戻り値は暗号文の長さ。

復号化は RSA_public_decrypt() で。戻り値は復号化した結果の
長さ。復号化されたデータの文字終端などが自動でセットされる
わけではないので、printf("%.*s") などと自分で長さを管理すること。

上記の例では、暗号化した文字列を unsigned char crypted_str[200]
に入れているが、正しくは RSA_size() で得た長さ分の領域を確保して
おくこと。

参考: http://www.cybersyndrome.net/rsa/

No. 3589 # 68user 2004/02/29 (日) 02:31:57
RSA で暗号化してみよう (1)・(2) を作成しました。間違いや
わかりにくい部分の指摘は大歓迎です。
    http://x68000.startshop.co.jp/~68user/net/rsa-1.html
    http://x68000.startshop.co.jp/~68user/net/rsa-2.html

しかし暗号はおもしろい。何かリクエストがあれば (わたしの
レベルを見極めた上で) 書いてください。

No. 3590 # へにか [URL] 2004/02/29 (日) 08:51:10
暗号技術大全を持ってらしているのですね。奇遇ですね、僕もこの間
購入してしまいました。僕はハードっぽい図と数学っぽいところに惹
かれて、立ち読みじゃ飽き足らず、買ってしまいました。

#眠いときは枕代わりになるし、持って動かせば筋トレにもなるし、
#一冊三鳥にもなる、良い本です。←冗談です・・・

今のところリクエストはありませんが、確かに暗号技術は面白いの
で、そのうちあるかもしれません。その節は宜しくお願いいたします。

それに、妖精現実フェアリアルも参考にされているのですね! 僕は
双方向処理で行き着いたところは異なりますが、これも奇遇ですね。
というか、そのサイトは凄すぎです。作者は何者なんだ?と思いつつ、
読んでいます。

#全く関係ないですが、Java Servletは興味から外れたのですか?

ご存知だとは思いますが、妖精現実フェアリアルから引用しますので、
ご参考までに。

このウェブサイトは、まもなく終了します。 このページに書いてあった
情報は、特に断り書きがない限り、自由に使ってください(コピー、
改変を含む)。 転載先においても転載自由にしてかまいません。

No. 3591 # 68user 2004/03/02 (火) 02:56:42
>>3590 へにか
> 暗号技術大全を持ってらしているのですね。
まぁ理解できていませんけどね。

理論を学びたいと思って、他にも以下の本を買ってみました。
理解できたかどうかは聞かないでください。

    暗号理論入門
        http://www.amazon.co.jp/exec/obidos/ASIN/4320120442/249-3448296-8649958
    暗号の代数理論
        http://www.amazon.co.jp/exec/obidos/ASIN/4431708472/249-3448296-8649958
    代数と数論の基礎
        http://www.kyoritsu-pub.co.jp/series/21seiki/01561-4.html

暗号は技術的にも非常に面白いですが、暗号として強いのか
弱いのかが第三者からはっきり評価される世界ですので、
やじうま的視点で見ても、とてもおもしろいです。

    http://x68000.startshop.co.jp/~68user/net/crypt-1.html

で紹介した すずきひろのぶ氏の AES 選定にまつわる話も
そうですが、IPA の CRYPTREC
      http://www.ipa.go.jp/security/enc/CRYPTREC/
に応募したものの、門前払いをくらった暗号がどんなものなのか
調べると、非常に興味深いものがあります。

こんなおもしろい世界を学者のモノだけにしておくのは
もったいない。ぜひ興味を持っていただけると幸いです>All

> このウェブサイトは、まもなく終了します。
これは前々から気になっています。終了されると非常に困る
んですが、webarchive.org (正式にはWayback machine って
いうのかな?) があるから まぁ大丈夫かな、と思っています。

# http://web.archive.org/web/*/http://www.faireal.net/articles/7/01/

> Java Servletは興味から外れたのですか?
諸般の事情から、このサーバでは Java Servlet が動かないのです。
そして仕事でも Servlet はやっていないので、遊べる場所がないのです。

今のわたしの興味は

      暗号 > 逆転裁判3 > 質の高い業務系システムを構築する方法 >>>> WEB > UNIX > Java

です。

No. 3592 # 68user 2004/03/02 (火) 22:56:24
メモ。blowfish による暗号化 & 復号化。

#include <stdio.h>
#include <openssl/blowfish.h>
int
main(int argc, char *argv[]){
    BF_KEY key;
    unsigned char keybuf[]="SECRETKEY!";
    unsigned char plain[128]="This is plain!";
    unsigned char encrypted[128];
    unsigned char decrypted[128];
    unsigned char ivec[8];

    BF_set_key(&key, strlen(keybuf), keybuf);

    printf("plain=[%s]\n", plain);

    memset(ivec, 0, sizeof(ivec));
    BF_cbc_encrypt(plain, encrypted, strlen(plain), &key, ivec, BF_ENCRYPT);

    printf("encrypted=[%s]\n", encrypted);

    memset(ivec, 0, sizeof(ivec));
    BF_cbc_encrypt(encrypted, decrypted, strlen(plain), &key, ivec, BF_DECRYPT);

    printf("decrypted=[%s]\n", decrypted);

    return 0;
}

No. 3593 # へにか [URL] 2004/03/02 (火) 23:13:30
ちゃんと読んでません、と書かれているのに突っ込みを入れるのは
失礼かもしれませんが・・・

#こんなこと言っておきながら、嘘だったらごめんなさい。

http://x68000.startshop.co.jp/~68user/net/crypt-1.html
で紹介している
http://www3.sympatico.ca/wienerfamily/Michael/MichaelPapers/TwokeytripleDES.pdf
ですが、確かに2つの鍵を使う3DESは攻撃方法がある、ということも
書いていますが、どっちかって言いますと、既存の方法、すなわち、
§2の、Merkle-Hellman Attackの方法よりも、早い方法がありますよ、
という論文のような気がします。
恐らく、Merkle-Hellman Attackの方法はA=0となる解を2の56乗用意
して、何とかするけれど、この論文の方法はKnown-Plaintextを用いると、
もっと早く解析できますよ、といっているような。

#そのKnown-Plaintextがなんじゃらほい、というところまでは
#精査していませんが。

それ以降はハードウェアのインプリメンテーションの話ですね。

No. 3594 # 68user 2004/03/03 (水) 00:07:43
>>3593 へにか
ありがとうございます。お返事は後ほど。

で、メモその 2。EVP 版 blowfish 暗号化・復号化。なお、
      http://www.openssl.org/docs/crypto/EVP_EncryptInit.html
は古いバージョンの API。OpenSSL の web は本当にひどい。

#include <stdio.h>
#include <openssl/evp.h>

int do_crypt(FILE *in, FILE *out, int enc_mode){
    unsigned char key[]="SECRET!";
    unsigned char iv[8];
    EVP_CIPHER_CTX ctx;
    char outbuf[256];
    int outlen;

    memset(iv, 0, sizeof(iv));
    EVP_CipherInit(&ctx, EVP_bf_cbc(), key, iv, enc_mode);

    while (1){
        char inbuf[128];
        int inlen;
        inlen = fread(inbuf, sizeof(inbuf[0]), sizeof(inbuf)/sizeof(inbuf[0]), in);
        if ( inlen==0 ){
            break;
        }
        EVP_CipherUpdate(&ctx, outbuf, &outlen, inbuf, inlen);
        fwrite(outbuf, sizeof(outbuf[0]), outlen, out);
    }
    EVP_CipherFinal(&ctx, outbuf, &outlen);
    fwrite(outbuf, sizeof(outbuf[0]), outlen, out);
    return 0;
}

int main(int argc, char *argv[]){
    int enc_mode;
    if ( argc == 1 ){
        printf("Specify enc or dec.\n");
        exit(1);
    }
    if ( strcmp(argv[1], "enc") == 0 ){
        enc_mode = BF_ENCRYPT;
    } else if ( strcmp(argv[1], "dec") == 0 ){
        enc_mode = BF_DECRYPT;
    } else {
        printf("Specify enc or dec.\n");
        exit(1);
    }
    do_crypt(stdin, stdout, enc_mode);
    return 0;
}

No. 3595 # 瀧上 2004/03/03 (水) 16:13:46
>>3587 68user
ご回答ありがとうございます。
.oがsrcと同一ディレクトリに存在するのは基本なのですね。
検討した結果、下記の様な仕様にしました。

単体環境:make終了後*.oは自動削除する。単体で1プログラムを対象(実際には共通ライブラリも含まれますが。。)にmakeするのにタイムスタンプを管理する必要は無いと言う結論です。

結合環境:全コンパイルが必要となる結合以降はsrcファイルと同一ディレクトリに.oを保管する。単体完となっているはずなので、修正のあったファイルをupdateするのみとする。

以上結論報告です。(報告されても。。。と思われるかも知れませんが。。(^^;))

No. 3596 # スナフキン 2004/03/05 (金) 17:26:05
質問するのはお久しぶりです。

つかぬ事をお伺いしますが、VineLinux起動中の停電後の再起動で、
非常に冷や汗モノのメッセージが出現しました。

Mounting proc filesystem: mount /proc/: can't read superblock

これがそのメッセージですが、HDDのブート関連の情報が消えたと言う
事になるのでしょうか・・・(死刑宣告?)
もしその最悪の状態の場合に、その他のパーティションのデータ復旧は
望めないでしょうか。
ちなみになぜかCDブートも出来ない状態です。
ファイルシステムはex3です。

神様仏様どうか最悪の状態では無いように・・・アーメン
何でこんな時に・・・

No. 3597 # スナフキン 2004/03/05 (金) 17:33:49
追加情報ですが、df の表示は /dev/hda6 としか表示されません。
fdisk /dev/hda の結果は、Unable to open /dev/hda です。
う〜ん・・・

No. 3598 # 68user 2004/03/05 (金) 18:11:55
>>3593 へにか
いまだ調査中、というか英文と格闘中です。


>>3595 瀧上
単体環境と結合環境のやり方を変える必要があるのかどうかは疑問です。

Makefile を 2つ作るのか、Makefile は 1つで、環境変数などを見て
単体環境の場合のみ *.o を削除するのか、などの実現方法がわからない
のですが、例えば
    - Makefile に記述した依存関係が不正確だった
    - しかし単体環境では毎回全ソースを build するので影響がなかった
    - ところが結合環境に修正ソースを上げたら、依存関係の不正確さから
        狙いのソースがコンパイルされず、古い版の *.o がリンクされてしまった
などということにならないでしょうか?

ソースが非常に大規模なのでこういう仕組みを作らないと運用できない、
などの理由があるなら仕方ないでしょうが、
      単体と結合でやり方が違う
というのはミスの元ですので、それなりの利点がないなら避けるべきこと
と思います。

> 報告されても。。。と思われるかも知れませんが。。(^^;)
掲示板に質問しておいて結果報告すらしない輩が多いですが、
瀧上さんはちゃんと報告していただけるので、こちらとしても
非常にうれしいことです。


>>3596 スナフキン
そこらへん詳しくないんですが、/proc はカーネル内部のプロセス
状態を見るための覗き穴なので、そこで Can't read superblock とは
奇怪なことです (/proc に superblock なんか存在するのか? という話)。

そもそもこのエラーが出た結果、マウント対象となる HDD が読め
ないなどの異常が発生しているのでしょうか? もしそうなら /proc
マウントにさえ行き着けず、もっと前に /dev/hda などに関する
エラーメッセージが表示されているのではないかと思うのですが。

> fdisk /dev/hda の結果は、Unable to open /dev/hda です。
/dev/hda が / なのでしょうか? /etc/fstab を見せていただけませんか?

あと、/etc/fstab から /proc に関する行をコメントアウトすると
どうなりますか?

で、本当に superblock が飛んでいたりするなら、わたしの手には
負えないです。「ext3 superblock 復旧」などでぐぐると、いくつか
ヒットするようです。

No. 3599 # スナフキン 2004/03/05 (金) 18:54:27
早速の御返答ありがとうございます。

/etc/fstab の中身です。(多分大丈夫だと思いますが書き写し漏れがあるかも)

LAVEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
LABEL=/home /home ext3 defaults 1 2
none /proc /proc defaults 0 0
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
/dev/hda7 swap swap defaults 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
(タブを全角スペースに置き換えしてます)

>あと、/etc/fstab から /proc に関する行をコメントアウトすると
ダメです。Read Only になっているので書き込みが出来ませんし、
そもそも vi が何も反応せずに起動しません…
植物状態って事?(T@T)

不思議なことに、インストーラーCD内のfdiskだとパーティション情報が
正常に表示されますが、HDDのモノだと前記の通りです。

No. 3600 # 68user 2004/03/05 (金) 22:03:48
>>3599 スナフキン
> /etc/fstab の中身です
LABEL=... という記述を初めて見たのですが、Linux には
ラベルという仕組みがあるのですね。

要は /dev/hdx がどのマウントポイントに相当するのか、
知りたかったのですが、これではわからないですね。ログ
ファイルなどに記録が残っていませんか?

> Read Only になっているので書き込みが出来ませんし、
mount -o rw,remount /dev/hdx /hoge などで再マウント
できませんか?

> インストーラーCD内のfdiskだとパーティション情報が
> 正常に表示されますが、HDDのモノだと前記の通りです。
正常に表示、とは何が表示されるのですか?

わたしは Linux に詳しいわけではないのですが、全体的に
情報が少なすぎます。

Q1. そもそもマシンに何個の HDD が付いているのですか?
Q2. そのうちどれが壊れたかわかりますか? その根拠は?
Q3. シングルユーザモードで起動して、一部だけでも手動で
        マウントできませんか?
Q4. どこまでマウントに成功しているのですか? / 以外は
        全滅ですか? /boot も /usr も /home も /var も
        見えないのですか?

No. 3601 # スナフキン 2004/03/05 (金) 23:05:42
ごめんなさい、どんな情報が必要かわからなかったのと、自分でも
何が問題なのかよく判らないもので・・・

>再マウントできませんか?
いろいろと指定を変えて試しています。
ただ、パーティンション情報が間違っている時に rw で書き込んで
大丈夫でしょうか?

A1 HDDはIDEが一台のみです。
A2 メッセージをかいつまんで見る感じでは、superblock が読めない
        と表示されているように思いました。
A3 シングルモードで試してみましたがROでマウントされている状態が
        変わりません。
A4 起動中に /proc へのアクセスが出来なくてエラーとなっているようです。
    /boot /var /usr /proc のマウントが失敗しているようですが、 / に
    /usr /var というファイルが存在しますが、/proc というファイルは
    存在していません。

関連サイトをあさって情報を探していますが、ファイルシステムは(も)
よく判らない状態です・・・

ログは /var へアクセスできないのでお手上げです。

No. 3602 # へにか [URL] 2004/03/06 (土) 00:08:25
"Merkle-Hellman" DESと、Googleで検索をかけたところ、
http://info.isl.ntt.co.jp/~ohta/BOJ-Seminar.pdf
を見つけました。21枚目あたりが参考になるかも知れません。

#なんだか、いらない突っ込みしてしまって、余計な苦労を
#かけてしまったとしたら、申し訳ないです。
#お忙しいでしょうし、僕の意見も間違っている可能性大い
#にあるでしょうから、その内気が向いたらで結構です。

No. 3603 # 68user 2004/03/06 (土) 00:31:48
>>3601 スナフキン
> A3 シングルモードで試してみましたがROでマウントされて
> いる状態が変わりません。
シングルユーザモードで起動すれば、Read Only でマウント
されているものだと思います。狙いは / のみがマウントされ
ている状態にすることで、その後ひとつひとつマウントして
みることで、どの部分が壊れているのか原因がわかると考えました。

あとですね、この fstab では LABEL=/home などとファイル
システムのラベルを指定しています。わたしの知る限り FreeBSD や
Solaris にはこういった機能はないので想像ですが、fstab に
ラベルを指定すると、まず全デバイスのラベル名を取得し、
ラベル名が一致したデバイスを mount しようとするのでは
ないかと思います。

で、マウントしようとしているデバイスとは異なる場合でも、
ラベル取得時に壊れたファイルシステムが原因でエラーに
なるのではないかと想像しました (違うかもしれませんが)。

よって、ラベルを使わず
      # mount -o rw,remount /dev/hdx /hoge
などとデバイス名を指定してマウントしてみてください。

> /usr /var というファイルが存在しますが
マウントポイントは最初から必ず存在します。存在するか
どうかではなく、その下にファイルがあるかどうか、つまり
マウントに成功しているかどうかを教えてください。

> パーティンション情報が間違っている時に rw で書き
> 込んで大丈夫でしょうか?
保証はできませんが、大丈夫だと思います。もしファイル
システムとして認識できなければマウントできません。また、
/usr を /var に間違えてマウントしたとろで、/var/bin
とか /var/sbin とか /var/X11R6 などができてしまう程度
です (当然 umount すれば元通りです)。

ただ、そこでプログラム類が悪さをして /var などの下の
ファイルを操作してもらっては困るので、そういう意味でも
「シングルユーザモードで起動」をお勧めします。

No. 3604 # スナフキン 2004/03/07 (日) 01:41:20
結果から書くと諦めました。

教えてもらった事と、考えられる事を幾つか試してみましたが、
何らかのエラーのオンパレード・・・

remount も試しましたが、その内 / に居るのに /etc の内容が
見えたり完全におかしくなって来ました。

ちなみに、/ の中には、
/boot 空
/home 空
/usr 壊れたファイルの断片を含んだファイル
/var 同上
といった内容でした。
(lsコマンドが正常なうちの結果)

まともだった頃の、幾つかのコマンド結果を書いてみます。
#fsck /dev/hda2
Couldn't open /proc/partitions: Input/output error
Is /proc mounted?

# mount /proc
mount: non: can't read superblock

# fdisk /dev/hda
modprobe: modprobe: Can't locate module char-major-27
modprobe: modprobe: Can't locate module char-major-27

Unable to open /dev/hda


しかし、ext3 がクラッシュに強いってのは信じられなくなり
ました、4年近く使っている古いext2のシステムは、大きなト
ラブルも無く今だ健在なのにたった一度の不正終了で・・・。
運が悪いといえばその通りなんでしょうが・・・(涙)

お付き合いありがとうございました。

No. 3605 # スナフキン 2004/03/07 (日) 03:33:57
インストーラーで、前のパーティションを残してインストールする選択
肢が有ったので、/home を残して再インストールしたところ、ラッキー
な事にデータを残せたようです。
/etc は全滅なので全て再設定を行う必要が有りますが、一番重要なデ
ータが残せた事でよしとします。

また、今回のトラブルでファイルシステムのキーワードを沢山見つけま
したが、自分はシステムを作るヒトじゃなく使うヒトなので、あまり
深入りするつもりは有りません。

しかし、バックアップの重要性は友人にあれほど言っている自分が今回
の様なトラブルにあった事でよい戒めとなりました。

ジャーナルシステムを過信するとワタシの様な目に遭いますので、皆さ
まご注意を(^^;;;;

お騒がせいたしまして申し訳有りませんでしたm(_ _)m

No. 3606 # へにか [URL] 2004/03/07 (日) 20:49:33
英語と格闘させてしまってるところ、申し訳ないのですが、
暗号技術大全§15.2をご覧ください。

#ごめんなさい。手元にあるのに気が付かなくって。

しかも、Merkle-Hellmanの論文はacmに登録しないと読めない
ようなので、僕が一人相撲をとっていたようですね。

#間抜けなことをしでかして、すみません。

No. 3607 # バンガード [URL] [E-mail] 2004/03/08 (月) 16:00:43
色々と調べたのですが、どうしても分かりません。
以下の機能のスクリプトを作成中です。

1.ユーザーに入力を促し、ユーザーID、パスワードを入力させる。
2.入力されたパスワードの整合性チェック
                文字数、英文字数、数字文字数、ユーザーIDと不一致etc.
3.正しいパスワードであった場合、passwdコマンドを実行し該当ユーザーのパスワードを変更。

問題は、上記の「3」です。
ユーザーが入力したパスワードをそのままpasswdコマンドに渡し、パスワード変更を行いたいのですが、入力されたパスワード文字列をpasswdコマンドに渡すことが出来ません。
通常時のpasswdコマンド実行時の様に旧パスワード/新パスワード/新パスワード(再入力)を促さずに、変数として持っているパスワード文字列をpasswdコマンドに渡すことは出来ないでしょうか?

環境はAIX 5.2でシェルは出来ればkshで実現したいと考えています。

No. 3608 # 68user 2004/03/08 (月) 17:55:21
>>3607 バンガード
AIX は知りませんが、一般的な UNIX では root 権限があれば
元パスワードを聞かれることはないと思います。
    http://publib16.boulder.ibm.com/pseries/Ja_JP/cmds/aixcmds4/passwd.htm

ただしプログラムで制御するなら、pwdadm を使った方が
よいような気がします。
    http://publib16.boulder.ibm.com/pseries/Ja_JP/cmds/aixcmds4/pwdadm.htm

passwd は人間が操作することを前提としたコマンドなので。

No. 3609 # zsh 2004/03/09 (火) 00:49:09
>>3607 バンガード
passwdコマンドは端末からの入力しか受け付けないため
シェルからpasswdコマンドへ直接値を渡すことは出来ません。
expectを使うのが一般的?かなと思います。
(Solaris以外はさっぱりなので参考程度に。)

>>3608 68user
AIXにはpwdadmというコマンドがあるのですね。
HP-UXのshの話といい、色々と参考になります。

No. 3610 # 68user 2004/03/09 (火) 01:30:50
>>3609 zsh
> passwdコマンドは端末からの入力しか受け付けないため
> シェルからpasswdコマンドへ直接値を渡すことは出来ません。
UNIX 一般の話であれば、そうでもありません。Linux では
    % ( echo oldpasswd ; sleep 3 ; \
            echo newpasswd ; sleep 3 ; \
            echo newpasswd ) | passwd
でできました。Solaris8 だと不可でしたが、本当に端末が
ない状況 (cron からとか、CGI からとか) でやるとうまく
いったりするかも、とか思ったりします。

なぜ sleep が必要かについてはよくわからないんですが、
そのうち Linux の passwd のソースを読んでみよう。

>>3593 へにか
遅くなりましたが、2key-3DES について。お待たせしたわりに
技術的な話ではないんですが…。

http://x68000.startshop.co.jp/~68user/net/crypt-1.html では、
      2key-3DES はやめといた方がいいよ。なぜなら、こんな
      攻撃方法があって、現時点では (全数探索を除くと) 最も
      現実的な攻撃と思われるからでありますよ。
ということを書きたかったのです。よって、これに対して

> 確かに2つの鍵を使う3DESは攻撃方法がある、ということも
> 書いていますが、どっちかって言いますと、既存の方法、すなわち、
> §2の、Merkle-Hellman Attackの方法よりも、早い方法がありますよ、
という指摘はちょっと意図が図りかねるなぁと思っておりました。

つまり Merkle-Hellman Attack の選択平文攻撃よりも既知
平文攻撃の方が脅威であるため、
    「Merkle-Hellman Attack の方は紹介しなくていいかな。
        論文も見つからないし」
と思ったわけです。もしこの認識が誤りであればご教示願います。

No. 3611 # へにか [URL] 2004/03/09 (火) 07:23:26
>>3610 68user

> つまり Merkle-Hellman Attack の選択平文攻撃よりも既知
> 平文攻撃の方が脅威であるため、
> 「Merkle-Hellman Attack の方は紹介しなくていいかな。
> 論文も見つからないし」

当時の僕は論文の意図しか見ておらずこの、「論文も見つからない」
ということ、特に誰でも容易にハイパーリンクを辿ることによって
確認できる方法が無い、というところまで、頭が回っていませんでした。

> と思ったわけです。もしこの認識が誤りであればご教示願います。

いえ、少なくとも現在の僕の認識とは同一です。

#僕の勇み足だったと思います。お詫び申し上げます。

No. 3612 # バンガード [URL] [E-mail] 2004/03/09 (火) 10:09:31
>>3610 68user
バンガードです。

この掲示板を使うのが初めてなので、うまくコメント出来ていなかったら御免なさい。

>UNIX 一般の話であれば、そうでもありません。Linux では
> % ( echo oldpasswd ; sleep 3 ; \
> echo newpasswd ; sleep 3 ; \
> echo newpasswd ) | passwd
>でできました。Solaris8 だと不可でしたが、本当に端末が
>ない状況 (cron からとか、CGI からとか) でやるとうまく
>いったりするかも、とか思ったりします。
        at コマンドで試してみましたが、残念ながら駄目でした。

        引き続きpwdadmについて調査致します。
        また、結果を報告させていただきます。

No. 3613 # バンガード [URL] [E-mail] 2004/03/09 (火) 11:40:26
>>3608 68user
>ただしプログラムで制御するなら、pwdadm を使った方が
>よいような気がします。
    pwdadmについても確認しましたが、残念ながらpasswdと動作は変わらない様です。
    (もう少し、細かい設定が出来はしますが)

    やっぱり、旧/新パスワードを聞いてきて、それぞれの入力が必要であると言う部分では、全く変わりませんでした。

>>3609 zsh
    expectについては、昨日も調査を致しました。
    しかしながら、expectおよびTclの導入が必要ですので、採用を躊躇しています。

No. 3614 # 68user 2004/03/09 (火) 13:33:52
>>3613 バンガード
3608 でも書いたように、root 権限で実行したら
旧パスワードは聞かれないと思いますが、どうですか?

No. 3615 # バンガード [URL] [E-mail] 2004/03/09 (火) 14:19:13
>>3614 68user
はい。この件は返事が抜けていましたね。
申し訳ございません。
仰る通り、root権限であれば確かに古いパスワードは聞かれません。
ですが、結局は新パスワードに入力が必要であり、ここでユーザーの介在が必要なことに変わりはありません。

やっぱり、expectを導入するしかないのだろうかと考え始めています。

No. 3616 # 68user 2004/03/11 (木) 01:40:33
>>3615 バンガード
> やっぱり、expectを導入するしかないのだろうかと考え始めています。
もし AIX の passwd が、どうしても端末からしか読んでくれないなら、
expect などに頼るか、PAM を使ったパスワード変更プログラムを
書くことになるかと思います。

No. 3617 # ビギナー 2004/03/11 (木) 17:28:30
LinuxASからsolaris9に乗せ替えるのですが、
クーロンはどのように移行できるのでしょうか?
まだ実機が来ていなくて何も環境が見えません。
これまでの設定ファイルやスクリプトファイルが
そのまま使えるのか、シェルの変更をしないと使えないのか、
どこに配置するのか・・・少しでも事前に解っていれば助かるかな〜って思ってます。

No. 3618 # 68user 2004/03/11 (木) 18:24:25
>>3617 ビギナー
あらーそれは大変ですね。基本的に機能面 (コマンドの数とかオプションの
種類とか) で言うと Linux > Solaris なので (正確には GNU モノ > Solaris)、
Linux から Solaris への移行は結構面倒です。

まずは Sun が提供している
    「Linux から Solaris オペレーティング環境への移行」
            http://sdc.sun.co.jp/solaris/migration/linux/index.html
をどうぞ (ドキュメントを読むにはユーザ登録が必要だと思われます)。

上記ドキュメントには、当然ながら Sun に都合が悪いことはあまり書かれて
いませんので (互換性ないですよ、とはあまり書かれていない)、以下わたしの
印象を書きます。

全体的に言えることは、
      - Linux (というより GNU) 独自の機能を使っていたら移行に苦労する
      - 古来からの UNIX の機能しか使っていないならあまり苦労しないかも
ということです。GNU モノの一覧はこちらを。
      http://www.linux.or.jp/JM/INDEX/gnu.html
特に Solaris の find・date・grep・tar・make・awk・sed コマンドの機能は、
Linux のそれと比べると貧弱な印象があります。

まぁ Solaris でも GNU モノをインストールすることはできるので、
がんばってプログラムを直すか、Solaris に GNU モノを入れるかという
選択肢はありますけどね。

なお、apache や perl など、Linux にも Solaris にも属さないもの
(第三者が開発しているもの) は、基本的に同じ動きをします。


> クーロンはどのように移行できるのでしょうか?
基本機能は同じですが、例えば
      http://www.linux.or.jp/JM/html/cron/man5/crontab.5.html
の name=value という書き方は Solaris ではできません。
0-23/2 というのもダメなはず。

上記 man には
      ATT や BSD の cron では "1-3,7-9" は拒否されるだろう --
      "1-3" または "7,8,9" のいずれかだけしか指定できない。
とありますが、Solaris ではどうだったかなぁ。

Solaris の crontab(1) はこちら。
    http://www.freebsd.org/cgi/man.cgi?query=crontab&apropos=0&sektion=0&manpath=SunOS+5.9&format=html

> 設定ファイル
OS の設定ファイル名や内容は、同じものは同じですが、違うものは
違います (としか言いようがない)。

同じもの:
      /etc/hosts, /etc/resolv.conf, /etc/nsswitch.conf

違うもの:
      その他たくさん。Linux の /etc/fstab は、Solaris では /etc/vfstab など。

> スクリプトファイル
Linux では sh は bash ですが、Solaris は古来からの sh です。例えば
Solaris の sh では
    export A=B
はダメで、
    A=B
    export A
としなくてはいけません。このような bash 依存な書き方をしていなければ
少しの修正でいけるかもしれませんが、bash の便利な機能を活用しまくって
いるなら苦労するでしょう。

No. 3619 # ビギナー 2004/03/12 (金) 11:49:16
>>3618 68user
参考にさせていただきます。
実機の搬入が来週なので、結果報告はその時にします。

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 の
メーリングリストで質問してみてはいかがでしょうか。

No. 3721 # 大谷 2004/05/15 (土) 17:41:21
初めてメールします。CGIを用いてGREE.jpのようなものを作りたいと考えているのですが、何かいい案はございませんか?

No. 3722 # 68user 2004/05/15 (土) 17:53:34
>>3721 大谷
現状何が問題なのかを提示せずに いきなり「何かいい案は?」と
問われても、何と答えればよいのかわかりません。

No. 3723 # つる 2004/05/16 (日) 17:56:22
シェルスクリプト内の変数の使い方について教えて下さい。
環境は、HP-UX11.00で、Cシェルです。

a.cshとb.cshの2つのシェルがあり、
b.cshは、a.cshから呼ばれる動きです。

この時、a.csh内で設定した変数を、b.csh内でもしたいのですが
上手くいきません。

- a.csh -----------
#!/bin/csh

set title = "test log"
./b.csh

- b.csh ------
#!/bin/csh

echo "Subject: $title" >> kekka.log
echo "" >> kekka.log

というように使いたいのですが、上手くできません。
よろしくお願いします。

No. 3724 # zsh 2004/05/16 (日) 18:18:46
>>3723 つる
setenvしてください。

No. 3725 # ふくし [E-mail] 2004/05/19 (水) 15:38:15
留学歴を調べててわかったんですが、
あべ晋三さんって Mac のノート(G4 パワーブック?)で
Unix を使って日本を動かしてるらしい。

    http://www.s-abe.or.jp/image/pc_desk.gif

「./configure; make new_japan; make install」ってのがすごいですね。
実装が知りたい (^^)



さて質問です。tcup という有名なレンタル掲示板に
「プログラム書き込みを禁止する」という設定項目があり、
これを有効にするといわゆるエロ広告がカットできるようなんですが、
どういう実装になってるんでしょうか。
HTTP-AGENT 環境変数とかだったらフツー偽装しますよね。
(いぜん PC を docomo の携帯に偽装して「グリコの抽選の応募」を
    連続応募する裏ワザというのがあった)
ていうか、Internet Explorer だってコンピューターのプログラムには
違いないわけで。どうやって判別できるんでしょう?

No. 3726 # 68user 2004/05/19 (水) 18:21:09
>>3275 kotaro
> 「./configure; make new_japan; make install」ってのがすごいですね。
何ヶ月か前にほうぼうでネタにされてましたね。configure と make は ; で
なくて && でつなぐべきだとか、いったい何を grep してるんだとか、パス
ワード入力時に何で * がエコーバックされるんだとか。

http://www.s-abe.or.jp/ の web も XOOPS を使っているようで、ページ
運営者がそういう系統の人なんでしょうね。

> 「プログラム書き込みを禁止する」
http://www.teacup.com/gbbs/l1new.shtml の「プログラム投稿(迷惑投稿)禁止」
のことですね。

    http://8520.teacup.com/pon/bbs
        あれれ? 投稿者:PON  投稿日:10月10日(金)00時00分26秒

以降の発言を見るに、cookie を食べてくれるかとか、referer を
渡してくるかとか、Javascript を正しく解析してくれるかとか、
そういう感じの判定をしているものと思われます。

No. 3727 # tt 2004/05/22 (土) 16:39:13
質問です。
Solaris8で、バックアップからのフルリカバリを行う際、
パーティションを作成した後にnewfsでファイルシステムの作成を行いますが、
このときSWAP領域にも、newfs /dev/rdsk/.....というようにファイルシステムを
作成するものなのでしょうか?
vfstabファイルによると、SWAPはファイルシステムがufsでなくswapですので、どうなのかと思いまして。
googleで解説ページを検索すると、SWAPにnewfsを行っているサイトもあるのですが、
自分の持っている書籍では行っていません。

ちょっと分からなくなってしまったので、宜しくお願い致します。

No. 3728 # 68user 2004/05/22 (土) 19:00:17
>>3727 tt
ufs ファイルシステムを作るわけではないので、newfs は不要です。

ファイルを swap として追加する場合も、
      # mkfile 512m /foo/bar/swap512m
      # swap -a /foo/bar/swap512m
と、ゼロ埋めのファイルを用意して swap -a するだけですので。

No. 3729 # tt 2004/05/24 (月) 00:57:57
>>3728 68user様
ご回答ありがとうございます。
やはり不要なのですね。
ただ、それでもnewfsを行った場合、何か不具合が出るのでしょうか?
「不要」とは、「行っても問題無いが、する必要が無い」と言った意味になりますでしょうか。
swapをnewfsしている方は、その後問題無いのかなと思いまして。。

No. 3730 # zsh 2004/05/24 (月) 07:25:11
>>3729 tt
newfsしても問題ないと思います。
ただし、実際にswapを使い始めると(書き込みが行われると)
ufsとして書き込みに行かないので、結局ファイルシステムは破壊はされます。
よって、newfsする意味がありません。

No. 3731 # marlboro [E-mail] 2004/05/27 (木) 11:50:40
C言語版FTPクライアントを実行させたところ、RETR後、レスポンスが2回続けて
ありますが(150、226)、226のレスポンスが異常に遅いです(6分後)。
Solaris8、ProFTP(関係ないとおもいますが。。。)の構成です。

No. 3732 # すすむ 2004/05/27 (木) 19:48:05
HP-UX11.00で、Bシェルなのですが、
awkで表示された内容をある数分出力したら別ファイルに
入れたいのですが、

---------------------------------------
#!/bin/sh
#

FILE="test.txt"
OUTPUT="output.txt"

awk -F" " '
        BEGIN {
                count = 0+0 ;
        }
function func() {
        if (・・・・) {
                printf("%s\n",$0) ;
                printf("\n") ;
                return 0;
        } else {
                return 1;
        }

}
{
        if (NF == 0) next ;
        if (NF == 2 && $1 == "dn:") {
                ret=func() ;
                if (ret == 0) count++ ;
        }
        if (count == 1000) {
                count = 0+0 ;
        }
}' ${FILE} > ?????
------------------------------------

1000件ごとに出力するファイル名を変えたい
「output_nnn.txt」ということはできるでしょうか。

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

No. 3733 # 68user 2004/05/27 (木) 20:54:46
>>3731 marlboro
ご報告ありがとうございます。

調べてみますが、
    - どこからどこ宛の接続なのか (Solaris8 から localhost 宛?)
    - OS 付属の FTP クライアントでは問題ないのか
    - (インターネット上に公開されているサーバであれば) 相手のサーバ名
を教えていただけると助かります。

>>3732 すすむ
HP-UX11.11 の /bin/awk で、
    out="output_nnn.txt";
    print "hoge"> out
などと出力ファイルを指定できるようです。後は out の内容を
動的に変えていけばよいでしょう。

対象ファイルを切り替えるときは close(out) すればリソースの
無駄が省けてよいかもしれません。

No. 3734 # すすむ 2004/05/27 (木) 22:55:17
>>3733 68user
ありがとうございます。

>HP-UX11.11 の /bin/awk で、
> out="output_nnn.txt";
> print "hoge"> out
>などと出力ファイルを指定できるようです。後は out の内容を
>動的に変えていけばよいでしょう。
>対象ファイルを切り替えるときは close(out) すればリソースの
>無駄が省けてよいかもしれません。

確認できる環境が近くにないので確認ができませんが、
以下の様なことなのでしょうか。
------------------------
#!/bin/sh
#

FILE="test.txt"
OUTPUT="output.txt"

awk -F" " '
        BEGIN {
                count = 0+0 ;
                num = 1;
                output="output_num.txt"
        }
        function func() {
                if (・・・・) {
                        printf("%s\n",$0) >> output ;
                        printf("\n") >> output ;
                        return 0;
                } else {
                        return 1;
                }
          }
          {
                if (NF == 0) next ;
                if (NF == 2 && $1 == "title:") {
                                ret=func() ;
                                if (ret == 0) count++ ;
                }
                if (count == 1000) {
                                count = 0+0 ;
                                num++ ;
                                output="output_num.txt"
                }
          }' ${FILE}

No. 3735 # 68user 2004/05/27 (木) 23:37:27
>>3731 marlboro
手元の複数の環境で実験した限りでは再現しませんでした。
>>3733 68user
をご参照の上、より詳細なご報告いただければ幸いです。

>>3734 すすむ
ご自分で動作確認して、わからなければ再度質問してください。

No. 3736 # すすむ 2004/05/28 (金) 08:44:07
>>3735 68user
>ご自分で動作確認して、わからなければ再度質問してください。

失礼しました。
ありがとうございました。
希望通りの動きをしました。

No. 3737 # kentarou 2004/05/28 (金) 08:45:29
>> 「./configure; make new_japan; make install」ってのがすごいですね。
> 何ヶ月か前にほうぼうでネタにされてましたね。configure と make は ; で
> なくて && でつなぐべきだとか、

ごめんなさい、教えてください。
;ではなく&&でつなぐとどうなるのですか?

No. 3738 # zsh 2004/05/28 (金) 12:41:31
>>3737 kentarou
例として、「cmd1 && cmd2」とした場合は、
cmd1の戻り値が0の場合のみcmd2を実行します。

No. 3739 # 68user 2004/05/28 (金) 13:03:19
>>3738 zsh
そして、make は成功時には 0 を、失敗時には 1 を返します。
# http://x68000.startshop.co.jp/~68user/unix/glossary.html#%CC%E1%A4%EA%C3%CD

よって && でつなぐことで、
    - configure でこけたら make 以降は行なわない
    - make でこけたら make install は行なわない
という効果があるわけです。

No. 3740 # 瓜倉 茂 [E-mail] 2004/05/28 (金) 17:25:42
Perl&CGIで授業の出席フォームを作成しようとしています。Perlは初心者です。
サーバーは、Windows2000+IIS+ActivePerl5.6.0で、ブラウザはIE6.0です。
クライアントマシンのIPアドレスを取得するPerlのコードでつまずきました。
inet_aton、gethostbyaddr、inet_ntoaの各関数を使ってIPアドレスを取得する
コードを試しましたが、ブラウザIE6.0のプロキシ設定をしていれば、プロキシ
のIPアドレスが取得でき、クライアントのIPアドレスが取得できません。もちろん
プロキシの設定を外せば、クライアントのIPアドレスが取れます。プロキシを設定
した状態で、クライアントのIPアドレスを取得できる方法がありましたら、ご教示
ください。

No. 3741 # 68user 2004/05/28 (金) 17:59:31
>>3740 瓜倉 茂
> クライアントマシンのIPアドレスを取得するPerlのコードでつまずきました。
IP アドレスは $ENV{REMOTE_ADDR} で取得できますよね。FQDN (ホスト名) の
取得が目的ですか?

それはそれとして、
> プロキシを設定した状態で、クライアントのIPアドレスを取得できる方法が
> ありましたら、ご教示ください。
については
>>3450 68user
の「理屈的には、100% の精度の proxy 判定は不可能です」のくだりを
読んでください。

100% は無理と書きましたが、学内限定でなおかつあなたが管理者の立場なの
であれば、必ず HTTP_X_FORWARDED_FOR を設定させるように proxy サーバの
設定変更するなどの手はあります。

ただ、根本的に信頼性がないので「web で出席を取る」という仕組みが妥当か
どうかは微妙な気がします。

No. 3742 # marlboro 2004/05/28 (金) 22:25:03
>>3733 68user
遅くなりました。すでに確認していただいているのですが。
>調べてみますが、
> - どこからどこ宛の接続なのか (Solaris8 から localhost 宛?)
> - OS 付属の FTP クライアントでは問題ないのか
> - (インターネット上に公開されているサーバであれば) 相手のサーバ名
>を教えていただけると助かります。
あて先は、同じネットワーク内に存在するサーバです。同じくSolaris8です。
UNIXのftpコマンド、Windowsのツール(FFFTP)では問題なく動作します。
#ftpコマンドでPASVで送受信する方法を知らないんですね。。。
サーバ側の問題とも考えにくいです。

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