68user's page 掲示板

Prev< No. 4215〜4315> Next  [最新発言に戻る] [過去ログ一覧]
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の結果にしたいのです。

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