68user's page 掲示板

Prev< No. 4201〜4900> Next  [最新発言に戻る] [過去ログ一覧]
No. 4201 # 中川 2005/07/26 (火) 17:17:23
大変早いお返事本当にありがとうございます。
とても悩んでいたので助かりました。
一番上にPostgreSQL と書くべきでした。
PostgresでdblinkとForeign keyを使うのは無理でしたか。
dblink以外を使って他のデータベースのテーブルをForeign key制約
に指定する方法はないのでしょうか?
上司に無理です。と言い切るしかないかもしれません。

No. 4202 # 68user 2005/07/26 (火) 17:57:28
>>4201 中川
外部キーにこだわるなら、
    - 定期的に他データベースからデータを取得してローカルのテーブルに入れる
    - 他データベースからトリガでローカルのテーブルに反映する
くらいしかないのでは、とわたしは思います。

No. 4203 # 中川 2005/07/26 (火) 19:13:54
大変早いお返事本当にありがとうございます。
とても悩んでいたので助かりました。
一番上にPostgreSQL と書くべきでした。
PostgresでdblinkとForeign keyを使うのは無理でしたか。
dblink以外を使って他のデータベースのテーブルをForeign key制約
に指定する方法はないのでしょうか?
上司にForeign keyにdblinkは無理です。と言ったところ、

データベースA データベースB  

テーブルT_A テーブルT_B

    A B C A B C

    1 0 0
    2 0 0
    3 0 0
        
データベースAのテーブルT_Aの列E_1の選択した値だけ(1だけ や 2だけ)を
データベースBのテーブルT_Bの列 Aに、INSERTする。
そのときテーブルT_Bの列BにはデータベースBのテーブルT_Cの列BをINSERT
し、Cにはすきな値を入れる。

という処理をする事になりました。
dblinkとビューを使ってデータベースBのテーブルT_Bに変わるものを作れば
いいと思ったのですが、selectした値をそれぞれの列に入れ込む処理が見当
たらず停滞しています。

いい案がありましたらよろしくお願いします

No. 4204 # 68user 2005/07/27 (水) 00:53:28
>>4203 中川
- 最終的に何をしたいのか
- 現状のどこが問題なのか

を読み取ることができません。

No. 4205 # 中川 2005/07/27 (水) 10:43:24
わかりづらくて申し訳ありませんでした。
やりたい処理は

テーブル1の列Aには、テーブル2の列A
テーブル1の列Bには、テーブル3の列B
テーブル1の列Cには、その場で作った
値をINSERTさせる という処理がした
いのですが、解決策が見つかりません。
副問いで、SELECTした値をINSERTさせ
ようとしたのですが、SELECTは一つし
か使えないようなので複数SELECTして
それぞれの列にINSERTさせるというの
は無理なのでしょうか。

No. 4206 # 68user 2005/07/27 (水) 11:00:31
>>4205 中川
INSERT INTO T1 (A, B, C)
    SELECT T2.A, T3.B, 'HOGE'
        FROM T2, T3
      WHERE (T2 と T3 に関する条件)

ということですか?

手元に PostgreSQL はないので確認できませんが、Oracle では一応動きました。

No. 4207 # 中川 2005/07/27 (水) 21:54:05
何度もありがとうございました。大変助かりました。
SQL初心者なのでこれを機にテクニカルを身に付けようと思います。

度々すみませんが、また質問です
昨日の質問なのですが、データベースの異なるテーブル
にトリガーを使って外部キーをつけるという処理を
今日一日悩んだのですが、トリガーを使ったことがなく、
少しも理解できていません。
トリガーを使って異なるデータベースのテーブルに外部キ
ー制約を行う方法を教えていただけないでしょうか。

No. 4208 # 68user 2005/07/27 (水) 23:36:50
>>4207 中川
またそこから始めるんですか? 全然 4202 から状況が変わってないように見えますが、
4203-4206 のやりとりは何だったんでしょうか。

まぁ、それはそれとして、トリガを使う案は

    - DB1 にテーブル T1、DB2 にテーブル T2 がある
    - DB1 の T1 のカラム A には、DB2 の T2 のカラム A に存在する値しか入れたくない
    - しかし PostgreSQL の外部キーでは、dblink を使えないようだ
    - ならば DB2 の T2 と同じ内容のテーブル T2 を DB1 にも作って、そこに外部キーを設定しては
    - となると DB2 の T2 と、DB1 の T2 の間でテーブル内容の同期をとる必要がある
    - では DB2 の T2 にトリガをセットして、T2 に対する INSERT・UPDATE・DELETE が
        発生したら、自動的に DB1 の T2 に同じデータを反映するようにするのがいいのでは

というものです。DB2 の T2 がごくまれにしか更新されないテーブルであれば、
トリガを使う必要はないかもしれません (30分に一回 INSERT INTO SELECT
で DB2 の T2 の内容を DB1 の T2 にコピーするとか)。

別の案としては、DB1 の T1 に INSERT・UPDATE がかかったときに、トリガで
DB2 の T2 のカラム A を見にいって、データが存在しなかったら RAISE して
エラーにする、というのもあります。
    http://www.postgresql.jp/document/pg803doc/html/plpgsql-errors-and-messages.html

いずれも何も試さずに言ってます。念のため。

No. 4209 # まつ 2005/07/29 (金) 18:18:09
皆様こんにちは。
ここはcshの質問をしても宜しいのでしょうか?
sedを使ってCSVファイルをTSVファイルに変換しようとしているのですが
変換元と変換先のファイル名にシェルの引数を認識してくれません。


if ($4 == CSV) then
        #TSVに変換
        sed -e 's/","/ /g' $LOG_DIR/$1.bad | sed -n -e 's/"//gw $LOG_DIR/$1.bad'
endif

アクセス権がありませんとか、オープンできませんというエラーになります。
下記のようにフルパスにすると正常に処理してくれます。
sed -e 's/","/ /g' /disk1/FNC021.bad | sed -n -e 's/"//gw /disk1/FNC021.bad'

ファイル名を「`」でくくったり\でエスケープ?してみましたがダメでした。
sedを知らないので頓珍漢なことをしているのかもしれません。
有識者の皆様、助けて下さい。m(_ _)m

No. 4210 # まつ 2005/07/29 (金) 18:46:39
すみません!!!
過去ログを眺めていて、適当に
sed -e 's/","/ /g' $LOG_DIR/$1.bad | sed -n -e 's/"//gw '$LOG_DIR/$1.bad''
と’’をつけたら動いてしまいました。。

どうもお騒がせしました。m(_ _)m m(_ _)m

No. 4211 # 68user 2005/07/29 (金) 23:03:10
>>4210 まつ
今後は
    #!/bin/csh -fx
などと -x オプションを付けてデバッグすることをお勧めします。

No. 4212 # まつ 2005/07/30 (土) 12:51:12
こんにちわ。

スクリプト内1行目に-fxオプションをつければよいのでしょうか?
知りませんでした。。御恥ずかしい。
どのような結果になるのか月曜にでも確認してみます。

どうもありがとうございました! m(__)m

No. 4213 # 68user 2005/08/01 (月) 01:26:00
UNIX の部屋を更新しました。
    http://X68000.q-e-d.net/~68user/unix/

未稿の部分が多くて恐縮ですが、書けども書けども終わりが見えないので、
いったん公開することにします。

No. 4214 # seki [E-mail] 2005/08/02 (火) 13:19:58
はじめまして、sekiと申します。

ftpに関しまして、分からない事があり質問させて頂きます。
どなたかご存知の方おられましたら、ご教示をお願い致します。

【環境】
・Solaris8
・in.ftpdを使用

【問題】
・バッチ処理にて、バーチャルIPでftpを行い、他ホストに作成された
    ファイルを取得する。
    ネットワーク障害時や他ホストdown時、バーチャルIPが見えなくなる場合、
    ftpのconnect:接続の時間切れとなるが、その場合約4分も待たされる。
    
【知りたい事】
・上記のような障害時、1ノードで約4分も待たされるのは長いので、設定で
    短く出来るのであれば短くしたい。

【検証】
    (1) OSパラメータのtcp_time_wait_interval=240000(4分)になっていたので、
     ftpがconnect_timeoutになるのは、上位のTCPのタイマーに引っかかるのでは
         と思い、nddコマンドにて60000(1分)にしてinetdデーモンを、kill -HUPした。
         変更後、バーチャルIPが見えないHostに対しftpを行なったが、以前4分で
         ftp_connect:接続の時間切れとなる。

    (2) /etc/inet/inetd.confの、ftp記述部分を下記のように-tオプションにて
         タイムアウトを設定し、inetdデーモンを、kill -HUPした。
         こちらも変更後、バーチャルIPが見えないHostに対しftpを行なったが、
         以前4分でftp_connect:接続の時間切れとなった。

    ftp stream tcp6 nowait root /usr/sbin/in.ftpd in.ftpd -t20 -l -d

※ 下記のURLを参考にさせて頂きましたが、FTPクライアントがFTP サーバに
        PORTコマンドを投げて応答なしで、データ用コネクションも張れない場合は
        どこの設定でクライアントはtimeoutを判断するのでしょうか?
        私の推測のようにTCPに依存するものなのでしょうか?

        http://x68000.q-e-d.net/~68user/net/ftp-1.html

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

No. 4215 # seki [E-mail] 2005/08/02 (火) 13:30:18
はじめまして、sekiと申します。

ftpに関しまして、分からない事があり質問させて頂きます。
どなたかご存知の方おられましたら、ご教示をお願い致します。

【環境】
・Solaris8
・in.ftpdを使用

【問題】
・バッチ処理にて、バーチャルIPでftpを行い、他ホストに作成された
    ファイルを取得する。
    ネットワーク障害時や他ホストdown時、バーチャルIPが見えなくなる場合、
    ftpのconnect:接続の時間切れとなるが、その場合約4分も待たされる。
    
【知りたい事】
・上記のような障害時、1ノードで約4分も待たされるのは長いので、設定で
    短く出来るのであれば短くしたい。

【検証】
    1 OSパラメータのtcp_time_wait_interval=240000(4分)になっていたので、
     ftpがconnect_timeoutになるのは、上位のTCPのタイマーに引っかかるのでは
         と思い、nddコマンドにて60000(1分)にしてinetdデーモンを、kill -HUPした。
         変更後、バーチャルIPが見えないHostに対しftpを行なったが、以前4分で
         ftp_connect:接続の時間切れとなる。

    2 /etc/inet/inetd.confの、ftp記述部分を下記のように-tオプションにて
         タイムアウトを設定し、inetdデーモンを、kill -HUPした。
         こちらも変更後、バーチャルIPが見えないHostに対しftpを行なったが、
         以前4分でftp_connect:接続の時間切れとなった。

    ftp stream tcp6 nowait root /usr/sbin/in.ftpd in.ftpd -t20 -l -d

※ 下記のURLを参考にさせて頂きましたが、FTPクライアントがFTP サーバに
        PORTコマンドを投げて応答なしで、データ用コネクションも張れない場合は
        どこの設定でクライアントはtimeoutを判断するのでしょうか?
        私の推測のようにTCPに依存するものなのでしょうか?

        http://x68000.q-e-d.net/~68user/net/ftp-1.html

No. 4216 # 68user 2005/08/02 (火) 13:49:52
>>4215 seki
> tcp_time_wait_interval=240000(4分)になっていたので、
tcp_time_wait_intrval は TIME_WAIT な時間を設定するものなので、
関係ありません。
    http://docs.sun.com/app/docs/doc/816-0607/6m735r5ga?a=view

> ftp stream tcp6 nowait root /usr/sbin/in.ftpd in.ftpd -t20 -l -d
タイムアウト設定をしたいのは ftp であり、ftpd ではないので
関係ありません。そもそもネットワーク障害や他ホストが down して
いるのであれば、ftpd まで行き着いていません。

今回設定したいのは、
    http://X68000.q-e-d.net/~68user/net/tcp-connect-1.html
における connect のタイムアウト時間と思われますが、OS の設定で
変更できるかどうかは知りません。ただし、普通は OS の設定は変更
しません。たとえば今後、
    - FTP 接続だけは 10秒でタイムアウトさせたい
    - それ以外のプログラムでは 4分待たせたい
というときにどうしようもなくなるからです。

対策としては、
    - ftp に -T [タイムアウト秒数] オプションを付ける (試していませんが)
    - ftp の前に ping してみる (タイムアウト秒数を指定)
    - 監視用プロセスをたて、一定時間反応がなければ ftp を kill する
てな感じでしょうか。

No. 4218 # seki [E-mail] 2005/08/02 (火) 16:31:10
>>4216 68user
> たとえば今後、
> - FTP 接続だけは 10秒でタイムアウトさせたい
> - それ以外のプログラムでは 4分待たせたい
> というときにどうしようもなくなるからです。

→ 誠に早急なご返答、及びご教示の程、ありがとうございます。
        上記の返答、ごもっともです。
        - ftp に -Tをつけるのは、一つの手だと思いますが、APLに手を
        入れる事なく設定変更で済ませれるのであれば済ませたいです。

        申し訳ございませんが、ftpのソースコードなどは開示されていないので
        しょうか??
        (4分でタイムアウトするという事は必ずどこかを見て判断しているはずですので
         ソースにじか書きしている可能性もある?かと思われるため確認したいです。)

No. 4219 # Netboy 2005/08/02 (火) 18:51:38
>>4218 seki
横からすみません.
ftpのポート21でconnectできるかチェックするPerlスクリプトを
書いてみました.試していただけますか?

use Socket;

$SIG{'ALRM'} = sub { close(SOCK); $sTimeout='(timeout)'; };

# ConnectTest(IPアドレス,ポート,タイムアウト秒数)

if (!&ConnectTest('192.168.x.x',21,5)){
    print "cannot make a ftp connection.\n";
    exit;
}

# 正常ならばftpコマンドを実行
system ('ftp hogehoge');

exit;

sub ConnectTest
{
    local($sIP,$nPort,$nTimeout)=@_;
    local($iaddr,$paddr,$flag,$protoTCP,$sTimeout);

    $iaddr = inet_aton($sIP) || die "no host: $sIP";
    $protoTCP = getprotobyname('tcp');

    $paddr = sockaddr_in($nPort, $iaddr);
    $flag=socket(SOCK, PF_INET, SOCK_STREAM, $protoTCP);

    if (!$flag){ goto J1_1; }

    $flag=0;$sTimeout='';

    eval {
        alarm($nTimeout);
        $flag=connect(SOCK, $paddr);
        alarm(0);
    };

    if (!$flag){ goto J1_1; }
    if ($sTimeout){ goto J1_1; }

    close (SOCK);
    return 1;
J1_1:
    close (SOCK);
    return 0;
}

No. 4220 # 68user 2005/08/02 (火) 21:19:51
>>4218 seki
> ftpのソースコードなどは開示されていないのでしょうか??
Solaris8 のソースは配られていたかどうかは忘れましたが、いずれにせよ
ソース中には 4分という記載はありません (見てませんが)。connect(2) の
タイムアウトを決めるのはカーネルの仕事です。

で、
    http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-3.html#ss3.5
によると、
    # ndd -set /dev/tcp tcp_ip_abort_cinterval 180000
で変更可能なようです。

> APLに手を入れる事なく設定変更で済ませれるのであれば済ませたいです
プログラムに手を入れるよりもカーネルの設定を変える方がよいというのは
間違った判断だと思います。

まぁ客や上司の意向とか、ソース触ったら契約がどうこうとか、世の中には
うっとうしいことがいろいろあるので別にいいですが。

>>4219 Netboy
ウチの環境では動きました。

No. 4221 # 68user 2005/08/03 (水) 23:28:20
usen-221x242x135x85.ap-US01.usen.ad.jp (221.242.135.85) の方、
    /~68user/net/sample/http-auth/secret.html
に 21分間で 25万回アクセスするのは、ぜひともやめていただきたい。

って言っても、どうせ見てないんだろうし、deny したところでおそらく動的に
IP アドレスを振ってるだろうし、こういう輩はどうしたらいいんですかねぇ。

No. 4222 # へにか [URL] 2005/08/06 (土) 03:07:46
>>4221 68user
いや、もう、それは管理部門に連絡するのが良いでしょう。
満足いく内容かどうかはともかく、大抵は何らかの返答はありますよ。

#釈迦に説法のような気がしてなりませんが。

No. 4223 # 68user 2005/08/06 (土) 04:18:05
>>4222 へにか
なるほど、そういうものですか。usen ならここらへんでしょうか。
    http://www.fttx.co.jp/jp/contact/abuse.html

ただ、マシンが落ちるなどの実害はなかったことと、usen の web によると
実名を書けだの、仲介しかしないだの、めんどくさそうなので今回は
放置します。

ちなみに「どうしたらいいのか」というのは技術的な解決方法はないですかねぇ、
という意味でした。たとえば一定時間に指定の閾値を超えた IP アドレスは deny
するような apache のモジュールがどこかにありそうですよね。

というわけで探したらありました。
    http://www.netnice.org/pukiwiki.php?%B4%FB%C2%B8%A4%CEApache%A5%C8%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF%C0%A9%B8%E6%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB

まぁほんとにしつこくやってくるようなら usen ごと deny するので
別にいいんですけどね。

No. 4224 # へにか 2005/08/06 (土) 05:58:59
あぁ、技術的な話でしたか。
それに似た話は、某掲示板群で話題になってますね。
http://qb5.2ch.net/operate/kako/1113/11135/1113508190.html
http://qb5.2ch.net/test/read.cgi/operate/1113647422/
しつこいクローラー&過剰リロード対策についての議論です。ご参考までに。

因みに、他の業者に対しては本名を名乗ったことはありません(へにかのまま)。
usenも変な話で、被害をこうむったほうの名前は聞くけど、被害を出したほうの
名前は出さないっていうことですよね? その辺を突っついてみると、なんらか
の回答が出るかもしれません。・・・が、放置されるとの事ですので、補足意見
とさせてください。

No. 4225 # mmm 2005/08/08 (月) 22:27:24
"ネットワークプログラミングの基礎知識"等にある
サンプルプログラムのライセンスはどうなっているのでしょうか?

No. 4226 # 匿名 2005/08/09 (火) 01:42:54
>>4222 へにか
危ない
その輩は
server:os-ns01.usen.ad.jp
address:61.122.127.122
name:221x242x135x85.ap.221.ftth.ucom.ne.jp
address:221.242.135.85

私は
server:os-ns01.usen.ad.jp
address:61.122.127.122
name:*******
address:61.116.228.135
なんですけどサーバーが同じだと危ないのですかね?

No. 4227 # zsh 2005/08/09 (火) 08:05:37
>>4225 mmm
過去ログ読んでから質問した方がいいですよ。
ライセンスについては
>>4089 68user
にあります。

No. 4228 # りゅう 2005/08/09 (火) 16:14:15
すいません、質問させてください。

UNIX上で、ファイルをmac用にstuffit形式に圧縮できるツールを探しているのですが、
ありますでしょうか。

No. 4229 # しず 2005/08/09 (火) 16:48:11
素人ですが質問させてください。
solaris9 cにて開発しています。
クライアントサーバ間を常駐プロセス1:1(クライアント1、サーバ1プロセス)にて
TCP/IPソケット通信しようと考えています。
1接続毎にconnect/closeするのではなく、常にconnectionし続けようと考えています。
そこで、質問ですが、通信中にサーバ側がなんらかの理由により切断された場合、クライアント側は
connectからやり直す必要があるのでしょうか?
それともsendを行えば内部的にconnectを行って、sendしてくれるんでしょうか?
質問が下手ですみません。

No. 4230 # まつ 2005/08/09 (火) 20:29:19
環境はSunOS 5.8です。

------------------------
#!/bin/csh -fx
setenv LANG ja_JP.PCK
・・・
------------------------
というrootから起動されるshellスクリプトを実行すると
(あるバッチ処理管理ソフトを使って起動するとrootから起動されるのです)

setenv LANG ja_JP.PCK
Locale could not be set properly

というエラーになってしまうのですが、何故か分からず困っています。
助けて下さい。 m(_ _)m

telnetでuser01でログインしてsetenvを実行すると
LANG=ja_JP.PCK
となっていますが、上記スクリプトにsetenvを記述すると
LANGは表示されません。

スクリプトにsetenv LANG ja_JP.PCKを記述しないと
echo チェックリスト作成処理(/disk1/hoge/hoge01/sh/AAA001.csh) 開始
Unmatched `
というエラーになります。
telnetでuser01でログインして実行するとsetenv LANG ja_JP.PCKが
なくても正常終了します。

どうぞ宜しくお願い致します。

No. 4231 # へにか 2005/08/09 (火) 21:53:25
>>4226 匿名
> なんですけどサーバーが同じだと危ないのですかね?
う〜ん、僕には力不足で答えられないです。ところで危ないって、どういう局面を想定されていますか?

しかし、その輩、ftth.ucom.ne.jpって、FTTH! うらやましいなぁ。そんな贅沢な帯域があるんだったら、有効に使ってほしい今日この頃です。

No. 4232 # 68user 2005/08/09 (火) 23:45:17
>>4224 へにか
なるほど、そちらも参考にさせていただきます。

>>4226 匿名
> server:os-ns01.usen.ad.jp
というのは、あなたが使用している DNS サーバが os-ns01.usen.ad.jp
であることを示しているだけです。普通は、どの IP アドレス・FQDN に
ついて正引きや逆引きをしても、「server」の部分は変化しません。

>>4228 りゅう
シェアウェアっぽいですが、
    http://www.stuffit.com/unix/index.html
など。あと、
    http://www.asl.ee.meisei-u.ac.jp/kaken/stuffit.j.html
によると netatalk にも含まれているとか。

>>4229 しず
> connectからやり直す必要があるのでしょうか?
コネクションが切れた場合は、connect しなおす必要があります。

>>4230 まつ
よくわかりませんが、手元の Solaris8 でも同様の結果になりました。setenv が
呼ばれると、シェルは putenv(3) するだけではなく setlocale(3) あたりも呼ぶ
必要があるような気がしますが、Solaris8 の csh はそこの処理にバグがあるのでは
ないかと思います。

csh をやめて sh・tcsh・ksh などに切り替えるか、あるいは
    #!/bin/sh
    exec env LANG=ja_JP.PCK 実行したいスクリプト名
というような wrapper スクリプトをかませてはどうでしょうか。

No. 4233 # まつ 2005/08/10 (水) 00:29:48
>>4232 68user
他のサーバー(同じくSunOS5.8だったはずです)では同じように
rootから実行できているのです。何かが違うのでしょうね。。

両サーバーのrootの環境を比較するなりしてみます。
#サーバー管理者へ依頼する必要があるのですが・・・

社内の人より下記で逃げられるという指摘もありました
が、他サーバーで出来ているので腑に落ちません。
-----------------------------
unsetenv LC_ALL
setenv LANG ja_JP.PCK
setenv PATH .:$PATH

/usr/bin/env

set echocmd=/usr/bin/echo
$echocmd 'チェックリスト作成処理($0) 開始'
-----------------------------


それでも分からなければwrapperスクリプトをかませてみます。

他に何かありましたらご教示下さい。

No. 4234 # 68user 2005/08/10 (水) 04:49:13
>>4233 まつ
> が、他サーバーで出来ているので腑に落ちません。
想像ですが、OS インストール時に ja_JP.PCK を選択すると
うまく動くのかもしれません。

No. 4235 # zsh 2005/08/10 (水) 08:46:36
>>4233 まつ
問題のあるサーバだけLC_ALLが設定されていませんか?
localeコマンドの結果を比較してみてください。

どちらのサーバでも設定されているのであれば
導入されているロケールパッケージ(?)の差だと思います。

No. 4236 # まつ 2005/08/10 (水) 10:37:03
>>4235 zsh
お察しの通り、問題のあるサーバだけLC_ALLが設定されていました!

--動かないサーバー-----------
LANG=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=JA16SJIS
--問題ないサーバー-----------
LANG=ja_JP.PCK
LC_CTYPE="ja_JP.PCK"
LC_NUMERIC="ja_JP.PCK"
LC_TIME="ja_JP.PCK"
LC_COLLATE="ja_JP.PCK"
LC_MONETARY="ja_JP.PCK"
LC_MESSAGES="ja_JP.PCK"
LC_ALL=
-----------------------------

1、rootでLC_ALLが設定されているという事でしょうか?
2、問題ないサーバーと同じ環境にするには何処を直せば良いのでしょうか?
3、2がサーバー管理方針などで変更できない場合、C-Shellで
            unsetenv LC_ALL
            setenv LANG ja_JP.PCK
        とすれば良いのでしょうか?

宜しくお願い致します。

No. 4237 # しず 2005/08/10 (水) 11:05:30
>>4232 68user
>コネクションが切れた場合は、connect しなおす必要があります。
コレクションが切れているか否かの検知ですが、クライアントからsendを
行ったときのタイムアウトを検知したときが一般的でしょうか
(むしろこれしかない?)

宜しくお願いします。

No. 4238 # まつ 2005/08/10 (水) 11:28:44
>>4235 zsh
試しに下記を実行してみましたが、元に戻ってしまいました。。
echo内の日本語が文字化け?して「`」になっている為でしょうが
何故未だ日本語が表示できないのでしょうか?
問題ないサーバーではダブルコーテーションで囲まれてるのに
下記結果では囲まれてないのがダメなのでしょうか?
----------------------------------------------------
#!/usr/bin/csh -fx

locale
unsetenv LC_ALL
setenv LANG ja_JP.PCK
setenv LC_CTYPE ja_JP.PCK
setenv LC_NUMERIC ja_JP.PCK
setenv LC_TIME ja_JP.PCK
setenv LC_COLLATE ja_JP.PCK
setenv LC_MONETARY ja_JP.PCK
setenv LC_MESSAGES ja_JP.PCK
locale
echo "ロードエラーチェックリスト作成処理($0) 開始"
----------------------------------------------------
locale
LANG=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=JA16SJIS
unsetenv LC_ALL
setenv LANG ja_JP.PCK
setenv LC_CTYPE ja_JP.PCK
setenv LC_NUMERIC ja_JP.PCK
setenv LC_TIME ja_JP.PCK
setenv LC_COLLATE ja_JP.PCK
setenv LC_MONETARY ja_JP.PCK
setenv LC_MESSAGES ja_JP.PCK
locale
LANG=ja_JP.PCK
LC_CTYPE=ja_JP.PCK
LC_NUMERIC=ja_JP.PCK
LC_TIME=ja_JP.PCK
LC_COLLATE=ja_JP.PCK
LC_MONETARY=ja_JP.PCK
LC_MESSAGES=ja_JP.PCK
LC_ALL=
echo [hG[`FbNXg(/disk18/acua/acua01/sh/FNC07998.csh) Jn
不整合 - `
----------------------------------------------------

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

No. 4239 # 68user 2005/08/10 (水) 11:53:31
>>4238 まつ
実験してみましたが、うまくいかないサーバには ja_JP.PCK の
ロケールがインストールされていないようです。
>>4232 68user
で「csh のバグでは」と言いましたがこれは誤りで、csh だけが
真面目にエラーチェックしているような感じです。

動かないマシン (Solaris8) の /usr/lib/locale/ja_JP.PCK/:
    LC_MESSAGES/

動くマシン (Solaris2.6) の /usr/lib/locale/ja_JP.PCK/:
    LC_CTYPE/
    LC_MESSAGES/
    LC_TIME/
    ja_JP.PCK.so.1
    locale_description
    methods_ja_JP.PCK.so.1

そして ja_JP.PCK ロケールが含まれているマシンであっても、
    #!/bin/csh
    setenv LANG ja_JP.PCK
    echo "ロードエラーチェックリスト作成処理($0) 開始"
このスクリプトは動作しませんでした。おそらく、ja_JP.PCK にした
時点では、既にスクリプトの字句解析は終了しているからだろうと思います。

対策案は 3つ。

案1.
    - ja_JP.PCK ロケールをインストールする。インストール方法は知りませんが、
        以前他のマシンから /usr/lib/locale/ja_JP.PCK/ をぶっこ抜いてきたことが
        あったっけ。
    - さらに wrapper スクリプトを作る

案2.
    Shift_JIS の「チ」の 2バイト目が ` であることが直接の原因なわけで、
          echo 'ロードエラーチェックリスト作成処理('$0') 開始'
    などと '' で囲んで ` を解釈させないようにする。

案3.
    一番いいのは、スクリプトを EUC-JP に変えて、ロケールを混在
    させないこと。

あと、
> LC_ALL=JA16SJIS
というロケールは存在しないので、おそらく無効なロケール扱いされて
いるでしょう。JA16SJIS って Oracle 的なロケール表記ですから。

LANG と LC_* の関係は以下の URL をどうぞ。
    http://www.jp.freebsd.org/QandA/HTML/2199.html
    http://www.jp.freebsd.org/QandA/HTML/2200.html

No. 4240 # 68user 2005/08/10 (水) 12:32:18
>>4237 しず
send はローカルの mbuf にデータをコピーしたら正常終了と
みなすので、エラーになりません。

recv でエラーになるか、次回の send で EPIPE が発生するかの
いずれかです。

No. 4241 # まつ 2005/08/10 (水) 13:47:41
>>4239 68user
/usr/lib/locale/ja_JP.PCK/:を両サーバーで比較しましたが同じでした。

そして上手く行くサーバーでは
        #!/bin/csh
        setenv LANG ja_JP.PCK
        echo "ロードエラーチェックリスト作成処理($0) 開始"
も動作しました。

LANG と LC_* の関係、有り難うございます。勉強になります。
#!/bin/csh -fx
locale
unsetenv LC_ALL
setenv LC_ALL ja_JP.PCK
setenv LANG ja_JP.PCK
unsetenv LC_ALL
locale
env
として、うまくいくサーバーと同じlocaleに出来ましたがそれでも不整合になります。

env実行結果
--上手く行くサーバー-----------------------------------------
HOME=/export/home/adm
HZ=100
LANG=ja_JP.PCK
LOGNAME=adm
MAIL=/var/mail/adm
PATH=/opt/oracle/product/8.1.7/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:
PS1=#
PWD=/opt/netos/bin
SHELL=/bin/csh
TERM=vt100
TZ=Japan
USER=adm
_INIT_NET_STRATEGY=none
_INIT_PREV_LEVEL=S
_INIT_RUN_LEVEL=3
_INIT_RUN_NPREV=0
_INIT_UTS_ISA=sparc
_INIT_UTS_MACHINE=sun4u
_INIT_UTS_NODENAME=isv1dm10
_INIT_UTS_PLATFORM=SUNW,Ultra-Enterprise-10000
_INIT_UTS_RELEASE=5.8
_INIT_UTS_SYSNAME=SunOS
_INIT_UTS_VERSION=Generic_108528-16
--上手く行かないサーバー-----------------------------------------
HOME=/
HZ=100
LOGNAME=root
PATH=/usr/sbin:/usr/bin:/opt/EMCpower/bin:/etc:/usr/ccs/bin:/usr/local/bin
SHELL=/sbin/sh
TERM=vt100
TZ=Japan
PWD=/opt/netos5/bin
USER=root
LANG=ja_JP.PCK
-----------------------------------------------------------------
この辺の環境が違うのがダメなのでしょうか?

案1はja_JP.PCK ロケールはインストールされており上記でLANGの設定も
出来たので、案からは外れたと思います。

案2ですが、echoをダブルコーテーションで囲むのとシングルコーテーションで
囲むのでは解釈が異なるのですね??  知りませんでした。。

案3ですが、うまくいくサーバーではShift_JISで動作しているので
腑に落ちません。。envの結果に差があるのが原因でしょうか??

文字コードって奥が深いというか複雑というか厄介ですね。。(^^;

No. 4242 # 68user 2005/08/10 (水) 14:07:10
>>4241 まつ
> /usr/lib/locale/ja_JP.PCK/:を両サーバーで比較しましたが同じでした。
そうですか、謎ですね。

> そして上手く行くサーバーでは
>  #!/bin/csh
>  setenv LANG ja_JP.PCK
>  echo "ロードエラーチェックリスト作成処理($0) 開始"
> も動作しました。
それは最初から LC_CTYPE が ja_JP.PCK になっているからではないですか?
LANG・LC_* を全部クリアして、このスクリプトが動きますか? うちの ja_JP.PCK
ロケールがインストールされている Solaris2.6 ではエラーになりました。

> 案3ですが、うまくいくサーバーではShift_JISで動作しているので
> 腑に落ちません。。envの結果に差があるのが原因でしょうか??
ロケールを統一ってのは、例えばログのエンコーディングがばらばら
だったりすると grep するにも面倒でしょ、というレベルの話です。

うまくいかないサーバで、
    #!/bin/csh -f
    echo "ロードエラーチェックリスト作成処理($0) 開始"
のスクリプトを root で
    % env LANG=ja_JP.PCK [スクリプト名]
とすると動くのですよね?

あと、うまくいかないサーバで、
    - root で実行するとエラー
    - user01 で実行するとうまく動く
ということですよね?

root と user01 のログイン後の env 結果を比較してみてはどうですか?

No. 4243 # まつ 2005/08/10 (水) 14:39:48
>>4242 68user
上手く行くサーバーで
----------------
unsetenv LC_ALL
unsetenv LANG
locale
env
echo "ロードエラーチェックリスト作成処理($0) 開始"
----------------
としたら
-----------------------------------------
LANG=
LC_CTYPE="C"
・・・
_INIT_UTS_VERSION=Generic_108528-16
(/data/keisu/ffile/shell/Data_Unqget.sh)
-----------------------------------------
となりました。。二バイト文字が無視されている??

> うまくいかないサーバで、
> #!/bin/csh -f
> echo "ロードエラーチェックリスト作成処理($0) 開始"
> のスクリプトを root で
> % env LANG=ja_JP.PCK [スクリプト名]
> とすると動くのですよね?
私にはrootで実行する権限がなく、あるバッチ管理ツール経由で
起動させているのですが、そのツールに
env LANG=ja_JP.PCK /disk01/hoge/hoge.csh
と記述して起動させると
stat: No such file or directory
となってしまいました。。

> あと、うまくいかないサーバで、
> - root で実行するとエラー
> - user01 で実行するとうまく動く
> ということですよね?
そうです。
バッチ管理ツールはそのツールプロセスを起動させた時点の
起動したユーザ環境が引き継がれるのですが、rootでその
ツールを起動させています。
telnetでuser01でログインして実行すると上手く動くのです。

> root と user01 のログイン後の env 結果を比較してみてはどうですか?
以下のとおりです。
------------root-------------------------------------------------
#スクリプトにenvを書いてツールから実行させて吐き出した結果です
HOME=/
  HZ=100
  LOGNAME=root
  PATH=/usr/sbin:/usr/bin:/opt/EMCpower/bin:/etc:/usr/ccs/bin:/usr/local/bin
  SHELL=/sbin/sh
  TERM=vt100
  TZ=Japan
  PWD=/opt/netos5/bin
  USER=root
  LANG=ja_JP.PCK
------------user01-------------------------------------------------
HOME=/export/home/user01
PATH=/opt/ora8i/app/oracle/product/8.1.7/bin:/usr/bin:/usr/ccs/bin:/usr/ucb:/bin:/usr/bin:/usr/ucb:
/etc:.
LOGNAME=user01
HZ=100
TERM=vt100
TZ=Japan
SHELL=/bin/csh
MAIL=/var/mail/user01
LANG=ja_JP.PCK
_INIT_NET_STRATEGY=none
_INIT_PREV_LEVEL=S
_INIT_RUN_LEVEL=3
_INIT_RUN_NPREV=0
_INIT_UTS_ISA=sparc
_INIT_UTS_MACHINE=sun4u
_INIT_UTS_NODENAME=atras01
_INIT_UTS_PLATFORM=SUNW,Sun-Fire-480R
_INIT_UTS_RELEASE=5.8
_INIT_UTS_SYSNAME=SunOS
_INIT_UTS_VERSION=Generic_108528-22
PWD=/export/home/user01
USER=user02
ORACLE_BASE=/opt/ora8i/app/oracle
ORACLE_HOME=/opt/ora8i/app/oracle/product/8.1.7
ORACLE_SID=SID_A
NLS_LANG=Japanese_Japan.JA16SJIS
ORA_NLS33=/opt/ora8i/app/oracle/product/8.1.7/ocommon/nls/admin/data
LD_LIBRARY_PATH=/opt/ora8i/app/oracle/product/8.1.7/lib
-----------------------------------------------------------------
何が悪いのか分かりますか??

No. 4244 # 68user 2005/08/10 (水) 14:48:11
>>4243 まつ
わたしが言いたいのは
    - スクリプトの先頭で LANG を設定しても、既に字句解析は
        終了しているのだから意味がないのでは。
    - うまく動く環境では、元々 ja_JP.PCK が設定されていただけでは。
ということです。

> stat: No such file or directory
これは別問題ですよね。
    #!/bin/csh -f
    echo "チェック"
が動くかどうかを確認すべきです。

No. 4245 # 68user 2005/08/10 (水) 14:52:25
あと、
    Locale could not be set properly
についてはわかりません。

こちらの環境では、ja_JP.PCK ロケールがない場合のみ
このエラーが出て、ロケールがある環境ではうまく動きました。

No. 4246 # zsh 2005/08/11 (木) 08:16:27
>>4243 まつ
メッセージの意味としては、選択されたロケールが使用できない状態(つまりインストールされていない)
である事を示しています。

恐らく今の状態は
1./etc/profile か /.profileで LC_ALL を設定している。(且つ間違い)
2.当然 root から生成された子プロセスにも LC_ALL が設定されている(且つ間違い)
3.LANG を変更する際に( LC_ALL が空ではないので) LC_ALL のロケールについても
    チェックされる
        →存在しないロケールなので「Locale could not be set properly」を出力
            (ただし LANG は変更されている筈)
だと思います。
一般ユーザで動作するのであれば、PCK ロケールはインストールされているので
文字化けの原因は、親プロセスの環境変数の違いによるのかも知れません。つまり
>>4244 68user
ではないかと。
(確認するためには wrapper スクリプトかますのが簡単だと思います。)

No. 4247 # 68user 2005/08/11 (木) 10:03:09
>>4246 zsh
> 3.LANG を変更する際に( LC_ALL が空ではないので) LC_ALL のロケールに
> ついてもチェックされる
なるほど、それは気がつきませんでした。

ja_JP.PCK ロケールがインストールされている Solaris2.6 で、LC_ALL に
JA16SJIS をセットして、さらに LANG に ja_JP.PCK をセットすると、
      Locale could not be set properly
となりました。

No. 4248 # まつ 2005/08/12 (金) 11:43:03
68user様、zsh様、返事が遅くなり大変申し訳ございません。m(_ _)m

>>4246 zsh
とてもよく分かりました。
.profileは / にも /etc にもありませんでしたが、子プロセス起動時に
間違ったLC_ALLを設定しているのが原因なのですね。

子プロセスを再起動すれば解決するのでしょうね。
開発依頼者へお願いしても中々動いてくれません・・(T^T)

なので、このスクリプトのみをEUC-JPに変えてunsetenv LC_ALLしたところ
正常に実行できました。

ということで、wrapperスクリプトをかまして確認してませんが、お二人の
仰ることに間違いはないですから、その旨開発依頼者へ報告しておきます。

色々有り難うございました。助かりました。m(_ _)m
これで心置きなくお盆休みに入れます(^^)

No. 4249 # まつ 2005/08/12 (金) 14:28:36
スクリプトをシフトJISへ戻してwrapperスクリプトをかませて
テストしてみました。

-----wrapper.sh------------------
#!/bin/sh -fx
exec env LANG=ja_JP.PCK /disk01/hoge/hoge01/sh/FNC0123.csh
-----FNC0123.csh------------------
#!/usr/bin/csh
unsetenv LC_ALL
・・・
-----ツールから実行した結果------------------
couldn't set locale correctly
+ exec env LANG=ja_JP.PCK /disk01/hoge/hoge01/sh/FNC0123.csh
・・・
-----------------------

のように最初に変なメッセージが表示されますが、それ以降は
文字化けもなく理想どおりの結果が得られました。

最初の変なメッセージは間違ったLC_ALLを設定している為でしょうか?

何はともあれ、これで子プロセスを再起動してもしなくても正常に
動作しそうです。

どうも有り難う御座いました。m(._.)m

No. 4250 # 68user 2005/08/14 (日) 04:11:57
たわむれに Ajax で遊んでみました。RFC のタイトルから検索を行います。
    http://X68000.q-e-d.net/~68user/rfc/

以下のような URL も有効です。
    http://X68000.q-e-d.net/~68user/rfc/?key=821
    http://X68000.q-e-d.net/~68user/rfc/?key=http

XMLHttpRequest をひとつしか生成しないタイプではなく、ばしばし XMLHttpRequest を
作る、富豪版です (google タイプ)。ソースはこちら。
    http://X68000.q-e-d.net/~68user/cgi-bin/cvsweb.cgi/public_html/rfc/

>>4294 hagu
> 最初の変なメッセージは間違ったLC_ALLを設定している為でしょうか?
unsetenv LC_ALL には意味がないので、
    env LC_ALL= LANG=ja_JP.PCK ...
とすれば直ると思います。

No. 4251 # みのさん 2005/08/14 (日) 16:20:35
findコマンドでファイルが今日(本日)作成されたものだけを
抽出したいのですが、以下でよいのでしょうか;

find . -name '*.*' -mtime -1 -print

他に別の方法がありますか。

No. 4252 # zsh 2005/08/14 (日) 20:52:40
>>4251 みのさん
・ファイル名で絞り込まないのであれば -name オプションは不要です。
・-mtime -1 では「本日作成」ではなく、「24時間以内に変更」されたものが対象となります。
    (作成日をみるようなオプションは無いと思います。)
・-print オプションは無くても出力されます。
・ファイルに限定したいのであれば -type f が必要です。

こんなもんでしょうか。

No. 4253 # 68user 2005/08/14 (日) 22:20:56
>>4251 みのさん
追加。

- 一般的な UNIX のタイムスタンプには、厳密な意味でのファイル作成時刻は
    存在しない。ctime は、例えばパーミッションを変更すると更新される。
- 「24時間以内」ではなく「本日」にしたいなら、適当なファイルを
      作って、touch で mtime を前日 23:59:59 にして、
          find -newer [適当なファイル]
      とするのが一般的。しかし手抜きするなら以下のような方法も。
          % find . -type f -ls | grep "`date '+%b %d'`"

>>4252 zsh
BSD や GNU の find には -ctime オプションがあります。-cnewer ってのも
あるようですね (基準ファイルの mtime と検索対象の ctime を比較)。


今日の発見その 1

touch(1) などが使うシステムコール utimes(2) って、ctime を更新できない
んですねぇ。atime・ctime・mtime いずれも変更可能だとずっと思っていました。

今日の発見その 2

FreeBSD 5.x 以降で対応された UFS2 では本当の生成時刻 (inode 作成時刻) が
保存されていて、struct stat の st_birthtime で参照可能なようです。へぇ。
    http://www.usenix.org/events/bsdcon03/tech/full_papers/mckusick/mckusick_html/
    http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=stat&dir=jpman-5.2.0%2Fman&sect=2

No. 4254 # 68user 2005/08/15 (月) 00:05:35
>>4250 68user
RFC のタイトルだけでなく、全文検索もできるようにしました
(namazu を使っているので Ajax には向かないですが)。
      http://X68000.q-e-d.net/~68user/rfc/

結構使えるかも、と思うのはわたしだけですかそうですか。

No. 4255 # へにか [URL] 2005/08/15 (月) 07:21:28
>>4254 68user
JavaScript必須というのが、いきなり敷居が高いと申しますか、何と申しますか・・・
今みたいに、帰省先でpoorな環境で使っていると、その時点で引いてしまっております。

>>4250 68user
ここでポイントしている>>4294が、4294まで投稿が伸びたときに、どうなるか、気になるところです。

No. 4256 # みのさん 2005/08/15 (月) 15:23:21
> 4523
ありがとうございます。

別なんですが、
カンマ区切りのCSV形式のデータを読み込み
nawkのsub関数を使用して文字列の置換をやっています。
フィールド2番目のみを入れ替えようとして以下の様に
しました。
置換は行われたのですが、カンマが半角スペースに置換え
られて出力されてしますのです。
カンマのまま出力させるには、どうすればよいのですか。


nawk -F"," -v OUT=${OUT_FILE} -v OLD=${OLD_STR} -v NEW=${NEW_STR} '
BEGIN {
          output=sprintf("%s",OUT);
}
function func(OLD,NEW) {
        (処理)

        sub($2,NEW,$2) ; print >> output ;

        (処理)
}
        func(OLD,NEW);
}' $IN_FILE

No. 4257 # zsh 2005/08/15 (月) 18:18:37
>>4253 68user
フォローありがとうございます。
-ctime オプションは使ったことが無いですね。
(使う場面もない・・・)

>>4254 68user
Ajax を弄ってみたいと思っていたので、
サンプルとして参考にさせて頂きます。

>>4256 みのさん
変数OFSで出力用の区切り文字を指定できます。

No. 4258 # みのさん 2005/08/15 (月) 20:35:01
>>4257 zsh

>変数OFSで出力用の区切り文字を指定できます。
ありがとうございます。
上手くいきました。

No. 4259 # 68user 2005/08/15 (月) 21:48:19
>>4255 へにか
> JavaScript必須というのが、いきなり敷居が高いと申しますか
RFC の検索がやりたかったわけではなく、Ajax で遊んでみたかった
だけなので、Javascript 必須なのはなにとぞご勘弁を。

>>4256 みのさん
お礼だけではなく、結果報告をしていただけるとうれしいです。
    http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?howtouse

>>4257 zsh
> Ajax を弄ってみたいと思っていたので、
> サンプルとして参考にさせて頂きます。
学習目的ならば
    http://chasen.org/~taku/software/ajax/ime/
の方がシンプルでよいと思います。ただし上記 URL の
    if (oldkey != key) {
        oldkey = key;
        if (xmlhttp.readyState == 1 ... ){ return; }
は、正しくは
    if (oldkey != key) {
        if (xmlhttp.readyState == 1 ... ){ return; }
        oldkey = key;
です (とわたしは思っています)。


ところで、「RFC 検索」に RFC の日本語訳へのリンク機能を追加しました。
    http://X68000.q-e-d.net/~68user/rfc/?key=http&target=title

No. 4260 # みのさん 2005/08/16 (火) 01:52:27
>>4259 68user
お礼だけで、確認結果を報告せず申し訳ありません。

> とするのが一般的。しかし手抜きするなら以下のような方法も。
> % find . -type f -ls | grep "`date '+%b %d'`"
で試してみました。
確かに、本日作成のファイルが表示されました。
date '+%b %d'でgrepをしているため、1年前の同じ日付のものが表示
されます。

No. 4261 # 68user 2005/08/16 (火) 02:32:19
>>4260 みのさん
> date '+%b %d'でgrepをしているため、1年前の同じ日付のものが表示
> されます。
なるほど。
    本日の分は Aug 16 02:16
    昨年以前は Aug 16 2004
などと表示されるので、
    % find . -type f -ls | grep "`date '+%b %d'` [0-9][0-9]:[0-9][0-9]"
とかですかね。

とはいえ所詮は手抜きな方法なのでおすすめはしません。

No. 4262 # みのさん 2005/08/17 (水) 10:35:25
>>4261 68user

>とはいえ所詮は手抜きな方法なのでおすすめはしません。
> % find . -type f -ls | grep "`date '+%b %d'` [0-9][0-9]:[0-9][0-9]"
>とかですかね。

手抜きとは言っても期待した結果は得られました。

No. 4263 # まつ 2005/08/18 (木) 14:32:11
今日から仕事復帰しました。m(_ _)m

>>4250 68user

>unsetenv LC_ALL には意味がないので、
> env LC_ALL= LANG=ja_JP.PCK ...
> とすれば直ると思います。

確認させて下さい。
具体的には、下記のようにすれば良いという事でしょうか?

-----wrapper.sh------------------
#!/bin/sh -fx
exec env LC_ALL= LANG=ja_JP.PCK /disk01/hoge/hoge01/sh/FNC0123.csh
-----FNC0123.csh------------------
#!/usr/bin/csh
#コメントアウトunsetenv LC_ALL
・・・
----------------------------------

以上、宜しくお願い致します。

No. 4264 # 68user 2005/08/19 (金) 15:45:20
>>4263 まつ
> 具体的には、下記のようにすれば良いという事でしょうか?
その通りです。

No. 4265 # まつ 2005/08/22 (月) 15:10:13
こんにちわ。19日はお休みを頂いておりました。
>>4264 68user
御礼が遅くなりました。
有り難う御座いました。m(_ _)m

No. 4266 # 2005/09/03 (土) 15:56:14
リダイレクションの操作について教えて下さい。
環境は、Solaris8、シェルは、shです。

file1.txtファイルは存在。
file2.txtファイルは存在しません。
の状況で、lsの結果をリダイレクションを使ってファイルに出力
しています。

ls -l text1.txt text2.txt > kekka.txt 2>&1
標準出力と標準エラーを、kekka.txtファイルに出力。

ls -l text1.txt text2.txt 2>&1 > kekka.txt
標準出力のみ、kekka.txtに出力。

ls -l text1.txt text2.txt 2>&1 2> kekka.txt
標準エラーのみ、kekka.txtに出力。


ls -l text1.txt text2.txt 2>&1 >&kekka.txt
標準出力と標準エラーを、kekka.txtファイルに出力。
何故なのでしょうか。

ls -l file1.txt file2.txt 1>&2 2>&kekkat.xt
sh kekka.txt: ambiguous redirect
何故なのでしょうか。

No. 4267 # つよし 2005/09/03 (土) 16:00:54
>>4266

No.4266の書込み内容が間違っていました。名前も中途半端です。
訂正も含め再書込みします。

リダイレクションの操作について教えて下さい。
環境は、Solaris8、シェルは、shです。

file1.txtファイルは存在。
file2.txtファイルは存在しません。
の状況で、lsの結果をリダイレクションを使ってファイルに出力
しています。

ls -l file1.txt file2.txt > kekka.txt 2>&1
標準出力と標準エラーを、kekka.txtファイルに出力。

ls -l file1.txt file2.txt 2>&1 > kekka.txt
標準出力のみ、kekka.txtに出力。

ls -l file1.txt file2.txt 2>&1 2> kekka.txt
標準エラーのみ、kekka.txtに出力。


ls -l file1.txt file2.txt 2>&1 >&kekka.txt
標準出力と標準エラーを、kekka.txtファイルに出力。
何故なのでしょうか。

ls -l file1.txt file2.txt 1>&2 2>&kekkat.xt
sh kekka.txt: ambiguous redirect
何故なのでしょうか。

No. 4268 # とおりすがり 2005/09/03 (土) 16:49:30
便利なページありがとうございます。

http://x68000.q-e-d.net/~68user/net/http-auth-2.html

> 「A1のMD5値 + nonce値 + ":" + nc値 + ":" cnonce値 + ":" + qop値 + A2のMD5値」の MD5 値
ですが、
正しくは、
「A1のMD5値 + ":" + nonce値 + ":" + nc値 + ":" cnonce値 + ":" + qop値 + ":" + A2のMD5値」の MD5 値
だと思います。

No. 4269 # 68user 2005/09/03 (土) 17:47:56
>>4267 つよし
とりあえずこれを読んでください。
    http://X68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8

以下、手元に bash しかないため、sh では試していません。
間違いがあれば補足願います>Solaris な方

> ls -l file1.txt file2.txt 2>&1 >&kekka.txt
> 標準出力と標準エラーを、kekka.txtファイルに出力。
> 何故なのでしょうか。
そもそもこれは冗長です。
    >&kekka.txt
だけで標準出力と標準エラー出力が kekka.txt にリダイレクトされます。
sh において (csh も同じですが)、
    >&ファイル名
は、標準出力と標準エラー出力をまとめてファイルにリダイレクトするもの
だからです。

> ls -l file1.txt file2.txt 1>&2 2>&kekkat.xt
> sh kekka.txt: ambiguous redirect
> 何故なのでしょうか。
ファイルへのリダイレクトは「>&」ではなく「>」を使うべきだからです。

sh のリダイレクトには以下の 2パターンがあると考えるとよいでしょう。
    1. >ファイル名
    2. [数字]>&[数字]

さらにタイプ量を減らすため、
    3. >&ファイル名 (>ファイル名 2>&1 と同じ)
という syntax sugar があります。よって、

    [数字]>&ファイル名

はおかしいです。とはいえ 1>&ファイル名 は通ってしまいますが。

>>4268 とおりすがり
> 正しくは、
> 「A1のMD5値 + ":" + nonce値 + ":" + nc値 + ":" cnonce値 + ":" + qop値 + ":" + A2のMD5値」の MD5 値
ごもっともであります。遅くとも明日までには修正します。

No. 4270 # 68user 2005/09/04 (日) 06:36:46
>>4268 とおりすがり
修正いたしました。ご指摘ありがとうございました。

http://X68000.q-e-d.net/~68user/net/http-auth-2.html
http://X68000.q-e-d.net/~68user/cgi-bin/cvsweb.cgi/public_html/net/org/http-auth-2.html

No. 4271 # つよし 2005/09/04 (日) 11:09:38
>>4267 つよし

>りあえずこれを読んでください。
>http://X68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8
参考になります。
特に「2>&1」の説明については、「2 の出力先を 1 にマージする」で覚えと説明している
本もありました。

>&kekka.txt
については、冗長なんですね。
本来なら、エラーになるはずなの実際には動いているので、おかしいとは
思っていました。
使わない方がよさそうですね。

No. 4272 # 68user 2005/09/04 (日) 13:14:05
>>4271 つよし
> 本来なら、エラーになるはずなの実際には動いているので
冗長ですが、エラーではありません。
      2>&1 >&kekka.txt

      2>&1 >kekka.txt 2>&1
と同じですが、ひとつのディスクリプタについての複製を複数回行っても
別にエラーにはなりません。

この例では最初の 2>&1 で 2 の出力先が stdout になりますが、後の
2>&1 で 2 の出力先が kekka.txt になり、意味がないだけです。

No. 4274 # つよし 2005/09/05 (月) 21:33:59
>>4272 68user

解説、アドバイスありがとうございます。

No. 4275 # ひで 2005/09/06 (火) 12:43:52
初めて質問させて頂きます。
Solaris9のサーバからmailxコマンド(sendmailを設定済み)を使用してメールサーバ経由で
クライアントにE-MAILを送信しようとしています。

問題が一つありまして、クライアントのOUTLOOKで見たとき件名が文字化け
してしまいます。

色々調べたところ、sendmailでは文字化けしてしまうのはどうしようもないと
聞きました。

Solaris9でメールを送信できるソフトウェアで件名が文字化けしないようなもの
を知っていたら教えて頂けませんか?
(メールサーバ側クライアントのメールの設定は変更できません)

No. 4276 # 68user 2005/09/06 (火) 23:21:58
>>4275 ひで
普通はプログラム側で MIME エンコードして、sendmail に渡します。
試していませんが、mailx に渡しても多分うまくいくでしょう。

詳しくは
    http://X68000.q-e-d.net/~68user/webcgi/mail-1.html
    http://X68000.q-e-d.net/~68user/webcgi/mail-2.html
を読んでください。

No. 4277 # ろく [E-mail] 2005/09/08 (木) 11:08:08
UNIX 上のPDFファイルをftp転送してPC上で読み込みたいのですが、
転送後にファイルが壊れているとのことで読み込めません。
何かいい方法はありますでしょうか

No. 4278 # zsh 2005/09/08 (木) 13:04:24
>>4277 ろく
バイナリモードで転送してますか?

No. 4279 # ひで 2005/09/08 (木) 17:47:12
>>4276 # 68user

回答有難うございます。
試してみます。

No. 4280 # くま 2005/09/09 (金) 01:17:16
Solaris8i、shシェルで以下のような処理をしようとしています。
番号が同じもの同士の値を足し算してその和を求めています。

ファイルフォーマット
番号,値
001,10
001,20
001,30
002,5
003,15
003,20
004,100

結果
001,60
002,5
003,35
004,100

としたいのですが、どうすればよいですか。

No. 4281 # zsh 2005/09/09 (金) 13:45:10
>>4280 くま
Solarisi・・・って部分は置いといて。

shというかnawkですが、以下のようにやればできます。
(awkでは動きません。)
------------------------
$ nawk -F, '
        /^[0-9]+,[0-9]+$/ {
                var[$1] = $2;
        } END {
                for (i=0; i<=999; ++i) {
                        j = sprintf("%03d",i);
                        if (j in var) print j "," var[j];
                }
        }' data.txt
------------------------

No. 4282 # zsh 2005/09/09 (金) 17:58:45
>>4281 zsh
>Solarisi・・・って部分は置いといて。
間違えた・・・Solaris8iだ・・・

No. 4283 # nagadomi [E-mail] 2005/09/09 (金) 22:41:30
はじめまして。ネットワークプログラミングのページを参考にさせてもらっています。
で、以下の部分、
>>DNS クライアントを作ってみよう (3)
>リソースデータは「&Sorry, no version string is available」と表示されるが、
>dig や nslookup は「Sorry, no version string is available」となります (& がない)。
>先頭の & を削るような規則があるようだが、それが何なのかはわからなかった。

これ、'&'=38で、リソースのlengthみたいです。
きちんとした資料では、まだ見つけられていないのですが、
djbdnsのソースコード(dns_txt.c)上では、ドメイン名と同じように、
[length][data][length][data]と見ているようです。
リソースをいくつかのブロック(例えばライン毎など)に分けているのかなーと。

んん。標準な資料を探し中です。

No. 4284 # nagadomi [E-mail] 2005/09/09 (金) 22:44:42
>>4280 くま
Solaris8iは手元にないので試していないですが、shで。

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

# デリミタを[,]に
IFS=,

# キーのリスト
list=""

# 計算
while read key value; do
                eval "if test -z \$array$key;then array$key=0; fi"
                eval \array$key=`eval "expr \\$array\$key + \$value"`
                list=$list,$key
done < data.txt

# 重複したキーを削除する
clone=`echo "$list" | sed 's/^,//'`
for key in $clone; do
                list=`echo "$list" | sed "s/$key//g" | sed 's/,[,]*/,/g'`
                list=$list,$key
done

# 表示
list=`echo "$list" | sed 's/^,//'`
list=`echo "$list" | sed 's/,$//'`

for key in $list; do
                echo -n $key,
                eval echo \$array$key
done
---------------------------
$ sh test.sh
001,60
002,5
003,35
004,100
---------------------------

効率悪そうだ..。

No. 4285 # シャチ 2005/09/10 (土) 10:00:34
>>4280 くま
以下ので出来ると思います。

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

nawk -F"," '
        BEGIN {
        }
function syukei() {
        total=0+0;
        no=$1;

        while (NF>0) {
                if (no == $1) {
                        total = total + $2;
                } else {
                        printf("%03d:%d\n",no,total);
                        no=$1;
                        total=$2;
                }
                getline;
        }
        printf("%03d:%d\n",no,total);
}
{
        if (NF == 0) next ;
        syukei() ;
}' file.txt

exit 0

No. 4286 # nagadomi 2005/09/10 (土) 22:58:12
続々と投稿されているので投稿してみます。

>>4280 くま
awkなら、
$ nawk -F, '{v[$1]+=$2;}END{for(k in v) print k","v[k]}' data.txt | sort
とできると思います。
/+ data.txt -> データファイル +/

No. 4287 # シャチ 2005/09/11 (日) 15:03:55
>>4286 nagadomi

nagadomiさんのコード凄いですね。
1行で実現してしまうなんて。
自分も、1行で実現できないかと試みてはみたのですが、良い案が浮かび
ませんでした。

向学として教えていただきたいのですですが、
番号の比較、判断していませんが、何故、上手く出来ているのですか。

>'{v[$1]+=$2;}END{for(k in v) print k","v[k]}'
宜しくお願いします。

No. 4288 # zsh 2005/09/11 (日) 20:20:12
>>4286 nagadomi
うわー、awkってforでその表記できるんだっけー。
すっかり忘れてました。
最近awk触っていなかったとは言え、恥ずかしい・・・

>>4287 シャチ
>for(k in v)
は、配列vの値を一つ一つ変数kに代入してループするという意味です。

No. 4289 # zsh 2005/09/11 (日) 23:44:55
>>4288 zsh
×配列vの値を一つ一つ変数kに代入してループする
○配列vの添字を一つ一つ変数kに代入してループする

No. 4290 # nagadomi 2005/09/12 (月) 03:38:59
>>4287 シャチ
zshのおっしゃるとおりです。
Perlでいうforeach的な使い方です。

>>4288 zsh
awkは、1年ほど前に1日(プログラム一個..)使ったことがあるだけだったので、
実はリファレンスをちょっと見ました。
そこでforeachあるじゃんと..。知らない分、確認するのでうまくいった感じですかね..。

zshさんのコードは、ソートを考えて、あのような書き方をしているのかと思っていました。
私は普段、こういうのにはPerlを使っています。

No. 4291 # シャチ 2005/09/12 (月) 11:55:17
>>4288 zsh

番号の比較、判断していませんが、前後が同じかどうかの判断は
どこでしているのですか。
>{v[$1]+=$2;}
で判断しているのですか。
お願いします。

>>4290 nagadomi
Perlを使うのが便利なのですか。
Perlは、人が作ったのをメンテナンスするため1日調べたのみです。

No. 4292 # シャチ 2005/09/12 (月) 13:52:41
>>4288 zsh

配列vの添え字が、番号なんですね。
だから、番号の配列要素に割り当てられた値が使用できるから
番号の比較、チェックが不要なんですね。

添え字には、数値しか使用できなと思っていました。
文字列も使えるんですね。

No. 4293 # 68user 2005/09/13 (火) 00:28:29
>>4283 nagadomi
なるほど、length ですか。RFC をあさってみましたが、まだ見つけられません。
発見したらぜひ教えてください。

関係あるかな? と思いつつ、まだちゃんと読んでいない資料:
    http://www.cs.utah.edu/~danderse/adns/arch.html
    http://www.zeroconf.org/Rendezvous/txtrecords.html

No. 4294 # hagu 2005/09/16 (金) 02:32:13
Solaris8で、Bシェル(sh)で以下のことを行いたいのですが、
良い方法を教えてください。

2つのファイルの中身を比較し、その結果を表示したいのです。
--- file1.txt -----
hanako.sato
jiro.yamamoto
taro.yamada
taro-1.yamada
tsuyoshi.saito


--- file1.txt -----
jiro.yamamoto
taro-1.yamada
taro-2.yamada
gou.yamashita

結果
file1 Only, hanako.sato
match,jiro.yamamoto
file1 Only,taro.yamada
match,taro-1.yamada
file1 Only,tsuyoshi.saito
file2 Only,taro-2.yamada
file2 Only,gou.yamashita
と出力したいのです。

お願いします。

No. 4295 # 68user 2005/09/16 (金) 03:18:00
>>4294 hagu
案1. file1.txt を while で 1行ずつ読み込み、読み込んだ行が
          file2.txt に含まれるかを grep で調べる。
案2. file1.txt と file2.txt をそれぞれ sort し、diff をとって、
          行頭が < か、> かを調べる。重複する行は…どうしましょうねぇ。
案3. perl でハッシュに突っ込む。3行くらいで書けそうな気がします。

No. 4296 # hagu 2005/09/16 (金) 08:40:58
>> 4295

perl使用したことありません。
書くとしたらどうなりますか。

案1ですと、file1.txtで調べたあと、file2.txtのみで存在する物も調べるので
同様の処理が必要になります。重複する行が2回でることになります。

No. 4297 # 68user 2005/09/16 (金) 10:06:43
>>4296 hagu
Perl クックブック VOLUME 1 のレシピ 4.8・4.9 あたりを立ち読みして、
なんとかなりそうなら手を出してみるとよいでしょう。

> 重複する行が2回でることになります。
file2.txt を while で 1行ずつ読み込み、読み込んだ行が file1.txt に
含まれていれば何も表示しない、でいいのでは。

> 案2. file1.txt と file2.txt をそれぞれ sort し、diff をとって、
> 行頭が < か、> かを調べる。重複する行は…どうしましょうねぇ。
GNU diff があるなら (unified diff を出力できる diff があるなら)、
    % diff -u -U 10000 file1.txt file2.txt
として (10000 はファイルの行数を超える数)、
    ・行頭が - なら file1.txt のみ
    ・行頭が + なら file2.txt のみ
    ・行頭がスペースなら重複行
ですかね。

No. 4298 # シャチ 2005/09/17 (土) 11:00:02
>>4294 hagu

1.file1.txtとfile2.txtを辞書順にソートする。
2.diffコマンドで、file1.txtとfile2.txtの差異を表示する。
diffコマンドの出力結果の見方は、ご存じですよね。
">"は、右側に指定したファイル内に差異があることを示す。
"<"は、左側に指定たファイルにある差異があることを示す。

3.grepとかcutを使用して見やすいように編集。
4.file1.txtかfile2.txtをキーにして、grepで存在する文字列だけを抽出。

で、出来ると思います。

No. 4299 # has 2005/09/20 (火) 23:20:36
>>4294 hagu
動作未確認ですが、こういうのはダメですかね。

sort file1 | uniq > file1-2
sort file2 | uniq > file2-2
comm -23 file1-2 file2-2 | sed 's/^/file1 Only,/'
comm -13 file1-2 file2-2 | sed 's/^/file2 Only,/'
comm -12 file1-2 file2-2 | sed 's/^/common,/'

順序よく並んでしまいますが。

No. 4300 # hagu 2005/09/21 (水) 23:45:22
>> 4299
ありがとうございます。
確認してみます。

No. 4301 # hagu 2005/09/22 (木) 09:55:59
>>4299 has

ありがとうございます。
期待していた結果が得られました。

commというコマンドがあるのですね。
知りませんでした。
勉強になりました。

No. 4302 # tana 2005/10/01 (土) 17:56:09
突然すみません。私は、いま卒業研究で動画像を処理しようとしてるものです。bmpファイルからppmやpgmへの一括変換はできたのですが、それらが生(raw)なので、つまりP6なので処理に困ってます。P3にしたいのですが大量のPPM、PGMをまとめてASCIIに変換することは可能でしょうか?よろしければ教えていただけると助かります。

No. 4303 # 68user 2005/10/01 (土) 19:00:45
>>4302 tana
試してませんが、ppmtogif して giftoppm で戻すとか。

No. 4304 # tana 2005/10/01 (土) 22:40:59
giftoppmって一度に多数のファイルを変換できますか?

No. 4305 # 68user 2005/10/02 (日) 15:35:18
>>4304 tana
知りませんが、もしできないとしても
      for i in *.ppm; do ppmtogif < $i | giftoppm > out/$i; done
とか、
      ls *.gif | sed 's/\(.*\)/ppmtogif < \1 | gitoppm > out\/\1/' | sh
とか。

拡張子は適当に変更するということで。

No. 4306 # 68user 2005/10/02 (日) 15:37:52
blog なるものを始めてみました。
    http://68user.blog27.fc2.com/

入力が非常に面倒なのですが (HTML 手打ちと変わらない)、世の人たちは
使いこなしているんですかねぇ…。

No. 4307 # へにか [URL] 2005/10/03 (月) 06:52:49
日記を書く習慣の無い僕にとっては、blogを使う利点が未だに理解できないです。
もし、68userさんの視点でその利点を見出せたら、是非とも教えていただきたく、
宜しくお願いいたします。

追伸
FreeBSDでの活動は、今でもされているのですか?

No. 4308 # 68user 2005/10/03 (月) 15:43:22
>>4307 へにか
技術的なことは、最終的に web にまとめたいと思っています。しかしそれを
行うにはある程度の時間と労力がかかります。よって、とりあえず殴り書きを
するネタ帳として blog を活用できないかと考えました。

また、
    http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?log=4061
    http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?log=3774
のような、ひとつのコンテンツとしてまとめづらいメモを書く場所として
適切ではないだろうか、と思っています。

それと、コメントやトラックバックという仕組みがあるため、web よりは
フィードバックが得られるのではないかと。


しかし、perl+DBI のネタを書いてみてわかったのですが、わたしは完璧主義者
なので、結局はエディタで下書き・推敲しないと気がすまないようです。あまり
blog 向きではないのかもしれません。

あとこれは愚痴ですが、入力が非常に面倒です。まず、WRAP="OFF" 属性が付いて
いない TEXTAREA 要素の相手をすることが苦痛です。

また、ソースを張る際に <PRE>〜</PRE> で囲んでみましたが、行間に変な間が
空いてしまい、結局スペースを &nbsp; に置換して張っていたりします。
「blog は更新が簡単」と世の人は言いますが、fc2 に限れば嘘です。

> FreeBSDでの活動は、今でもされているのですか?
最近はしていませんが、するべき立場にあります。すべてはモチベーションの
問題です。

No. 4309 # へにか [URL] 2005/10/03 (月) 18:58:36
>>4308 68user
なるほど。コメントがつけられる掲示板のような使い方+トラックバックですね。
コメント:誰でも簡単に書きやすい。
トラックバック:細かい指摘事項が伝わりやすい。
ってところでしょうか。仕組みとしては、やりたいことに一番近そうに見えますが、
>「blog は更新が簡単」と世の人は言いますが、fc2 に限れば嘘です。
恐らく、今流行っているタイプのblogの使用目的に合致していない、と思います。
・・・と言いつつ、実はblogを理解して無いので、間違った事を言っているかもしれませんが。

>すべてはモチベーションの問題です
それはいえるかもしれませんね。元同僚は、とある部分のソースを書くという
立場にいるそうですが、結構(手続きが?)大変だ、といってましたし。
自分の時間がとれて、収入に余裕があって、FreeBSDに絶対に貢献したいという
意思が無ければ、なかなか腰が上がらないのだと、勝手ながら推測しております。

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

No. 4310 # UNIX初心者 2005/10/06 (木) 00:40:29
突然ですみません、UNIX初心者です。
UNIXにて以下の様な事がしたいのですが、よい方法があれば教えて下さい。
随時追加されるあるファイル(aaa.txt)の内容を行単位ででCプログラムで読込みたい。
条件)
1.aaa.txtは行単位に随時追加される。
2.Cプログラムに渡すのはある文字が含まれる行のみ。

以下の様なことを試したのですが、うまくいきませんでした。
tail -f aaa.txt | grep ABC | Cプログラム
※Cプログラムは今の所、標準入力(gets)から読み込むだけのプログラムです。

No. 4311 # 68user 2005/10/06 (木) 00:57:33
>>4309 へにか
> なるほど。コメントがつけられる掲示板のような使い方+トラックバックですね。
そうですね。ただ、コメントやトラックバックより、思いついたことを
すぐに書くための場所、という方がわたしにとっては重要かなと思っています。

> 恐らく、今流行っているタイプのblogの使用目的に合致していない、と思います。
いや、ただインタフェースがイマイチなだけだと思います。空白を &nbsp; に
変換してくれればそれで解決する話ですから。

>>4310 UNIX初心者
こちらを。
http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?log=2800

No. 4312 # UNIX初心者 2005/10/06 (木) 23:11:25
>tail -f log | perl -ne '$|=1;print if m/foo/' >> log2
で試してみたのですが、perlがインストールされていない為、エラーとなってしまいました。
今回は急ぐので、プログラムで対応してしまいました。
また、利用させて下さい、ありがとうございました。

No. 4313 # 68user 2005/10/07 (金) 02:17:15
>>4312 UNIX初心者
解決したとのことなので返信不要ですが、perl がないなら
    % tail -f aaa.txt | awk '/ABC/{print;system("")}' | Cプログラム
ですかね。FreeBSD 5.2.1-RELEASE ではうまくいきました。

No. 4314 # hagu 2005/10/15 (土) 19:06:52
Solaris8のBシェルで、CSV形式のデータのソートを行っています。
数字順にソートしたいのですが、ソート対象の列が半角英数のため
数字順になりません。うまい方法はないでしょうか。
英字が先頭にある場合は、英字を取り除いて数字順にしたいのです。
うまい方法はないでしょうか。

sortコマンドだけでは、だめでした。

--データ
山本 こうたろう,企画,100
山下 大介,企画,A101
山田 太郎,営業,80
山田 花子,営業,A92
山田 一郎,営業,A82
鈴木 一郎,販売,85
鈴木 一郎,海外,1001
松井 英樹,海外,2001
斉藤 次郎,製造,125
佐藤 三郎,組立,A124
武藤 五郎,検査,130

--結果
山田 太郎,営業,80
山田 一郎,営業,A82
鈴木 一郎,販売,85
山田 花子,営業,A92
山本 こうたろう,企画,100
山下 大介,企画,A101
佐藤 三郎,組立,A124
斉藤 次郎,製造,125
武藤 五郎,検査,130
鈴木 一郎,海外,1001
松井 英樹,海外,2001




sortコマンドの「-n」を付けてやってみたのですが、数値として判断するため
上手くできません。
また、付けないと、数値順に並んでくれません。

No. 4315 # hagu 2005/10/15 (土) 19:19:00
>>4314 hagu
訂正です。
名前の前に社員IDがあり、
半角英数字でソートし、社員IDでソートとなります。
データは、「社員ID、名前、仕事、コード」
コードの半角英数字で数字順に並び替えで、
コードが同じな場合は、社員IDで並び替えです。
英字が先頭にある場合は、英字を取り除いて数字順にしたいのです。
No.4314の結果にしたいのです。

No. 4316 # 68user 2005/10/15 (土) 19:51:38
>>4314 hagu
101 と A101 という社員 ID が存在する可能性があるか、存在するならソート順は
どうするかという仕様が不明確ですが、それは置いておくとして。

> 山本 こうたろう,企画,100
> 山下 大介,企画,A101
> 山田 太郎,営業,80
> 山田 花子,営業,A92
わたしなら一度 sed などで
    山本 こうたろう,企画,,100
    山下 大介,企画,A,101
    山田 太郎,営業,,80
    山田 花子,営業,A,92
と別項目にし、sort して、再度 sed で元に戻します。

No. 4317 # hagu 2005/10/15 (土) 23:47:12
>>4316 68user

ありがとうございます。
一度、コードの値を分解しには、気がつきませんでした。
いいかも知れません。

>101 と A101 という社員 ID が存在する可能性があるか、存在するならソート順は
>どうするかという仕様が不明確ですが、それは置いておくとして。
コードでソートした後、同じコードないで、社員IDをソートします。
ただし、数字のコードは、数字のコード内で、
英字付きのコードは、英字付きコード内で、
社員IDを並びかえます。

No. 4318 # 匿名希望 2005/10/18 (火) 19:47:44
お世話になります。
C言語でHTTPクライアントを作成しています。ここのサイトもありますが、自作で行いました。
AのHPを取得してうまく表示されますが、BのHPを取得すると、表示されません。
取得したページのヘッダ情報はどっちも異常はありませんでした。
デバックではどっちでも表示されます。でも、BのHPが取得しても表示されません。
何か助言をして頂けたら幸いです。よろしくお願い致します。

No. 4319 # 68user 2005/10/18 (火) 23:11:48
>>4318 匿名希望
- 現象が再現する最小限まで削ったソースを提示してください。
- A と B の URL を提示してください。
- そちらで実行した結果を提示してください (ヘッダ情報とかデバッグを含む全部)
- OS・コンパイラなどの情報を提示してください。

なお、UNIX 以外であれば、わたしはコンパイル環境がないのでわかりません。

No. 4320 # SSL初心者 2005/10/19 (水) 16:09:35
初めて投稿します。
自分はSSLを組み込もうとしていろいろ調べているんですが、
調べていると、WindowsでのSSLの設置方法がかかれてないんです。
やっっぱりリナックスで設置したほうがいいのでしょうか?

No. 4321 # 68user 2005/10/20 (木) 01:13:13
>>4320 SSL初心者
まずは検索を。
http://www.google.co.jp/search?q=windows+apache2+ssl&hl=ja&lr=lang_ja&ie=utf-8&oe=utf-8

No. 4322 # マッケーブ 2005/10/20 (木) 15:39:43
お世話になります。
「マッケーブの循環的複雑度」を出力するツールを探しており、
当ホームページから コマンドcccc(C言語・C++・Java のソース
コードのステップ数を調べるツール。)を探し当てました。
ところが、身近にあるサーバで試してみると、
$ cccc hoge.java
-bash: cccc: command not found
と出力されます。

コマンドccccを実行するための条件等、ありますでしょうか。
ご教示、よろしくお願いします。

No. 4323 # ミケフォ [E-mail] 2005/10/20 (木) 18:12:00
初めまして。
『UNIXの部屋』の localtime(3) のサンプルコードにある
tm_timeの一連の変数参照が間違っています。

No. 4324 # hoge 2005/10/20 (木) 22:15:02
>> 4322
http://x68000.q-e-d.net/~68user/unix/pickup?Command+not+found

2 又は 6 では無かろうか.

No. 4325 # Netboy 2005/10/22 (土) 14:28:50
サーバーの件でメールをお送りしました

No. 4326 # SSL初心者 2005/10/26 (水) 12:59:02
すみません。SSLをWindowsで設定しているんですが、
Apacheのインストールで下記のエラーが出ます。

(OS 10048)通常、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、
たはポートのどれか 1 つ のみを使用できます。 : make_sock: could not bind to
dress 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs

これは、どういった意味のエラーなのかさっぱりわかりません。
自分で調べてもどの方面から調べるのかわからずじまいで投稿しました。
環境は以下のとうりです。

OS - Windows98
Apache - Apache_2.0.55-Openssl_0.9.8a-Win32をダウンロード
OpenSSL - Win32OpenSSL-v0.9.8を使用

参考HP - www.rinzo2.jp/~rinzo/apache_ssl/apache_and_ssl_00.htm

ご意見お待ちしております

No. 4327 # awk初体験。 2005/10/26 (水) 14:54:35
シェル内にて以下の記述を入れるとエラーが発生します。

■エラー発生箇所
cat ./temp.txt | awk 'BEGIN{FS=","}{if(match($1,"^${_XXX_}")!=0){print $0}}' > ./test.csv

■出力エラー
awk: There is a regular expression error.
                ?, *, or + not preceded by valid regular expression
  The source line number is 1.
  The error context is
                                  >>> BEGIN{FS=","}{if(match($1,"^${_XXX_}") <<<

"^${_XXX_}"の部分がエラーとなっているようですがここでは変数は使用できないのでしょうか?

No. 4328 # 68user 2005/10/27 (木) 11:45:32
>>4326 SSL初心者
「OS 10048」で検索した結果の 1番目に出てくるのがおそらく答えです。
    http://www.google.co.jp/search?q=OS+10048&start=0&start=0&hl=ja&lr=lang_ja

>>4327 awk初体験。
ウチの環境ではエラーにならないのでよくわかりませんが、
    ${_XXX_}
って変数のつもりで書いてるんですよね? どこで ${_XXX_} に値をセット
しているのですか?

もしシェルスクリプトでシェル変数や環境変数にセットしているのなら、
引数全体を '' で囲んでいるので置換されません。というわけで

    cat ./temp.txt | awk 'BEGIN{FS=","}{if(match($1,"^'${_XXX_}'")!=0){print $0}}' > ./test.csv

などと ${_XXX_} を外に出します。

No. 4329 # 68user 2005/10/27 (木) 11:58:11
>>4323 ミケフォ
> 『UNIXの部屋』の localtime(3) のサンプルコードにある
> tm_timeの一連の変数参照が間違っています。
ありがとうございます。bugid 18 として登録しました。
    http://x68000.q-e-d.net/~68user/bugnote/viewbug.php?projectid=1&bugid=18

# 登録する暇があるなら、さっさと直せと。

No. 4330 # Netboy 2005/10/27 (木) 12:02:11
すみません,昨日18時頃から本日11時まで
サーバーの通信が切れていました.

昨日13時頃に回線工事があって無事完了したのですが,
終端装置の接続が雑だったらしく,17時頃に突然接続が落ちました.

すぐ業者に連絡したのですが既に営業時間外で,
朝まで修理を呼べませんでした.
本日11時に業者が来て直りました.

ご報告まで.

No. 4331 # キック 2005/10/27 (木) 16:56:13
お世話になります。

C言語でHTTPクライアントを作成してますが、HTTPSの場合のポート番号が
サイトを探しても見つからないですが、ご存知でしょうか?
よろしくお願い致します。

No. 4332 # 68user 2005/10/27 (木) 17:12:26
>>4330 Netboy
対処いただきありがとうございます。IP アドレスの件はもう少々お待ちください。

>>4331 キック
「https ポート番号」で検索したら一番最初に出てきます。
    http://www.google.co.jp/search?q=https+%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7&hl=ja&lr=lang_ja

No. 4333 # キック 2005/10/27 (木) 17:19:59
>>4332 68user

ありがとうございます。
初歩的ですみません(^ ^;)>

No. 4334 # hagu 2005/10/28 (金) 10:37:09
シェルで、ftpを自動で実行しています。
ftpの接続、ログインの判定や、ファイルのput/getの判定
ができたか判断したいのですが、できるのでしょうか。
エラーが発生したら、「exit 1;」などで終了させて、その
ステータスを判断するといったことはできないのでしょうか。

-----------------
ftp -v -n ${SERVER} <<END >/dev/null
user ${FTP_USER_ID} ${FTP_PASSWORD}
cd ${FTP_DIRECTORY}
lcd ${LOCAL_DIRECTORY}
get ${GET_FILE}
bye
END

環境:
    Solaris8i
    Bシェル

No. 4335 # awk初体験。 2005/10/28 (金) 17:15:32
No. 4327 で質問させていただきました。
変数はシェル内で実行していました。
そのため""で括った所上手くいきました。
ご回答ありがとうございます。

さらに別の質問させてください。
カンマ及びスラッシュを区切り文字としたいのですが…
-FオプションやFS=の指定で複数の区切り文字を指定することはできるのでしょうか?

No. 4336 # zsh 2005/10/30 (日) 11:51:51
>>4335 awk初体験。
区切り文字に正規表現を使用できるawkであれば可能です。
(gawkやnawkなら使用可能ですが、Solaris標準のawk等では使用できません。)

$ nawk -F"[,/]" '{ .... }' file
$ nawk 'BEGIN{ FS="[,/]" } { .... }' file

No. 4337 # 68user 2005/10/30 (日) 15:35:42
2005/10/29(金) 00:00:00 ごろから IP アドレスの変更・それに伴う DNS 設定変更を
行いました。Refresh とか Retry とか Expire などを理解していないので、何も対策
せずいきなり切り替えました。そのせいで つながらなかった人もいると思いますが、
ご迷惑をおかけしました (わたしも数時間つながらなかった)。

ご協力ありがとうございました>Netboy さん

>>4323 ミケフォ
遅くなりましたが、修正しました。
ご指摘ありがとうございました。

# http://x68000.q-e-d.net/~68user/bugnote/viewbug.php?projectid=1&bugid=18

>>4334 hagu
わたしなら Perl の Net::FTP モジュールなどできっちりエラーチェックしますが、
どうしても ftp コマンドを使わざるをえないなら、
    - ftp コマンドに -d オプションなどをつけて実行結果のログをとる。最後に
        ログを解析してステータスコードに 4xx 系・5xx 系 がないことをチェックする。
    - 接続した時点でリモートに同名のファイル名がないならば、get/put を行って、
        最後に ls して、結果をログに保存する。ls の結果を解析し、ファイル一覧・
        ファイルサイズ・ファイル個数などのチェックを行う。
くらいしかないような気がします。

No. 4338 # 68user 2005/10/30 (日) 15:41:23
>>4337 68user
> 2005/10/29(金) 00:00:00 ごろから
2005/10/29(土) 00:00:00 の誤りでした。

No. 4339 # TKG 2005/10/31 (月) 21:57:21
A君とB君(ユーザーIDはそれぞれAとB)は同じグループG(グループIDはG)に属しているとします。
A君は、自分のホームディレクトリ(~A)にあるディレクトリDの中の全てのファイルを、B君など同じ
グループに属する人にだけ閲覧可能にしたいと考えました。ただし、A君はディレクトリD以外の
ファイル・ディレクトリは(それらのリストを取る(lsコマンド)ことも許可したくありません。
A君はどのようなパーミッションを設定すればよいでしょうか?

No. 4340 # 68user 2005/11/01 (火) 01:23:05
>>4339 TKG
    ~A/ 710
    ~A/D/ 750
    ~A/X/ (D 以外) 700
でしょうか。

No. 4341 # 2005/11/02 (水) 11:36:55
Solarisでシェルスクリプトを起動する場合。
$ csh script.cshと入力しなければなりませんが、
最初のcsh を省略して$ script.cshで起動する方法を教えて下さい。
宜しくお願いします。

No. 4342 # zsh 2005/11/02 (水) 17:49:42
> 68user様
http://x68000.q-e-d.net/~68user/unix/genre.html#genre22
にheadが二つ表示されています。

>>4341
UNIXの部屋を読めば判ると思いますが・・・
  1.スクリプトの一行目にシェルのパスを指定する。
  2.環境変数PATHを設定する。
  3.スクリプトに実行権をつける。
といったところでしょうか。
http://x68000.q-e-d.net/~68user/unix/pickup?Command+not+found

No. 4343 # hoge 2005/11/02 (水) 18:54:10
>> 誠さん

4342 で言われている PATH の設定は csh が置かれている場所にパスを通すって
意味であって、PATH に "."(カレントディレクトリ) を加えるって話では無い筈です。
従って、 単に script.csh ではなく ./script.csh って起動方法になると思います。

PATH に "." を加える事の問題とか、csh スクリプトを覚えるよりも sh 系の
スクリプトを覚えた方が良いって話は検索すれば出てきますので読んでみましょう。

No. 4344 # zsh 2005/11/03 (木) 13:34:58
>>4343 hoge
スクリプト専用のの格納ディレクトリがあるのかと思い
PATHの設定が必要と書きました。
・・・・ちょっと意地悪したくなったのも事実ですが。

No. 4345 # hagu 2005/11/04 (金) 17:19:50
>>4337 68user
返事が遅くなって申し訳ありません。
アドバイスありがとうございます。
ログに出力し、ログをチェックする方法でやってみます。

No. 4346 # hagu 2005/11/04 (金) 17:23:52
sedを使用して大文字から小文字に変換したいのですが、
なかなか上手くいきません。
例えば、「YAMADA」を「Yamada」と先頭の1文字目は大文字で、
2文字目以降を小文字に変換したいのですが、以下の様にsed
を使ってやったのですが上手く行きません。
sedでは、無理なのでしょうか。
環境は、Solaris8、Bシェルです。

----------------------
NM=Ya1AMADA
echo $NM | sed 's/[A-Z].*/[a-z]/g'

NM=YAMADA
echo $NM | sed 's/\(.\)[A-Z]*/\1/g'

No. 4347 # 2005/11/04 (金) 18:25:03
>>4346 hagu
多分、sedだけでは無理だと思います。

sedを使わなくても、awkだけでも可能です。

echo $NM | nawk '{for(j=i=1;i<=length($0); i++) if(i==1) {NM[i]=substr($0,i,1)} else {NM[i]=tolower(substr($0,i,1))}} END{for(count in NM) printf("%c",NM[count]); printf("\n")}'

No. 4348 # hagu 2005/11/04 (金) 21:58:31
>>4347

試してみましたが、出方が変です。
amadaY となります。

No. 4349 # マーブル 2005/11/05 (土) 08:16:10
始めまして、ネットワークプログラミング周辺読ませて頂きました。
簡潔なソースで読みやすかったです。
お礼に掲示板カキコ、それにしてもみなさん勉強熱心ですね(笑

----------------------------------------
echo $NM | \
sed -e h -e 's/^\(.\)\(.*\)/\1/g' \
-e 'y/[abcdefghijklmnopqrstuvwxyz]/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]/' \
-e x \
-e 's/^.\(.\)/\1/g' \
-e 'y/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]/[abcdefghijklmnopqrstuvwxyz]/' \
-e H \
-e g \
-e 's/\n//'
----------------------------------------

なんとなしsedの勉強してしまった、本買う気にはならないけどね。
http://web.archive.org/web/19961202111128/http://yase.yajima.kuis.kyoto-u.ac.jp/staffs/sengoku/sedlec/

No. 4350 # has 2005/11/05 (土) 11:03:28
>>4346 hagu
もしperlならこんな感じなんでしょうか?
echo $NM | perl -ple 'y/A-Z/a-z/;substr($_,0,1)=~y/a-z/A-Z/;'

No. 4351 # 2005/11/05 (土) 13:43:04
>>4347
>>4348 hagu

連想配列の場合、表示の順序は、ハッシュ法に従うのでランダムとなります。
すみません。

echo $NM | nawk '{for(i=1;i<=length($0); i++) if(i==1) {NM[i]=substr($0,i,1)} else {NM[i]=tolower(substr($0,i,1))}} END{for(j=1; j<i; j++) printf("%c",NM[j]); printf("\n")}'

No. 4352 # hagu 2005/11/05 (土) 13:58:38
>>4349 マーブル
凄い。
sedだけでですね。
でも、凄く、複雑すぎます。

>>4351
今度は、期待したいた結果が得られました。
awkを使っているのも複雑ですね。

No. 4353 # zsh 2005/11/05 (土) 14:28:08
>>4352 hagu
これじゃだめ?

$ echo $NM | nawk '{ a=toupper(substr($0,1,1)); b=tolower(substr($0,2)); printf "%s%s\n",a,b; }'

No. 4354 # 2005/11/05 (土) 23:53:05
>>4353 zsh

そうですよね。
substr()で2文字目以降すべてを変換してしまえばいんですよね。
何、ループで1文字ずつ変換し、表示しているんだろう。

No. 4355 # マーブル 2005/11/06 (日) 02:06:34
あまり知られていないscanfの用法。
既出でしたか残念。>>4041>>4042
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/scanf.3.html

以下同意
-------------------------------------
sscanf(host_path,"%[^/]%s",host,path);
-------------------------------------
p = strchr(host_path, '/');
if ( p != NULL ){
    strcpy(path, p);
    *p = '\0';
    strcpy(host, host_path);
} else {
    strcpy(host, host_path);
}
-------------------------------------

No. 4356 # マーブル 2005/11/08 (火) 01:39:16
fdopen()で作成されたストリームが閉じられたときにファイル記述子も 閉じられる。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fdopen.3.html
よって以下のページのL:125は不要です。
http://x68000.q-e-d.net/~68user/net/c-http-2.html

No. 4357 # 68user 2005/11/08 (火) 02:42:15
>>4356 マーブル
ありがとうございます。とりあえず POSIX を確認させてください (明日以降)。
    http://www.opengroup.org/onlinepubs/009695399/functions/fdopen.html

No. 4358 # 68user 2005/11/08 (火) 02:51:42
>>4357 68user
明日以降と言いつつ今確認してみましたが、POSIX にはそういう記述は
ないように見えます。また、Solaris9 のマニュアルにも書いてないように
見えます。
    http://www.freebsd.org/cgi/man.cgi?query=fdopen&sektion=3C&manpath=SunOS+5.9

しかし BSD ならば、4.4BSD-Lite2 にはそのような記述があります。
    http://www.freebsd.org/cgi/man.cgi?query=fdopen&manpath=4.4BSD+Lite2&format=html

Solaris や HP-UX が手元にある方にお願いなのですが、fdclose して fclose した
ときにソケットディスクリプタがクローズされるかどうか truss コマンドなどで
確認していただけないでしょうか (わたしのまわりは FreeBSD と Linux しかないので)。

いずれにせよ何かしらの補足は追記したいと考えています。

No. 4359 # 68user 2005/11/08 (火) 03:00:02
>>4358 68user
> fdclose して fclose したときに
「fdopen して fclose したときに」の誤りでした。

ちなみに「UNIX ネットワークプログラミング第2版」からは、この件についての
記述を読み取ることはできませんでした。

No. 4360 # マーブル 2005/11/08 (火) 04:30:12
>>4359 68user
機種依存等深く考えずに書き込んでしまって申し訳ございません。
また知合いに話せる人がいない為に決めつけたような書き込みになってしまったこともお詫びします。

基本的にFILE構造体にfileディスクリプタが含まれているものと理解していたもので、
fclose時に連動してcloseされるかな?と単純に考えてしまいました。

trussで確認した結果が以下でcloseされているようでした(これおもしろいですね)
SunOS eibw23 5.9 Generic_112233-03 sun4u sparc SUNW(Solaris8か9)
-----------------------------------------------------------
read(0, 0xFF3414EC, 1024) (sleeping...)
read(0, "\n", 1024) = 1
llseek(3, 0, SEEK_CUR) = 0
close(3) = 0
read(0, 0xFF3414EC, 1024) (sleeping...)
read(0, "\n", 1024) = 1
_exit(0)

No. 4361 # マーブル 2005/11/08 (火) 04:33:00
>>4360 マーブル
うゎ、アドレス込みで貼っちまった、ハズカシィ

No. 4362 # マーブル 2005/11/08 (火) 04:48:39
>>4360 マーブル
opensolarisがsolarisとどれだけ違うかわかりませんが、
http://cvs.opensolaris.org/source/xref/on/usr/src/lib/libc/port/stdio/fdopen.c#64
fdの値は単純に渡されているように見えます。
(↑のサイト使い安くて良く使ってます、BSDでこのような感じのページご存知ですか?)

No. 4363 # 68user 2005/11/08 (火) 13:23:30
>>4360 マーブル
昨日は変なことを書いてしまいました。fclose したんだから close するのは
当然ですよね。まぁ fdopen したものはフラッシュだけ行って close しない
実装があっても不思議ではないですが、素直に考えれば close するはず。

よって、125行目の close は削除します。

>>4362 マーブル
> (↑のサイト使い安くて良く使ってます、BSDでこのような感じのページご存知ですか?)
普通の cvsweb でよければ、以下のものが cvsgraph が組み込まれているのでよく使います。
    http://cvsweb.allbsd.org/cvsweb.cgi/src/lib/libc/stdio/fdopen.c
ソース閲覧なら GLOBAL を使ったFreeBSD Source Code Tour が便利ですが、ファイル名が
ころころ変わるので URL を保存しておいても役に立たないのがが困りものです。
    http://snapshots.jp.freebsd.org/tour/
    http://snapshots.jp.freebsd.org/tour/current/userland/cgi-bin/global.cgi?pattern=fdopen&id=&type=definition
    http://snapshots.jp.freebsd.org/tour/current/userland/S/9687.html#53

OpenSolaris のソースを見られるところは知りませんでした。今後活用させて
いただきます。

No. 4364 # がちゃぴ 2005/11/08 (火) 15:45:39
初めましてWindowsユーザですが、仕事上 LinuxやCVSを使うことがあります。
コマンドをなかなか覚えられなくて、いつも参考にさせて頂いています。

No. 4365 # hagu 2005/11/08 (火) 18:05:43
>>4353 zsh

凄いです。
変換されました。

No. 4366 # anonymous 2005/11/08 (火) 22:03:49
よくパーミッションでrは読む権利を、wは書く権利を、
xは実行する権利を与えるといいますが、それぞれの権利が
与えられている時、いない時は具体的にどのようなコマンド
が有効であるのか、いまいちはっきり理解できません。
どなたか詳しくをしえてください。

No. 4367 # has 2005/11/09 (水) 00:01:04
>>4366 anonymous
> それぞれの権利が与えられている時、いない時は具体的にどのようなコマンドが
> 有効であるのか
何か哲学的なニオイがするので(?)、そもそも私が答えられる内容でも無い気は
しますがそれでもよければ教えてください。
ええと、ちょっと見た限りでは書き込み中の「有効」の意味がよくわかりません。
もしかしたら具体的に何か目的があるんでしょうか。
あと、パーミッションが与えられているのはプログラム?読み書きするファイル?

No. 4368 # 68user 2005/11/09 (水) 00:14:27
>>4364 がちゃぴ
ありがとうございます。ご意見・ご指摘がありましたら遠慮なくどうぞ。

なお、世の中いろんな人がいますので、文章の一部を削除させていただきました。
削除した部分に関する話題はご遠慮いただきたく思います。ご理解ください。

>>4366 anonymous
紛らわしいのでハンドルを「68user」から「anonymous」と変更しました。
今後は適切なハンドルを使用してください。

No. 4369 # マーブル 2005/11/09 (水) 01:36:27
>>4363 68user
御回答ありがとうございました。
また情報交換ができてうれしく思います、重ねてお礼申し上げます。

>>4367 has
話に割り込んでしまってごめんなさい。
>>4366 anonymous
コマンドが読み書きするファイルのアクセス権限を考慮して判断するのが良いと思います。
例えばmountコマンドでは一般userにデバイスへのアクセス権限がないので(当方FreeBSD)、
コマンドは実行できてもmountはできません。
また許可を与えたい場合、デバイスファイルのパーミッションを変更すれば使用できますが、
いろいろ問題がありそうなので、
http://x68000.q-e-d.net/~68user/unix/pickup?sudo
の方法を取ったりするそうです。

ついでにちょっと変な話。
実行権限がないディレクトリに対して移動(cd)もディレクトリの内容の確認も(ls)もできません。
が、opendir(c言語)を用いいると実行権限がなくても内容の確認ができてしまいます。
なんだか不思議な感じがしませんか?

No. 4370 # 68user 2005/11/09 (水) 02:02:19
>>4369 マーブル
> 実行権限がないディレクトリに対して移動(cd)もディレクトリの内容の確認も(ls)もできません。
> が、opendir(c言語)を用いいると実行権限がなくても内容の確認ができてしまいます。
少々誤解があるようですが、実行権限がないディレクトリに対しては、移動 (cd) は
できませんが、ディレクトリの内容の確認 (ls) はできます (読み込み権限があれば)。
しかし ls -l はこけます。

引数なしの ls が行っていることは opendir(2) なわけですが、opendir(2) は
ディレクトリの下にアクセスしません。ディレクトリエントリを読むだけなので
    % cat ディレクトリ名
相当の処理しかしていません。よって、ディレクトリに対する読み込み権限があれば
ファイル一覧を取得できます (ディレクトリも広義のファイル)。

一方 ls -l は opendir(2) して、取得したファイル名それぞれについて stat(2) する
わけですが、stat(2) するには それぞれのファイルの i-node を知る必要があります。
しかし i-node を知るには、そのファイルが属する上位ディレクトリの実行権限が必要です。

結局のところ、ディレクトリに対する実行権限とは
      「ファイル名から i-node への変換を許可するかどうか」
であり、言い換えると
      「namei(9) を許可するかどうか」
だとわたしは思っていますが、違っていたら誰か教えてください。

No. 4371 # マーブル 2005/11/09 (水) 08:21:56
>>4370 68user
すいません-Fのエイリアス掛かってました。
\lsで動作します、掲示板汚してごめんなさい。

truss ls -F testdirの結果の一部
fchdir(0x5) ERR#13 'Permission denied'
よりディレクトリ内に移動できないということらしいです(FreeBSD)
(Linuxで試したらfstatでのエラーだったのでものによりけりな予感

No. 4372 # 68user 2005/11/09 (水) 11:15:37
~はunixではどのような存在なのですか?

No. 4373 # マーブル 2005/11/09 (水) 13:24:33
>>4368 68user
>>4366 anonymous
は解決したのですか?

No. 4374 # DNS勉強中 2005/11/10 (木) 14:36:15
はじめまして。
学校の課題で、C言語でnslookupみたいな動作をするプログラムを作るように言われ
こちらのサイトを参考に作成させていただいております。

それで一箇所気になったのですが、

http://x68000.q-e-d.net/~68user/net/resolver-3.html
> タイプが TXT なら、そのまま表示します。
> これは多分間違い。
> % ./resolver-1.pl www.jp.freebsd.org version.bind txt chaos
> リソースデータは「&Sorry, no version string is available」と表示されるが、
> dig や nslookup は「Sorry, no version string is available」となります
> (& がない)。
> 先頭の & を削るような規則があるようだが、それが何なのかはわからなかった。

の部分ですが、&の文字コードは0x26(10進数で言う38)。
そしてその後に続く
【Sorry, no version string is available.】
は38文字。
つまりドメイン名の3www8livedoor3com0と同じような意味かなと思います。
そのため先頭の1バイト目を出力しないようにすればdigやnslookupと同じような
表記になるのではと思います。

例) sega.jpを調べるとunknownが帰ってきますが、その中身は
【07 75 6e 6b 6e 6f 77 6e】です。

文字数が32文字以上ないと画面上には何も表示されないので、
それ以下の文字数のところでは結果的にうまく出力されているのかなと思います。
そのため【タイプが TXT なら、そのまま表示します。】ではなく、
【タイプが TXT なら、先頭1バイト以外をそのまま表示します。】かなと思います。
ぜんぜん的外れな事言っていたらすいません。

No. 4375 # DNS勉強中 2005/11/10 (木) 16:55:45
こちらのサイトを参考にresolver-1.plと似たような動作をする
C言語のプログラムを作成したのですが、一箇所分からないところがあったので、
もしお分かりになるようでしたらアドバイスをいただけないでしょうか。

作成ソース(一応問題なく動くと思います)
windows版(CPad 2.31使用)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1052.txt
linux版(gcc 2.96使用)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1053.txt

それで、分からないのは【DNS query 送信時にごみデータが後ろに大量に付く】事です。
ごみが付いてしまう理由は、
DNS query の質問レコードの照会名(可変長)の長さは
実際に名前解決ホスト名を入力されないと分からないので、
char QUERIES[400];と宣言し、そこに名前解決ホスト名を格納しているからです。
そして、その後ろに、タイプとクラスを連結しています。
そのためQUERIES[400]の余った部分がごみデータとなってしまいます。
実際の動作には問題が無いみたいで、
パケットをキャプチャしなければごみが付いているのは分からないのですが、
気持ち悪いので改善したいと思っております。

アドバイスをいただけるようでしたら、どうかよろしくお願いします。

No. 4376 # DNS勉強中 2005/11/10 (木) 16:58:56
たびたびすいません。
No 4375のソースですが、
掲示板から直接クリックするとアップロードしたソースが見えないようなので、
ブラウザを新規に立ち上げてアドレス欄にコピーしてアクセスしていただけますでしょうか。

No. 4377 # Yuusuke 2005/11/10 (木) 18:07:20
テストサーバ:solaris8
本番サーバ :solaris8
ワークステーション間のファイル転送について質問です。
テストサーバで構築したディレクトリを本番サーバに移行しようとしています。
条件としてファイルのパーミッション、ユーザ.グループ、タイムスタンプは
変わらないようにします。
そのため
"tar cvf /tmp/system.tar ."
でアーカイブして"rcp"で本番サーバにアーカイブファイルを転送してファイルを
展開したのですがユーザ.グループが本番サーバのログインユーザのものになって
しまいました。
tarは既存の状態をそのままアーカイブすると思っていたのですがrcpで転送すると
変わってしまうのでしょうか?
よろしくお願いします。

No. 4378 # Yuusuke 2005/11/10 (木) 18:57:26
No.4377の質問をした者です。
本番サーバでアーカイブしたファイルを展開時に"root”ユーザで実行したところ
既存の環境のままで展開できました。
solarisでは["o"オーナーシップ]というオプションが"root"ユーザ以外のユーザが
アーカイブファイル展開時に付属するようでした。
おさわがせしましたm(__)m

No. 4379 # 68user 2005/11/10 (木) 20:19:47
>>4374 DNS勉強中
ありがとうございます。

以前も length では、というご指摘をいただいたのですが、RFC などの
一次資料を見つけられずにいます。
    http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?log=4283
    http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?log=4293

この件に関する一次資料をご存知でしょうか?

>>4375 DNS勉強中
> 分からないのは【DNS query 送信時にごみデータが後ろに大量に付く】事です。

> sendto(s, (const char *)&DNS_Send, sizeof(DNS_Send), 0, (struct sockaddr *)&server, sizeof(server)) < 0) {
sizeof(DNS_Send) バイトを送信しているのがまずいので、必要なバイト数分だけ
送信すればよいと思います。この例なら送信バイト数は

    (DNS_Send.QUERIES - &DNS_Send.id + count + 4) バイト

ですかね? (自信なし) まぁこれだと汚いので、質問数や長さを保持する変数を
追加した方がよいと思います。

あとは struct DNS_Packet のパディングが心配です (実際は id や flag は
short なのでほとんどの環境では問題ないと思いますが)。わたしなら
    struct DNS_Query {
        ....
    };
    struct DNS_Question {
        short id
        short flag;
        short QDCOUNT;
        short ANCOUNT;
        short NSCOUNT;
        short ARCOUNT;
      struct DNS_Query *q;
    };
    struct DNS_Packet {
        char data[1000];
        int length;
    };
として (命名は適当)、問い合わせ内容を DNS_Question に構築し、送信時に
DNS_Packet にコピーして send すると思います。といっても、わたしのソースの方
では全く実践できていないですけれども。

ところで、全体的にはかなり読みやすいと思うんですが、このソースのライセンスを
教えてください。要は、これを修正したものを、わたしのページに C のサンプル
コードとして記載することは可能でしょうか? ということです。


>>4378 Yuusuke
一般ユーザで展開したときに他ユーザの所有者でファイルを作成できてしまうと、
適当な tar ファイルをでっちあげれば他のユーザのファイルを自由に作成できる
ことになってしまうので、普通の UNIX ではできません。

root で展開するのもひとつの方法ですが、Solaris では /etc/system で
    rstchown=0
と設定することで一般ユーザが chown できるようになります (セキュリティを
犠牲にするので、わたしはしません)。そうしておけば、一般ユーザが tar xfp
すると、他ユーザが所有するファイルを作成できるかもしれません (試してません)。

No. 4380 # DNS勉強中 2005/11/11 (金) 01:20:02
>>4379 68userさん
ご返答をいただきありがとうございます。

length の件ですが、もうしわけありませんが一次資料は存じておりません。
今回のプログラムで私が一次資料として利用したのが、
こちらのサイトということもありまして(^^;。

それとごみデータの件ですが、おっしゃりたいことは分かりました
(まだソース上では試しておりませんが)。
送信するデータ量で調整すると言う発想は出てきませんでした。
明日にでもその部分は組めそうな気がします。
どうもありがとうございます。

後、構造体の中に構造体を書くスタイルも勉強になりました。
このスタイルを取り入れた形で動かせるよう努力してみたいと思います。

それとライセンスの件ですが、このソースの中に書かれている関数
( make_domain, parse_response, get_domain )や
出力結果を見ていただければ分かるかと思いますが、
resolver-1.pl を C に移植しようとしたものがこのソースです。
移植作業自体は私が行いました。
もっとも pack とかの動作をどうやって C で再現すればよいのか等
わからない事が多かったので、
resolver-1.pl の出力結果や etherealの結果から
自分なりに解釈して組んでいる部分はありますので、
完全移植は出来ておりません。

そのため、このサイトで有効利用していただけるのでしたらありがたいです。
私がこのサイトから学んだことを還元できればうれしいですし、
修正したソースを見て勉強させていただけたらと思います。

とりあえず自分で組んだソースなので、
現在このソースが抱えている内部的な問題とか分かる範囲で明日まとめてみます。
実際にソースを読んでいただいているようですが、
情報を提供しないよりは、提供した方が良いかなと思いますので。

No. 4381 # 68user 2005/11/11 (金) 03:06:30
>>4380 DNS勉強中
> length の件ですが、もうしわけありませんが一次資料は存じておりません。
了解しました。一次資料を発見されたら、ご教示いただけると幸いです。

> そのため、このサイトで有効利用していただけるのでしたらありがたいです。
ありがとうございます。C でのサンプルソースとしてぜひ使わせていただければ
と思います。ただ、今は時間がとれないので、半年後とか 1年後、もしかしたら
数年後となるかもしれません。その点はご了承ください。

> resolver-1.pl を C に移植しようとしたものがこのソースです。
そうなんですか。わたしはこんなわかりやすいソースを書いた覚えはないんですが、
とても可読性が高いように感じます。

なぜでしょうね? コメントが充実しているから? わたしは「適切な変数名・関数名を
使用していれば、あまりコメントを書かなくても問題ない」という考え方だった
のですが、ちょっと考えが変わりそうです。

No. 4382 # 68user 2005/11/11 (金) 03:08:04
人材募集です。ご興味を持たれた方はお気軽にどうぞ。
    http://X68000.q-e-d.net/~68user/tmp/job.html

No. 4383 # DNS勉強中 2005/11/11 (金) 09:44:05
>>4381 68userさん
今回作成したソースは resolver-1.pl を参考に書かせていただきましたが、
どちらかというと書かれているソースではなく、
書かれているコメントを参考に作成しました。
理由は単に perl が分からないからです(^^;。

ただ、コメントから行っている動作が分かれば、
それを C で実現するにはどうすればよいかを考えれば良いのかなと。

以上のことより、 resolver-1.pl と同じような事を実現していても
ソース自体は似つかないものになっているかもしれません。
と言いますか perl が読めないので「似てるか否かわからない」
というのが実際のところです(^^;。

後、ソースを利用する/しない、時期などはすべてお任せします。

それとごみデータの件ですが、下記の記述でうまくいきました。
sizeof(DNS_Send) - sizeof(DNS_Send.QUERIES) + count + 4
アドバイスを頂き、どうもありがとうございました。

No. 4384 # DNS勉強中 2005/11/11 (金) 11:15:02
投稿した DNS のソースコードの問題点 その1

( Linux版のみ )照会タイプと照会クラスを共に指定しないと、
照会クラスに PWD=/root/src が挿入され (null にならず)、エラーになってしまう。

その部分にだけ絞ったサンプルソース( Windows/Linux 兼用 )
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1057.c
windowでの実行結果
argv[0] = C:\src\argv.exe(←これは私の実行ファイル名です)
argv[1] = (null)
argv[2] = (null)
argv[3] = (null)
argv[4] = (null)

linuxでの実行結果
argv[0] = ./test24(←これは私の実行ファイル名です)
argv[1] = (null)
argv[2] = PWD=/root/src
argv[3] = HOSTNAME=gifu-vm-35
argv[4] = LESSOPEN=|/usr/bin/lesspipe.sh %s

思いつく回避方法は、
1,照会タイプを入力必須にする。
2,照会クラスのみ引数ではなく、別途入力するようにする。
3,照会クラスの先頭3文字が PWD なら INTERNET に置き換えてしまう。
と言った所ですが、1,2は resolver-1.pl にくらべ多く入力する必要があり、
3は環境依存度が高いかも知れません。
このサイトで公開される際は、この部分は何かしか改善を加えた方が良いかもしれません。

No. 4385 # 68user 2005/11/11 (金) 14:01:36
>>4384 DNS勉強中
> 後、ソースを利用する/しない、時期などはすべてお任せします。
ありがとうございます。有効に活用させていただきたいと思います。再配布
ライセンスやクレジット表記について要望があれば、今のうちに承っておきます。

> printf("argv[0] = %s\n", argv[0]);
> printf("argv[1] = %s\n", argv[1]);
C の話になりますが、argv の要素数は argc を参照しなければいけません。領域を
超えた部分に何が入っているかは環境依存です。Windows で NULL が入っているのは
たまたまです。OS のバージョンやコンパイラを変えたらどうなるかわかりません。

Linux の場合は、環境変数を保持している environ の環境にアクセスしていますが、
これもたまたまです。

# この領域は、普通は int main(int argc, char *argv[], char *envp[])
# などとアクセスします。

よって、
    char query_type[256];
    char query_class[256];
    if ( argc >= 4 ){
          strcpy(query_type, argv[3]);
    } else {
          strcpy(query_type, "A");
    }
    if ( argc >= 5 ){
          strcpy(query_class, argv[4]);
    } else {
          strcpy(query_class, "INTERNET");
    }

    char *query_type = "A";
    char *query_class = "INTERNET";
    if ( argc >= 4 ) query_type = argv[3];
    if ( argc >= 5 ) query_class = argv[4];
などとするのがよいでしょう。

No. 4386 # DNS勉強中 2005/11/11 (金) 17:12:48
>>4385 68userさん
ライセンスなどは不要です。

それと引数の御指導どうもありがとうございます。
よく理解でき、Linuxでの動作も確認いたしました。
おかげで問題点が1つ解消されました。

後、パディングが心配との事で、構造体を書いていただきましたので、
それを参考にソースを書き直してみました。

Windows版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1058.txt

ただ
        struct DNS_Query {
                ....
        };
の .... の意味するところが分からなかったので
ここは私なりに解釈して記述しています。
またstruct DNS_Query *q;の必要性が分からなかったので、これは記述していません。

しかし、
> 問い合わせ内容を DNS_Question に構築し、
> 送信時にDNS_Packet にコピーして send すると思います。
の部分は実現したつもりです。

もっともパディングが心配という事が良く理解できていないので、
果たして組んだソースが意図を汲んでいるかどうかは自信がありません。

後このソースの問題点ですが、いま自分が気づいているところでは2点あります。
変数 search と 変数 DNS_question.flag の保守性です。
動作自体には問題はないと思います。
ただこれは自分で直せる気がするので週末にでも直したいと思います。

No. 4387 # Yuusuke 2005/11/11 (金) 18:06:11
>>4379 68user
ありがとうございます。
おかげさまでつい先ほど本番サーバへ移行が完了しました。
本番サーバではリモートコマンドはできないポリシーになっていたようなのでftp
でtarファイルを転送し、rootで展開しました。

No. 4388 # 68user 2005/11/12 (土) 14:20:21
>>4386 DNS勉強中
> ここは私なりに解釈して記述しています。
わたしの意図どおりの実装になっています。

> またstruct DNS_Query *q;の必要性が分からなかったので、これは記述していません。
        struct DNS_Question {
            short id
            short flag;
            short QDCOUNT;
            short ANCOUNT;
            short NSCOUNT;
            short ARCOUNT;
            struct DNS_Query *query;
        };
と書くと、DNS_Question というものは
    「id・flag・{QD,AN,NS,AR}COUNT・DNS_Query から成り立つ」
という関係がソース上に明示されます。プログラムは「データ構造+アルゴリズム」
ですので、正確なデータ構造を最初に明示しておけば、ソースを理解しやすくなる
ということです。

また、こうしておけば、
    main(){
        make_question(&DNS_question);
    }
    make_question(DNS_Question *question){
        question->id = ...;
        question->flag = ...;
        make_query(question->query);
    }
    make_query(DNS_Query *query){
        query を作成
    }
というふうに、変数の受け渡しがすっきりします。

ただ、フラットな構成の方がわかりやすい場合もありますので、ケースバイケースかと
思います。

> もっともパディングが心配という事が良く理解できていないので、
わたしの環境では
    int main (){
        struct {
            char a[1];
            int b;
        } hoge;
        printf("%d\n", sizeof(hoge));
    }
の結果は 8 になります。構造体のメンバ間にどれだけのパディングが入るかは
環境依存なので、パディングが入らないことを前提としたコーディングをするのは
怖いなぁ、ということです。

> 後このソースの問題点ですが、いま自分が気づいているところでは2点あります。
> 変数 search と 変数 DNS_question.flag の保守性です。
なるほど、学校の課題にも関わらず細かな部分の完成度を高めたいというのは
素晴らしいですね。余計なお世話かもしれませんが細かいところまで見てみました。

> #include <netdb.h>
必要なヘッダファイルを include していません。その結果、引数チェックが
行われず、戻り値は int として扱われているはず。

このことに気づかないということは、警告オプションを有効にしていないと推察
されます。gcc であれば -Wall オプションを付けると幸せな人生を送れます。

> char *make_domain(char *domain_name);
プロトタイプ宣言で変数名は不要で、
    char *make_domain(char *);
でよいです。別に引数名を記述しても動作には影響ないですが、引数名を変更
したときに直し忘れてズレが出るので、わたしは書きません。/usr/include/*.h
にも書いてないです。

> fprintf(stderr, "Error: Socket作成失敗\n");
なぜ失敗したのかがわからないため、システムコールのエラー時には errno を
出力しましょう。わたしは
      fprintf(stderr, "Error: Socket作成失敗。errno[%s]\n", strerror(errno));
とするのが好みですが、perror(3) などを使う人も多いです。

bind 失敗時も同様。エラーメッセージが
    Bind error
であるのと
    Bind error [Address already in use]
と表示されるのでは、対処時間に大きな差が出ると思います。

ちなみに gethostbyname(3) のエラー処理が抜けています。gethostbyname は
ソケットまわりのシステムコール呼び出し時のエラー以外にも、データ内容の
エラーが発生する可能性があるので herror(3) や hstrerror(3) を使います。

> return -1;
main で戻せる値は 0〜255 です。あと、exit と return が混在しているのが
気になります。

> questions = two_bytes(int_buf[search], int_buf[search+1]);
> search += 2;
two_bytes・four_bytes のインタフェースがいまいちです。データ取得と
インクリメントを別々に行うと、インクリメント忘れ・インクリメントミスが
発生する危険性があります。

たとえば
    questions = two_bytes(&int_buf, &search);
とインタフェースを変え、
    int two_bytes(int *int_buf, int *search){
          int sum;
          sum = int_buf[*search] * 16 * 16 + int_buf[*(search+1)];
          *search += 2;
          return sum;
    }
とすればデータ解析とインクリメントを同時に行えます。ここまでくれば、
      struct DNS_Response {
          char data[10000];
          int int_data[10000];
          int pos;
      };
という構造体を作った方がよいかもしれません。

上記と関連しますが、
    additional = two_bytes(&int_buf[search], &search);
    search += 1;
これは一見すると謎なコードです。2バイト取得しているのに 1バイトしか進めて
いないので、わたしはしばらく悩みました。結局は get_domain() の先頭で 1バイト
進めているから問題ないのですが、直感に反するコーディングだと思います。

> int conv_class(char *class){
> switch (class) {
> case 1: printf("1 (INTERNET)\n"); break;
> case 2: printf("2 (CSNET)\n"); break;
> case 3: printf("3 (CNAME)\n"); break;
> case 4: printf("4 (HESIOD)\n"); break;
> case 5: printf("5 (ANY)\n"); break;
> }
わたしなら、
    typedef struct {
        char name[100];
        int code;
    } codelist_t;
としておいて、
    int conv_class(char *class){
        codelist_t class_list[] = {
            {"INTERNET", 1},
            {"CSNET", 2},
            {"CHAOS", 3},
            {"HESIOD", 4},
            {"ANY", 5},
        };
        for ( i=0 ; i<sizeof(class_list)/sizeof(class_list[0]) ; i++ ){
            if ( strcmp(class, class_list[i].str) == 0 ){
                return class_list[i].code;
            }
        }
と直します。class_list は void class_print(int class) で共用してもよいでしょう
(resolver-1.pl と同じやり方)。

> memset(&client, '\0', sizeof(client));
> host[j] = 0; /* 最後に0を代入する */
memset は 0 で埋めて、host[j] は '\0' で終端すべきです。文字終端の '\0' と
値としての 0 を区別しておくと、後から読んだ人に意図が伝わりますので。


あとは命名について。関数名は動詞、変数名は名詞という基本ルールがあるよう
ですが、徹底されていないように思います。

いまいちだと思う関数名:
    int domain_count(char *);
        → get_domain_length などが適切では。
    int end_domain(int, int *);
        → is_XXX とか check_XXX がよいのでは。
    int resource_data(int *, int, int, char *);
        → 名詞になっている。しかし他の hogehoge_print より一段レベルが高いので、
              混同しないような命名をしたいところ。
    void conv_time(int);
        → 「変換」といいつつ実際に行っているのは「出力」。

いまいちだと思う変数名:
    int search;
        → 動詞に見える。pos あたりでいいのでは。
    int questions;
    int answer;
    int authority;
    int additional;
        → s が付いていたり付いていなかったり。あと、この変数の本質は「個数」で
              あるはず。であれば question_count とか question_num などにしたい。
    int flag = 0;
        → flag や tmp という変数名が許されるのは変数スコープが 5行以内の場合
              (わたしの中では)。それ以上ならもう少し長い名前を。

> int resource_data(int *int_buf, int search, int max, char *print);
    int max
        → record_num あたりで。
    char *print
        → record_name あたりで。

> int domain_count(char *argv)
argv は渡す側の変数名であって、この引数の本質は「ホスト名」であるため、
    int domain_count(char *hostname)
    int domain_count(char *host)
などがよいと思います。


と、わたしならこう書くという部分はあるものの、それでも可読性が高い
と感じました。たとえば codelist_t は保守性は高いのですが、ぱっと見
読みやすいのは case 文の羅列です。勉強用のソースであれば、下手に
構造化しすぎることなく、あえてベタ書きしたほうがいいのではないかと
考え始めています。

あと、hoge_print 関数も、わたしはこういう書き方をせずに
      char *a_record_print(int_buf, search);
と文字列を返すほうですが、メモリ確保を行うのは呼び出し側か、関数の
中で static に持つか、など悩ましいです。すっぱり割り切って関数内で
printf するのも、保守性はともかく可読性は悪くない、と思いました。

あと、

    - two_bytes・four_bytes という関数は便利で読みやすい。
    - int_buf にコピーするのは、型変換のバグを避ける手法としては
        優れているのかも (ちょっと逃げっぽいけど)。
    - perl 版の可読性を落としているのはやはり pack。num2bin などの
        関数を作り、直接 pack を呼ぶのは避けた方がよいのかも。
    - やはり C は構造体がすっきり書けるのがよいところ。perl の場合、
        ハッシュだとタイプミス耐性がないし、Class::Struct だとインクリメント
        が面倒だし、package を作るのは大げさ。

などといろいろと思うところはありました。自分が書いたものを他人が
リライトすると、いろいろと気づくことがあっておもしろいですね。

いろいろ偉そうに書きましたが、指摘したことは当ページでは全然実践できて
いません (エラーチェックは甘いし、herror(3) は使っていないし、resolver-1.pl
ではデータ取得とインクリメントを別々に行っているし)。その辺はご容赦ください。

No. 4389 # DNS勉強中 2005/11/12 (土) 17:37:13
>>4388 68userさん
いろいろと細かい点までアドバイスをしていただきましてありがとうございます。
大変勉強になります。

全てに指摘点に対しご回答差し上げたいのですが、
まだ指摘された部分の修正作業を行っておりませんので、
一通り読ませていただき、気づいた点について記述させていただきます。

まず return と exit の混在ですが、
これは conv_type 関数や conv_class 関数の部分だけを
指した指摘でしょうか。
それとも exit を一つも使わない方が良いという事でしょうか。
return と exit の混在のデメリットが分からなかったので。

後、変数 search ですが、仰るとおりインターフェースがいまいちです。
何故なら現在位置を返す関数と返さない関数が混在しているからです。
ここの処理がうまく思いつかなかったので search += 2; で逃げていました(^^;。

そして変数 search の大きな問題が仰るとおり
> additional = two_bytes(&int_buf[search], &search);
> search += 1;
です。
ここは作った当人で無いと分からないですよね(^^;。
その理由は、開発途中で方針を変更してしまったためです。
そのため現在位置は
・解析し終わった部分の、次の部分の先頭に現在位置を合わせている所
・解析し終わった部分の末尾に現在位置を合わせている所
の2パターンが発生してしまいました。
その代償が search += 2; と search += 1; の混在です。
ここは人に解析してもらう際にはまずいので修正します。

あと host[j] = 0; ですが、ここでは www.livedoor.com というドメイン名を
3www8livedoor3com0(数字の部分は文字ではなく、文字コード)に変換しているのですが、host[j] = 0; は ドメインの最後に文字コードの 0 を連結する
と言う意味で記述しました。
何となく思ったのですが、 3www8livedoor3com0 の最後の 0 は終端という意味かな。
そう考えると仰られている意味が分かりました。
その部分に関しては、記述ミスと言うより、私の理解が間違っていたのかなと思います。
それと、int_buf は完全に逃げです(^^;。
ここの部分のうまい処理が思いつきませんでした。


他の指摘された部分につきましても、順次修正して良いものを作りたいと思います。
お忙しい中、いろいろご指摘いただきありがとうございます。

No. 4390 # 68user 2005/11/12 (土) 23:12:39
>>4389 DNS勉強中
> まず return と exit の混在ですが、
main から抜ける際に return と exit が混在していることを指したつもりでした。

下請け関数から exit するのは、狙っているのなら別にいいんじゃないかと思います
(課題のプログラムですし)。変な値がやってきたら終了してしまうようでは、本格的な
運用で使うことはできませんが、

    - 本格的な運用では使えないことを認識している。
    - どういう要求が出てきたときに問題が起こるかなんとなく想像できる。
        たとえば web サーバのログから IP アドレスを拾って、複数の名前解決を
        高速に行うプログラムを作りたいという要求があったとすると、この
        プログラムではひとつでも変なレスポンスがくると exit してしまうので
        実運用には耐えられない。
    - 本格的な運用で使用する場合は、どこをどういうふうに書き換えればよいか
        だいたい把握している。

なら問題ないと思います。

> return と exit の混在のデメリットが分からなかったので。
わたしの中では以下のようなルールにしています。

    1. 基本的に main まで戻る。エラー発生時の情報出力を行うことを考えると、
          各関数の役割分担が明確になるから。

    2. 例外として、引数解析エラー表示の usage 関数内では exit してよい。
          理由は、処理が始まっておらず後始末が不要であることと、usage は
          数箇所〜数十箇所から呼ばれる可能性があり、呼び出し元での exit
          忘れが怖いこと。
              if ( argv[i][0] != '-' ){
                    usage();
                    exit(1); /* これを書き忘れると処理が続行してしまう */
              }

1 の詳細は以下のとおり。

    今回のように 1件だけのデータを処理する場合は、変な値がきたときに
          ほげフラグが 1〜5 の範囲外です
    などと出力すれば問題ないが、 一度に複数のデータを処理するバッチの場合は
          ほげフラグが 1〜5 の範囲外です。受注番号[%d] レコード番号[%d] 顧客番号 [%d]
    などとより多くの情報を出力しないと、どのデータがおかしいのか特定できない。

    とはいえ、下請け関数である 文字列→コード変換関数に、
          conv_type(query_type, order_no, rec_no, customer_no);
    などとエラー発生時に備えて各種情報を渡すのは変。エラー出力用のグローバル変数を
    作って
          err_order_no = order_no;
          err_rec_no = rec_no;
          err_customer = customer_no;
          conv_type(query_type);
    とする、なんてのも馬鹿馬鹿しい (後者はたまに見かけてイラッときますが)。

    となると、
          int main(){
              ret = file_main();
              if ( ret == -1 ){
                  logging("エラー発生。処理中断・ロールバックし、全データを元に戻します");
                  /* 後始末を一箇所にまとめる */
              }
          }

          int file_main(){
              fp = fopen(filename[i], "rw");
              while (1){
                  fgets(fp, buf, sizeof(buf));
                  ret = hoge_main(buf);
                  if ( ret == -1 ){
                      logging("hoge_main でエラー発生。ファイル名[%d] 行番号[%d]", filename[i], line);
                      return -1;
                  }
              }
          }

          int hoge_main(char *buf){
              type = conv_type(query_type);
              if ( type == -1 ){
                  logging("query_type に変換に失敗。受注番号[%d]", rec_no):
                  return -1;
              }
          }

          int conv_type(char *type){
              if ( 異常値 ){
                  logging("type が異常値 [%s]", type);
                  return -1;
              }
          }
    として main まで戻るのが現実的。conv_type はファイル名だの受注番号だの
    責任範囲外のことを知らなくてもよいが、最終的にはエラーリカバリに必要な
    情報が揃う。

Java などのいまどきな言語であれば例外を使うべきだろうと思います。


> 3www8livedoor3com0(数字の部分は文字ではなく、文字コード)に変換して
> いるのですが、host[j] = 0; は ドメインの最後に文字コードの 0 を連結
> すると言う意味で記述しました。
戻り値を
      strcpy(DNS_Send.QUERIES, make_domain(argv[2]));
と文字列として扱うのであれば、末尾は文字終端 '\0' であるべきで、
      host[j] = 0;
より
      host[j] = '\0';
にすべきという意味で書きましたが、たしかに文字列終端でもあり、DNS 的な
0 終端でもあるわけで微妙なところですね。

バイナリ列とみなして長さを明示的に管理し、strcpy のかわりに memcpy を
使うか、あるいは動作的には問題ないのでコメントで補足しておくか、あるいは
修正は不要なのか…。

> それと、int_buf は完全に逃げです(^^;。
いいんじゃないでしょうか。「バグを出さない」ということを第一目的とするなら
アリだと思います。わたしなどいまだに char と unsigned char あたりの暗黙の
型変換ではまったりしていますので、キャストがちりばめられているソースだったら
解読に苦労していたかもしれません。

ちなみに単なる「char」が signed であるか unsigned であるかは環境依存です。
とはいえ、わたしは一般的な UNIX しか知らないので、char が unsinged char
である環境は見たことはないですが。

No. 4391 # 68user 2005/11/12 (土) 23:36:45
>>4389 DNS勉強中
あと、さらに細かいことをひとつ。インデントは正確につけましょう。フラグ表示
の部分をわかりやすくするために、ひとつ余計にインデントしていますが、
      {
          フラグ表示
      }
と、ブロックで囲めばすみます。

インデントはプログラマがつけるものではなくエディタが勝手につけるものであり
(emacs の M-x indent-region などで)、もしエディタが変なふうにインデントして
しまったら、それは括弧の過不足や文字列の閉じ忘れが原因、などと気づくことが
できます (python などは除く)。

# というわたしのポリシーはなかなか理解してもらえない。なぜ手でインデントを
# 付ける人が多いのだろう (って、素の vi やメモ帳を使ったりするからだが)。
# めんどくさくないのかなぁ。

No. 4392 # DNS勉強中 2005/11/14 (月) 00:18:28
>>4388 68user
>>4390 68user
>>4391 68userさん
今日は上記3レスでアドバイスいただいた内容についてある程度修正したり、
理解に努めておりました。

・ struct DNS_Query *query; の必要性について理解いたしました。
確かに仰られるとおり、ソースが理解しやすくなると思いました。
そのため、その部分は修正しました。
(ただ make_question, make_query との関係上、一部修正しております)。
また、make_question と make_query を作成することにより、
main 部の記述を減らし、ソースを読みやすくしました。
ただ、記述していただいたとおりに作れなかったので、メイン部に
    make_question(&DNS_question);
    count = make_query(&DNS_query, argc, argv[2], argv[3], argv[4]);
と2つにわけて記述しております。

・ パディングについても理解いたしました。
確かに私の以前のソースはパディングが入らない前提で組んでありました。
やっと意図されたことが分かりました(^^;。

・ /usr/include/bfd.h をみて、
プロトタイプ宣言について仰られていることを確認・理解し、修正しました。

・ perror を用いエラー処理を追加しました。

・ 抜けていた gethostbyname のエラー処理を追加しました。
ただし、 herror や hstrerror を Windowsで使う方法が分からなかったので、
とりあえず perror を使っております。

・ return と exit の混在を解消しました。
それにともない、 main に戻らずに終了していた所を、
main に戻って終了するように変更しました。
またそれらしいエラー情報を出力するように変更しました。

・ two_bytes の記述変更について理解いたしました。
アドレス渡しで現在位置を変更して、
戻り値で2バイトの値を取得する方法は大変参考になりました。
確かに、教えていただいた記述の方が何かと便利ですので、
ほぼ同じソースを移植させていただきました。
それに伴い、謎の search += 1; を修正しました。
また four_bytes も同様にソースを変更しました。
この作業を実施したことにより、
search += 2; や search += 4; を大幅に減らすことが出来ました。

・ conv_type, conv_class, class_print, type_print を
codelist_t を使用する形に変更しました。
ただし、 void class_print(int class) を用いた共用の記述の仕方が
分からなかったので、
codelist_t {class, type}_list[] = { ... };をグローバル化して共用しています。
また、 qr_print, opcode_print, aa_print, tc_print, rd_print, ra_print,
rcode_print も同様に codelist_t { ... }_list[]化しました(こちらはローカル)。

・ 0 と \0 の混在を修正しました。

・ 変数名や関数名の命名を修正しました。

・ フラグ部分のインデントを変更しました。
ブロックで囲むと言う発想が出てこず、
かといって、インデントなりコメントで上下を囲むなどしないと、
のちのち分からないだろうなと思い、
インデントしてしまったのですが、
ブロックで囲むと言う方法が教えていただき、大変参考になりました。


とりあえず今日修正できたところは以上です。
上記以外の部分についてはまだ手をつけておりません。
他に、今まで教えていただいた事を他の部分にも流用できないか、
ソースを一通り読み直してみて調べてみようと思います。
また search を触ったことのより、ある程度検証をする必要があるのかなと思います。
月曜日は予定が入っているので、まとめるのは難しいかも知れませんが、
火曜日くらいにある程度まとめて一度アップしてみようと思います。

いろいろ参考になるアドバイスをいただきまして、ありがとうございます。

No. 4393 # DNS勉強中 2005/11/14 (月) 09:44:17
to 68userさん

さっそくですが、IPv6 のアドレス省略について
双方のプログラム(resolver-1.pl, 1058.txt)に
バグがあるかも知れないのでご報告します。

一例として、 198.41.0.4 www.yahoo.co.jpと入力して、
{A, B, C, D, E, F}.DNS.jpを表示させたとき、
追加情報の F.DNS.jp の出力結果は下記のとおりになります。

resolver-1.pl
2001:2F8::100::153

私の出力結果
2001:2f8::100:0:0:0:153

ちなみにEtherealの出力結果は下記のとおりです。
2001:2f8:0:100::153

IPv6 のアドレス省略表記に関する説明を下記のサイトで拝見したのですが、
http://www.soi.wide.ad.jp/iw2001/slides/04/04-1/53.html
そこには IPv6 のアドレス表記に関して2つの原則が書かれていました。
1,【連続する】0 のブロックは省略できる。
2,省略できるのは【1ヶ所】だけ。

そして出力結果から推察するに、
resolver-1.pl では、原則の1, 2共に満たしてないように見受けられます。
perl が分からないので想像ですが、
resolver-1.pl では 0 を見つけたら即座に :: に置き換え、
何回でも省略が使用できるように組んであるのかなと思われます。

私の方では、一度省略を使用したら、二度と使えないようには組んでいるのですが、
0 は即座に :: に置き換えております。
そのため 0 を見つけたら、次の場所を見て、
・次の場所も 0 なら :: に置き換える
・次の場所が 0 で無ければ、 0 を出力する。
というコードを追加しないといけないかもしれません。

勘違いでしたらすいません。

No. 4394 # 68user 2005/11/15 (火) 01:45:04
>>4393 DNS勉強中
ありがとうございます。

とりあえず TYPE=TXT の件と IPv6 の件を bugid20・21 として登録しました。
    http://x68000.q-e-d.net/~68user/bugnote/bugindex.php?projectid=1


ちなみになぜわたしが web を更新しないのは、解説文からソースへの
リンク方法が
    http://x68000.q-e-d.net/~68user/cgi-bin/cvsweb.cgi/public_html/net/org/resolver-3.html?rev=1.11&content-type=text/x-cvsweb-markup
のように
    :preinclude 21-106
などと行番号で指定しているため、修正が非常に面倒であるからです
(まぁただの言い訳なのですが)。

+10 などの相対指定にしようかとか、
      m/bind\(/
などと文字列で引っ掛けようかとか迷いつつここまで来てしまいました。
ご指摘を頂いたことについては大変感謝しておりますが、修正が遅いのは
なにとぞご容赦ください。

No. 4395 # 68user 2005/11/15 (火) 01:55:14
>>4392 DNS勉強中
> ただし、 void class_print(int class) を用いた共用の記述の仕方が
> 分からなかったので、
> codelist_t {class, type}_list[] = { ... };をグローバル化して共用しています。
一般的には、codelist_t を扱う関数を別ソースにし、ソース先頭で
    static codelist_t class_list[] = { ... };
と配列を宣言して、conv_class()・class_print() でその配列を使用
します。static をつければ外部ソースからアクセスできないので、
隠蔽できます。

ただ、複数ファイルに分けると、ヘッダファイルが必要だったり Makefile を
書きたくなったりするので、サンプルであれば分ける必要はないかもしれません。


それはそれとして複数のソースから構成される場合に、グローバル変数の
宣言をヘッダファイルで一元管理する方法をご存知なければ、一度書いて
みるとよいでしょう。

      --- var.h ----
      #ifdef THIS_IS_MAIN
      #define GLOBAL
      #else
      #define GLOBAL extern
      #endif
      GLOBAL class_list[] = {...};
      
      --- main.c ---
      #define THIS_IS_MAIN
      #include "var.h"

      --- sub.c ---
      #include "var.h"

こんな感じです。

No. 4396 # DNS勉強中 2005/11/15 (火) 12:19:47
>>4394 68user
修正の件了解致しました。

その後修正したもの
・教えていただいた
>struct DNS_Response {
> char data[10000];
> int int_data[10000];
> int pos;
>};
の構造体を下記のような感じに少し修正し、流用しました。
/* DNSサーバへの質問 */
struct DNS_Query {
    char data[10000];
    int length;
};
/* DNSサーバからの応答 */
struct DNS_Response {
    int int_data[10000];
    int pos;
};
今まで int_data と pos の 2 つの引数を渡していたところが、
struct DNS_Response だけを渡せばよくなったので、
分かりやすくなったかなと思います。

・ linux 版の warning を解消しました。
てっきり netdb.h を include したら
sys/socket.h なども include してくれるものだと勘違いしておりました。
そのため、いままでの作ってきた他のソースでも warning がたくさん出ておりました。
大変勉強になりましたm(__)m。

・ AAAA の表示を仕様に添った形に変更しました。

そんな感じに修正を施した現状のソースをアップロードしておきます(linux版)。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1091.txt

後、指摘された部分で残っている修正点は
・ hoge_print 関数の書き方
・ >>4395 全般
くらいかなと思います。
直したつもりで、意図に沿っていない修正をしている箇所はあるかもしれませんが(^^;。

他には、個人的に「フラグを構成する各要素」を
resolver-1.pl のように簡単に設定出来た方が良いかなと思ってます。
私のソースでは、下記一行で設定してしまってるのがいまいちかなと。
DNS_packet->flag = 0x0100;
ビットフィールドあたりで記述してうまく動作すれば良いのですが。
もっともここ自体は今回のソースでは変更することはなさそうなので、
このままでも良いのかもと思ったりも…。

No. 4397 # DNS勉強中 2005/11/15 (火) 17:14:29
>>4395 68user
今まで一つのソースで完結するものばかり書いていたので、
static の付いたグローバル変数(内部結合グローバル変数)を
使った事はありませんでした。
大変勉強になりました。

後、グローバル変数の宣言を一元管理する方法は存じてなかったので、試してみました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1093.txt
ただ上記は意図に沿った記述かどうか自信がありません。
それと、この件は今回のソースとは直接関係ないという認識で宜しいでしょうか?
仮に提示どおりソースを分割しても
class_list[] は sub.c でしか必要ないのかなと思ったので。

その後修正したもの
・ ソースを main.c, sub.c, var.h に分割しました。
・ 「フラグを構成する各要素」を resolver-1.pl のような感じに変更しました。

main.c(linux版)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1094.c
Makefile(linux版)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1095.txt
sub.c(linux版)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1096.txt
var.c(linux版)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1097.txt

No. 4398 # 68user 2005/11/16 (水) 03:05:19
>>4397 DNS勉強中
> http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1093.txt
> ただ上記は意図に沿った記述かどうか自信がありません。
そういえばわたしには、複数ファイルから参照されるグローバル変数で、
宣言と初期化を同時に行った経験がありませんでした (わたしはこういう
場合は init_hoge() という関数を作るので)。

要は main.c で
    codelist_t class_list[];
    codelist_t class_list[] = {
        {"INTERNET", 1},
        ...
    };
となるわけですが、これはコンパイル通りますか? 少なくとも警告くらいは
出そうな気がします。

普通はどう書くんでしょうね>どなたか

> それと、この件は今回のソースとは直接関係ないという認識で宜しいでしょうか?
その通りです。

その他ソースについて。
> int soa_record_print(struct DNS_Response *DNS_response, char *print, int i)
引数が i というのはかなりいただけないので、record_num あたりで。

> for (i=0; type[i]!='\0'; i++)
> /* 照会タイプの文字の中に英小文字があれば英大文字に変換 */
> type[i] = toupper(type[i]);
そういえば strcasecmp(3) というライブラリ関数があるのを思い出しました
(使ったことはないですが)。

> void qr_print(int qr){
> codelist_t qr_list[] = {
> ...
> };
動作的には問題ありませんが、関数呼び出しのたびにスタックに qr_list の値が
積まれるのは無駄なので、一般的には
      static codelist_t qr_list[] = { ... };
とします。これだとスタックではなくヒープに置かれ、初期化は一度しか行われません。

> Makefile(linux版)
> http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1095.txt
わたしなら以下のように書きますが、あまり Makefile に詳しくないので怪しげです。

    TARGET= domain_to_ip
    OBJS = main.o sub.o
    CFLAGS = -Wall
    $(TARGET): $(OBJS)
            $(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
    .c.o: sub.h
            $(CC) $(CFLAGS) -c $<
    clean:
            rm -f *.o *~ core $(TARGET) $(OBJS)

あと、main がとても長くて汚い関数に見えますので、
    make_query();
    send_receive();
    parse_response();
の 3行か+エラー処理か、あるいは
    make_query();
    send_query();
    receive_response();
    parse_response();
の 4行+エラー処理くらいになるとよいかも、と思いました。

続く。

No. 4399 # DNS勉強中 2005/11/16 (水) 17:13:10
>>4398 68user
1093.txtのソースは何故か警告が出ることも無く、コンパイル出来ました。
定義を二回していますので、仰るとおり何か言われてもおかしくないと思われますが。

ちなみに下記はエラーが出ません。
    #include <stdio.h>
    int a;
    int a = 10;
    int main(void)
    {
        printf("a = %d\n", a);
        return 0;
    }

ただし下記はエラーが出ます。
    #include <stdio.h>
    int main(void)
    {
        int a;
        int a = 10;
        printf("a = %d\n", a);
        return 0;
    }

上記の結果をみると、グローバルでは複数定義してもかまわないのかもしれません。
それと、本来は定義 codelist_t class_list[] = {...} をmain.cに書いて、
宣言 extern codelist_t class_list[]; を sub.c に書くのかも知れません。
ただ、そういたしますと、どうヘッダで一元管理すれば良いか思いつきませんでした。

修正した所
・ soa_record_print の引数
・ codelist_t を auto から static に変更しました。
static はどうしても値を保持し続けておかないといけない物以外には
使う必要がないと思ってました。
auto なら不要になったら解放されますし。
メモリ領域は、よく分かってないので勉強になります。
・ main 部分を
    preprocessing(); … 前処理
    make_query(); … 照会用の DNS パケットを作成
    send_query(); … DNS サーバに問い合わせを送信
    receive_response(); … DNS サーバからの応答を受信
    parse_response(); … DNS サーバからの応答を解析
に集約しました。

分からなかった所
・strcasecmp は、「大文字/小文字を無視して二つの文字列を比較する」そうですが、
私のソースでどうすれば有効活用出来るか分かりませんでしたので、使用しておりません。

それと Makefile のサンプルありがとうございません。
その記述で動作することを確認しました。
その書き方ですと、ソースファイルが増えても OBJS に追加するだけで良いので、
大変助かりました。

現状のソース(linux版(1ソース版))
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1101.txt
上記のソースは今までと少し動作が違いまして、
【実行ファイル DNSサーバ 名前解決ホスト名】
と入力しますと、回答が得られるまで名前解決を行います。

現状の問題点
・ リソースデータがドメイン名だけで、IPアドレスの情報が無いと名前解決が出来ない。
例) 198.41.0.4 www.livedoor.co.jp
zns05.data-hotel.net と zns06.data-hotel.net しか返してくれません。

get_domain(); で、ドメイン名のラベルの部分を出力し、
print_domain(); で【.】を出力し、
ドメイン名の終端に達するまで両関数間を行ったりきたりしているのが原因です。

DNS サーバが IP アドレスでしたら、
a_record_print(); で姑息に sprintf で抜き出せたのですが。

そう考えますと、以前仰られていた

> あと、hoge_print 関数も、わたしはこういう書き方をせずに
> char *a_record_print(int_buf, search);
> と文字列を返すほうですが、メモリ確保を行うのは呼び出し側か、関数の
> 中で static に持つか、など悩ましいです。すっぱり割り切って関数内で
> printf するのも、保守性はともかく可読性は悪くない、と思いました。

の部分が非常に重要かなと思いました。
文字列を上位に返すようにしていれば、流用もしやすかったのかなと。
そういう部分も保守性なのかなと思いました。

No. 4400 # DNS勉強中 2005/11/17 (木) 17:11:38
to 68userさん
急な話ですが、昨日の夜に就職が決まりまして、
来週月曜日からの勤務となりました。
そのため研修は明日で修了となりました。
そして課題の提出も明日となりました。
そのため、ご指摘いただいた箇所すべてを訂正して、
提出することは無理かなと言う感じです。
いろいろ教えていただきましたが、
それらをすべて反映できないことはお許しください。

修正したところ
・ hoge_print 関数を文字列を返す形に変更(それに伴い関数名も変更)

resolver-1.pl 互換を目指した Linux 版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1107.txt

学校の課題用に上記ソースを修正した Linux 版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1108.txt

表示イメージは下記のとおりです。

実行ファイル名 198.41.0.4 www.livedoor.com
DNSサーバ【198.41.0.4】に【www.livedoor.com】の名前解決を依頼
DNSサーバ【198.41.0.4】からの受信データバイト数: 506バイト
DNSサーバ【192.12.94.30】に【www.livedoor.com】の名前解決を依頼
DNSサーバ【192.12.94.30】からの受信データバイト数: 120バイト
DNSサーバ【203.174.65.123】に【www.livedoor.com】の名前解決を依頼
DNSサーバ【203.174.65.123】からの受信データバイト数: 136バイト
回答(1): リソースデータ: 203.131.197.197

nslookup のような感じの表示に近づけつつ、
実際に再帰的に DNS サーバに問い合わせを行っている事を視覚的にアピールしつつ、
提出期限が迫っているので、現状のソースをなるべく触らない方向でまとめてみました。

なお学校の課題用は最近取り掛かったこともあり、
完成度は前者に比べかなり劣ってます
(実用に耐えれないという意味ではどちらも同じですが)。

No. 4401 # 68user 2005/11/18 (金) 05:26:21
>>4400 DNS勉強中
おめでとうございます。向上心のある方のように見受けられますので、どんな
業界でも能力を発揮できることと思います。ご活躍を期待しております。

わたしの方は指摘点をまとめているところですが、あまり時間が取れず
進んでいません。課題提出後なので意味はありませんが、中途半端なのは
気持ちが悪いので、infoseek の方はしばらくそのままにしていただけると
ありがたく思います。

No. 4402 # DNS勉強中 2005/11/18 (金) 18:39:49
>>4401 68user
ありがとうございます。
それと本日は作成したプログラムのドキュメント作成などで時間が取れなかったので
結局 >>4400 のソースを二つとも提出しました。

後、指摘点をまとめていただいていると言うことでどうもありがとうございます。
私のほうでも修正し次第アップロードします。

それとアップロード先の infoseek ですが、
私の管理下に無いアップローダにアップロードしております。
そのため何時消えてしまうか分からないのが現状です。
もっとも一年近く前のアップロード品も残っているようなので、
大丈夫だとは思います。

消えたら別の場所にアップロードします。

No. 4403 # DNS勉強中 2005/11/22 (火) 22:13:22
今日は仕事が休みで時間があったのでソースコードを修正しました。
resolver-1.pl 互換を目指した Linux 版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1142.zip

修正点
・自作関数が文字列を返すことに伴い、グローバル変数が増えてしまったので、
ローカル static 変数に変更しました。
・原則 1 つの関数につき、 1 つのソースコードにしました。
そのためソースファイル数が 30 あまりになりました。
ただし、グローバル変数の宣言の定義がよく分からなかったので、
class_list と type_list 関係は type_and_class.c でひとまとめにしました。
・関数の流れ図?を簡易的に表した html を作成しました。

No. 4404 # DNS勉強中 2005/11/27 (日) 17:36:49
resolver-1.pl 互換を目指した Linux 版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1160.zip

微修正を加えただけです。
ただこれで、指摘していただきました問題点についてはすべて対応したつもりです。

それと、昨日引越しを伴う出向を言い渡されました。
当分の間ネットにつなげる環境も開発環境も無いと思われます。
そのため何かご指摘いただいても、返答を差し上げることは出来ないと思います。
よろしくお願いします。

No. 4405 # SSL初心者 2005/11/28 (月) 14:44:25
こんにちは。
だいぶ前に書き込みをしたものですが
今回自力で何とかしてみようとふんばってみたものの、
2週間近く解決できません
助言をお願いいたしたく書き込みをしました。

SSLを↓のHPを参考に設定してみました
http://www.rinzo2.jp/~rinzo/apache_ssl/apache_and_ssl_00.htm
何とか起動はしたんですが、
当初の目的では、
課題として作成したmysqlとJSP(Tomcat4.1)を使用し
作成したjspファイルを
SSLの状態で表示させることでした。

例)
http://localhost:8080/examples/index.jsp

https://localhost:8080/examples/index.jsp
の形に


何とかできないかと、Apache2とTomcatを連携させてみたものの
できませんでした。
もともとできないのかもわからず、
書き込んでみました。

あたりまえのことができてない
といった返答でもいんで
なるべくわかりやすく
助言のほどお願いします。

設定等で疑問のほどありましたら
わかる範囲で答えますんでよろしくお願いします

No. 4406 # fan lihong [E-mail] 2005/11/29 (火) 14:38:50
はじめまして、ファンと申します。上海から来ました。いまrsaを勉強していますが、
ちょっと困った事があったので、教えてもらいたいです。
pkcs#1中で、rsa暗号化処理前に、暗号プロックフォーマット処理が必要になりますが、
もし、rsa_no_paddingモードを使用なら、暗号プロックフォーマットの処理必要が
なくなりますか。宜しくお願いいたします。

No. 4407 # びすこ 2005/11/29 (火) 21:22:32
はじめまして
SSL/TLS でアクセスしてみよう (2)を参考にHTTPSでの接続を行っていたのですが、
2回目のSSL_writeに対して、SSL_readの戻り値(文字列長)が0になってしまいます。

https-client-2.c の167〜187行をfor文に入れて2回呼んだ場合も同じように
2回目は文字列長が0で返ってきました。

リクエスト送信のたびにSSL_CTX_freeまで行って、次回は再接続から行わないとだめなのでしょうか?

No. 4408 # 68user 2005/12/01 (木) 01:41:34
>>4404 DNS勉強中
すみません、まだ書いている途中です。と言ってもそんなに長くはないんですが、
気力充実待ちの状態です。もう見ておられないとは思いますが、今月中には何とか。

>>4405 SSL初心者
とりあえずできることはできるでしょう。Tomcat 単体でも SSL に対応しているし、
Apache と Tomcat で連携するなら mod_jk とか mod_webapps とか mod_jk2 とか
いろいろあるようですが、わたしが使ったのは 4年ほど前なので最新事情はよく
わかりません。

何をどこまでやって、どううまくいかないのか書いていないので何もアドバイスは
できませんが、とりあえず
      http://www.mki.ne.jp/developers/doc/https/apache20.html
を真似てみればよいのではないでしょうか。


と思ったら、今は Jakarta Tomcat Connectors って言うんですかね? それとも
mod_jk に戻った? この辺は相変わらずめちゃくちゃですね。
      http://tomcat.apache.org/connectors-doc/index.html


>>4406 fan lihong
> もし、rsa_no_paddingモードを使用なら、暗号プロックフォーマットの処理必要が
> なくなりますか。
暗号ブロックフォーマットは PKCS#1 の一部ですから、RSA_NO_PADDING なら必要
ないと思います。

>>4407 びすこ
> https-client-2.c の167〜187行をfor文に入れて2回呼んだ場合も同じように
> 2回目は文字列長が0で返ってきました。
https-client-2.c の HTTP リクエスト部分をそのまま 2回繰り返すだけなら
そうなるでしょうが、それは SSL の問題ではなく単なる HTTP の仕様です。

接続したまま何度もリクエストしたいなら HTTP/1.1 で Connection: keep-alive
を付けたりします。とりあえずは、telnet で HTTP を話して試すべきです。

No. 4409 # hagu 2005/12/02 (金) 12:40:44
awkを使用してカンマ区切りのCSV形式のファイルから指定したフィールド位置
の値を取得しようとしているのですが、以下の様にするとファイル名までが
表示されてしまいます。
正しく、表示するよにはどうしたらいいのですか。

実際には、以下の様に出力されます。
ファイル名:20051201 : 1
ファイル名:20051202 : 3

を以下の様に出力したいのです。
20051201 : 1
20051202 : 3

環境は、Solaris8i Bシェル

--------------------
ファイル
年月,名前,ID,値1,値2,値3
20051201,山田 太郎,001,1,1,1
20051201,山田 花子,001,1,2,10
-------------------

第1パラメータ:年月(YYYYMM)
第2パラメータ:ID
--------------------
#!/bin/sh
#

grep $2 ./$1/DiskCapacityTotal_Daily_$1*.csv | awk -F"," '{printf("%s : %s\n",$1,$4)}'
----------------------

No. 4410 # 68user 2005/12/02 (金) 13:37:40
>>4409 hagu
grep に -h オプションを付けるとか、sed で s/^[^:]*// するとか。

No. 4411 # yasu 2005/12/02 (金) 23:15:35
>>4409 hagu
FreeBSDでやってみたら、正しく表示されましたが。。

No. 4412 # 2005/12/03 (土) 01:27:30
>>4410 68user
>>4411 yasu

ありがとうございます。

$1ではなく、$2とか$3と指定すると正しく表示されます。
ファイル名がててきません。

grep $2 ./$1/DiskCapacityTotal_Daily_$1*.csv | awk -F"," '{printf("%s : %s\n",$2,$4)}

No. 4413 # だん 2005/12/03 (土) 09:35:22
>>4409 hagu

grep $2 ./$1/DiskCapacityTotal_Daily_$1*.csv | awk -F"," '{printf("%s : %s\n",$1,$4)' | sed 's/^[^:]*//'

としたとき、ファイル名は消えたのですが、
$1の値を表示した際、前に「:」が残ります。
消したいのですが。

------------
:20051201 : 1
:20051202 : 3
となります。

No. 4414 # zsh 2005/12/03 (土) 14:06:35
>>4413 だん
・・・・まあgrep自体なくても出来るというのは置いといて。

そもそも「ファイル名:」を付加しているのはgrepなんだから、
4410で68userさんが仰っているように、
grepに-hオプションをつけるだけだと思いますが、
こちらは試しましたか?

No. 4415 # びすこ 2005/12/05 (月) 21:24:30
>>No. 4408 68user

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

HTTPでのお試しソースにはConnection: keep-aliveがあって、
HTTPSの方では抜けているのに気がついていませんでした。

HTTPの方でも判ってて書いてたわけではないので、
リクエストについてもっと調べてみます。

No. 4416 # はる 2005/12/06 (火) 19:25:59
はじめまして。
ここのソースを参考にさせてもらい、Mac OSX用のFTPクライアントを以前作りました。
今回、POPクライアントを作ろうと思うのですが、C言語で書かれたシンプルなPOPクライアント
のソースってないもんでしょうか?
今のところネットを検索していて、
http://www.oss-watch.ac.uk/resources/emailclients.xml
にあった、mutt-1.5.10というのがまあまあかと見ていますが、やや面倒。
よろしくお願いします。

No. 4417 # 68user 2005/12/06 (火) 22:21:34
>>4416 はる
fetchmail の前身である popclient はどうでしょうね。
    http://www.interlog.com/~esmith/flames/pop.html
から popclient-2.21 が落とせますが、手ごろなサイズで、それなりにソースも
キレイではないかと思います。

% wc -l *.[ch]
      58 config.h
    535 pop2.c
    533 pop3.c
    592 popclient.c
      93 popclient.h
    175 socket.c
      71 socket.h
  2057 合計

手元の Linux でコンパイルすると可変長引数あたりでこけましたが、適当に直せば
動くでしょう。

No. 4418 # はる 2005/12/07 (水) 07:27:04
>>4417 68userさん
これよさそうですね。
cソースが4つしかないし、pop3.cだけ見ていれば分かりそう。
コンパイルは通らなくてもOKです。これを元にいじってしまいますから。
どうもありがとうございます!

No. 4419 # KA 2005/12/07 (水) 13:10:25
こんにちわ。
シェルにて簡単なメニュー画面作成しているのですが、
一点困ったところがあるので教えてください。
本シェルはrshによって呼び出されていて親シェルとは違うサーバで起動しています。
メニュー画面という事で画面上の掃除のためclearコマンドを使用しているのですが、
rshで呼び出された場合はclear処理が行われておりません。
ローカルでの実行では勿論問題なくclearされます。
rshにて実行する場合画面のclear方法などがご存知でしたら教えてください。
よろしくお願いします。

No. 4420 # 68user 2005/12/08 (木) 00:26:55
>>4419 KA
状況がよくわかりませんが (rsh でコマンドを指定せず実質的には rlogin を
使用するのと同じなのかとか、rsh 先で端末が割り当てられているのかとか、
端末の種類が違うだけなのかとか)、とりあえず
    % clear > clear.txt
としてシーケンスを保存しておき、そのデータを出力してはどうでしょうか。

No. 4421 # cafe 2005/12/08 (木) 09:58:39
cronの変更方法を教えて下さい。

Cシェルの場合は以下コマンドでviが開きます。
setenv EDITOR vi
cd /var/spool/cron/crontabs
crontab -e root

shシェルの場合はsetenvが使用できないので
以下コマンドを使いましたが982とか数字がでてきてviが開きません。
EDITOR=vi
export EDITOR
cd /var/spool/cron/crontabs
crontab -e root

shシェルでのcrontab -e rootの起動はどうづれば良いのでしょうか。

No. 4422 # cafe 2005/12/08 (木) 10:16:19
cronの編集について教えて下さい。

Cシェルの場合は以下の方法で編集しています。これでviが起動できます。
setenv EDITOR vi
cd /var/spool/cron/crontabs
crontab -e root

shシェルの場合、以下コマンドを使用しましたがWAIT状態になりviが起動
できません。起動の方法を教えて下さい。
EDITOR=vi
export EDITOR
cd /var/spool/cron/crontabs
crontab -e root

No. 4423 # 2005/12/08 (木) 16:58:58
初めて質問させていただきます。よろしくお願いします。
マシンはUNIX(日立:HI-UX/WE2)です。
cronで1分間隔でシェルを起動しているのですが、mail情報を
削除していなかったため、大量に溜まってしまい「out of i-nodes」の
メッセーシ゛が出力され、dfコマント゛で確認するとi-nodesが0となっていました。
/usr/spool/mqueueには50万件のmailがたまっています。
また、mailboxも大量にたまり、mailbox.lockというlockファイルができています。
上記内容について、対処方法がありましたら教えてください。
(cronでmail情報を制御する方法は当ホームページで理解できました。)
以上 よろしくお願いします。

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

No. 4424 # 68user 2005/12/09 (金) 00:35:57
>>4422 cafe
手順としては間違っていないと思います (cd は不要ですが)。何がどうなっていて
WAIT 状態と判断したのかわからないので、これ以上は何とも言えませんが、普通に
      % vi 適当なファイル名
で編集はできないのなら vi の問題でしょう。

>>4423
ファイル数が多すぎるので、df で i-node が full になっているファイルシステム内の
ファイルを削除してください。

> mailboxも大量にたまり、mailbox.lockというlockファイルができています。
おそらく dotlock なファイルでしょうけど、いつまでたっても消えないなら
消していいと思います (心配なら MTA などのサーバ類を終了してから)。

No. 4425 # fan 2005/12/12 (月) 17:46:30
回答ありがとうございました。無事RSAの確認できました。
sslv3のFinishedメッセージのことで質問ですが、
ClientKeyExchangeの後のEncrypted HandshakeはFinishedのことでそうか。
あと、Finishedメッセージはmd5_hash[16]+sha_hash[20]と他に何がついてますか。
あと、md5_hash[16]+sha_hash[20]の値が一致しないのですが、何かアドバイスを
いただけないでしょうか。
宜しくお願いします。

No. 4426 # shin1 2005/12/16 (金) 00:33:37
こんばんは。初めて質問させていただきます。
AIXのサーバ上で「各レコードに改行コードが付いておらずファイルの最後に
EOF(0a00)だけが付いているファイル」を2個連結したいのですが、
単純にcatで連結すると、2つのファイルのレコードの間に(0a)が入ってしまいます。
(例)
ファイル1→  xxxx0a00
ファイル2→  yyyy0a00   の場合
cat ファイル1 ファイル2 > ファイル3 とすると
ファイル3→  xxxx0ayyyy0a00  となってしまうが、実は以下のようにしたい

ファイル3→  xxxxyyyy0a00

シェルまたはコマンドを用いて(C言語でプログラミングしない)で、
簡単に上記の形でファイルを連結する方法がありましたら教えて頂けないでしょうか?
よろしくお願いします。

No. 4427 # 68user 2005/12/16 (金) 01:53:00
>>4425 fan
SSL クライアントを実装したことがないのでわかりません (短めのサンプル
ソースを出してもらえばわかるかもしれませんし、やっぱりわからないかも
しれません)。

>>4426 shin1
> AIXのサーバ上で「各レコードに改行コードが付いておらずファイルの最後に
> EOF(0a00)だけが付いているファイル」を2個連結したいのですが、
0x0A は LF、0x00 は NULL 文字で、EOF ではありません。

コントロールコードにおける EOF は 0x1A です (が、UNIX や Windows で
別にファイル終端コードとしての意味を持つわけではない)。

というわけで何を削除したいのかよくわかりませんが、0x1A ならば
    http://x68000.q-e-d.net/~68user/unix/pickup?tr
など。

0x0A ならば、他の LF も削除してしまうと困るでしょうから、最後の
1バイトを削るのがよいでしょう。sed とか head とか dd とか perl とか
を使えばできるのではないかと思います。

No. 4428 # kevin 2005/12/16 (金) 17:37:44
教えてください。DOSのコマンドで、チェックサムを自動で
計算するコマンドはあるのでしょうか?
例)JX12345-04のチェックサム(E0)を知りたい場合

No. 4429 # tamama 2005/12/17 (土) 17:53:52
こんにちは、初めて質問させていただきます。
こちらに載っているOpenSSLを用いたRSA暗号を動かして見たいので、
Windows上でのOpenSSLのインストールの仕方を教えてもらえませんか。
OSはXPでVisual C++.NETを使っています。

No. 4430 # tamama 2005/12/18 (日) 14:10:38
お騒がせしました。
自己解決しました。

No. 4431 # まっちゅう@ペガサス流星拳 2005/12/21 (水) 14:11:13
こんにちは!!
HP-UNIXなんですが、どなたか教えてください。
lsコマンドのタイムスタンプを常に西暦を表示するようにしたいのですが
そのままls -l では直近6ヵ月未満までは西暦がでません。
該当するオプションがあるのでしょうか?
ちなみに-Tはだめでした。
よろしくお願いします。

No. 4432 # 68user 2005/12/22 (木) 13:15:43
>>4431 まっちゅう@ペガサス流星拳
HP-UX 標準の ls では無理だと思います。代案としては、
    - tar cf - ファイル | tar tvf -
    - sed で置換
    - perl などを使う
など。

No. 4433 # fan 2005/12/22 (木) 15:05:38
ありがとうございます。
運良くFinishedメッセージは解決できました。
その次のAppricationDataの暗号化で質問があるのですが、
SSLCompressedが良く分からないです。
もし、ご存知なら、教えていただけないでしょうか。
お願いします。お願いします。

No. 4434 # まっちゅう@ペガサス流星拳 2005/12/22 (木) 17:23:10
やっぱり無理ですか。。。。
代案までありがとうございました。

No. 4435 # hagu 2005/12/24 (土) 15:23:32
tarコマンドで、コマンドの実行ディレクトリからサブディレクトリも含めて、
ワイルドカードで指定したファイル、例えば、「*.txt」の様に指定して、
すべてのファイルを1つのアーカイブにまとめたいのですが、可能なので
しょうか。
ディレクトリも含めたかたちにしたいのですが。

tar -cvf aaa.tar *.txt だと、直下のファイルのみ
tar -cvf aaa.tar *.* だと、すべてのファイル

No. 4436 # zsh 2005/12/24 (土) 22:29:16
>>4435 hagu
いくつか方法はあると思いますが、
$ find . -name "*.txt" | xargs tar cvf outfile.tar
等とすればできます。

No. 4437 # hagu 2005/12/24 (土) 23:07:40
>> 4436

ありがとうございます。
試してみます。

No. 4438 # 68user 2005/12/25 (日) 22:17:24
>>4436 zsh
Solaris の xargs (だったような気がしますが) は、LINE_MAX の長さがかなり
短くて、たしか 10KB 程度しかなかったような気がします。この使い方だと
複数回 tar コマンドが実行された場合、最後の方しかアーカイブに含まれない
ので注意が必要です。

No. 4439 # DNS勉強中 2005/12/26 (月) 00:16:19
>>4408 68user
亀レスすいません。
DNS のプログラミングのアドバイスをしていただいたものです。
出張先の住まいがレオパレスでネット環境があると聞いていたので、
すぐに閲覧できると思いましたが、いろいろ問題があり今までかかりました。
今後は普通に対応できると思います。
よろしくお願いします。

No. 4440 # zsh 2005/12/26 (月) 10:44:00
>>4438 68user
ご指摘ありがとうございます。
確かに複数回実行された場合の考慮が漏れていました。
ちなみに、Solaris の LINE_MAX の値は 2KB のようです。

No. 4441 # hagu 2005/12/26 (月) 11:49:22
>>4438 68user
>>4440 zsh

試して見ました。
ご指摘の通りでした。

標準出力には、すべて出てきましたが、
最後の方しかアーカイブに含まれていませんでした。

どう対応すればよいのですか。

No. 4442 # とーりすがり 2005/12/26 (月) 22:08:58
>>4441 hagu

カナリ遅いですが.

cat /dev/null>outfile.tar && find . -name "*.txt" | while read F in; do tar rvf outfile.tar "$F"; done

No. 4443 # 不明5号 2005/12/26 (月) 22:55:20
サーバーアドレスの見方はどうすれば??教えてください!

No. 4444 # zsh 2005/12/26 (月) 23:37:46
>>4441 hagu
試してませんが、
$ find . -name "*.txt" | xargs tar rvf outfile.tar
でいけると思います。
(tar は r を指定すると追記になります。)

No. 4445 # 68user 2005/12/27 (火) 00:30:52
>>4439 DNS勉強中
宣言した「今月中」もあと残すところ 6日。一度言ったことは守れよ、と
自分にプレッシャーをかける毎日です。

>>4441 hagu
その他。
    - tar cf outfile.tar `find . -name "*.txt"`
        (長すぎると Argument list too long になるが、エラーかどうかがはっきり
          わかるので使えなくもない)
    - tar の、ファイル名一覧をファイルから取得するオプションを使う。

>>4443 不明5号
質問の意味がわかりません。

No. 4446 # 2005/12/28 (水) 00:16:05
>>4445 68user
>>4444 zsh

ありがとうございます。
試してみます。

>tar の、ファイル名一覧をファイルから取得するオプションを使う。
探して見たのですが、使い方がわかりませんでした。
使い方教えてください。

No. 4447 # hagu 2005/12/28 (水) 00:17:47
>>4445 68user
>>4444 zsh

ゴミすみません。
名前のところに”お”が入ったままで書いてしまった。

ありがとうございます。
試してみます。

>tar の、ファイル名一覧をファイルから取得するオプションを使う。
探して見たのですが、使い方がわかりませんでした。
使い方教えてください。

No. 4448 # 68user 2005/12/28 (水) 03:44:29
>>4447 hagu
http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?howtouse にあるように、
OS 名を明らかにすれば期待する回答が返ってくる可能性が高まると思われます。

No. 4449 # hagu 2005/12/29 (木) 09:27:24
>>4448 68user

すみません。
UNIXで、Solaris8 です。

No. 4450 # zsh 2005/12/29 (木) 11:07:56
>>4449 hagu
man tar で出てきますが・・・
http://docs.sun.com/app/docs/doc/816-3518/6m9ptvr58?l=ja&a=view

No. 4451 # 68user 2005/12/29 (木) 13:06:57
>>4449 hagu
具体的には
    % find . -name "*.txt" > filelist.txt
    % tar cf outfile.tar -I filelist.txt
てな感じで。手元に Solaris がないので動くかどうかはわかりません。

No. 4452 # 68user 2005/12/31 (土) 18:25:28
>>4404 DNS勉強中
> resolver-1.pl 互換を目指した Linux 版
> http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1160.zip
今月中にと宣言したのでレビューをしようとしたのですが、上記ファイルが
not found になっていて見ることができませんでした。

自宅のマシンには以前ダウンロードしたファイルがあるかもしれませんが、
今は出先なので見ることができません。もたもたしていてすみません。

とりあえず、1関数 1ソースはやめた方がよいとわたしは考えます。普通は
    プログラム全体 > モジュール > 関数 > ブロック
という階層構造があり、例えば変数については
    - グローバル変数にする
    - ファイル内で static としてそのソース内 (モジュール) からのみ参照できるようにする
    - 関数内のローカル変数にする
などの選択肢がありますが、1関数 1ソースだと、ここで言うモジュールという
選択肢がなくなってしまいます。

あとは Makefile を書くのがダルい、というデメリットもありますね。

No. 4453 # DNS勉強中 2005/12/31 (土) 23:36:08
>>4452 68user
すいません。
アップロードしなおしました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1374.zip
ただこれは1関数1ソースバージョンです。
今出張先でこのソースバージョンしか持っていないです。
それと1関数1ソースのデメリット分かりました。
特にMakefileは書いてて同じ事を感じてました。

No. 4454 # DNS勉強中 2005/12/31 (土) 23:56:31
一応1ソースバージョンもアップロードしました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1375.zip
ただこれは学校に提出したバージョンのため、>>4453のソースの1つ前のバージョンのソースとなります。

No. 4455 # 68user 2006/01/09 (月) 05:54:07
>>4453 DNS勉強中
> http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1374.zip
そろそろケチをつけるところもあまりなくて、重箱の隅的ではありますがいくつか。

> char *tc_search(int tc){
> static char tc_result[20];
> ...
> return tc_result;
> }
こういうふうにしてしまうと
      char *p = tc_search(tc_1);
      char *q = tc_search(tc_2);
という使い方ができなくなります (p が指す内容が上書きされてしまうため)。
スレッドセーフでなくなるのと、利用者のレベルが低ければ余計なバグを生む
危険性があります。

UNIX のライブラリ関数でも、最初は localtime・ctime・strtok・gethostbyname などの
非スレッドセーフ版しかありませんでしたが、localtime_r・ctime_r・strtok_r・
gethostbyname_r などのスレッドセーフ版を用意する羽目になってしまいました。

承知の上でそうしておられるならば問題ないと思います。

> /* フラグ一覧を出力 */
> qr = (DNS_response.int_data[DNS_response.pos] & 0x80) >> 7;
> printf(" QR: (Query/Response): %s\n", qr_search(qr));
>
> opcode = ((DNS_response.int_data[DNS_response.pos] & 0x40) >> 6) * 8;
> opcode += ((DNS_response.int_data[DNS_response.pos] & 0x20) >> 5) * 4;
> opcode += ((DNS_response.int_data[DNS_response.pos] & 0x10) >> 4) * 2;
> opcode += (DNS_response.int_data[DNS_response.pos] & 0x08) >> 3;
> printf(" OPCODE: %s\n", opcode_search(opcode));
わかりやすい変数名を使うこと自体は非常によいのですが、同じ値を繰り返し
使用する場合は、

    int flag = DNS_response.int_data[DNS_response.pos];
    qr = (flag & 0x80) >> 7;
    printf(" QR: (Query/Response): %s\n", qr_search(qr));

    opcode = ((flag & 0x40) >> 6) * 8;
    opcode += ((flag & 0x20) >> 5) * 4;
    opcode += ((flag & 0x10) >> 4) * 2;
    opcode += (flag & 0x08) >> 3;
    printf(" OPCODE: %s\n", opcode_search(opcode));

などと一時変数に代入することをお勧めします。狙いは可読性向上と、変更時の
修正ミス防止です。わたしの場合は、

      for ( int i=0 ; i<length ; i++ ){
            struct *hoge_p = hoge_list.buf[x];
            printf("%s\n", hoge_p->foo);
            printf("%s\n", hoge_p->bar);
            printf("%s\n", hoge_p->baz);
      }

などと、ループ中でもよく一時変数に代入します。これは、ループ先頭の

      struct *hoge_p = hoge_list.buf[x];

で、

    このループ中で参照するのは hoge_list.buf[x] だけ。hoge_list.buf[x+1] を
    参照したりはしないよ。

というメッセージを送っているつもりです (効果があるかどうかは知りませんが)。

> DNS_query->data[0] = DNS_packet->id >> 8;
> DNS_query->data[1] = DNS_packet->id & 0xff;
> ...
> DNS_query->data[11] = DNS_packet->ARCOUNT & 0xff;
> for (i=12, j=0; i<12+domain_length; i++, j++)
> DNS_query->data[i] = DNS_question_record->Name[j];
この場合は、変更時の作業量削減とマジックナンバ排除のため一時変数を使うべきです。

      char *data_p = DNS_query->data;
      *(data_p++) = DNS_packet->id >> 8;
      *(data_p++) = DNS_packet->id & 0xff;
      ...
      *(data_p++) = DNS_packet->ARCOUNT & 0xff;
      for ( i=0; i<domain_length; i++)
              *(data_p++) = DNS_question_record->Name[i];


> FLAG flag_list[] = {{ /* 外側の中括弧は構造体の、内側の中括弧は配列の初期値を示す */
> 0,
> ...
> }};
>
> return ((flag_list->qr * 128 + flag_list->opcode * 8 + .... ));
FLAG flag = {
      0,
      ...
};
return (flag.qr*128 + flag.opcode*8 ... );

でよいと思います。あと、ビットシフトをしたい場合は乗算ではなく、>> や << で
表現した方が素直かなと思いました。

> int make_question_record(struct DNS_Question_Record *DNS_question_record,
> int argc, char *hostname, char *type, char *class){
> /* 照会タイプが何も入力されていなければデフォルトの A を代入する */
> if (argc >= 4)
> strcpy(query_type, type);
> else
> strcpy(query_type, "A");
ここまで argc を引っ張らず、もっと上位の関数で query_type を設定すべきと
思います (preprocessing あたりで)。

argc を引っ張りすぎると、もし引数のインタフェースを変更した場合、ソース
全体を調べて argc 関連の部分を修正することになってしまいます。

> /* DNS_response_before_conv->recv_bufはchar型なので、
> その中に格納されている数字は+127(0000007e)までしか表現できない */
しょーもないことですが、複数行のコメントは

    /* DNS_response_before_conv->recv_bufはchar型なので、
      * その中に格納されている数字は+127(0000007e)までしか表現できない
      */

などと書けば、grep したときにその行がコメントであることが一目でわかります。

> goto comp2;
再起であれば、これまでの状態を脳内スタックに積んで、新たに呼ばれた関数の
引数と戻り値だけを考えればいいですが、こういう goto は覚えておかなくては
ならない状態が多すぎるので、こういう goto はわたしは使いません (というか
頭が混乱してしまうので使えません)。

わたしは、エラー発生時の脱出以外で goto を使わない派です。


1ヶ月以上引っ張ってしまったわりに、たいしたレビューができませんで
申し訳ないです。

No. 4456 # 68user 2006/01/09 (月) 06:03:21
新版 UNIX 由来/読み方辞書
    http://X68000.q-e-d.net/~68user/unix/unix-term-dic.html
なるものを作ってみました。

元々あったオリジナルが 200個、わたしが追加したのが 60個程度です。
オリジナルの記述を読んでると時代を感じますね…。

No. 4457 # Netboy 2006/01/09 (月) 19:35:41
a.outでtypo指摘っす

> 実態にそぐわなかくなったが

No. 4458 # 68user 2006/01/09 (月) 20:11:54
>>4457 Netboy
ありがとうございます。今晩修正します。

追加ネタメモ。
abbrev
yum
xargs

No. 4459 # 68user 2006/01/10 (火) 01:14:20
>>4457 Netboy
修正いたしました。ご指摘ありがとうございました。

No. 4460 # mkt 2006/01/10 (火) 23:54:21
このサイトにはいろいろお世話になっております。
UNIX 用語 由来/読み方辞書 も一気に読ませていただきました。
気になった点をいくつか:

・fgrep と Gimp の解説文が途中で切れてしまっているように
    思います。
・記号の 2 項目め(「"」の項と思われる部分)の見出し行が
    抜け落ちてしまってます。

ついでに(思いっきり重箱の隅ですが)、この掲示板の [使い方]
ページにある「敬省略」っていうのも気になります…

No. 4461 # mkt 2006/01/11 (水) 00:05:00
>>4460 mkt
あれ? 全角空白が &nbsp; 4 個に置換されてる…。

No. 4462 # 2006/01/11 (水) 00:13:09
シェルで、2行を1行にする方法につてい教えてください。

cat file.txt

dn: nm=yamada.taro,o=tokyo,o=test.
  co.jp
nm: nm=yamada.taro
o: o=tokyo
o: o=test.co.jp

dn: nm=yamada.hanako,o=oosaka,o=test.
  co.jp
nm: nm=yamada.hanako
o: o=oosaka
o: o=test.co.jp



dn: nm=yamada.taro,o=tokyo,o=test.co.jp
nm: nm=yamada.taro
o: o=tokyo
o: o=test.co.jp

dn: nm=yamada.hanako,o=oosaka,o=test.co.jp
nm: nm=yamada.hanako
o: o=oosaka
o: o=test.co.jp

のようにしたいのですがどうすればいいのですか。
改行となっている次の行の頭は、半角スペースで始まっています。
また、空白行を消したくないのです。
空白行までを、1ブロック(かたまり)として扱いたいのです。

環境
    Solaris8
    Bシェル

No. 4463 # 68user 2006/01/11 (水) 14:56:38
>>4460 mkt
> ・fgrep と Gimp の解説文が途中で切れてしまっているように
> 思います。
ありがとうございます。Gimp は「Gimp の開発中にできたのが Gtk」、fgrep に
ついては「"Fast GREP" は違うでしょ」と書こうとして、そのままになってしまい
ました。とりあえず今晩書きかけの部分を削除したいと思います。

> ・記号の 2 項目め(「"」の項と思われる部分)の見出し行が
> 抜け落ちてしまってます。
これは HTML 生成スクリプトの修正が必要ですので、少し時間がかかります。


fgrep についてメモ。オリジナル版には

    "Fast GREP" または "Fixed string GREP" の略。

とありますが、

    http://www.nurs.or.jp/~asada/FAQ/UNIX/section1.3.html
        fgrep は、長さが決まっている文字列を検索します。"f" は "fast" という意味では
        ありません。事実、"fgrep footbar *c" の速さは、普通、"egrep footbar *.c" の
        速さより遅いのです

    http://www.bsddiary.net/doc/hierarchy.txt
        熟練者: 誰かが速いと言ったのでfgrepを使っている
        ハッカー: 自分で時間を測った結果egrepを使うことにした

などの他の有名な文献と矛盾しています。

    http://minnie.tuhs.org/TUHS/archive_sites.html
を見ると fgrep・egrep が現れたのが V7 で、V7 と 2.10 BSD のソースはほぼ
同じでした (ソースは別)。4.4BSD Lite2 では grep・fgrep・egrep のソースが
一本化されていました。それをふまえた上で man の記述を見ると、
    V7:
        Fgrep patterns are fixed strings; it is fast and compact.
        http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=Unix+Seventh+Edition&format=html

    2.10 BSD:
        Fgrep patterns are fixed strings; it is fast and compact.
        http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=2.10+BSD&format=html

    4.4BSD Lite2:
        The fgrep utility is quick but can handle only fixed strings
        http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=4.4BSD+Lite2&format=html

    FreeBSD 1.0〜6.0:
        Fgrep is the same as grep -F.
        http://www.freebsd.org/cgi/man.cgi?query=fgrep&apropos=0&sektion=0&manpath=FreeBSD+1.0-RELEASE&format=html

    SunOS 4.1.3:
        In general, egrep is the fastest of these programs.
        http://www.freebsd.org/cgi/man.cgi?query=fgrep&apropos=0&sektion=0&manpath=SunOS+4.1.3&format=html

というわけで、fgrep が "Fast GREP" であるという認識があったとすれば、古代の
man の "fast" という記述が原因ではないかと考えます。

あとは、この時代の fgrep が grep・egrep と比べて fast であるかが気になる
ところですが、これは調査する時間と力量がないのでパスということで。

参考:
    http://groups.google.co.jp/group/fj.questions.unix/browse_thread/thread/e8ea37b4d0dd6372/235ce238f717f19c
    http://katsu.watanabe.name/grep/efgrep.html
    http://katsu.watanabe.name/grep/ohpcontents.html


オリジナル版に関わった方々がそうそうたる面子なので、調べずに突っ込みを
いれるわけにもいかず、なかなか大変です。

> この掲示板の [使い方] ページにある「敬省略」っていうのも気になります…
これまで思いっきり「敬省略」だと思っておりましたが、「敬称略」だったのですね。
ひとつ賢くなれました。これも今晩修正予定です。

>>4461 mkt
全角入りソースをコピペしやすいよう、半角空白に置換しています。

No. 4464 # hagu 2006/01/11 (水) 15:55:55
>>4451 68user

返事送れて申し訳ありません。
Solarisで動きました。

No. 4465 # 68user 2006/01/11 (水) 15:57:57
>>4462
sed で何とかできるのかもしれませんが、わたしは sed をよく知らないので、
sh でやるならこんな感じで。

    IFS=''
    buf=''
    use_buf=0

    cat file.txt | while read -r line; do
        case $line in
        " "*)
            tmpline=`echo -n $line|sed 's/^ *//g'`
            buf="$buf$tmpline"
            use_buf=1
            ;;
        *)
            if [ "$use_buf" = "1" ]; then
                echo "$buf"
            fi
            buf="$line"
            use_buf=1
            ;;
        esac
    done

    if [ "$use_buf" = "1" ]; then
        echo "$buf"
    fi

と思ったのですが、最終行が出ません。sh もよくわかってないわたしには解決
できませんでした (GNU bash, version 3.00.14(1)-release (i386-redhat-linux-gnu))。

perl を使ってよいなら
      perl -e 'undef $/; while (<>){s/\n +//g; print}' file.txt
あたりで。

No. 4466 # 68user 2006/01/11 (水) 16:28:01
>>4465 68user
> と思ったのですが、最終行が出ません。
あー、ループ部分がサブシェルになってるからか。
    while read -r line; do
        ...
    done < file.txt
なら OK ですね。

やはり sh でプログラムなんて書くもんじゃないと思う。誰か
      Sh Programming Considered Harmful
を書いてください。

No. 4467 # 68user 2006/01/11 (水) 16:36:25
>>4466 68user
補足。Solaris の sh では
> while read -r line; do
> done < file.txt
でもダメなようですね。

http://blog.goo.ne.jp/cars-kitahefu/e/4190a337427d7a8cfcb5a62f515c6936

No. 4468 # 2006/01/11 (水) 21:32:54
>> 4467

ありがとうございます。

> while read -r line; do
> done < file.txt
はやはりダメでした。

while read line; do
done < file.txt
としたら上手く動きました。

また、
tmpline=`echo -n $line|sed 's/^ *//g'`
では、1行になるのですが、「-n」オプションが邪魔みたいで、上手く編集
できませんでした。

tmpline=`echo $line|sed 's/^ *//g'`
としたら上手くいきました。

No. 4469 # 2006/01/11 (水) 22:08:12
>> 4468

sed 一発で簡単にできるものなのでしょうか。

No. 4470 # zsh 2006/01/11 (水) 23:19:40
>>4469
完璧ではないですが、こんな感じで。
------
sed -e '/^[^ ]\{1,\}/ {
        N
}
s/^\([^ ]\{1,\}.*\)\n \{1,\}\([^ ]\{1,\}\)/\1\2/g' file.txt
------

>>4468
>while read line; do
>done < file.txt
>としたら上手く動きました。

これだけで動きますか?
whileの前に
exec 0<file.txt
とか要りませんでしたっけ?

>>4466 68user
>やはり sh でプログラムなんて書くもんじゃないと思う。誰か
> Sh Programming Considered Harmful
>を書いてください。

私は、どの程度の事までをシェルスクリプトでやるべきか悩みます。
Perlとか使った方が絶対に効率が良かったりするのに、
何故かシェルスクリプトにこだわる人とかいるし・・・
(で、気がつくと自分以外に判らないスクリプトが出来上がっていると。)

No. 4471 # mkt 2006/01/12 (木) 05:14:32
>>4463 68user
お返事いただきありがとうございます。

書きかけだった部分、もう削除しておられますが、いずれまとまった形で
復活するのを期待しています。

fgrep の話、面白いですね。man の記述の違いも。
でもこれ、何となく「fast = (使うのに)手っ取り早い」って訳すと
つじつまが合うような気がしてきました。quick というのも同様。
正規表現を無効にする(できる)点をアピールする感じで。
で、誤解が生じてしまったので表現を改めた、とか。
勝手な推測ですが。

> http://www.bsddiary.net/doc/hierarchy.txt
> 熟練者: 誰かが速いと言ったのでfgrepを使っている
> ハッカー: 自分で時間を測った結果egrepを使うことにした
の原文は
    http://groups.google.co.jp/group/net.jokes/msg/c49a0c0849fe8bb6
だと思うのですが、これより前に投稿されている
    http://groups.google.co.jp/group/net.jokes/msg/c24e7dccf82df3ff
と比べてやけに grep まわりが強調されてますね。

> オリジナル版に関わった方々がそうそうたる面子なので、調べずに突っ込みを
> いれるわけにもいかず、なかなか大変です。
でも今のまんまだと、矛盾が生じちゃってます(↓)。 ;p
    http://x68000.q-e-d.net/~68user/unix/pickup?keyword=fgrep&target=command&partial=on&regexp=on&case=off

> 全角入りソースをコピペしやすいよう、半角空白に置換しています。
あ、それは理解してたんですが、
[使い方]ページに「全角空白は 2 つ分の半角空白(…)に置換されます。」
とあるのに、どうして行頭に入れた全角空白 1 個が「&nbsp; 4 つ」
に置換されちゃったんだろう? と思った次第です。
# 今回は全部半角空白にしてみた。

No. 4472 # mkt 2006/01/12 (木) 05:20:48
なるほど、半角空白 1 個が「&nbsp; 2 つ」になってるのか…。
失礼しました。

No. 4473 # if 2006/01/12 (木) 11:14:17
>>4462

RFC2822 の folding を戻すのと大体同じですね。

sed -e ':loop' -e '$b' -e 'N;/\n /{s/\n *//;b loop' -e '};P;D;b loop'

でどうでしょうか?
見やすくすると
#!/usr/bin/sed -f
:loop
$b
N
/\n / {
                s/\n *//
                b loop
}
P
D
b loop

No. 4474 # 2006/01/12 (木) 23:49:57
>>4470 zsh
>>4473 if

ありがとうございます。
今、時間がありませんが、試してみます。

シェルスクリプトよりもPerlですか。

No. 4475 # 2006/01/12 (木) 23:54:24
>>4470 zsh

>これだけで動きますか?
>whileの前に
>exec 0<file.txt
>とか要りませんでしたっけ?

要りませんでした。
while read line; do
done < file.txt
または、
while read line
do
done < file.txt
で動きました。

No. 4476 # zsh 2006/01/13 (金) 15:03:09
>>4475
Solaris9のsh

No. 4477 # zsh 2006/01/13 (金) 15:07:31
>>4475
Solaris9のshで確認しましたが、
やはりwhileの前に
exec 0<file.txt
を入れないと、最終行が表示されません。
恐らく、元のファイルの最終行が空行なので問題ないのだと思います。

>>68user様
記述途中で送信してしまい、大変失礼しました。

No. 4478 # DNS勉強中 2006/01/14 (土) 14:05:00
>>4455 68user
ご指摘ありがとうございます。
スレッドセーフやマジックナンバなどは考えておりませんでした。
それと goto の部分は使いたくなかったのですが、うまくプログラムの流れを制御できなかったためやむなく使用しました。
確かに分かりにくいと思います。
今後修正してみようと思います。
かなり忘れている部分が多いので、思い出すところからはじめないといけないのですが。

No. 4479 # 68user 2006/01/16 (月) 12:43:51
>>4471 mkt
> 書きかけだった部分、もう削除しておられますが、いずれまとまった形で
> 復活するのを期待しています。
はい、そのうちまとめて更新したいと思います。

>>4477 zsh
> やはりwhileの前に
> exec 0<file.txt
> を入れないと、最終行が表示されません。
わたくしのまわりには Solaris がないので試せませんが、これは何が原因で
最終行が表示されないのでしょうか?

>>4478 DNS勉強中
> 今後修正してみようと思います。
> かなり忘れている部分が多いので、思い出すところからはじめないといけないのですが。
細かな指摘ですので修正は不要かと思います。もし DNS にこだわりがあるなら、
ライブラリ化したり、他のレゾルバのソースを読んだり、
      http://www5d.biglobe.ne.jp/~stssk/dns.html
を片っ端から実装するのがいいのではないでしょうか。

No. 4480 # zsh 2006/01/16 (月) 15:10:38
>>4479 68user
>わたくしのまわりには Solaris がないので試せませんが、これは何が原因で
>最終行が表示されないのでしょうか?

パイプを使用した場合と同様、サブシェルで動作する事が原因のようです。
Solaris8のshで確認した所、forkしてからサブシェルの中でファイルを
オープンしていました。
(ksh/bash/zshはサブシェルで動作しないので問題なし。)

No. 4481 # 2006/01/16 (月) 23:39:42
>>4480 zsh

>パイプを使用した場合と同様、サブシェルで動作する事が原因のようです。
>Solaris8のshで確認した所、forkしてからサブシェルの中でファイルを
>オープンしていました。
サブシェルで動作するとは、子プロセスでシェル起動しているというこ
ですか。

whileの前に
exec 0<file.txt
を入れないと、最終行が表示されないということですか。

No. 4482 # 68user 2006/01/17 (火) 10:45:07
>>4480 zsh
あー、なるほど。
>>4467 68user
> 補足。Solaris の sh では
>> while read -r line; do
>> done < file.txt
> でもダメなようですね
のことですね。別件かと勘違いしておりました。

No. 4483 # zsh 2006/01/17 (火) 10:51:51
>>4481
>サブシェルで動作するとは、子プロセスでシェル起動しているというこ
>ですか。

その通りです。

>whileの前に
>exec 0<file.txt
>を入れないと、最終行が表示されないということですか。

サブシェル(while)内で
use_buf=1
としても、親シェルには引き継がれないので
最後の if 文が必ず偽になります。
よって、最終行(最終行が半角スペースで始まる場合には最終 2 行)が
表示されないと思います。

No. 4485 # 2006/01/17 (火) 12:54:25
>>4483 zsh
試して見ました。

ファイルの最後が空行(最終行が改行コードで終了)の場合、
whileの前に
exec 0<file.txt
を入れないくても、最終行が表示されました。

最終行の終わりが、改行コードではなく、ファイルの終端(EOF)がある場合、
catコマンドでファイルを表示した時、最終行の後ろに、プロンプトが来る
ファイルをやると、最終行が表示されません。
whileの前に
exec 0<file.txt
を入れた場合でも。

No. 4486 # zsh 2006/01/20 (金) 11:01:34
>>4485
>ファイルの最後が空行(最終行が改行コードで終了)の場合、
>whileの前に
>exec 0<file.txt
>を入れないくても、最終行が表示されました。

試してみましたが、最終行(空行)は表示されませんでした。
Solaris 標準の sh ですよね?

>最終行の終わりが、改行コードではなく、ファイルの終端(EOF)がある場合、
>catコマンドでファイルを表示した時、最終行の後ろに、プロンプトが来る
>ファイルをやると、最終行が表示されません。

それは read コマンドが読込めないので、仕方がないというか
そこまでやるならシェルスクリプトにこだわらない方が良いかと。

No. 4487 # 68user 2006/01/23 (月) 01:49:38
GD::Graph で遊んでみました。
    http://x68000.q-e-d.net/~68user/webcgi/gd-graph.html
    http://x68000.q-e-d.net/~68user/webcgi/sample/perl/graph-maker.cgi

No. 4488 # take 2006/01/23 (月) 11:04:50
はじめまして。
おじゃまいたします。

早速ですが
Opensslライブラリを使用して復号処理を実装したいと考えておりまして
RSA鍵交換の場合は、おおまかに分かりましたが
DH鍵交換の実装方法がなかなか調べても分からない状況です。
おそらくRSAとは使用するI/Fが異なるのではないかと考えています。

ご存知の方いらっしゃいましたら
ご教授頂けないでしょうか。

RSA鍵交換の場合は下記のような感じです(秘密鍵は知っている前提)

(1) pre_master_secretを取得する
        RSA_private_decrypt()を呼び出す

(2) 上記のpre_master_secretとclient_randomとserver_random値より
      master_secretを生成

(3) データを復号する(master_secretが分かれば復号できる)
        EVP_Cipher()を呼び出す

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

No. 4489 # take 2006/01/23 (月) 11:10:06
はじめまして。
おじゃまいたします。

早速ですが
Opensslライブラリを使用して復号処理を実装したいと考えておりまして
RSA鍵交換の場合は、おおまかに分かりましたが
DH鍵交換の実装方法がなかなか調べても分からない状況です。
おそらくRSAとは使用するI/Fが異なるのではないかと考えています。

ご存知の方いらっしゃいましたら
ご教授頂けないでしょうか。

RSA鍵交換の場合は下記のような感じです(秘密鍵は知っている前提)

(1) pre_master_secretを取得する
        RSA_private_decrypt()を呼び出す

(2) 上記のpre_master_secretとclient_randomとserver_random値より
      master_secretを生成

(3) データを復号する(master_secretが分かれば復号できる)
        EVP_Cipher()を呼び出す

No. 4490 # take 2006/01/23 (月) 11:13:08
>>4488 take
>>4489 take
2度書きしてしまいました。
申し訳ありません。

No. 4491 # 68user 2006/01/23 (月) 16:08:33
>>4489 take
> DH鍵交換の実装方法がなかなか調べても分からない状況です。
わたしにもさっぱりわかりませんが、以下の URL はチェック済ですか?
    http://www.openssl.org/docs/crypto/dh.html
    http://matagi.sakura.ne.jp/mt/archives/2005/03/openssldh.html

No. 4492 # take 2006/01/24 (火) 13:52:18
>>4491 68user
>わたしにもさっぱりわかりませんが、以下の URL はチェック済ですか?
> http://www.openssl.org/docs/crypto/dh.html
> http://matagi.sakura.ne.jp/mt/archives/2005/03/openssldh.html

お返事ありがとうございます。

DH法用の関数はこれなんですね。
お教え頂いた情報を参考に、更に調べてまいります。

No. 4493 # 2006/02/02 (木) 13:06:23
シェルスクリプトで、
ファイルからフィールド1を読み込み、前後にシングルクォーテーション「'」を
付けて、区切りの1行にしたいのですが、「'」を上手く付けることができません。
「'」の使い方が不正とかで怒られます。

#!/bin/csh

nawk -F"," ' { \
  if (FNR==1) printf("\'%s\'", $1); \
  else printf(",\'%s\'", $1) \
}' file.txt

一度、ダブルクォーテーション「"」にしてからsedで置換しよとしたのですが、
sedでも「'」の使い方が不正とかで怒られます。

nawk -F"," ' { \\
  if (FNR==1) printf("\"%s\"", $1); \\
  else printf(",\"%s\"", $1) \\
}' file.txt | sed 's/"/\'/g'

または、

set a = `nawk -F"," ' { \\
  if (FNR==1) printf("\"%s\"", $1); \\
  else printf(",\"%s\"", $1) \\
}' file.txt`
echo $a | sed 's/"/\'/g'

どのようにすればよいのですか。

OSは、Solairs8

No. 4494 # 2006/02/02 (木) 13:08:17
>>4493
参照するファイルについて書いていませんでした。
# cat file.txt
Tokyo,
Oosaka,
Nagoya,
Kyoto,
Kyusyu,

No. 4495 # 68user 2006/02/02 (木) 14:04:20
>>4493
csh は馬鹿なので、シングルクォートの中にシングルクォートを書くことはできません。
つまり、
    echo '\''
はエラーです (sh も同様)。同様に
    echo "\""
もエラーになります (sh ならこっちは OK)。

で、csh には (sh も)
        echo "文字列1""文字列2""文字列3"
        echo "文字列1"文字列2"文字列3"
        echo '文字列1''文字列2''文字列3'
        echo '文字列1'文字列2'文字列3'
のいずれも、
        echo "文字列1文字列2文字列3"
と (基本的には) 同じ、という性質があります。

よって、csh で
    'abcdef'
を出力したい場合は、
    echo "'"abcdef"'"
    echo "'""abcdef""'"
などとします。

シェルのクォートは「ネストさせない」が鉄則です。

No. 4496 # 2006/02/03 (金) 15:40:28
>> 4495
無理なのですか。

一度、ファイルから取得したものループでechoコマンドを
使いながら編集するということですね。

#!/bin/csh

set ALL="Tokyo Oosaka Nagoya Kyoto"

@ i = 1
foreach EACH ($ALL)

        if ($i == 1) then
                set ALLS=`echo "'"$EACH"'"`
        else
                set ALLS=`echo $ALLS",'"$EACH"'"`
        endif
        @ i++
end
echo $ALLS

No. 4497 # zsh 2006/02/03 (金) 18:39:14
>>4496
確認していませんが、awk のプログラム部分を別ファイルにして
-f オプションで指定しても出来ると思います。
(この場合はシングルクォートのエスケープは不要です。)

No. 4498 # 68user 2006/02/03 (金) 18:43:58
>>4496
> 無理なのですか。
いいえ。
    awk -F"," '{if (FNR==1){printf "'"'"'%s'"'"'",$1}else{printf ",'"'"'%s'"'"'",$1}}'<file.txt

No. 4499 # 2006/02/04 (土) 10:03:49
>>4497 zsh
>>4498 68user
zshさん、68userさん
ありがとうございます。
出来ました。

「'」を「"」で囲って連続して付けることは試してはいたのですが、
私が試していたのとは違っていました。
それよりも、「'%s'」とするのには気が付きませんでした。
常に「"%s"」としていました。

ただ、
awkで行うと、
,'Tokyo','Oosaka','Nagoya','Kyoto','Kyusyu'
と1行目に読み込んだものにもカンマ「,」がついてしまします。
nawkで行うと
'Tokyo','Oosaka','Nagoya','Kyoto','Kyusyu'
となります。
何が違いとかあるのでしょうか。

No. 4500 # zsh 2006/02/05 (日) 00:07:23
>>4499
Solaris の awk では FNR という変数はありません。
NR に変更すれば動作すると思います。
(NR と FNR では、複数ファイルを入力とした時に値が異なります。)

No. 4501 # hidemaru [E-mail] 2006/02/05 (日) 12:02:32
はじめまして、漠然とした質問なのですが、
SSLv3のハンドシェイク処理の部分を実際に
(Cで)実現する方法を知っている方、もしくは
何か参考になるものがあれば教えてください。

No. 4502 # hidemaru 2006/02/05 (日) 12:08:35
環境は、vine linux 、 openssl-0.9.7d-0vl3.2 です。

No. 4503 # esam 2006/02/06 (月) 19:01:18
はじめましてe。いつもいろいろと参考にさせてもらってます。
いろいろ試したのですが、わからないので質問させて下さい。
http://tomorrows-wind.at.webry.info/200507/article_21.html
↑ちょうど私の書いたプログラムとほぼ同じだったので
ちょっと勝手に拝借したんですが、このソース
私のやってる環境では、エラーがでるんですよね。
エラーが出るのは、最後のRSA_private_decrypt関数です。
これは私だけなんでしょうか?どなたか試していただけませんか?
鍵に関しては、コマンドラインから暗号化,復号化に成功しているので
問題ないと思われます。
お願いします。
実行環境:vine linux OpenSSL 0.9.7d 17 Mar 2004

No. 4504 # tkoba 2006/02/06 (月) 19:54:42
>>4503 esam
dectxt = malloc(RSA_size(rsapriv));
を、
dectxt = calloc(1, RSA_size(rsapriv));
と書き換えることでエラーが消えることを確認しました。

(環境: Vine Linux 3.2, OpenSSL 0.9.7d 0vl3.2)

No. 4505 # tkoba 2006/02/06 (月) 20:15:29
>>4503 esam

>>4504 は無視してください。

> http://tomorrows-wind.at.webry.info/200507/article_21.html

plaintxt = malloc(sizeof(char)*7);
strcpy(plaintxt, "abcdefg");
というのがおかしいですね。ここを直せばうまく動いた気がします。

No. 4506 # tkoba 2006/02/06 (月) 20:55:40
>>4503 esam
たびたびすみません。

if((enclen = RSA_public_encrypt(strlen(plaintxt), ...

if((enclen = RSA_public_encrypt(strlen(plaintxt) + 1, ...
とし、
if((declen = RSA_private_decrypt(strlen(enctxt), ...

if((declen = RSA_private_decrypt(RSA_size(rsapub), ...
としなければいけません。

No. 4507 # tkoba 2006/02/06 (月) 20:59:14
>>4503 esam

if((declen = RSA_private_decrypt(RSA_size(rsapub), ...

if((declen = RSA_private_decrypt(enclen, ...
のほうがスマートな気がしてきました。

No. 4508 # dynamite [E-mail] 2006/02/07 (火) 00:42:39
はじめまして、68userさん
おじゃまいたします。

ネットワークプログラミングの基礎知識
大変参考にさせてもらってます!

現在、SSL/TLS でアクセスしてみよう (1)
や >>3958 の記事のsslでkeep-aliveを参考にして
sslでの接続を勉強させて頂いています。

早速ですが
https-client-keep-alive.c や
テストで接続と切断を関数化して分けてみて、
リクエストを送らず受信もしないと
SSL_shutdown()で0を返します。
(丁度、https-client.c のソースの118行目から146行目までを削った状態です)

ためしに接続、受信、切断とすると
SSL_shutdown()で1を返すので、
(丁度、https-client.c のソースの118行目から128行目までを削った状態です)

受信が最後まで完了しなければ、
SSL_shutdown()で0を返しERR_print_errors_fp
には何も出力しないと推測しているのですが、
間違っていないでしょうか?

ご存知の方いらっしゃいましたら
ご教授頂けないでしょうか。m(_ _)m

(環境: fedora core 4, gcc-4.0.2-8.fc4, openssl-0.9.7f-7.10)

No. 4509 # esam 2006/02/07 (火) 12:39:49
>>tkobaさん
早急な返信ありがとうございました。
いわれたとおりになおしてみました。
あとは、>>4505の部分ですが。。。
いろいろためしてみましたがやはりエラーがでてしまいます。

No. 4510 # esam 2006/02/07 (火) 12:48:39
>>tkobaさん
すみませんできていました。
問題は ご指摘のとおりRSA_private_decrypt関数の第一引数でした。
ありがとうございました。

No. 4511 # blueeyes 2006/02/07 (火) 19:07:44
はじめまして
先日freebsd 6.0をインストールをしました。昨日までxdm順調に動いていました。
今日、xdmでloginできなくなりました。ユーザー名とパスワードを入力したら、また
登録画面が出てきました。本来welcome to hostname のところは今welcome to 1に
なりました。どういう原因でしょうか。よろしくお願いします。

No. 4512 # 2006/02/11 (土) 13:40:16
>>4500 zsh
(NR と FNR では、複数ファイルを入力とした時に値が異なります。)
どうなるのでしょうか。
どのように確認できますか。

No. 4514 # ロー 2006/02/11 (土) 18:39:14
UNIXのシェルで2点教えて頂きたいことがあります。

●1点目
sedコマンドを使用して置換したいのですが、sed内で変数は
使用可能なのでしょうか。

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

DIR="/home/guest/"
ls ${DIR}*.CSV | sed 's/$DIR}//g'

置換されずにそのまま出力されます。
シェル内の変数を、sedに渡して置換させることは可能なのでしょうか。

ls ${DIR}*.CSV | sed 's/\/.*\///g'
削除した部分がディレクトリと言う事なので、「's/\/.*\///g'」として
みたのですが、正しい使い方なのでしゅか。

●2点目
変数に格納されているファイル名から番号が一番大きいファイル名
を作りたいのですが、awkを使用して簡単にできますか。

例えば、/tmp配下に、
test0001.CSV
test0002.CSV
test0004.CSV
とファイルがあるとします。
ls、変数に格納し、awk等で、「test0005.CSV」を求めたいのですが。

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

FileLst=`ls /tmp/*.CSV`
echo $FileLst | awk ?????

No. 4515 # ロー 2006/02/11 (土) 18:41:13
>>4514 ロー
環境を書き忘れました。

UNIX:Soralis8
シェル:Bシェル

No. 4516 # 68user 2006/02/13 (月) 11:45:19
UNIX の部屋 http://x68000.q-e-d.net/~68user/unix/ を更新しました。

>>4460 mkt
> ・fgrep と Gimp の解説文が途中で切れてしまっているように思います。
fgrep については、とりあえず掲示板での発言にリンクを張りました。
    http://x68000.q-e-d.net/~68user/unix/pickup?fgrep

> ・記号の 2 項目め(「"」の項と思われる部分)の見出し行が抜け落ちてしまってます。
正しく表示されるようにしました。
    http://x68000.q-e-d.net/~68user/unix/pickup?%22

" の解決のため、10年近くつぎはぎでやってきた汚い部分を全面的に見直し
たため、もしかしたら UNIX の部屋の検索部分にエンバグしている可能性が
あります。怪しい挙動を見つけられた方は教えていただけると幸いです。

>>4501 hidemaru
> SSLv3のハンドシェイク処理の部分を実際に(Cで)実現する方法
>>4502 hidemaru
> 環境は、vine linux 、 openssl-0.9.7d-0vl3.2 です。
OpenSSL を使っていいなら SSL_connect(3) を使えばいいですし、OpenSSL を
使わないなら「環境は OpenSSL」とわざわざ書く理由がわからないです。

>>4508 dynamite
> SSL_shutdown()で0を返しERR_print_errors_fp には何も出力しないと
> 推測しているのですが
わたしもよくわかってませんが調べる時間がないです。すみません。
マニュアルにそう書いてありますか?

>>4511 blueeyes
> 本来welcome to hostname のところは今welcome to 1になりました。
原因はわかりません。リブートしても同じ挙動かどうか、シングル
ユーザモードで起動するとどうなるか、/var/log に何か出ていないかを
確認してください。

>>4514 ロー
> ls ${DIR}*.CSV | sed 's/$DIR}//g'
'' で囲んだら変数展開されないので、"" で囲みましょう。変数展開できた
としても s//home/guest///g は sed 的にエラーですが、これはまた別の話。

> ls、変数に格納し、awk等で、「test0005.CSV」を求めたいのですが。
「ls で表示したときに最後に表示される行」とみなせるのであれば、
    echo $FileLst | awk '{print $NF}'
など ($NF は gawk では動きましたが、一般的な awk で使用できるかどうかは
わかりません)。

まぁ、awk には列で渡すのではなく、行で渡した方が幸せだと思うので、
    ls /tmp/*.CSV | awk 'END { print }'
の方がいいと思います。とか言い出すと、
    ls /tmp/*.CSV | tail -1
でいいじゃん、って話になりますけどね。

No. 4517 # ロー 2006/02/13 (月) 13:22:09
>>4516 68user

ありがとうございます。
>> ls ${DIR}*.CSV | sed 's/$DIR}//g'
>'' で囲んだら変数展開されないので、"" で囲みましょう。変数展開できた
>としても s//home/guest///g は sed 的にエラーですが、これはまた別の話。
ダブル「""」で囲んだら展開されませんでした。シングル「''」で囲んだら展開
されました。

> echo $FileLst | awk '{print $NF}'
>など ($NF は gawk では動きましたが、一般的な awk で使用できるかどうかは
>わかりません)。
一般的なawkでも使用できました。

>ls /tmp/*.CSV | awk 'END { print }'
は、ダメでした
結果が得られませんでした。

No. 4518 # zsh 2006/02/15 (水) 11:38:18
>>4512
FNR に現在処理しているファイルのカレントレコード番号が
セットされるのに対して、NR には (n)awk が実行されてから
読み込んだレコード数がセットされています。
  $ nawk '{ print "NR:" NR "/FNR:" FNR }' a.txt b.txt
等とすれば違いが確認できると思います。

>>4517 ロー
Solarisの(n)awkでは
  $ /tmp/*.CSV | awk '{ f=$0; } END { print f }'
のようにしないといけないようです。

No. 4519 # 2006/02/15 (水) 17:14:16
>>4518 zsh
ありがとうございます。

awkのmatch関数なのですが、awk内で使用するとエラーが
ですのですが、どこか使い方がいけないのでしょうか。

抜粋ですが、
awk '
{
pos=match($1,/.CSV$/);
}' ${TEMPFILE}
ファイル名から拡張子以降を取り除くため、拡張子までの
位置を求めようとしています。

awk: syntax error near line 10
awk: illegal statement near line 10
awk: 構文エラー (10 行目の周辺)
awk: 不正な文を検出しました。 (10 行目の周辺)
が発生します。

No. 4520 # zsh 2006/02/15 (水) 19:21:20
>>4519
Solaris 標準の awk (/usr/bin/awk) には、match 関数が存在しません。
対応策としては
  (1)index 関数を使用する
        →ただし、index 関数は正規表現を使用できません。
  (2)nawk を使用する
  (3)/usr/xpg4/bin/awk を使用する
といった所でしょうか。

No. 4521 # dynamite 2006/02/16 (木) 02:31:45
>>4516 68user
返答ありがとうございます。

マニュアルは下記をざっと目を通してみたのですが、記載が見付けれませんでした。
http://www.infoscience.co.jp/technical/openssl/news/
http://home.att.ne.jp/theta/diatom/

前回の書き込みで受信関係がおかしいと推測してしまいましたが、
ためしにContent-Lengthの値分だけ受信しても同じ状態なので、
現在、違う部分も検証しています。

また理解が深まりましたら報告させて頂きますm(_ _)m

No. 4522 # むう 2006/02/16 (木) 17:30:44
はじめまして。素朴な疑問があるので、もし知っておられたらお答えください。
一般論として、ネットワーク上ではTCPとUDPはどっちが優先度が高いのでしょうか?
輻輳した場合に生き残る確率?に違いはありますか?
とにかくガンガンパケットを送りつけるプログラムで実験してみたところ、
気持ち程度UDPが優先されている気がしますが、確証が持てません。
LinuxのsocketオプションにSO_PRIORITYというのがあり、デフォルトは
TCPもUDPも0でした。
setsockoptで優先度を変えてみても誤差程度の差しか認識できません。
Webで「TCP UDP 優先度」などで探してもいい資料が見つからない状態です。
何かそのあたりの情報を知っていたら教えていただけないでしょうか。

No. 4523 # 68user 2006/02/17 (金) 00:52:11
>>4522 むう
- 一般的に、OS がどちらを優先するということは聞いたことがない。
- ただ、実装によっては得手不得手がある可能性はある。
- しかし一般的に TCP の方が高機能であり行うべき処理も多いため、
    スループットという点に関しては UDP の方が有利であろう。
- 当然ながら帯域制御ができるルータ・OS であれば、どちらかを優先する
    ことは可能であろうが、これは設定の問題。
- SO_PRIORITY は IP の TOS (Type of Service) に設定される。
- TOS の値を改変してしまうルータがあるようで、チェックサム計算からは
    除外されたりするかわいそうなフィールド。
- また、TOS は DiffServ など全く別の用途に使われたりもする。
        http://x68000.q-e-d.net/~68user/rfc/?key=2474&target=title
- OS が TOS を参照するかどうかは怪しいのでは? (ルータならともかく)
- TOS で QoS をやりたいならイントラ内で使うこと。ルータは TOS 対応の
    ものを揃えるべき。
- 少なくともインターネット経由では、ピアまで TOS がそのまま流れる
    保障は全くない。
- Arcstar のように、TOS を考慮するとうたっているサービスはある。
        http://www.ntt-vpn.com/ip-vpn/faq/faq_02.html

というのがわたしの認識です。

No. 4524 # かつや 2006/02/19 (日) 15:19:55
Wic-PC上で起動した際Teratermウィンドウがタスク上に隠れて
しまいタスクトレイ上にある該当画面を選択しなければ画面上
に表示されません。設定で画面がフォアに表示されるように
する為の設定方法をご教示下さい。

No. 4525 # 68user 2006/02/19 (日) 23:35:20
>>4524 かつや
http://search.vector.co.jp/search?query=%8D%C5%91O%96%CA などのツールを
インストールするのがよいのではないでしょうか。

No. 4526 # mkt 2006/02/20 (月) 04:05:17
>>4516 68user
いろいろありがとうございます。お手数をおかけしました。

> " の解決のため、10年近くつぎはぎでやってきた汚い部分を全面的に見直し
> たため、もしかしたら UNIX の部屋の検索部分にエンバグしている可能性が
> あります。怪しい挙動を見つけられた方は教えていただけると幸いです。

自分 1 人暴走している感じで恐縮ですが、いろいろ試してしまいました。

全角記号を検索したときの挙動について。
- 半角に変換して検索されている*ものもある*。
    (「@」「〜」「:」などは半角に変換されている)
- ヒットしなかったときのキーワードの表示が文字化けしている。(*1)
    (「!」「;」「¥」など多数)
- 関係ない結果が表示される。(*2)
    (「”」「’」「|」など)

半角記号で全文検索したときの挙動について。
- 「ある」はずなのに「ヒットしませんでした。」と言われる。
    (「"」→ \&quot\; がないと言われる、「'」→ \&apos\; がないと言われる、など)
- ヒット数表示の次の、リストの先頭に空の項目が入って、
    unix-term-dic.html や pregmemo.html などの各検索対象ファイルから
    関係ない部分(検索キーワードによって範囲は異なるが google_ad 関連スクリプトの
    <!-- の後から 先頭項目のあたり?)まで拾ってきてしまっている。
    (「!」「=」「:」「@(=@)」「*」など多数)

あと、「+」を検索しようとすると「500 Internal Server Error」に
なりますね。何も入力しなかった場合とかもですが。

---
(*1)(*2)
記号ばかり試していましたが、普通に言葉を検索しても何か変です。
「あいうえお」→ 1 件ヒットしました。(これは実際存在したので問題ない)
「かきくけこ」→ ヒットしませんでした。(が、キーワード文字化け)
「鶴」→ ヒットしませんでした。(が、キーワード文字化け)
「亀」→ 3 件ヒットしました。(が、どれも関係ないものばかり)
という感じで。


…もっとスマートに分類できたらいいんですが、収拾つかなくなってしまいました。
ごちゃごちゃに突っつくだけ突っついて申し訳ありません。

No. 4527 # mkt 2006/02/20 (月) 04:16:22
>>4526 mkt
言わずもがなですが、
    pregmemo.html は prgmemo.html の typo
です。失礼しました。

No. 4528 # 68user 2006/02/21 (火) 02:26:55
>>4526 mkt
ずいぶんヌルい修正をしてしまい、お恥ずかしい限りです、

> - ヒットしなかったときのキーワードの表示が文字化けしている。(*1)
> (「!」「;」「¥」など多数)
正規表現で検索しているため、入力された文字列は quotemeta している
のですが、quotemeta すると EUC-JP の 0x80 以降も quote されてしまい、
その結果化けていました。これまでは quotemeta した後に
    s/\\([\x80-\xff])/$1/g;
で元に戻していたのですが、前回の修正時になぜか戻す必要はないと判断
して、上記の s/// を削除していました。

> - 関係ない結果が表示される。(*2)
> (「”」「’」「|」など)
全角->半角変換が甘くて、" ' | などはそもそも半角に置換していません。
調査していないので想像ですが、EUC-JP の 2バイト目 + 後続バイトに
マッチしてしまったのではないかと思います。

> <!-- の後から 先頭項目のあたり?)まで拾ってきてしまっている。
> (「!」「=」「:」「@(=@)」「*」など多数)
全文検索のテストが甘かったようです。

> あと、「+」を検索しようとすると「500 Internal Server Error」に
> なりますね。何も入力しなかった場合とかもですが。
空の場合は
    print "検索内容を指定してください。\n";
と表示するようにしていたのですが、前回の修正で Content-type ヘッダの
出力方法を変更したせいで、Content-type より前に
    検索内容を指定してください。
が出力され、エラーとなっているようです。

少しずつ直していきます。ご指摘ありがとうございました。

No. 4529 # hoge 2006/02/21 (火) 12:44:56
>>4524 かつや
Tera Term のショートカットのプロパティ中の
『実行時の大きさ』って項目はどうなっていますか?

No. 4530 # でたち 2006/02/27 (月) 02:12:36
Cシェルでシェル変数に代入された数値として
例えば0.12が入っている場合、その変数の数値を$で
参照する時に「0.12」としてではなく、
「.12」と出力させることはできますか?
ご教示頂けましたら幸いです。

No. 4531 # 68user 2006/02/27 (月) 12:00:12
>>4530 でたち
printf(1) で何とかならないかと思って試してみましたが、どうやら無理っぽいので
    echo ${var:s/0././}
でどうでしょうか。

No. 4532 # でたち 2006/02/27 (月) 18:15:08
>>4531 68user
echo ${var:s/0././}
を行ってみましたが Variable syntax表示で
受け付けて貰えませんでした。
ご返信頂きまして大変ありがとうございます。

No. 4540 # べた 2006/03/17 (金) 18:50:45
nawkの使い方について教えて欲しいことがあります。
環境は、Solaris8、shです。

nawk '{
  :
    FNO=sprintf("%d",substr(FNM,19));
  :
}' ${LIT}

上記のように、ファイル名からファイルの番号を
取得し、格納しています。
"%d"を指定して数値で取得しようとしているのですが
10以上がとれません。
9のまななのですが、どこがいけないのでしょうか。

No. 4541 # 68user 2006/03/18 (土) 23:41:25
最近掲示板 SPAM がひどいので、特定文字列を含む投稿を禁止するように
しました。

>>4540 べた
FNM の内容がわからないと何とも言えないです。

No. 4542 # 68user 2006/03/18 (土) 23:55:07
>>4088 tansy
>>4191 無題
>>4225 mmm
いまさらですが、当ページのプログラムのライセンスは、特に記述がない限り、
修正 BSD ライセンスっぽいものであることを明記しました。
    http://X68000.q-e-d.net/~68user/link.html

No. 4543 # 68user 2006/03/19 (日) 05:00:13
>>4526 mkt
一部のみですが対応しました。
    http://x68000.q-e-d.net/~68user/cgi-bin/cvsweb.cgi/public_html/unix/script/pickup#rev1.24

残件は、
    - 全文検索がダメダメなのを直す
    - EUC-JP のバイトの境界を正しく見る
        (「亀」は「正規表現」の「正」の 2バイト目と「規」の 1バイト目にマッチしている)
    - 「+」が検索できないのを直す
です。忘れないよう
    http://x68000.q-e-d.net/~68user/bugnote/viewbug.php?projectid=1&bugid=23
に登録済ですが、もしさらなる不具合があれば掲示板にてお教えいただけると幸いです。

No. 4544 # 68user 2006/03/22 (水) 01:41:10
UNIX の部屋で、各 OS のマニュアルへのリンクを表示するようにしました (先頭部分)。
    http://X68000.q-e-d.net/~68user/unix/pickup?find

現時点では、Linux・NetBSD・FreeBSD・HP-UX11i・Solaris10 のセクション 1,1M,8
のみです。

No. 4550 # タバスコ=ダ=ガマ 2006/03/25 (土) 14:57:56
ネットワークプログラミングのページはとてもお勉強になります。
非常にありがたく利用させていただきました。感謝です。
ところで素朴な疑問なのですが、TCPでsocket生成→connectの間に
bindが不要なのはなぜなのでしょう?

No. 4551 # だだ 2006/03/29 (水) 02:01:19
Solarisで、Perlを組むのですが、参考になる本を
教えてください。
Perlの基本となることが知りたいのです。
変数の設定、判定、ループ、読み書きといったことです。
基本的なことが分かる本を教えてください。

最終的には、Perlでftpやメール送信(smtpでの)を
やりたいのです。
この点に関する本も教えて欲しいのですが。

No. 4552 # 68user 2006/03/29 (水) 10:57:54
>>4550 タバスコ=ダ=ガマ
bind(2) することはできますが、普通はしません。connect(2) に
空いているポート番号を選ばせます。
    http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-3.html#ss3.6

その理由は、ピアのポート番号選択は
    - 21 なら SMTP
    - 80 なら HTTP
などとサービスの選択も兼ねていますが、ローカルのポート番号は
何番でも構わないからです。

>>4551 だだ
> Perlの基本となることが知りたいのです。
> 変数の設定、判定、ループ、読み書きといったことです。
> 基本的なことが分かる本を教えてください。
初心者向けの本は相性が重要ですので、本屋で手にとって立ち読みするのが
よいでしょう。本屋に行くことができないなら、わたしは持っていませんが
「初めての Perl」を推薦します。

> 最終的には、Perlでftpやメール送信(smtpでの)をやりたいのです。
「Perl クックブック Volume1・2」で最終的な答えを把握した上で、
「プログラミング Perl」で基礎を固めるのがよいと思います。

No. 4554 # かず 2006/03/29 (水) 13:08:48
いつも楽しんでサイトを拝見させていただいております。

今UNIX上でクライアント、サーバのネットワークプログラミングをC言語で
挑戦しているところなんですが、FTPコマンド
(QUIT,USER,PASS,PWD,STAT,MKD,RMD,CDW,DEL,LIST,HELPcmd,HELP,PORT,NLST)
の組み込み方がイマイチよく分りません。

以下にserverftp.cとclientftp.cのコードを貼り付けておきます。
これらのコードは正常に動いております。

大変お忙しいとは思いますが、
ご教授の程、どうぞよろしくお願い致します。

serverftp.c

***********************

#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>

#define SERVER_FTP_PORT 9237

// list function prototypes
int receiveMsg(int s, char *buf, short bufsize, short *msgsize);
int sendMessage(int s, char *buf, short size);

main(
int  argc,
char *argv[]
)
{
int listenSocket;
int s;
int status;
                short msgSize;

printf("Starting server ftp\n");

status = svcInitServer(&listenSocket);
if(status != 0)
{
printf("Exiting server ftp due to error\n");
exit(-1);
}

for(;;)
{
printf("waiting to accept client connection\n");
s = accept(listenSocket, NULL, NULL);
if(s < 0)
{
perror("cannot accept connection: ");
exit(-1);
}

int msg;
short size;
char recvBuffer[1024];

printf("Server connected to client, issuing recvmsg\n");

status = receiveMsg (s, recvBuffer, 1024, &msgSize);
if (status < 0)
{
close(s);
return(status);
}

char replyMsg[1024];
strcpy(replyMsg, "200 command ok\n");
size = strlen (replyMsg) + 1;
status = sendMessage(s, replyMsg, size);

if(status < 0)
{
close(s);
return(s);
}



}

close(listenSocket);
printf("Exiting from server ftp main\n");
}


int svcInitServer(
int *s
)
{
int sock;
struct sockaddr_in svcAddr;
int qlen;

if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("cannot create socket ");
return(-1);
}

memset((char *) &svcAddr, 0, sizeof(svcAddr));

svcAddr.sin_family = AF_INET;
svcAddr.sin_addr.s_addr = htonl(INADDR_ANY);
svcAddr.sin_port = htons(SERVER_FTP_PORT);

if(bind(sock,(struct sockaddr *)&svcAddr, sizeof(svcAddr)) < 0)
{
perror("cannot bind ");
close(sock);
return(-1);
}

qlen = 1;
listen(sock, qlen);

*s = sock;

return(0);
}


int sendMessage(
int s,
char *msg,
short msgSize
)

{

int i;

for(i = 0; i < msgSize; i++)
{
printf("%c", msg[i]);
}
printf(" \n");




if((send(s, msg, msgSize, 0)) < 0)
{
perror("unable to send ");
return(-1);
}

return(0);
}


int receiveMsg(
int s,
char *buffer,
short bufferSize,
short *msgSize
)

{
int i;
*msgSize = recv(s, buffer, bufferSize, 0);
if(*msgSize < 0)
{
perror("unable to receive");
return(-1);
}

for(i = 0; i < *msgSize; i++)
{
printf("%c", buffer[i]);
}
printf("\n");

return(0);
}


clientftp.c

**********************

#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>

#define SERVER_FTP_PORT 9237

int sendMessage(int s, char *msg, short msgSize);
int receiveMsg(int s, char *buffer, short bufferSize, short *msgSize);


int main(
int argc,
char *argv[]
)

{
int status;
int s;
short msgSize;
char FTPcmd[1024];
char replyMsg[1024];

printf("Trying to connect to server FTP\n");

status = clntConnect("//IPアドレス", &s);
if(status < 0)
{
return(status);
}

printf("Connected to ftp server\n");
strcpy(FTPcmd, "quit");
status = sendMessage(s, FTPcmd, strlen(FTPcmd) + 1);
if(status < 0)
{
close(s);
return(s);
}

printf("Issuing receivemsg to get reply msg from server\n");
status = receiveMsg(s, replyMsg, 1024, &msgSize);
if(status < 0)
{
close(s);
return(s);
}

printf("%c", replyMsg);

close(s);
return(0);

}

int sendMessage(int s, char *msg, short msgSize)

{
int i;

for(i = 0; i < msgSize; i++)
{
printf("%c", msg[i]);
}

printf(" \n");



if((send(s, msg, msgSize, 0)) < 0)
{
perror("unable to send ");
return(-1);
}

return(0);
}

int receiveMsg(int s, char *buffer, short bufferSize, short *msgSize)

{
int i;
*msgSize = recv(s, buffer, bufferSize, 0);
if(*msgSize < 0)
{
perror("unable to receive ");
return(-1);
}

for(i = 0; i < *msgSize; i++)
{
printf("%c", buffer[i]);
}

printf("\n");
return(0);

}

int clntConnect(
char *serverName,
int *s
)

{
int sock;
struct sockaddr_in us;
struct sockaddr_in them;
struct hostent *he;

if((he = gethostbyname(serverName)) == NULL)
{
printf("%s is unknown server\n", serverName);
return(-1);
}


if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("cannot create socket ");
return(-1);
}


memset((char *) &us, 0, sizeof(us));

us.sin_family = AF_INET;
us.sin_addr.s_addr = htonl(INADDR_ANY);
us.sin_port = 0;

if(bind(sock,(struct sockaddr *)&us, sizeof(us)) < 0)
{
perror("cannot bind");
close(sock);
return(-1);
}


memset((char *)&them, 0, sizeof(them));
them.sin_family = AF_INET;
memcpy((char *) &them.sin_addr, he->h_addr, he->h_length);
them.sin_port = htons(SERVER_FTP_PORT);

if(connect(sock,(struct sockaddr *)&them, sizeof(them)) < 0)
{
perror("cannot connect ");
close(sock);
return(-1);
}

printf("Connected to server, socket number: %d\n", sock);
*s = sock;

return(0);
}

void clntExtractReplyCode(
char *buffer,
int *replyCode
)

{
sscanf(buffer, "%d", replyCode);

return;
}

No. 4555 # hoge 2006/03/29 (水) 19:29:01
>>4554 かず さんへ

> FTPコマンド
> (QUIT,USER,PASS,PWD,STAT,MKD,RMD,CDW,DEL,LIST,HELPcmd,HELP,PORT,NLST)
> の組み込み方がイマイチよく分りません。

あんまりな方法だと思いますよ。
vsftpd とか proftpd 辺りのソースを拾って読んでみてはどうでしょうか?

No. 4556 # まんたろう 2006/03/30 (木) 01:10:57
Solarisで、Perlで、smtpで、メール送信をしていいます。
ポート番号25を使って、smtpサーバに接続してメールの
送信をしているのですが、処理は、正常に終わるのですが、
メールが送信されません。届きません。
どこがいけないのでしょうか。

------------------------------
use Socket;
$server = 'SMTPサーバ' ;

$from = '送信元アドレス' ;
$to = '送信先アドレス' ;
$subject = 'テストメール' ;
$data = 'メール送信テスト' ;

$send_data = 'X-Mailer: SMTP tool' . "\n";
$send_data .= 'MIME-Version: 1.0' . "\n";
$send_data .= 'Content-Type: text/plain; charset=iso-2022-jp' . "\n";
$send_data .= 'From: '. $from . "\n";
$send_data .= 'To: '. $to . "\n";
$send_data .= 'Subject: ' . $subject . "\n";
$send_data .= "\n";
$send_data .= $data;

        $port = getservbyname('smtp','tcp');
        $struct = sockaddr_in($port,inet_aton($server));
        socket(SH, PF_INET, SOCK_STREAM, 0)
                                || die("ソケットの生成失敗 $!") ;

        connect(SH, $struct )
                                || die("接続失敗 $!") ;

        select(SH); $| = 1; select(STDOUT);

        $respons = <SH> ;

        unless($respons =~ /^220/) {
                close(SH); die("接続失敗 $!") ;
        }

        $command = "HELO $server\n";
        print SH $command ;

        $respons = <SH> ;
        &decode(\$respons) ;

        unless($respons =~ /^250/){
                close(SH); die("HELOコマンド失敗 $!") ;
        }

        $command = "MAIL FROM:$from\n";
        print SH $command ;

        $respons = <SH> ;
        &decode(\$respons) ;

        unless($respons =~ /^250/){
                print SH "RSET\n"; close(SH);
                die("MAILコマンド失敗 $!") ;
        }

        $command = "RCPT TO:$to\n";
        print SH $command ;

        $respons = <SH> ;
        &decode(\$respons) ;

        unless($respons =~ /^25[0|1]/){
                print SH "RSET\n"; close(SH);
                die("RCPTコマンド失敗 $!") ;
        }

        $command = "DATA\n";
        print SH $command ;

        $respons = <SH> ;
        &decode(\$respons) ;

        unless($respons =~ /^354/){
                print SH "RSET\n"; close(SH);
                die("DATAコマンド失敗 $!") ;
        }

        $command = "$send_data\n.\n";
        print SH $command ;

        $respons = <SH> ;
        &decode(\$respons) ;

        unless($respons =~ /^250/){
                print SH "RSET\n"; close(SH);
                die("本文、ヘッダ部送信失敗 $!") ;
        }

        $command = "QUIT\n";
        print SH $command ;

        close(SH); select(STDOUT);
        
        print "MAILは正常に送信されました。\n";

sub decode{
        
        my $inf = $_[0];
        $$inf =~ s/\x0D\x0A|\x0D|\x0A/\n/g;

}
-----------------------------

No. 4557 # megu 2006/03/30 (木) 11:46:30
UNIXを良く知らずみようみまねでshellを作成しています。
ある処理のエラーをハンドリングして結果に対してメール
を送信する様にしました。
/usr/bin/mail -s "hoge" megu@hoge.com < hoge.txt
ここで質問なのですが、該当コマンドをプロンプト上で
実行すると処理が実行されません。
(実行中のまま戻って来ない?)
強制終了すると、dead.letterが更新されます。
該当処理を記載したshellを実行しても、上記コマンド迄
は実行されているのですが、該当mailコマンドの部分で
処理がされない様で、コマンドを実行した様にshell自体も
終了しません。
cronや他ツールで自動実行させる様にすると実行されます。
根本的なOSの知識なのか、環境の問題なのかさえも分かりません。
とても基本的な質問になるかと思うのですが、教えて頂ければと
思います。

No. 4558 # カルネ 2006/03/30 (木) 19:43:41
はじめまして。質問させてください。
sin_port=0で空いているポート番号を自動取得できますが、
・ここで取得されたくない番号を指定
・決められた帯域内(5000〜6000など)で限定して取得
・予め取得される範囲を取得
のいずれかを行いたいのですが、方法はありますでしょうか?

No. 4559 # 68user 2006/03/30 (木) 22:25:05
>>4556 まんたろう
> ポート番号25を使って、smtpサーバに接続してメールの
> 送信をしているのですが、処理は、正常に終わるのですが、
> メールが送信されません。届きません。
うちの環境では正常に送信されました。telnet での送信や、メーラー
送信のパケット観察などを行って、成功/失敗時の違いを観察してください。

>>4557 megu
- 「sh -x スクリプト名」として、実際に実行されているコマンドを確認する。
    端末からの入力を待っているなら、リダイレクトまわりが怪しげな気が。
- dead.letter の中を見て、エラーを観察する (dead.letter の中にエラーが
    記述されるのかは覚えていませんが)
- mail コマンドが吐くエラーを観察する。標準出力・標準エラー出力を捨てて
    いるなら、捨てないようにする。

>>4558 カルネ
Linux なら ip_local_port_range、NetBSD なら net.inet.ip.anonportmax、
FreeBSD なら制限方法がない (たぶん) など、OS によって異なります。

No. 4560 # べた 2006/04/06 (木) 13:07:50
シェルで、dateコマンドで取得した時間から5分前の
の時間を取得したいのですが、できるでしょうか。

date +%H%M%S と実行します。
結果として、「130530」が取得できます。
そこから、取得した、「1305030」から5分前の「130030」を
求めたいのですが、できるのでしょうか。

環境は、
Solaris、shです。

No. 4561 # 68user 2006/04/06 (木) 14:09:14
>>4560 べた
上にある方が、現実的な解です。

- perl で localtime(time-5*60)
- GNU date をインストールして date --date '5 minutes ago'
- http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?log=1382 的なやり方
- http://home.catv.ne.jp/pp/ginoue/bn/descend.html の「2002/04/02 ひとこと」
    的なやり方

No. 4562 # hoge 2006/04/06 (木) 16:23:10
プロパーや一次請けが perl を嫌がったり、ましてや非純正な物
(GNU プロダクト)を入れるなんて駄目なんて悲惨な職場を経験したので...

Solaris 付属の date コマンドに %T って有りますか?
無かったとしても date +%H:%M:%S って書き方は利用可能ですか?
結果として、13:05:30 が取得できるなら、予め IFS_OLD=$IFS ; IFS=":" して
2 番目のフィールドが 5 未満か? とか 1 番目のフィールドが 0 以下か? って
辺りを条件に繰り下がり処理を手作りするのもありますね。

No. 4563 # hoge 2006/04/06 (木) 17:48:41
あ... 68user さんが例示してるやん。
リンクは読んでから書かないと駄目ね。

No. 4564 # べた 2006/04/06 (木) 18:37:37
>>4561 68user
>>4562 hoge
ありがとうございます。
日付またがりなどを考えるとPerlでやる方法がいいです。
Perlでやります。

もう1つ質問があります。
シェルを起動し、起動した時間から5分前に出力された時間以降の
syslogの内容を別ファイルに出力したいのですが、できるのでしょうか。

例えば、
今が、18:00:00とします。
シェルを起動し、18:00:00を取得します。
18:00:00を基にして、5分前の17:55:00を取得します。
「Apr 6 18:55:00」以降に出力されたsyslogをすべて
別ファイルに出力します。

ということ実現したいのです。

時間は、
$tm = time - 300;
my $now = strftime "%b %e %H:%M:%S", localtime($tm);
で取得します。

No. 4566 # べた 2006/04/08 (土) 12:36:36
あるファイルから指定日時以降に書かれたレコードを
抽出したいのですが、シェルスクリプトでできるので
しょうか。
どのしょうにシェルにすればよいか教えてください。

例えば、今が、2006/04/08 12:30:00とします。
ある指定日時というのは、現時点から5分前としますので、
2006/04/08 12:25:00となります。

ファイルでは、「Apr 8 12:30:33 ・・・・・」と出力
されているので、5分まえの時間を、「Apr 8 12:25:00」
で取得し、「Apr 8 12:25:00」以降に書かれたレコードを
ファイルに出力したいのです。

環境は、
Solaris8、sh、Perlで実現したいのです。

No. 4567 # まんたろう 2006/04/10 (月) 21:07:44
>>4566 べた

無理ではないかと思うのですが。
「Apr 8 12:30:33 ・・・・・」の比較、チェックが簡単
にできないと思います。

こういうのはどうですか。
5分前に動いた時のファイルのレコード数と今回動いた時の
ファイルにレコード数の差をtailコマンドでファイルに出力
というのは。?

No. 4568 # 68user 2006/04/11 (火) 10:22:32
>>4567 まんたろう
> 「Apr 8 12:30:33 ・・・・・」の比較、チェックが簡単にできないと思います。
echo "Apr 02 12:25:00 ===" | sort -M - logfile | cat -n | grep "===" | awk '{print $1}'
として行番号をとって、その行以降を tail で出力とか。

まぁ筋の悪いやり方だとは思いますので、他の方法がよいでしょう。

No. 4569 # べた 2006/04/11 (火) 12:50:22
>>4568 68user

>echo "Apr 02 12:25:00 ===" | sort -M - logfile | cat -n | grep "===" | awk '{print $1}'
>として行番号をとって、その行以降を tail で出力とか。
予めファイルの全体のレコード数も必要ということですか。
マイナスとなった場合、どうなるのですか。?

No. 4570 # べた 2006/04/11 (火) 14:56:25
>>4578 EBA

echo "Apr 10 09:30:00 ===" | sort -M - logfile | cat -n | grep "===" | awk '{print $1}'
と実行してみたのですが、行番号が2となります。

# cat logfile
<pre>
Apr 9 12:23:01 ・・・・・・・
Apr 9 15:17:43 ・・・・・・・
Apr 9 17:48:06 ・・・・・・・
Apr 9 18:05:30 ・・・・・・・
Apr 9 18:06:24 ・・・・・・・
Apr 10 09:23:08 ・・・・・・・
Apr 10 11:47:23 ・・・・・・・
Apr 10 13:35:49 ・・・・・・・
Apr 11 09:54:11 ・・・・・・・
Apr 11 12:17:38 ・・・・・・・
</pre>

行番号ではなく、すべてを表示したのですが、
sortが正しく行われていないみたいなのですが、
どうしてなのでしょうか。
<pre>
# echo "Apr 10 09:30:00 ===" | sort -M - logfile | cat -n
          1 Apr 9 12:23:01 ・・・・・・・
          2 Apr 10 09:30:00 ===
          3 Apr 9 15:17:43 ・・・・・・・
          4 Apr 9 17:48:06 ・・・・・・・
          5 Apr 9 18:05:30 ・・・・・・・
          6 Apr 9 18:06:24 ・・・・・・・
          7 Apr 10 09:23:08 ・・・・・・・
          8 Apr 10 11:47:23 ・・・・・・・
          9 Apr 10 13:35:49 ・・・・・・・
        10 Apr 11 09:54:11 ・・・・・・・
        11 Apr 11 12:17:38 ・・・・・・・
</pre>

行番号以降をtailで出力は、
# tail +行番号 logfile
でできました。

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

No. 4571 # 68user 2006/04/12 (水) 11:30:06
>>4570 べた
Linux ではうまくいきましたが、Solaris 環境がないので確認できません。
どなたかご確認いただけませんか?

あと、このやり方は新年 00:00:00〜00:05:00 の間はうまく動作しませんので、
おすすめしません。念のため。

No. 4572 # べた 2006/04/12 (水) 17:05:17
>>4571 68user
ありがとうございます。

>あと、このやり方は新年 00:00:00〜00:05:00 の間はうまく動作しませんので、
>おすすめしません。念のため。
確認して頂いたのですか。
良い方法だと思ってはいたのですが、ダメですか。
他に、良い方法があるのでしたら伺いたいのですが。

No. 4573 # ふくし 2006/04/12 (水) 21:16:07
おひさしぶりです。自分が困ったときだけ出てきてすみません。

Windows のマシンと UNIX のマシンが存在する LAN で、
お互いにメールを送りあうというテストをやっています。
ここでは簡単のため、Windows マシン1台と UNIX マシン1台とします。

W に pmail というフリーウェアの SMTP / POP サーバーを入れた人がいて、
W と U の両方に Mozilla Thunderbird を入れて、
Thunderbird のアカウント設定で、
W の IP アドレスを SMTP / POP アドレス欄に指定することで、
W と U の間でメールのやり取りをすることができました。

しかし、テストの要件のひとつに、
U 側では MUA として /bin/mail も使えるようにする、というものがありました。
sendmail の設定を変えようとしようと思ったのですが、
それは大変だからやめたほうがいいと上司に言われ、
言われるままに U に Postfix を入れました。
ちなみに U の OS は HP-UX 11i ver.2 です。

Postfix のインストールはなんとなく終わりました。
/etc/postfix/main.cf に
myhostaname = U.unix.net
と変更を加えました。

DNS を立てるのはなかなか面倒だと上司に言われたので、言われるままに
U の /etc/hosts および
W の C:\Winnt\system32\drivers\etc\hosts に
172.16.10.2 U.unix.net
172.16.10.3 W.windows.net
のように書きました。

で、U 側で
  # mail root
  nantoka
  kantoka
  .
のように書くと、
  # mail
で自分宛に出したメールが確認できましたが、
  # mail dareka@W.windows.net
  nandakakandaka
  .
のようにすると、
  Diagnostic-Code: X-Postfix; Host or domain name not found. Name Service
    error for name=W.windows.net type=A: Host not found
のように怒られます。

(ここで、dareka は W の pmail に設定したメールアカウントです。)

U から
  # nslookup
  > W.windows.net

とすると 172.16.10.3 が、

  > 172.16.10.3

とすると W.windows.net が正しく帰るのですが、
host W.windows.net とすると not found 3(NXDOMAIN) と言われます。
このへんが原因でしょうか。

この状況で、U から W に /bin/mail でメールを出すことができるでしょうか。

また、W の Thunderbird から出したメールを
U の /bin/mail で受けるためには、qpopper のようなプログラムを
U に入れないといけないのでしょうか。

他に、いまの私の状況でもっと簡単にテストするアイディアがわかれば
ご教示ください。

いろいろ聞いてすみません。よろしくお願いします。

No. 4574 # 68user 2006/04/13 (木) 01:31:52
>>4572 べた
> 他に、良い方法があるのでしたら伺いたいのですが。
まず、syslog の出力には年がないという根本的欠陥があります。なので、
ログファイルを後からチェックするだけでは、完璧な判定はできません。
たとえば
    Apr 9 12:23:00 ... (2005年出力)
    Apr 9 12:23:01 ... (2006年出力)
とか
    Apr 9 12:23:01 ... (2005年出力)
    Apr 9 12:23:00 ... (2006年出力)
というケースもありうるわけです。また、現在 1月1日 0時2分だとして、
1分前に出力されたログ
    Jan 1 00:01:00 ...
と、5分前の時刻
    Dec 31 12:57:00 ...
をソートすると Jan 1 の方が先になり、意図した結果になりません。

それを踏まえた上で、
    - 1年前のログが残っていることはないとみなす
    - 年初 5分は目をつぶる
が許容できるかどうかはあなたが判断してください。なお、Jan や Feb の
ソートについては、sed で 01 や 02 に置換すれば何とでもできるでしょう。

理想は年が記録されるログに乗り換えることですが (=syslog を捨てる)、
それが許されるシチュエーションはあまりないと思いますので、
>>4567 まんたろう
は現実的な落としどころと考えます。


>>4573 ふくし
> Diagnostic-Code: X-Postfix; Host or domain name not found. Name Service
> error for name=W.windows.net type=A: Host not found
Postfix はよく知りませんが、
    http://www.kobitosan.net/postfix/ML/arc.4/msg00048.html
でしょうか。あと、うまくいくかどうかわかりませんが、
    # mail 'dareka@[172.16.10.3]'
と IP アドレスを直接指定するとか。@[..] は IP アドレス指定の場合の
メールアドレス記述方法だったような気がしますが、使ったことはありません。

# http://x68000.q-e-d.net/~68user/rfc/?key=821&target=title

> # nslookup
nslookup は、/etc/hosts を参照しません。

と思ったら、HP-UX の nslookup は参照するんですね。へぇ。
    http://docs.hp.com/ja/B2355-90851/nslookup.1.html

> また、W の Thunderbird から出したメールを
> U の /bin/mail で受けるためには、qpopper のようなプログラムを
> U に入れないといけないのでしょうか。
mail コマンドには POP クライアントの機能はないと思いますので、
W で POP サーバを動かすという前提であれば、
    - W にメールが届くと U に転送し、mail コマンドは /var/spool/mail などを
        直接参照する。
    - U で fetchmail などの POP クライアントを動かし、/var/spool/mail などに
        書き出す。
    - W・U 両方で POP サーバを動かし、W 宛のメールは W の POP サーバから
        取得し、U 宛のメールは U の POP サーバから取得する。
などの方法があります (他にもあると思いますが)。

言うまでもありませんが、要件自体が不適切である可能性もあります。

No. 4575 # ふくし 2006/04/13 (木) 14:35:00
>>4574 さん、ありがとうございます。
  # mail 'dareka@[172.16.10.3]'
を指定すると、

  Diagnostic-Code; X-Postfix; host 172.16.10.3[172.16.10.3] said: 550 5.1.1
  <dareka@[172.16.10.3]>... Not local user, server is not relaid.
  Recipient error (in reply to RCPT TO command)

と言われます。

試みに dareka というコンピューターユーザーを W に作ってみましたが
現象は変わりませんでした ;;;

教えていただいたリンクをたどって
http://www.kobitosan.net/postfix/jhtml/faq.html#intranet
に到達していくつかのことをやってみました。

・/etc/postfix/main.cf で
    disable_dns_lookups = yes と書けば
    /etc/hosts を見に行って W.windows.net の名前解決をしてくれる?
    =>ダメでした(dareka@W.windows.net で host not found になる)

・さらに /etc/postfix/main.cf で
    relayhost = W.windows.net と書く

    =>同じ状況です。
    (# mail dareka@W.windows.net で host not found、
        # mail 'dareka[@172.10.16.3]' で not a local user)

・/etc/postfix/main.cf で
    relayhost = W.windows.net と書く

    =>同じ状況です。
    (# mail dareka@W.windows.net で host not found、
        # mail 'dareka[@172.10.16.3]' で not a local user)
        これ、W.windows.net の smtp サーバーである pmail が
        POP before SMTP auth をやっているのが原因かも・・・。
        (フリー版の制約で切れない)

・relayhost の設定をやめ、
    transport_maps = dbm:/etc/postfix/transport と設定する。
    /etc/postfix/transport の中身を

    windows.net :[W.windows.net]
    .windows.net :[W.windows.net]

    にし、postmap /etc/postfix/transport をしてから、
    postfix reload する。
    (/etc/postfix/transport の前に hash、db、dbm などの何をつけるかは
        postmap が生成するデータベースによる。
        間違うと postfix reload で怒られる)

    =>同じ状況です。

・/etc/postfix/transport の中身を

    windows.net :[172.16.10.3]
    .windows.net :[172.16.10.3]

    とか

    windows.net smtp:[W.windows.net]
    .windows.net smtp:[W.windows.net]

    とか

    windows.net smtp:[172.16.10.3]
    .windows.net smtp:[172.16.10.3]

    とかにしてみる。

    =>同じ状況です。。。

ううーん、困った。
でも人に聞きながらやってると整理がついていいですね (^^)

No. 4577 # べた 2006/04/15 (土) 16:55:45
>>4547
ありがとうございます。
どうも、無理みたいですね。
1年。つまり、同じ年ということであるのならば、何とかできるの
でしょうが、年をまたいでしまうと無理ですね。

>Jan や Feb のソートについては、sed で 01 や 02 に置換すれば
>何とでもできるでしょう。
すみません。方法教えてください。


> >>4567 まんたろう
> は現実的な落としどころと考えます。
現実な落としどころとは。?

No. 4578 # EBA 2006/04/16 (日) 03:01:58
BCCでwindowsプログラムをコンパイルしようとすると
「外部シンボル '_main' が未解決」というのが出てしまいます。
「-WオプションをつけてコンパイルすればWindowsアプリができます」と本に
書いてあるのですが、どうすればいいのかわかりません

No. 4579 # べた 2006/04/18 (火) 23:58:32
以下の様なカンマ区切りのファイルがあります。
001,a2,a3,a4,a5,a6,a7,a8,a9,a10,,,,,,
002,a2,a3,a4,a5,a6,a7,a8,a9,a10,111:222,123:456,001:002,100:200,A01:A02,0:1
003,a2,a3,a4,a5,a6,a7,a8,a9,a10,111:222,123:,:,:,A01:A02,:

フィールドの11カラム以降からは、コロン区切りで複数設定されている場合がある
ので、複数行に分けたいのです。

以下の様に、
001,a2,a3,a4,a5,a6,a7,a8,a9,a10,,,,,,
002,a2,a3,a4,a5,a6,a7,a8,a9,a10,111,123,001,100,A01,0
002,a2,a3,a4,a5,a6,a7,a8,a9,a10,222,456,002,200,A02,1
003,a2,a3,a4,a5,a6,a7,a8,a9,a10,111,123,,,A01,
003,a2,a3,a4,a5,a6,a7,a8,a9,a10,222,,,,A02,
に編集し、ファイルに出力したいのですが、11カラム以降の処理が上手く行きません。
3通りほど、試してみたのですが、それぞれ駄目でした。
どこがいけないのかとどうすればよいのかを教えてください。

環境は、
Solaris8、Bシェル
です。

No.1 -----------------------------------------------------------------
#!/bin/sh
#

if [ $# -eq 0 ] ; then
        echo "$0 FileName"
        exit 1
fi

FILE=$1
OUT_FILE=kekka.log
rm ${OUT_FILE} > /dev/null 2>&1

nawk -v OUT=${OUT_FILE} '
function max_desc(lstadr,lst) {
      m=split(lstadr,lst,":") ;
      return m ;
}
{
      cnt=1 ;
      n=split($0,arglst,",") ;
      for(i=11;i<=n;i++) {
              m=max_desc(arglst[i],lst["${i}"]) ;
              if (m>cnt) { cnt=m ; }
      }

      no=1 ;
      for(i=1; i<=cnt; i++) {
            for(j=1; j<=n; j++) {
                  if (j==2) {
                        printf("%d,",no++) >> OUT ;
                  } else if (j==11 || j==12 || j==13 || j==14 || j==15 || j==16) {
                          printf("%s,",lst["${j}"][i]) >> OUT ;
                  } else {
                        printf("%s,",arglst[j]) >> OUT ;
                  }
            }
            printf("\n") >> OUT ;
      }
}' ${FILE}

exit 0

No.2 -----------------------------------------------------------------
#!/bin/sh
#

if [ $# -eq 0 ] ; then
        echo "$0 FileName"
        exit 1
fi

FILE=$1
OUT_FILE=kekka.log
rm ${OUT_FILE} > /dev/null 2>&1

nawk -v OUT=${OUT_FILE} '
function max_desc(lstadr,lst) {
        cnt=split(lstadr,lst,":") ;
        return cnt ;
}
{
        num=1 ;
        n=split($0,arglst,",") ;
        for(i=11;i<=n;i++) {
                ret=max_desc(arglst[i],lst[++x,y]) ;
                if (ret>num) { num=ret ; }
        }
        nf=x ;

        no=1 ;
        for(y=1; y<=num; y++) {
                for(j=1; j<=10; j++) {
                        if (j==2) {
                                printf("%d,",no++) >> OUT ;
                        } else {
                                printf("%s,",arglst[j]) >> OUT ;
                        }
                }
                for(x=1; x<=nf; x++) {
                        printf("%s,",lst[x,y]) >> OUT ;
                }
                printf("\n") >> OUT ;
        }
}' ${FILE}

exit 0

No.3 -----------------------------------------------------------------
#!/bin/sh
#

if [ $# -eq 0 ] ; then
        echo "$0 FileName"
        exit 1
fi

FILE=$1
OUT_FILE=kekka.log
rm ${OUT_FILE} > /dev/null 2>&1

nawk -v OUT=${OUT_FILE} '
function max_desc(lstadr,lst,x) {
        cnt=split(lstadr,arrlst,":") ;

        for(j=1;j<=cnt;j++) {
                lst[x,j]=arrlst[j] ;
        }
        return cnt ;
}
{
        num=1 ;
        n=split($0,arglst,",") ;
        for(i=11;i<=n;i++) {
                ret=max_desc(arglst[i],lst[++x,y],x) ;
                if (ret>num) { num=ret ; }
        }
        nf=x ;

        no=1 ;
        for(y=1; y<=num; y++) {
                for(j=1; j<=10; j++) {
                        if (j==2) {
                                printf("%d,",no++) >> OUT ;
                        } else {
                                printf("%s,",arglst[j]) >> OUT ;
                        }
                }
                for(x=1; x<=nf; x++) {
                        printf("%s,",lst[x,y]) >> OUT ;
                }
                printf("\n") >> OUT ;
        }
}' ${FILE}

exit 0

No. 4580 # zsh 2006/04/19 (水) 13:27:30
>>4579 べた
これが賢いやり方とも思えませんが、一応作ってみました。
------
$ cat a.awk
BEGIN {
        FS=",";
        chk_col=11;
} {
        if ($chk_col ~ /:/) {
                str_head=head_string();
                split_num=split($chk_col, str_foot, ":");
                for (i=1; i<=split_num; i++) {
                        for (j=chk_col+1; j<=NF; j++) {
                                split($j, col_buf, ":");
                                str_foot[i]=sprintf("%s,%s", str_foot[i], col_buf[i]);
                        }
                        print str_head "," str_foot[i];
                }
        } else {
                print;
        }
} function head_string() {
        str_buf=$1;
        for (k=2; k<chk_col; k++) {
                str_buf=sprintf("%s,%s", str_buf, $k);
        }
        return str_buf;
}
------
------
$ cat a
001,a2,a3,a4,a5,a6,a7,a8,a9,a10,,,,,,
002,a2,a3,a4,a5,a6,a7,a8,a9,a10,111:222,123:456,001:002,100:200,A01:A02,0:1
003,a2,a3,a4,a5,a6,a7,a8,a9,a10,111:222,123:,:,:,A01:A02,:
------
------
$ awk -f a.awk a
001,a2,a3,a4,a5,a6,a7,a8,a9,a10,,,,,,
002,a2,a3,a4,a5,a6,a7,a8,a9,a10,111,123,001,100,A01,0
002,a2,a3,a4,a5,a6,a7,a8,a9,a10,222,456,002,200,A02,1
003,a2,a3,a4,a5,a6,a7,a8,a9,a10,111,123,,,A01,
003,a2,a3,a4,a5,a6,a7,a8,a9,a10,222,,,,A02,
------

>>4571 68user
今更ですが、Solarisでは

$ echo "Apr 02 12:25:00 ===" | sort -M - logfile | \
    sort -n -k2,3 | cat -n | grep "===" | awk '{print $1}'

等としないとダメみたいです。

No. 4581 # べた 2006/04/19 (水) 16:30:24
>>4580 zsh
zshさん、ありがとうございます。
一応、動いたのですが、フィールド2の値を別の
文字置き換えたいのですが、どうすればよいのですか。

ファイル11以降に「:」で区切られたデータが存在した
場合、データの数分順番に番号を振りたいのです。
なければ、デフォルトで”1”としたいのです。

-----
$ cat a
001,a2,a3,a4,a5,a6,a7,a8,a9,a10,,,,,,
002,a2,a3,a4,a5,a6,a7,a8,a9,a10,111:222,123:456,001:002,100:200,A01:A02,0:1
003,a2,a3,a4,a5,a6,a7,a8,a9,a10,111:222,123:,:,:,A01:A02,:

-----
結果
001,1,a3,a4,a5,a6,a7,a8,a9,a10,,,,,,
002,1,a3,a4,a5,a6,a7,a8,a9,a10,111,123,001,100,A01,0
002,2,a3,a4,a5,a6,a7,a8,a9,a10,222,456,002,200,A02,1
003,1,a3,a4,a5,a6,a7,a8,a9,a10,111,123,,,A01,
003,2,a3,a4,a5,a6,a7,a8,a9,a10,222,,,,A02,

No. 4582 # zsh 2006/04/19 (水) 18:42:38
>>4581 べた
適当に直してみました。
------
BEGIN{
        FS=",";
        chk_col=11;
} {
        str_head_1=$1;
        if($chk_col ~ /:/) {
                str_head_2=head_string(chk_col);
                split_num=split($chk_col, str_foot, ":");
                for (i=1; i<=split_num; i++) {
                        for (j=chk_col+1; j<=NF; j++) {
                                split($j, col_buf, ":");
                                str_foot[i]=sprintf("%s,%s", str_foot[i], col_buf[i]);
                        }
                        print str_head_1 "," i "," str_head_2 "," str_foot[i];
                }
        } else {
                str_head_2=head_string(NF);
                print str_head_1 ",1," str_head_2;
        }
} function head_string(chk_point) {
        str_buf=$3;
        for (k=3; k<chk_point; k++) {
                str_buf=sprintf("%s,%s", str_buf, $k);
        }
        return str_buf;
}
------

No. 4583 # べた 2006/04/19 (水) 21:00:53
>>4582 zsh

zshさん、ありがとうございます。
>str_head_2=head_string(NF+1);
>for (k=4; k<chk_point; k++) {
の行を修正したら期待する結果が得られました。

ただ、ファイルのフォーマットに規則性がないことがわかり、
データによっては、正しく出力されないものがでてきました。
フィールド11に、「:」が存在しないデータがあるのです。

a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,111,123,SSS,A01,,:
a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,,,,123:456:789:100:100,A01:A02:A03:3A:NTT0001,

「 if($chk_col ~ /:/) {」
の判定を増やし、フィールド番号を取得できればできますか。

No. 4584 # べた 2006/04/19 (水) 22:45:43
>>4582 zsh
>>4583 べた

一応、動きます。
以下のようになるのでしょうか。

BEGIN{
        FS=",";
        chk_col=11;
}
{
        str_head_1=$1;
        split_num=chk_comma_max(NF);
        if(split_num!=0) {
                str_head_2=head_string(chk_col);
                split($chk_col, str_foot, ":");
                for (i=1; i<=split_num; i++) {
                        for (j=chk_col+1; j<=NF; j++) {
                                split($j, col_buf, ":");
                                str_foot[i]=sprintf("%s,%s", str_foot[i], col_buf[i]);
                        }
                        print str_head_1 "," i "," str_head_2 "," str_foot[i];
                }
        } else {
                str_head_2=head_string(NF+1);
                print str_head_1 ",1," str_head_2;
        }
}
function chk_comma_max(chk_point) {
        comma_num=0;
        for (k=chk_col; k<=chk_point; k++) {
                if($k ~ /:/) {
                        comma_num=split($k, s, ":");
                        break;
                }
        }
        return comma_num;
}
function head_string(chk_point) {
        str_buf=$3;
        for (k=4; k<chk_point; k++) {
                str_buf=sprintf("%s,%s", str_buf, $k);
        }
        return str_buf;
}

No. 4585 # まんたろう 2006/04/20 (木) 00:36:53
>>4579 べた

No.1
    m=max_desc(arglst[i],lst["${i}"]) ;
    添え字を利用した配列でいいのかな。
    あまり利用したことはないのでなんとも入れないが、こういうところで
    使えないのではないでしょうか。
    添え字にマッチする文字が出てきたときに、何かするのではなかった
    かと思います。

No.2、No.3
    多次元配列の使い方がおかしいのではないかと思います。
    データをセットする側が多次元配列や、アドレス渡しの戻りができて
    いない。たぶん、縦軸(列)の添え字の値が正しくない。
    縦軸(列)の値ってちゃんととれてますか。

No. 4586 # まんたろう 2006/04/20 (木) 00:44:59
>>4579 べた

多次元配列の使い方が正しいか問題はありますが、書き込みがあった
シェルを使用して、多次元配列で動くのを作ってみました。
一応、動きますが。

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

if [ $# -eq 0 ]; then
        echo "$0 FileName"
        exit 1
fi

FILE=$1
OUT_FILE=kekka.log
rm ${OUT_FILE} > /dev/null 2>&1

nawk -v OUT=${OUT_FILE} '
function max_desc(lstadr,lst,x,y) {
        cnt=split(lstadr,arrlst,":");

        for(y=1;y<=cnt;y++) {
                lst[x,y]=arrlst[y];
        }
        return cnt;
}
{
        num=1;
        row=0;
        col=0;

        n=split($0,arglst,",");
        for(i=11;i<=n;i++) {
                ret=max_desc(arglst[i],lst,++row,col);
                if (ret>num) { num=ret; }
        }

        seqno=1;
        for(y=1; y<=num; y++) {
                for(j=1; j<=10; j++) {
                        if (j==2) {
                                printf("%d,",seqno++) >> OUT ;
                        } else {
                                printf("%s,",arglst[j]) >> OUT;
                        }
                }
                for(x=1; x<=row; x++) {
                        printf("%s",lst[x,y]) >> OUT;
                        if (x!=row) { printf("%s",",") >> OUT; }
                }
                printf("\n") >> OUT;
        }

        for(x=1; x<=row; x++) {
                for(y=1; y<=num; y++) {
                        delete lst[x,y];
                }
        }
}' ${FILE}

exit 0

-----------------------

No. 4587 # S-MSK☆ 2006/04/20 (木) 20:59:08
あるCシェルの本でファイル検査演算子「-f」の意味は
「ファイルは普通のファイル」とあるのですが、
普通の定義が分かりません。
また、逆に普通ではないファイルとはどういったもの
になるのでしょうか??
ご回答頂ければ、幸いです。
宜しくお願い致します。

No. 4588 # 68user 2006/04/21 (金) 11:02:50
>>4575 ふくし
もう解決されているとは思いますが一応。

Postfix に hosts を参照させるのが一番の早道かつ王道だと思いますが
わたしは Postfix を知らないので、識者のいるメーリングリストなどで
質問するのがよいかと思います。

>>4587 S-MSK☆
> 「ファイルは普通のファイル」とあるのですが、
> 普通の定義が分かりません。
csh 的には、stat(2) した結果の st_mode (構造体 stat のメンバ) に対して、
通常ファイル判定マクロ S_ISREG が真を返したら、「普通」です。

では S_ISREG がどういうケースで真を返すかというと、vfs の vtype の
値が VREG であるときです (vtype はファイル作成時に決定され、ファイル
システムに記録される)。

では vfs の vtype の値が VREG であるのはどういうときかというと、
ファイルシステム依存です。ただし一般的な UFS で言うと、vtype は
    1. シンボリックリンク
    2. ソケット
    3. FIFO (名前付きパイプ)
    4. デバイスファイル (キャラクタデバイス・ブロックデバイス)

    5. 通常ファイル
くらいです。よって、大抵の場合 1〜4 に当てはまらないなら通常ファイル
といえます。

実際は、Solaris Door とか、VxFS 圧縮ファイルとか、HP-UX のネットワーク特殊
ファイルなどわけのわからんのがありますので、プログラムとしては
    「1〜4 に当てはまらない場合は通常ファイル」
などという仮定はせず、素直に -f を使いましょう。

No. 4590 # 星野 2006/04/23 (日) 18:05:21
UNIX環境のAとBというプロセス間でsocket通信を行っています。(AF_UNIX指定)
一度、ソケットをcloseして、Bが再接続(connect)するとエラーになる場合があります。
errnoが何で返却されているのかわからないのですが。
たとえばEADDRINUSE の場合の対応策を教えて下さい。

No. 4591 # いち 2006/04/24 (月) 21:51:46
番号を昇順に並び替えて、抜けている番号を表示したく、以下の様なシェル
でやってみたのですが、上手く行きません。
どうすればいいでしょうか。
Solaris8 Bシェルです。

sort test.txt | nawk -v key="" '{if(FNR!=0 && $1!=key) print $1 ; key=$1}'
sort test.txt | nawk -v key="" -F"," '{if(FNR!=0 && $1-1!=key) printf("%0.4d\n",key+1); key=$1}'
sort test.txt | nawk -v key="" -F"," '{if(FNR!=0 && $1!=key) printf("%0.4d\n",key+1); key=$1}'

# cat test.txt
0006
0009
0004
0010
0003

結果
0001
0002
0005
0007
0008
と表示したい。

No. 4592 # いち 2006/04/25 (火) 16:52:15
>>4591 いち

nawk -v key=1 '{ for(;;){if($1!=key) {print key; key++;} else{key=$1+1; break;}} }' a.txt
でできました。

No. 4593 # S-MSK☆ 2006/05/01 (月) 14:44:56
>>No. 4588 68user
No.4587のS-MSK☆です。
ご回答有難う御座いました。

No. 4594 # shimizu [E-mail] 2006/05/04 (木) 11:04:32
FTP クライアントを作ってみよう (1) FTP プロトコルの概略

No. 4595 # shimizu [E-mail] 2006/05/04 (木) 11:05:02
>管理人様

FTP クライアントを作ってみよう (1) FTP プロトコルの概略

が大変勉強になりました。ありがとうございました。

No. 4596 # くるみんパパ 2006/05/10 (水) 11:59:59
vmstatをファイルへ出力する時に、1行毎に日時を編集したいのですがうまく出来ません。AIXですと下記のスクリプトでうまくいっているのですがsoralisではどのようにしたらよいでしょうか。

vmstat $1 $2 | awk '!/kthr|---|avm/ {printf("%s | ", $0);system("date")}' >> $LOGDIR$DATE

No. 4597 # zsh 2006/05/10 (水) 13:58:02
>>4596 くるみんパパ
system関数が使いたいのであればnawkか/usr/xpg4/bin/awkを使用してください。

No. 4598 # くるみんパパ 2006/05/10 (水) 14:52:42
>>4597zshさん
nawkで解決しました。助かりました。ありがとうございました。

No. 4599 # 勉強中 2006/05/11 (木) 21:58:28
はじめまして。TCP/IPについて素朴な質問があります。
TCP/IPでは、ACKに対するSYNのタイムアウトがあり、
通常のLINUXであれば180秒ほどだと思います。
一方、telnetで存在しないIPを指定すると上記タイムアウトまでかからず、
以下のメッセージが出て接続できません。

Trying 192.168.60.113...
telnet: Unable to connect to remote host: No route to host

この場合、なぜ上記タイムアウトまで待たないのでしょうか。
telnetコマンドにて
明示的にTCPリトライ回数を指定していると考えていいのでしょうか。
また、このメッセージの意味するところはどういうところなのでしょう?
誰かご存知の方がいたらご教授願います。

No. 4600 # 68user 2006/05/11 (木) 22:19:01
>>4599 勉強中
直接的な回答ではありませんが、
    http://X68000.q-e-d.net/~68user/net/tcp-connect-1.html
をご一読ください。なお、EHOSTUNREACH が No route to host です。

No. 4601 # 勉強中 2006/05/12 (金) 00:22:27
>68userさん
早速のコメントありがとうございます。
要するにアプリケーションの実装によるということですね。
(つまり、ICMP 終点到達不可メッセージを受信した際に、
    ただちにコネクション確立を中止するかしないかというポリシーによるということ)
ちなみにftpでもtelnetと同様でした。

No. 4602 # 68user 2006/05/12 (金) 11:39:16
>>4601 勉強中
> 要するにアプリケーションの実装によるということですね。
いいえ、OS の TCP スタックの実装による、だと思います。

アプリ側で対応する、つまり TCP で接続しつつ、ICMP のエラーを解析という
ことが可能かどうかはやったことがないのでわかりませんが、少なくとも ftp や
telnet という基本的なアプリがそういう小細工をしている可能性は低いと思います。

No. 4603 # 68user 2006/05/13 (土) 19:47:43
>>4602 68user
> アプリ側で対応する、つまり TCP で接続しつつ、ICMP のエラーを解析という
> ことが可能かどうかはやったことがないのでわかりませんが、少なくとも ftp や
> telnet という基本的なアプリがそういう小細工をしている可能性は低いと思います。
ICMP のエラーを解析する必要はなかったですね。connect(2) が -1 を返したとき
EHOSTUNREACH なら再接続、などとすればアプリ側で対応できます。

とはいえ、やはり ftp や telnet がそういうことをする必然性はないと思います。

No. 4604 # COM 2006/05/16 (火) 18:01:08
はじめまして。ネットワークプログラムについて質問させてください。
リミテッドブロードキャスト(255.255.255.255へ)を行いたいのですが、sockaddr_in
のアドレス部分に上記を入れても、何故かディレクテッドブロードキャスト(私の環境
では 192.168.1.255 )になってしまいます。正しくリミテッドブロードキャストする
方法はないでしょうか。setsockopt でブロードキャストのフラグを立てる、などは
行っています。環境は FreeBSD & gcc です。
以下、重要部分の抜粋です(エラー処理などは省いています)。

struct sockaddr_in addr;
int broadcast = 1;
char buf[] = "test";
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("255.255.255.255");
addr.sin_port = htons(2000);
sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
setsockopt( sock, SOL_SOCKET, SO_BROADCAST, (char*)&broadcast, sizeof(broadcast) );
sendto( sock, buf, sizeof(buf), 0, (struct sockaddr*)&addr, sizeof(struct sockaddr) );

ごく普通のコードだと思うのですが、パケットをモニターすると、送り先アドレスが
ディレクテッドブロードキャストになってしまっています。アドバイスだけでもいいので
助言いただけるとうれしいです。

No. 4605 # yuukun 2006/05/25 (木) 15:21:00
はじめまして。sendmailコマンドについての質問です。
[FROM:]や[TO:]フィールドに、アドレスとはべつに別名を指定し実行したところ、
エラーが出力されました。
-------------<実行コマンド>----------------------
sendmail -t
MIME-Version: 1.0
From: hoge株式会社<hoge@hoge.co.jp>
To: huge株式会社御中<huge@huge.co.jp>
Subject: 2006年05月25日の[データ]
Content-Type: text/plain; charset=iso-2022-jp

2006年05月25日 14時53分現在の
データをお送りいたします。
.
------------------------------------------------
TOやFROMフィールドでアドレスとはべつに別名を付けることは可能なのでしょうか?
よろしくお願いします。
OS:Solaris 8

No. 4606 # kojp-jp 2006/05/29 (月) 13:17:45
以下のページの「#inlcude <stdlib.h>」、スペルミスしている様です。

    http://x68000.q-e-d.net/~68user/unix/pickup?getenv

正しくは「#include <stdlib.h>」かと…。

ご確認ください。

No. 4607 # analog 2006/05/29 (月) 13:46:40
初めまして、soralisのC言語について質問させてください
10年以上前にsolalis v4.1で開発してもらったのが
あるのですが、コンピュータ、プリンタが古くなり
最新のものに変えたいとメーカに相談した所
C言語でXVEIWが使われているので最初から作り直しと
なりますといわれました
1.ほんとうに最初からの作りなおしになるのか?
        ソフトはあまり変えず
        現在市販のPC、プリンタを使いたいだけなんですが
        OSは問わない
    
以上なんですが
業者のいいなりになるしかないのか
(修正費用がかなりかかるので)
教えてもらえないでしょうか

No. 4608 # 68user 2006/06/01 (木) 16:48:43
SPAM がウザすぎなので、
    BBQ http://bbq.uso800.net/
を組み込んでみました。BBQ に引っかかると Internal Server Error になります。
書けない場合は書けねぇぞ! と書き込んでください (その際も Internal Server
Error になりますが)。しばらくはログを観察するようにしますので、可能であれば
対処します。

さてうまくいきますかねぇ。

No. 4609 # 68user 2006/06/01 (木) 17:24:53
>>4604 COM
わかりませんが、Linux で動かしてパケットを見ると、255.255.255.255 宛に
飛んでいました。

>>4605 yuukun
> エラーが出力されました。
エラー内容を書きましょう。

>>4606 kojp-jp
getenv と putenv 両方間違っていたので修正いたしました。
ありがとうございました。

>>4607 analog
XView ならば、わたしも同様に言います。理由は以下のとおり。
    - 現在は、XView はほとんど使われていない
    - よってほとんどの開発者には XView の知識がない
    - 勉強しようにも、解説本が売られていない (と思われる)
    - 勉強しても、その知識を他で生かせる可能性が低い

> ほんとうに最初からの作りなおしになるのか?
基本的には OpenWindows 環境がある Solaris10 などでは動くはずですが、
とにかく XView も OpenWindows も時代遅れな環境ですので、修正が必要な
部分はそれなりにあると思われます。

よって XView の技術者がいる会社であれば、修正量・移行リスクを見積もる
ことができ、修正作業も行えるでしょう。

http://business.rakuten.co.jp/ などでそういう会社をがんばって探すか、
作り直しを受け入れるか、です。


ちなみに、わたしが今いる環境には技術者が数十名いますが、おそらく
XView がわかる人はいないと思われます。昔いた会社は UNIX を作って
いたくらいなので探せばいるでしょう。ただし、いたとしても 40〜50歳の
おじさんだと思われます。すでに管理職だったり、工数が見合わなかったりで、
受けたがらないでしょうね。

No. 4618 # COM 2006/06/02 (金) 11:24:28
>>4609 68user
ご返答ありがとうございます。Linux ではそれでうまくいくのですね。
どうしてもダメだったので、rawIP を使い、MAC アドレスを FF:FF:FF:FF:FF:FF に
セットすることで解決しました。ありがとうございました。

No. 4619 # 68user 2006/06/02 (金) 16:31:55
>>4608 68user
BBQ 導入後 24時間で、
    - 成功 20件 (SPAM を SPAM と判定できたケース)
    - 失敗 12件 (SPAM をそのまま通してしまったケース)
でした。それなりにがんばってくれたものの、毎日12件削除するのは面倒。
URLBL のチェックも追加しようかな。

No. 4652 # はじめ 2006/06/05 (月) 18:30:05
lsコマンドを使用してファイル数を取り出そうとしています。
ファイルが存在しない場合、「No such file or directory」
を表示しないよう、位置パラメータでファイル数を求めています。
ファイルが存在する場合は、問題ないのですが、ファイルが存在
しない場合、必ず”1”となってしまいます。
どうしてなのでしょうか。また、上手くするにはどうしたらよい
のでしょうか。

環境は、Solaris8、Bシェル です。

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

if [ $# -ne 1 ] ; then
        exit 1
fi

ymd=$1

set -- `ls *_$ymd*.csv 2>/dev/null`
echo $#

No. 4659 # zsh 2006/06/06 (火) 10:35:36
SPAMひどいですね・・・

>>4652 はじめ
位置パラメタの数は 1 となっているのは
スクリプトに引数を与えている為です。
引数を変数に格納後、shift させれば OK です。

No. 4660 # はじめ 2006/06/06 (火) 21:24:43
>>4659 zsh

>引数を変数に格納後、shift させれば OK です。
shift するということには気がつきませんでした。
ありがとうございます。

再設定すれば良いのかと思い
set ''
set --
でやってみたのですが。

No. 4662 # はじめ 2006/06/07 (水) 02:09:26
>位置パラメタの数は 1 となっているのは
>スクリプトに引数を与えている為です。
>引数を変数に格納後、shift させれば OK です。

質問では、引数を1つにしていましたが、
引数が複数あった場合は、引数の数分、shiftしないと
いけないのでしょうか。
一発で、shiftすること可能なのでしょうか。

No. 4664 # nan 2006/06/07 (水) 07:12:14
はじめまして。

[全文検索機能]
http://x68000.q-e-d.net/~68user/webcgi/search-1.html

↑のページの eval 法、大変参考になりました。
条件固定でループするときに、余計なものを除けるのがいいですね。
eval ってなんか最終手段っぽくて敬遠してましたが、これからは視野にいれて組んでみたいと思います。
どうもありがとうございました。

No. 4665 # zsh 2006/06/07 (水) 11:58:02
>>4662 はじめ
> 一発で、shiftすること可能なのでしょうか。

shift $#
としてください。

No. 4666 # はじめ 2006/06/07 (水) 12:40:07
>>4665 zsh

>shift $#
ありがとうございます。

No. 4667 # ビンゴ中西 2006/07/08 (土) 19:50:06
はじめまして。大変わかりやすいページで非常にためになっております。

さて、間違いがあったら掲示板で指摘してくださいとありましたので、
書かせていただきます。 すでにお気づきなら申し訳ありません。

http-client-2.c

のコードで113行目の以下の部分ですが、

113: fprintf(fp, "Host: %s:%d\r\n", host, port);

最後の引数は port ではなく server.sin_port ではないでしょうか?
82〜91行目でポート番号を指定していなかったときの処理がありますが、
ここで server.sin_port を用いられているため
最後まで port は 0 のままでした。

No. 4669 # わんこ 2006/07/14 (金) 17:58:08
こんにちわ。
Solaris7 のftp についてどなたかご存知でしたらご教授ください。

Solaris8 のような、あるユーザにはftpを出来なくするような機能「/etc/ftpd/ftpusers」があるのでしょうか。

皆様よろしくお願い致します。

No. 4671 # ようこ 2006/07/18 (火) 22:56:06
Pthreadにて、スレッドをあらかじめ生成しておいて、
何らかのトリガーで後から起動するって、
どのようにPGすれば良いのでしょうか?
よろしくお願い致します。

No. 4672 # hoge 2006/07/19 (水) 17:21:38
>4669
man が入ってない環境なんでしょうか?
docs.sun.com に行くとドキュメント群が公開されてますよ。

http://docs.sun.com/app/docs/doc/805-3173/6j31cpluf?q=ftpusers&a=view
を見る限り、solaris 7 付属の ftpd は /etc 直下の ftpusers を
参照するみたいですね。もし、無かったら作ってみましょう。

No. 4673 # hogehoge 2006/07/20 (木) 11:35:21
適用済みパッチを調べるものとして
・showrev -p
・patchadd -p
の2つがあると思うのですが
この2つの違い等を知っている方がいらっしゃいましたら
教えていただきたいです。(UNIX の部屋には無かったので。)

patchadd -p は root 権限のみ実行できたという違いだけでしょうか?
(新しいパッチでは root でなくとも実行できる。)

よろしくお願いいたします。

No. 4676 # わんこ 2006/07/24 (月) 18:01:25
>4672

ご返信が遅くなりまして申し訳ございませんでした。

ドキュメント参考に、ディレクトリ(ftpd)作成、ファイル作成して、
ftp禁止ユーザを制御できるようになりました。

しっかりドキュメントを参照しなければいけませんでした。
これからは、まずドキュメント参照を心掛けたいと思います。

hogeさん、大切なお時間ありがとうございました。

No. 4677 # まさしくん 2006/08/01 (火) 14:10:48
こんにちは。
vmstatを起動すると、「vmstat: 0551-129 knlist が失敗しました。」という
エラーで情報が取得出来ません。何が考えられますでしょうか。
ちなみにOSの再起動を試みましたが、解決されませんでした。

No. 4678 # バンガード 2006/08/02 (水) 09:04:28
>>4677 まさしくん
はじめまして。
御質問のキーワードを検索すると、以下のページがヒットしました。
参考になりませんでしょうか?
http://unix.derkeiler.com/Mailing-Lists/AIX-L/2003-12/0105.html

No. 4679 # バンガード [E-mail] 2006/08/02 (水) 09:19:42
>>4677 まさしくん
私が使用しているAIXの場合の話ですが、このエラーは「ある種のカーネル・メモリの問題」で発生する様です。
/usr/lib/boot/unix_mp ファイルのサイズがゼロとなっているはずですので、その場合には他のサーバー(同じOSの同じバージョンが良いですね)から同じファイルをコピーすることで復旧出来る様です。

残念ながら、何故このファイルのサイズがゼロになるかまでは分かりませんが、上記の通りファイルをコピーし直すか、/unix のリンクが失われている場合はリンクを張り直すと言うことで解消する様です。

No. 4680 # yu-ya! 2006/08/02 (水) 09:41:06
はじめまして。
とても初歩的な質問で恐縮ですが、
RedHat Enterprise 4で、/var/log/messages 内に格納される情報が
    日付 時間 ホスト名 プログラム名 メッセージ
の順番で格納されているのはわかるのですが、
それぞれの最大文字数についてどなたかご教授願えませんか?

よろしくお願いいたします。

No. 4681 # goro 2006/08/04 (金) 15:58:07
はじめまして。
Solarisのsyslog.confの設定で
特定のログレベルのみを任意の出力ファイルに出力させたいのですが、
いろいろ調べたのですが、途方に暮れています。
Linuxのsyslog.confの設定では、
mail.=debug /ログ出力先
(↑mailのdebugのみ出力。debug以上のレベルも出力しない)
という設定方法があるのですが、Solarisで同じような書き方しても
設定ファイルを読み込む時に、
「'=debug'なプライオリティはありません」と怒られてしまいます。
方法がありましたら、どなたかご教授願います。

No. 4683 # まさしくん 2006/08/07 (月) 17:01:38
>バンガードさん
レスが遅くなり申し訳ございません。

/unixのリンクが無かったので、リンクをはり直したら正常に動くようになりました。

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

No. 4684 # さとしくん 2006/08/15 (火) 17:06:09
psコマンドを使って、システムのcpuなどを5秒毎にログに書き込みたいのですが、どうやればいいのか検討がつきません。どなたかcシェルを利用してできる方法を教えてください。よろしくお願いします。

No. 4686 # さとしくん@計算ができませ〜ん 2006/08/15 (火) 17:21:46
STARTTIMEM=`date +%M`
こんにちわ!
STARTTIMEM=`date +%M`
STARTTIMES=`date +%S`
STARTTIME=`expr $STARTTIMEM \* 60 + $STARTTIMES`
echo $STARTTIME

以下のようなメッセージが出てしまう。
expr: 文字列に対して演算を行おうとしました。

No. 4687 # DM 2006/08/17 (木) 02:40:25
最近Cygwinをはじめた初心者です。
X-Windowなるものの存在を知り、Cでウインドウを出したり直線書いたりしてプログラムを勉強していたのですが、コンパイルして実行しようとすると

.... _cygtls::handle_exceptions:Error while dumping state (prbably corrupted stack)
Segmentation falu (core dumped)

というエラーがでます。

以前までは普通にコンパイル〜実行とできていたのですが・・・

ちなみに
startxwin.sh
の後に実行してみるとプログラムは動きました。

startxwin.sh などうたなくても実行する方法はありますか?またそのような設定はどうすればいいのでしょうか?

No. 4688 # バンガード 2006/08/17 (木) 13:24:39
>> 4684
この掲示板の[使い方]を見ると以下の様に記述されています。
---------------------------------------
UNIX・ネットワーク一般の質問は受け付けていません
当ページのコンテンツに対するご意見・ご指摘のみ受け付けています。
---------------------------------------
今回の様な質問は受け付けていないはずですよ。

ひとまず、私の使用している環境(AIX 5.1)で検証した結果を提示します。
以下の通り、全く問題なく実行出来ています。
-------------------
[vanguard]> cat test.sh
#!/usr/bin/sh
STARTTIMEM=`date +%M`
STARTTIMES=`date +%S`
STARTTIME=`expr $STARTTIMEM \* 60 + $STARTTIMES`
echo $STARTTIME
[vanguard]> date
Thu Aug 17 13:07:36 JST 2006
[vanguard]> test.sh
459
[vanguard]>
-------------------

管理者様
4678,4679も含めて問題がある様でしたら、削除いただいて結構です。
質問だけでなく、回答もこの掲示板の目的に沿っていないと思いますので、私の発言は確認なしに削除いただいて結構です。

No. 4689 # バンガード 2006/08/17 (木) 13:27:54
>>4684 さとしくん
No.4688 は No.4686 に対する回答でした。
コメントの仕方を誤っていました。

4684で質問されている5秒毎にpsコマンドを実行し、ログに書き出すのは以下のシェルでいかがでしょうか?
--------------------
#!/usr/bin/sh
ps > /tmp/ps.log
while [ 1 ]
do
                ps >> /tmp/ps.log
                sleep 5
done

No. 4690 # よしだ 2006/08/18 (金) 00:07:16
シェル素人のよしだです。
シェルから、.sqlに値の渡し方を教えてください。
シェルにてテーブル名を入力させて、.sqlにそのテーブル名を渡したいのですが
どのようにしたら良いでしょうか?

○test.sh
#!/bin/sh
echo "テーブル名を入力してください:"
read table_name
sqlplus -S ユーザ名/パスワード@サービス名 @test.sql >tmp.txt

○test.sql
set pagesize 100
select 品目 from テーブル名;
exit;

No. 4691 # あゆ 2006/08/18 (金) 16:01:48
UNIXの全くの初心者です。失礼を承知で質問します。
スクリプトをmoreで表示すると、文字化けするものがあるのですが、どのようにすれば、見ることができるでしょうか。

ターミナルソフトの設定ではEUC表示設定にはなっています。
システムが作成したスクリプトというものは、ユーザからは見ることができないのでしょうか。
申し訳ありません。お手数ですが、文字化けしない表示方法を教えてください。
宜しくお願いします。

No. 4692 # バンガード [E-mail] 2006/08/22 (火) 09:42:43
>>4691 あゆ
どの様な状況になっているのか具体的な状況が見えません。
特定のスクリプトが全て文字化けするのでしょうか?
それとも、そのスクリプトの一部が文字化けするのでしょうか?
「file スクリプト名」とするとどうなりますか?
ターミナルソフトの設定を「S-JIS」や「JIS」にするとどうなりますか?

No. 4693 # あみ 2006/08/22 (火) 19:04:19
はじめまして。あみと申します。
Solarisに関する仕様を調査していて、この掲示板に出くわしました。

No.3716で以下のような記述がありますが、Solaris9以降の仕様をご存知の方いらっしゃいませんか。

>Solaris8 では sh・ksh・csh いずれも 255 文字の制限があるようで、極めて
>不愉快ですね。

Solaris9では入力コンソールでは制限がないように思われるのですが、
入力後にバッファに読み込ませて表示させると途中からしか表示されないという現象がおこっています。

具体的には
1)/export/home/hoge/aaaaa・・・bbbbbbbb←のような300〜400くらいのパスを入力する
2)この入力から
        java.io.Reader reader = new java.io.InputStreamReader(java.lang.System.in);
        java.io.BufferedReader buf = new java.io.BufferedReader(reader);
        String input = buf.readLine();
    のように標準出力へ表示する。
3)全てが表示されずに途中の
    aaaaaaa・・・bbbbb
    のような表示のみが値として出力されてしまう。
    ⇒結果エラーになる

どなたか、ご存知の方がいらっしゃいましたら教えてください。よろしくお願いします。

No. 4694 # 68user 2006/08/23 (水) 09:41:34
>>4667 ビンゴ中西
ご指摘ありがとうございます。とりあえずバグとして登録しました。
    http://x68000.q-e-d.net/~68user/bugnote/viewbug.php?projectid=1&bugid=27

時間が取れたときに修正いたします。ありがとうございます。

No. 4695 # さとし 2006/08/23 (水) 15:48:57
バンガードさんいろいろ説明ありがとうございました。できました!!!

No. 4696 # yuki 2006/08/24 (木) 11:55:01
初めまして。皆様よろしくお願い致します。
現在、solaris8のサーバー管理をやっているのですが、
cpu負荷実績を調べてる上で、
cputstというプロセスが異常に占有しています。cputstってどういうものでしょうか。。?ご教授ください。

No. 4697 # あゆ 2006/08/24 (木) 15:36:07
>>4692 バンガード
バンガードさん
ご回答頂き、ありがとうございます。

スクリプトは、社内の人が作成したものは見れますが、元々入っているスクリプトは文字化けしてしまいました。


lsコマンドでファイルを見てみると、このように表示されました。
-r-xr-xr-x 1 root bin 39632 9月 8日 2003年

「file スクリプト名」の結果は、以下のようになりました。
ELF 32-ビット MSB 実行可能 SPARC バージョン 1[動的にリンクされています][取り
除かれています]

ターミナルソフトは「S-JIS」や「JIS」に設定し直しても文字化けしてしまいました。

お手数おかけして、申し訳ありません。
宜しくお願い致します。

No. 4699 # まさしくん 2006/08/26 (土) 11:03:23
>No. 4697 あゆさん
それはバイナリのモジュールなので、文字化けして当然です。
ちなみにそういったものをmoreやcatで見ると、文字化けした中で制御コードとして
認識される文字が出力され、下手をするとOSが飛ぶ危険がありますので、
fileコマンドで確認してからの方が良いと思いますよ。

No. 4700 # バンガード 2006/08/28 (月) 09:27:38
>>4697 あゆ
4699 で「まさしくん」が回答されている通りです。
今回の対象ファイルは、バイナリのファイルですので cat や more では見られません。
私もたまに経験しますが、この様なファイルを cat や more で見ると最低でも画面が文字化けしたりしますし、最悪の場合「まさしくん」が言っている通り OS がダウンする可能性もあります。(私はまだそこまで行った経験はありませんが・・・)

No. 4702 # baba 2006/09/12 (火) 17:27:56
>>3716 68user
ksh でも set -o emacs で長いコマンドを受け付けたと思います。
>>4693 あみ
ldterm の制限なのでコーディングでどうにかなる問題ではありません。
tcsh/bash のように行を読み込む JNI の関数を作成して、
Java 側から呼び出すしかないと思います。

No. 4703 # Perl Queen 2006/09/21 (木) 00:29:06
こんばんは。初めて投稿します。

socketで、HTTP の取得を行うプログラムを作成しています。
取得はできたのですが、どうしても取得したデータに、
ゴミデータがまざります。

e05,5d,5, など、ランダムな数値です。
HTMLのタグ括りの中にも、外にも存在しますが、
タグ内には無いようでした。

他の諸センパイ方の情報も参考にさせていただいておりますが、
どうも、有力な手がかりがありませんでした。
何卒、ご教示いただけますでしょうか。
以下、プログラムの抜粋です。
--
$ip = inet_aton($host) || die "NG.\n";
$sockaddr = pack_sockaddr_in($port, $ip);
$proto = getprotobyname('tcp');
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) || die "NG.\n";
connect(SOCKET, $sockaddr) || die "NG.\n";
autoflush SOCKET (1);
if ($http eq '1.1') {
    print SOCKET "GET $url HTTP/1.1\n";
    print SOCKET "Host: $host\n";
    print SOCKET "Connection: close\n";
} else {
    print SOCKET "GET $url HTTP/1.0\n";
}
print SOCKET "Accept: text/html; */*\n";
print SOCKET "\n";
my($op_all) = '';
while (chomp($buf=<SOCKET>)) {
    $op_all .= $buf;
}
close(SOCKET);

No. 4704 # 68user 2006/09/21 (木) 02:34:38
>>4703 Perl Queen
> e05,5d,5, など、ランダムな数値です。
chunked エンコーディングというものです。簡単に言うと、その後に続く
バイト数を 16進表記したものです。もし邪魔なら、HTTP/1.1 ではなく
HTTP/1.0 のリクエストを投げればよいです。

No. 4705 # Perl Queen 2006/09/21 (木) 07:19:22
>>4704 68user

68user 様

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

HTTP/1.0 でリクエストすると、あるサイトの例ですが、
「サイトがありませんこのURLにはサイトがありません。または現在準備中です。準備中の場合は後に再度お試しください。」
などと出てしまい、サイトにたどり着くことができませんでした。

都合上、http://www.yahoo.co.jp/ のように、デフォルトURL
の指定にしているせいかもしれませんが、アクセス先のURLを
事前に知ることもできません。
あるいは、HTTP/1.0 で、URL指定の際に、何か回避ができたりしますでしょうか。

先に記載抜けていましたが、ポート番号は
$port = getservbyname('http', 'tcp');
であらかじめデフォルトを取るようにして、URL内にポートの指定があれば、
それを優先するようにしています。

No. 4706 # 68user 2006/09/22 (金) 11:13:20
>>4705 Perl Queen
HTTP/1.0 で、Host ヘッダを送信してみてください。
    http://x68000.q-e-d.net/~68user/net/http-4.html#1

No. 4707 # ゆう 2006/09/23 (土) 13:23:31
solaris10をインストールしたのですがインターネットに接続できません。
Mozilla1.7に何か設定が必要なのでしょうか?

初めまして、ゆうです。
先日初めてsolaris10をインストールしました。

デフォルトルーター:192.168.1.1
solarisPC:192.168.1.12
WindowsPC:192.168.1.11

上記のようにネットワークの設定を行っており、
WindowsPCからはインターネット接続が可能です。
また、WindowsPCとsolarisPCは互いにpingが通っています。

No. 4708 # 68user 2006/09/24 (日) 01:42:14
>>4707 ゆう
ひととおりチェックしてみてください。
    http://xxx.upken.jp/report/sol10nw.html

No. 4709 # zsh 2006/09/24 (日) 10:23:04
>>4707 ゆう
経験上 /etc/nsswitch.conf と /etc/resolv.conf の
設定を忘れている人が多い気がします。

No. 4710 # たけお 2006/09/25 (月) 17:44:26
こんにちわ。OSの再起動をスケジューリングしたいのですが、可能でしょうか?またそれはどのような事をすればいよいのでしょうか。ちなみにsolaris8を使ってます。よろしくお願いします。

No. 4711 # たけお ↓↓ 2006/09/25 (月) 17:50:05
自分が考えてることは、shutdownコマンドシェルを書いて、cronで実行、スケジュールする方法なんですが、他にありますか?例えば、再起動のスクリプトがあるとか・・・・

No. 4712 # たけお 2006/09/26 (火) 11:42:33
うまくいきました。どうも失礼します。

No. 4713 # 2006/09/27 (水) 10:55:45
システム間で電文を送受信する機能の設計を
担当することになり悩んでおります。

「相手システムに電文を送信して、その結果を受信する」または、
「相手から送信されてきた電文を受け取って、その結果を返す」
っといった設計に関してまったくの素人です。

なぜ素人に担当させるのかっといった事で突っ込まれると、
みもふたもないので、その点に関して触れないで下さい m(_ _)m

とりあえず、私のレベル(下記)にあった
分かりやすい参考書、またはインターネットのサイトを見て
基礎勉強(下記)からはじめたいのですが、参考資料/サイト
の紹介をお願いします。

<開発環境(案)>
OS:Solaris 
言語:Java(自分からAシステムへ)とPerl(自分からBシステムへ)
プロトコル:https

<私のレベル>
https,SSL、SOAPといった通信用語の意味は知っている(つもり)
Javaは実装の経験は無いが解析は出来る。

<知りたいと思っている事>
※「思っている」の意味は、今まで見た事・聞いた事からインスピレーション的に、
「多分、この辺を押さえておかなければいけないんだろうな...」っと思っている事です。

・送受信処理のJavaの実装例
・送受信が1秒間に100回あってもレスポンス悪化しない方法
    (100回という数値は適当です。普通どれくらいを目標にするのですか?)
・通信エラー等の例外処理の実装方法
    (通信エラー発生時の電文はロストするのですか?それってどうリカバリー
        するのですか? その当たりに関する事)
・「なりすまし,盗聴,改ざん」っといった事に対する防御方法とその実装方法に関する事

No. 4714 # 68user 2006/09/27 (水) 16:41:33
>>4713
> ・送受信処理のJavaの実装例
送受信の基礎は echo クライアント・サーバや http クライアント・サーバの
実装サンプルを探せばよいでしょう。

データ受け渡しは、http のパラメータで渡す・CSV・XMLRPC・SOAP など実現
方法はいろいろあるでしょうが、それは開発スピードや保守性に関わる部分
なので、はっきり言って何でもいいです。

> ・送受信が1秒間に100回あってもレスポンス悪化しない方法
> (100回という数値は適当です。普通どれくらいを目標にするのですか?)
要件次第です。相手側は何箇所あるのか、MAX で 1秒あたり何回送信する
可能性があるかを考え、安全係数 (1.5 とか) をかけて、それをさばける
構成を考えます。

高速化方法は、https の上に載せるのであれば一般的な web のパフォーマンス
チューニングがメインとなるでしょう。
    - web サーバチューニング
    - SSL アクセラレータ導入
    - DB チューニング・コネクションプール
    - web サーバ複数台化

> ・通信エラー等の例外処理の実装方法
> (通信エラー発生時の電文はロストするのですか?それってどうリカバリー
> するのですか? その当たりに関する事)
ロストする可能性があると考えて設計した方がよいでしょう。

プロトコル的には
    1. A -> B データ送信
    2. B -> A 完了通知
これだけだと思いますが、アプリの手順まで含めると
    1. A -> B データ送信
    2. B にて受信済フラグセット
    3. B -> A 受信完了通知
    4. A が受信完了通知を受け、送信済フラグをセット
となると思います。で、
    - A は送信済フラグが立っていない場合は再送する
    - B が既に受信済フラグを受けていたら、無視 or 破棄する
などの対処をすると。もし即時の再送がまずいなら、
    0. A にて送信日時をセット
    1. A -> B データ送信
    2. B にて受信済フラグセット
    3. B -> A 受信完了通知
    4. A が受信完了通知を受け、送信済フラグをセット
として、「前回送信から n分経過していたら再送する」などの仕組みも必要と
なるでしょうが、その辺は要件次第です。

もちろん、ブラウザのように
    「タイムアウトしたらエラー通知するだけ。再送は操作者まかせ」
というのも選択肢としてはアリです。

> ・「なりすまし,盗聴,改ざん」っといった事に対する防御方法とその実装方法に関する事
その辺は SSL でカバーするのがよいでしょう。相手側のなりすましも
防御する必要があるならクライアント証明書を使うとか、アプリレイヤで
認証するとか、固定 IP アドレスなら IP アドレスで制限をかけるとか。

もしネットゲームのように不特定多数が接続し、しかも送信プログラムを
改ざんされる恐れがある場合は大変面倒です。

No. 4715 # こう 2006/10/10 (火) 22:19:10
BシェルからPerlを呼び出し実行しています。
Bシェルの変数の値をPerlに引き継がせることはできるのでしょうか。

以下でいうと、nに、”100”を設定しています。
そのnの値である、”100”を渡したいのですが。

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

n=100
a=`perl -MPOSIX -e 'print strftime("%Y%m%d", localtime(time-(24*60*60*$n)))."\n"'`
echo $a

No. 4716 # zsh 2006/10/14 (土) 13:01:28
>>4715 こう
変数が展開されないのはシングルクォーテーションの中にあるせいなので
$n だけ出してあげましょう。

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

n=100
a=`perl -MPOSIX -e 'print strftime("%Y%m%d", localtime(time-(24*60*60*'$n')))."\n"'`
echo $a

No. 4717 # りょん 2006/10/17 (火) 21:37:53
はじめまして。

現在少々考えこんでしまっていることがあるのですが
DB2でフェデレーション設定を行いたいと思っています。

ただ、フェデレーションという事自体をあまり
明確に理解しておりません。

どなたか、わかり易い説明などしていただけますでしょうか。
ラッパーやらニックネーム作成など色々調べれば出てくるのですが
いまいちピンとこないのです。

どなかたご教授願えればありがたいです。

よろしくお願いいたします。

No. 4718 # こう 2006/11/06 (月) 18:58:46
Bシェルのプロンプトについて教えて下さい。
Bシェルのプロンプトに日付、時間を表示し、何かコマンドを実行するごとに
プロンプトに表示する表示内容を変えたいのですが、可能なのでしょうか。

PS1="[`date{] "
とすれば、表示することはできますが、処理を実行するごとに変わりません。
変えたいのですが、方法とかあるのでしょうか。

No. 4719 # たつ 2006/11/08 (水) 00:17:43
BINDについて教えて下さい。

soralis7でBIND8.1.6の環境でDNSを構築しています。
named.confにzoneで以下の設定を追加してみましたが記述の間違いみたいなエラーが出ました。

zone "ドメイン名" in {
  type forward;
  forward only;
  forwarders { aa.bb.cc.dd; };
};

soralis9でBIND9.3の環境では正常に動作したのでBIND8.1.6ではzoneのforwardは
出来ないのではないかと思っています。
soralis7の環境でBINDをハ゛ーシ゛ョンアッフ゜したら動作するのではないかと思っていますが、
soralis7の環境で正常に動作するBINDは、どのハ゛ーシ゛ョンでしょうか?
また、パッチの適応で動作するなどの情報がありましたら教えて下さい。

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

No. 4720 # いれぶん 2006/11/08 (水) 01:09:41
>>4718 こう

shシェルのプロンプトでは無理です。
機能がなかったと思います。
表示は出来ても、プロンプトが生成される度に実行されません。

bashを使われてはいかかがですか。
bashのプロンプトで、時間、日付を表示できるエスケープが
あったはずです。

No. 4721 # miti 2006/11/10 (金) 12:58:21
テープにtarで吸い上げたファイルを削除する方法を教えてください。

テープ内にはtarで吸い上げたファイルがいくつかあり
そのファイルの一つを任意で削除したい場合です。
お願いします。

No. 4722 # 中級でも結構無知な人 2006/11/15 (水) 11:13:53
tarコマンドでわからないことがあり質問させていただきく以下に記します。

使用マシン:Solaris系 (UNIX)

DDS4のテープに15Gほどのデータを吸い上げました。
tar cvf /dev/rmt/0c /XXX/XXX

ただし、他のサーバで25Gほどあいているディスクに
tar xvf /dev/rmt/0 で展開しようとしたところ、
読み取りエラーが発生しました。

ネットなどでブロックサイズがXXXという説明を見ましたが
実際どのように対応するのかが記載している部分を見つけることが
できず、教えてください。

No. 4723 # has 2006/11/21 (火) 00:15:22
Solaris8で質問です。
rloginで特定IP帯からは特定ユーザでログインできないよう、
制限したいと考えています。
既存ツールを使って実現する方法はあるでしょうか。
何か情報ご存知の方がおられましたら、ご教授お願いします。

No. 4724 # zip 2006/11/27 (月) 18:20:46
Solaris8でzip圧縮した際にパスワードをかけたいと思っています。
現在の環境にはinfo-zip2.2がインストールされています。
過去ログにSolaris 標準の zipは暗号化ライブラリなしで
コンパイルされていて、ソースを改造してコンパイルすればよい
とあるのですが、
これはzip2.2のソースでしょうか?Solaris8のソースでしょうか?
またzip2.2の場合、現時点の最新版zip2.3.2にバージョンアップすれば
暗号化できますでしょうか?
よろしければご教授おねがいします。

No. 4728 # gari 2006/12/12 (火) 23:55:46
NetBSD/macppcにて、一通りの初期設定はすみました。
次は、インターネット接続を試みようとしています。
http://nobug.tukusi.ne.jp/netbsd-guide/trans/netbsd.html
の10章あたりを参考に設定しているところなのですが、イマイチよく分かりません。
モデムのデバイスが何なのかが分からないのです。
本体のUSB端子からKeyspan USA-28Xを接続してそこからシリアルポ−トにて
モデムにつながっています。
USA-28Xは認識できているようなのですが、肝心のモデムのデバイスが分からず、
上記URLの10.1.3.7にあるようなモデムの試験ができないでいます。
モデムはINSメイトV-30DSUです。
どなたか、御助言、御教授いただけませんでしょうか。

環境は、
Power Mac G4 450MHz AGP Graphics
NetBSD/macppcのバ−ジョン3.0
カ−ネルはデフォルト(GENERIC)

dmesgとls /devの結果は
http://ww2.tiki.ne.jp/~gari/dmesg.txt
http://ww2.tiki.ne.jp/~gari/device.txt
にあります。

No. 4729 # goro 2006/12/20 (水) 19:48:28
log4j経由でsyslogに同じメッセージを出力する時に…


ちょっとこの掲示板で以下の質問をして良いのかどうかわからないのですが、質問します。
log4jのSyslogApenderを使用してのUnix上マシンでのsyslogに出力する時に、前回と同じ内容のメッセージを出力した場合(前回出力してから30秒経過して出力)、なぜか下記の出力になります。
Nov 9 11:56:39 usrA ccc: repeate test
Nov 9 11:56:39 usrA last message repeated 1 times

『last message repeated 1 times』とは、syslogdのログの抑止をするための仕様です。
このメッセージが出るのは問題ないのですが、2回目の出力時刻が30秒たったにもかかわらず、前回と同じ時間を示しています。時刻を出力しているのは
syslogデーモンであり、syslogdが呼ばれた時刻を本来出力しています。

log4j経由ではなく、直接syslogdにログ要求を出した場合は、以下の出力なります。
Nov 9 11:56:39 usrA ccc: repeate test
Nov 9 11:57:09 usrA last message repeated 1 times

いろいろ調べたのですが、原因の糸口すらわかりません。どんなに時間が経過しても前回と同じメッセージの場合、『last message repeated n times』が必ず出力されるので困っています。
なぜこのような現象になるのかわかる方がいましたら、ご教授願います。また回避方法がありましたら教えてください。

環境:
log4j1.2.12
JDK5.0
Solaris8

No. 4731 # wssjf120 [E-mail] 2006/12/22 (金) 12:10:20
こんにちは  と言う言葉は暗号化したら何で  しいねてふ  になるのですか?

教えてください。

No. 4732 # びすこ 2006/12/22 (金) 18:29:34
Proxy経由でSSL_connectをcallした際にエラーが起こりました。
調べたところコネクション成立までに時間が掛かる場合があると
書かれていましたので、sleepしてみたり、複数回callしましたが
効果はありませんでした。
こちらのNo.289xあたりを参考にしましたが、これも効果がありませんでした。

WindowsXP VC++8 Winsock2 OpenSSL0.9.8aを使用しています。

SSL_connectまでは以下のような流れです。
socket();
connect();
proxyにCONNECT送信、200番を受信
SSL_library_init();
SSL_load_error_strings();
SSL_CTX_new();
SSL_CTX_load_verify_locations();
SSL_new();
SSL_set_fd();
SSL_connect();← "-1"が返ってきます
SSL_get_error();← "5"が返ってきます

元々はこちらのソースを参考にしてRedHat上で動いていたものを移植しています。
変更点はsocket関数の戻り値がint型からSOCKET型になったぐらいです。
proxyを使わない場合はSSL_connectが成功し、その後のSSL_writeとSSL_readも成功しています。

この現象が起こったマシンのcygwinにさらに移植をしたところ
こちらはproxy経由でもSSL_connectに成功しました。

No. 4734 # ひよこ 2006/12/24 (日) 16:42:22
質問があります。

とあるアプリケーションがとあるサーバーと通信しているとします。
そのアプリケーションが接続しているサーバーの、IPとPort番号を調べるにはどうすればよいのでしょうか。

No. 4735 # tkoba 2006/12/26 (火) 13:10:58
>>4734 ひよこ

netstat コマンドでどうでしょう。

http://x68000.q-e-d.net/~68user/unix/pickup?keyword=netstat&target=command

No. 4736 # tkoba 2006/12/26 (火) 13:13:06
>>4731 wssjf120

「シーザー暗号」で調べてみてください。

No. 4737 # moto 2006/12/27 (水) 14:24:44
こんにちわ 
いくらかでもヒントが欲しくて投稿しました。

グーグルマップの ajax についてなのですが、
グーグルマップの htmlソース内に
<div class="sloc" jsdisplay="$m.svaddr">
のようなコードがあります。

このタグ内に jsdisplay という属性名がありますが
これはmaps2.68.jsファイル内で以下のコードと関連しているようなのですが

        var Tc="jsselect",
            te="jsinstance",
            aj="jsdisplay",
            cj="jsvalues",
            bj="transclude",
            $i="jscontent",
            mk="$index",
            nk="$this"
        ;

javascriptで jsdisplay のような任意の属性名を定義する方法というか
それに関して何らかの情報があれば教えていただけませんでしょうか。

No. 4738 # 68user 2006/12/27 (水) 15:56:19
>>4737 moto
勝手に作った属性を書いておいて、getAttribute で読み出すことができます。
値のセットは setAttribute で。XHTML とかだと勝手に属性を作るのはまずい
のかもしれませんが、詳しくないのでわかりません。

--------
<html><body>
<div id="mydiv" hoge="abc"></div>
<script language="JavaScript">
var mydiv = document.getElementById('mydiv');
alert(mydiv.getAttribute('hoge'));
</script>
</body></html>
---------

No. 4739 # 68user 2006/12/27 (水) 16:09:01
>>4732 びすこ
> SSL_get_error();← "5"が返ってきます
よくわかりませんが、5 ってのは include/openssl/ssl.h の
    #define SSL_ERROR_SYSCALL 5 /* look at error stack/return value/errno */
ですよね。

http://www.openssl.org/docs/ssl/SSL_get_error.html
    Some I/O error occurred. The OpenSSL error queue may contain more information
    on the error. If the error queue is empty (i.e. ERR_get_error() returns 0), ret
    can be used to find out more about the error: If ret == 0, an EOF was observed
    that violates the protocol. If ret == -1, the underlying BIO reported an I/O
    error (for socket I/O on Unix systems, consult errno for details).

の通りにやってみるとどうなりますか?

No. 4740 # moto 2006/12/27 (水) 19:11:48
68user 様
ヒントありがとうございました。
  
グーグルマップを制御しているmaps2.68.jsファイル内にもgetAttribute,setAttributeの関数が出て
いますのでこれらが鍵なんですね。
一筋の光明が見えてきた気がします。

でも、maps2.68.jsファイルは170キロバイトもあるのに一行しかありません。
ですからコメントなぞ一つもなくすごい代物です。
解読するのに改行とインデントを入れる作業をしているのですが、
これがまた気の抜けない大変な作業です。
グーグルさんも簡単には教えてくれないんですね (^_^.)

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

No. 4741 # 68user 2006/12/27 (水) 21:48:50
>>4740 moto
どこかに解説サイトがあったような…と思ったら、Google Suggest でした。
    http://slashdot.jp/developers/article.pl?sid=04/12/18/1033242

Maps の解説は見たことはありませんが、ある程度なら探せばあるかもしれませんね。

No. 4742 # 68user 2006/12/29 (金) 05:34:20
http://X68000.q-e-d.net/~68user/unix/ の検索は OR 検索だったのですが、
AND 検索に変更しました。そのために結構な量の改修を行ったのですが、例に
よって怪しげです。もし不具合があればお教えいただけると幸いです。

No. 4743 # びすこ 2007/01/09 (火) 17:18:24
>> SSL_get_error();← "5"が返ってきます
>よくわかりませんが、5 ってのは include/openssl/ssl.h の
> #define SSL_ERROR_SYSCALL 5 /* look at error stack/return value/errno */
>ですよね。
おそらく#define SSL_ERROR_SYSCALL 5の5だと思います。


>http://www.openssl.org/docs/ssl/SSL_get_error.html
> Some I/O error occurred. The OpenSSL error queue may contain more information
> on the error. If the error queue is empty (i.e. ERR_get_error() returns 0), ret
> can be used to find out more about the error: If ret == 0, an EOF was observed
> that violates the protocol. If ret == -1, the underlying BIO reported an I/O
> error (for socket I/O on Unix systems, consult errno for details).
>の通りにやってみるとどうなりますか?

再度デバッグをしたところssl_connect()の戻り値は-1ではなく0でした。
10回ぐらい連続で動かしてると-1が戻ることもあります。

戻り値が0ですとプロトコルに違反したEOFが見つかったとありますので、
SSL_CTX *ctx = SSL_CTX_new(SSLv23_client_method());
と、プロトコル設定をしているのが悪いのかと思い
TLSv1_client_method()などに変えてみましたが効果はありませんでした。
EOFに関してはEnd Of Fileしか思い浮かばずお手上げです。

戻り値が-1のときのBIO云々に関してもぐぐって見つけたソースを追加してみましたが
こちらも効果はありませんでした。

Winsock2を使ってproxy経由のときだけssl_connect()でエラーになるほうが難しいと
思うのですが・・・
こればかりやっていられないので、cygwinの方を使うことにします。

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

No. 4744 # peace 2007/01/12 (金) 17:12:51
初めて書き込みさせていただきます。
http://x68000.q-e-d.net/~68user/net/rsa-1.html
に書かれているrsa1.cをVisal Studio 2005で実行させたいのですが、可能でしょうか?

No. 4745 # 68user 2007/01/12 (金) 17:29:47
>>4744 peace
そのままでは動かないので、
    http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=981427&SiteID=7
などを参考にしてください。

No. 4746 # hornets 2007/01/14 (日) 23:42:07
初めまして、hornetsと申します。
このサイトには、OpenSSLを用いたRSA暗号のプログラムが掲載されていますが、
OpenSSLを用いてElGamal暗号もできるのでしょうか?
教えていただけたら幸いです。

No. 4747 # 68user 2007/01/15 (月) 15:31:12
>>4746 hornets
> OpenSSLを用いてElGamal暗号もできるのでしょうか?
現時点の OpenSSL には ElGamal は実装はされていません。

OpenSSL の ML を探すと、実装が欲しいなら
    http://mixmaster.sourceforge.net/
を見れば、とありました。

# http://marc.theaimsgroup.com/?l=openssl-users&m=92476310717523&w=2

No. 4748 # Kenichi Maehashi [E-mail] 2007/01/15 (月) 23:00:02
初めまして。Kenichi Maehashi と申します。
いつもネットワーク関連の情報を拝読させていただいております。

さて、
>> http://x68000.q-e-d.net/~68user/net/module-pop3.html
を参考にさせていただきながら、POP3 クライアントを書いたのですが、
実行すると、カレントディレクトリに msg-xxxxx-x.txt というような
テキストファイルが出力されてしまいます。(x は数字です)

これは Net::POP3 モジュールの仕様なのでしょうか。
または、出力をしないような設定方法はありますでしょうか。

ご教示いただければ幸いです。
よろしくお願いいたします。

No. 4749 # 68user 2007/01/16 (火) 11:18:14
>>4748 Kenichi Maehashi
Perl5.8.5 の Net::POP3 で試してみましたが、そのようなファイルは
生成されませんでした。

Net/POP3.pm や、それが利用している Net/Cmd.pm、Net/Config.pm を見ても、
msg-xxxx-x.txt というファイルが生成されるようには見えませんでしたので、
今一度確認していただけますか。接続時に
    $pop = Net::POP3->new($hostname, Debug => 1);
と Debug を ON にすると何かわかるかもしれません。

No. 4750 # Kenichi Maehashi [E-mail] 2007/01/18 (木) 00:56:08
>>4748 68user さま
有り難うございます。
コードを削って確認してみたところ、併用していた MIME::Parser モジュールが
出力するファイルであることが分かりました。確認不足で申し訳ありません。
MIME::Parser の出力するメッセージファイルは出力しないよう設定できないのでしょうか。。。

重ね重ね申し訳ございませんが、何卒宜しくお願い致します。

No. 4751 # 68user 2007/01/19 (金) 10:31:02
>>4750 Kenichi Maehashi
よくわかりませんが、output_to_core でしょうか。
    http://search.cpan.org/~eryq/MIME-tools-5.411a/lib/MIME/Parser.pm
    output_to_core YESNO
        Instance method. Normally, instances of this class output all
        their decoded body data to disk files (via MIME::Body::File).
        However, you can change this behaviour by invoking this method
        before parsing:

        If YESNO is false (the default), then all body data goes to
        disk files.

        If YESNO is true, then all body data goes to in-core data
        structures This is a little risky (what if someone emails
        you an MPEG or a tar file, hmmm?) but people seem to want
        this bit of noose-shaped rope, so I'm providing it. Note
        that setting this attribute true does not mean that parser-
        internal temporary files are avoided! Use tmp_to_core() for that.

        With no argument, returns the current setting as a boolean.

No. 4752 # Kenichi Maehashi [E-mail] 2007/01/19 (金) 22:18:37
>>4748 68user さま
お世話になっております。
ご指摘の通り、$parser->output_to_core(1); で解決できました。
このページはチェックしていたのですが、見落としておりました。。。申し訳ありません。
本当に有り難うございました。

No. 4753 # サーバにUPしたプログラムと通信したい [E-mail] 2007/01/20 (土) 15:36:09
はじめましてwここのHPをみてソケット通信を勉強しています。
よろしくお願いします。

perlを使ってサーバプログラムとクライアントプログラムを作り
ソケット通信をしています。
ActivePerlを使用し、ローカルマシンでは通信できているので
実際にサーバプログラムをサーバにUPしてテストしたいと思い
プロバイダからもらった領域にFTPでUPしました。

で、質問なのですが
サーバプログラムが仮に http://www.aaa.com/user/test.pl という
アドレスにある場合
クライアントプログラムの
IO::Socket::INET->new( PeerAddr ... );
のPeerAddrはどう変えればいいのでしょうか?
※モジュールを使ってみようを参考にしています。

またほかにも何かしなければいけないのでしょうか?
よろしくお願いいたします。

No. 4754 # 68user 2007/01/20 (土) 18:00:20
>>4753 サーバにUPしたプログラムと通信したい
$socket = IO::Socket::INET->new(
    PeerAddr => 'www.aaa.com',
    PeerPort => '80',
    Proto => 'tcp');
  );
でよいです。

http://perldoc.perl.org/IO/Socket/INET.html に書き方のサンプルが
あるので、ざっと眺めてみてください。

No. 4755 # かみゅ [E-mail] 2007/01/20 (土) 19:01:34
ありがとうございます。

PeerAddr => 'www.aaa.com'
を指定した場合
user/test.pl
この部分はどうなるのでしょうか?
特に指定しなくても通信できるのでしょうか?

No. 4756 # 68user 2007/01/21 (日) 19:50:40
>>4755 かみゅ
IO::Socket はソケットのモジュールです。その上に HTTP を流すのであれば
    HTTP クライアントを作ってみよう(1)〜(4)
を読んで、送信すべき HTTP リクエストはどんなものなのかを調べてください。

No. 4757 # matsumoto 2007/01/24 (水) 12:04:11
初めまして、書き込みさせていただきます。
現在RSAについて学んでおり、非常に有用な情報としてこちらのHPを拝見させていただきました。
さて、http://x68000.q-e-d.net/~68user/net/rsa-1.htmlに記載されているrsa-1.cをコンパイル
してみたところ、openssl関連のヘッダファイルが読み込まれない旨のエラーが返され、
実行できません。実行環境としてVineLinux3.1にてgccコンパイラを用いており、opensslの
バージョンは最新版と思われる0.9.8をインストールしております。
対策方法をご教授いただければ幸いです。よろしくお願いします。

No. 4758 # 68user 2007/01/24 (水) 12:21:12
>>4757 matsumoto
まずは rsa.h や engine.h のありかを探してください。
例えば /usr/local/include/openssl/rsa.h が存在するなら
    % gcc -I /usr/local/include rsa-1.c
とします。

No. 4759 # ST 2007/01/28 (日) 15:46:17
はじめまして。STと申します。
CGI初心者です。
質問させていただきます。
「静的な画像表示」のところで、該当するソースをコピーして
サーバーにアップした後http://〜cgiと入力しGIFファイルを表示させようとすると
「GIF89aX」と表示されます。
パーミッションはOKで画像ファイルは存在します。
解決方法を教えていただけますと幸いです。
よろしくお願いします。

No. 4760 # 68user 2007/01/28 (日) 16:45:43
>>4759 ST
http://chaichan.web.infoseek.co.jp/qanda/qa7041.htm
に一本化ということで。

No. 4761 # 68user 2007/02/13 (火) 22:13:46
http://x68000.q-e-d.net/~68user/webcgi/sample/perl/graph-maker.cgi
にて日本語を出す方法のメモ。

% cvs di -u
cvs diff: Diffing .
Index: graph-maker.cgi
===================================================================
RCS file: /home/68user/cvsroot/public_html/webcgi/sample/perl/graph-maker.cgi,v
retrieving revision 1.9
diff -u -r1.9 graph-maker.cgi
--- graph-maker.cgi 26 Feb 2006 08:31:21 -0000 1.9
+++ graph-maker.cgi 13 Feb 2007 13:12:16 -0000
@@ -886,6 +886,8 @@
                }
          }

+ GD::Text->font_path( "/usr/local/share/fonts/TrueType/" );
+ $graph->set_title_font("sazanami-gothic", 14 );
          my $image = $graph->plot($ref_data) or die "Cannot create image";

          binmode STDOUT;

No. 4762 # べた 2007/02/15 (木) 16:05:07
findコマンドの使い方について教えて下さい。

findコマンドで検索を行う場合、指定したディレクトリ内だけ
検索を行い、下位のディレクトリは対象外にしたいのですが
できるのでしょうか。

例えば、/tmp配下を検索するとして、
/tmp
/tmp/backup
/tmp/save
とあった場合、
/tmp内だけを検索し、/tmp/backupや、/tmp/saveなどの下位ディレクトリ内
は見ないようにしたいのです。

find /tmp -name "*.csv" ! -size 0 -print

ドキュメントに、「-prune」がありましたが、指定すると、表示すべきものが
でてきません。上手くいきませんでした。

find /tmp -name -prune "*.csv" ! -size 0 -print
find /tmp -name "*.csv" -prune ! -size 0 -print

また、ファイル名は、ワイルドカード指定なので、表示後のgrepなども
使えません。

環境は、
Solaris8
Bシェル

No. 4763 # 68user 2007/02/16 (金) 00:33:04
>>4762 べた
試してませんが、
    % find /tmp -name "*.csv" -o -name backup -prune -o -name save -o ! -size 0 -print
ですかね。

とはいえ、
    - maxdepth オプションを使える find をインストールする
    - grep '^/[^/]*/[^/]*$' としてパスに '/' が 2個以上含まれないことを
        チェックする
    - ls -l /tmp/*.csv | awk '$5~/^0$/{print $9}'
などの方法がよいような気もします。

No. 4764 # べた 2007/02/16 (金) 13:06:41
>> 4763

ありがとうございます。

>% find /tmp -name "*.csv" -o -name backup -prune -o -name save -o ! -size 0 -print
ですが、配下のディレクトリを全て網羅するのは。。。
また、試してみましたが、直下のファイルがでませんでした。

> - maxdepth オプションを使える find をインストールする
> - grep '^/[^/]*/[^/]*$' としてパスに '/' が 2個以上含まれないことをチェックする
実際には、パスに、’/’が2個以上含まれるているので無理かと。

> - ls -l /tmp/*.csv | awk '$5~/^0$/{print $9}'
これが、一番よい方法になるのですかね。

No. 4765 # 68user 2007/02/16 (金) 15:23:55
>>4764 べた
> 直下のファイルがでませんでした。
FreeBSD では表示されました。Solaris の find は出ないのでしょうか。

> 実際には、パスに、’/’が2個以上含まれるているので無理かと。
「3個以上」の誤りでした。

ベストなのは「/tmp/ 直下に置くといういまいちな仕様を直す」だと
思いますが、それができれば苦労してないんでしょうね。

No. 4766 # べた 2007/02/16 (金) 17:48:15
>>4765 68user

ありがとうございます。
> find /tmp -name "*.csv" -o -name backup -prune -o -name save -o ! -size 0 -print
ですが、
期待したものがでませんでした。
「*.csv」が表示されず、それ以外の全てがでました。

lsコマンドで上手く行きそうなので、この方法で試します。

No. 4768 # 2007/02/18 (日) 00:56:54
>>4764 べた

>>% find /tmp -name "*.csv" -o -name backup -prune -o -name save -o ! -size 0 -print
>ですが、配下のディレクトリを全て網羅するのは。。。
すべて書くのは不可能ですよ。
それに、10も20もないでしょ。
ディレクトリだけを求めてすべてを変数に入れて設定すれば出来ませんか。

OP="-o -name backup -o -name -save"
find /tmp -name "*.csv" $OP -o ! -size 0 -print

でも、その下にあったら無理かな。

>>4766 べた

>> find /tmp -name "*.csv" -o -name backup -prune -o -name save -o ! -size 0 -print
>ですが、
>期待したものがでませんでした。
>「*.csv」が表示されず、それ以外の全てがでました。
使い方、間違ってませんか。?

No. 4769 # beck 2007/02/18 (日) 17:56:20
初めまして!beckと申します。
このサイトでOpenSSLを用いたRSA暗号を実装例を紹介していますが、
鍵生成などの工程では、どれほどの時間を要するのでしょうか?
もちろん、PCのスペックに左右されることは承知していますが・・・

No. 4770 # べた 2007/02/19 (月) 11:54:58
>>4765 68user
>>4768

>% find /tmp -name "*.csv" -o -name backup -prune -o -name save -o ! -size 0 -print
ですが、
やはり上手くでません。
期待している’*.csv’を表示しません。

> FreeBSD では表示されました。Solaris の find は出ないのでしょうか。
UNIXのOSによって異なる動きをするというこですか。
Solairs以外の環境がないのでなんともいえませんが。

No. 4771 # zxcv 2007/03/07 (水) 16:19:16
文字コードとエンコーディング (1)
http://x68000.q-e-d.net/~68user/webcgi/char-code-1.html

上記のページ、とても良くできていると思います。 ありがとうございます。

しかしながら、「エンコーディングとは」の項の先頭付近にある「他の文字と同時に扱う場合のことは考えられていません」の『文字』は『文字集合』とするべきでは無いでしょうか?

# 入門学習のために読む人にとって、重要な部分だ思います。

No. 4772 # 68user 2007/03/08 (木) 03:58:39
>>4771 zxcv
ご指摘ありがとうございます。修正してみましたがいかがでしょうか。
    http://x68000.q-e-d.net/~68user/webcgi/char-code-1.html

cvsweb が動かなくなっているので、修正点の diff を貼っておきます。

RCS file: /home/68user/cvsroot/public_html/webcgi/org/char-code-1.html,v
retrieving revision 1.6
diff -r1.6 char-code-1.html
68c68
< <LI>ASCII … 半角英数字・半角記号 (a,A,0,!,@,#)
---
> <LI>ASCII … 半角英数字・半角記号 (a,A,0,!,@,# など)
70c70
< <LI>JIS X 0208 … ひらがな・かたかな・漢字・全角記号
---
> <LI>JIS X 0208 … ひらがな・カタカナ・漢字・全角記号
73c73
< があります。
---
> などがあります。
80c80
< エンコーディングとは、複数の文字集合を一緒に扱うための枠組のことです。
---
> エンコーディングとは、複数の文字集合を同時に扱うための枠組のことです。
82c82
< 他の文字と同時に扱う場合のことは考えられていません。
---
> 他の文字集合と同時に扱う場合のことは考えられていません。
84c84
< ASCII と JIS X 0208 を同時に扱う場合を考えてみましょう。
---
> たとえば、ASCII と JIS X 0208 を同時に扱う場合を考えてみましょう。
90c90
< 「A」なのか「あ」なのかを判断できません。そのためには
---
> 「A」なのか「あ」なのかを判断できません。これを判断できるようにするためには、
94c94
< つまり「ここから先は ASCII」「ここから先は JIS X 0208」というようなものを入れる。
---
> たとえば「ここから先は ASCII」「ここから先は JIS X 0208」という意味の、区切り用のコードを入れる。
96c96
< という2通りの対策があります。さらに、
---
> という2通りの対策が考えられます。さらに、
101c101
< という細かい規格を決めたもの、それがエンコーディングです。
---
> という細かな規格を決める必要があります。
103,104c103,105
< エンコーディングには、主に3種類あります。
< JIS と Shift_JIS と EUC-JP です。
---
> このような、複数の文字集合を同時に扱うための規則のことを「エンコーディング」と呼びます。
> <P>
> エンコーディングには、主に3種類あります。ISO-2022-JP と Shift_JIS と EUC-JP です。

No. 4773 # べた 2007/03/17 (土) 17:20:13
readコマンドを使ってファイルから読み込みを行っています。
読み込んだ件数を出力しようとしているのですが、どうしても
0件となってしまいます。
どこがいけないのでしょうか。どう直せばよいのでしょうか。

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

FILE="/tmp/sample.csv"

i=0
while read LINE
do

        編集処理

        表示処理

        i=`expr ${i} + 1`

done < ${FILE}

echo "${i} 行読み込みました。"

No. 4774 # べた 2007/03/18 (日) 11:26:27
>>4773 べた

whileとかforのループ内で使用した変数は、
ループ終了後(ループを抜けた後)参照する
ことはできないのでようか。

できるとした場合、どうすればいいのですか。

No. 4775 # 2007/03/19 (月) 23:45:28
>>4774 べた
私もあまり詳しくないのでしりません。
kshでできたような。

http://search.luky.org/linux-users.9/msg06099.html

で、似たことが質問されていますので確認してみては。

No. 4776 # zsh 2007/03/20 (火) 10:37:41
>>4774 べた
最近シェルスクリプト触ってないんですが、
多分これでOKかと。

------
i=0
exec 3<&0 0<$FILE
while read LINE; do
        :
done
exec 0<&3 3<&-
echo $i
------

No. 4778 # べた 2007/03/20 (火) 17:35:18
>> 4776

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

また、以下でも出来ました。

-------------
i=0
exec < ${FILE}
while read LINE
do

        echo ${LINE}
        i=`expr ${i} + 1`

done

echo ${i}
-------------

No. 4779 # める 2007/03/31 (土) 16:14:20
はじめまして。
質問があります。

よくあるポートモニターなどはどのように作っているのでしょうか。
また、自分のパソコンが通信しているデータを見ることができますか?

No. 4780 # べた 2007/04/10 (火) 16:24:19
Perlなのですが、sync(fsync?)を使って
書き込みを実現しようとしています。
書き込み後、正しく書けたか、ファイルの比較や
サイズの取得をやろうとしています。

今一、Perlのモジュールとかライブラリとかが
わかりません。
参考になるものありませんか。
また、どのようにすればよいですか。

No. 4781 # べた 2007/05/17 (木) 16:52:39
findコマンドの「-perm」指定での検索について

findコマンドで、ファイルの権限の検索をする場合、
ユーザ、グループ、その他の所有者に権限を設定して
実施しますが、ユーザ、グループ、その他所有者を
表す「u」、「g」「o」の前に、「-」があるかないかで
状態が変わります。
「u」、「g」「o」の前の「-」にはどのような意味が
あるのでしょうか。

# find . -type f -perm o+w
# find . -type f -perm -o+w

# find . -type f -perm -g+w,o+w
# find . -type f -perm -g+w,-o+w

No. 4782 # 68user 2007/05/17 (木) 22:34:02
>>4781 べた
http://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.html
がわかりやすいかと思います。
    -perm -mode
        mode で指定されている許可属性ビットのすべてがファイルでも立っていたら真。
    -perm +mode
        mode で指定されている許可属性ビットがファイルでどれか一つでも立っていたら真。

No. 4783 # のみ 2007/05/19 (土) 03:02:10
おしえてください

No. 4784 # のみ 2007/05/19 (土) 03:30:10
VMwareServer(無償版)を使ってlinux4を2台(A、B)を仮想環境を使ってインストール
しました。(ethernetはnetwork connectionはHost-only)
linuxのファイアウォールを無効にし、bindをカスタムでインストールし
特に設定を変更しないで、/var/named/etc/chroot/etcフォルダにnamed.conf
を作成しました。
AサーバのVゾーンの問い合わせについては、zoneファイルから名前解決はできますが、
Xゾーンについてはforwardを使ってBサーバに転送するように設定しましたが
Xゾーンの名前解決ができません。(Xゾーンについては、Aサーバからの問い合わせ
に関しては、Xzoneファイルで解決するように設定してあります)

AサーバからXゾーンPCに対してdigコマンドを実行すると、
AUTHORITY SECTION : 518400 IN NS F.ROOT−SERVER.NET
・・・・
が記録されます。

何か原因等は考えられるでしょうか。

ちなみにforwardの設定は以下のようにしてあります。
ご教授のほう、よろしくお願いします。

zone "X" {
                type forward;
                forward only;
                forwarders {
                                0.0.0.0; #Bサーバのアドレス 
                  };

No. 4785 # のみ 2007/05/21 (月) 01:06:52
解決しました。
recusionがnoになっていたようです。

No. 4786 # べた 2007/05/21 (月) 12:22:23
>4782
ありがとうございます。
読んでみます。

No. 4787 # べた 2007/05/21 (月) 12:22:47
>>4782 68user
ありがとうございます。
読んでみます。

No. 4788 # べた 2007/05/21 (月) 13:00:51
シェルで、FTPを自動実行しています。

FTPの接続が失敗した場合、ログイン・パスワードが間違っていた場合、
getするファイルが存在しなかった場合など、異常を判断したいのですが、
例えば、
0:正常終了
1:実行エラー
みたいな感じで、、、。
リターンコードを取得することができるのでしょうか。

UNIXのFTPですとファイル転送に失敗してもリターンコードが、”0”が
返ってくると聞いたのですが、最後に、byeを実行しているので、"0”で
返ってきます。

以下のような内容でやっています。
ftp -v -n [IPアドレス] <<END > /dev/null 2>&1
user [ユーザ名] [パスワード]
cd [リモートディレクトリ]
lcd [ローカルディレクトリ]
get [getするファイル名]
bye
END

エラーだけをファイルに出力してみたのですが、接続エラーしかでず、
ログインの失敗やファイルが存在しないエラーは出力されませんでした。
ftp -v -n [IPアドレス] <<END 2>ftp_error.log > /dev/null >&1

すべてのFTP結果ログをファイルに出力し、該当の処理のエラーメッセージ
があるかないかをgrepでみるしかないのでしょうか。

Not connected.
530 Login incorrect.
Login failed.
530 Please login with USER and PASS.
550 getするファイル名: No such file or directory.

No. 4789 # 68user 2007/05/21 (月) 23:01:43
>>4788 べた
ftp コマンドを使う限りは
> すべてのFTP結果ログをファイルに出力し、該当の処理のエラーメッセージ
> があるかないかをgrepでみるしかないのでしょうか。
が無難です。また、どのようなエラーがどこで発生したかをプログラム上で
突き止めようとせず、行頭の 4xx か 5xx にマッチするものがあれば全て
エラーとすることをお勧めします。

これ以上を求めるならば、Perl + Net::FTP モジュールなどで FTP クライアントを
作成するのがよいとわたしは思います。

No. 4790 # べた 2007/05/22 (火) 18:48:35
>> 4789
ありがとうございます。
必要な、エラーすべてをgrepしようと考えていました。
行頭の 4xx か 5xx にマッチするものがあれば全てエラー
とするでやつてみます。

ちなみに、接続エラー(open)ですが、これは、4xxとか5xx
にならないのですが、メッセージの内容で見た方がよいの
でしょうか。

No. 4791 # 68user 2007/05/23 (水) 02:27:15
>>4790 べた
> ちなみに、接続エラー(open)ですが、これは、4xxとか5xx にならないの
> ですが、メッセージの内容で見た方がよいのでしょうか。
数年ほど前に同じようなことをやっていましたが、そのときはどうやったの
だったか…。
    ・ftp コマンドの終了ステータスが >0 ならエラー
    ・2xx がひとつもなかったら認証以前で失敗とみなしてエラー
のいずれかだったような気がします。

No. 4792 # べた 2007/05/23 (水) 13:51:17
>>4791 68user

>・ftp コマンドの終了ステータスが >0 ならエラー
>・2xx がひとつもなかったら認証以前で失敗とみなしてエラー
ありがとうございます。

なるほど、2xxがなかったらですか。
確かに、接続エラーということは、レスポンスコードが出てなかった
ので、レスポンスコードがなければで良いかも知れません。
UNIXのOSによるかも知れませんが。
環境は、Solaris8 です。

No. 4793 # 保守見習い 2007/05/24 (木) 22:44:47
AIX5.3の環境にて下記のようなファイルシステムをマウントしています。
/app
/app/log
auto mount=trueの設定です。

OS再起動後、/appがマウントされていなかったので、/etc/filesystemsを
確認したところ、/app/logの定義が/appの定義よりも前に記述されいたため、
/app/logが先にマウントされてしまい、/appのマウントに失敗したようです。
一旦、/app/logをアンマウントし、/app, /app/logの順番でマウントしました。

次回の再起動時に正常にマウントできるように、/etc/filesystemsを直接、
編集して正しい順序に設定しようと考えていますが上記ファイルシステムが
マウントされたままの状態で作業を行なっても大丈夫か教えて頂けますでしょうか?

No. 4794 # 68user 2007/05/24 (木) 23:17:24
>>4793 保守見習い
AIX は知りませんが、マニュアルを読む限りでは他 UNIX 系システムの
/etc/fstab と同様に、
    ・ブート時の mount 順序を決める
    ・ブート時の mount の設定を記述する
    ・mount コマンド実行時に各種オプションが省略された場合の
        デフォルト値を記述しておく
という役割のようなので問題ないでしょう。

http://publib16.boulder.ibm.com/doc_link/Ja_JP/a_doc_lib/files/aixfiles/filesystems.htm

No. 4795 # 保守見習い 2007/05/25 (金) 23:25:00
>>4794 68user
ご意見ありがとうございます。
ファイルシステムをマウントしたまま、/etc/filesystemsを編集し、
問題なく無事作業が完了しました。

No. 4796 # ふくし 2007/05/26 (土) 15:42:08
おひさしぶりです。
わからないことができると質問しに現れてすみません。
よろしくお願いします。

C:\>perl -v

This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 50 registered patches, see perl -V for more detail)

Copyright 1987-2006, Larry Wall

Binary build 820 [274739] provided by ActiveState http://www.ActiveState.com
Built Jan 23 2007 15:57:46

で、以下のようなプログラムを書きました。
-------------------------------------------------- Foo.pm
#! perl -w

use strict "subs";
package Foo;
use base Exporter;
our @EXPORT = qw($bob);
our $bob = "#123456789";

1;

-------------------------------------------------- bar.pl
#! perl -w

use strict;
use Foo;

print "bob: $bob \n";

すると、以下のようなエラーになります。

C:\>bar.pl
Unknown error
Compilation failed in require at C:\bar.pl line 6.
BEGIN failed--compilation aborted at C:\bar.pl line 6.

Foo.pm の use strict 'subs'; を無効にするとなぜか正常に動作します。

C:\>bar.pl
bob: #123456789

何が悪いかお分かりでしょうか。

別に use strict 'subs' をやめればいいじゃん・・・
というハナシなんですが、
実際の元のプログラムはもっと大きくて(当たり前 ;;;)、
  use strict;
でずっとやってきていたので・・・。

何かわかりましたらよろしくお願いいたします。

No. 4797 # ふくし 2007/05/27 (日) 23:42:13
追記です。
どうも use base Exporter; が use strict 'subs' に引っかかるらしく

-------------------------------------------------- Foo.pm
#! perl -w

package Foo;

use base Exporter;

use strict "subs";

our @EXPORT = qw($bob);
our $bob = "#123456789";

1;

だと動作します。あと use base をあきらめて
-------------------------------------------------- Foo.pm
use strict "subs";
package Foo;

use Exporter;
our @ISA = qw(Exporter);

our @EXPORT = ('$bob');
our $bob = "#123456789";

1;

でも動作します。
ううーん。

No. 4798 # 通りすがりのプログラマ 2007/06/10 (日) 20:42:48
kqueue の説明の所
timeval は tv_sec, tv_usec で分解能 10^-6 == micro second
timespec は tv_sec, tv_nsec で分解能 10^-9 == nano second
実際の分解能は処理系依存

No. 4799 # べた 2007/06/13 (水) 17:16:21
awk/nawkを使って編集をしています。
ファイルから読み込み、読み込んだ内容を判断して
printf関数を使って表示しています。
例えば
    { \
        printf("XXX:%s\nxxx:%s\nxxx:%s\n・・・・\n", \
        $1,$2,$s・・・・); \
    } \
のように、値の前にコメント付けて表示しています。

この表示内容を追加したところ、
「Word too long」
のメッセージが出力され動かなくなりました。
メッセージの通り、printf関数で表示する内容が長すぎるためだと
思うのですが、原因は、その通りでしょうか。
実際、何バイト(何文字)までなのでしょうか。
また、対処するにはどうしたらよいのでしょうか。

環境は、
    Solaris8、csh

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

No. 4800 # べた 2007/06/13 (水) 17:30:24
>>4799 べた
補足です。

メッセージの通り1行が長いのがいけないのではと
フィールドごとに表示しようとしたのですが、
例えば
    { \
        printf("xxx:%s\n",$1); \
        printf("xxx:%s\n",$2); \
        printf("xxx:%s\n",$3); \
            :
            :
    } \

やはり、
「Word too long」
のメッセージが出力され動かなくなりました。

No. 4801 # おーさん 2007/06/13 (水) 17:53:52
はじめまして。
最近openSSLを使用することになったので勉強しています。
非常にいい内容で助かっています。

それでですねrsaを使用する際のサンプルを一度コンパイルしてみたのですが…
RSA_generate_keyをはじめとする、約25個の関数が未定義と起こられてしまいました…
これはハードウェア的な問題なのでしょうか?

ちなみにlinuxにtelnetで接続しながら作っています。
よろしくお願いいたします。

No. 4802 # zsh 2007/06/13 (水) 19:20:15
>>4800 べた
awk スクリプトを別ファイル(以下の例では hoge.awk)にして
    $ awk -f hoge.awk fuga.txt
のようにしてもダメですか?

No. 4803 # zsh 2007/06/13 (水) 19:21:36
>>4800 べた
書き忘れましたが、別ファイルにする場合は
行末の "\" は削除してください。

No. 4804 # pixy 2007/06/15 (金) 18:57:49
はじめまして。
サーバ関係の情報を探していて、ここにたどりつきました。
下記のようなPOPサーバの改造は可能でしょうか。
ネット上を探してみたのですが、情報が少なく、
参考になるサイト等ご存知でしたら、ご教授ください。
よろしくお願い致します。

【現状】
POPクライアントの拡張コマンド内で、
ユーザID等をべた書きして、サーバにリクエストしている。
【改造】
現在クライアントにて上記のべた書きしている箇所をプロパティファイル
とする。POPサーバを改造し、このファイルを読み込むようにする。

No. 4805 # べた 2007/06/16 (土) 12:30:15
>> 4803

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

No. 4806 # zsh 2007/06/16 (土) 21:33:25
>>4805 べた
それで OK だったということは
awk ではなく csh の制限に引っかかっていたようですね。
恐らく awk のスクリプト部分を \ で複数行つなげていたので
一行に記述できる制限(1024文字)を超えたのでしょう。

No. 4807 # Perl使い 2007/07/07 (土) 03:21:16
はじめまして。
Perl CGIで基本認証をクリアーするやり方は分かっているのですが、
IEに事前に基本認証をクリアーさせるための設定方法が分かりません。
perlから、IEに対して、ヘッダーとして下記を書き込んでも、だめなんですね。
print "Authorization : Basic Base64文字列\n";
かならず、認証画面が表示されます。
IEに何を書き込めば良いのでしょうか。ご教示をお願いします。

No. 4808 # 68user 2007/07/15 (日) 01:16:20
>>4798 通りすがりのプログラマ
ありがとうございます。バグ ID 28 として記載いたしました。
近日中に直します。
http://spreadsheets.google.com/pub?key=pAr6UVKFG0jthbVP572cKEA&output=html

No. 4809 # mac 2007/07/19 (木) 22:04:10
はじめまして、'斎藤 誠'と申します。
初めての投稿で質問する不躾をお許しください。

とある理由からpop3クライアントを試しています。
pop3-client.pl
pop3-client-Net::POP3.pl
双方を試してみまして、後者の方を使用したいと思っています。

当方の環境はFedora7です。小生自身は初心者です。
いわゆる自宅サーバで試しているのですが、
当方が別のIPで設置しているtest-pop3.server(以下、前者)と
目的のpop3.server(以下、後者)とで応答が異なっていることで困っています。
双方ともtelnet接続では正常な応答をしています。
ちなみに前者はFedora core 6でdovecotです。
pop3-client.plにて接続すると、前者がエラーで後者が正常応答です。
これに関してはNo.2380の
sleep 1;
を挿入したらうまく動きました。

pop3-client-Net::POP3.plにて接続するとpop3-client.plの場合とは
逆に前者が正常に応答して後者はエラーとなります。

今日一日費やしてみましたが、解決できません。どなたかにご教授願いただきたく
投稿しました。なお、初心者ですので何卒お手柔らかにお願いいたします。

No. 4810 # 68user 2007/07/20 (金) 01:36:33
>>4796 ふくし
> use base Exporter;
うちでは
    use base qw/Exporter/;
とすることで動きましたがどうでしょうか。

>>4804 pixy
> 現在クライアントにて上記のべた書きしている箇所をプロパティファイル
> とする。POPサーバを改造し、このファイルを読み込むようにする。
前提条件がよくわかりませんが、ソースがあるとして改造が可能か
と問われれば「可能です」が答えです。

>>4807 Perl使い
> print "Authorization : Basic Base64文字列\n";
Authorization ヘッダはクライアントがサーバに送信するものなので、
根本的に誤解があるようです。
      http://x68000.q-e-d.net/~68user/net/http-auth-1.html
        以下のような CGI プログラムを使うことで、疑似的にログアウト
        することもできます
で実現できませんか?

あと、別解として
    http://username:password@example.com/foo/
に飛ばす方法もありますが、IE の場合は設定変更が必要です。
    http://support.microsoft.com/default.aspx?scid=kb;JA;834489

>>4809 mac
pop3-client.pl は実用に耐えるものではないので、pop3-client-Net::POP3.pl を
使ってください。で、pop3-client-Net::POP3.pl の
    $pop = Net::POP3->new($hostname);

    $pop = Net::POP3->new($hostname, Debug=>1);
としてデバッグ情報を表示してみてください。

あと、Net::POP3 の方でエラーになるサーバの POP3 サーバソフトウェア名と
バージョンは何でしょうか? (qpopper など)

それと「エラーになる」というのは具体的に何がどうなるのでしょうか。

代替案としては
    Mail::POP3Client
    http://search.cpan.org/~sdowd/Mail-POP3Client/POP3Client.pm
を使う手もあります。

No. 4811 # mac 2007/07/20 (金) 11:02:07
早々のお返事、有難う御座います。
エラーは「認証失敗: 」だったのですが、
ご教授の通りデバッガつけて起動させて見ましたところ

Net::POP3>>> Net::POP3(2.28)
Net::POP3>>> Net::Cmd(2.26)
Net::POP3>>> Exporter(5.58)
Net::POP3>>> IO::Socket::INET(1.29)
Net::POP3>>> IO::Socket(1.29)
Net::POP3>>> IO::Handle(1.25)
Net::POP3=GLOB(0x9e97f44)<<< +OK Qpopper (version 4.0.4) at ******.jp startin g.
Net::POP3=GLOB(0x9e97f44)>>> USER ******
Net::POP3=GLOB(0x9e97f44)<<< +OK Password required for ******.
Net::POP3=GLOB(0x9e97f44)>>> PASS ....
Net::POP3=GLOB(0x9e97f44)<<< +OK ****** has 0 visible messages (0 hidden) in 0 octets.
Net::POP3=GLOB(0x9e97f44)>>> STAT
Net::POP3=GLOB(0x9e97f44)<<< +OK 0 0
認証失敗: at ./pop3-client-Net::POP3.pl line 41.

ということで認証は通っていたようです。mailが空だったということでしょうか。
お騒がせいたしました。line 41というのは多少いじったところもあって
originalとは異なりますが、
$auth_check = $pop->login($username,$password);
など、実質的な変更はしていないつもりでした。
ちなみにtelnet接続でのcapaの応答は
+OK Capability list follows
TOP
USER
LOGIN-DELAY 0
EXPIRE 0
UIDL
RESP-CODES
AUTH-RESP-CODE
X-MANGLE
X-MACRO
X-LOCALTIME Fri, 20 Jul 2007 09:04:45 +0900
IMPLEMENTATION Qpopper-version-4.0.4
となっていました。
これからFTPなどもやってみるつもりですのでまたお世話になるかもしれません。
そのときはまたお願いいたします。

No. 4812 # mac 2007/07/20 (金) 12:19:30
Net::POP3 の検索でみましたら
login ( [ USER [, PASS ]] )
USER、PASSコマンドの両方を送信します。...
メールボックスのなかのメッセージ数を返します。
しかしサーバーにメッセージが何もなければ文字列"0E0"を返します。
これはブール値コンテキストでは trueになりますが、
数値コンテキストでは0です。
指定したユーザがサーバーで認証できなければ、undefが返されます。
-----------------------------------
とあったのですがバグということでしょうか。
Mailが無いことを確認できる方法は有りますでしょうか。
その場合はundefのエラーを回避するというスクリプトを
書けばよいようにも思っています。

No. 4813 # 68user 2007/07/20 (金) 13:03:08
>>4811 mac
pop3-client-Net::POP3.pl の
    if ( $auth_check == undef ){
は誤った書き方で、正しくは
    if ( ! defined $auth_check ){
です (以前は undef かどうかのチェック方法を誤解していたため)。

これだとどうなりますか。

No. 4814 # mac 2007/07/20 (金) 18:33:55
>>4813 68user
> if ( ! defined $auth_check ){
バッチリです。それにしてもすばやいレス、本当に有難う御座います。

No. 4815 # mac 2007/07/20 (金) 20:20:37
たいへん心苦しいのですが別のことをお聞きしてよろしいでしょうか。
HTTPクライアントのスクリプトで、Basic認証が通ったかどうか
戻り値などで判断する方法は有りますでしょうか。
いま確認中のスクリプトは以下の通りです。

#!/usr/local/bin/perl

use strict;
use HTTP::Request::Common;
use LWP::UserAgent;

my $req = POST( 'http://*****.jp/login.html');
$req->authorization_basic('ID', 'Pass');
my $ua = LWP::UserAgent->new;
my $res = $ua->request($req);

No. 4816 # 68user 2007/07/21 (土) 02:54:23
>>4815 mac
HTTP::Response の code メソッドを使えばよいと思います。

-----
#!/usr/local/bin/perl
use strict;
use HTTP::Request::Common;
use LWP::UserAgent;

my $req = POST( 'http://X68000.q-e-d.net/~68user/net/sample/http-auth/secret.html');
$req->authorization_basic('hoge', 'wrong-password');
my $ua = LWP::UserAgent->new;
my $res = $ua->request($req);
print $res->code."\n";

my $req2 = POST( 'http://X68000.q-e-d.net/~68user/net/sample/http-auth/secret.html');
$req2->authorization_basic('hoge', 'fuga');
my $ua2 = LWP::UserAgent->new;
my $res2 = $ua2->request($req2);
print $res2->code."\n";

No. 4817 # mac 2007/07/21 (土) 23:19:18
>>4816 68user
重ね重ね、有難うございました。

No. 4818 # ふくし 2007/07/24 (火) 21:20:42
>>4810 68user
さん、

そうなんですよ。use は引用符をつけてはいけないが use base だとダメ、
no strict 'refs'; だとあらゆる裸のワードを勝手にクォートするらしいです。
お騒がせしました。

No. 4819 # 68user 2007/07/25 (水) 01:30:27
>>4818 ふくし
わかっておられるかもしれませんが、use base は built-in な文法ではなく
ただ base.pm を use しているだけなので、base 内の sub import の引数として
渡されるから、ということですね。strict も実体は strict.pm なので同様に
strict refs ではなく 'refs' としなければならないと。

個人的には、ここまで汚い造りにするかねぇ、という感じです。いちおう
つじつまをあわせてるのはすごいですが。

No. 4820 # べた 2007/08/01 (水) 09:33:24
awkを使ってファイルからある部分のデータを取り出そうとしています。

ファイルの内容 ----------------------------------
----------------------------------------
Tue Jul 31 09:00:00 Jst 2007
xxxxxx
xxxxxx
xxxxxx
xxxxxx
Tue Jul 31 09:00:00 Jst 2007
----------------------------------------
Tue Jul 31 09:10:00 Jst 2007
xxxxxx
xxxxxx
xxxxxx
xxxxxx
Tue Jul 31 09:10:00 Jst 2007
----------------------------------------
Wed Aug 1 09:00:00 JST 2007
xxxxxx
xxxxxx
xxxxxx
Wed Aug 1 09:00:00 JST 2007

該当の曜日、月、日から始まる行以降から
最終行まですべてを取り出そうとしているのですが、
awkで上手くいきません。
以下の様なエラーがでて上手くいきません。
どうすればよいのでしょうか。

    awk: syntax error near line 1
    awk: bailing out near line 1



シェルの内容 -----------------------------------------
#!/bin/sh

LOG_FILE="/tmp/kekka.log"

#DATE=`date "+%a %b %e"`
DATE=`date +%C | cut -c 1-10`

awk -v DAY=$DATE'/^DATE/,/\\r/ {print $0}' ${LOG_FILE}

exit 0

No. 4821 # なし 2007/08/03 (金) 23:13:29
UNIXの環境変数のLANGに使用する言語の指定に
「japanese」があるのですが、これは、日本語
が使えるのですか。それとも日本語のSJISが
使えるのでしょう。
また、UNIXのOSがどのコードなのかどこを見れば
わかるのでしょうか。
また、EBCDICコードがあるのですが、これを使うには
どうしたらよいのでしょうか。

No. 4822 # 68user 2007/08/07 (火) 15:41:08
>>4820 べた
> awk -v DAY=$DATE'/^DATE/,/\\r/ {print $0}' ${LOG_FILE}
まずは
    % sh -x スクリプト名
などとして、意図どおりの引数を渡せているか確認しましょう。この場合は
    awk -v DAY=20/^DATE/,/\\r/ {print $0} a.dat
と表示されますので、意図通りではないはずです。

具体的には以下の問題があります。
    - 20 はおそらく希望する値ではない
    - 20 の後に空白がない。
    - DATE の中にある変数でパターンマッチするのではなく、"DATE" という文字列を
        探すようになっている。
    - DAY と DATE の誤記。

>>4821 なし
> UNIXの環境変数のLANGに使用する言語の指定に
> 「japanese」があるのですが、これは、日本語
> が使えるのですか。それとも日本語のSJISが
> 使えるのでしょう。
一般的には japanese は ja_JP.eucJP・ja_JP.PCK (Shift_JIS)・ja_JP.utf-8
などのエイリアスであることが多いように思います。実際にどのエイリアスで
あるかは OS やバージョンによるでしょう。

> また、UNIXのOSがどのコードなのかどこを見ればわかるのでしょうか。
OS により異なると思います。env コマンドで何か出てくるかもしれません。

> また、EBCDICコードがあるのですが、これを使うにはどうしたらよいのでしょうか。
例えば dd コマンドで ASCII に変換できます。商用のアプリケーションも
いくつか出ているようです。

No. 4823 # 68user 2007/08/07 (火) 15:43:08
UNIX の部屋に
    ファイル制限まとめ
    http://x68000.q-e-d.net/~68user/unix/pickup?%A5%D5%A5%A1%A5%A4%A5%EB%C0%A9%B8%C2%A4%DE%A4%C8%A4%E1
を追加しました。

No. 4824 # べた 2007/08/09 (木) 15:50:10
>>68user
ありがとうございます。

>% sh -x スクリプト名
で確認してみました。
DAYとDATEは誤記ですが、DAYに直しましたが結果は同じでした。

awk -v DAY=$DATE'/^DAY/,/\\r/ {print $0}' ${LOG_FILE}
パターンマッチングのところが、引数で渡した値ではなく、
”DAY”という文字列でした。(文字列と言い切れるのかどうか。?)

No. 4825 # 68user 2007/08/10 (金) 11:48:35
>>4824 べた
まずはコマンドラインから awk を叩いて、正しい結果を取得できるように
なるところから始めましょう。シェルスクリプトはその後。

あと
>>4822 68user
> 具体的には以下の問題があります。
を直さないと動きません。念のため。

No. 4826 # べた 2007/08/10 (金) 15:37:58
>>4825 68user

色々とありがとうございます。
試してみます。

No. 4827 # べた 2007/08/10 (金) 16:38:59
>>4825 68user

やはり、「^」を指定しているので、行の先頭が、DAYという
文字列から始まっているのを探していました。
試しにファイルの方を修正し、日付を「DAY Aug 2」としたところ
表示されました。
マッチングのところに、変数を展開できないのでしょうか。

nawk -v DAY="Fri Aug 10" '/^DAY/,/\\r\\n/ {print $0}' /tmp/kekka_log.log

No. 4828 # なし 2007/08/13 (月) 21:52:22
>>4822 68user

返事遅れてすみません。
ありがとうございます。

No. 4829 # 68user 2007/08/15 (水) 10:31:38
>>4827 べた
変数展開は $n ~ VAR と書きます。

で、/\\r\\n/ ですが、これうまく動きますか? awk はよくわかりませんが、
マッチしてないと思います。

なので、DAY から ------ までを見るようにして、
    awk -v DAY="Fri Aug 10" '$0 ~ DAY,/^--*$/ {print}'

    awk -v DAY="Fri Aug 10" 'BEGIN{skip=1} $0 ~ DAY {skip=1;print $0} /^--*$/ {skip=0} skip==1 {print} '
あたりがいいんじゃないですかね。

なお、行頭の日付だけ見るなら、DAY="^Fri Aug 10" です。

No. 4830 # 通りすがり 2007/08/15 (水) 10:44:32
「リダイレクト」についての説明の中の

『「リダイレクトは右に書いたものから順に評価されるから」は間違いである。』

のくだりが分かりやすくてつい書き込んでしまいました。
他のサイトは上記のような説明で終わっている所があったのですが、
なんとなく「ん?」と違和感が残ってました。
で、このサイトの内容ですっきりです。ありがとうございました。
ドメインも素敵です(笑)

No. 4831 # 68user 2007/08/15 (水) 11:36:41
>>4830 通りすがり
ありがとうございます。ついでなので書いておくと、先頭に書いてもいいです。
    >/dev/null 2>&1 ls foo.txt

No. 4832 # べた 2007/08/15 (水) 15:00:06
>>4829 68user
ありがとうございます。

変数の展開ができました。
「'$0 ~ DAY」
の使い方は知りませんでした。

>で、/\\r\\n/ ですが、これうまく動きますか? awk はよくわかりませんが、
>マッチしてないと思います。
ファイルの最後まで見るというつもりでした。
EOFがこの表記でいいのかさなかですが。?
多分、ファイルの最後まで走査し、終了しているのではないかと。

>awk -v DAY="Fri Aug 10" 'BEGIN{skip=1} $0 ~ DAY {skip=1;print $0} /^--*$/ {skip=0} skip==1 {print} '
日付が二行でます。

Fri Aug 10 ・・・
Fri Aug 10 ・・・
****
****
****
Fri Aug 10 ・・・
Fri Aug 10 ・・・

見たいになります。

No. 4833 # 68user 2007/08/15 (水) 17:15:01
>>4832 べた
> ファイルの最後まで見るというつもりでした。
その挙動でよいのであれば、問題ないと思います (実質機能していないと
思うので、書き方としてはまずいですが)。

> 日付が二行でます。
print $0 を削除するなどしてください。

No. 4834 # べた 2007/08/31 (金) 16:07:37
>>4833 68user
お礼遅れてすみません。
ありがとうございました。

No. 4836 # べた 2007/09/27 (木) 10:05:21
前にも同じ質問をしたのですが、
findの検索で、指定ディレクトリ(カレントディレクトリ)内の
ファイルだけを検索し、-mtimeを指定して、30日前のファイルを
削除しようとしています。

配下のディレクトリを検索しないよう、-prune を指定して、まずは、
以下のようにしたのですが、”*.csv”以外が表示されていまいます。

find /home/DATA/backup -name '*.csv' -o -name everyday -prune -o -name monthly -prune -o -name tmp -prune -o -name work -prune -o -print
と実行すると、
カレントディレクトリと、「*.csv」以外のファイルが表示されます。

find /home/DATA/backup -name '*.csv' -o -name everyday -prune -o -name monthly -prune -o -name tmp -prune -o -name work -prune -o -mtime +30
と実行すると、
表示されるのですが、どこのディレクトリを検査した結果かわからない状態でして、

確認と実際は、rm を指定してファイルを削除するで、「-exec ls -l {} \;」
をして表示してみたのですが、
find /home/DATA/backup -name '*.csv' -o -name everyday -prune -o -name monthly -prune -o -name tmp -prune -o -name work -prune -o -mtime +30 -exec ls -l {} \;
と実行すると、
何も表示されません。

find /home/DATA/backup -name '*.csv' -o -name everyday -prune -o -name monthly -prune -o -name tmp -prune -o -name work -prune -o -mtime +30 -print
と実行すると、
何も表示されません。

正しく、結果が表示されるように、
最終的には、30日前とか、90日前のファイルが削除できるように
したいのですが、どのようにすればよいか、
教えてください。

No. 4837 # 68user 2007/09/29 (土) 14:20:52
>>4836 べた
> find /home/DATA/backup -name '*.csv' -o -name everyday -prune -o -name monthly -prune -o -name tmp -prune -o -name work -prune -o -print
> と実行すると、
> カレントディレクトリと、「*.csv」以外のファイルが表示されます。
この結果がすでにマズいんですよね?

前回のわたしの回答
>>4763 68user
は的外れだったような気がします。最終的には以下のようになるのではないかと思います。
    % find /home/DATA/backup -name '*.csv' -mtime +30 -exec ls -l {} \; -o -name everyday -prune -o -name monthly -prune -o -name tmp -prune -o -name work -prune

構造としては
    ・[ファイル名が *.csv] AND [mtime が +30] AND [-exec ls -l]
        OR
    ・[ファイル名が everyday] AND [-prune]
        OR
    ・[ファイル名が monthly] AND [-prune]
        OR
        (略)
となります。

ただし -exec や -prune は常に真で、コマンドを実行する・ディレクトリを下降しない
という副作用を発生させるのが主目的ですので、より平易に書くと
    ・[ファイル名が *.csv] AND [mtime が +30] なら [-exec ls -l] を実行
        OR
    ・[ファイル名が everyday] なら [-prune] で下降抑止
        OR
    ・[ファイル名が monthly] なら [-prune] で下降抑止
        OR
        (略)
となります。なお、ここでの OR は、左辺が真なら右辺は評価しない、
という意味です。また、OR の各要素の順序を入れ替えても、このケース
では問題ありません (*.csv と everyday が両方真になることはないので)。

典型的な -prune の使い方をまとめると以下のようになると考えます。
      - 特定のディレクトリ以外について何か (-print) を行う
              ⇒ find . -name hoge -prune -o -print
      - 特定のパターンのファイルに何か (-ls) を行うが、特定ディレクトリ以下は除外する
              ⇒ find . -name \*.csv -ls -o -name hoge -prune
      - 特定のパターンのファイルに何か (-print) を行うが、特定ディレクトリだけは
          除外する。ただし特定のパターンにも特定のディレクトリにも一致しない場合は、
          別の何かを行う (-ls)。
              ⇒ find . -name \*.csv -print -o -name hoge -prune -o -ls

No. 4838 # べた 2007/10/01 (月) 19:50:45
>>4837 68user
ありがとうございます。
返事遅れてすみません。

一度、内容を読んで、確認してみます。
それで、再度、質問します。

No. 4839 # べた 2007/10/04 (木) 09:37:55
>>4837 68user
ありがとうございます。
期待した結果が得られました。

No. 4840 # まるこ 2007/10/11 (木) 10:40:25
はじめまして。
以下のページを見て質問させていただきます。
http://x68000.q-e-d.net/~68user/net/http-1.html

telnet(WindowsXPに標準でついていたものです)で、
% telnet www.cs.gunma-u.ac.jp 80
とコマンドを打っても、コマンドが無効です、と出てしまいます。
ここで詰まってしまって、先へ進めないでいます。
helpを見てみて、openかなと思ったのですが、それでも接続できない状況です。
googleで検索してもみたのですが、要領を得ませんでした・・・
何か解決法はないでしょうか?
プロバイダからは、特別なproxyを使わないと駄目ですとは言われていません。

よろしくお願いします。

No. 4841 # 68user 2007/10/13 (土) 03:22:19
>>4840 まるこ
telnet の起動の仕方を勘違いしているように見えます。

スタート > すべてのプログラム > アクセサリ で
    コマンド プロンプト
を起動します。するとウィンドウが開き
    Microsoft Windows XP [Version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.

    C:\Documents and Settings\user>
などと表示されるはずです。

ここで
    telnet www.cs.gunma-u.ac.jp 80
とタイプしてください。
    http://x68000.q-e-d.net/~68user/net/win-telnet.html
にあるとおりエコーバックはされませんが、
    GET / HTTP/1.0(Enter)
    (Enter)
とすると取得した HTML が表示されるはずです。「(Enter)」は
XP であれば普通に Enter キー押下でいけると思います。

No. 4842 # yuki 2007/10/16 (火) 20:25:23
はじめまして。
以下のページを参考にさせていただきまして、質問させていただきます。
http://x68000.q-e-d.net/~68user/webcgi/char-code-2.html

以下のように機種依存文字のチェックをさせてみたところ
「丁目」という文字がC3FA CCDCとなり、FACCが90区のチェックに
引っかかってしまいました。

$fradrs = $_POST['adrs'];
$check = mb_convert_encoding($fradrs,'EUC-JP');
if (ereg("\x8E[\xA0-\xDF]|[\xAD\xF9\xFA\xFB\xFC][\xA1-\xFE]", $check)) {

こういった場合はどのように対処したらよいでしょうか。
よろしくお願いします。

No. 4843 # 68user 2007/10/16 (火) 20:41:06
>>4842 yuki
そのページでも紹介していますが、文字単位でマッチさせるために
    http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
という工夫をしています。

PHP であれば mb 系の関数を使えば文字単位で切り出せると思いますが、
いわゆる機種依存文字に対応しているかどうかわからないのでまずは
試してみてください。対応していなければ、上記のようなやり方で
1文字ずつ取り出す必要があるかもしれません。

No. 4844 # yuki 2007/10/19 (金) 14:15:48
>>4843 68user様
ご助言ありがとうございます。
ご案内いただいたページを参考にして以下のように記述したところ
想定通りに動くことを確認できました。

$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';

$fradrs = $_POST['adrs'];
$check = mb_convert_encoding($fradrs,'EUC-JP');
if (ereg("^($ascii|$twoBytes|$threeBytes)*(\x8E[\xA0-\xDF]|[\xAD\xF9\xFA\xFB\xFC][\xA1-\xFE])", $check)) {
    echo "マッチしました。\n";

mb系は私の未熟さゆえかうまく動作しませんでした…。
68user様、ありがとうございました。

No. 4845 # 2323 2007/10/19 (金) 15:22:54
http://x68000.q-e-d.net/~68user/unix/pickup?freebsd-update
freebsd-updateでぐぐると上位に引っかかり、拝見しました。
「あくまで 5.1-STABLEを追っかけている」という記述がありますが、
おっかけている(いた)のは'5.1 security fix branch'(RELENG_5_1)で、
5.1-STABLEというブランチは存在しないです。
また'5-STABLE'も5.1-RELEASEをブランチした直後以外は
5.1相当ではなかったわけなので、やはり5.1-STABLEという記述は
修正されたほうが良いかと思います。

No. 4846 # yuki 2007/10/19 (金) 16:11:44
>>4844 yuki
何度も申し訳ありません。
4844の記述ではうまく動かないですね…。
機種依存文字が文頭にある場合のみ動作して
2文字目以降にある場合にはマッチしてくれないです。
正規表現についてもう少し勉強してきます。

No. 4847 # 68user 2007/10/31 (水) 00:33:11
>>4846 yuki
ダメですかねぇ? あっているような気がしますが。
$_POST['adrs']・$check のデータを明示いただければ何かしら回答できるかもしれません。

>>4845 2323
よく理解していないので確認させていただきたいのですが、
    「あくまで 5.1-STABLE を追っかけているに過ぎない」

    「あくまで '5.1 security fix branch' (RELENG_5_1) を追っかけているに過ぎない」
とすれば正確な表現と言えるでしょうか。

No. 4848 # yino [E-mail] 2007/11/09 (金) 03:18:57
はじめまして。
突然ですが、ご教授ください。

私は今、大学4年生で卒業研究をしているのですが、ネットワークプログラムを作る必要が出てきてしまいました。
ですが、私はプログラミングは全くの初心者で、どの言語を使えば良いのか、何から始めればいいのかもよく分かりません。
どなたかアドバイスや、参考となりそうなプログラムやサイトを教えて頂けませんか?

OSはKNOPPIXで、アドホックモード(OLSR)での動画の転送をしたいです。
転送さえできればいいとのことなので、プログラム自体は簡単なものでいいようです。

場違いな質問かもしれませんがよろしくお願いいたします。

No. 4849 # バンガード 2007/11/09 (金) 09:14:02
>>4848 yino
残念ながら聞いた事もないOSですので、お力になれません。
ただ、この様な場合、ひたすら検索サイトでキーワードを入れて検索してみてはいかがですか?
就職しても、この辺りは変わりません。
まずは、片っ端から検索して自分の目的としている情報が載っているサイトを探してみましょう。

No. 4850 # 68user 2007/11/09 (金) 09:38:11
>>4849 バンガード
OLSR はプロトコルのようです。

>>4848 yino
わたしなら
    1. まわりに言語の有識者がいるか
    2. その言語向けのネットワークプログラミング関連の書籍が出版されているか
    3. ネットワークプログラミング向きか
    4. プログラミング初心者が扱いやすい言語か
という観点で考えます。

1 は、まわりを見渡してください (Java が多いのではないかと想像しますが)。
これが最重要だと思います。

2 は、Java が一番、次点が Perl でしょうか。PHP・Ruby はこの点は弱い。

3 は、本質的にはどの言語でも同じでしょうが、PHP などは無駄にハマりやすそうな
気がします。

4 は、まぁ Java ではないかと。


個人的には、Java がイチオシ、次点が Perl です (自分が書くなら Perl か Ruby)。

No. 4851 # yino [E-mail] 2007/11/09 (金) 14:51:27
>>4850 バンガードさん、 >>4849 68userさん
ありがとうございました。
とりあえずは周りの人から話を聞いてみたいと思います。
あとはJavaの本を読んでいきたいと思います。

また壁にあたったときはここに来ると思いますので、よろしくお願いします。

No. 4852 # aki 2007/11/12 (月) 15:55:35
はじめまして。
いきなりですが教えてほしいことがあります。

大学の課題でサーバの存在するマシンのカレントディレクトリにおけるファ
イル一覧を表示する。
<LIST>と打ち込むとファイルの一覧を表示する
<GET ファイル名>打ち込むと、ファイルの内容を表示する
<PUT ファイル名>でファイルをアップロードする。
<QUIT>と打ち込むとサービス終了。と言うプログラムを作っていたのですが
うまく実行できません。どこが間違っているか教えていただけませんか。

#include <netdb.h>
#include <stdio.h>
#include <fcntl.h>

#define BUFMAX 45
#define PORT_NO 10092
#define Err(x) {fprintf(stderr,"server- ");perror(x); exit(0);}

static char rmsg[10], smsg[BUFMAX];
static int sofd, nsofd;
static struct sockaddr_in sv_addr, cl_addr;
static struct hostent *shost;
static char shostname[100];

int msgpro(void);

int main(int argc, char **argv)
{
    int cadlen;
    DIR *dirHandle;
    struct dirent *dirEntry;

    dirHandle=opendir(".");
          if(dirHandle){
              while(0!=(dirEntry=readdir(dirHandle))){
     puts(dirEntry->d_name);
              }
              closedir(dirHandle);
          }

    sofd = socket(AF_INET, SOCK_STREAM, 0);
    if(sofd < 0)
        Err("socket");
    if(gethostname(shostname, sizeof(shostname)) < 0)
        Err("gethostname");

    shost = gethostbyname(shostname);
    if(shost == NULL)
        Err("gethostbyname");

    bzero((char *)&sv_addr, sizeof(sv_addr));
    sv_addr.sin_family = AF_INET;
    sv_addr.sin_port = htons(PORT_NO);
    memcpy((char *)&sv_addr.sin_addr, (char *)shost -> h_addr, shost -> h_length);

    if (bind(sofd,(struct sockaddr *)&sv_addr, sizeof(sv_addr)) < 0)
          Err("bind");

          if(listen(sofd, 1) == -1)
          Err("listen");

          while(1){
              cadlen = sizeof(cl_addr);
              if((nsofd = accept(sofd, (struct sockaddr *)&cl_addr, &cadlen)) <0)
     Err("accept");
            

              if(fork() == 0)
     if(msgpro()==-1){
     close(nsofd);
     printf("END SERVER\n");
     if(shutdown(nsofd, 2) < 0)
     Err("shutdown");
                      close(nsofd);
     exit(1);
     }
                  close(nsofd);
          }
  }

int msgpro(void)
{
    int cc, cadlen,nbyte;
    FILE *fp;

    DIR *dp;

    struct dirent *p;
    char *tmp[100];
    int i,f;
    i=0;
    close(sofd);

    if(recv(nsofd, rmsg, 10, 0) < 0){ perror("recv");}

    printf("%s\n",rmsg);
    
    if(strcmp(rmsg,"QUIT:")==0){
        return -1;}
    

    if(strcmp(rmsg,"LIST:")==0){
            printf("LSIT:\n");
            dp=opendir("./");
            while((p=readdir(dp))!=NULL){
     tmp[i]=p->d_name;
     strcat(tmp[i],"\n");
     i++;
            }
            closedir(dp);
            tmp[i]=".";

            for(f=2;f<=i;f++){
    nbyte = strlen(tmp[f]);
                if(send(nsofd, tmp[f], nbyte, 0) < 0)
     perror("send");
    }
    }else{
        int i;
        char filename[10];
            if(strncmp(rmsg,"GET:",4)==0){
                printf("%s\n",rmsg);
    for(i=4;i<=strlen(rmsg);i++){
     filename[i-4]=rmsg[i];
    }
    fp = fopen(filename,"r");
    while(fgets(smsg, BUFMAX, fp) != NULL){
     nbyte = strlen(smsg);
     if(send(nsofd, smsg, nbyte, 0) < 0)
     perror("send");
    }
    fclose(fp);
            }else{
     if(strcmp(rmsg,"QUIT:")==0){
     printf("shutdown\n");
     return -1;
     }else{
     printf("Command not Fountd.\n");
     strcpy(smsg,"Command not Found.\n.");
     nbyte = strlen(smsg);
     if(send(nsofd, smsg, nbyte, 0) < 0)
     perror("send");
     }
            }
    }

    if(shutdown(nsofd, 2) < 0)
        Err("shutdown");
        close(nsofd);
        exit(0);
}

No. 4853 # 68user 2007/11/12 (月) 16:07:19
>>4852 aki
> うまく実行できません。
何をどうしたらどうなるのか明示してください。

No. 4854 # aki 2007/11/12 (月) 16:13:39
>>68userさん
すみません。
実行した後にLIST、GET ファイル名、PUT ファイル名、QUITなど打ち込んでもなにも
おきないんです。

No. 4855 # 68user 2007/11/12 (月) 16:59:12
>>4854 aki
提示いただいたプログラムはサーバ側のプログラムであって、
    1. サーバを実行する
    2. 別途 telnet コマンドなどを用いてクライアント側からサーバにアクセス
          (telnet localhost 10092 など)
    3. そこで LIST などをタイプする
というものですが、それは理解した上での質問でしょうか?

もし理解していないのであれば、まずはまわりの人に聞くとか、資料を
もっと読むなどして概念を理解してからでないと効率が悪いと思います。

プログラム自体については、telnet 上から
      LIST:(Ctrl-D)
などと変な送信の仕方をする必要がありましたが、一応動くようです。

No. 4856 # aki 2007/11/12 (月) 17:08:01
>>4855 68userさん
ありがとうございます。
よく理解できてなかったみたいなのでもう少し友達に聞いてみます

No. 4857 # aya 2007/12/06 (木) 01:00:19
今度大学の課題でマルチスレッドサーバを作成することになったので、
http://x68000.q-e-d.net/~68user/net/echo-4.html
を参考にマルチスレッドサーバについて勉強している者です。
そこで、素朴に疑問があるのですが、
このページに書いてある内容は、本当にマルチスレッドなのでしょうか?
マルチスレッドというと処理が平行して行われるという認識なのですが、
この実装では多数のソケットからデータが到着したソケットを順次選択して
処理をする、というように見られるのですが・・・。
これはマルチスレッドサーバと呼んでもよろしいのでしょうか?

No. 4858 # masa 2007/12/09 (日) 08:57:28
HTTP1.1でKeepAliveでHTTPSサーバに接続した場合に、サーバからの
レスポンスの長さが短い(500バイト以下程度)場合、クライアントが
タイムアウトとなりサーバからのレスポンスが読めません。
サーバ・クライアント共にFEDORAを使用しており、クライアントは
TCP/IPのソケット、OpemSslを使って作成しています。
対処方法は何かありますでしょうか?

No. 4859 # 68user 2007/12/12 (水) 18:59:29
>>4857 aya
どうなんでしょうか。以前に同様の指摘があった場合は
>>3223 int
>>3224 68user
>>3226 Netboy
>>3227 68user
というところで止まっています。その後、わたしの知識は増えていないため、
まだ疑問のままです。

>>4858 masa
ソースを提示願います。


なお、本日より数日〜数週間の間、返事がしにくい状況になりそうなので、
ご了承ください。

No. 4860 # masa 2007/12/13 (木) 00:31:00
>>4859 68user さん

解決しました。
読み込もうとしているバッファサイズが大きすぎたようです。

No. 4861 # toshi7 2008/01/11 (金) 22:42:16
remshについて知っている方はご教授願います。
環境:HP-UX 11

今シェルを作成しているのですが、あるAPサーバのシェルの中でremshをして他のDBサーバでミドルのコマンド(HiRDBのスケジューラ)
の結果とそのリターン値の標準出力をファイルに吐き出すと言う処理をしています。
$USER_Aでシェルを実行(HOST=DBサーバ)
# remsh $HOST -l $USER_B -n ". .profile 2>&- ; \$DIR/bin/HiRDBのコマンド ; echo \$? " > $FILE

この場合開発環境ではうまく標準出力の結果をファイルに吐き出せるのですが、
顧客本番環境ではうまくいきません。
結果を見る限り、.profileが読み込めてない、またはミドルのコマンドが読み込めていない、と言った感じです。
ちなみに、DBサーバ側の$USER_Bの.rhostsには[APサーバ $USER_A]が記載されています。

この際remshの後のコマンドが実行されていない原因として疑わしき点を教えていただきたいです。
たとえば.profileに問題ありなど…。
お願いいたします。

No. 4862 # 68user 2008/01/12 (土) 11:29:45
>>4861 toshi7
思いつくのは

- remsh 後のカレントディレクトリが異なる
- ログイン後の環境変数が異なる
- 出力先のパーミッションが異なる
- HiRDB のコマンドの場所が異なる
- HiRDB のコマンドがエラーとなっている
        → HiRDB を実行するのではなく、適当な自作プログラムを実行し、
              起動されているかどうかログ等に記録する
- 標準エラー出力を閉じているので、HiRDB の標準エラー出力への
    出力が出力されていない (もしくは write(2) でエラーになるため
    途中でこけている)

くらいでしょうか。

No. 4863 # toshi7 2008/01/17 (木) 22:57:54
>>4862 68user
68userさん
ありがとうございます。
調査を進めているところですが、HiRDBのコマンドでエラーになっている可能性が大です。
また、今週or来週中にもremshのテストができる予定ですので、
# remsh $HOST -l $USER_B -n ". .profile 2>&- ; \$DIR/bin/HiRDBのコマンド ; echo \$? " > $FILE 2>&1
で標準エラーを出力してみます。
ちなみにサーバ側の"last | more"の結果を見る限りremsh自体は届いているようでした。

また、テストの結果不明点がありましたら、質問させていただいてもよろしいでしょうか?
宜しくお願いします。

No. 4864 # 68user 2008/01/20 (日) 20:23:55
少しずつですが
    UNIXの部屋
        http://x68000.q-e-d.net/~68user/unix/
の各コンテンツを手始めに、Web 全体のデザインを変更していきます。
もし不具合があれば教えていただければ幸いです。

No. 4867 # Ponta [E-mail] 2008/01/27 (日) 13:07:52
68userさま。いつも、初心者に有り難いサンプルをたくさんご提供いただき
ありがとうございます。
HttpClientHttpURLConnectionを走らせたところ、ブラウザで見ると日本語の部分
が、文字化けしています。yahooのページを始め、いくつか試したのですが同じ
状態です。化けないようにするにはどうしたら良いのでしょうか?
お忙しい中恐縮ですが、どなたかご教示下さい。

No. 4868 # 68user 2008/01/30 (水) 13:41:40
>>4867 Ponta
http://x68000.q-e-d.net/~68user/net/java-http-url-connection-1.html
ですよね?

「ブラウザで見ると」の意味がわかりません。実行例にあるとおり、
コマンドラインからの実行を前提としています。

No. 4869 # しも [E-mail] 2008/02/06 (水) 10:33:11
初めて質問させていただきます。
12月から本格的にUNIXの勉強を始めて、現在はHP-UXの業務に就いております。
参考資料を購入したり、netで調べるもどうしても見つからない。。

質問内容:
ファイルサイズをbyteで表示させるコマンドが知りたいです。

データ移行作業をしているので、移行前マシンと移行後のマシンでの
容量チェックをしなくてはいけなくて。。。
大変初歩的質問で申し訳ないのですが、ご教授下さい。

※HP-UX 11iを使用しております。

No. 4870 # 68user 2008/02/06 (水) 11:42:01
>>4869 しも
よくわかりませんが ls(1) の結果は使えないんでしたっけ?
あとは cksum・wc・find とか。それ以外なら awk・perl あたりでしょうか。

cksum
    http://docs.hp.com/ja/B2355-60129/cksum.1.html
wc
    http://docs.hp.com/ja/B2355-60129/wc.1.html
find . -ls
    http://docs.hp.com/ja/B2355-60129/find.1.html

No. 4871 # しも [E-mail] 2008/02/06 (水) 17:47:36
>>4870 68user
ありがとうございます。
ファイル個々のサイズはcksumやwcで確かに確認できました。
ディレクトリのサイズはbyte表示させる事は不可能なのでしょうか?

duを使用しましたが、KBだったのとブロック単位でした。

No. 4872 # 68user 2008/02/06 (水) 20:57:05
>>4871 しも
HP-UX に限らず、du ではブロックカウント機能しかないと思います。
    http://sonic64.com/2004-05-26.html
のように自前でカウントするしかないでしょう。

No. 4873 # 大臣 2008/02/07 (木) 15:45:40
cygwinでbash not find :bash.exeというエラーがでんだけどどうすれば
いいか教えろ!!!!!どーせ暇だろ!ニート諸君、俺様の変わりに調べろ!
パスの設定はしてある。
俺も暇じゃないから5分やるですぐ調べて返信しろ。貴様らは蛆虫だ。
./bashrc等も完璧
しかーーーーし動かん。楽勝だて。

No. 4874 # ふくし 2008/02/08 (金) 17:11:14
お世話になります。
質問のときだけ現れてスミマセン。
Perl で、

filename -> title
aaa.html -> aaaについて
bbb.html -> bbbについて
ccc.html -> cccについて

みたいなタブ区切りのテキストを読んで処理するとき、カンタンには

while (<>) {
    ($filename, $title) = <>;
}

のようにすると思いますが、1行目に見出しが入っていて、
これを捨てたいと思います。

今は、

$trash = <>;
while (<>) {
    ($filename, $title) = <>;
}

のようにしていますが、
$trash が1回しか使われていませんが書き間違いではありませんか、
という警告が出ます。
警告だから無視すればいいようなものですが、
もっとスマートな書き方はあるでしょうか。

No. 4875 # 68user 2008/02/08 (金) 17:20:10
>>4874 ふくし
- <>;
- my $trash = <>;
- (undef)=<>;
のいずれかでどうでしょうか。Perl5.8.8 では問題ありませんでした。

No. 4876 # ふくし 2008/02/08 (金) 17:51:25
>>4875 68user
さん、ありがとうございます。
いずれも 5.10.0 でもうまくいきました。

(undef) = <>;

というのは自分で思いついていたんですが、
リストコンテクストで評価されて、
全部の行が代入されたのち2行目以降は捨てられる
(1行目も undef だから捨てられる)
ような気がしていました。
ありがとうございます。

No. 4877 # 68user 2008/02/08 (金) 18:48:31
>>4876 ふくし
ああそうですね。書くなら
    (undef)=scalar(<IN>);
でしょうか。しかし仕事でこのコード見たらイラッとしますねぇ。

No. 4878 # has 2008/02/09 (土) 00:08:12
>>4873 大臣
ご期待に沿えず残念ですが、たぶん多忙で善良なプロの皆さんとかからの
回答になると思います。
どのくらい完璧か晒したら進言あるかもですよ。

No. 4879 # ふくし 2008/02/13 (水) 10:56:17
そういえば(どういえばだ)以前(数年前)Perl で

goto FIN;
sub foo {}
FIN:

だとエラーになるけど

goto FIN;
FIN:
sub foo {}

または

goto FIN;
sub foo {}
FIN:
;

だとダメ、という件があったんだけど、急に思い立って perlbug してみました。
2時間後に返事が来て(すげえな)perlsyn に書いてあるけど
それはバグではない、ラベルの後には1個以上の文がなければならないと
いうことです。FAQらしいですね。

No. 4883 # しも [E-mail] 2008/02/14 (木) 15:55:49
>>4872 68user
返信が遅くなりました。
68userさんの仰るように、自分でツールを作成する必要がある事を理解しました。
awkを使って作成しようと思います。
初めて作るので、時間がかかりそうですが結果はまた報告にきます。
ありがとうございました。

No. 4884 # ふくし 2008/02/15 (金) 01:20:39
>>4883 しも
さん、

どっちみち初心者だったら awk より Perl をおすすめします。
汎用性があるし可読性も高くできると思います。
ちょっと書いてみるとこんな感じでしょうか。

★さしでがましければすみません。ここで読むのやめてください ^^





#! /bin/perl -w
# dsize -- カレントディレクトリ以下のファイルサイズを集計

use File::Find;

$total = 0;
find(\&fileProc, '.');
print "Total\t$size\n";

sub fileProc {
    return unless -f $_;
    $size = -s $_;
    print "$File::Find::name\t$size\n";
    $total += $size;
}

No. 4885 # maya 2008/03/04 (火) 16:06:17
初歩的なことなんですが教えてください。
tar.gz な書庫にファイルを追加したい場合、
いちいちgunzipしないといけないんでしょうか?

なにかスマートな方法はあるんでしょうか?

No. 4886 # つのりん [E-mail] 2008/03/23 (日) 20:10:01
はじめまして、つのりん と呼んでください。

早速ですがx68k専用マウスが故障しました。

症状はとしては、カーソルは全く異常なく動作しますが、クリックが左右ともできなくなりました。原因はボタン下のマイクロスイッチの故障ではないかと思われます。

なにか対策法はありませんか?

よろしくお願いします。

No. 4887 # mm 2008/03/24 (月) 06:42:58
はじめまして。
http://x68000.q-e-d.net/~68user/unix/pickup?find
findの説明のところで、
-atime 4 4日前にアクセスされたファイル
-ctime 4 ちょうど4日前にファイルステータスが変更されたファイル
-mtime 4 ちょうど3日前に修正されたファイル
と、mtimeだけ3日前となっていますが、これは間違いでしょうか?

No. 4888 # べた 2008/03/25 (火) 12:40:27
findで、検索する文字が複数出てくる場合の
記述について教えてください。

あるディレクトリに、以下の様な「YYYYmmdd」形式の
ディレクトリが存在した場合ですが、名前がすべて、
「0〜9」の数字であるディレクトリのみを表示したい
のですが、どのように書けばよいのでしょうか。

find . -name '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' -type d
で表示されるのですが、
[0-9]を8回書く以外に、違った書き方はないでしょうか。

find . -name '[0-9]*[0-9]' -type d
find . -name '[0-9]......[0-9]' -type d
find . -name '[0-9]*......[0-9]' -type d
find . -name '[0-9]......*[0-9]' -type d
とかしてみたのですが。



/tmp配下に、
20080301
20080302
20080303
20080303.bk
a0080304
2008030a
200a0306
200080307

No. 4889 # 68user 2008/03/25 (火) 17:25:53
>>4885 maya
> tar.gz な書庫にファイルを追加したい場合、いちいちgunzipしないといけないんでしょうか?
r で追加できますが、gzip してある場合はできないようですので、gunzip が必要と
思われます (BSD tar と GNU tar で確認)。

>>4886 つのりん
ヤフオクによく出品されているように見えますので、チェックしてみてはどうでしょうか
今は「キーボード & マウス [未使用]」が出てますね。

>>4887 mm
> と、mtimeだけ3日前となっていますが、これは間違いでしょうか?
ありがとうございます。誤りでしたので修正いたしました。

>>4888 べた
Perl の正規表現 (PCRE) であれば [0-9]{8} もしくは \d{8} ですが、POSIX における
基本正規表現や拡張正規表現では上記のような表現はできませんので、find にこだわる
のであれば 8回書くしかないです。

あるいは、
    ・File::Find を使った perl のワンライナーでがんばる
    ・シェル変数を使う
            csh・tcsh の場合:
                % set x='[0-9]'
                % find . -name "$x$x$x$x$x$x$x$x"
            sh・bash の場合:
                % x='[0-9]'
                % find . -name "$x$x$x$x$x$x$x$x"
など。

No. 4890 # べた 2008/03/25 (火) 18:30:49
>>4889 68user

ありがとうございます。

No. 4891 # べた 2008/03/26 (水) 15:09:22
perlの使い方なのですが、

日付と時間を表示する簡単なものを作りました。
実行したら動いたのですが、ところが、下記のような
メッセージが出ました。

------------------------------------------------------------
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
                LC_ALL = (unset),
                LANG = "ja_JP.PCK"
        are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
------------------------------------------------------------

このメッセージを表示させないようにするには、どうしたらよいか
教えてください。

環境は、Solari8

以下、perlのシェルスクリプト
------------------------------------------------------------
#!/usr/local/bin/perl
#

($day, $mon, $year) = (localtime(time))[3..5];
printf("Today : %04d/%02d/%02d\n",$year+1900,$mon +1,$day);

($sec, $min, $hour) = (localtime(time))[0..2];
printf("Time : %02d:%02d:%02d\n",$hour,$min,$sec);
------------------------------------------------------------

No. 4892 # maya 2008/03/26 (水) 18:52:55
>>4889 68user

なるほど。ここらへんはzipやrarなどと比べると不便ですね。
ありがとうございました。

No. 4893 # 68user 2008/03/26 (水) 18:54:47
>>4891 べた
「perl: warning: Setting locale failed」で検索すれば出てきますが、
環境変数 PERL_BADLANG を設定することで回避可能です。詳細は検索願います。

No. 4894 # つのりん [E-mail] 2008/03/26 (水) 19:31:35
>4889
ありがとうございます。ヤフーのオークション
で見てみます。

No. 4895 # べた 2008/03/27 (木) 11:29:44
>>4893 68user

ありがとうございます。

perlのスクリプトを実行時のみ有効にしたいのです。
perlのスクリプト内で記述する場合はどのように
定義すればよいのですか。

No. 4896 # 68user 2008/03/27 (木) 11:44:00
>>4895 べた
perl コンパイルの際の Configure 時に設定する方法があります。

それが無理なら
    #!/bin/sh
    PERL_BADLANG=0 /foo/bar/baz.pl
と wrapper を作るか、env コマンドで
    #!/usr/bin/env PERL_BADLANG=0 /usr/local/bin/perl
とする手もあります。

No. 4897 # べた 2008/03/27 (木) 12:55:00
>>4896 68user
ありがとうございます。

#!/usr/bin/env PERL_BADLANG=0 /usr/local/bin/perl
#

とperlのスクリプト内に記述して、実行したのですが、
処理がとまったというか、何も応答が返ってきません。

No. 4898 # 68user 2008/03/27 (木) 23:05:24
>>4897 べた
なるほど FreeBSD 5.2.1-RELEASE では動きますが、Linux では確かに
無限ループしてますねぇ。

> #!/usr/bin/env PERL_BADLANG=0 /usr/local/bin/perl
これは FreeBSD 5.2.1-RELEASE では
    /usr/bin/env PERL_BADLANG=0 /usr/local/bin/perl ./hoge
と解釈されますが、Linux や Solaris では
    /usr/bin/env "PERL_BADLANG=0 /usr/local/bin/perl" ./hoge
となるため
    PERL_BADLANG="0 /usr/local/bin/perl"
という環境変数が設定されつつ
    /usr/bin/env ./a
が実行されるものの、./hoge のシェバング行にはまた同じ内容が
書かれているため、永遠に
    execve("./a");
が実行されるということですね。

参考:
    http://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%D0%A5%F3%A5%B0
    の Tips.2

というわけで env コマンドを使うやり方は移植性がありませんでしたが、
    #!/bin/sh
    PERL_BADLANG=0 /foo/bar/baz.pl
なら動くと思います。Linux では動きました。

No. 4899 # べた 2008/03/28 (金) 12:53:23
>> 4898

> #!/bin/sh
> PERL_BADLANG=0 /foo/bar/baz.pl
>なら動くと思います。Linux では動きました。
で動きました。

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

No. 4900 # 68user 2008/04/02 (水) 19:10:27
さきほどお問い合わせページよりご指摘いただきました、ジャンル一覧リンク切れの件、
修正しました。ご指摘ありがとうございます>連絡いただいた方

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