68user's page 掲示板

Prev< No. 3125〜3195> Next  [最新発言に戻る] [過去ログ一覧]
No. 3125 # koko 2003/02/26 (水) 11:46:06
>>3124 koko
256と-1が交互になる件は解決しました。
SIGCHLDのシグナルハンドラを登録してあった為、シグナルハンドラが割り込んだ時のみsystemの戻り値が-1になっていた様です。
SIGCHLDをマスクしたところ、戻り値は256で安定しました。

No. 3126 # bebe 2003/02/26 (水) 19:00:41
find コマンドについて質問があります。
ファイル名で検索をかけたいと思うのですが、
UNIXだと英数字の大文字・小文字を区別してしまうので、例えば、
「a」で検索した場合、「A」というファイルは引っかからないかと
思います。
大文字・小文字の区別無く引っ掛けたいと思うのですが、その様な
オプション又は方法はありますか?

No. 3127 # 68user 2003/02/26 (水) 19:36:38
>>3126 bebe
最近の *BSD find や GNU find なら -iname とか -iregex とか。
そうでない find なら広めにひっかけて grep で絞りましょう。

No. 3128 # bebe 2003/02/28 (金) 13:58:18
>>3127 68user
findコマンドで引っ掛けられたらいいかと思ったのですが、
やっぱり広めに検索をかけて、grep等で絞り込むしかなさそ
ですね。
参考になりました。
有り難うございます。

No. 3129 # もも 2003/03/06 (木) 05:42:54
始めまして、いつもこちらでは陰ながら勉強させていtだいてます。
perlスクリプトのことでお教えください
ただ今企画中のスクリプトにおいて
外部コマンド実行時、そのコマンドプロセスの標準入力へ有る意味大量のデータ(文字列)を渡したいのです
しかしこの方法が全く頭に浮かばず情け無い状態であります!
PIPEやファイルシステムの基礎を知らない私にご教授下されば幸いです。

No. 3130 # 68user 2003/03/07 (金) 01:14:46
>>3129 もも
      open(OUT, "| command");
      print OUT "HOGEHOGEHOGEHOGEHOGEHOGEHOGE....";
      close(OUT);
ってことですか?

じゃなくて command の標準入力に渡しつつ、そのコマンドの
出力を受け取りたいなら IPC::Open2 などを使えばできます。
できますが、デッドロック回避などが面倒なので

      open(OUT, "| command > file");
      print OUT "HOGEHOGEHOGEHOGEHOGEHOGEHOGE....";
      close(OUT);
      open(IN, "< file");
      while (<IN>){
            ....
      }

でいーんではと思う軟弱な私。

No. 3131 # もも 2003/03/07 (金) 11:25:16
>>3139 金床
68user様なるほど理解しました前者が出来ればいいのです!
早速試してみます。ありがとうございました!

No. 3132 # koko 2003/03/10 (月) 10:36:24
親プロセスが複数の子プロセスを生成します。
親は子プロセスの終了をシグナル(SIGCHLD)ハンドラで検知し、waitで子プロセスの終了コード(exitの引数)を取得しています。
同時に、子プロセス数を減算します。(forkで子プロセス数を加算しています。)
シグナルハンドラの処理中に、別の子プロセスが終了した場合、SIGCHLDが無視されてしまう。
あるいは、ほぼ同時に複数の子プロセスが終了した場合には、1回しかSIGCHLDのシグナルが発生しないとの記述を見た事があるのですが、正しく全ての子プロセスの終了を検知する方法はありますでしょうか。
以前、頂いたNo. 2988で頂いた以下の方法でこのような懸念が解消されますでしょうか。

SIGCHLDのシグナルハンドラ--------------------------
        int pid,status,code;

        while((pid=waitpid(-1,&status,WNOHANG))>0){
                if(WIFEXITED(status)){
                        code = WEXITSTATUS(status);
                }
        }
--------------------------------------------------
また、waitpidがシグナルに割り込まれるとエラーになり、errnoにEINTRが設定されると思うのですが、WNOHANGを設定していた場合にはそのような事は無いと考えてしまって良いでしょうか。
よろしくお願いします。

No. 3133 # 68user 2003/03/10 (月) 22:33:46
>>3132 koko
まずは sigaction(2) を読んでください。

# わたしもよくわかってないので読んでいるところ。

No. 3134 # koko 2003/03/11 (火) 08:08:55
>> 3133
読んでみます。

No. 3135 # koko 2003/03/14 (金) 17:50:58
ソケット(TCP)に関する質問です。
サーバ(UNIX)とクライアント(WinSock)がソケットで通信しています。
サーバがクライアントに対してwriteでデータを送り、クライアントがrecvでそれを読む処理を作成しました。
サーバでwriteし、すぐにソケットそcloseすると、クライアントではrecvできずにエラーになります。(既に接続が破棄されている。)
サーバ側でwriteして、すぐにcloseしている事が原因の様です。
writeとcloseの間に1秒程度の時間をおくと、クライアントはrecvできました。
このように、writeとcloseが連続すると相手がrecvできないケースは当然の事なのでしょうか。
それとも、通常はrecvできるはずであり、他に問題がありそうでしょうか。
同じ経験をした事のある方がの意見なども聞けると助かります。
よろしくお願いします。

No. 3136 # 68user 2003/03/15 (土) 04:04:27
>>3135 koko
> 通常はrecvできるはず
だと思います。

No. 3137 # koko 2003/03/17 (月) 08:28:29
>>3136 68user
回答ありがとうございます。
他の原因を調べてみます。

No. 3138 # ajmj 2003/03/17 (月) 18:18:45
ファイルハンドルについての質問です。
Net::FTPで動的に作り出したCSVをアップしたいのですが、
ローカルにファイルを書き出さずにputする方法を教えてください。
FileHandle.pmを使って無名のファイルハンドラを作って、
そこにCSVを入れて、$FTP->put(FILEHANDLA)でアップさせる
とイメージしているのですが
よろしくお願いします。

No. 3139 # 金床 [URL] [E-mail] 2003/03/17 (月) 23:24:58
>>3135 koko
ソケットのクローズはどのAPIを使って(どんなソースコードで)行ってらっしゃいますか?
Winsockだと、shutdownを使わずにclosesocketを呼ぶとRSTフラグのセットされたパケットが飛ぶことが
あるような覚えがあります。

いずれにせよ、パケットキャプチャしてみると原因に近づけると思います。

No. 3140 # koko 2003/03/18 (火) 11:17:29
>>3139 金床
パケットをキャプチャしてみたところ、サーバからクライアントにRSTフラグのセットされたパケットは飛んでいました。

試したケースを整理します。
(1)accept直後にクライアントからの送信データをreadせずに、サーバ側から
write、closeすると、クライアントではサーバがwriteしたデータを受信できません。
(2)accept直後にクライアントからの送信データを1バイトでも良いのでreadし、サーバ側からwrite、closeすると、クライアントではサーバがwriteしたデータを受信できます。

(2)では、RSTフラグのセットされたパケットが飛ぶ前に、FIN ACKがセットされたパケットとクライアントで受信させたいパケットが飛んでおり、(1)ではFIN ACKがセットされたパケットとクライアントで受信させたいパケットが飛んでいません。

サーバ側でクライアントの送信電文を1バイト読む事で動きが変わるようなのですが、この辺が何か関係があるのかもしれません。

ちなみに、APIは以下の通りです。
サーバ(UNIX):socket,bind,listen,accept,select,read,write,close
クライアント(WIN):socket,bind,connect,listen,recv,send,closesocket

サーバ側でのソケットのクローズは、acceptの戻り値を引数にしてcloseをしているのみで、shutdownはしていません。

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

No. 3141 # 68user 2003/03/18 (火) 21:02:38
>>3138 ajmj
> FileHandle.pmを使って無名のファイルハンドラを作って、
> そこにCSVを入れて、$FTP->put(FILEHANDLA)でアップさせる
というのが実現可能なのかどうかはわかりませんが (できない
ような気がする)、別解としては

    1. put じゃなくて stor("ファイル名") を呼ぶと、Net::FTP::dataconn
          オブジェクトが返ってくるので、それに対して write する。

    2. POSIX::mkfifo で名前付きパイプを作り、fork して、
          子が CSV データを作成、名前付きパイプに書き込む。
          親は Net::FTP::put に名前付きパイプを渡す。

あたりですかね。1 は perldoc Net::FTP を流し読んだだけで、
できるかどうかわかりません。2 は試していませんが、一応実現は
できるでしょう。

>>3140 koko
    http://www.kt.rim.or.jp/~ksk/wskfaq-ja/newbie.html#howclose
ですかね?

あと、情報を小出しにせず、最小限まで削ったソースコードを最初に
載せれば、話が早そうなのになぁと思ったりします。

まぁわたしは Winsock 知らないのでアレですが。

No. 3142 # kaki 2003/03/18 (火) 23:00:14
はじめまして、お世話になります。
kakiと申します。

現在、Linux(Redhat7.1 kernel2.4.2-2)、C言語にて
プログラムの作成をしております。

質問なのですが、プログラム上(C言語)からFD、CFなどのデバイスに
マウントし、FD、CF内のファイルを取得するということは
可能なのでしょうか?

お分かりになる方がおられましたら、ご教授お願いいたします。

No. 3143 # 金床 [URL] [E-mail] 2003/03/18 (火) 23:49:33
>>3140 koko
やっぱりRSTによる「異常終了」が原因のようですね。
shutdown()を使ってみると幸せになれると思います。

No. 3144 # 68user 2003/03/19 (水) 02:04:16
>>3142 kaki
mount(2) をどうぞ。あるいは DOS フォーマットならば mtools の
mtype あたりがお手軽かも。

ところで CF って何ですか? コンパクトフラッシュ?

No. 3145 # kaki 2003/03/19 (水) 09:12:15
>>3144 68user
ご回答ありがとうございます。

mountはコンソール上でのやり方は知っているのですが、
gccでコンパイルしたプログラムからも、
使えるということなのでしょうか?
また、コンソールで使えるコマンド(# mountや# cdなど)を
Cプログラムで使用するにはどのようにするのでしょうか?

実際、やりたいことはプログラムを起動したら、
FD、CF(コンパクトフラッシュ)にマウントし、
ファイルがあればディレクトリにコピーするといったことです。

参考になるサイトや文献などご存知でしたら、
教えてください。
よろしくお願いします。

No. 3146 # FF 2003/03/19 (水) 13:25:20
端末の入出力について質問です。

cronで実行されたシェルの出力を端末に出力したり、
端末からの入力を受けたりしたいのですが、どのよう
にすればよいのでしょうか?
次のようなやり方ではダメでした。
#ファイル名 a.sh
#!/bin/ksh
while [ : ]
do
        read INPUT?'?'
        if [[ $INPUT = 'q' ]]; then
                exit
        fi
done
#スクリプト終了
% a.sh < /dev/pts/13 > /dev/pts/13 2&>1

どなたか教えてください。よろしくお願いします。

No. 3147 # 68user 2003/03/19 (水) 13:51:15
>>3145 kaki
> mountはコンソール上でのやり方は知っているのですが、
> gccでコンパイルしたプログラムからも、
> 使えるということなのでしょうか?
mount(1) は内部で mount(2) を呼んでいるだけなので、自分で
mount(2) を呼んでやればよいわけです。

mount(1) のマニュアル http://www.linux.or.jp/JM/html/util-linux/man8/mount.8.html
mount(2) のマニュアル http://www.linux.or.jp/JM/html/LDP_man-pages/man2/mount.2.html
セクションとは? http://www.linux.or.jp/JM/section.html

> また、コンソールで使えるコマンド(# mountや# cdなど)を
> Cプログラムで使用するにはどのようにするのでしょうか?
system(3) を使います。
    http://www.linux.or.jp/JM/html/LDP_man-pages/man3/system.3.html

なお、cd は海より深い理由により、system(3) からは使えません。
chdir(2) を自分で発行してください。
    http://www.linux.or.jp/JM/html/LDP_man-pages/man2/chdir.2.html

>>3146 FF
> cronで実行されたシェルの出力を端末に出力したり、
> 端末からの入力を受けたりしたいのですが、
おそらく「端末」という用語を誤解されていると思いますが、cron から
実行した場合は端末は割り当てられないので、それは不可能です。

で、あなたが本当は何をしたいかという話になるわけですが、コンソール
(マシンにつながっているモニタ) に文字列を出したいんですか?

あるいはファイルにあらかじめ入力文字列を書いておいて、ファイルに
出力したいんですか?

No. 3148 # FF 2003/03/19 (水) 14:47:05
>> 3147 68user

>おそらく「端末」という用語を誤解されていると思いますが、cron から
>実行した場合は端末は割り当てられないので、それは不可能です。
「端末」は、画面と入力が行える(ディスプレイとキーボード)と認識
してましたが間違っているでしょうか?また、cronに端末が割り当てら
れないのは認識していましたが、何らかの方法で端末を割り当てるか、
リダイレクトなどで入出力できないものかと思って質問させていただき
ました。

質問時には、コマンドラインでシェルを実行し確認したところ、
readのpromptが適切に表示できないなど若干問題があったので質問
させていただいたのですが、cronで”a.sh < /dev/pts/13 > /dev/pts/13 2&>1”を実行したところ正しく動作しているよう
です。現在は、本当にこれでいいのか(コマンドラインではうまく
いかなかったので)、動作で注意すべき点はないか(どのデバイス
に出力すればよいか)悩んでいるところです。なにかアドバイスが
あればよろしくお願いします。

>で、あなたが本当は何をしたいかという話になるわけですが、コンソール
>(マシンにつながっているモニタ) に文字列を出したいんですか?
コンソールに入力を促す文字列を出力し、ユーザからの入力を受け取り
たいのです。(read INPUT?'?'を行いたい)

UNIX汎用だとおもったので環境は書かなかったのですが、一応記述します。
NCRのUNIX V(らしい)でK Shellを利用しています。

よろしくお願いします。

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

No. 3149 # kaki 2003/03/19 (水) 16:52:19
>>3147 68user
68user さんありがとうございます!!

system("mount /mnt/floppy");
system("ls /home");
など実現できました!!
ありがとうございました。

No. 3150 # 68user 2003/03/20 (木) 00:26:24
>>3148 FF
> cronで”a.sh < /dev/pts/13 > /dev/pts/13 2&>1”を実行したところ
> 正しく動作しているようです。
ほー、FreeBSD で試してみましたが、これ、できるんですねぇ。
知りませんでした。ただ、出力はいいとして、入力については

        ちょうどそのときその端末デバイスからの入力を受け付ける
        プログラム (シェルとか) が走っていた場合、キー入力が
        そのプログラムに渡るか、a.sh に渡るかは不定

なような気がします (FreeBSD で試した限りでは、ですが)。

あとは
    - その端末を読み書きする権限があるかどうか (パーミッションの問題)
    - 誰もログインしていなかったらどうするか
    - 複数の端末があった場合は who などで調べるとしても、
        どの端末を選べばいいのか
    - (ウィンドウシステムがあるとして) たまたま選んだ端末がウィンドウの
        後ろに隠れていたら
とかいろいろ問題ありげなので、お勧めはしません。

No. 3151 # 68user 2003/03/20 (木) 02:03:07
「ネットワークプログラミングの基礎知識」の「リンク集・参考書籍」
      http://x68000.startshop.co.jp/~68user/net/link-book.html
にちょろっと追加しました。

# http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/org/link-book.html

No. 3152 # FF 2003/03/20 (木) 13:40:24
>>3150 68user
68userさんご返答ありがとうございます。

>ちょうどそのときその端末デバイスからの入力を受け付ける
>プログラム (シェルとか) が走っていた場合、キー入力が
>そのプログラムに渡るか、a.sh に渡るかは不定
最初のreadの受け取りで若干おかしな動作をする(シェルのプロ
ンプトが表示される)ようなので、cronを使わず常駐して時間に
なったら動作するようにしました。

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

No. 3153 # 68user 2003/03/23 (日) 18:50:44
内容あやしげ、そして需要がほとんどないと思われる
    「DNS クライアントを作ってみよう」
を書きました。
    http://x68000.startshop.co.jp/~68user/net/resolver-1.html
    http://x68000.startshop.co.jp/~68user/net/resolver-2.html
    http://x68000.startshop.co.jp/~68user/net/resolver-3.html

3連休つぶれちゃったよ。とほほ。

No. 3154 # kaki 2003/03/24 (月) 22:05:55
お世話になります。kakiです。

現在、LAN経由でクライアントから送られてくる(55msec毎)データを、
取得し、表示するHTTPサーバーを作成しています。

サーバー側で、クライアントと接続中にLANケーブルが抜けたのを
検出するのに、受信ループ中のping()で戻り値を判断して、
抜けているかどうかを判断しようとしていますが、
この方法は正攻法なのでしょうか?

また、その方法を試そうと思ったのですが、
accept()後のrecv()で受信待ちをしてしまっている為、
ケーブル断が検出できていません。
受信待ちをしないよう、socket()後にfcntl(s,F_SETFL,O_NONBLOCK)と
しているのですがrecv()でとまっているようです。
fcntl()の使い方が間違っているのでしょうか?

No. 3155 # 68user 2003/03/24 (月) 23:23:30
>>3154 kaki
> この方法は正攻法なのでしょうか?
正攻法とは何かという話になってしまいますが、TCP/IP の設計思想的には
誤りです。ケーブルが抜けようがルータが落ちようが、その部分が復旧したら
元通りに通信できるべきである、という考えだからです。

と言っても、タイムアウトを実装したいというケースもあるでしょうが、
わたしなら select したり non-blocking socket 使うと思います。ケーブル
断だけでなく、クライアント側のバグなどで いつまでたっても反応がない
場合なども対応できるからです。

サーバ側のケーブル断であれば
>>1301 rosegarden
という話もあったりしますが、通信できない原因はたくさん考えられるのに、
なぜサーバ側のケーブル断だけ特別扱いするのか、という話になるのではないかと。

> 受信待ちをしないよう、socket()後にfcntl(s,F_SETFL,O_NONBLOCK)と
> しているのですがrecv()でとまっているようです。
> fcntl()の使い方が間違っているのでしょうか?
non-blocking socket を使ったことがないのでわかりませんが、あってる
ような気がします。

多分これは関係ないでしょうけど、とりあえず
      int val = fcntl(s, F_GETFL, 0);
      fcntl(s, F_SETFL, val | O_NONBLOCK);
の方がいいでしょうね。

No. 3156 # ふくし 2003/03/26 (水) 10:11:45
質問です。Windows のDOS窓で
0x01〜0x06、0x10、0x15〜0x17 で水道管みたいな罫線が出たり、
0x12、0x1b〜0x1fでちっちゃな矢印が出ますが、
これらの文字は誰がどこで決めたのでしょうか。
おわかりでしたらご教示ください。

No. 3157 # 68user 2003/03/26 (水) 12:15:26
>>3156 ふくし
調べましたが、わかりませんでした。
      http://czyborra.com/charsets/codepages.html
を見るに、
> 0x12、0x1b〜0x1fでちっちゃな矢印
は CP437 あたりだと思いますが、なぜ 0x01 で 0xC9 な
水道管が出るのかはわかりません。

      http://www2d.biglobe.ne.jp/~msyk/cgi-bin/charcode/
で質問してみてはどうでしょうか。

No. 3158 # ふくし 2003/03/26 (水) 16:49:02
>>3157 68user
さん、ありがとうございます!
聞いてみます。
ちなみにDOS窓でjpとやると出てくる字から想像するに、
CP932ですよね。
usとやると437に切り替わりますが、そうすると出てくる字は
下で出てきたCP437そのままのようです。

No. 3159 # 68user 2003/03/26 (水) 19:59:17
たまに referer 見てみると、知らないところで突っ込まれて
たりするのでおもしろい。

http://dns.qmail.jp/lies.html
> コンテンツサーバとキャッシュサーバの違いを理解していな可能性が高いから。

うっ。勉強しよう。

No. 3160 # saki 2003/03/26 (水) 20:16:43
お世話になります。

gcc(全般)でコンパイルした実行ファイルには
チェックサムは付加されているのでしょうか?

No. 3161 # 68user 2003/03/26 (水) 20:34:52
>>3160 saki
> チェックサム
の意味がわかりません。

ファイル転送などで化けてしまったバイナリを実行しようと
すると、「チェックサムが一致しません」とか言ってくれる、
ような感じですか? もしそうなら、そういう機能は聞いたこと
ありません。

もしかして、そういうのが可能なコンパイラがあるのでしょうか。

No. 3162 # saki 2003/03/26 (水) 21:16:03
>>3161 68user
68userさん ご返答ありがとうございます。

そのチェックサムです。
ファイルをバイナリで開いて、そのファイルの全バイナリ値の合計のこと
だそうです。(すいません私もあまり詳しくないのです。)

あるファイルをコピー(ダウンロード)する時に、
コピー前のファイルとコピー後のファイルのチェックサムを
比較して、あっていればコピーが正常、あっていなければ異常と
するプログラムを作りたいと思っていまして、

> gcc(全般)でコンパイルした実行ファイルには
> チェックサムは付加されているのでしょうか?
とお聞きしたのは、ファイルそのものにチェックサムが付加されていれば
ファイルをオープンしてチェックサムの値を比べるだけで済むのかなぁと
思いまして・・・。

そういう機能がないのであれば、チェックサム自体をプログラムで
作ろうと思い、
ネットで調べたのですが簡単すぎるからなのか情報があまりありません。

参考になるサイトや本などあれば、勉強したいのですが、
ご存知のかたはいますでしょうか?

No. 3163 # 68user 2003/03/27 (木) 02:40:54
>>3162 saki
チェックしたいのがバイナリだけでいいのか、データファイルも
含むファイル一般なのかわかりませんが、前者であれば gzexe
      http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=gzexe&dir=jpman-5.0.0%2Fman
を使うのが簡単でしょう。gzexe は実行ファイルを圧縮しておく
ためのコマンドですが、実行時に gzip で展開するので、結果的に
gzip の誤り検出機能をそのまま利用できます。gzexe も 圧縮した
実行ファイルも、いずれも sh スクリプトですので、改造も簡単
でしょう。

後者であれば、単に gzip を使う手もありますし、あるいは
cksum や md5 などのコマンドを利用するのもいいでしょう。
    http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=cksum&dir=jpman-5.0.0%2Fman
    http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=md5&dir=jpman-5.0.0%2Fman
    http://www3.cds.ne.jp/~marimo/data/rfc/rfc1321-jp.txt

なお、誤り検出のアルゴリズムとしては、
> ファイルをバイナリで開いて、そのファイルの全バイナリ値の
> 合計のことだそうです。
は単純すぎます。言っちゃ悪いですが、この程度の認識しか持っていない
のであれば、cksum や md5 などのコマンドを利用した方がよいです。

No. 3164 # has 2003/03/27 (木) 03:19:01
>>3153 68user
なんかわざわざ書いてもらったようで恐縮です。
なんでもそうですが、自分が必要と思う部分を理解するには
その周りの事情全てを勉強しておけ、というのが世間の常識なので、
俺みたくよこしまな考えでDNS関連の本やらWEBやらRFCやらを
眺めている輩にはなかなかハードルが高かったのですが、
おかげでDNS関連の資料に目を通すのにも少し抵抗が和らぎました。

ところで例の話の続きなんですが、うちのlinux(kernel-2.4.18+
glibc-2.2.4)では、bind-8.3.4-RELのdig8.3で名前解決できません。
straceしてみると、どうもpoll()で受信を検出できていないようです。
glibcの名前解決も同様のコーディングだったので、poll()を試しに
select(),pselect()に変えてみましたがダメでした。
一方でbind9.1.3付属のdigでは名前解決ができました。
というわけで、そのコードをglibcに移植してしまえ、と思ったのですが、
iscライブラリというのが理解できず、結局移植はできていません。
一時はgethostbyname()内部を、正常に動作するdig9.1.3をsystem()で
呼び出し、その結果を拾ってくるように書き換えようと思いましたが、
どうやらgethostbyname()の利用頻度が低いようだったのでやめました。

今後についてはどうするか未定ですが、また調査しつつ改修しつつで
行きたいと思います。

No. 3165 # へにか [URL] 2003/03/27 (木) 08:10:23
かなりお久しぶりです。

>>3163 68user
実は私も、チェックサム=合計と思っていました。cksumのように
CRC演算するものもチェックサムと呼ばれるようになった経緯を何
かご存知でしたら、教えていただけませんか?

#少なくとも、CRC演算は合計(=サム)ではないです・・・

No. 3166 # 68user 2003/03/27 (木) 08:26:35
>>3165 へにか
> 実は私も、チェックサム=合計と思っていました。
広義のチェックサムと狭義のチェックサムがあって、狭義の
チェックサムは
      http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=cksum&dir=jpman-5.0.0%2Fman#sect2
で言うところのアルゴリズム 1 なのだろうとわたしは思って
います。このマニュアルではアルゴリズム 2・3 も「チェックサム」
と呼んでますね (それが一般的なのかどうかはわかりませんが)。

>>3163 68user
を書いたときは、わたしの中では「チェックサム=広義のチェックサム」
だったので、あのような書き方をしましたが、
> ファイルをバイナリで開いて、そのファイルの全バイナリ値の
> 合計のことだそうです。
は正しいですね。失礼しました。

No. 3167 # 68user 2003/03/27 (木) 08:30:37
>>3166 68user
> チェックサムは
> http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=cksum&dir=jpman-5.0.0%2Fman#sect2
> で言うところのアルゴリズム 1 なのだろう
あ、加算のたびに右ローテートって書いてあるので、アルゴリズム 1 も
「狭義のチェックサム」とは異なるんですね。

No. 3168 # saki 2003/03/27 (木) 11:54:48
68userさん、へにかさん
ご返答ありがとうございます。

大変、勉強になりました。
チェックサムといっても、いろいろなやり方があるのですね。

>cksum や md5 などのコマンドを利用した方がよいです。
組込のLinuxだったので上記のようなコマンドがなく、
自作しました。
全バイナリ値を合計して、16bit桁あふれしたら、
あふれた分を削除するという簡単なものです。
こんなのでもいいのかなと不安になりますが、
貴重な情報をありがとうございました。

No. 3169 # ふくし 2003/03/27 (木) 19:36:18
すいません、また質問です。

Windows で ActivePerl を使うと、
\r\n を読み込むと \n を読み込んだと思い込み、
\n を書き出すと \r\n を書き出そうとする習性があります。

これを停止するために
  binmode STDIN;
  binmode STDOUT;
とするのですが、こうすると
  while (<>) {
      ...
  }
で読み込もうとするときに、
  C:\> perl スクリプト名 < ファイル
だとうまくいくのですが、
  C:\> perl スクリプト名 ファイル
だとうまくいきません。

つまり、<> は引数でファイル名を渡されると、
STDIN 以外のファイルハンドルからファイルを読んでいるようなのですが、
このファイルハンドル名は分かるでしょうか?

ActivePerl を Windows 2000 以降で使うと、
スクリプト名に .pl という拡張子を付けると
  C:\> スクリプト名
でいきなり実行できて便利なのですが、
このスクリプトの中で <> を使うと、
  C:\> スクリプト名 ファイル名
だとうまくいくのですが、
  C:\> スクリプト名 < ファイル名
だと '<' を第1の引数と思い込んでうまくありません。

動かそうとしてるのはしょうもないファイルダンプツールです。

# fdump.pl

#$file = shift;

#open IN, $file;
#binmode IN;
binmode STDIN;
binmode STDOUT;

#$/ = "\r\n";

while (<>) { # 1行ずつ読み込み
    $line1 = $line2 = $line3 = ""; # 作業域を初期化
    @char = split //; # 1文字ずつ分解
    foreach $char (@char) { # 1文字ずつ処理
        $line1 .= $char; # 文字をそのまま $line1 にくっつける
        $hex = unpack "H2", $char; # $charを16進数値に変換して$hexに格納
        ($hex1, $hex2) = split //, $hex; # $hexを1文字ずつ分解して$hex1、$hex2に格納
        $line2 .= $hex1; # 16進数の前半を$line2にくっつける
        $line3 .= $hex2; # 16進数の後半を$line3にくっつける
    }
    print $line1; # $line1を出力する(改行はもともとついている)
    print "$line2\r\n"; # $line2+改行を出力する
    print "$line3\r\n"; # $line2+改行を出力する
}

No. 3170 # 68user 2003/03/27 (木) 21:09:17
>>3164 has
> straceしてみると、どうもpoll()で受信を検出できていないようです。
ほほう、glibc の問題かカーネルの問題かはわかりませんが、今どきの
Linux でそんな問題にぶちあたるとは運がいいですね。

ここは一気に UDP・IP スタックを解析して、Linus にパッチを送付する
まで頑張ってください。しかし粘りますねぇ (笑)

# NIC を変えたらすんなり直ったりして。


>>3169 ふくし
% grep '<>' /usr/src/contrib/perl5/*
/usr/src/contrib/perl5/toke.c: /* turn <> into <ARGV> */

となったので、それを手がかりに調べてみると、perl(1) に
以下のように書いてありました。

      次のループは、

                while (<>) {
                          ... # 各行に対するコード
                }

      以下の疑似コードと同等になります。

                unshift(@ARGV, '-') if $#ARGV < $[;
                while ($ARGV = shift) {
                          open(ARGV, $ARGV);
                          while (<ARGV>) {
                                    ... # 各行に対するコード
                          }
                }

本当に binmode ARGV でうまくいくのかどうかは試していません。

他の調べ方としては print %main::; でシンボルテーブルを表示し、
片っ端から試してみる、とかですかね。

No. 3171 # ふくし 2003/03/27 (木) 21:53:55
<<3170
さん、

ありがとうございます。
結果として、

while (<ARGV>) {
  ...
}

でも

while (<>) {
  ...
}

同様に動くので、<>のファイルハンドルがARGVであることに
間違いはないようですが、

binmode ARGV;

は効かないようです!? へんだなぁ、、。

No. 3172 # へにか 2003/03/27 (木) 22:38:42
>>3166 68user
なるほど、狭義と広義の差が有るんですね。僕にとっては、
新たな知識です。どうも教えていただいて、ありがとうござ
います。

20年程前のパソコン雑誌に載っていた機械語プログラムには、
横一列の合計が書いてあったのを懐かしんで、こんな質問を
してしまいました。確か最初は何も無く、次に横一列、次に
縦一列と横一列、その次にそれ+CRC演算が出てきたという
記憶があります。確か一列はどちらも1octet x 16個で、CRC
は256octet毎に1octetでした。

僕も、その後GoogleでCRCもチェックサムと呼ぶようになっ
た経緯を調べたのですが、経緯自体は、なかなか見つからな
いですね。
もし、どなたか見つけたら、教えていただければ嬉しいです。

蛇足ですが、単純に足すだけだと間違いが見つかりにくいので、
> 加算のたびに右ローテート
のような工夫がされているんでしょうね(推測です)。

No. 3173 # 68user 2003/04/03 (木) 20:37:47
>>3172 へにか
> なるほど、狭義と広義の差が有るんですね。僕にとっては、
> 新たな知識です。
わたしが世の中の「チェックサム」という用語の使われ方を見る限り、
広義のチェックサムと狭義のチェックサムがあるのでは、と思った
だけですので、誤解のなきよう。

例えば IP・UDP・TCP のチェックサムは「1の補数和の 1の補数」で
狭義のチェックサムだと思いますが、一方 java.utik.zip.CRC32
    http://java.sun.com/j2se/1.3/ja/docs/ja/api/java/util/zip/CRC32.html
は Checksum インタフェースを implements していますが、この「Checksum」
は広義のチェックサムかなぁと。…ってなんか苦しい例だなぁ。

      http://www.onelook.com/?w=checksum&ls=a#all_com
を見ても、わたしの思う「狭義のチェックサム」しか載ってないよう
ですし、やっぱりわたしの認識が変なのですかねぇ。

ちなみに
      http://www.jisc.go.jp/index.html
で JIS を調べてみましたが、「チェックサム」の定義は見付けられませんでした。

>>has
あの後、寝てしまいました…。

No. 3174 # has 2003/04/04 (金) 02:27:37
時間のあるときに、遊びつつ飲みつつちょっとずつですが、
linux kernel-2.4.18-24.7.xにてpoll()を追っかけてます。
相当飛ばし読みでやっとこ__pollwait()。
けど先が見えません…。

@68user
あいかわらずですな。またの機会に。

No. 3175 # へにか [URL] 2003/04/04 (金) 07:43:58
>>3173 68user
> 誤解のなきよう。
了解しました。

色々調べていただいて、ありがとうございます。
http://www.onelook.com/?w=checksum&ls=a#all_com
のリンク先、これから追いかけてみます。

そこで、早速二箇所追いかけたところ、面白い記述を見つけました。

http://www.wikipedia.org/wiki/Checksum
> Note: The term 'checksum' is also often used incorrectly to mean a CRC.

http://www.wikipedia.org/wiki/CRC
>CRC's are often referred to as "checksums," but such
> designations are not accurate since, technically,
> a checksum is calculated through addition, not division.

incorrectlyを始め、思わずbabylonで単語の意味を調べてしまいました。;)
とにかく歴史上などの何らかの事由で捻じ曲がったのではないかと推測
していますが、なんとかその確証が得られるよう、調べてみます。
運良く見つけたら、連絡します。見つけられなかったら、次回の(他の
ネタを含む)書き込み時に、その旨お伝えいたします。

#教えて頂いたリンク先、情報の宝庫ですね。ありがとうございます。

No. 3176 # へにか [URL] 2003/04/04 (金) 07:55:14
#連続ですみません。

>>3173 68user
>やっぱりわたしの認識が変なのですかねぇ。
少なくとも、cksumが存在する以上、(繰り返しになりますが)何らかの
事由があったのでしょうから、変と思わなくても良いのではないかと思
います。といいますか、その事由に依存すると思いますので、変かどう
かという問題ではないかもしれません。

#尊敬する68userさんでも困難な問題なので、わたくしごときが調べ
#きれるかどうか自信ないですが、挑戦してみます。

No. 3177 # ある厨 2003/04/05 (土) 00:56:50
ども。以前erro.cgiの件でお世話になった者ですが、
どうしても解決できない事が有り、質問させてください。

Web上にてユーザーがアカウントを自動登録できるようにしたのですが
登録したユーザーのquotaをcronで設定したく下記のようにしてみました。
つか見つけてきました。
*/5 * * * * edquota -p foo `awk -F":" '$3 > 1000 {print $1}' /etc/passwd`

idが1000以上のユーザーに予め設けたユーザーfooのquotaを例えばsoft 20000
と同じに設定すると言うものですが、これをcronで走らせても
なぜか登録ユーザーのquotaには反映されません。
しかし、直接#rootで上記コマンドを打つと反映されます。

で、コマンドが長すぎるのかとも思い、
下記のように二つに分けてcronで走らせてもだめでした。
勿論、直接コマンドではOKです。

*/5 * * * * awk -F":" '$3 > 1000 {print $1}' /etc/passwd > member_id.txt
*/6 * * * * edquota -p foo `cat /root/member_id.txt`

二つに分けた場合ではmember_id.txtは作成されているから
edquota -p info `cat /root/member_id.txt`がcronで作動してない
ということになりますが、理由がわかりません。

長文で申し訳ありませんがご教授お願いします。

No. 3178 # ある厨 2003/04/05 (土) 01:11:02
あ!
edquota -p info `cat /root/member_id.txt`がcronで作動してないは
edquota -p foo `cat /root/member_id.txt`がcronで作動してないです。

No. 3179 # ある厨 2003/04/05 (土) 02:11:59
すみません。自己解決しました。
cronからメールが来てました。
/bin/sh: edquota: command not found

/usr/sbin/edquotanにしたら解決しました。
板汚してすみませんでした。
で、ついでと言っては何ですが、、、

suEXECを使ったCGIはその所有者の権限で動くわけですが、
その所有者には/bin/falseとしてシェルは利用出来ないようにしています。
でも、コマンドが使える(例えばtelnet.cgi)CGIではcat /etc/passwd
等と出来てしまいます。
これは誰の権限で動いているのでしょうか。
OSはLinuxで鯖はApacheです。

No. 3180 # 68user 2003/04/05 (土) 16:42:15
>>3179 ある厨
> その所有者には/bin/falseとしてシェルは利用出来ないようにしています。
/etc/passwd に書くログインシェルはあくまで
    「ログインするときに起動するシェル」
です。

ログインとは telnet や rlogin や ssh 経由でログインすることを指します。
よって、cron から起動したり、setuid(2) して exec(3) する場合は関係
ありません。

web サーバは nobody や www 権限で動かされることが多いでしょうが、
/etc/passwd で
      nobody:*:65534:65534:Unprivileged user:/nonexistent:/sbin/nologin
      www:*:80:80:World Wide Web Owner:/nonexistent:/sbin/nologin
などと /sbin/nologin となっているのは、単にその権限でログインさせない
という設定になっているだけで、その権限でのプロセスの実行を制限している
わけではありません。


>>3176 へにか
(狭義の) checksum や parity や CRC や hash はデータ誤りを検出するための
一方式だと思うのですが、「データ誤りを検出するためのもの」一般は英語で
何て言うんでしょうね?

      http://www.wikipedia.org/wiki/Checksum
にあるように「integrity-protection measure」としか言いようがないなら、
「データ誤りを検出するためのもの」という意味で「checksum」という用語を
使ってもいいんじゃないかなぁ、となんとなく思っております。

No. 3181 # ある厨 2003/04/05 (土) 20:10:43
>>3180 68user
なるほど、ただ単にログインできないと言うことであって
実行制限ではないと言うことですか。
勉強になりました。

#やぱり独学では限度があるにゃぁ。

No. 3182 # へにか 2003/04/05 (土) 21:31:38
>>3180 68user
>「データ誤りを検出するためのもの」一般は英語で何て言うんでしょうね?
Error Detecting Code (誤り検出符合)です。

因みに、CRCは、なんと、1bit-errorまでは訂正できてしまいます。
即ち、Error Correcting Code (誤り訂正符合)でもあるところが、parityやchecksumとは違うところで、面白いです。
#訂正方法は遠い昔に忘れました・・・
#hashは方式を知らないので、訂正できるのかどうか分からないです。

#今日本屋で調べても、歴史的なことは見つかりませんでした。A^^;

http://www.wikipedia.org/ は現在crashしているみたいです。

No. 3183 # NPK [E-mail] 2003/04/10 (木) 22:15:27
始めまして。

なんとなくXULの練習でUnixの部屋のMozilla用検索ツールバーを作ってみました
迷惑になるかもしれないので(それと家のサーバーが落ちてるからというのもある)
許可があるまで配布はしてないのですが配布してもよろしいでしょうか?

# 家の鯖と外の鯖両方落ちてる・・・
# なぜ家に居ないときに落ちる・・・

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

No. 3184 # 68user 2003/04/12 (土) 14:30:13
>>3183 NPK
> 配布してもよろしいでしょうか?
はい、構いません。ぜひお願いします。

No. 3185 # ふくし 2003/04/12 (土) 15:25:29
ASCIIでプログラミングして
ISO-2022-JPを出力するプログラムを書いていますが
(なんのために

#! /usr/local/bin/perl -w
print "\e\$B\$3\$s\$K\$A\$O\n";

だとうまくいくけど、

#! /usr/local/bin/perl -w
print "\e\Q$B$3$s$K$A$O\E\n";

だとダメですね。
\Q〜\Eより先に変数展開が行われるみたいです。
ヘンな感じ、、。

No. 3186 # NPK [URL] [E-mail] 2003/04/12 (土) 16:07:52
>>3184 68user

まだDNSが無いのがちょっとどうかと思いますが(^^;
とりあえず置いてみました。

# 古いdyndnsのパスワード忘れたものでそのうちとろうと思ってとりあえずしばらく放置です(笑)

No. 3187 # Phantom 2003/04/13 (日) 23:38:33
はじめまして。unix初心者です。

定期的にhtmlをftpでファイルをアップロードしたいと思いました。それで、cronで実現しようと考えcrontabで編集したのですが上手く動いてくれません。コマンドが間違っているかと思い、console上で実際にやってみたところ普通に動きました。どうしてcronでは上手く動いてくれないのでしょうか?

以下の様にやっています。
10 0 * * * ftp -n < /home/hogehoge/ftp.sh

ftp.shの中身
open ftp-server
user hogehoge passwd
ascii
prompt
cd data/
put index.html
quit

No. 3188 # ゆきち(もじら組) [URL] 2003/04/14 (月) 14:02:24
もじら組のゆきちといいます。いつも、こちらの記事は参考にさせていただいています。

>NPKさん
下記で紹介されているツールバーですが、「新もじら瓦版」というニュースサイト(?)があるのですが、そこでツールバーの報道を行なっても良いでしょうか。
ぜひとも、紹介させていただきたいのですが。

No. 3189 # ゆきち(もじら組) [URL] 2003/04/14 (月) 14:07:18
追記
今、InfoseekとX68Kの両方を利用してみたのですが、「新しいタブで開く」(Infoseek)「新しいWindow」(X68K)で開くを利用すると、最大化(全画面表示)になって、かつ、右にスクロールバーが出ない状態です。最大化を解くと、小さくなりますが、スクロールバーが出ませんね。1.4αです。

こんなところですいませんが、とりあえず、利用報告です。

No. 3190 # NPK [URL] 2003/04/14 (月) 19:27:54
ここで会話することじゃないと思いますが(^^;
(68userさんすいません

>>3188 ゆきち(もじら組)
紹介に関しては問題ないです。
鯖が貧弱なので落ちたらごめんなさい(笑)

開発には1.4α使ってるんですが家ではそんなバグは確認されてませんね・・・
もしかしたらほかのXULアプリと衝突を起こしてるのかもしれません。
そのうち調べてみます。

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

No. 3191 # ゆきち(もじら組) 2003/04/15 (火) 00:42:11
ありがとうございます。今、時間がとれないですが、紹介してみようと思います。ありがとうございました。

#管理人さん、すいませんでした。

No. 3192 # 68user 2003/04/15 (火) 06:48:00
>>3185 ふくし
> \Q〜\Eより先に変数展開が行われるみたいです。
プログラミング Perl 第 3版では、その辺の評価順序は明示
されていないみたいですね。

>>3187 Phantom
普通、/var/mail/$USER などに実行結果がメールで届くはずです。
そこに何か情報があるかもしれません。

>>3189 ゆきち(もじら組)
FreeBSD 4.7-RELEASE + mozilla-1.4b (2003041308) ですが、再現
しませんでした。ただ、「新しいタブで開く」としても、(タブでなく)
新しいウィンドウが開いてしまいます。

infoseek の方ですが、アプリとしての感想を述べさせていただくと、
    - うちの常用のサイズではウィンドウの幅が足らず、「新しいタブで開く」が
        切れる (ウィンドウサイズを広げれば表示される)
      「Search by Dictionary」と単語入力フォームが広すぎるのかも。
    -「Search」で検索じゃなくて、「国語」「和英」「英和」それぞれを押せば
        検索するといいかも (そしたら「Search」は不要)
    - 「和英」と「英和」はひとつにまとめて、フォームの内容が ASCII なら
        英和、日本語なら和英、だといいかも。
    - てなところを設定で変更できたりするとうれしいかも。
    - 「英→日」はとても便利ですねぇ。
    - 入力した単語の履歴が残って、さらに補完してくれたりすると素晴らしい。
てな感じです。

勉強用にとりあえず作ってみただけなのか、あるいは継続的に
開発されるのかわかりませんが、もし後者であればご検討ください。

>>3190 NPK
> ここで会話することじゃないと思いますが(^^;
全く問題ないです。

>>has
しばし待たれよ。

No. 3193 # ふくし 2003/04/15 (火) 17:14:41
ずっと前に、

while (<>) {
  ...
}

のファイルハンドル ARGV に binmode が適用されないので、

while (<>) {
  ...
}

における ActivePerl の \r\n => \n 置換を抑制できない、
という話をしましたが、5.6 以降では binmode のかわりに

use open IN=>"raw:";

だと動作するようです。PerlIOってやつですね。

No. 3194 # ふくし 2003/04/15 (火) 17:16:48
>>3193 ふくし

自己レスれす。

use open IN=>":raw";

の間違いでした。

No. 3195 # /tk 2003/04/17 (木) 11:05:15
>>3185 ふくし

perldoc perlre
> You cannot include a literal "$" or "@" within a "\Q" sequence. An
> unescaped "$" or "@" interpolates the corresponding variable, while
> escaping will cause the literal string "\$" to be matched. You'll need
> to write something like "m/\Quser\E\@\Qhost/".

>>3192 68user
> その辺の評価順序
「詳説 正規表現」のP245とか…

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