|
前日の日付取得の件 68userさん、ご教授ありがとうございました。 Solaris環境なのでシェルで作成するのはやめます。 perlも少し触ったことがあるのですがC言語の方が経験が長いので Cで作成しようと思っています。 が、一般的 or perlの方が効率的なのでしょうか? |
|
68userさん、早速のレスありがとうございます。はぴおです。 ちょっと長くなってしまいますが、同じメールを自作POP3クライアントと Outlookのそれぞれで受信したソースを載せておきます。 なんか"<"、">"の部分だけが読み込めてない感じです。 それではよろしくお願いします。 [自作POP3クライアント] ------------------------------------------------------------- Received: from ns.ics.lan ([202.228.221.126]) by bd.mbn.or.jp (8.9.1/bd.mbn.or.jp-2.0) with ESMTP id RAA13962 for ; Wed, 15 Nov 2000 17:26:03 +0900 (JST) Received: from kimura ([202.228.221.125]) by ns.ics.lan (8.9.3/3.7W) with ESMTP id RAA26374 for ; Wed, 15 Nov 2000 17:20:05 +0900 Message-ID: <000501c04ede$6249e4d0$5400a8c0@kimura> From: "kimura" To: "kimura" Subject: test Date: Wed, 15 Nov 2000 17:31:00 +0900 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 X-UIDL: cde5eb4f8ec74762f85d10deccb2a5a3 test [Outlook Express] ------------------------------------------------------------- Received: from ns.ics.lan ([202.228.221.126]) by bd.mbn.or.jp (8.9.1/bd.mbn.or.jp-2.0) with ESMTP id RAA13962 for <lovex@bd.mbn.or.jp>; Wed, 15 Nov 2000 17:26:03 +0900 (JST) Received: from kimura ([202.228.221.125]) by ns.ics.lan (8.9.3/3.7W) with ESMTP id RAA26374 for <lovex@bd.mbn.or.jp>; Wed, 15 Nov 2000 17:20:05 +0900 Message-ID: <000501c04ede$6249e4d0$5400a8c0@kimura> From: "kimura" <lovex@bd.mbn.or.jp> To: "kimura" <lovex@bd.mbn.or.jp> Subject: test Date: Wed, 15 Nov 2000 17:31:00 +0900 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 X-UIDL: cde5eb4f8ec74762f85d10deccb2a5a3 Status: RO test |
|
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 というメール アドレスが「ある」ことはわかるところまで いったのですが、その内容まではわかりません。 ご存じの方がいらっしゃいましたら、よろしくお願いします。 |