初めまして。 現在文字コードの変換について色々と模索中です。で、 このページの過去ログを見つけたのですが、情報を うまく理解することができなかったので質問させて ください。 まずバックグラウンドとして、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でこういった内容を書き たいのですが、何か参考になるようなものがありましたら お知らせください。 長い文章になりましたが、ご助力お願いいたします。 |
>>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 あたりをどうぞ。 |
ずっと以前から悩んでいたことなのですが、どこで聞いていいかわからず、 ここで書きます。よろしくお願いします。 会社の FreeBSD で Perl を使っていますが、nfs mount でいろんな マシンで同じスクリプトを使えるようになっていますが、 あるスクリプトが急に text file busy と言われます。 語感からするとエディット中に実行したとか、 複数の人が一つのスクリプトを実行しているとか いう感じですが、そうなっていても実行できるスクリプトは 実行できますし、どう考えてもヒマなファイルが同様の原因で 怒られます。 で、こうなってしまったら、件のスクリプトのディレクトリに行き % cp busyscript foo % rm busyscript % mv foo busyscript % chmod 755 busyscript これで百発百中修復します。 なぜなんでしょう。どなたかご教示をお願いします。 |
つい最近、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. です。 |
>>1899 kate (あれ、使い方がわからない…。(>_<)) kateさんのPerlの質問ですが、5行目の「If」を「if」にすると できますよ。あとついでなのですが、 "what is your name?\n"; とすると良いですね!(^^ゞ |
>>1897 68user ありがとうございます。これから試してみますので、結果が出たらまた ご報告いたします。→みなさま。 |
1900 りんたろお。さんありがとうございました。 ケアレスミスというか、本当にしょうもないミスだったの ですね・・(^-^; アドバイスありがとうございました!また、ヨロシクお願いします。 |
はじめまして。 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. と、エラーが出てプログラムが強制終了してしまいます。 強制終了せずに、受信側の受信キャンセルを検出する方法がありましたら 是非おしえてください。よろしくお願いします。 |
sendmaiを使用して2カ所にメールを送るにはどうすれば良いのでしょうか? open 〜 close を2度記述してもダメなのでしょうか。1度の記述だと正常に処理できるのですが2度の記述ですとうまくいきません。宜しくお願い致します、 open(MAIL, "| /usr/sbin/sendmail -t"); ・〜・ close(MAIL); |
>>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"; でもいいです。 |
「ネットワークプログラミングの基礎知識」 http://X68000.startshop.co.jp/~68user/net/ を CVS に追加しました。 http://X68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/ $Id:$ を挿入しまくったので、もしソースと解説の行番号がずれて いるかもしれません。見つけられた方はご指摘いただけると幸いです。 |
2カ所への送信はうまくいきました、有り難う御座いました。 ところが またまたしつもんです。sendmailで指定する件名が送信先によって文字化けしてしまいます。日本語文字コードによるものでしょうが、対策は具体的にどのようにしたらよいのでしょうか。 $sb='あいうえお'; print MAIL "Subject: $sb\n"; |
>>1907 くみ MIME encode する必要があります。 http://X68000.startshop.co.jp/~68user/webcgi/mail-2.html#2 をどうぞ。 |
はじめまして 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ページを毎回読み直す必要があります。 どうのようにしたらよいのでしょうか。 お助けください。 |
>>1909 hooma どういう HTML を出力したいかが書いてないので、誰にも 正解は答えられないと思いますよ。CSV から読み込むだけなら、 「,」で split して、「10」が出てきたら新しいを配列を用意し、 次の「10」が出てくるまでその配列に push。そしたら1つの配列には 「ヘッダ,分類名,分類詳細名1,リンク先1,分類詳細名2,リンク先2...」 という値が入るでしょうから、後は適当に処理すればよいでしょう。 |
fgetsとsscanfの使いかたがまったくわかりません。 誰か教えて下さい。 下のような問題をといています。 誰でもいいのでできれば解いてもらえませんか?? 問題 1.ユーザーに1つの数の入力を求め、入力された数字を8進数表示、16進数表示するプログラムを作りなさい。 条件:main関数1つで作成する。 gets(),scanf()は利用しないこと。 扱う数字のさいだいは、int型で良い。 printf()は用いてもよい。 |
>>1911 HELP 宿題なのでしょうから、自分でやりましょう。 「ここまで自分でやりましたが、〜がわかりません」なら ともかく、「全くわかりません」では問題外です。 # 2ch に行けば、お姉さんやギコ猫が答えてくれますけどね。 |
確かに宿題みたいなものなんですが、ほんとに全然さっぱりなんです。 fgetsとsscanfがどういうものなのかだけでも教えてもらえませんか? 参考書など読んだのですが、どのように使えばいいのかわからないんです。 問題のプログラムは一応できたんですが、あっているのかもわからないし、 自分で作ったプログラムなのに理解できないんです^^; 誰かお願いしますm(_ _)m |
>>1913 HELP では、自分の書いたプログラムを見せて、「こことここがわからん」 「ここは、こういう意味だろうか?」と質問してみてはどうでしょうか。 課題のプログラムについて、知るべきポイントや勉強すべきポイントは たくさんあります。だから世の中にはたくさん C の参考書が出回って いる。それら全てを回答者に解説させようとせず、自分がどこまで 理解しているかを明らかにした上で、ポイントをしぼって質問する のが「うまい質問の仕方」というものです。 |
次の問題のプログラムを作ってみましたが、コンパイルできません。 どこが間違っているのか教えて下さい。 入力された数字を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 ; } |
>>1915 HELP FreeBSD 4.2-RELEASE ではコンパイルできましたよ。コンパイル できない場合は、どういうエラーメッセージが出たかを書きましょう。 ところで、条件では「文字列を返す関数」となっているので、 char *sinnkeisann(int k) とすべきですね。 ただし、インデントだけはきっちりつけましょう。そのソースを 見る他人のためでもあり、3日後にソースを見直すかもしれない 自分のためでもあります。 |
元質問 >>1861 すな >>1870 で hsjさんに教えてもらった件ですがやはりそのようですね。 http://homepage1.nifty.com/yito/namazu/gbook/20010423.0840.html といった記事を見つけました。よって、 >>1864 でのレンタルホスト管理者からのメールで >クライアントがURL欄に「http://www.intel.com/http://www.intel.com/」 > と誤って記入すると、そのようなログが記録されます。 はやはり間違いですね。 参考までに…(参考にもならないかな?) # しかし最近不正な(と思われる)アクセス増えたなぁ… |
>>1915HELP 文法的には間違ってないし、アルゴリズムも基本的には正しいです。(だけどね(^_^)ニヤリ’ あとはintの符号有り、符号無しの違いに注意したほうがいいです。 |
プログラムを以下の様に直してみました。しかしコンパイルができません。 #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 |
>>1919HELP answerがint型なのにchar型を渡してるって事ですね。 答えの返し方は、関数を void function(int n,char* s) というように、返してほしい配列のポインタを引数にすればいいですよ。 |
>>1919 HELP コンパイルは成功していますよ。Warning がどれだけ起ころうが、 Error が出ない限り実行ファイルが生成されているはずです。 ところで、戻り値の返し方について >>1916 68user > char *sinnkeisann(int k) とすべき、と言いましたが、 >>1920 紅の猫 > void function(int n,char* s) の方がよいですね。 |
毎回適当にいじって、毎回忘れてしまう 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' |
新たにプログラムを作り直してみました。 コンパイルできますが、実行結果が全て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); } |
こういう形のやりとりはあまり効率的とは思えませんが、 納得できるまで付き合いますか。 >>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 に格納、 とするのがよいでしょう。 |
この問題はなんとか解決できました。 最後までつきあっていただいて本当にありがとうございました。 またよろしくおねがいします。 |
しゅいましぇん Perl で質問です〜 らくだの本を読んでいて、 *dick = *richard; という代入を行なうと $richard も @richard も %richard も &richard も エイリアシングされてしまうけど、 *dick = \$richard; だと $richard だけがエイリアシングされてしまう、というのがどうもよくわかりません。 あと、 *PI = \3.14159265358979; と書くと $PI は「定数スカラー」になっていじれなくなる、というのも、 これ、左辺はリテラルのリファレンスなんでしょうか?? |
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にしてし、全ての値をだしました。 まだよく理解できていないので、どうしてなのかがわかりません。ご指導 お願い致します。 |
>>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 し、それを読み出す、ということを されたいのでしょうが、もっとよいアルゴリズムがあるんじゃないか とは思います。他の方、わかりますか? |
>>1447 nac ! で fold しているのは sendmail くんだそうで。 http://script.lovely.to/bbs/infolng.cgi?print+200104/01040037.txt |
はじめまして。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のファイルを開いて調べてみたのですが、それに関する情報がありませんでした。解釈がまちがっているのかもしれません。なにとぞ、ご指導おねがいします。 |
>>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 のところにあります。これをリンクするよう記述があったのでしょうが 見落としておられるのではないでしょうか。 |
>>1927 ミングさん >で全てを出す方法で目的は達成したのですが,それを一度で出したいと思い、下の様にしてみました。 実用的には、まずパイプで繋ぐことを検討すべきです。 1つのスクリプトにするにしても、元の2つがデータの行ごとの処理なので、 close や getline を使う必要がよく分かりません。 awkの勉強ということであれば、もっと単純な課題を使うべきでしょう。 スクリプトを拝見する限り、awkの文法を十分に理解されてるとは思えないもんで… |
>>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しか処理していない訳です。 |
68userさん、ありがとうございました。 まだ、うまくはできていませんが、がんばってみます。 splitword、cgiutils.cは見落としてました。 幸い本に掲載されていましたので、解決できそうです。 まだ、未熟者なので、わからないことが多々あると思います。 そのときは、お手数ですがよろしくお願いいたします。 |
なるべく早くGOOやinfoseek にかからないようにしてほしいのですけど… 特にSEGA BBSは… |
>>1935 ED > GOOやinfoseekにかからないようにしてほしいのですけど… なぜですか? (何となく想像できますけど) ちなみに、そうするかどうかは考えておきます。 > 特にSEGA BBSは… SEGA BBS 以外でもロボットの検索対象から外したほうがよい コンテンツがありますか? |
とある(無料)サーバに ~hogehoge というファイルをFTP転送しました が,これは作業中のバックアップ用ファイルを誤って転送したものです。 そこでWindows用FTPソフトを使って削除しようとすると, >DELE ~hogehoge 550 ~hogehoge: No such file or directory という結果になります。ちなみに相手方は ProFTPD です。 まあ当然といえば当然の結果かも知れませんが,いったいどうすれば削除で きるでしょうか。コマンドを手動入力することは可能です。恐らくは ~ を 別の形式で表現すればいいのだと思いますが,どうも分からないのです。 ファイルが残っていても実害はないのですが,何となく気持ち悪いので, よろしくご教示ください。 |
UNIX同士の通信で、TCP/IPのソケットを使ってHTTPのPOSTでデータのやり取りをしたいのですが、どのようにすればいいのでしょうか?? 理解不足でもしかしたらわけわかんない質問をしているかもしれませんが、お願いします。 ソケットでのデータのやりとりだと思ってください。 また、TCP/IPプロコトルとHTTPは別もの??これもわけわかんないですか? |
>>1937 CZ そのファイルをフルパスで指定すれば消せませんか? DELE /home/hoge/~hogehoge みたいに。 >>1938 ほいほい http://x68000.startshop.co.jp/~68user/net/ 68userさんがせっかくこういう物を提供してくださってるんですから 読みましょうよ・・・。 |
>>1939 hsj たすかりました。 なんかいろいろ見てて混乱してました。 いまみたら、理解しました。どうもすいません・・・・・ |
メールでいただいた質問ですが、勉強になったのでこちらでお返事。 > http://x68000.startshop.co.jp/~68user/net/perl4.html > にも書かれていますが > Perl4では SOCK_STREAM の値を直接指定しなければならない > となっておりますが、Perl4の場合 > require 'sys/socket.ph'; > とするのでは無いでしょうか? > (perl4環境が無く、人づてなので当てずっぽうです。) なるほど、既に perl4 のラクダ本も手元になく、常用環境には perl5 しかないので知りませんでした。あのページには perl4 なら sys/socket.ph を使うよう追記しておきます。 > また、サンプルの > > socket(SOCKET,PF_INET,SOCK_STREAM,0); > ですが、protocol だけが直接、値を指定しているのは > 何故でしょうか? TCP や UDP を使う場合は 0 でよいです。/etc/protocols には ip 0 IP # internet protocol, pseudo protocol number tcp 6 TCP # transmission control protocol udp 17 UDP # user datagram protocol となっていますので、TCP を使う場合は socket(SOCKET, PF_INET, SOCK_STREAM, 6); socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')); などと明示的に指定してもいいです (可読性と、NIS への対応 という面から見ると後者がよい)。 しかし、アドレスファミリ(PF_*) とソケットタイプ (SOCK_*) の 値が決まると、プロトコルは一意に定まります (なぜかはよく わかりません)。なので、プロトコルに 0 を指定すれば、自動的に 適切なプロトコルが決定されます。 FreeBSD なら socket(2) の下請け関数である socreate で http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/sys/kern/uipc_socket.c?rev=1.97 int socreate(dom, aso, type, proto, p) if (proto) prp = pffindproto(dom, proto, type); else prp = pffindtype(dom, type); と検索を行う関数 pffindtype が呼ばれています。 なお、ICMP をしゃべったり、IP データグラムを直接生成する ために raw ソケットを生成したい場合は 非 0 を指定します。 |
>>1939 hsj > そのファイルをフルパスで指定すれば消せませんか? > DELE /home/hoge/~hogehoge > みたいに。 FTP サーバの実装依存でしょうが、FreeBSD 4.3-RELEASE 付属の ftpd だと、カレントディレクトリに ~hogehoge がある状態で > rm ~hogehoge DELE ~hogehoge となり消せました。 ただ、 > rm ./~hogehoge > rm /home/user/~hogehoge は同じく 4.3-RELEASE 付属の ftp コマンドが何を勘違いしたのか RMD ./~hogehoge RMD /home/user/~hogehoge とディレクトリを削除しようとして失敗していました。 > quote DELE ./~hogehoge DELE ./~hogehoge と、直接 FTP コマンドを送ると OK でした。 UNIX 界では、~hoge が「hoge ユーザのホームディレクトリ」と 解釈されるのは ~ が先頭にあるときのみですから、フルパスで 書いたり ./~hoge などとすればよいです。ただし、 % perl Makefile.PL INSTALLMAN3DIR=~/install のように、アプリケーション側 (この場合は ExtUtils::MakeMaker) で 展開してくれるものもあります。 |
>>1941 68user > アドレスファミリ(PF_*) プロトコルファミリでした。 ちなみに、うちの web ではアドレスファミリ (AF_*) と プロトコルファミリ (PF_*) の使い分けがいいかげんだった ような気がします。いまだに違いがよくわからんなぁ。 |
68userさん> SEGA BBS以外は問題ないです。 理由はまあ掲示板の中身です… 友人が私の名前を使って書いたものなのですが。 部分的に消去とかはできるのでしょうか? |
>>1939 hsj >>1942 68user 無事削除できました。回答してくださったお二方に感謝します。 そのサーバ(ProFTPD 1.2.0rc3)では >DELE /user/www/~hogehoge.html 250 DELE command successful. および >DELE ./~hogehoge.html 250 DELE command successful. のどちらでも成功しました。 で,実験していて気が付いたのですが, >STOR ~hogehoge 550 ~hogehoge: No such file or directory はダメで, >STOR ~hogehoge.html 150 Opening ASCII mode data connection for ~hoge.hoge. 226 Transfer complete. のように拡張子が付くとOKというのは何だか不思議な仕様だと思いました。 |
>>1944 ED > 友人が私の名前を使って書いたものなのですが。 > 部分的に消去とかはできるのでしょうか? 基本的には消したくありません。それをやり出すと、「恥ずかしいので 昔書いた私の発言を消して」というような要望にまで対応しなければ いけないからです。 また、これはこっちの都合ですが、消去は手作業になります。URL を 入力してボタン一発で消去というわけにはいかないので、この作業に 時間を取られるようなら SEGA BBS 過去ログの公開は中止となります。 とは言っても、やはり見られては困る場合もあるでしょうし、こちらも 公開している以上はちゃんと管理する責任がありますので、「どうしても 困る」ということであれば消します。 あるいは、goo などのロボットよけを書いておけば OK ということで あれば、そっちの方向で対処するかもしれません。 というわけで、質問です。 Q1. できればやりたくないのですが、どうしても消さなければいけませんか? Q2. 発言を消さずに、ロボットよけを書くという対処でも OK ですか? |
68userさん> 個人的には消してほしいです。 その箇所は http://x68000.startshop.co.jp/~68user/segabbs/bbs4/vol10/home.html の53行目あたり オススメの曲を教えて! - 朝生 浩 97/9/17 00:07:22 Re: オススメの曲を教えて! - ふらんこ 97/9/17 01:28:34 THANK YOU! - ヨ−タ 97/9/18 20:45:33 THANK YOU! - ヨ−タ 97/9/18 20:46:14 今は「硝子の少年」のよーだが - もひろ 97/9/18 21:19:01 結果は? - ヨ−タ 97/9/22 22:51:31 私のお薦めはコレです〜♪ - MINAMI 97/10/09 09:15:05 です。この部分を消してほしいです。 ロボット検索にひっかからないようにでもいいのですが Web上に自分の名前があるのはどうも落ち着かなくて。 |
風光るの沖田さんとせいちゃんがすきなひといませんか?それと京都にあるという沖田さんの肖像画見た人だれかいませんか?私は、沖田さんの子孫をモデルにして書いたものなら見た事があるんですが・・・・・。 |
>>1947 ED > ロボット検索にひっかからないようにでもいいのですが ということであれば、ロボットよけを書くことで対処させて いただきます。 |
>>1941 68user メールで質問した者です。(名前違うけど・・・) 68userさん。ご回答ありがとうございます。 > perl4 なら sys/socket.ph を使うよう追記しておきます。 歌代さんの tcpconnect-1.0 ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/tcpconnect-1.0 にて ;# require 'sys/socket.ph'; unless (do 'sys/socket.ph') { #print "File sys/socket.ph is not found. Using default...\n"; eval 'sub SOCK_STREAM {1;} sub AF_INET {2;} sub PF_INET {2;}'; } というコードを発見しました。 同じ「自分で直接 値を書く」でも、ここまですれば 許されそうな気がします(笑) > TCP や UDP を使う場合は 0 でよいです。 > … > プロトコルに 0 を指定すれば、自動的に > 適切なプロトコルが決定されます。 > … > なお、ICMP をしゃべったり、IP データグラムを直接生成する > ために raw ソケットを生成したい場合は 非 0 を指定します。 なるほど、socket の説明の際によく書かれている 「普通は 0 でいいです」 的な言葉の意味が、ようやくわかりました。 # 危うく 0 を指定したいが為に getprotobyname('ip') とか # 書くところだった… (本末転倒) ところで、基本的な事がよく分かっていないので、勘違いの可能性大ですが > socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')); これだとリストで渡されませんか? > プロトコル |
loggerコマンドで、-p"(priority)というのがあるのですが、 ここには、何を設定したらよいのですか。 ”man logger”で見てもそれほど詳しくでできません。 設定する内容が詳しく書かれているものはないですか。 |
コマンドを使用して結果を出力せたた場合、1行ごとに改行と空白行 を含んで表示されます。 空白行を削除して詰めた結果を取得したいのですが、シェルスクリプト でどう記述すればよいですか。 |
こんちわっす! APACHEに繋ぐにはどうしたらいいのでしょうか?? このホームページは一通りよんだのですが、頭が悪いせいかよく理解できませんでした。どうかお願いします。ちなみにUNIX on APACHEです。 ソケットで繋いだらいいのでしょうか?? |
68userさん> ロボットよけじゃなくて やっぱ その部分だけ消してもらえませんか? よろしくお願いします |
かきこみ |
ちょっと趣旨が違うかもしれないのですが、同じパソコン上でCGIが動くかを試したいのですが(ソケット通信)どのようにすればいいかわかりません。 で、そのCGIが動くパソコンにはAPACHEが入っててそのAPACHEを通してデータのやり取りをしたいのですがいまいちよく分かりません・・・ どなたかURLだけでもいいのでお教えしていただけないでしょうか??? |
困っています。"ln"コマンドでリンクを張ろうとし、誤ってしまいました。 >ls -la lrwxrwrxrwx 1 haru 2 May 15 02:35 -s -> -s となってしまいました。ファイルを消したくてrmを打ってみても >rm -rf *s usage: rm [-rif] file ... と出てきて消せません。何方か消し方わかる方いらっしゃいますか? |
>>1957 はる > ファイルを消したくてrmを打ってみても > >rm -rf *s > usage: rm [-rif] file ... > と出てきて消せません。 rm ./-s で消せませんか? |
/tkさん 本当にありがとうございます。 消えました。 |
はじめまして。炭酸といいます。 HTTPプロトコルでファイルを転送するプログラムを作成しています。 HTTP/1.1で部分的なPUTを行うためのヘッダの記述方法がわからないので、 教えていただけないでしょうか? 「あいうえおかきくけこ」 ↑このようなファイルを10バイトずつ2回に分けてPUTしたいのです。 以下のようにやってみました。 一回目 PUT /test.txt HTTP/1.1 Host: Content-Length: 10 Content-Range: 0-9/20 あいうえお 二回目 PUT /test.txt HTTP/1.1 Host: Content-Length: 10 Content-Range: 10-19/20 かきくけこ これではうまくいかないようです。 ほかに必要なヘッダなどありましたらお教えいただけませんでしょうか。 長々と失礼いたしました。 |
>>1956 ひろさん WinでApacheなら、<http://tohoho.wakusei.ne.jp/wwwxx048.htm> ソケット通信は、localhostか直結してるなら自身のIPアドレスで 普通にアクセスすればいいです。 >rm ./-s unixは使ったことないけど、 rm -- -s でもいいのかな? |
>>1961 mm > unixは使ったことないけど、 > rm -- -s > でもいいのかな? rm なら良いみたいです。 http://pipi.iis.u-tokyo.ac.jp/~miyoshi/QandA/unix/file/15.html ちょこっとテストした結果では touch, cp, mv にも「--」オプションは有効でした。 # 調べものすると、自分の為になるなぁ… |
>>1962 /tk さん >touch, cp, mv にも「--」オプションは有効でした。 getopt.cを使う古くからのコマンドや上位互換のライブラリを 使うものなら、たぶん有効だと思ってました。 けど、リンク先を見ると、./-s の方も覚えておいた方がいいようですね。 ありがとうございます。 |
>>1950 /tk >> socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')); > これだとリストで渡されませんか? > プロトコル スカラーコンテキストなので、スカラー値が返ります。 socket(SOCKET, PF_INET, SOCK_STREAM, @a=getprotobyname('tcp')) || warn "$!"; print "@a\n"; と socket(SOCKET, PF_INET, SOCK_STREAM, $a=getprotobyname('tcp')) || warn "$!"; print "$a\n"; を試してみるとわかると思います。 >>1951 斎藤 syslog.conf(5) に解説がありませんか? >>1952 鈴木 状況がよくわかりません。command | grep -v '^$' とか? ところで、 >>1951 斎藤 >>1952 鈴木 REMOTE_HOST が同じですが、同じ方ですか? >>1953 後藤 どういう意味で「apache に繋ぐ」と言っているのかよくわかりません。 「〜はわかったが、〜の部分がわからない」という質問の仕方をして下さい。 >>1956 ひろ http://X68000.startshop.co.jp/~68user/net/ を読んで、 「〜はわかったが、〜の部分がわからない」という質問の仕方をして下さい。 ところで、 >>1953 後藤 >>1956 ひろ REMOTE_HOST が似ていますが、同じ方ですか? >>1954 ED わかりました。しかし、時間が取れないのですぐに作業することは できません。ご了承下さい。 >>1960 炭酸 ちょっと時間が取れないので、土日にでも調べてみます。 > これではうまくいかないようです。 どううまくいかないのか、エラーメッセージは出るのか、 PUT 一つだとどうなるか、などを書くと回答をもらいやすい かもしれません。 |
はじめまして。PERL版HTTPクライアントのページが、大変役に立ちました。ありがとうございます。 最近、会社のフィルタリング(^^;が厳しくなっきた為、ちょうど、作っていたところでした。STDOUTへ バーナーを挿入する無料サーバー(*1)を経由して、画像ファイル(*2)をGETする場合、一旦、 *2を*1へ保存してから、*2の埋め込みページを出力する、以外の面白いアイデアがあれは、お 聞かせ下さい。 #ウェブメールクライアントも作らないと(^^; |
レス、ありがとうございます。>68userさん。 言葉が足りませんでした。補足させてください。 RFC2616 の14.16あたりを読んでやってみています。 ■リクエスト 1回目 PUT /test.txt HTTP/1.1 Host: Content-Length: 10 Content-Range: bytes 0-9/20 あいうえお 2回目 PUT /test.txt HTTP/1.1 Host: Content-Length: 10 Content-Range: bytes 10-19/20 かきくけこ ■結果 レスポンスヘッダには Content-Range ヘッダがありません。 リクエストに Content-Range ヘッダがないときと同じように 動作しているようです。 サーバには「かきくけこ」というデータが上がった状態になります。 (2回目のリクエストで上書きされているようです。) サーバーのバージョンは、 Apache/1.3.12(Unix) (Red Hat/Linux) tomcat/1.0 DAV/1.0.0 mod_perl/1.21 です。ひょっとしてサーバーがレンジに対応していないのでしょうか? ネットワークプログラムの初心者なので、リクエストに問題があるのかと不安に 思い、質問させていただきました。 |
>>1964 68user > スカラーコンテキストなので、スカラー値が返ります。 うう。やはり基本的な事がわかってなかった。 何でスカラーコンテキストになるのかが 理解出来てなかったです。 今回の件で青ラクダ本のコンテキストの項や サブルーチン(プロトタイプ)の項を読んで 自作の関数に getprotobyname() 渡して その中で print したりして 何となく理解出来たつもりになりました。 # 今まで引数の型の宣言なんて知らなかった。 68userさん。ご回答ありがとうございました。 で、お礼の後の質問で恐縮なんですけど 自分なりに分かったつもりなった結果 > socket(SOCKET, PF_INET, SOCK_STREAM, @a=getprotobyname('tcp')) || warn "$!"; これの警告が出る理由は getprotobyname('tcp') の リストの要素数が 3つだからだとと思うのですが 実のところどうなんでしょう? # またもや間違っている可能性大 |
>68userさん ありがとうございます。 助かります。 |
>>1966 炭酸 http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6 によると >If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. とあるので、 >サーバには「かきくけこ」というデータが上がった状態になります。 >(2回目のリクエストで上書きされているようです。) というのは仕様上正しい動作だと思います。 >>1960 炭酸 を読むと、おそらく「レジュームの逆」を行いたいのだと思うのですが、それは PUT ではできないと思います。 # FTP の PUT でもできないですよね? |
>>1967 /tk > これの警告が出る理由は getprotobyname('tcp') の > リストの要素数が 3つだからだとと思うのですが そうですね。 socket(SOCKET, PF_INET, SOCK_STREAM, @a=getprotobyname('tcp')) は Protocol not supported at -e line 1. となりますが、これは ('tcp','TCP',6) というスカラーが返って、 先頭の 'tcp' の値が使われるのでエラーになると思っていましたが、 勘違いでした。 ('tcp','TCP',6) というリストをスカラーコンテキストで評価 したため 3 が返り、 socket(SOCKET, PF_INET, SOCK_STREAM, 3) と等価になってしまったということですね。 >>1966 炭酸 すいません。今 apache で PUT メソッドを有効にするには どうすればいいんだっけ? と調べているところです。 # apache 単体では無理で、mod_put か DAV あたりを入れないと # ダメみたいですね。 また PUT や Content-Range は実際に使ったことがないので、 あまり期待しないで下さい。 |
>>1969 The WAY > http://way.direct.ne.jp/HTTP/ RFC2616 は流し読んだ程度なので、僕も勉強しないと。というわけで、 http://X68000.startshop.co.jp/~68user/net/rfc.html からリンクを張らせていただきました。 # http://X68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/org/rfc.html |
大変勉強になり感謝しています。(本当だよ) パールの関数で $port = getservbyname('http','tcp'); の出力がなくて 悩んでいたのですが、今日その理由がわかりました。 プロバイダーの /etc/services に http tcp/80 のエントリが 無いのです。(-_-;) 試しに自分のPCの C:\windows\services を覗いたら ここにもエントリがありません。 他のウェルノゥンポートはエントリがあるのに 何故 HTTP のみがエントリされてないのでしょうか。 セキュリティーの関係なのでしょうか。 |
>>1972 moto > プロバイダーの /etc/services に http tcp/80 のエントリが > 無いのです。(-_-;) 例えば Solaris2.6 などは http tcp/80 がありませんね。 > 試しに自分のPCの C:\windows\services を覗いたら > ここにもエントリがありません。 生まれて初めて C:\windows\services を見ましたが、http の エントリってないのですね (Windows Me)。 Solaris は最小限のエントリのみ書いておくから、必要なら勝手に 追加してね、という思想じゃないかと想像します。Windows Me は なぜでしょうね? わかりません。 なお、UNIX では NIS というシステム情報を共有する仕組みがあります。 もしそれを使っているなら % ypcat services とすれば出てくる場合もあるでしょう。NIS 使用時には getservbyname は /etc/services を見ません。 |
どうもありがとうございます。>68userさん The Wayさん サーバーにはDAVが入ってるので、普通のPUTはできます。 もういちどRFCをよく見直してみます。 ほんとにありがとうございました。 |
はじめまして、ENOと申します。 質問その1: FreeBSD4.2で、ENIのatmアダプタを認識させ、 en0というインタフェースが出来たのですが、 これをmulticastに対応させたいのですが、 en0=841<UP,RUNNING,SIMPLEX>mtu 9180 となっていて、対応してくれません、 ここに<....,MULTICAST>となるようにするに は、どうしたらよいのでしょうか・・・どな たか教えてください その2: その1のマシンで、mroutedを動かして、マル チキャストルータとしたいのですが、webのあ ちこちにある資料にあるように、デフォルトで mrouted_enable="YES"としても、動いてくれま せん。mroutedを動く状態にするまでにどうした らよいのか教えてください 宜しくお願いいたします |
はじめて質問させていただきます。 本ページで色々勉強させて頂いてます(感謝) 当方のレベル)初心者 winsockを用いたマルチスレッドクラサバ作成調査中 クライアント・サーバ間の通信確立方法の基本は理解(してるつもり) 内容) クライアントからの接続要求が複数同時に(理論的に全く同時はありえないかもしれませんが)サーバにきた場合、サーバ側のリクエスト待ちプロセス内のlisten関数は、どのようにこの要求を処理するのでしょうか?つまり、全く同時のアクセスに対して、listen関数が作る待ち行列(キュー)にはどう格納されるのでしょうか? 要求受付後は、各クライアント毎に処理を並行に行う(マルチスレッド) ことができますが、要求受付部のlisten関数はマルチ対応なのかどうか 、前出の全く同時の接続要求はどう処理されるのかが分からないので、ご存知の方が、是非ご教授いただければありがたいです。 質問内容が初歩的かもしれませんが、よろしくお願いしますm(__)m |
>>1975 ENO マルチポストは禁止です。 http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse >>1976 isaq 要は、listen が thread safe かどうか、ということでしょうか? 複数のスレッドが同時にクライアントとの接続を取り合ったりしないのか? と いう意味かと思いますが、listen は OS へ「クライアントからの接続を受け 付けなさいと」命令するだけです。それに対して、accept は OS がキュー イングしておいた待ち行列から、先頭のクライアントを取り出す命令。 というわけで、listen や accpet のマニュアルを見て、thread safe か どうかを確かめましょう。 FreeBSD ならばマニュアルに http://www.jp.FreeBSD.org/cgi/mroff.cgi?subdir=man&man=listen&dir=jpman-4.3.0%2Fman 非スレッドライブラリ listen() は listen システムコールとして実装されています。 スレッドライブラリでは、 listen システムコールは _thread_sys_listen() に アセンブルされ、 listen() は読み書きについて s をロックしてから、 _thread_sys_listen() を呼び出す関数として実装されています。戻る前に listen() は s をアンロックします。 とあります。Windows は知りませんが、マニュアルに書いてあるのでは ないでしょうか。 あるいは、「スレッド」という用語を、pthread などの thread でなく、 単に「並行動作」という意味で使ってますか? |
skel.103Mです。いつもお世話になっております。 さて、 http://X68000.startshop.co.jp/~68user/Cgi-room/ の「MXレコードのお話」についてですが、質問させていただきたい ことがあります。 メールアドレスは、「{ユーザー名}@{ホスト名}」という構成をし ていますが、この{ホスト名}の部分に記述されたホストが実際に存 在する場合、即座に(MXレコードを参照せずに)そのホストに送ら れるのでしょうか。それとも、{ホスト名}に記述されたホストが実 際に存在したとしても、存在しないホストと同様に、まずMXレコー ドを参照し、その結果現れたホストに送られるのでしょうか。 先述したページを読むと、{ホスト名}の部分が存在しない場合に*のみ*、 MXレコードを参照し、その結果現れたホストに送られるものである、 と書いてあるように思えました。実際、これは(少なくとも私にとっ ては)直感に反しないことで、そうなのかなと納得してました。と ころが、某メーリングリスト宛てのメールが私に届きまして、ヘッ ダを見ると、To: の欄のメールアドレスのホスト名の部分(@より右側)が 実際に存在するホスト名であるにもかかわらず、Received: にその ホスト名が載ってない?!…ということがありましたので。 |
68user殿 ご指摘の通り、listenがthread safeかどうかが知りたかったわけです。 教えていただいたURL参考にさせていただき、もう一度調べ直してみて、分からなければ質問させていただきます。 また分かりましたら、報告させていただきます。 分かりにくい質問を投げてしまったけれど、お返事ありがとうございました。 ちなみに、OS:Windows 2000 でクラサバ開発しているのですが、私が使っているwinsock関連書籍で ”WinSock2.0プログラミング 発行:ソフトバンクパブリッシング” というのがあリます。もしwinsockを初めて使おうとしている方がいましたら一読すると良いかもしれません。 |
>>1978 skel.103M > この{ホスト名}の部分に記述されたホストが実際に存在する場合、 > 即座に(MXレコードを参照せずに)そのホストに送られるのでしょうか。 1. IP アドレス直接指定なら、直接 IP アドレス宛に送信 (Ex. To: foo@<127.0.0.1>) 2. 1 がダメで、MX が引けたなら、優先順位を考慮して MX 宛に送信 3. 2 がダメで、A レコードが引けたなら (=正引きできた)、A レコード宛に送信 という順序だと思います。なので、MX が優先ですね。 多分、ここらへんは RFC 2821 に書いてあると思います。 # http://ring.riken.go.jp/pub/doc/RFC/rfc2821.txt |
どうも、skel.103Mです。ご返答どうもです。 メールアドレスと送信先ホストの件、了解しました。私なりに調べた ところ、RFC2821の「5. Address Resolution and Mail Handling」で、 > are generally discouraged. The lookup first attempts to locate an MX > record associated with the name. If a CNAME record is found instead, > the resulting name is processed as if it were the initial name. If > no MX records are found, but an A RR is found, the A RR is treated as > if it was associated with an implicit MX RR, with a preference of 0, > pointing to that host. If one or more MX RRs are found for a given > name, SMTP systems MUST NOT utilize any A RRs associated with that > name unless they are located using the MX RRs; the "implicit MX" rule > above applies only if there are no MX records present. If MX records > are present, but none of them are usable, this situation MUST be > reported as an error. とありますね。なるほど。ちなみに、RFC974にも似たような記述があり ましたね(現在はHISTORICですけど) ただ、分からないのは、なぜこのように定められているのか、その理 由が私にはよく分かりません。。私には直感に反するように思うんで すが…… |
「ソースを表示してみよう」で、 http://www.chailien.com/ が、正常表示されません。 |
>>1981 skel.103M たとえば UNIX マシンが数百台あるような環境があるとして、 % hostname host123.example.ac.jp % whoami user のとき % echo | mail foo@bar などとすると、 From: user@host123.example.ac.jp なメールが foo@bar 宛に届きます。 このままリプライをすると host123.example.ac.jp 宛に メールが送られますが、数百台全てのマシンに SMTP サーバを立ち上げておくのは現実的ではありません。 で、それらの MX を mail.example.ac.jp に指定しておけば、 From: user@host123.example.ac.jp であっても MX 宛に届きます。もちろんその際には MX レコードが A レコードより優先されなければいけません。 …という感じで僕は理解しておりますが、いかがでしょうか。 >>1982 匿名 どうもです。直しました。 |
skel.103Mです。68user様、ご返答どうもです。 >>1983 68user なるほど!よく分かりました。 そこで、実際にそうなっていることを確かめるために、某ネットの (すなわち大学以外の)マシンを使って以下の要領で実験を行って みました。 ・送信元ホスト:test.bounet.net ・宛先メールアドレス:s1080224@exist.u-aizu.ac.jp 正式なメールアドレスではなく、@の右側を実際に存在するホスト 名に改竄。 結果は以下のようになりました: ---------- 1. まずMXレコードを調べておく。 →@exist.u-aizu.ac.jpのアドレスに対応するMXレコードは mailhost.u-aizu.ac.jpである。 [bounet] % nslookup Default Server: localhost Address: 127.0.0.1 > set q=mx > exist.u-aizu.ac.jp. Server: localhost Address: 127.0.0.1 Non-authoritative answer: exist.u-aizu.ac.jp preference = 10, mail exchanger = mailhost.u-aizu.ac.jp Authoritative answers can be found from: …(省略)… [bounet] % 2. メールを送信。 [bounet] % telnet localhost 25 Trying 127.0.0.1... Connected to localhost.bounet.net. Escape character is '^]'. 220 test.bounet.net ESMTP Sendmail 8.11.3/***************; Thu, 24 May 2001 20:47:40 +0900 (JST) EHLO localhost 250-test.bounet.net Hello localhost.bounet.net [127.0.0.1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-SIZE 250-DSN 250-ONEX 250-ETRN 250-XUSR 250 HELP MAIL FROM: testerz@bounet.net 250 2.1.0 testerz@bounet.net... Sender ok RCPT TO: s1080224@exist.u-aizu.ac.jp 250 2.1.5 s1080224@exist.u-aizu.ac.jp... Recipient ok DATA 354 Enter mail, end with "." on a line by itself Subject: test X-Mailer: telnet JiKaUcHi (^^;;; This is a test mail. . 250 2.0.0 f4OBm4K02587 Message accepted for delivery quit 221 2.0.0 test.bounet.net closing connection Connection closed by foreign host. [bounet] % 3. 送信ログを確認する。 →配送先はexist.u-aizu.ac.jpでは*なく*、MXレコードとして指定され ているホストmailhost.u-aizu.ac.jpに配送された。 May 24 20:50:34 test sendmail[2587]: f4OBm4K02587: from=testerz@bounet.net, size=**, class=0, nrcpts=1, msgid=<200105241149.f4OBm4K02587@test.bounet.net>, proto=ESMTP, daemon=Daemon0, relay=localhost.bounet.net [127.0.0.1] May 24 20:50:41 test sendmail[2596]: f4OBm4K02587: to=s1080224@exist.u-aizu.ac.jp, ctladdr=testerz@bounet.net (****/****), delay=00:01:22, xdelay=00:00:07, mailer=esmtp, pri=30069, relay=mailhost.u-aizu.ac.jp. [163.143.1.43], dsn=2.0.0, stat=Sent (UAA23329 Message accepted for delivery) ---------- たしかに、MXレコードがAレコードより優先されていますね。 どうもありがとうございました。 これからもよろしくお願いします! |
お久しぶりです。 ちょっと思うところがあって、掲示板の検索をしたのですが、ふと疑問が出てきました。 http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard/namazu.cgi?query=http&whence=0&max=20&result=normal&sort=score とかしますと、>とか<とか"とかが、>とか<とか"e;と表示 されるみたいです。これは、仕様ですか? あと、同じページの最後に、webmaster@www2.startshop.co.jp と ありますが、このwww2は、http://x68000.startshop.co.jp/~68user/ から推測するに、間違いなのではないですか? 違ったら済みません。 |
初めて書き込みさせていただきます。 和文で,改行を空白に置換する方法を ご存知の方はいないでしょうか。 例) おはよう こんにちは こんばんは ↓ おはよう こんにちは こんばんは 目的は,ウェブページのフォームから送られた文章を, 表示するページの都合で,改行無しの文に変更することです。 よろしくお願いいたします。 |
>>1986 椎 HTMLならば加工するまでも無く改行が無視されますが? |
>>1985 へにか > >とか<とか"e;と表示されるみたいです。これは、仕様ですか? いえ、正しくは < > " と表示されるべきです。この掲示板の データ用の文書フィルタ http://www.namazu.org/doc/manual.html#doc-filter を作成したのですが、それが不十分な状態です。 > あと、同じページの最後に、webmaster@www2.startshop.co.jp と > ありますが こちらも正しくは 68user@X68000.startshop.co.jp です。これは… どこで設定するんだっけ。なんかコンパイル時に埋め込まれるような 気がしないでもないなぁ。 両方とも調べて直しておきます。ご指摘ありがとうございました。 >>1986 椎 > 目的は,ウェブページのフォームから送られた文章を, > 表示するページの都合で,改行無しの文に変更することです。 ちゃんと使っている環境を書きましょう。perl なら $str =~ s/\r\n|\n/ /g (半角空白に置換したい場合) $str =~ s/\r\n|\n/ /g (全角空白に置換したい場合) でしょうか。 |
初めて書き込みします。 UNIXのシステム音のビープ音の音量を大きくしたいのですが、どうすれば いいのでしょう。CDEデスクトップツールでビープ音の調整というのがあっ たのですが、その最大値よりもさらに大きくしたいと思ってます。 このビープ音は内部スピーカーから鳴っている様で、もし音量を調整でき ないのであれば内部スピーカーを外部スピーカーに切り替える方法を知り たいのですが、誰か分かる人いませんか。 どうぞよろしくお願いします。 |
いつも困ったときばかり相談ですみません。 #! perl ... for (sort {&year($b) <=> &year($a)} glob './bank*.txt') { my $foooo = &year($_); warn ":::: [$idat2] vs [$foooo]"; if ($idat >= $foooo) { warn "!!!!:::: [$idat2] >= [$foooo]"; open BANK, $_ or die "can't open $_ because $!"; last; } } という文が CGI の中にあって、 エラーログに :::: [20010730] vs [20010701] at /html/cgi-bin/foo.cgi line 319. :::: [20010730] vs [20010601] at /html/cgi-bin/foo.cgi line 319. :::: [20010730] vs [00000000] at /html/cgi-bin/foo.cgi line 319. !!!!:::: [20010730] >= [00000000] at /html/cgi-bin/foo.cgi line 321. と出ます。 20010730 対 20010701 の時点で 20010730 が勝つと思うのに納得いきません。 助けてください〜 |
試みに s/>=/ge/ してみたら(ゼロづめなので文字として比較しても同じかと思って)、 :::: [20010530] vs [20010701] at /html/cgi-bin/foo.cgi line 319. !!!!:::: [20010530] ge [20010701] at /html/cgi-bin/foo.cgi line 321. だそうです。(T.T) |
すっすいませんでした。 過去の2発言、忘れてください。 (文字面で、もういきなりバグってます) |
>>1987 通りすがり > HTMLならば加工するまでも無く改行が無視されますが? すみません。意味がわかりませんでした。 >>1988 68user > ちゃんと使っている環境を書きましょう。 すみません,忘れていました。 使い方も読んでいなくて,申し訳ありませんでした。今後は気を付けます。 ご推察の通り,環境はperlです。 $str =~ s/\\n/ /g なんて自分で書いて試してみたらできなかったので 書き込ませていただいたのです。 今回, $str =~ s/\r\n|\n/ /g で,試してみたのですが,上手くいきませんでした。 でも,基本的に考え方は間違っていなかったようだと わかったので助かりました。 もしかしたら,プログラムの他の部分に問題があるのかもしれません。 チェックし直してから,報告させていただきます。 |
このページは、めちゃくちゃためになりますね。 今後も参考になることをやってくれるとありがたいっす。 |
このページのおかげで,ネットワーク全体が見えてきました. 本当にありがとうございます. これからも参考にさせていただきたいので, このHPがずっとなくならないことを心よりお願いいたします. これからも頑張ってください. |
どうも忙しくて回答さえ満足にできませんな。いかんことです。 >>1989 gooo > もし音量を調整できないのであれば内部スピーカーを外部スピーカーに > 切り替える方法を知りたいのですが、 最大限に上げたのならもう音量は調節できないでしょう。 後はハード工作になるんですかね。その方面は全くわからないので、 すいませんがわかりません。 >>1990 ふくし >>1991 ふくし >>1992 ふくし えっと、解決したんですよね? >>1994 PC歴5ヶ月 >>1995 といも どもども。とはいえ時間がなくて更新も満足にできないのですが。 |