68user's page 掲示板

Prev< No. 1844〜1940> Next  [最新発言に戻る] [過去ログ一覧]
No. 1844 # ふじ [URL] 2001/03/22 (木) 02:40:55
はじめまして。

いきなりですが、
>これを言われないような /dev/nul みたいな変数ってないんでしょうか。
(undef, undef, undef, $num1, $num2)=(0,1,2,3,4);

こんなのでどうですか?

No. 1845 # rosegarden 2001/03/22 (木) 03:37:21
>>1841 ふくし
>>1843 68user
>>1844 ふじ
つぎのようにすれば文句をいわれませんでした。

#!/usr/bin/perl -w

my ($login, $pass, $uid, $gid) = getpwnam('root');

print "$login:(password):$uid:$gid\n";
exit;

my をとったものと、較べてください。
ちなみに動作環境は perl 5.00503 ないしは perl 5.6.0 です。

No. 1846 # rosegarden 2001/03/22 (木) 06:15:44
>>1845 rosegarden
この他にも

#!/usr/bin/perl -w

use vars qw($login $pass $uid $gid);

($login, $pass, $uid, $gid) = getpwnam('root');

print "$login:(password):$uid:$gid\n";
exit;

などと、use vars で宣言しておけば文句を言われないようです。
詳しくは、perldoc vars してみてください。

No. 1847 # ふくし 2001/03/22 (木) 10:09:46
にゃるほど、

ふじさん>
リスト要素にすれば undef を左辺に持っていけるんですね。
undef = 3; だと怒られますけどね。(当たり前)
これは言いたいことを強烈に表現できているような気がします。

rosegarden さん>
my や use vars を使った方法もいいですね。
この問題がよく出てくるのはファイルの stat を受けるときなんですが、
こういう意味のある変数のときは変数名をつけておいて使わない
(そのうち使うかもしれないので)
というのが便利なので、使わせていただきます。

みなさんどうもありがとうございました。勉強になるー

No. 1848 # d-jiro 2001/03/22 (木) 18:54:15
いつも拝見しながら勉強させていただいています。
Perlを使ったソケット通信について質問があります。

HTTPSサーバに対してのソケット通信です。

http://X68000.startshop.co.jp/~68user/net/http-2.html
にあるように、通常のソケット通信はできたのですが、
相手がHTTPSになるとヘッダの都合か、まったくうまくいきません。
たとえば、

自分のサーバ →POST→ 相手のCGIのあるサーバ(https)
                                                                      ↓
ブラウザ上にデータを表示 ← 相手が出力したデータを取得

このようなイメージです。
通常のHTTPでのソケット通信の場合、出力するヘッダは、
  "POST /sample.cgi HTTP/1.0\r\n"
  "\r\n(空行)"
  "(POSTで送信するデータ群)"
このような感じだと思うのですが、HTTPS相手だと
まったく受け付けてくれません・・・。
これってSSLを相手が利用している以上、不可能なことなのでしょうか?
皆様の知識と知恵を貸してください、お願いします。

No. 1849 # 68user 2001/03/23 (金) 13:22:14
>>1848 d-jiro
> このような感じだと思うのですが、HTTPS相手だと
> まったく受け付けてくれません・・・。
としたいなら、自前で相手サーバのポート 443 (https の
ポート番号) に繋げて、自前でデータを暗号化してから
ソケットに送り、受け取ったデータは復号化する必要が
あります。これを全部やるのはとてもとても面倒なので、
モジュールを使いましょう。

まず、OpenSSL (http://www.openssl.org) をインストール
してください。で、
    http://www.cpan.org/modules/by-module/Net/
から Crypt-SSLeay モジュールを入れて下さい。これは LWP を
使うことを前提としたもののようです。

あるいは、Crypt-SSLeay モジュールの代わりに Net::SSLeay
というモジュールもあり、socket like に使えますが、現在は
保守されていないのかもしれません。

# http://www.cpan.org/modules/by-module/Net/Crypt-SSLeay-0.23.readme
# http://www.cpan.org/modules/by-module/Net/Net_SSLeay.pm-1.05.readme

なお、どちらも使ったことがないので、上に書いたことは
全て想像です。成功したか失敗したか結果を教えて下さい。

>>1844 ふじ
そうか、undef っちゅうのがありましたね…。

>>1846 rosegarden
これとは逆に、use vars すると warning が出なくなって
困ったことがあります (そのときは warning を出してほしかった)。

No. 1850 # whoisおしえてください 2001/03/23 (金) 16:43:32
whoisのプログラムをプログラムソースを探しているのですが、
どちらにあるかご存知ありませんか?
できればperlがいいのですが。

よろしくお願いいたします。

No. 1851 # 68user 2001/03/23 (金) 17:38:02
>>1850 whoisおしえてください
> whoisのプログラムをプログラムソースを探しているのですが、
    perl 版
        http://ring.asahi-net.or.jp/pub/lang/perl/CPAN/authors/id/D/DH/DHUDES/

    ついでに C言語版 (FreeBSD の whois。最近のは IPv6 化されています)
        http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/usr.bin/whois/whois.c

    whois プロトコル
        http://ring.asahi-net.or.jp/pub/doc/RFC/rfc1834.txt

てなところでしょうか。

No. 1852 # d-jiro 2001/03/23 (金) 23:08:37
>>1849 68user
>http://www.cpan.org/modules/by-module/Net/
>から Crypt-SSLeay モジュールを入れて下さい。これは LWP を
>使うことを前提としたもののようです。

こちらの方法で試してみることにします。

おそらく数日後に結果が報告できると思います。
つまづきながらですが、また質問させていただくかもしれません。
ありがとうございました。

No. 1853 # PHP 2001/03/25 (日) 03:06:26
こんばんは、現在検索エンジンを作成中ですが、キーワード入力の所で
いきなりつまずいています。
良く検索エンジン(goo,infoseek)等で検索文字を複数キーワード入力
し、キーワード間はスペースもしくは”|”パイプで区切る事をします。
単一キーワードは簡単に出来るのですが、このスペース区切りで
複数キーワードを引数にする方法がわかりませんが、宜しければお教え
いただけないでしょうか?

No. 1854 # d-jiro 2001/03/25 (日) 20:00:22
先日HTTPS接続のことで質問したものです。

HTTPS相手のPOSTでのCGI接続は、
Crypt-SSLeayモジュールを導入し、
LWPを使うことで解決しました。
部分的な引用でわかりにくいかもしれませんが、

$req = HTTP::Request->new( POST => "$url" );
$req->content_type('text/plain');
$req->content('$postdata');

とすることで、HTTPSだと意識することなく
レスポンスをもらうことができました。

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

No. 1855 # 68user 2001/03/26 (月) 22:55:38
>>1854 d-jiro
> HTTPS相手のPOSTでのCGI接続は、Crypt-SSLeayモジュールを導入し、
> LWPを使うことで解決しました。
それはよかった。こちらの環境でも試してみましたが、
うまくいったようです。

>>1853 PHP
> 一キーワードは簡単に出来るのですが、このスペース区切りで
> 複数キーワードを引数にする方法がわかりません
複数キーワードに分割というのは
    $keyword = 'foo bar baz';
    @keywords = split(/\s+/, $keyword);
といったことですか? あるいは、複数のキーワードで検索するという
ことですか? 後者ならば
    http://wakusei.cplaza.ne.jp/twn/wwwsrch.htm
というのが参考になるかもしれません。

この CGI スクリプトは素直な書き方になっていますが、サーバへの
負荷はかなりのもので、実用には向きません。

最初のとっかかりとして、参考程度にとどめておくのがいいでしょう。
高速化のヒントは eval です。

No. 1856 # 68user 2001/03/27 (火) 00:02:52
http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse
    ・環境はできるだけ詳しく
    ・マルチポスト禁止
    ・回答をもらったら結果を報告する
という注意点を追加しました。この場でいちいち注意したくはないので、
質問する前に是非ご一読下さい。

また、各メッセージの「No.1504 # 68user」などという表示の「#」を
クリックすると、
    http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=1500-1600#1504
というリンクに飛ぶようにしました。

# 更新履歴:
# http://X68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/cgi-bin/wwwboard.cgi

やはり設計が甘かったようで、この掲示板に美しく機能拡張するのは
もう無理みたいです。スクラッチから書き直したいけど、きれいに
書ける自信がない…。

No. 1857 # ケンMK2 2001/03/27 (火) 18:37:47
初めて書き込みをします。
早速ですが質問があります。

現在osをredhat6.2Jでsendmail8-9-3を使いメールサーバーを構築中です。
そこでcgiを使いメールを発信させると受信したメールのヘッダーのRecievedの部分の
Fromがnobody@localhostとなってしまいます。。
こちらとしてはホストのアドレスを載せたいのですが・・・。

cgiは、

#! /usr/bin/perl

$toname = 'xxx@aaa.bbb';
$fromname = 'yyy@ccc.ddd';
    open(MAIL, "| /usr/lib/sendmail -t -i -f yyy") || die;
    print MAIL "from:$fromname\n";
    print MAIL "to:$toname\n";
    print MAIL "Subject: TEST\n";
    print MAIL "Content-Type: text/plain;\n\n";
    print MAIL "TEST\n";
    close(MAIL);

print "Content-type: text/html\n\n";
print <<END_OF_DATA;
<HTML>
<BODY>SendMail $err</BODY></HTML>

END_OF_DATA

exit;

fromで指定したほうがもちろんサーバー側で,toで指定した方がクライアント側です。
sendmail.cfの編集にはsendmail.defを使っています。

はたしてcgiが悪いのかsendmailの設定がまずいのでしょうか?
sendmail.defの設定がまずいなら一体どこを変えればいいのか。
ご教授の程をお願いいたします。

No. 1858 # 68user 2001/03/27 (火) 20:26:52
>>1857 ケンMK2
> Fromがnobody@localhostとなってしまいます。。
これってやっぱりまずいのかなぁ? Received に名前解決不可能な
サーバ名が書いてあるメールって結構ありますよね。でも、それは
ファイアウォールの中からだから許されるのかな。さすがに
localhost はまずいかもしれない。

sendmail をまともに管理したことがないため正しい解決策はわかり
ませんが、手元にある sendmail.def (sendmail-v8.def をいじった
もの) には、
    OFFICIAL_NAME='foo.bar.com'
とあります。その他は特に設定していません。それを元に生成した
/etc/sendmail.cf には
    Djfoo.bar.com
と書いてあります。
    Dj(サーバの FQDN)
ですね。

あと、ユーザ名が nobody になるのもどうなんでしょうねぇ。
他の行に envelope from yyy などと -f で指定したユーザ名が
書いてあると思うので、それはそれでよいような気もするんですが…。
ちなみに手元の環境でも envelope from nobody となりますが、
僕がいいかげんに管理している sendmail なので、正しいか
どうかはかなり怪しいです。

No. 1859 # ふくし 2001/03/27 (火) 20:42:53
ケンさん>

わーい。回答が書けるー
わたしは、このようにしています。

$from = "kaori.iida\@morning.musume";
$to = "natsumi.abe\@morning.musume";

open MAIL, "|/usr/local/bin/nkf -j |/usr/sbin/sendmail -t -f $from" or die $!;
print MAIL <<EOM;
To: $to
From:$from
Subject: こんにちはー
元気だべさ。
EOM
close MAIL;

これで、次のようなメールが届きます。

To: natsumi.abe@morning.musume
From: kaori.iida@morning.musume
Subject: こんにちはー

元気だべさ。

ポイントは、-f パラメタで渡すのはエラーのときの戻りメールの宛て先で、
From: フィールドをメールの中に再度書かないといけないようです。
なお、スクリプトは EUC で、メールは JIS でないと文字化けするので、
nkf -j をかましています。

No. 1860 # 68user 2001/03/28 (水) 02:53:42
>>1858 68user
>> Fromがnobody@localhostとなってしまいます。。
> これってやっぱりまずいのかなぁ? Received に名前解決不可能な
> サーバ名が書いてあるメールって結構ありますよね。でも、それは
> ファイアウォールの中からだから許されるのかな。さすがに
> localhost はまずいかもしれない。
jp.FreeBSD.org の sendmail 君が付けた received も localhost に
なっていました。少なくともあそこは変な設定になってはいない
だろうということで、問題ないんじゃないでしょうか。

No. 1861 # すな 2001/03/28 (水) 21:56:36
質問では有りませんが、気になったもので・・・

自分の借りているレンタルサーバーのログに以下のような行がありました。

xxx.xxx.xxx.xxx - - [28/Mar/2001:20:00:52+0900] "GET http://www.intel.com/ HTTP/1.1" 200 1846 "-" "Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)"

これってどう解釈すればいいのでしょう?
当然ですが該当するURLにファイルはありません。

試しに自己保有のLinux版Apacheに telnet でいろいろ試してみましたが、
ステータス 200 が出ることは有りませんでした。

単にサーバーのログ記録ミス(エラー?)なのでしょうか?
こちらでも、こんなログが残る事は有りましたでしょうか?
なんとなく気持ちが悪いので、判る方がいらっしゃれば教えてください。

No. 1862 # 68user 2001/03/28 (水) 22:17:58
>>1861 すな
> 試しに自己保有のLinux版Apacheに telnet でいろいろ試してみましたが、
> ステータス 200 が出ることは有りませんでした。
FreeBSD 4.1-RELEASE + apache-1.3.12 で、
    GET http://www.intel.com/ HTTP/1.0
でステータス 200 が出ました。ブラウザを普通に使っていれば、
PATH は必ず / から始まるはずですが、先頭が / でない PATH を
要求すると 200 が返るんですね。これって仕様かしら?

No. 1863 # すな 2001/03/28 (水) 23:46:17
>>1862 68user
あら・・・
環境が関係するようですねぇ。

Vine Linux 1.1CR
Server version: Apache/1.3.3 (Unix) (Red Hat/Linux)
な環境で、
$ telnet localhost 80
GET http://www.yahoo.co.jp/ HTTP/1.0
とすると、
HTTP/1.1 302 Found が返り…

GET http://www.yahoo.co.jp/ HTTP/1.1
とすると、 400 Bad Request が返りました。

最初のログでは、HTTP/1.1 となっていたのに何故?
アクセス元は、JPNICとINTERNICで調べられなかったので、新手の
攻撃かとも考えましたが違うようですね。

このログが出たApacheのバージョンは、Server: Apache/1.3.6 (Unix)
でした…

さらに上のサーバーで、
GET http://www.yahoo.co.jp HTTP/1.0
としたら、/ にした際のドキュメントが返って来ました。
もう一つおまけにWin版1.3.12のApacheでもステータス200で同じ動作でした。
#この動作は何???

う〜ん、すっきりしないなぁ…
ともあれ試してもらってありがとうございました。
# サーバーの管理者に聞けば判るのかなぁ…

No. 1864 # 68user 2001/03/29 (木) 03:17:23
>>1863 すな
> GET http://www.yahoo.co.jp/ HTTP/1.1
> とすると、 400 Bad Request が返りました。
HTTP/1.1 では、Host ヘッダが必須ですが、これは大丈夫ですか?

    http://X68000.startshop.co.jp/~68user/net/http-4.html
        なお、HTTP/1.1 を使う場合は Host ヘッダを必ず付けなくてはいけません。

> / にした際のドキュメントが返って来ました。
うちもそうでした。

apache のバージョンに依存するようなので、本当のところを
調べたければ http://www.apache.org/websrc/viewcvs.cgi/
更新履歴を調べるのがよさげですが、時間がとれない…。

あるいは src/CHANGES に、変更理由が書いてあったりするかも
しれません。

No. 1865 # はてな 2001/03/29 (木) 09:38:10
初めまして。
UNIXは、初めて触ってたのですが、本やHPで調べても答えがわからないので、質問させてください。

リモートで、クライアントのWin98にX for Windowsをインストールしましたが、文字化けを起こしました。FON形式に変換されています。
相手のソラリスにはOpen WindowとX Windowがインストールされてます。
クライアントがアクセスするとOpen Windowが立ち上がるよう、設定されていましたので、
/usr/openwin /bin/openwin

/usr/openwin /bin/Xに書き換えたんですが、状態は相変わらずです。
文がおかしいのでしょうか?

よろしくお願いします。

No. 1866 # なべぞう 2001/03/29 (木) 12:57:42
はじめまして。突然ですが、ポート番号の対応表について質問させ
てください。

こちらのサイトに「Windows なら C:\windows\services です。
ここに載っているプロトコルは「well-known port」と言えるでし
ょう。」とあります。

しかし、C:\windows\servicesが見当たりません。なお私はwin
NTを主に使用しています、バージョンによって異なるものなんで
しょうか!?

No. 1867 # すな 2001/03/29 (木) 13:40:20
>>1864 68user
>HTTP/1.1 では、Host ヘッダが必須ですが、これは大丈夫ですか?
あたたた…
忘れていました。
で、host www.yahoo.co.jp:80 として再度やってみましたが同じ結果でした。
サーバー管理者へメールで問い合わせてみましたので解決したら報告します。
・・・と書いている所へ管理者からメールが。

クライアントがURL欄に「http://www.intel.com/http://www.intel.com/
と誤って記入すると、そのようなログが記録されます。
との返答。「えっ?」と思いながらやってみると、

GET http://www.yahoo.co.jp HTTP/1.1
host www.yahoo.co.jp:80

ログ内容
"GET http://www.yahoo.co.jp HTTP/1.1" 400 387 "-" "-"

/ からはじまらないパスを記録させる事は出来ましたが、やはり
ステータス 400 でした・・・
う〜ん、眠れなくなりそうなんでこの件は諦めます(笑)

>http://www.apache.org/websrc/viewcvs.cgi/
↑これは知りませんでした。時間があるときにじっくり見てみます。
# いつもながら何かしら勉強させて頂いてますm(_ _)m

>>1866 なべぞう
WinNTの場合は、C:\WinNT\system32\drivers\etc\SERVICES
です。このフォルダには、HOSTS や LMHOSTS も存在します。
スタートメニューの「検索」を最大限に活用すると便利ですよ。

No. 1868 # 68user 2001/03/30 (金) 00:25:20
/~68user/unix/pickup に早稲田大学からの連続アクセスがあり、OS の
リソースを食い潰して open・fork などに失敗してサーバエラーが頻発
していました。load average が 20 近くまで上がってました。

とりあえず pickup は使用不可としましたので、あしからず。
同時に実行するプロセス数を制限する機能を追加したら使用可能に
します。

>>1867 すな
> host www.yahoo.co.jp:80
ではなく、host: www.yahoo.co.jp:80 です。`:' が足りません。

> クライアントがURL欄に「http://www.intel.com/http://www.intel.com/
> と誤って記入すると、そのようなログが記録されます。
> との返答。「えっ?」と思いながらやってみると、
apache-1.3.12 では、ログに
    "GET /http://www.yahoo.co.jp HTTP/1.0" 404
と吐かれていました。その管理者の返答はほんとかなぁ? もし本当
ならば、apache にバグがあって、apache-1.3.12 では修正されて
いるということですね。

> WinNTの場合は、C:\WinNT\system32\drivers\etc\SERVICES です。
なるほど。この文章をそのまま該当部分に追加してよいですか?

>>1865 はてな
> リモートで、クライアントのWin98にX for Windowsをインストール
> しましたが、文字化けを起こしました。FON形式に変換されています。
文字化けの件はわかりませんが、これは X for Windows という商品名の
Windows 用 X サーバですか? Windows 側で X サーバが起動しているなら、
Solaris 側で openwin や X を実行する必要はありません。なぜなら、
openwin や X は X サーバだからです。Solaris 側で実行すべきなのは
kterm などの X クライアントです。

でなくて、なにかしらの仕組みがあって Solaris 側で X サーバを
実行すれば Windows 側で表示されるようなアプリケーションで
あるなら失礼。そのようなアプリは さらに輪をかけてわかりません。

No. 1869 # すな 2001/03/30 (金) 13:46:47
>>1868 68user
>ではなく、host: www.yahoo.co.jp:80 です。`:' が足りません。
ステータス 400 はこれが原因でした。嘘書いてごめんなさい。m(_ _)m

で、該当サーバーに
GET http://www.yahoo.co.jp:80 HTTP/1.1
host: www.yahoo.co.jp:80
とした所、
"GET http://www.yahoo.co.jp:80 HTTP/1.1" 200 1934 "-" "-"
のログが記録された事を確認しました。
この結果は、68userさんと同じくドキュメントルートが出力されました。
Apache1.3.3の方も同じ結果でした。

>>1862 68user
>PATH は必ず / から始まるはずですが、先頭が / でない PATH を
>要求すると 200 が返るんですね。これって仕様かしら?
動作からするとその様ですね。

>>1868 68user
>その管理者の返答はほんとかなぁ?
Apacheの出力結果を見ると管理者の言っている事は間違っているようです。
管理者といってもテクニカルサポートの「誰か」だし、適当にあしらわれ
たのかも?

>なるほど。この文章をそのまま該当部分に追加してよいですか?
もし、サービスパックなどにより変更される場合は判りませんが、
少なくとも自分の環境では上記のフォルダに存在します。
WinNT 4.00.1381 SP5

ちなみに、このフォルダには以下のファイル群が含まれます。
HOSTS
LMHOSTS
NETWORKS
PROTOCOL
SERVICE

drivers\etc
というフォルダに格納するあたり、UNIXを意識しつつドライバーでは
無い内容を格納するのは、M$の苦しい所でしょうか…読みすぎ?;-p

No. 1870 # hsj 2001/03/30 (金) 20:49:22
>>1869 すな
> Apacheの出力結果を見ると管理者の言っている事は間違っているようです。
おそらくそのユーザは、外部利用可能なプロキシを探して
そのサーバにアクセスしたんじゃないでしょうか。
例えばIEにプロキシとしてそのサーバのIPアドレスと
ポート80をセットして、適当なサーバにアクセスしてみると
リクエストラインはこういう感じ↓になるので、
GET http://www.yahoo.co.jp/ HTTP/1.0
そう言うログが残ることになると思います。

No. 1871 # すな 2001/03/30 (金) 21:59:39
>>1869 すな
はじめまして>hsjさん
>おそらくそのユーザは、外部利用可能なプロキシを探して
おぉ!なるほど。
IE5でプロキシ設定を施してアクセスした所、最初に疑問になったログ
結果と、ブラウザバージョン以外同じ結果となりました。
はぁ、なんかすっきりしました(笑)

片っ端からアクセスして調べているんでしょうか?
ご苦労様なことです(^^;

自分はフレッツISDN接続なんですが、ここ3〜4ヶ月ルーターのログに
明らかにアタックと思われる攻撃が増えたので、過敏になっていました。
情報ありがとうございました。>hsjさん

No. 1872 # ケンMK2 2001/03/30 (金) 22:39:59
どうもレスが遅くなり申し訳御座いません
>>1860 68user
>jp.FreeBSD.org の sendmail 君が付けた received も localhost に
>なっていました。少なくともあそこは変な設定になってはいない
>だろうということで、問題ないんじゃないでしょうか。
へ〜そうなんですか・・・。
私もあれから試行錯誤しましたが、どうにもならず、結局気にしないこと
にしました(笑)
と言っても諦めるわけでなく、sendmail.cfを直接弄って何とかできるの
では・・・と思いたちましたので、そちらの方法をしばらく模索していこ
うと思います
それではご迷惑をお掛けいたしました

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

No. 1873 # dio [E-mail] 2001/03/31 (土) 02:34:14
こんにちは、初めまして。
排他処理のことを読ませていただきまして、
フリーのCGIスクリプトに自分でシグナルに関する部分を追加しようと思いました。
ここでは
$SIG{PIPE} = \&lock_off;
というようにしておられますが、他のところでは、
$SIG{'PIPE'} = 'lock_off';
といった感じに書いていました。
これらは同じ意味なのでしょうか?(\&というのがよくわかりません)
それから、こういったハンドラの定義は、ソース中のどの位置に書いても
同じなのでしょうか。最初の方に書いた方がいいのでしょうか?
そして、ハンドラの中で変数の値を参照する場合、
その変数の初期化前にそのハンドラを書いて問題ないでしょうか?
sub lock_off {
      if ($lockkey) { &unlock; }
      exit;
}
・・・
$lockkey = 1;
といった感じで。
Perlはまだよくわかっていないので、常識なことなのかもしれないですが、
よろしくご教授お願いします。

No. 1874 # なるっち 2001/04/01 (日) 01:01:27
はじめまして。
CGIで環境変数を取得していると、「(compatible; MSIE 5.5; 〜〜」等で表示されるはずが、「好きな名前〜〜〜」でアクセスす人がまれにいるのです。これはどううことなのでしょうか?

No. 1875 # dio [E-mail] 2001/04/01 (日) 15:10:12
>CGIで環境変数を取得していると、「(compatible; MSIE 5.5; 〜〜」
>等で表示されるはずが、「好きな名前〜〜〜」でアクセスす人がまれにい
>るのです。これはどううことなのでしょうか?
クライアント(ブラウザ)がサーバに送るUser Agent 文字列を自由に設定できるソフトを使っているからではないでしょうか。
私の使っているフリーのタブブラウザ、「DonutR」でも、UserAgentを
自由に設定できます。

No. 1876 # 68user 2001/04/01 (日) 16:24:11
>>1873 dio
> $SIG{PIPE} = \&lock_off;
\& は関数へのリファレンスです。ちなみに
    $SIG{PIPE} = sub { unlink($lock_file); exit; }
と等価です。

> $SIG{'PIPE'} = 'lock_off';
これだと、シグナルハンドラ lock_off の関数定義が同一ファイル
内にないといけません。別ファイルに sub lock_off を書いて、
それを require している場合は動かないということです。

関数へのリファレンスを使えば、どこで関数が定義されて
いようと動きます。

これらの事柄はラクダ本に書いてありますので、もちお持ちで
ないなら、購入されることをお薦めします。

> ハンドラの中で変数の値を参照する場合、その変数の初期化前に
> そのハンドラを書いて問題ないでしょうか?
これは、ハンドラ特有の問題ではなく、関数一般の話になります。
    #!/usr/bin/perl
    &lock_off;
    sub lock_off { print $lockkey }
    $lockkey = 1;
    exit;

    #!/usr/bin/perl
    $lockkey = 1;
    &lock_off;
    sub lock_off { print $lockkey }
    exit;
では、前者はよろしくないことはわかりますね。

シグナルハンドラの場合も、%SIG にセットしてしまうとその後いつ
シグナルハンドラが呼ばれるかわからないので、%SIG にセットする
前に必要な変数を全て設定しておきましょう。

No. 1877 # dio [E-mail] 2001/04/01 (日) 17:12:52
>\& は関数へのリファレンスです。ちなみに
>・・・・・・
>関数へのリファレンスを使えば、どこで関数が定義されて
>いようと動きます。
なるほど
そういう違いなのですか。

>シグナルハンドラの場合も、%SIG にセットしてしまうとその後いつ
>シグナルハンドラが呼ばれるかわからないので、%SIG にセットする
>前に必要な変数を全て設定しておきましょう。
わかりました。
どうもありがとうございます。

No. 1878 # 68user 2001/04/03 (火) 17:40:08
http://messages.yahoo.co.jp/bbs?.mm=CP&action=m&board=1835092&tid=echoa4ka4da4a4a4f&sid=1835092&mid=4
> ↓には、「ping への応答」と書いてます。
> http://www.nspl.co.jp/Solaris/Security/inetd.html

誤りです。ping に応答するのは ICMP reply です。TCP/UDP の echo は、
    http://ring.ocn.ad.jp/pub/doc/RFC/rfc862.txt
を参照のこと。
    A very useful debugging and measurement tool is an echo service.
ってことですね。人様が直接使うものです。

…と yahoo BBS に書こうと思ったけどできなかったので、どなたか
伝えて下さい。

No. 1879 # 68user 2001/04/06 (金) 00:15:45
>>1868 68user
> とりあえず pickup は使用不可としましたので、あしからず。
> 同時に実行するプロセス数を制限する機能を追加したら使用可能にします。
使用可能になりました。ちゃんと制限が効いてるかどうかは
試してませんが。

>>1878 68user
> …と yahoo BBS に書こうと思ったけどできなかったので、
> どなたか伝えて下さい。
どもです>dio さん (ですよね?)

No. 1880 # dio [E-mail] 2001/04/06 (金) 00:54:56
>どもです>dio さん (ですよね?)
あ、はい
このページ参考にさせてもらったり、
お世話になったので。

No. 1881 # akihiro 2001/04/06 (金) 11:50:53
ご存知であれば 教えてください
psコマンド(ps -l)を実行したときの C 項目の数値の意味
なんですけどマイナス値のプロセスがあったのですが
どのような状態を意味するのでしょうか?

No. 1882 # クワ [E-mail] 2001/04/08 (日) 17:27:09
教えていただきたいことがあります。
UNIXについてはほとんど初心者なのですが、あるとき急に管理をしろ!
と言われてしまいました。はじめはなんのトラブルもなかったのですが、
何日か前に急に他のマシンから自マシンへtelnet接続ができなくなって
しまいました。
    原因はなんなのでしょう?
機種は
  SUN ULTRA60 Solaris2.6が入ってます。もちろん自マシンにログイン後
自マシンの他のユーザへのtelnetでのログインもできないのです。
お願いします。

No. 1883 # YOUKO 2001/04/08 (日) 17:51:12
はじめまして、YOUKOと申します。
C-ISAMを使ってAPLを作成したいのですが
初めてで右も左もわかりません。
どこか初心者用のHPありませんか?
OS:Solaris7です。

No. 1884 # 68user 2001/04/08 (日) 23:29:37
>>1881 akihiro
> psコマンド(ps -l)を実行したときの C 項目の数値の意味
> なんですけどマイナス値のプロセスがあったのですが
OS は何ですか? FreeBSD には C という項目はないように
思えます。Solaris2.6 では「スケジューリングのための
プロセッサ利用率、ただし obsolete」と man に書いて
あったような気がしますが、それ以上の事はわかりません。

>>1882 クワ
> 何日か前に急に他のマシンから自マシンへtelnet接続が
> できなくなってしまいました。もちろん自マシンにログイン後
> 自マシンの他のユーザへのtelnetでのログインもできないのです。
それは、問題のマシンで
    % telnet localhost
でログインできないということですね?

全体的に情報が不足しています。「できない」とはどういう意味ですか?
何かエラーメッセージが出ますか? 何秒か待たされたりしますか?
login: プロンプトは出ますか?

一般的には inetd が telnet ポートを見張り、接続があると inetd が
telnetd を実行し、telnetd が認証を行います。もし
    % netstat -a | grep telnet
    tcp4 0 0 *.telnet *.* LISTEN
という出力が出ないならば、telnet ポートを監視するサーバがいない
ということなので、inetd の問題です。/etc/inetd.conf をチェック
しましょう。

他にも tcpwrapper が接続を弾いている、などの可能性もありますが、
そこらへんは /var/log/ の下のログを見ましょう。telnet した後、
ls -lt /var/log すれば、最終更新時刻順にファイル一覧が表示
されますので、最も最近に更新されたログファイルの中を見れば
何かメッセージが書いてあるかもしれません。

>>1883 YOUKO
> C-ISAMを使ってAPLを作成したいのですが
C-ISAM という物を知らないのですが、Informix の DB 関係の
ライブラリか何かでしょうか。そういうものは Informix の出して
いるマニュアルを読むのが早道かと思います。

# 同様に、個人が提供している Oracle の情報も少ないですね。

No. 1885 # akihiro 2001/04/09 (月) 09:14:41
>> psコマンド(ps -l)を実行したときの C 項目の数値の意味
>> なんですけどマイナス値のプロセスがあったのですが
>OS は何ですか? ..(略)..、それ以上の事はわかりません。
HP-UNIXです。私なりに調査していますので解りましたら
載せさせていただきます。

No. 1886 # chie 2001/04/09 (月) 15:02:13
排他処理のページを見て質問なのですが、シグナル処理でCGIを終了
させたくない場合はどうすればよいのでしょうか?
シグナルを無視みたいなことはできないんでしょうかね??

よろしくお願いします。

No. 1887 # 68user 2001/04/09 (月) 18:59:22
>>1886 chie
> シグナルを無視みたいなことはできないんでしょうかね??
perl なら
    $SIG{QUIT} = 'IGNORE';
などとすれば無視できます。ただし、SIGKILL と SIGSTOP
だけは無視できません (ハンドラの設定も不可)。

No. 1888 # dio [E-mail] 2001/04/10 (火) 17:15:22
>ただし、SIGKILL と SIGSTOP
>だけは無視できません (ハンドラの設定も不可)。
横からすみませんが、無視できずハンドラの設定不可な
シグナルは、どのような意味があるのでしょうか?
(なぜ送られてくるのでしょうか?)

No. 1889 # 68user 2001/04/10 (火) 22:28:55
>>1888 dio
> 無視できずハンドラの設定不可なシグナルは、
> どのような意味があるのでしょうか?
シグナルをブロックしたプログラムが誤って無限ループしてしまったら
止める術がなくなります。

なので、プロセス側から制御できない SIGKILL や SIGSTOP という
シグナルを飛ばすことで、OS に強制的にプロセスを殺したり、動作を
止めたりするわけです。例をあげると、
    #!/usr/bin/perl
    $SIG{TERM} = sub { print "TERM!\n" }; # kill コマンド対策
    $SIG{INT} = sub { print "INT!\n" }; # Ctrl-C 対策
    while (1){
            printf("%d\n", $i++);
            sleep 1;
    }
というプログラムを実行すると、Ctrl-C や kill プロセス番号 で
終了させることはできません。しかし Ctrl-Z で動作を止めたり、
kill -9 (=kill -KILL) でプロセスを殺すことはできます。

# 実際は他にもシグナルはありますので、kill -HUP などで
# 殺すことが可能ですが、全てプログラム側でブロック可能です。

なお、SIGINT や SIGTERM を受けると、ファイルなどの後始末を
行ってから終了するプログラムは多いです。なので、いきなり
SIGKILL で強制終了させるのはおすすめできません。まず SIGTERM や
SIGINT を試して、それでも死ななければ SIGKILL を使うように
して下さい。

No. 1890 # dio [E-mail] 2001/04/11 (水) 14:45:02
えーと、私は何か勘違いをしていたかもしれません;

>なので、プロセス側から制御できない SIGKILL や SIGSTOP という
>シグナルを飛ばすことで、OS に強制的にプロセスを殺したり、動作を
>止めたりするわけです。
これはわかります。SIGKILL、SIGSTOPの必要性はわかるのですが、
プロセスから制御できない物をなぜシグナルとして送る
必要があるのだろうかと思ったのです。
私はOSがプロセスにSIGKILL や SIGSTOPをとりあえず送って、
強制終了させる物と思っていたのですが、この考えが方が間違いでしょうか?

No. 1891 # 68user 2001/04/11 (水) 23:42:45
>>1890 dio
ん〜、SIGKILL, SIGSTOP の必要性はわかるが、ブロックできないんだから
「シグナル」として扱うのは変ではないか。SIGKILL, SIGSTOP と同等の
機能を持たせたシステムコールを新設した方がよいのではないか、という
ことでしょうか?

じゃなくて、OS が SIGKILL や SIGSTOP を送るのはわかるが、
コマンドラインで kill コマンドを使って SIGKILL, SIGSTOP を
送れるのは変ではないか、ということですか?

No. 1892 # dio [E-mail] 2001/04/12 (木) 14:09:56
前者のほうにちかいです
プロセスを殺すのはOSなのですよね?
プロセスにSIGKILLやSIGSTOPが送られても
プロセスはそれに対して何も出来ないのなら、
なぜ送られてくるのかな?と。
プロセスはSIGKILLやSIGSTOPを認識出来ないのではないのですか?

No. 1893 # 68user 2001/04/12 (木) 14:47:46
>>1892 dio
> プロセスはSIGKILLやSIGSTOPを認識出来ないのではないのですか?
できないです。

OS はプロセスごとにシグナルのテーブルを保持しています。例えば
SIGTERM を無視する場合はテーブルの SIGTERM の項目を 1 に、
シグナルハンドラをセットする場合は、SIGTERM の項目にシグナル
ハンドラ (関数) のアドレスをセットする、というふうに。

で、シグナルが飛んできたら、OS は対象のプロセスのテーブルを
参照し、無視すべきか、ハンドラを実行すべきかなどを決めます。

しかし SIGKILL/SIGSTOP は、
    - テーブルの書き換えができない
    - シグナル発生時に OS がテーブルを参照することなくプロセスを操作する
のどちらかの理由のため (どっちが本当かは知りません)、プロセス
からブロックすることはできません。


だから、実際に OS が何かをプロセスに送っているわけではありません。

…で、回答になりましたか?

ちなみにシグナルは FreeBSD なら ここらへんで処理してます。
    http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/sys/kern/kern_sig.c?rev=1.115

No. 1894 # dio [E-mail] 2001/04/12 (木) 21:11:57
>で、シグナルが飛んできたら、OS は対象のプロセスのテーブルを
>参照し、無視すべきか、ハンドラを実行すべきかなどを決めます。
なるほど、シグナルを受け取るのはOSなんですか。

>だから、実際に OS が何かをプロセスに送っているわけではありません。
そうでしたか。
私の考え方がWindows的でした。
(WindowsのMessageのような物と考えてました;)

>…で、回答になりましたか?
はい、どうもありがとうございました。

No. 1895 # クワ [E-mail] 2001/04/14 (土) 18:24:57
>>1884 68user
>それは、問題のマシンで
> % telnet localhost
>でログインできないということですね?
お返事が遅くなってしまいました。すみません。
上記のように入力すると、
SunOS5.6
....(省略)普通といっしょ。

connection closed by foreign host.
といわれます。
UNIXの相当詳しい人に見てもらったのですが、ぜんぜんおかしい
部分がないとのことでした。

来週OSをインストールしなおすとその方がおっしゃっておりました。
ご迷惑をおかけしました。
また分からないことがありましたらよろしくお願いします。

No. 1896 # りんたろお。 [E-mail] 2001/04/17 (火) 19:42:34
初めまして。

現在文字コードの変換について色々と模索中です。で、
このページの過去ログを見つけたのですが、情報を
うまく理解することができなかったので質問させて
ください。

まずバックグラウンドとして、Solaris2.6のWebサーバを
今まで他の人が管理してきたものの引継ぎで管理する事
になったのですが、そのWebサーバは文字の変換に
/bin/iconvを利用しています。htmlファイルはeucJPで
かかれていました。さらにソースの中でMETAタグに
「charset=x-euc-jp」という記述がありました。
またユーザからの情報をCGIからOracle(Solaris2.6上)に
データを格納しています。この際CGIではeucからUTF-8に
変換を行なう記述がなされています。

# DBは個人的に触ることができない状態です。Solaris2.6
# の/bin/iconvを利用するところも変えられません。

通常インターネットを意識した時にはWindows環境(もち
ろんこの中にも色々ありますが)だけを意識するのではなく、
色々な環境を意識してhtmlファイルを書くべきなのだと
思うのです(私見?)。

前置きが長くなりましたが質問です。

1.ソースの中でMETAタグに「charset=x-euc-jp」という
記述がある場合、ブラウザのエンコードで「自動認識」を
指定していれば、ソースは読める状態で表示され、かつ
フォームに入力した文字列はeucJPでWebサーバに送信されて
くるものだと信じているのですが正しいのでしょうか。

2.また正しい場合、表示を強引にSJISなどにしてフォーム
に入力した場合にはeucJPで送られてくるのでしょうか。
それともSJISなのでしょうか。(まだ環境を自由にできない
ので自分では確認できません。)

3.半角が入力されてきた場合にはどのように対処すれば
いいのでしょうか。

4.JIS X 0208の13区、89〜92区、115区〜119区(換算)の
文字を入力するとエラーで返すようにしたいのですが、CGI
でどのように記述すればいいのでしょうか。EUCコードで
ADA1〜ADFE、F9A1〜F9FE、FAA1〜FAFE、FBA1〜FBFE、FCA1〜
FCFE(全て16進数) は不可、のように文字コードそのもので
制限をかけるのでしょうか。Perlでこういった内容を書き
たいのですが、何か参考になるようなものがありましたら
お知らせください。

長い文章になりましたが、ご助力お願いいたします。

No. 1897 # 68user 2001/04/17 (火) 22:15:45
>>1896 りんたろお。
> 色々な環境を意識してhtmlファイルを書くべきなのだと
> 思うのです(私見?)。
このような考えの人が多ければ、UNIX 使いのような
マイノリティはもっと幸せになれるのですが、なかなか
そうもいかないようで…。

> 1 エンコーディング指定
x-euc-jp というのは、まだ EUC-JP というエンコーディング名が
IANA に登録されていなかった頃の暫定エンコーディング名ですので、
現在は EUC-JP とするのが適当です。

ただし、Netscape Navigator 3.x などの古いブラウザでは EUC-JP を
認識できないという問題がありますが、「新しめのブラウザを使え」と
言えるような立場なら EUC-JP にする方がよろしいです。

なお、META でなく、CGI プログラムが出力するヘッダで
    Content-type: text/html; charset=EUC-JP
とした方がよいです。META は、ヘッダにエンコーディングを
明示できない場合の代替手段ですので。

ただし、ブラウザは間抜けなので、エンコーディングを明示しても
自動認識に失敗することはあります。

> 2 フォームのエンコーディング
基本的に、フォームのあるページのエンコーディングで
フォームのデータが送られてきます。少なくとも Netscape
Navigator と Internet Explorer はEUC-JP なページの
フォームで入力すると、入力内容を EUC-JP で送ります。

ただし、規格として決まっているわけではありませんので、
そうでないブラウザもあります (Lynx がそうかな)。

なので、入力データは jcode.pl などで EUC-JP や Shift_JIS に
変換するのがよいでしょう。1行追加するだけなので、たいした
手間ではないです。

> 3 半角入力
これは、半角カナということですか? なら 4 へ。

> 4 機種依存文字
    http://X68000.startshop.co.jp/~68user/webcgi/char-code-2.html
が参考になるかと思います。この掲示板では機種依存文字を自動変換
していますが、「機種依存文字があればエラー」とするのは簡単です。
    http://X68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/cgi-bin/wwwboard.cgi
の、sub conv_wrong_char あたりをどうぞ。

No. 1898 # ふくし [E-mail] 2001/04/19 (木) 05:56:45
ずっと以前から悩んでいたことなのですが、どこで聞いていいかわからず、
ここで書きます。よろしくお願いします。

会社の FreeBSD で Perl を使っていますが、nfs mount でいろんな
マシンで同じスクリプトを使えるようになっていますが、
あるスクリプトが急に text file busy と言われます。

語感からするとエディット中に実行したとか、
複数の人が一つのスクリプトを実行しているとか
いう感じですが、そうなっていても実行できるスクリプトは
実行できますし、どう考えてもヒマなファイルが同様の原因で
怒られます。

で、こうなってしまったら、件のスクリプトのディレクトリに行き
% cp busyscript foo
% rm busyscript
% mv foo busyscript
% chmod 755 busyscript
これで百発百中修復します。

なぜなんでしょう。どなたかご教示をお願いします。

No. 1899 # kate [E-mail] 2001/04/19 (木) 10:54:26
つい最近、perlを勉強しはじめた者です。本に掲載されているごく
簡単な例を実際サーバにUPして試しているのですが、
エラーメッセージが出てしまい、困り果てています。
よろしければ、アドバイスをお願い致します。

#!/usr/local/bin/perl5
print "what is your name?";
$name = <STDIN>;
chomp($name) ;
If ($name eq "kate") {
    print "Hello,kate! How good of you to be here!\n";
} else {
    print "Hello, $name\n";
}

以上です。
エラーメッセージは
syntax error at test.cgi line 7, near "}"
Execution of test.cgi aborted due to compilati
on errors.
です。

No. 1900 # りんたろお。 2001/04/19 (木) 12:07:11
>>1899 kate
(あれ、使い方がわからない…。(>_<))
kateさんのPerlの質問ですが、5行目の「If」を「if」にすると
できますよ。あとついでなのですが、
            "what is your name?\n";
とすると良いですね!(^^ゞ

No. 1901 # りんたろお。 2001/04/19 (木) 12:09:00
>>1897 68user
ありがとうございます。これから試してみますので、結果が出たらまた
ご報告いたします。→みなさま。

No. 1902 # kate 2001/04/19 (木) 18:36:27
1900
りんたろお。さんありがとうございました。
ケアレスミスというか、本当にしょうもないミスだったの
ですね・・(^-^;
アドバイスありがとうございました!また、ヨロシクお願いします。

No. 1903 # しの 2001/04/21 (土) 04:29:07
はじめまして。
Perlのネットワークプログラムについての質問なのですが、

あるサーバからあるサーバへデータをそのまま送るだけなのですが、
        while (<$sock_recv>){
                print $sock_send $_;
        }
このときに受信側がユーザー操作によって受信をキャンセルされると、
>Can't use an undefined value as a symbol reference at ./test.pl line 46, <CLIENT> chunk 8322.
と、エラーが出てプログラムが強制終了してしまいます。
強制終了せずに、受信側の受信キャンセルを検出する方法がありましたら
是非おしえてください。よろしくお願いします。

No. 1904 # くみ [E-mail] 2001/04/22 (日) 00:43:44
sendmaiを使用して2カ所にメールを送るにはどうすれば良いのでしょうか?
open 〜 close を2度記述してもダメなのでしょうか。1度の記述だと正常に処理できるのですが2度の記述ですとうまくいきません。宜しくお願い致します、

open(MAIL, "| /usr/sbin/sendmail -t");
        ・〜・
close(MAIL);

No. 1905 # 68user 2001/04/22 (日) 01:39:33
>>1898 ふくし
samba を使っていませんか? よく知りませんが samba はファイルを
読み込み禁止でロックしっぱなし (?) にするようで、そのとき
ファイルを読もうとすると「Text file busy」となります。もし
そうなら http://www.samba.gr.jp で検索すると解決策が見つかると
思います。

もし NFS しか使っていないなら、解決策はわかりません。

>>1903 しの
print したデータを受け取る先のプロセスがいないと、print した
側には SIGPIPE が飛んできます。シグナルハンドラを設定して、
適切なエラー処理を行いましょう。

>>1904 くみ
> open 〜 close を2度記述してもダメなのでしょうか。
それでもよいですし、2箇所に送ったことが相手先に知られても
いいなら、
    print MAIL "To: foo@hoge, bar@fuga\n";
でもいいです。

No. 1906 # 68user 2001/04/22 (日) 04:05:42
「ネットワークプログラミングの基礎知識」
    http://X68000.startshop.co.jp/~68user/net/
を CVS に追加しました。
    http://X68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/

$Id:$ を挿入しまくったので、もしソースと解説の行番号がずれて
いるかもしれません。見つけられた方はご指摘いただけると幸いです。

No. 1907 # くみ 2001/04/22 (日) 18:57:46
2カ所への送信はうまくいきました、有り難う御座いました。
ところが
またまたしつもんです。sendmailで指定する件名が送信先によって文字化けしてしまいます。日本語文字コードによるものでしょうが、対策は具体的にどのようにしたらよいのでしょうか。
$sb='あいうえお';
print MAIL "Subject: $sb\n";

No. 1908 # 68user 2001/04/22 (日) 19:28:28
>>1907 くみ
MIME encode する必要があります。
    http://X68000.startshop.co.jp/~68user/webcgi/mail-2.html#2
をどうぞ。

No. 1909 # hooma [E-mail] 2001/04/22 (日) 21:16:18
はじめまして

CGIを学んで1ヶ月の者です。
実は、仕事で少し面倒な依頼を受けて困っております。
内容はCSV形式のデータをPerlで読み取ってそれを
HTMLのテーブルに流し込むスクリプトなのですが、
慣れていないので思考停止をして進みません。

具体的なCSVデータの例ですが、

10,果物,りんご,ringo.html,ぶどう,budou.html,ばなな,banana.html,10,野菜,かぼちゃ,kabotya.html,なす,nasu.html,きゅうり,kyuri.html,魚,まぐろ,maguro.html,さけ,sake.html,10,肉,牛,usi.html,麺,ラーメン,ra-men.html,そば,soba.html,うどん,udon.html

まず、先頭に10があり、これは分類の区切りを示すヘッダーです。
次に果物でこれは、分類名です。
次にりんご、これは分類詳細名です。
つぎにringo.htmlでこれは分類詳細名のリンク先アドレスです。

このようなデータの並びですが、各分類と詳細項目は変動しますので
このテーブルのあるWEBページを毎回読み直す必要があります。

どうのようにしたらよいのでしょうか。
お助けください。

No. 1910 # 68user 2001/04/23 (月) 08:52:15
>>1909 hooma
どういう HTML を出力したいかが書いてないので、誰にも
正解は答えられないと思いますよ。CSV から読み込むだけなら、
「,」で split して、「10」が出てきたら新しいを配列を用意し、
次の「10」が出てくるまでその配列に push。そしたら1つの配列には
    「ヘッダ,分類名,分類詳細名1,リンク先1,分類詳細名2,リンク先2...」
という値が入るでしょうから、後は適当に処理すればよいでしょう。

No. 1911 # HELP [E-mail] 2001/04/25 (水) 13:40:30
fgetsとsscanfの使いかたがまったくわかりません。
誰か教えて下さい。
下のような問題をといています。
誰でもいいのでできれば解いてもらえませんか??

問題
1.ユーザーに1つの数の入力を求め、入力された数字を8進数表示、16進数表示するプログラムを作りなさい。

条件:main関数1つで作成する。
            gets(),scanf()は利用しないこと。
            扱う数字のさいだいは、int型で良い。
            printf()は用いてもよい。

No. 1912 # 68user 2001/04/25 (水) 15:42:38
>>1911 HELP
宿題なのでしょうから、自分でやりましょう。

「ここまで自分でやりましたが、〜がわかりません」なら
ともかく、「全くわかりません」では問題外です。

# 2ch に行けば、お姉さんやギコ猫が答えてくれますけどね。

No. 1913 # HELP [E-mail] 2001/04/25 (水) 23:27:14
確かに宿題みたいなものなんですが、ほんとに全然さっぱりなんです。
fgetsとsscanfがどういうものなのかだけでも教えてもらえませんか?
参考書など読んだのですが、どのように使えばいいのかわからないんです。
問題のプログラムは一応できたんですが、あっているのかもわからないし、
自分で作ったプログラムなのに理解できないんです^^;
誰かお願いしますm(_ _)m

No. 1914 # 68user 2001/04/26 (木) 18:51:33
>>1913 HELP
では、自分の書いたプログラムを見せて、「こことここがわからん」
「ここは、こういう意味だろうか?」と質問してみてはどうでしょうか。

課題のプログラムについて、知るべきポイントや勉強すべきポイントは
たくさんあります。だから世の中にはたくさん C の参考書が出回って
いる。それら全てを回答者に解説させようとせず、自分がどこまで
理解しているかを明らかにした上で、ポイントをしぼって質問する
のが「うまい質問の仕方」というものです。

No. 1915 # HELP 2001/04/27 (金) 01:07:37
次の問題のプログラムを作ってみましたが、コンパイルできません。
どこが間違っているのか教えて下さい。

入力された数字を2進数表示するプログラムを作成しなさい。
条件:main関数、2進数の文字列を返す関数の2つの関数で作成する。
            扱う数の最大は、int型でよい。

#include <stdio.h>

int sinnkeisann(int k);

main ()
{
    char buff[32+1];
    int k ,kotae;

    printf("整数値を入力して下さい>>>");
    fgets(buff,sizeof(buff),stdin);
    sscanf(buff,"%d",&k);
    
    kotae = sinnkeisann( k );
        
        printf("2進数表記>>>%d",kotae);

}

int sinnkeisann(int k)
{
    int a,i,answer;
    char retu[32+1];

    a=k;
        retu[32] = '\0';
    
    for(i = 0; i < 32; i++){
        if(i != 0 && a == 0){
            break;
        }

        if(a %2 == 0){
            retu[(32-1) - i] = '0';
        }
        else{
            retu[(32-1) - i] = '1';
        }
        a = a / 2 ;
    }
    answer = retu[0]+(32-1)-i+1 ;

    return answer ;
    
}
    

No. 1916 # 68user 2001/04/27 (金) 03:38:19
>>1915 HELP
FreeBSD 4.2-RELEASE ではコンパイルできましたよ。コンパイル
できない場合は、どういうエラーメッセージが出たかを書きましょう。

ところで、条件では「文字列を返す関数」となっているので、
    char *sinnkeisann(int k)
とすべきですね。

ただし、インデントだけはきっちりつけましょう。そのソースを
見る他人のためでもあり、3日後にソースを見直すかもしれない
自分のためでもあります。

No. 1917 # すな 2001/04/27 (金) 05:25:31
元質問
>>1861 すな
>>1870 で hsjさんに教えてもらった件ですがやはりそのようですね。
http://homepage1.nifty.com/yito/namazu/gbook/20010423.0840.html
といった記事を見つけました。よって、
>>1864 でのレンタルホスト管理者からのメールで
>クライアントがURL欄に「http://www.intel.com/http://www.intel.com/
> と誤って記入すると、そのようなログが記録されます。
はやはり間違いですね。

参考までに…(参考にもならないかな?)
# しかし最近不正な(と思われる)アクセス増えたなぁ…

No. 1918 # 紅の猫 [E-mail] 2001/04/27 (金) 19:24:05
>>1915HELP
文法的には間違ってないし、アルゴリズムも基本的には正しいです。(だけどね(^_^)ニヤリ
あとはintの符号有り、符号無しの違いに注意したほうがいいです。

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

No. 1919 # HELP 2001/04/27 (金) 22:04:17
プログラムを以下の様に直してみました。しかしコンパイルができません。

#include <stdio.h>

char *sinnkeisann(int k);

main ()
{
    char buff[32+1];
    int k ,kotae;
    
    printf("整数値を入力して下さい>>>");
    fgets(buff,sizeof(buff),stdin);
    sscanf(buff,"%d",&k);
    
    kotae = *sinnkeisann( k );
    
    printf("2進数表記>>>%d",kotae);
    
}

char *sinnkeisann(int k)
{
    int a,i,answer;
    char retu[32+1];
    
    a=k;
    retu[32] = '\0';
    
    for(i = 0; i < 32; i++){
        if(i != 0 && a == 0){
            break;
        }
        
        if(a %2 == 0){
            retu[(32-1) - i] = '0';
        }
        else{
            retu[(32-1) - i] = '1';
        }
        a = a / 2 ;
    }
    answer = &retu[0]+1 ;
    
    return answer ;
    
}

エラーメッセージ
2sinn.c: In function `sinnkeisann':
2sinn.c:46: warning: assignment makes integer from pointer without a cast
2sinn.c:48: warning: return makes pointer from integer without a cast

No. 1920 # 紅の猫 [E-mail] 2001/04/28 (土) 10:00:44
>>1919HELP

answerがint型なのにchar型を渡してるって事ですね。

答えの返し方は、関数を
void function(int n,char* s)
というように、返してほしい配列のポインタを引数にすればいいですよ。

No. 1921 # 68user 2001/04/28 (土) 17:35:14
>>1919 HELP
コンパイルは成功していますよ。Warning がどれだけ起ころうが、
Error が出ない限り実行ファイルが生成されているはずです。

ところで、戻り値の返し方について
>>1916 68user
> char *sinnkeisann(int k)
とすべき、と言いましたが、
>>1920 紅の猫
> void function(int n,char* s)
の方がよいですね。

No. 1922 # 68user 2001/04/28 (土) 22:22:49
毎回適当にいじって、毎回忘れてしまう GD-1.33 & gd-1.8.4 & libpng-1.0.10 の
インストールメモメモ。

libpng:
    % cp scripts/makefile.std Makefile
    % diff scripts/makefile.std Makefile
    < prefix=/usr/local
    ---
    > prefix=/home/68user/install/libpng
    % make && make install

gd:
    % diff Makefile.org Makefile
    15c15,16
    < CFLAGS=-O -DHAVE_LIBPNG -DHAVE_LIBJPEG
    ---
    > CFLAGS=-O -DHAVE_LIBPNG
    48c49
    < INCLUDEDIRS=-I. -I/usr/include/freetype2 -I/usr/include/X11 -I/usr/X11R6/include/X11 -I/usr/local/include
    ---
    > INCLUDEDIRS=-I. -I/usr/include/freetype2 -I/usr/include/X11 -I/usr/X11R6/include/X11 -I/usr/local/include -I/home/68user/install/libpng/include
    58c59
    < LIBDIRS=-L. -L/usr/local/lib -L/usr/lib/X11 -L/usr/X11R6/lib
    ---
    > LIBDIRS=-L. -L/usr/local/lib -L/usr/lib/X11 -L/usr/X11R6/lib -L/home/68user/install/libpng/lib
    61c62
    < INSTALL_LIB=/usr/local/lib
    ---
    > INSTALL_LIB=/home/68user/install/libgd/lib
    64c65
    < INSTALL_INCLUDE=/usr/local/include
    ---
    > INSTALL_INCLUDE=/home/68user/install/libgd/include
    67c68
    < INSTALL_BIN=/usr/local/bin
    ---
    > INSTALL_BIN=/home/68user/install/libgd/bin
    % make && make install

GD:
    % diff Makefile.PL.org Makefile.PL
    6,7c6,7
    < my @INC = qw(-I/usr/local/include -I/usr/local/include/gd);
    < my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/usr/local/lib );
    ---
    > my @INC = qw(-I/usr/local/include -I/usr/local/include/gd -I/home/68user/install/libgd/include -I/home/68user/install/libpng/include);
    > my @LIBPATH = qw(-L/usr/lib/X11 -L/usr/X11R6/lib -L/usr/X11/lib -L/usr/local/lib -L/home/68user/install/libgd/lib -L/home/68user/install/libpng/lib);
    % perl Makefile.PL LIB=~/p5-module/ INSTALLMAN1DIR=~/p5-module/man1/ INSTALLMAN3DIR=~/p5-module/man3/
    % make && make install

動作チェック:
    % perl -e 'use lib "/home/68user/p5-module"; use GD'

No. 1923 # HELP 2001/04/30 (月) 01:00:54
新たにプログラムを作り直してみました。
コンパイルできますが、実行結果が全て0になってしまいます。
どこを直せばいいのか教えて下さい。

#include<stdio.h>

void swap(int *bin)
{
    char buff[32+1],answer[32+1];
    int count;

    buff[32] = '\0';
    for(count = 0; count < 32; count++)
        {
            if(count != 0 && *bin == 0)
    {
     break;
    }
            if (*bin % 2 == 0 )
    {
     buff[(32-1)-count] = '0';
    }
            else
    {
     buff[(32-1)-count] = '1';
    }
            *bin = *bin / 2 ;
        }

    buff[32+1] = *bin;
}

int main()
{
    int hoge,hairetu[32+1];
    char buf[32+1];

    printf("数を入力してください>>>");
    fgets(buf,sizeof(buf),stdin);
    sscanf(buf,"%d",&hoge);

    swap(&hoge);

    printf("2進数>>>%d\n",hoge);

}

No. 1924 # 68user 2001/04/30 (月) 01:41:25
こういう形のやりとりはあまり効率的とは思えませんが、
納得できるまで付き合いますか。

>>1923 HELP
swap に hoge のアドレスを渡し、swap の中で *bin を2で
割っていって、0になったらループを抜けているので、
最終的には必ず *bin == 0、つまり hoge も 0 になります。

buff の中に結果を入れているのに、最終的にどこにも
反映していないので、呼び出し側では結果を受けとれません。

で、2進数の結果を int で返してもらっても、大抵の場合
うれしくないので、void int2bin(int n,char* s) という
形にしましょう。

呼び出し側では
    char answer[256], buf[256];
    int input_num;
    printf("数を入力してください>>>");
    fgets(buf, sizeof(buf), stdin);
    sscanf(buf, "%d", &input_num);
    int2bin(input_num, answer);
    printf("2進数>>>%s\n", answer);
として、変換側では
    void int2bin(int num, char *answer)
と受け、num の値を 2進数に変換して answer に格納、
とするのがよいでしょう。

No. 1925 # HELP 2001/04/30 (月) 22:06:51
この問題はなんとか解決できました。
最後までつきあっていただいて本当にありがとうございました。
またよろしくおねがいします。

No. 1926 # ふくし 2001/05/02 (水) 12:07:45
しゅいましぇん Perl で質問です〜

らくだの本を読んでいて、

    *dick = *richard;

という代入を行なうと $richard も @richard も %richard も &richard も
エイリアシングされてしまうけど、

    *dick = \$richard;

だと $richard だけがエイリアシングされてしまう、というのがどうもよくわかりません。

あと、

    *PI = \3.14159265358979;

と書くと $PI は「定数スカラー」になっていじれなくなる、というのも、
これ、左辺はリテラルのリファレンスなんでしょうか??

No. 1927 # ミング [E-mail] 2001/05/02 (水) 13:43:23
Awkを練習しています。

目的;
Data1というファイルに4ポイントの座標が書き込んであります。
c1 10 10
c2 20 20
c3 30 30
c4 40 40

この4ポイントを4x4=16個ある箱の一番左下とし、これを元に、残り15箱にはいる15x4=60ポイントの座標を求める。offset値はx=y=100とします。

コマンドラインで
awk '{for (i=0;(i,4);i=i+1) print $1"-"i+1, $2+"100"*i, $3}'
data1 > out1
で一番したの4箱ぶんをだし、

out1;
c1-1 10 10
c1-2 110 10
c1-3 210 10
c1-4 310 10
c2-1 20 20
c2-2 120 20
c3-3 220 20
..........
awk' '{temp=substr($1, 1,4);for (i=0;(i,4);i=i+1) print temp,
i+"1", $2, $3+"100"*i}' out1 > out2

out2

c1-1 1 10 10
c1-1 2 110 10
c1-1 3 210 10
c1-1 4 310 10
c1-2 1 10 110
c1-2 2 110 110
c1-2 3 210 110
..................

で全てを出す方法で目的は達成したのですが,それを一度で出したいと思い、下の様にしてみました。

"test.awk"
{for (i=0;(i<4);i++)
print ($1"-"i+"1", $2+"100"*i, $3) >> "out1"}
close ("out1")
{getline < "out1"
temp=substr($1, 1,4);for (j=0;(ij,4);j=j+1)
print temp, ij+"1", $2, $3+"100"*j}

#awk -f test.awk < data1 > out3

しかし、data1のFNR=4の場合out3は16行まででとまってしまうので、わざわざdata1のFNRを64にしてし、全ての値をだしました。

まだよく理解できていないので、どうしてなのかがわかりません。ご指導
お願い致します。

No. 1928 # 68user 2001/05/04 (金) 00:11:00
>>1926 ふくし
> *dick = \$richard;
> だと $richard だけがエイリアシングされてしまう、
> というのがどうもよくわかりません。
dick という名前には、スカラー、配列、ハッシュ、関数
などがあり、それぞれ $dick、@dick、%dick、&dick として
アクセス可能です。名前と実データのアドレスの間は、
シンボルテーブルにより対応づけられています。で、
    *dick = *richard;
は、それらシンボルテーブルを一括して書き換えるもので、一方
    *dick = \$richard;
は $richard 用シンボルテーブルだけを書き換えるもの、
と解釈してはどうでしょうか。

実際にそういう作りになっているかどうかはわかりません。

ところで、
    $fuga='fuga';
    local(*hoge) = *fuga;
    print "\$hoge=$hoge\n";
は OK でも、
    @fuga=('a', 'b', 'c');
    local(*hoge) = *fuga;
    print "\@hoge=@hoge\n";
とすると
    In string, @hoge now must be written as \@hoge
なんですねぇ。美しくないなぁ。

>>1927 ミング
うーむ、awk 以前に、ちょっと問題の意味が理解できません。
# でも、for (j=0;(ij,4);j=j+1) という書き方もわかんないなぁ。

ファイルに書き込んで close し、それを読み出す、ということを
されたいのでしょうが、もっとよいアルゴリズムがあるんじゃないか
とは思います。他の方、わかりますか?

No. 1929 # 68user 2001/05/04 (金) 10:15:59
>>1447 nac
! で fold しているのは sendmail くんだそうで。
    http://script.lovely.to/bbs/infolng.cgi?print+200104/01040037.txt

No. 1930 # XRD [E-mail] 2001/05/07 (月) 13:33:13
はじめまして。XRDといいます。
ただいま、C言語でCGIを作成しようと勉強中の身です。
そこでインプレスより販売しているCGIブックを購入したのですが、
コンパイルがうまくいきませんでした。
ソース内容は以下の通りです。
http://home.impress.co.jp/books/ietech/cgi.code/7.2.html

動作環境:TurboLinux6

tmp/ccuVjNj9.o: In function `main':
/tmp/ccuVjNj9.o(.text+0x10b): undefined reference to `splitword'
/tmp/ccuVjNj9.o(.text+0x122): undefined reference to `unescape_url'
/tmp/ccuVjNj9.o(.text+0x14a): undefined reference to `splitword'
/tmp/ccuVjNj9.o: In function `GetUserID':
/tmp/ccuVjNj9.o(.text+0x76c): undefined reference to `dbm_open'
/tmp/ccuVjNj9.o(.text+0x7bf): undefined reference to `dbm_fetch'
/tmp/ccuVjNj9.o(.text+0x886): undefined reference to `dbm_store'
/tmp/ccuVjNj9.o(.text+0x894): undefined reference to `dbm_close'
/tmp/ccuVjNj9.o: In function `GetOrderRecord':
/tmp/ccuVjNj9.o(.text+0x8c3): undefined reference to `dbm_open'
/tmp/ccuVjNj9.o(.text+0x915): undefined reference to `dbm_fetch'
/tmp/ccuVjNj9.o: In function `UpdateOrderRecord':
/tmp/ccuVjNj9.o(.text+0x9ba): undefined reference to `dbm_store'
/tmp/ccuVjNj9.o: In function `CloseDatabase':
/tmp/ccuVjNj9.o(.text+0x9ce): undefined reference to `dbm_close'
collect2: ld returned 1 exit status

自分なりの解釈としては、コンパイラのせいではなく、リンクの失敗ではないかと思っています。そこで、ndbm.hというファイルで宣言する際に必要なライブラリを指定すれば正常にコンパイルができるものだと思ったのですが、方法もしくはファイルがどこにあるかがわかりません。
manで調べたり、ndbm.hのファイルを開いて調べてみたのですが、それに関する情報がありませんでした。解釈がまちがっているのかもしれません。なにとぞ、ご指導おねがいします。

No. 1931 # 68user 2001/05/07 (月) 16:32:42
>>1930 XRD
> 自分なりの解釈としては、コンパイラのせいではなく、リンクの
> 失敗ではないかと思っています。
その通りです。

コンパイル済の dbm_open の実体 (=オブジェクト) が、標準 C
ライブラリの libc.so.* に含まれていないのでリンク時にエラーに
なっているわけです。なので、dbm 関係のライブラリ名を指定しないと
いけません。探し方はこちら。
    http://www.jp.FreeBSD.org/QandA/HTML/1609.html

というわけで、手元の LASER5 Linux で
    % nm -o /lib/*.so.* /usr/lib/*.so.* | grep ' T ' | grep dbm_open
試すと、
    /lib/libdb1.so.2:00009d70 T dbm_open
    /lib/libdb.so.2:00009d70 T dbm_open
    /usr/lib/libgdbm.so.2:00002230 T dbm_open
    /usr/lib/libgdbm.so.2.0.0:00002230 T dbm_open
となりますので、cc -ldb -L/lib とか、cc -lgdbm -L/usr/lib すれば
よいことがわかります。libdb の方は ndbm で、libgdbm の方は gdbm
でしょうが、どちらがよいかはわかりません。

で、splitword と unescape_url の方は
    http://home.impress.co.jp/books/ietech/CGI.contents.html

    ソースコードのリスト → cgiutils.h, cgiutils.c
のところにあります。これをリンクするよう記述があったのでしょうが
見落としておられるのではないでしょうか。

No. 1932 # mm 2001/05/08 (火) 12:43:24
>>1927 ミングさん
>で全てを出す方法で目的は達成したのですが,それを一度で出したいと思い、下の様にしてみました。
実用的には、まずパイプで繋ぐことを検討すべきです。
1つのスクリプトにするにしても、元の2つがデータの行ごとの処理なので、
close や getline を使う必要がよく分かりません。

awkの勉強ということであれば、もっと単純な課題を使うべきでしょう。
スクリプトを拝見する限り、awkの文法を十分に理解されてるとは思えないもんで…

No. 1933 # _ 2001/05/08 (火) 15:56:47
>>1927 ミング
私の勘違いでなければ

#!/usr/bin/awk -f
{
        for (i = 0; i < 4; ++i)
                for (j = 0; j < 4; ++j)
                        print($1 "-" i + 1, j + 1, $2 + 100 * j, $3 + 100 * i)
}

で済む話だと思うんですが...
今の問題は、制御の流れを追って考えれば分かるのでは。

(1) 暗黙にstdinから1行入力
(2) 最初のアクションで、out1に4行出力
(3) 2番目のアクションで、out1から1行入力
        stdoutに4行出力後、(1)へ

(3)のgetlineで1行しか読んでいないので、(1)で
EOFが来る頃には、まだout1の1/4しか処理していない訳です。

No. 1934 # XRD [E-mail] 2001/05/09 (水) 12:12:14
68userさん、ありがとうございました。

まだ、うまくはできていませんが、がんばってみます。
splitword、cgiutils.cは見落としてました。
幸い本に掲載されていましたので、解決できそうです。
まだ、未熟者なので、わからないことが多々あると思います。
そのときは、お手数ですがよろしくお願いいたします。

No. 1935 # ED 2001/05/09 (水) 21:59:14
なるべく早くGOOやinfoseek
にかからないようにしてほしいのですけど…

特にSEGA BBSは…

No. 1936 # 68user 2001/05/09 (水) 22:11:38
>>1935 ED
> GOOやinfoseekにかからないようにしてほしいのですけど…
なぜですか? (何となく想像できますけど)
ちなみに、そうするかどうかは考えておきます。

> 特にSEGA BBSは…
SEGA BBS 以外でもロボットの検索対象から外したほうがよい
コンテンツがありますか?

No. 1937 # CZ 2001/05/10 (木) 10:07:02
とある(無料)サーバに ~hogehoge というファイルをFTP転送しました
が,これは作業中のバックアップ用ファイルを誤って転送したものです。

そこでWindows用FTPソフトを使って削除しようとすると,
    >DELE ~hogehoge
    550 ~hogehoge: No such file or directory
という結果になります。ちなみに相手方は ProFTPD です。

まあ当然といえば当然の結果かも知れませんが,いったいどうすれば削除で
きるでしょうか。コマンドを手動入力することは可能です。恐らくは ~ を
別の形式で表現すればいいのだと思いますが,どうも分からないのです。

ファイルが残っていても実害はないのですが,何となく気持ち悪いので,
よろしくご教示ください。

No. 1938 # ほいほい 2001/05/10 (木) 10:26:16
UNIX同士の通信で、TCP/IPのソケットを使ってHTTPのPOSTでデータのやり取りをしたいのですが、どのようにすればいいのでしょうか??
理解不足でもしかしたらわけわかんない質問をしているかもしれませんが、お願いします。
ソケットでのデータのやりとりだと思ってください。
また、TCP/IPプロコトルとHTTPは別もの??これもわけわかんないですか?

No. 1939 # hsj 2001/05/10 (木) 15:46:28
>>1937 CZ
そのファイルをフルパスで指定すれば消せませんか?
DELE /home/hoge/~hogehoge
みたいに。

>>1938 ほいほい
http://x68000.startshop.co.jp/~68user/net/
68userさんがせっかくこういう物を提供してくださってるんですから
読みましょうよ・・・。

No. 1940 # ほいほい 2001/05/10 (木) 16:02:47
>>1939 hsj
たすかりました。
なんかいろいろ見てて混乱してました。
いまみたら、理解しました。どうもすいません・・・・・

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