68userさん、さきほどは説明不足ですみませんでした。 エラー内容と環境を書いておきます。 よろしくご教授お願いします。 gcc -c share_test.cc ar cr libtestshare.so share_test.o ranlib libtestshare.so CC test_gcc.cc -L. -ltestshare test_gcc.ccは読み込んだライブラリ内の関数を呼び出しているだけです。 ###################### エラー内容 ###################### 未定義の 最初に参照している シンボル ファイル ShareTest::get(void) test_gcc.o __builtin_delete ./libtestshare.a(share_test.o) __rtti_user ./libtestshare.a(share_test.o) ShareTest::~ShareTest(void) test_gcc.o ShareTest::ShareTest(void) test_gcc.o ld: 重大なエラー: シンボル参照エラー。 a.out に書き込まれる出力はありません ###################### 使用環境 ###################### Kernel Architecture is sun4u OS Name is SunOS OS Version is 5.6 OS Distribution is Japanese Solaris 2.6 HW:2 s297s_hw2smccDesktop_09b SPARC Kernel Version is SunOS Release 5.6 Version Generic_105181-17 [UNIX(R) System V Release 4.0] |
> gcc -c share_test.cc > CC test_gcc.cc -L. -ltestshare ああ、CC って typo かと思っていたら、C++ なのか…。 # C++ は完璧に忘れたなぁ。Hello world さえ作れないです。 おそらく gcc と CC でクラス/メソッドのシンボル名の 命名規則が違うのが理由だとは思うのですが、意図的に gcc と Sun の CC を混在して使っているのですか? gcc (g++) か CC に統一できない理由があるので、調査 しているということですよね? もしそうなら、すいませんがわかりません。gcc の オプションで指定できるのかもしれませんが…。 > なんか"<"、">"の部分だけが読み込めてない感じです。 もしかして CGI として動かして HTML を吐いていませんか? んでもって < > & を (< > & に変換せず) その まま出力していたりしませんか? 根拠は以下の通り。 1. received の <〜> も出力されていない for ; Wed, 15 Nov 2000 17:26:03 +0900 (JST) for ; Wed, 15 Nov 2000 17:20:05 +0900 2. でも Message-ID は出力されている。 Message-ID: <000501c04ede$6249e4d0$5400a8c0@kimura> タグは英文字から始まる。数字が先頭にくることはない。 > が、一般的 or perlの方が効率的なのでしょうか? 僕なら間違いなく perl でやりますが、まぁそれはお好きな方で。 ちなみに sh からだと set `perl -e 'print scalar(localtime(time()-60*60*24))."\n"'` です。 |
> % date -v-1d > で1日前の日付が得られます。ただし、Solaris などの > date には -v オプションはないので、sh でやるなら > perl などを呼び出すのがいいでしょう。 このオプションは知りませんでした勉強になりました。 > Solaris環境なのでシェルで作成するのはやめます。 あきらめるのは早いです。 #!/bin/sh LANG=C set `date` year=$6 mon=$2 date=$3 if [ `expr $year % 4` = "0" ] ; then is_leap="YES" fi if [ `expr $year % 100` = "0" ] ; then is_leap="NO" fi if [ `expr $year % 400` = "0" ] ; then is_leap="YES" fi date=`expr $date - 1` if [ "$date" = "0" ] then case $mon in Jan) mon="Dec" date=31 ;; Feb) mon="Jan" date=31 ;; Mar) mon='Feb' if [ "$is_leap" = "YES" ]; then date=29 else date=28 fi ;; Apr) mon="Mar" date=31 ;; # 以下略 *) ;; esac fi echo The yesterday is $mon $date. なんていう面白味も芸もないスクリプトなら Solaris でも動くんじゃないかと 思いますよ。 もっとも、 > 作成したいものは、lastcommで前日のログ履歴を出し、管理者宛にメールを > 送るというものなのですが早速つまずいてしまいました。 この用途なら、日付の計算は不要で前々日分までの lastcomm のログの バックアップをとっておいて、前日分との差分を diff でとるという方法もあります。 (ただし、lastcomm のログなので、GB 単位になってもおかしくないのですが。) FreeBSD なんかのセキュリティチェックは全部前日分までのバックアップと 本日分のログの差分抽出でやっていますね。 # また長くなりすみません。 |
> あきらめるのは早いです。 うーん、ごもっとも。恥ずかしながらこういう 方法には全く気づきませんでした。 |
68userさん、ご教授ありがとうございました。 gccのオプション調べてみます。 |
こんにちは、はぴおです。 68userさんレスありがとうございました。 非常に恥ずかしい話ですが、68userさんのおっしゃる通りです。 何で気が付かなかったんだろうか??? ありがとうございました! HTTP、SMTP、POP3ができたので、今度はFTPをやろうかと 思います。 |
お世話になります。 実は今、C言語でCGIの勉強をしているのですけど、 CGIのデバッグってどうやるんでしょうか? もしかして、動作確認はいちいちブラウザで確認するしかないのですか? つ、つらい‥ なにか、効率的なデバッグ方法を知っていらしたら 教えて下さい。お願いします。 |
> もしかして、動作確認はいちいちブラウザで確認するしか > ないのですか? まさか :-) CGI というのはインタフェースです。 ブラウザからの情報を、環境変数と標準入力経由で プログラムに引き渡すインタフェース。それが CGI。 だから、 % env REQUEST_METHOD=GET QUERY_STRING='hoge=1&fuga=2' ./foo.cgi とか % set content='number=123&str=%21%22%23' % echo -n $content | env REQUEST_METHOD=POST CONTENT_LENGTH=`echo -n $content|wc -c` ./foo.cgi とかとか、 #ifdef DEBUG #define INPUTFILE_FOR_DEBUG "debug.txt" { char tmp[128]; struct stat sb; setenv("REQUEST_METHOD", "POST", 1); stat(INPUTFILE_FOR_DEBUG, &sb); sprintf(tmp, "%d", sb->st_size); setenv("CONTENT_LENGTH",tmp , 1); freopen(INPUTFILE_FOR_DEBUG, "r", stdin); /* この使い方合ってるっけなぁ… */ } #endif とかとかとか。 |
こんにちは。 掲示板のファイルに書きこむ部分で、 「web と CGI のひみつ」の「掲示板を作ろう (2)」の最後にある テンポラリファイルに書き込んでからrenameする方法いいなと思ったのですが、 これだとrenameするときに衝突する可能性ありますよね? http://www.wakusei.ne.jp/twn/wwwlng.cgi?print+200003/00030031.txt ここにあるcheck-lockスクリプト(いつもありがたく使わせていただいてます m(_ _)m ) でやってみようと思うのですが、うまくrename時の衝突を回避する方法があればご教授ください。 |
http://x68000.startshop.co.jp/~68user/net/sample/echo-server-1.c このコードのバグを見つけました。 コンパイルして動かすとacceptで失敗するのでこっちの設定が 悪いんだろうと思ってFreeBSD関連のメーリングリストを 検索していたら原因がわかりました。 connected_socket = accept(listening_socket.... の上に len = sizeof( sin ); が必要です。 バグの理由は http://home.jp.FreeBSD.ORG/cgi-bin/showmail/FreeBSD-users-jp/43141 です。 |
はじめまして。 No.1389の指摘のついでですが len = sizeof(peer_sin); は、いらなんじゃないですか? バグの理由でも書かれてるとおり acceptの第3引数は、入出力両用ですので 帰ってきた値をそのまま使うのが正しいと思うのですけど。 |
> len = sizeof( sin ); > が必要です。 なるほど、確かに FreeBSD 4.2-BETA で動かすと accept に 失敗していました。これまではたまたま動いていたわけですね。 修正しておきます。ありがとうございます。 > len = sizeof(peer_sin); > は、いらなんじゃないですか? こっちの getpeername のは必要だと思います。以下 getpeername(2) より。 Getpeername() returns the name of the peer connected to socket s. The namelen parameter should be initialized to indicate the amount of space pointed to by name. On return it contains the actual size of the name returned (in bytes). The name is truncated if the buffer provided is too small. > これだとrenameするときに衝突する可能性ありますよね? えっと、あの例では rename は使っていません。あの後 排他処理に ついて書くつもりでしたが、時間がなくて全く手を付けていません。 > うまくrename時の衝突を回避する方法があればご教授ください。 もし rename でやるとしても、それ以前に複数のプロセスが tmp_file へ同時に出力しようとする可能性があるので、あの 部分全体を排他する必要があります。 で、方法ですが、適当なロックファイルを用意して排他処理を 行えばよいです。flock でも symlink でも mkdir でも rename でも 何を使っても構いません。 |
返事どうもありがとうです。 > えっと、あの例では rename は使っていません。 よく見てませんでした。申し訳ないです。。 > もし rename でやるとしても、それ以前に複数のプロセスが > tmp_file へ同時に出力しようとする可能性があるので、あの > 部分全体を排他する必要があります。 なるほど。そこで、お教えいただいた通りにちょっと改造してみました。 # 毎回違う名前で作る $tmp_file = 'bbs'.$$.'.tmp'; open(TMP_OUT,"> $tmp_file"); print TMP_OUT "発言者: $from<BR>\n"; print TMP_OUT "$now_date $host<BR>\n"; print TMP_OUT "$message<HR>\n"; open(IN,"$data_file"); while (<IN>){ print TMP_OUT $_; } close(IN); close(TMP_OUT); # tmp_file の内容を $data_file にコピーするだけ #open(TMP_IN,"tmp_file"); #open(OUT,"> $data_file"); #while (<TMP_IN>){ # print OUT $_; #} #close(TMP_IN); #close(OUT); # コピーのかわりに、$data_fileにrename # その前に排他処理。 $lock_file = 'bbs.lock'; touch($lock_file); open(IN,"$lock_file"); flock(IN, 2); rename($tmp_file, $data_file); close(IN); unlink($lock_file); # 必要ない?? これで完璧ですか?? 読みこみ専用でオープンしてるのにflock()のオペレーションが「2」って どうなんですかね。ちゃんと書きこみモードでオープンしなきゃだめですか?? 改善点があればご教授くださいませ。 長文すみませんでした。 |
>> len = sizeof(peer_sin); >> は、いらなんじゃないですか? >こっちの getpeername のは必要だと思います。以下 getpeername(2) より。 失礼しましたぁ。。勘違いです。 きっちりしたサイズを指定しなくてもよかったんですね。 小さい場合は切り詰めるって仕様も最初は意味不明でしたが、 よく考えると最低でもアドレスファリは所得できそうなので有用ですね♪ |
いつもすいません、ふくしです。 LDAP の使い方でこんなことができるかどうかどなたか相談に乗ってください。 Microsoft Exchange Server のアドレス帳で、集団のアドレス (営業部 <markettng@nantoka.org とか)があって、 そこに送るとたくさんのひとに (yamada.tarou@nantoka.org、satou.hanako@nantoka.net、、)に 行くようになっているとき、組織名を渡してこの構成員一覧を返す アプリケーションを作ろうと思っています。 Exchange は LDAP を受け付けるときいたので、 Perl に Net::LDAP をインストールして、 サンプルをいじって使ってみたのですが、 marketting というメール アドレスが「ある」ことはわかるところまで いったのですが、その内容まではわかりません。 ご存じの方がいらっしゃいましたら、よろしくお願いします。 |
ちょっと前にHTTPのセパレータの話がありましたが、 どうも最近の携帯の中には、\r\nにしか対応していないものもあるようで、 友人からの「携帯からアクセスできない」との苦情に対応方法がわからず、 「まさか」と思いつつもこれまで\n\nとしてきたセパレータに\r\nを加えてみたところ、 ちゃんと読んでくれるようになりました。 これはうちのサーバの設定の仕方がおかしいんでしょうか。 (普通は\r\nに勝手に変換してくれるものなんですか?) それともCGIの方で正式な\r\nに対応すべきなんでしょうか。 |
どうもこんにちは、 Winsock初心者のYOUと申します。 ソフトバンクの、「Winsock2.0プログラミング」という本を 買ってきたのですが、手始めに、サンプルのCH02->Hostinfo をビルドしようとすると、以下のようなエラーが出てしまいました。 プロジェクトへのリンク等には、特に何も指定していません。 どうすれば、解決出来るのでしょうか。 --------------------構成: Win - Win32 Debug-------------------- リンク中... Hostinfo.obj : error LNK2001: 外部シンボル "_WSACleanup@0" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_WSAStartup@8" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_inet_ntoa@4" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_WSAGetLastError@0" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_gethostbyaddr@12" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_gethostbyname@4" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_inet_addr@4" は未解決です LIBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です .\Debug/Win.exe : fatal error LNK1120: 外部参照 8 が未解決です。 link.exe の実行エラー Win.exe - エラー 9、警告 0 よろしくお願いします。 |
はじめまして。Elmoです。 telnetでポート80を指定して、”GET”と”Host:”を実行するシェルスクリプト(bash)を作成したいのですが、どうやって、シェルからGETとHost:を実行すればいいのかわかりません。ちなみに、”echo”とパイプを使用してみましたが出来ませんでした。 わかる方、教えて下さい!! |
has 殿へ。11/25 (土) に行けたら行きます。仕事次第。 では手短に。 > (普通は\r\nに勝手に変換してくれるものなんですか?) apache だと変換してくれないですね。 > それともCGIの方で正式な\r\nに対応すべきなんでしょうか。 です。でもうちではやってません。いけませんなぁ。 > LDAP の使い方でこんなことができるかどうかど LDAP は勉強しようとしたことはありますが、どうやっても LDAP サーバをあげられず断念しましたので、わかりません。 でも、get_values とかでダメですかねぇ。 > .\Debug/Win.exe : fatal error LNK1120: 外部参照 8 が未解決です。 僕は Windows の開発環境を持っていないので、わかる方に おまかせします。 > 読みこみ専用でオープンしてるのにflock()のオペレーションが「2」って > どうなんですかね。ちゃんと書きこみモードでオープンしなきゃだめですか?? 試してませんが、心配ならば open(IN,"> $lock_file") と すればいいでしょう。 あと、ロックを開始する場所は open(TMP_OUT,"> $tmp_file"); です。rename の部分だけロックすると、ファイルは壊れませんが 同時に発言しようとしたとき、一方の発言が反映されないです。 それから、失敗する可能性のある場所では、エラーチェックを 必ずしましょう。例えば、OS によってファイルを同時にオープン できる数というのは決まっているので、それを越える open は 失敗します。もし open(IN,"$lock_file"); が失敗したらその後の flock も無意味になり、ロックが働きません。 > telnetでポート80を指定して、”GET”と”Host:”を実行する > シェルスクリプト(bash)を作成したいのですが (sleep 3; echo "GET /index.html HTTP/1.0"; echo "Host: foo.bar.com") | telnet foo.bar.com 80 てな感じで。 |
改行が足りてない。 (sleep 3; echo "GET /index.html HTTP/1.0"; echo "Host: foo.bar.com"; echo ) \ | telnet foo.bar.com 80 でした。 |
はじめまして。 プログラミングは超初心者で、ここで質問して回答してもらえるのかどうか もわからないのですが、もし答えていただけるならば教えてください。 HTMLにJPGやGIFを貼り付けているのですが、マウス右クリックで 「画像を名前をつけて保存」ってできてしまいますよね。これを保存できな くする方法ってあるんですか?拡張子を変える、とか。 よろしくお願いします。 |
> ちかさま。 表示してる時点で、保存もできます。。 保存しにくくするのなら、JavaScriptとかで、できそうだけど。 |
はじめましてフ−ミンと申します。 CGIを初めたばかりで分からない事があるので質問させて下さい。 おそらくものすごく初歩的な事だと思うので悪いのですが…。 今「何とか度鑑定」みたいなのをPerlで作っているのですが、 色々なこういうサイトを参考にしても、質問が多くなってくると、 必然的に画面をスクロールしなくてはなりませんよね。 デザイン的にどうかと思っているのです。 そこで、質問を数ページに分ける方法を教えて頂きたいのです。 VALUE値を次のページまで持ち越すには多分、 INPUT TYPE=hiddenとかが関係しているのは分かるのですが、 具体的にどうしたらいいのか全く分からないのです。 こんな初心者ですみません。ヒント程度でもお答え頂ければ 幸いです。それでは失礼いたします。 |
yamamaさん、どうもありがとうございます。 printScreenされちゃうと終わりですよね(^ ^; JavaScript ですか。勉強してみます。 |
>YOUさん #include <windows.h>とか #include <winsock.h>とか ヘッダファイルをincludeしてますか? |
> 今「何とか度鑑定」みたいなのをPerlで作っているのですが、 他の BBS とマルチポストしているのなら、その旨書くべき だろうと僕は思います。答えを得たいために無節操にいろんな ところで質問しまくるのは、回答してくれる人に失礼でしょう。 > マウス右クリックで「画像を名前をつけて保存」ってできて > しまいますよね。 いろいろと保存しにくくする方法はありますが、 http://www06.u-page.so-net.ne.jp/wa2/mugi/hp/jsindex.htm ある程度知ってる人に対しては無力です。個人的には、 コピーしてほしくないものはインターネット上に置かない のが一番だと思っています。 |
>68userさん まったくもってその通りです。 あせって、つい自分の事しか考えられなくなっていました。 反省しています。どうもすみませんでした。 |
どうもこんにちわ。 最近Qtに手を出し始めたいえろーばっくすです。 ところが早速わからないことが出てきてしまって・・・・ QStringクラスのtoInt( bool *ok=0, int base=10 )関数 の使いかたをご教授ください。 QLineEditからtext()関数でQStringに読み込んだ値を intに変換したいんですが、読み込んだ値を表示させても 必ず0にしかならなくて困ってます。 どなたかわかるかたいらしたらお願いします。 |
> 読みこみ専用でオープンしてるのにflock()のオペレーションが「2」って どうなんですかね。ちゃんと書きこみモードでオープンしなきゃだめですか?? 読み込みモードで「2」だと、Solarisではflockが利かないようです。「1」なら大丈夫です。わたしのページですが、Perlの排他制御についてまとめてあります。 http://homepage1.nifty.com/glass/tom_neko/web/web_04.html |
@YOUさん もう解決してらっしゃるかもしれませんが・・・ wsock32.lib(もしくはws2_32.lib)をリンクしてみてください。 もうひとつ、WinMainが未解決だって言われてるのは、 プロジェクトをコンソールアプリでつくって ソースがwin32アプリのものだからじゃないでしょうか。 win32アプリでプロジェクトをつくり直してみてください。 |
お答え頂いてとてもありがとうございます。 さっそく (sleep 3; echo "GET http://www.geocities.co.jp/.../rfc2068-ja.txt HTTP/1.0"; echo "Host:") | telnet www.geocities.co.jp 80 でやってみたのですが、telnet後、GET,Host:コマンドを実行せずにそのままtelnetを終了してしまいます。どうしてか、教えて下さい!! どうぞよろしくお願いします。 |
どうも。いえろーばっくすです。 この前の質問なんですが、なにやらtoInt関数以外のところで つまづいてるっぽいことが発覚しました。 プログラムを最小単位にして確認してみたところ ちゃんとtoInt関数は使えてました。 確認怠って質問してしまってすみませんでした。 まだ不具合は解消されてないのですが、 とりあえずがんばってみます。 板汚してすんませんでした。 |
返事遅れてすみませんでした。 ファイル書き込み(排他処理)の件、勉強になりました。 あとでやってみようかと思います。 ありがとうございました。 |
68user殿 アドバイスありがとうございました。 教えていただいたサイトには「障害が多いのでやめます」って 書かれていました。ショック・・・。 ほかにどこかありましたら、アドバイスお願いします。 |
> telnet後、GET,Host:コマンドを実行せずにそのままtelnetを > 終了してしまいます。 おろ、最後にも sleep が必要だった。んでもって、echo だけじゃ 改行が出ないのか。 ( sleep 2 ; \ echo "GET /index.html HTTP/1.0" ; \ echo "Host: www.goo.ne.jp" ; \ echo "" ; \ sleep 2 ) | telnet www.goo.ne.jp 80 これでも不完全なような気がする。 まぁ、この方法では所詮完全なクライアントは作れません。 どうしても perl でなくて bash でやりたいなら、except コマンドを使いましょう。 > 最近Qtに手を出し始めたいえろーばっくすです。 ちなみに Qt は全く知りません :-) じゃあ Gtk+ がわかるか というと、こっちもわかりません。でも、Xaw がわかんないが 一番痛い。 |
お教え頂き本当にありがとうございました。本当に感謝しています。 さっそくやってみたところ、大成功でした。 ただ、”不完全だ”というコメントが気になります。 manで、exceptコマンドをさがしてみたのですが、見つかりません。 そこで、簡単なexceptコマンドの使用例を教えて下さい。 あともう一点、 awkコマンドで、以下のように全角空白でsplit出来てしまうのですが、これは大丈夫なのでしょうか? kanji_n = split ($44, kanji_name, " ") gawkでなくても大丈夫ですか? 何度も申し訳ありません。よろしくお願いします。 |
> これでも不完全なような気がする。 これは多分勘違いです。シェルスクリプトでやる以上は、まぁ ベストに近いでしょう (ベストだと言い切る自信はない)。 ただし、 > まぁ、この方法では所詮完全なクライアントは作れません。 この見解は正しいです。なぜなら telnet の接続に 2秒以上 かかったら、もうおしまいです。telnet を使う方法は、所詮 クライアントもどきでしかありません。 > exceptコマンドをさがしてみたのですが、見つかりません。 普通 expect は標準では入っていません。お使いの OS の パッケージをインストールするか、ソースを手に入れて コンパイルして下さい。で、まずは man をよく読みましょう。 ちなみに僕は expect は使ったことがないので、多分答えられ ないと思います。 > awkコマンドで、以下のように全角空白でsplit出来てしまうのですが うーん、それで動いているのならいいんじゃないでしょうか。 awk って言ってもいろいろ亜種があるので、なんとも言えません。 |
初めまして、kmkです。 質問があるのですが、PCからUNIXへftpする際に 2Gを超えるファイルがはじかれたのですが、 limitで見るとfilesizeは無制限で、datasize が2Gチョイの制限になっていました。 マニュアルを見ても、なぜdatasizeでひっかかるのか 理由がわからないので、ぜひ教えてください。 |
Linux あたりなら、最近まで1つのファイルの最大サイズが 2GB まで、という制限があったそうですから、それじゃないで しょうか。 FreeBSD だと 5GB くらいは作れたという報告はみかけましたが、 最大サイズはわかりません。ちなみにファイルシステムとしての 最大サイズは、Linux も FreeBSD も 1TB か 2TB (忘れた) です。 商用 UNIX だと 1ファイル 1TB くらいはいくのかな? # でも Solaris2.6 だと最大 2GB だったような気も。 |
ありがとうございました。助かりました。 素直に、gzipで圧縮して、送ることにしました。 本当にありがとうございました。 |
ん、gzip で圧縮して送って、向こうで伸張できたのですか? なら最大ファイルサイズは関係なかったですね。 |
どうもお世話になります。 質問があるのですが、 プロセス中で動的メモリをmallocで取得して、そのプロセスが異常終了 (freeせずに)した時に取得した動的メモリは開放されるのでしょうか? #聞いた話によると確保した動的メモリは開放されずにそのまま #メモリに残ると聞いた事があります。 |
> 取得した動的メモリは開放されるのでしょうか? UNIX では必ず解放されます。 # OS のバグがない限り |
複数個(MAX100個)のウインドウを開く為に Display *display[100] Widget top_level[100] の行列で宣言して forループで,条件にヒットした場合のみ XtRealizeWidget(top_level[i]);などと コード化してみましたが,WINDOWが1つしか 表示しません.行列でwidgetを宣言するのに 問題があるのでしょうか?? |
>> 取得した動的メモリは開放されるのでしょうか? > UNIX では必ず解放されます。 元の質問とは大きく外れますが、共有メモリ(ipcs -mで見える)だと残りますね。 単なるFYIですが。 |
詳細はコード見ないと指摘できませんが、 > 複数個(MAX100個)のウインドウを開く為に > Display *display[100] ここだけ見ても、Displayに対する誤解がある気がします。 DisplayはXサーバとの接続ポイントです。 (socketとは限らないですが)分かりやすく言えば、socketを100用意して、それぞれ独立にサーバにつなごうとしているようなものです。 # 原理的には可能ですが、100のイベントループを管理するプログラムを書くのは嫌ですね。 |
補足ですが、Xt では XtDisplay(top_level) で Display * が 得られるので、Display を自前で用意する必要はありません。 % grep XtDisplay /usr/X11R6/include/X11/* IntrinsicP.h:#define XtDisplay(widget) DisplayOfScreen((widget)->core.screen) |
突然に書き込みで質問させていただく失礼をお許しください。 現在、ソケット通信(TCP/IP、マルチ)を行うプログラムを、 参考書などを調べながら作っております。 正直、概念などが良くわかっておりませんので、的外れな 物言いがあるかもしれませんが、御容赦ください。 現在、作成しようとしているシステム(X:仮名)では、 対向するYシステムと通信します。 また、Xシステム内部のプロセス間でも、クライアント・ サーバ間の通信を行います。 これらの通信に於いて、タイマを用意し、ヘルスチェックを 行おうとしていますが、この場合のタイマを、どのような形で 用意したものかで悩んでおります。 それぞれのプロセスの中から fork()したタイマで、上記のような 動作を行おうとしているのですが、この方法で大丈夫でしょうか? (事前の知識がありませんもので、不安を感じております。) あるいは、このような場合の、なにか、セオリーのようなもの というのは、あるのでしょうか? どうか、教えてくださいませ。 |
<AWKを使用した2つのファイルの文字列比較について>ご教授願います サンプルファイルです... <Input File1> <Input File2> <<Output File>> X01 X01 X025 X02 X02 X03 X03 X025 X04 X04 X07 X05 X05 X08 X06 X06 X099 X099 X07 X09 X08 X10 X09 X10 Input File1の文字列と Input File2の文字列の比較をします 結果としてOutputFileの出力を得たいのですが... 条件(雑でスミマセン) InputFile1の文字列が InputFile2の各文字列と一致する=出力しない InputFile1の文字列が InputFile2の各文字列と一致しない=出力する このケースでは InputFile1だけに存在する文字列 InputFile2だけに存在する文字列 がありますが InputFile2内の文字列を優先し (例) InputFile1の”X02"を比較するとき InputFile2”X02” は一致している => 出力しない 次のInputFile1の文字列”X03”を比較するとInputFile2の” 次行”である”X025"は一致していない (※) => X025 X03 の様にInputFile2の文字列”X025"を出力後InputFile1の”X03”を出力 InPutFile1の”X04 - X06"はInputFile2に含まれない =>そのまま出力 "X07 - X08"は双方含まれるので出力しない X09 の処理は(※)と同様に => X99 X09 の順で出力します(数としての比較ではありません) X10はInputFile2に含まれない =>そのまま出力 (AWK本も2冊買い込み(良い参照本があったら紹介願います)さらに同種質問の過去ログ”No. 1342”を参考(goo の"awk"検索でやっとこのHPにたどり着きました...)に考えてみたのですがどうしてもうまく作成出来ませんでした、AWK使いの方々:どうぞ宜しくお願いいたします) |
No.1428の修正です 申し訳ありません、サンプルファイルのスペースがおかしく なってました再送させていただきます。 <Input File1>____<Input File2>____<<Output File>> X01________________X01________________X025 X02________________X02________________X03 X03________________X025_______________X04 X04________________X07________________X05 X05________________X08________________X06 X06________________X099_______________X099 X07___________________________________X09 X08___________________________________X10 X09 X10 Input File1の文字列と Input File2の文字列の比較をします 結果としてOutputFileの出力を得たいのですが... 条件(雑でスミマセン) InputFile1の文字列が InputFile2の各文字列と一致する=出力しない InputFile1の文字列が InputFile2の各文字列と一致しない=出力する このケースでは InputFile1だけに存在する文字列 InputFile2だけに存在する文字列 がありますが InputFile2内の文字列を優先し... 以下例文です InputFile1の”X02"を比較するとき InputFile2”X02” は一致している => 出力しない 次のInputFile1の文字列”X03”を比較するとInputFile2の” 次行”である”X025"は一致していない (※) => 025 X03 の様にInputFile2の文字列”X025"を出力後InputFile1の”X03”を出力 InPutFile1の”X04 - X06"はInputFile2に含まれない =>そのまま出力 "X07 - X08"は双方含まれるので出力しない X09 の処理は(※)と同様に =>X099 X09 の順で出力します(数としての比較ではありません) X10はInputFile2に含まれない =>そのまま出力 (AWK本も2冊買い込み(良い参照本があったら紹介願います)さらに同種質問の過去ログ”No. 1342”を参考(goo の"awk"検索でやっとこのHPにたどり着きました...)に考えてみたのですがどうしてもうまく作成出来ませんでした、AWK使いの方々:どうぞ宜しくお願いいたします) |
そもそも > ヘルスチェック という言葉を初めて聞いたのですが (health check?)、文脈 からして正しく通信ができているかどうか調べ、一定時間 正常な反応がないならエラーにするという意味でいいですか? 目的にもよりますが、 1. サーバマシンが生きていて、network reachable かどうかを 調べるなら定期的に ping を打つ 2. TCP スタックが生きていることがわかればいいなら、定期的に echo サーバに接続。 3. サーバソフトウェアが生きていることを確認するなら、NOP の ような何も処理をせず返事を返すだけのプロトコルを実装し、 それを使って定期的に確認。 4. 該当スレッドが生きていることを確認するなら、select や alarm でタイムアウト処理をして、一定時間反応がなければ エラー、という処理をする。 ってなところです。どれがお望みですか? 当然 1 が簡単 ですが、信頼性のあるのは 4 ですね。 全然関係ないところに反応するのもアレですが > AWKを使用した2つのファイルの文字列比較について おお、化けてる。しかも元データは… http://X68000.startshop.co.jp/~68user/tmp/01428 http://X68000.startshop.co.jp/~68user/tmp/01429 正しそう。掲示板のバグですね。どこらへんだろう。 さて、本題は…今日は体力の限界に達したので…また後程。 朝起きたら誰か親切な人が答えてくれてるといいなと思いつつ、 おやすみなさい。 # 気になるのは Input File1 と Input File2 の内容は、文字列 # としてソートされていることが保証されているか、ってとこ # ですか。されているなら簡単。されていないなら…それでも # そんなめんどくさいことじゃないかも。 |
ほうぼうで話題になってるのでご存知の方も多いでしょうが、FYI。 WXG for Linux/FreeBSD http://www.ekotoba.com/ フリーソフトです。Canna プロトコルをしゃべりますので、 クライアント側の環境設定は必要ありません。 入れ換えるには cannaserver を殺して、/tmp の.iroha-unix や .ki2-unix (kinput2 を使っている場合) を削除し、wxgserver を 実行するだけです。で、どれくらい賢いかと言うと…(fj で見かけた ネタですが)、 cannaserver 貴社の貴社が貴社で帰社した。 (問題外) 帰社で帰社したのは帰社の帰社です (ここまでダメだとすがすがしい) MSIME 貴社の記者が汽車で帰社した。(正しい) 汽車で帰社したのは記者の記者です。(まぁ惜しいか) WXG 貴社の記者が汽車で帰社した。(正しい) 汽車で帰社したのは貴社の記者です。(正しい) うーん、すばらしい。まだバグっぽい誤変換もありますし、 単語登録に問題アリですが、十分実用に使えます。 A.I.SOFT に感謝しつつ、周りの環境を片っ端から WXG に replace 中。 |
No.1425,1426のアドバイスありがとうございます. i = 0,1,2,,,100 display[i] = XtOpenDisplay(context2, NULL, NULL, "TestApp", NULL, 0, &argc, argv); とコード化しているのですが,forで回しても,どうも同じwindowが 何度も開いている様です.第1引数が悪いのでしょうか. もう一度だけお願いします. |
traceroute.cgiを期待をかけてダウンロードさせていただきました。 なかなか上手く動かないので書き込みに参りました。 上記CGIと、environment.plもFTPしましてディレクトリも変更しました。 ところがscript Errで動きません。Redhat6.2では利用できないのでしょうか? それともDNSやDHCP等が関係して出来ないのでしょうか? 恐らく初心者の私の待ちがいとは思いますが、ご指導宜しくお願いいたします。 |
HP−UXでメモリ内のデータをソートしたいのですが、 サイズが大きいため無理なのかなと思っています。 sortコマンドではどれくらいの件数をソート出来るか 知っている方いませんか? |
> AWKを使用した2つのファイルの文字列比較について diffの出力をawkで加工、ってのじゃダメなのかな? |
> No.1425,1426のアドバイスありがとうございます. 全然通じていないような・・・ Displayを複数オープンする必要はありません。 100のXサーバと接続するクライアントには応用できるので、一応書いてみました。 XtAppContextは内部で複数のディスプレイ接続に対応していますね。 しかし、あくまで、複数のXサーバと接続するクライアントの為の仕組みであって、ひとつのXサーバ相手に、複数のディスプレイ接続は無意味です。 #include <X11/Intrinsic.h> #include <X11/StringDefs.h> #include <X11/Shell.h> int main(int argc, char **argv) { XtAppContext ac; Display *dpy[100];/* ridiculous example */ Widget w[100]; Arg arg[2]; int i; char title[64]; /* Xt initialization */ XtToolkitInitialize(); ac = XtCreateApplicationContext(); XtSetLanguageProc(NULL, NULL, NULL); XtSetArg(arg[0], XtNwidth, 100); XtSetArg(arg[1], XtNheight, 100); for (i = 0; i < 100; i++) { /* ridiculous example */ dpy[i] = XtOpenDisplay(ac, NULL, NULL, "TestApp", NULL, 0, &argc, argv); sprintf(title, "%d", i); w[i] = XtAppCreateShell(title, "TestApp", applicationShellWidgetClass, dpy[i], arg, 2); XtRealizeWidget(w[i]); } XtAppMainLoop(ac); } |
#68user氏ではないですが。 @hayataさん traceroute.cgiについて。 私自身 perl をやり始めたばかりなんでアレかのしれませんが、 ・perlが存在するパスは? 確認方法は「which perl」を実行したときの出力を見ることです。これ が「/usr/local/bin/perl」でなければ、perlが別のパスにインストール されているか、そもそもインストールされていない可能性があります。 インストールされていない場合は実行不可能ですが、別のパスが出力 された場合は、このスクリプト(traceroute.cgiとenvironment.plの両方)の 最初の行 #!/usr/local/bin/perl を修正する必要があります。例えば、「/usr/local/perl5/bin/perl」と表示 された場合は、 #!/usr/local/perl5/bin/perl とします。 ・tracerouteが存在するパスは? 確認方法は perl の場合と同様、「which traceroute」を実行したときの 出力を見ることです。これが「/usr/sbin/traceroute」でなければ、ダウン ロードした environment.pl の $traceroute = "/usr/sbin/traceroute"; という部分を修正する必要があります。例えば、「/bin/traceroute」と 表示された場合は、 $traceroute = "/bin/traceroute"; とします。 の2つをとりあえず指摘させていただきます。これ以外にも原因が考えられる でしょうが、少なくともこの2つを確認し、しかるべき対処をしないと実行 できませんので。 あと、このスクリプトは、*これを実行したホスト*と指定されたホストの間の ネットワークのつながりを調べますので、 http://X68000.startshop.co.jp/~68user/Cgi-room/ から直接実行した場合とでは出力結果が異なります。 @68userさん traceroute.cgiで気づいたのですが、 http://X68000.startshop.co.jp/~68user/Cgi-room/ の「www.cs.gunma-u.ac.jpと指定のホストの間の」は誤りで、正しくは 「X68000.startshop.co.jp」ではないでしょうか。 それでは。 |
はじめまして。lbと申します。 >AkiAkiさんへ inputfile1, 2ともあのようにソートしてあるならば、 comm -3 inputfile1 inputfile2 | sed 's/[[:space:]]*//g' で近い出力が得られるのではないでしょうか。awk じゃなくて すみませんが、ようするにカラムの間の space を削除すると いうことです。[:space:]という書き方がサポートされていない 場合は s/▲*//g にしてみてください。▲は キーボードのスペ ース の入力です。 |
どうも、skel.103Mです。 No.1437の > @68userさん > traceroute.cgiで気づいたのですが、 > http://X68000.startshop.co.jp/~68user/Cgi-room/ > の「www.cs.gunma-u.ac.jpと指定のホストの間の」は誤りで、正しくは > 「X68000.startshop.co.jp」ではないでしょうか。 は、正しくは ---------- @68userさん traceroute.cgiで気づいたのですが、 http://X68000.startshop.co.jp/~68user/Cgi-room/ の「www.cs.gunma-u.ac.jpと指定のホストの間の」は誤りで、正しくは 「X68000.startshop.co.jpと指定のホストの間の」ではないでしょうか。 ---------- ですね。ミスしてしまいました、申し訳ないです m(__)m |
No.1436 Display *dpy[100]; -> Display *dpy; に修正しました. わざわざコードまで,書いてもらってありがとう. 参考にさせてもらいます. |
こんにちは。 apacheのアクセスログのバックアップファイルを 作成したいと思ってます。 cpでファイルを作成しているときに アクセスログに書かれたログは、 反映されるものなのでしょうか? 知っている方がいらしたら教えていただけませんか? よろしくお願いします。 |
1438,1435アドバイスありがとうございます。 結果がこの結果になれば "awk"にはこだわってません (”perlが良いんじゃないか”とか会社の周りの連中は言ってますが..) ●diff を awkで加工... ●comm (Unix歴は長かったつもりですが...こんなコマンドがあったんですね) 来週早々会社のマシンでトライしてみます |
はじめまして。atomと申します。 教えて頂きたい事があります。 unixで特定の文字列を含むファイルを 特定の場所から検索するには どのようにすればよいのでしょうか? "unixの部屋"のgrepの説明で grep −−− dir/* というのがありますが これでよいのでしょうか。 どなたか、教えて下さい。 よろしくお願いします。 |
> sortコマンドではどれくらいの件数をソート出来るか > 知っている方いませんか? 適当なデータを作って、実験してみましょう。sort できる 限界までいったら、swap の状況を見つつ、sort のせいなのか メモリが足りないのか見極めましょう。 > traceroute.cgiを期待をかけてダウンロードさせていただきました。 補足ですが、まずは web サーバのログを見ましょう。 perl -c traceroute.cgi で文法チェックしましょう。 CGI として動かすのはもっと後の話です。 > 正しくは「X68000.startshop.co.jpと指定のホストの間の」では > ないでしょうか。 へい、その通りです。直します。 # が、CGI の小部屋は技術的に未熟だった頃 (今もたいした # ことはないけど) のコンテンツなので、既にメンテナンス # する気力をなくしております。暇を見付けて修正しておきます。 > grep −−− dir/* というのがありますがこれで > よいのでしょうか。 それでよいです。他人に聞く前に自分で試してみましょう。 試してダメだったのなら、何をした結果どうなったか、 というのが第三者にわかるように質問しましょう。 > cpでファイルを作成しているときにアクセスログに > 書かれたログは、反映されるものなのでしょうか? 試してませんが、恐らく反映されません。なので、 log を適当なタイミングで rotate して、古くなった ログファイルをコピーするのがよいでしょう。 apache なら rotatelogs というコマンドが付属しています。 |
>ん、gzip で圧縮して送って、向こうで伸張できたのですか? >なら最大ファイルサイズは関係なかったですね。 ファイルサイズですが、FreeBSD 4.1-RELEASE で 6GB 以上の報告も あるようです。6GB のディスクを dd コマンドでファイル化した なんて話がどこかで書いてありました(URI は失念しました)。 推測の域を出ませんが、2GB で引っかかったというので思い付いたのですが…。 まさかとは思いますが、singed int でファイルサイズを保持しているような 状況だとエラーが出るでしょうね。プログラムのバグかも知れません。 >grep −−− dir/* というのがありますが >これでよいのでしょうか。 この質問は答えにくいですね。dir 以下のディレクトリツリーを トラバースするのなら、これじゃ不足です。 find . -type f -exec grep PATTERN {} \; ですかね。GNU grep 使っているのなら、 grep -r PATTERN * でもすみます。ただし、シンボリックリンクがループしていると死にますね。 質問をみるとファイル名だけが表示されれば良いようにも読めるので、 そういった場合だと、 grep -rl PATTERN * かな? >適当なデータを作って、実験してみましょう。sort できる >限界までいったら、swap の状況を見つつ、sort のせいなのか >メモリが足りないのか見極めましょう。 GNU sort の場合 TMPDIR みていますね。ルートパーティションを 小さめにとっているシステム( 32MB とか 64MB )だと、メモリがあまっているのに ファイルシステムがあふれたりして。256MB メモリのあるマシンで実験したら、 こんな感じです。 % la -alF total 40330 -rw------- 1 root wheel 36666584 Dec 10 05:51 hoge % sort hoge /: write failed, file system is full sort: write error: No space left on device ちなみに、ルートパーティションは 64MB で、のこり 17 MB でした。 >perlが存在するパスは? 蛇足ですが、CGI スクリプトを win から binary mode で転送すると パスが正しくてもアウトですね。一行目が #!/usr/bin/perl^M とかなりますから。^M って CR のことです。つまり ascii の 0x0d |
> GNU grep 使っているのなら、 > grep -r PATTERN * あれ、今の GNU grep って recursive option あるんですか。 と思って ChangeLog 見たら、-r が追加されたのは 1998/08/18 でした。結構前なんですね。 |
nac と申します。ネットワークプログラミング大変参考になりました。 私も、POP3 クライアントを作ってみて疑問がでてきました。 rfc1939 を読んでみると pop3 サーバーの返答は 512文字まで と書いてありました。そこで、一行が512文字以上のメールを pop3 から落してくると、次のように hogehoge...hoge!CRLF hogehoge....hogeCRCF 途中で ! マークが入っておりました。rfc1939 を読む限りこの、! に ついては言及されていないようですが、これはどこで規定されているのでしょうか。 (もし、rfc の中で書いてあるようでしたら、理解不足です、すいません) |
> rfc1939 を読む限りこの、! については言及されて > いないようですが ちらっとしか見てませんが、512 ってレスポンス行 (+OK とか +ERR) の最大長であって、メールの1文の長さとは 無関係じゃないでしょうか? とはいえ、! で fold されていたというのは気になりますね。 現在 IMAP 環境しかないので試せませんが、その POP3 サーバアプリケーションの名前を教えてください。qpopper ですか? |
一応インストールは成功しているみたいです。GNOME+enlightenmentで「サウンドを有効にする」ボタンを押したらでは正常に動いたのですが、その後デスクトップのタスクバーが出なくなり、仕方なく再インストールして一からやり直したんですが、GNOM+Sawmillでは無理なんでしょうか? PCはNECのLAVIE「LV16CWS」(ノート型)です。サウンドカードはESS社 ES1869Sで、動作確認の取れたOSSの最新版ファイルをインストール済みです。ディストリビューションは、Turbo Linux6.0です。 音だけじゃなくて、スクリーンセイバーもKDEだと動くのにGNOMEではプレビューでは見れても、実際には動きません。ウィンドウマネージャーとの愛称って在るんですかね???誰かアドバイスお願いします。 あとメモリーの自動認識ができないのですが、方法ありますか?解れば教えて下さい。96MBなのでデフォルトでは認識しないようです。宜しくお願いします。 |
skel.103Mさん @hayataです。 No.1437でのアドバイスありがとうございます。 出張でこちらの掲示板を見落としてしまいました。これからアドバイスに沿って再挑戦してみます。 成功しましたは報告いたします。 ではでは |
1430の回答、ありがとうございました。 すぐに応答くださったのに、質問を投げた私が、反応が鈍く、 大変失礼いたしました。 「ヘルスチェック」という言い方は、どうやら「職場方言」のようですが、 68userさんの御推測の通りのものです。 回答いただいたうちの、3、及び4を、使用してみようと思っています。 ありがとうございました。 また、なにかの折りには、よろしくお願いいたします。 |
>とはいえ、! で fold されていたというのは気になりますね。 qpopper の場合一行の最大は \0 込みで 1024 bytes です。 ソースを見ると早いでしょう。 /* Send the header of the message followed by a blank line */ while (fgets(buffer, MAXMSGLINELEN, p->drop)) { if (!strncasecmp(buffer, "Content-Length:", 15) || !strncasecmp(buffer, "X-UIDL:", 7)) { /* Skip UIDLs */ continue; /* Content-Length is MTA dependent, don't send to MUA */ } \0 込みと言うのは、fgets 使っているための仕様です。 もしも、512 文字というのが 2 バイト文字の意味で、512 文字なら ちょうどこの制限に引っかかります。\0 込みなので、iso2022-jp なら 途中出来られると ! なんていくらでも出て来ます。iso-2022-jp なら 「。」なんて「!#」とかなりますから。 ただ、普通は困りませんね。rfc で決められている一行の推奨値は 70 bytes + αですから。 問題は本当に POP3 サーバだけの制限なのかということです。 実験の際に使った MUA や MTA の制限も関係あります。 sendmail 8.11.1 のソースを見たら行の長さ関係は 2048 bytes でした。 また POP3 サーバなどをinetd を通している場合 inetd 自体の制限も あります。8192 bytes かな? FreeBSD の inted の場合。ヘッダーしか見て いないので断定できませんけど。 もっとも、自分で /var/mail/ のファイルにメールらしきものを手動で append して実験した場合は話は別ですが。 他にも実験を telnet でやったのなら、telnet などの制限も考えられます。 FreeBSD なら ring buffer 使っているので、 そういう制限はありませんが、OS のベンダによってこの実装は変わるでしょうね。 |
> qpopper の場合一行の最大は \0 込みで 1024 bytes です。 それはヘッダの出力で、本文はその下の /* Send the message body */ while(fgets(buffer, MAXMSGLINELEN, p->drop)) { /* Decrement the lines sent (for a TOP command) */ if (--msg_lines <= 0) break; pop_sendline(p,buffer); if (hangup) return(pop_msg(p, POP_FAILURE, "SIGHUP or SIGPIPE flagged")); } でないでしょうか。で、pop_sendline は pop_sendline(POP *p, char *buffer){ char * bp; /* Look for a <NL> in the buffer */ if (bp = index(buffer,NEWLINE)) *bp = 0; /* Send the line to the client */ (void)fputs(buffer,p->output); /* Put a <CR><NL> if a newline was removed from the buffer */ if (bp) (void)fputs ("\r\n",p->output); } となっているので (一部略)、fgets で得たデータに改行が 含まれない場合も、余計な改行は付加されないように思う のですがどうでしょう # 改行なしだと bp==NULL になって fputs("\r\n") は実行されない。 rosegarden さんは qpopper-2.x 系列を見ておられるよう ですが、僕が見たのは qpopper-2.2 (ってこりゃまた古いな) の pop_send.c です。 |
>rosegarden さんは qpopper-2.x 系列を見ておられるよう >ですが、僕が見たのは qpopper-2.2 (ってこりゃまた古いな) >の pop_send.c です。 私が見たのは、qpopper-2.3 のソースですね。古いことにはかわりないんですが…。 確かに、 >それはヘッダの出力で、本文はその下の > /* Send the message body */ > while(fgets(buffer, MAXMSGLINELEN, p->drop)) { は御指摘の通りです。本質的にソースに差異はありません。でも、 これも結局 #define MAXLINELEN 1024 #define MAXMSGLINELEN MAXLINELEN なんで、結果的には同じですね。ただし、結果的に同じだっただけで、 私の間違いは間違いです。御指摘ありがとうございます。 なお、上のは同じバージョンの popper.h の define です。 >となっているので (一部略)、fgets で得たデータに改行が >含まれない場合も、余計な改行は付加されないように思う >のですがどうでしょう まず、fgets は man 3 fgets すると >The fgets() function reads at most one less than the number of characters >specified by size from the given stream and stores them in the string str. 最大で size で指定された文字から一文字少ない文字をバッファに読み込む とあります。これは \0 をappendしないといけないからです。 サンプルプログラムを次のようにします。 #include <stdio.h> int main( int argc, char **argv ) { FILE *fp; char buff[256]; if( argc != 2 ){ fprintf( stderr, "usage : fgets FILENAME\n" ); exit(1); } if( ( fp = fopen( argv[1], "r" ) ) == NULL ){ fprintf( stderr, "Cannot read %s\n", argv[1] ); exit(1); } while( fgets( buff, 10, fp ) ){ puts(buff); } exit(0); } さらにこれを gcc -g -O -o fgets fgets.c としてコンパイルして gdb で buff の中を見ます。 (gdb) break 18 Breakpoint 1 at 0x8048604: file fgets.c, line 18. (gdb) set arg fgets.c (gdb) run Starting program: /home/user/tmp/fgets fgets.c Breakpoint 1, main (argc=2, argv=0xbfbff740) at fgets.c:18 18 while( fgets( buff, 10, fp ) ){ (gdb) display buff 1: buff = "\201\203 (ゴミのため略) (gdb) n 19 puts(buff); 1: buff = "#include \000\005( 以下ゴミ ) (gdb) q こんな感じですね。 ># 改行なしだと bp==NULL になって fputs("\r\n") は実行されない。 これは違うと思います。bp == NULL なら単に \r\n を append するだけ で bp != NULL なら \n を \0 で潰してから、\r\n を append だと 思います。良く見てください、元のコードを *bp = '\0' となっています。 bp は index が拾って来た \n のあるところのポインタです。 |
ん? 失礼しました。 >># 改行なしだと bp==NULL になって fputs("\r\n") は実行されない。 >これは違うと思います。bp == NULL なら単に \r\n を append するだけ これ間違いですね。 >/* Put a <CR><NL> if a newline was removed from the buffer */ > if (bp) (void)fputs ("\r\n",p->output); bp == NULL だと確かに \r\n は付かないですね。 あと、 >となっているので (一部略)、fgets で得たデータに改行が >含まれない場合も、余計な改行は付加されないように思う 改行がつかないのは確かですね。 すると長い行の場合は次の行と連結するんですかね? 大変失礼しました。 ただ指定のバッファサイズより一文字減るのは確かです。 なんかそれを言おうとして、論点ずれた挙げ句に大量のゴミみたいな メッセージを書き込んでしまい申し訳ありませんでした。 |
2ch 風にリンク張れるようにしてみました。^(>>|@)\d+ は リンクが張られます。ただ、2ch のように数字に identify を 持たせたくないなぁ。 >>1453 さんの言うように…してみたところ、うまく動きました とかはちょっと嫌。 >>1455 rosegarden さん > 論点ずれた挙げ句に大量のゴミみたいな > メッセージを書き込んでしまい申し訳ありませんでした。 いいえ〜。こういう機会でもないとなかなかソース 読まないタチなので、この手の話は歓迎です。 ちなみに僕はデバッガ使えないようなレベルなので (bt しか知らない)、今後ともいろいろと御教示下さい。 >>1449 kiki@TL さん > GNOME+enlightenmentで すいませんが、GNOME も E も KDE もほとんど使ったことが ありませんので、僕はわかりません。 |
こんにちは。 >>1441のmerryです。 68userさん >>1444で質問に答えていただきありがとうございます。 rotateを調べてみたいと思います。 |
こんにちは UNIXでsendmailを使ってメールを送信するスクリプトを Perlで作ろうと思っているのですが、 添付ファイルを付けることは可能なのでしょうか? よろしくお願いします。 |
はじめまして。 crontabで毎日12:00にabcというスクリプトを 起動するといった設定を現在しているんですが、 これを最終金曜日だけ11:00起動でそれ以外は12:00に起動させるっていう 方法はあるんでしょうか? 教えていただきたく。 |
初めまして、辻 です。 HTTPでGETするプログラムを作成しています。HTTP クライアントを作ってみよう(4) を参考にさせていただいて、URLのエンコードしようとしています。 で、 /~user/hoge.cgi?fuga=ABC!"$ DEF+ が /%7euser/hoge.cgi?fuga%3DABC%21%22%5C%24+DEF%20 と書かれています。自分で作ったプログラムで確かめてみると、 /%7euser/hoge.cgi?fuga%3dABC%21%22%24+DEF%2b となりました。 また、URLのエンコードの対象はURL全てですか?それとも、CGIとかで使われる、?の後ろのみなのでしょうか?~が含まれるので、そんなことはないでしょうが。?そのものは、対象にならないようですし、ファイル名に@等がついてたりしたらどうなるのでしょうか? ちなみに、 string yHttpGet::UrlEncode(string url) { char buff[10]; for(int i=0; i<url.length(); i++) { char c = url.at(i); if(((c <'0') || ('9' < c)) && ((c < 'a') || ('z' < c)) && ((c < 'A') || ('Z' < c)) && ('/' != c) && ('?' != c) && (' ' != c) && ('_' != c) && ('-' != c) && ('.' != c) && ('*' != c)) { sprintf(buff, "%%%02x", c); url.replace(i, 1, buff); } else if(c == ' ') { url.replace(i, 1, "+"); } } return url; } 今のところ、このようなコードを書いています。 |
@1458 masa さん > UNIXでsendmailを使ってメールを送信するスクリプトをPerlで作ろうと > 思っているのですが、添付ファイルを付けることは可能なのでしょうか? モジュールが使えるなら http://www.parkcity.ne.jp/~chaichan/qanda/qa425.htm?00-12-13-19-49 で、ふじさんが述べておられる方法がお勧めです。 @1459 M.K さん > これを最終金曜日だけ11:00起動でそれ以外は12:00に起動させる > っていう方法はあるんでしょうか? 少なくとも FreeBSD の crontab では、それを実現する簡単な 方法はありません。 金曜日の 11:00 毎日 12:00 という二つのエントリを作って、スクリプト内で 最終金曜日で12時台なら、処理終了 金曜日 && 最終金曜日でない && 11時台なら、処理終了 とするのがいいでしょう。 試してませんが、*BSD や GNU の date なら、 date +%m … 現在の月を求める date -v+7d +%m … 一週間後の月を求める を利用して 0 11 * * 5 [ `date +%m`!=`date -v+7d +%m` ] && run-script 0 12 * * * [ `date +%w'!='5' -o `date +%m`!=`date -v+7d +%m` ) ] && run-script てなことが可能かもしれません (条件合ってるかな?)。 @1460 辻さん foo.cgi?.... という GET 形式は、? 以降の文字が QUERY_STRING (疑問符文字列) という名前で取り出せることからわかるように、 ? はエンコードする必要はありません。疑問符であることが重要なのです。 > URLのエンコードの対象はURL全てですか? 全て、というかパス (/~user...) も含めてエンコードが必要です。 ただし、引数を渡したい場合は ? はエンコードしません。 でなくて、ファイル名の一部に ? が含まれる場合は エンコードが必要です。 この掲示板の上にある発言フォームから文字を入力すると、 Name … 68user Email … 68user@X68000.startshop.co.jp Message … ほげほげ というような、対応関係が生まれます。このようなフォームで 生成されたデータを POST で送るとき、クライアントは application/x-www-form-urlencoded という mime type で 送信しなければいけません。「HTTP クライアントを作ってみよう」 では手抜きして送ってませんが、本来は送るべきです。 で、GET の場合も同様に x-www-form-urlencoded 形式ならば ?foo=bar は ?foo=bar でよいです。= は URL エンコードしません。 しかし、そうではなく 「foo=bar」という引数を渡したいのなら ?foo%3Dbar となります。 というふうに、本当は /~user/hoge.cgi?fuga=ABC!"$ DEF+ という例だけでは、どこをエンコードすべきかは明確には なりません。なので、あの解説はあまりよろしくないですね。 例えば hoge.cgi?foo=bar&def=ghi は、フォームに foo、 bar という要素があるならこのまま送ればよいですが、 foo=「bar&def=ghi」という意味なら foo=bar%26def%3Dghi」 とすべきです。どちらなのかは hoge.cgi?foo=bar&def=ghi だけでは正確には判断できません。 |
こんばんは、質問をした本人のレスが遅れて申し訳ありません。 (しかも、ソースまで見て頂いて恐縮です。) >サーバアプリケーションの名前を教えてください。qpopper ですか? 一般のプロバイダで実験したので、わかりませんでした。 今度他の qmail, sendmail が動いているサーバーで実験してみます。 さて、私も手元にあった、qpopper3.0.2 のソースを眺めてみました。 (POP_TERMINATE は '.' buffer は buffer[MAXMSGLINELEN] (MAMSGLINELEN=1024) と宣言されています) pop_sendline ( p, buffer ) POP * p; char * buffer; { char * bp; /* * Byte stuff lines that begin with the termination octet */ if ( *buffer == POP_TERMINATE ) (void)fputc ( POP_TERMINATE, p->output ); /* * Terminate the string at a <NL> if one exists in the buffer */ bp = index ( buffer, NEWLINE ); if ( bp != NULL ) *bp = 0; /* * Send the line to the client */ (void) fputs ( buffer, p->output ); /* * Put a <CR><NL> if a newline was removed from the buffer */ if ( bp != NULL ) (void) fputs ( "\r\n", p->output ); } これをみると、やはり、\n がなければそのまま出力されて しまうようですね。なんとなく、最初から、\n があることを 想定しているような感じも受けます。 |
68user さん、何度もありがとうございます。 私は、HTMLにある<A>タグでリンクされているHTMLをGETするプログラムを作っています。フォームに関わるCGIを作ってるわけではないのですが、リンク先が掲示板で?で引数を渡すリンクがある場合は、正しく渡して、取り出したいと考えています。 この場合、GETなのか、POSTなのかはわからないのですが。ブラウザがフォームからの結果以外で単純にリンクから、ページを読み込むときは、GETを使っているのだと思うので、GETでいいのですか? で、よくわかっていないのですが。この場合も、URLを%とかでエンコードすべきかは判断できないのですか?ブラウザはやっているように思えるのですが。。。 |
行頭に「>>1461」または「@1461」と書くと、 >>1461 68user というふうにリンクを張るようにしました。このとき、自動的に リンク先の発言者の名前を補完します。「さん」付けは なしですが、御了承下さい。 また、「>>1461 ほげほげ」と、数字の後に何かを書くと、 >>1461 ほげほげ とリンクだけが張られ、名前の補完はされません。しかしスクリプトが どんどん汚くなってきた…。brush up が必要だなぁ。 >>1463 辻 義一 > GETでいいのですか? foo.cgi?hoge.. という形式なら GET でよいです。 要は、HTML を読んで <A HREF="foo.cgi?hoge=fuga">..</A> という 部分から foo.cgi?hoge=fuga という文字列を切り出した場合、どこを エンコードすべきかということですよね。普通は何もエンコードせず デコードせず、そのまま使えばいいと思います。アンカーに書く URL は既に URL エンコードされているはずだからです。 それを無理にエンコードする必要はないですが、あえて行うならば ?=&%#/.-*_ 以外の記号と 0x80〜0xff はエンコード、でいいのでは ないでしょうか。 >>1462 nac > これをみると、やはり、\n がなければそのまま出力されて > しまうようですね。 そうですね。POP3 サーバとしては、本文の行がどれだけ長くても、 改行は付加しないのが普通ではないかと思います。基本的にクライ アントにデータを流すだけですから。 |
>それを無理にエンコードする必要はないですが、あえて行うならば >?=&%#/.-*_ 以外の記号と 0x80〜0xff はエンコード、でいいのでは >ないでしょうか。 html の文法的には hoge.cgi?foo=1&bar=2 は hoge.cgi?foo=1&bar=2 と書くそうなので、そういった html の文字参照の変換は 必要になるかも知れません。例えば、$ とか…。 |
68user さん。 ありがとうございます、エンコードもデコードもしなくて良いと言うことですか。楽は楽なのですが。~もそのままで良いのかな。。今のプログラムでGETできているので、このままで行こうかと思います。 rosegarden さん。 その変換について走っていますが、、タグ内の文字列(""で囲まれた部分)までは適用しなくても良いと思うのですが。しているのも見たことありませんし。 |
>>1466 辻 義一さん http://www.ne.jp/asahi/minazuki/bakera/html/opinion/ampersand が、良くまとまっています。ご参考まで。 ※ 僕のサイトは、どうしてたかなぁ・・・ |
たまたま、この件で大ハマリしてました (1時間悩んだ)。 http://X68000.startshop.co.jp/~68user/tmp/amp.html FreeBSD jman へのリンクを張ろうとしていたのですが、 上のリンクは mroff.cgi?.....&dir=jpman-4.2.0%2Fman§=8 と書いていますが、うまくいきません。よく知りませんが、&sec か § という実体参照があるのでしょう。で、ブラウザ (FreeBSD+NN4.75) がその文字に置き換えてリクエストを送るので、mroff.cgi 側に こちらの意図したデータを渡せないのでしょう。 下のリンクは mroff.cgi?.....&dir=jpman-4.2.0%2Fman&sect=8 としているので OK です。 うちのページは何も考えず & のままにしていますね。いかんなぁ。 |
>>1467 (自己フォロー) http://www.asahi-net.or.jp/%7Ejy3k-sm/i_net/url.html にも、色々あります。 >>1468 68user 雨が降って、ひまなので、ついでに、調べてみました。 http://www.w3.org/TR/REC-html40/sgml/entities.html によると、sectはsection signだそうです。 因みに、win98/IE4,NN4では§、bidi-mozilla(11-13)では%A1%F8 になりました。 |
どうも、お世話になります。 最近、DNSの勉強していて、試しに立ててみようと 思っています。(Redhat Linux) そこで、質問なんですけど、 ・ダイヤルアップ接続でDNSサーバは動かせますか? #もちろん一時的でいいんで‥ ・DNSサーバで必要なものは何でしょうか? 気をつける点等.. #そういうHPを知っていたら教えて下さい。 よろしくお願いします。 |
>・DNSサーバで必要なものは何でしょうか? 気をつける点等.. >#そういうHPを知っていたら教えて下さい。 Linux-HOWTO で詳しく書いたものがありましたよ。 |
>>1471参照 ついでだったので、調べておきました。 http://www.linux.or.jp/JF/JFdocs/DNS-HOWTO.html JF インストールすれば大抵入っています。 |
rosegardenさん有難う御座います。 教えてくれたページを見て勉強します。 これからもよろしくお願いします。 |
ども。お世話になってます。 管理モードのパスワードとかって、普通crypt()でハッシュしますよね。 でもDESの場合辞書アタックとかで簡単に破られちゃいますよね。 なのでmd5(md5sum)コマンドで「4fcf95ef97e1b7b248698bca83781902」みたいに ハッシュしているのですが、これはcrypt()のDES、MD5($1$...$)と比べてどっちが セキュリティ的によろしいのでしょうか。 |
URLエンコードの件ありがとうございました。 URIですか?に&をそのまま入れているページはたくさんあります。自分のホームページ上のCGIもそうだし、検索エンジンとかもそう。修正しようか迷っています。登録されている実体参照と重なっていないようなので、事実上大丈夫なのでしょうが。勉強になりました。これを、CGIに反映させるかは迷っているのですが。 現在作っているプログラムでは、色々動かして問題がないようですので、このままにしておきます。ブラウザでも正しくエンコードされていない、ページを開くときに支障があるぐらいですから、こちらで変換すれば上手く出来そうですが、ページの責任と言うことで。終わらせます。 ありがとうございました。 今回は、 |
こんちはーっす。 ず、ずいぶんまえに、ここに(そのときとはURL違うような気もするが) 永久保存版の過去ログなかったっすか? 久しぶりに見たくなって検索したのですが・・・・ 最近行ってないけどtestボードまだ、げんきなのかなー・・・・ |
>>1474 ぷに辻 > 管理モードのパスワードとかって、普通crypt()でハッシュしますよね。 DESやmd5を1方向関数として使用している点は了解していると仮定します。 (余談1 ハッシュ関数と1方向関数は同義と言ってもよいですが、一応別物です。 1方向関数は(結果的に)ハッシュ関数ですが、逆は必ずしも真ではありません。 moduloはハッシュ関数ですが、出力から元の値が容易に推測可能なので良い1方向関数ではありません。) > でもDESの場合辞書アタックとかで簡単に破られちゃいますよね。 辞書アタックと言っているのは、1方向関数でエンコードされたパスワードを奪われて、それに対して、しらみつぶしにパスワードを探索していると仮定します。 (余談2 暗号化パスワードと呼ぶ場合もありますが、復号化するわけではないので、誤用に近いと思っています。) 辞書アタックは、ワードを同じ1方向関数でエンコードして、マッチするものを探すことですから、同じ長さのパスワードなら、探索にかかるコストは、DESでもmd5でも大差無いと思います。 ただ、DESの場合、鍵長が56bitで、パスワード自体を鍵に使うことで(本来、暗号化アルゴリズムであるDESを)1方向関数にしているので、パスワードの長さが8文字に制限されます。 md5は(本来から1方向関数で)元データの長さに(現実的な)制限はないので、もっと長いパスワードが選べます。 この差は大きいですが、弱い(or 短い)パスワードを使っている限り、辞書アタックに対する強さは変わらないと思います。 (辞書アタック以外の探索法に対する強さは分かりません。 DESが簡単に破られる、と言っているのは、3年ぐらい前(もっと前?)のRSAコンテストで、約半年かかって破られたことを根拠にしていると思いますが、逆に言えば、未だ辞書アタックしか有効な手が無いという辺り、腐ってもDESと思わせるものもあります。) |
>>1476 SabaCurry > 永久保存版の過去ログなかったっすか? はい、ありました。半永久保存版は1997年9月16日だけですが、 一応 1997/9/29〜1998/09/20 の分は保存してあります。 データはありながらも閲覧用 CGI スクリプトがどっか行っちゃって 見られない状態が続いてましたが、さきほど発掘してきました。 見てたら恥ずかしくなったので (笑)、URL はメールで送ります。 そのうちアナウンスもなくひっそりと公開します。 >>1474 ぷに辻 > crypt()のDES、MD5($1$...$)と比べてどっちがセキュリティ的に > よろしいのでしょうか。 md5 より crypt+md5 の方が、salt という仕組みがある分 強固ではないかと思います。推測にしか過ぎませんが。 >>1477 gixs > RSAコンテストで、約半年かかって破られたこと 専用ハードウェアを使うと、56bit DES 解読に要する時間は 22時間くらいでしたっけ。剣呑剣呑。 |
>>1478 68user > URL はメールで送ります。 From: MAILER-DAEMON@lala.v3.com (Mail Delivery System) <tetuya@i.am>: unknown user: "tetuya" ということで、メールが送れませんでした。 |
>>1478 68user さん >md5 より crypt+md5 の方が、salt という仕組みがある分 >強固ではないかと思います。推測にしか過ぎませんが。 そう言えば、perl スクリプトなどから crypt 使うと FreeBSD の最近の RELEASE では DES で決めうちになっていることが多いようです。 ことに 4.1.1-RELEASE 以降の暗号解禁リリースの話です。 無論 DES 入れなければ、MD5 ですが。 システム全体では、切替え用のライブラリ関数もあって DES と MD5 を切替えて使えるのに perl が FreeBSD の切替えメカニズムに追従できていないようなんです。 それともできるのかな?ご存知の方いたらスクリプトレベルでの 切替え法を教わりたいです。 断定はしませんが、ソースをちょっと見た印象として、 -current は、login.conf で切替えられて、 デフォルトは MD5 です。今の所。4-stable は DES 入れると 有無を言わさず DES みたいですね。 |