68user's page 掲示板

Prev< No. 3493〜3589> Next  [最新発言に戻る] [過去ログ一覧]
No. 3493 # 68user 2003/12/26 (金) 02:27:11
http://x68000.startshop.co.jp/~68user/net/
    ネットワークプログラミングの基礎知識

    http://x68000.startshop.co.jp/~68user/net/crypt-1.html 暗号化のお話 (1) 共通鍵暗号方式
を更新し、
    http://x68000.startshop.co.jp/~68user/net/crypt-2.html 暗号化のお話 (2) 公開鍵暗号方式
    http://x68000.startshop.co.jp/~68user/net/crypt-3.html 暗号化のお話 (3) 署名
    http://x68000.startshop.co.jp/~68user/net/crypt-5.html 暗号化のお話 (5) まとめ
を追加しました。

No. 3494 # tonpei 2003/12/26 (金) 11:36:15
>>3492 68user
安易な回答をしてしまい申し訳ありませんでした。
利用規約を読ませていただきましたので、改めて回答させてください。

御指摘頂いた、curs_set(0)使用することで、dtterm上でカーソルの消去ができました。
また、printfの方法でも可能でした。

ありがとうございました

No. 3495 # みの 2003/12/26 (金) 12:35:38
>3492
すみません
カンマが余分でした。
ありがとうございます。

No. 3496 # ブラウン 2003/12/26 (金) 12:47:15
HP-UXでのawkについて質問なのですが、
awkを使用してファイルのENDを判断できるのですか。

例えば、
cat date.txt
aaa
aaa bbb
aaa bbb ccc

111
111 222
111 222 3333

とあった場合、

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

awk '
function sub() {
}
        getline ;
        処理省略
{
        if (NF == 0) next ;
        if (NF >= 1) sub() ;
        ※
}' data.txt
----------------------

※の場所でファイルのENDか判断したいのですができるのでしょうか。

No. 3497 # zsh 2003/12/29 (月) 09:51:28
>>3496 ブラウン
ファイルのENDというのが最後の行の事なのか
EOFの事なのか不明ですが、最終行であれば以下のように。
ちなみに環境はSolarisです。
------
#!/bin/sh

max_line=`wc -l $1 | awk '{ print $1 }'`
awk '{ print ;
              if ( NR == max_line ) printf "END\n" }' max_line=$max_line $1
------
行数を取得する為だけにawk使うのはどうかと思いますが。

No. 3498 # ポッしブル 2003/12/29 (月) 22:27:36
はじめましてです。C言語を勉強しているものです。
質問なんですが、ネットワークプログラミングで
チャットを使ったゲームみたいなものを作りたいなと思っておりまして、
具体的にチャットではサーバーがクライアント全員にメッセージを送る
形になりますが、このゲームではクライアントが
メッセージを送る人を選ぶことができるようにしたいのです。
たとえば会話しているのは5人いるけどそのうち3人に送ろうという
感じです。クライアント側で、全ユーザーの名前が表示され
その中から送る人を選ぶみたいなかんじのゲームなんですが。

チャットにおいて選んだユーザーにだけメッセージを送るというのは
一体どうすれば可能なのですか?

No. 3499 # ブラウン 2003/12/30 (火) 10:37:54
>>3497 zsh
ありがとうございます。

説明不足ですみません。
ファイルのENDというのは、最終行ではなく、EOFのことです。
また、行数を取得するためにawkを使用していません。
awkを使用して、ファイルから1レコードづつよみこみ条件
毎に処理を行い、EOFだったら終了と考えていたのですが。

No. 3500 # zsh 2003/12/31 (水) 13:11:47
>>3499 ブラウン
取得したいのがEOFだとすると
getlineの戻り値見るくらいしか思いつきません。
普通にENDに記述じゃダメですか?
或いは行数+フィールド番号でファイルの最後をチェックするとか。

>また、行数を取得するためにawkを使用していません。
すみません、行数を取得するためだけにawkを使うのはどうか
というのは自分に対して言ったものです。

No. 3501 # けんおお 2004/01/02 (金) 07:07:10
あけましておめでとうございます。
朝早くから失礼いたします。

このページは、EmacsLipsでネットワークプログラミングについて
ぐぐっていたら、たどり着きました。

早速一つ質問させてください。
telnetでウェブサーバからファイルを取ってこようとしたところ、
GET /hoge.rdf HTTP/1.0
で、404になってしまいます。ブラウザやwgetだと取ってこれます。
こういう場合は、どのようにすればいいのでしょうか?

# あと、私事で恐縮なのですが、SEGA BBSのログを発見したので、
# ためしに名前を入れてみたらおもいっきりヒットしました。(^_^;)
# いやー懐かしい。とにかく懐かしいです。(;_;)ホロホロ
# ちなみに、SEGA BBSのトップにあるsagabitoへのリンクって
#「くにおにく」さんのページですよね?
# 当時、「くにおにく」さんに大変世話になった記憶があります。
# 無事で過ごされているようでしたらなによりです。
# 以上、私事で失礼しました。

No. 3502 # けんおお 2004/01/03 (土) 00:30:54
>>3501 けんおお
すみません。自己解決しました。
GET /hoge.rdf HTTP/1.1
Host:hoge.jp
Connection:close
でいけました。
最近は、HTTP/1.0ではファイルを取ってこれなくなったんでしょうか?
それでは、失礼します。

No. 3503 # ShinoP 2004/01/05 (月) 10:20:47
はじめまして。
検索辿ってこちらを拝見させていただきました。

早速質問させていただきたいのですが、
SunのUltra10 SPARKマシンで、SunOSのデスクトップに
ファイルを配置するためにデスクトップの絶対パスを調べたいのですが、
Windowsのデスクトップのようにショートカットの絶対パスを辿ろうと
しても一向に見つかりません。

もしかしてSunOSのデスクトップ(ワークステーション?)上のショートカットは実体のない参照(リンク)でしかなくて、デスクトップの絶対パスなんてものは存在しない(ファイルを置くことはできない)のでしょうか。

よろしくご教示お願いします。

No. 3504 # 68user 2004/01/05 (月) 15:23:45
>>3498 ポッしブル
> チャットにおいて選んだユーザーにだけメッセージを送るというのは
> 一体どうすれば可能なのですか?
名前と IP アドレスの一覧のテーブルを内部に持っておいて、選択
された名前から対応する IP アドレスを得て、その IP アドレス宛に
メッセージを送信すれば可能でしょう。

要は、そういう動作をするように、あなたがプログラムを組まなく
てはならないということです。


>>3501 けんおお
>>3502 けんおお
GET /hoge.rdf HTTP/1.0 が 404 not found なのは、
バーチャルホストな web サーバだったからでしょう。
    http://x68000.startshop.co.jp/~68user/net/http-4.html
        さらなる改善点・バーチャルホストに対応
を読んでください。

HTTP/1.1 で OK だったのは、HTTP/1.1 だと Host ヘッダが
必須なため、結果的にバーチャルホストに対してホスト名を
提示することができたからだと思われます。

> # ちなみに、SEGA BBSのトップにあるsagabitoへのリンクって
> #「くにおにく」さんのページですよね?
そうです。でも今は公開されていないようですね。1年ほど前に
BBS があることは確認しましたが、今は見つけられません。


>>3503 ShinoP
CDE ですか? CDE をまともに使ったことはありませんが、
Solaris2.6+CDE 環境で試してみると、
    ~/.dt/Desktop/.!dtdesktop
    ~/.dt/sessions/current/.!dtdesktop
などのファイルに、リンク先のフルパスが保存されているような
気がします。

No. 3505 # ShinoP 2004/01/05 (月) 15:42:24
>>3504 68user
いえ、リンク先のフルパスが知りたいのではなく、目的は
「デスクトップ」自体の絶対パスを知りたい、ということです。
少々説明が足りませんでした。

その手段としてWindowsと同じ感覚でショートカットのリンク先ではなく
ショートカット自身の絶対パス
(Windows2000ならば
"C:\Documents and Settings\administrator\デスクトップ" で表されるような)
を調べようとしたのですが、
どうにも見つかりません。

これは現在疑ってる通り、ショートカット自体には実体がなく、
したがってデスクトップに実体ファイルを配置する、
ということは不可能だということなのでしょうか。

No. 3506 # 68user 2004/01/05 (月) 16:27:21
>>3505 ShinoP
そういうことであれば

> ショートカット自体には実体がなく、したがってデスクトップに
> 実体ファイルを配置する、ということは不可能
だと思います。

ただしわたしは CDE は常用しておらず、今回初めて CDE のヘルプを
見たくらいなので、間違っている可能性は多分にあります。

No. 3507 # ShinoP 2004/01/05 (月) 20:07:12
>>3506 68user
CDEのデスクトップショートカットはシンボリックリンクみたいなもの、
ということのようですね。
断念して代替パスを設定する方向で進めようと思います。
ありがとうございました。

No. 3508 # ブラウン 2004/01/06 (火) 02:26:13
>>3500 zsh
>取得したいのがEOFだとすると
>getlineの戻り値見るくらいしか思いつきません。
>普通にENDに記述じゃダメですか?
>或いは行数+フィールド番号でファイルの最後をチェックするとか
getlineの戻り値ですか。
ファイルの総行数を取得して、読み込んだ行数と比較するかと思う
のですが。

>或いは行数+フィールド番号でファイルの最後をチェックするとか
ちなみにどうするのですか。

>普通にENDに記述じゃダメですか。
とはどういう意味ですか。
ファイルの最後にENDを付けた様式ということですか。
それでしたら無理です。

No. 3509 # 68user 2004/01/06 (火) 22:54:37
>>3508 ブラウン
>> 普通にENDに記述じゃダメですか。
> とはどういう意味ですか。
    {
            行ごとの処理
    }
    END {
            終了時の処理
    }
という書き方ではどうか、ということでしょう。これは
awk の設計思想に沿った最も自然な書き方だと思います。

それがダメなのなら、わたしも getline の戻り値を
取るのがよいと思います。

No. 3510 # zsh 2004/01/11 (日) 14:43:24
>>3509 68user
フォローありがとうございます。

>>3508 ブラウン
>ファイルの総行数を取得して、読み込んだ行数と比較するかと思う
>のですが。
それは以前提示したスクリプトの方法ですが、
それだと最終行かどうかの判断であり、EOFかどうかの判断ではありません。

>>或いは行数+フィールド番号でファイルの最後をチェックするとか
>ちなみにどうするのですか。
あまり意味のない方法ですので、気にしない方が良いと思います。

No. 3511 # ブラウン 2004/01/14 (水) 12:42:42
シェルについて2点教えて下さい。
1.フィールドの区切がカンマ「,」となっている行から
    例えば、
    山田 太郎,ヤマタ゛ タロウ,Yamda Taro,18,1760/12/24
    山田 花子,ヤマタ゛ ハナコ,Yamda HANAKO,18,1760/12/24
    から、
    先頭のフィールドかあとか、 フィールドの3,4,5を取り出したいのです
    が、awkを使う以外にないのでしょうか。

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

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

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

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

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

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