|
初めましてakuroと申します。 最近、ここを知り色々と勉強させて頂いています。 「HTTP クライアントを作ってみよう(4)」にてお聞きしたい事があるのですが。 HTTP CLIENTを実際に作成して動かしてみたのですが、 「さらなる改善点・URL エンコード」の中で、~(チルタ゛)のついた 場合、変換しなければならないとあるのですが、処理を記述しないで 試しに http://x68000.startshop.co.jp/~68user/ と入力してみたのですが、問題なく表示されました。 これはどういう事なのでしょうか? それと、次の項目の「301 Moved Permanently」なのですが、 これも/(スラッシ)無しでも表示されました。 (HEADの場合HTTP/1.1 301 Moved Permanentlyと出ましたが、 BODYもちゃんと表示されました) これもなぜ表示されるかわかりません。 質問が長くなってしまいましたが、よろしくお願いします。 (HTTP_CLIENTは少し変更して、CGI版にしていますが、処理自体は 変更していません。) |
|
また長ったらしい文章を書いてしまった…。 >>3031 ふくし > 68user さん Perl 5.8 入れてみましたか ;;; 5.8 どころか最近は 5.004_04 を使ってますよ。退化してます。 > いぜん jperl5.5 でファイルテスト演算子 -T を使っていたんですが、 > EUC-JP モードであれば EUC-JP の、Shift_JIS モードであれば Shift_JIS の > 漢字を真にしてくれて便利だったんですが、Perl 5.8 に変えたので perl-5.8.0/pp_sys.c には PP(pp_fttext) { for (i = 0; i < len; i++, s++) { if (!*s) { /* null never allowed in text */ odd += len; break; } #ifdef USE_LOCALE if (IN_LOCALE_RUNTIME && isALPHA_LC(*s)) continue; #endif /* utf8 characters don't count as odd */ if (UTF8_IS_START(*s)) { ... } ... } else if (*s < 32 && *s != '\n' && *s != '\r' && *s != '\b' && *s != '\t' && *s != '\f' && *s != 27) odd++; } とかなんとか書いてあったりします (UTF8 は OK のような雰囲気ですね)。 USE_LOCALE で IN_LOCALE_RUNTIME ならもしかして! …というわけでさらにおっかけていくと % find . -type f | xargs grep isALPHA_LC ./handy.h:# define isALPHA_LC(c) NXIsAlpha((unsigned int)(c)) % find . -type f | xargs grep NXIsAlpha ./handy.h: (NXIsAlpha((unsigned int)(c)) || (char)(c) == '_') ./handy.h:# define isALPHA_LC(c) NXIsAlpha((unsigned int)(c)) てなわけで NXIsAlpha とやらが定義されていません。isALPHA_LC を よく見てみると #ifdef USE_NEXT_CTYPE # define isALPHA_LC(c) NXIsAlpha((unsigned int)(c)) #else # define isALPHA_LC(c) isalpha((unsigned char)(c)) #endif てな感じなので、将来は実装するぞ、てなところでしょうか。 >>3032 akuro > 「さらなる改善点・URL エンコード」の中で、~(チルタ゛)のついた > 場合、変換しなければならないとあるのですが URI を定義しているのは RFC1738 です。 http://www.ietf.org/rfc/rfc1738.txt?number=1738 そこには httpurl = "http://" hostport [ "/" hpath [ "?" search ]] とあります。/~68user/ や /%7E68user/ という部分は hpath に相当します。 hpath = hsegment *[ "/" hsegment ] → hpath は hsegment を / で結合したもの。 hsegment = *[ uchar | ";" | ":" | "@" | "&" | "=" ] → hsegment は uchar か上記記号の 0 個以上の繰返し。 uchar = unreserved | escape → uchar は unreserved か escape。 unreserved = alpha | digit | safe | extra escape = "%" hex hex → unreserved は alpha, digit, safe, extra のいずれか。escape は %XX 形式。 alpha = lowalpha | hialpha digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" safe = "$" | "-" | "_" | "." | "+" extra = "!" | "*" | "'" | "(" | ")" | "," → alpha, digit, safe, extra は上記の文字 (lowalpha は英小文字、hialpha は英大文字)。 上記のどこにも ~ は含まれていません。よって、hpath には ~ を 含めてはならず、/~68user/ は間違いで /%7E68user/ は正しいのです。 …というのはその文書を書いた当時の話。今 URI を規定しているのは RFC2396 です。 http://member.nifty.ne.jp/moha/rfc/rfc2396j.txt /~68user/ に相当するのは abs_path です (*1)。 abs_path = "/" path_segments path_segments = segment *( "/" segment ) segment = *pchar *( ";" param ) param = *pchar pchar = unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | "," reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," unreserved = alphanum | mark mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" mark に ~ が含まれているため、URI として ~ を記述することが認められています。 また、上記ページの「G.2. RFC 1738及びRFC 1808からの修正点」には > チルダ文字"~"を"unreserved"集合に追加した。ある種のキーボードではこの文字の > 入力に困難を伴うが、インターネットにおいて広く用いられているためである。 とあります。 よって、現在では /~68user/ というリクエストを送っても問題ありません。ただし /%7E68user/ という表記も間違いではありません。/~68user/ と /%7E68user/ は 等価です。 # …という解釈でいいのかなぁ。自信がないなぁ。 じゃー昔は /%7E68user/ と書かずに /~68user/ とするとエラーになったのか というと、そんなことはありませんでした。その理由は 「~ を ~ として解釈しても誰も (web サーバも web クライアントも) 困らないので (むしろ便利)、web サーバが気をきかせてくれたから」 だと思います。 (*1) なぜ /~68user/ が abs_path なのかというと、 RFC2616 (http://www.studyinghttp.net/rfc_ja/2616/sec3.html#sec3.2.1) に http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] と定義してあり、さらに URL 構文やセマンティクスの定義についての情報については、(RFC 1738 [4] と RFC 1808 [11] を置き換えた) "Uniform Resource Identifiers (URI): Generic Syntax and Semantics," RFC 2396 参照。 この規格書では、その規格書にある、"URI-reference", "absoluteURI", "relativeURI", "port", "host", "abs_path", "rel_path", "authority" の定義を採用する。 とあるからです。 > それと、次の項目の「301 Moved Permanently」なのですが、 > これも/(スラッシ)無しでも表示されました。 こちらで試してみたところ、 GET /~68user HTTP/1.0 HTTP/1.1 301 Moved Permanently (略) Location: http://jfx.startshop.co.jp/~68user/ (略) <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> (略) </BODY></HTML> となりました。ここで BODY 部に表示されているのは、 「あなたが要求したドキュメントはここにあるのでクリックしてね」 という web サーバが生成した文章ですので、正しい挙動だと思います。 |
|
あっそうそう、utf8 は実装してるんですよ、言い忘れました。 ソースを追ってくれてありがとうございます。 そうやって見るんですね〜 5.004_04 って for (0..100000) でメモリはじけませんか。 ぼくは例の BigInt の件もあるし、encoding の件もあるしで、 無批判に最新版を使うようにしています。 |
|
68userさん詳しい解説ありがとうございました。 正直、自分はネットワークに関する知識が低く、100%解説を 理解できたわけではないのですが、大雑把にですが理解しました。 (RFCも始めて閲覧しました) これからも色々と勉強させていただきたいと思います。 |
|
教えてください。 メモリ使用率が知りたいのです。Linuxではsysinfoというシステムコールを使って出せましたが、SolarisとHP-UXで出せません。 知ってる方がいましたら教えてください。 |
|
>>3036 アロエ HP-UX は知りませんが、Solaris なら vmstat とか。 sar でもいけたっけかな? とかいいつつ、僕は top 入れてますけれども。 |
|
お返事遅くなりました。(>>3023) OSはUNIX(HP)です。 man lsでfulltimeを探したのですが 見つかりませんでした…。しかも、 「-fulltime」でうまくいったかと思ったのですが、 そうでもなさそうでした。 いろいろありがとうございました。 |
|
はじめまして、初めて書き込みます。 僕は高校3年生で、こんなところに書き込むのは若干場違いなのですがどの書籍を見てもよくわからなかったので書き込みました。 今、学校でLinuxを使ってHTTPについて勉強しているのですがどうしてもファイル転送ができません。 サンプルプログラムで実行しても出来ません。(その作者のホストにはちゃんとアクセスできます) Not FoundやForbiddenというのがでます。 chmodでそのファイルを他からも読み書きできるようにしているのですが無理でした。どうしたらいいでしょうか?? あとサンプルでは全てhtmlファイルなんですが、htmlファイルしかダメというわけでしょうか? 詳しい知識もなく、このような場を借りることは失礼だと思いましたが真剣に今の研究をやりとげたいと思いメールしました。 宜しくお願いします。 |
|
>>3038 ピョンタン あー、-f、-u、-l、-t、-i、-m、-e 全てのオプションを 受け付ける ls なら -fulltime でもエラーにならないかも しれないですね。想像ですが、HP-UX の ls では無理でしょう。 perl・awk などの別解でやってみてください。 >>3039 コーコー > ファイル転送ができません。 ファイル転送とはアップロード? ダウンロード? > サンプルプログラムで実行しても出来ません。 そのサンプルプログラムを提示しないと誰にもわからんでしょう。 > (その作者のホストにはちゃんとアクセスできます) なぜ作者のホストが関係あるのですか? 作者のホストに アクセスするようなサンプルプログラム? と思ったら、 > chmodでそのファイルを他からも読み書きできるように > しているのですが無理でした。 chmod できるということは自分の web ページに対して アクセスしている? > どうしたらいいでしょうか?? 自分が何を意図して何をした結果うまくいかないのか、を説明する ことだと思います。 |
|
おひさしぶりです。またまたおじゃまします。長々とごめんなさい。 以前、LAN環境でlinuxを利用していてNetscape等で名前解決できない というご相談を、 >>2779 has : >>2871 has でさせていただきましたが、その後すっかりほったらかしでした。 で、最近また気が向いたのでいくらか調べた結果、いくつか新しい事が わかってきたので一応ご報告します。 まず、dhcpにて各種情報を正常に取得できていたと以前は言ったのですが、 実はeth0起動時に1分程度かかっていました。これに関して、どうやら dhcpcdの動作はRFCで提案されている2通りのいずれかを指定できる らしく、デフォルトではなく、-rを指定することにより一瞬で起動する ようになりました。この-rで動作するモードですが、linux関係の 情報源ではあくまでも「RFC1541」と解説しているものの、どうもMSの 提案した動作のようで、これを指定してうまく動くという点が非常に ひっかかりました。 で、もしやこのLANではWindowsサーバが名前解決してるんでは?と思い はじめ、それからNetBIOSやWINSといった言葉を知るようになり、 そしてこのLAN内ではDNSが走っていないのかも、と疑い出しました。 というのも、linux上でdigによる正引きはなぜかできるのですが、 やはりCで書いたgethostbynameを利用するプログラムが動かないのは おかしいと思い、Windowsでは本当にDNSを利用しているんだろうか、 と思ったのです。試しにWindows上でipconfigによってDHCPで取得した DNSサーバアドレス192.168.0.1を割り出し、そのDNSポート53にtelnet してみたところ、アクセスはrefusedでした。 もしかしたらセキュリティ確保のため、コンマ数秒でリクエストが無い 場合にはとっととコネクションを切っているのかもしれませんが、 なんとなく俺的にはやはりDNSが動いていないような気がします。 というわけで、結論としてWindowsネットワークにlinuxをクライアントと して参加させる方法、というのが知りたいのですが、どうも検索をしても linuxをサーバ、Windowをクライアントとしてネットワークを構築する 方法しか目につかず、どうしたらよいのかわからない状況です。 もしかしたらsambaをWINSクライアントにする、という方法を使うのかも しれませんが、だとしてもそれをlinuxの名前解決とどう連携させるのか その方法もわかりません。もしこのあたりのことで知っていることが あれば、アドバイスまたは資料の場所などを教えてください。 よろしくお願いします。 |
|
[OSのVER]:Solaris7 [SQLServerのVER]:SQLServer2000 http://www.microsoft.com/japan/msdn/sqlserver/downloads/jdbc/default.asp にて提供されているJDBCDriverについて、 Windows版は使用可能だったのですが、 (Win2000PRO/TOMCAT/JSP→JDBCDriver→Win2000Server/SQLServer2000) UNIX版では (1)インストール (2)環境変数の設定 で躓いております。 (1)についてはinstall.kshを起動した際に以下のメッセージが表示され 正常にインストールされません。 **************************************************************** RSWWW001% su Password: RSWWW001# cd /export/home/ldn RSWWW001# ls DeadLetters fsearchc mssqlserverj.tar EULA.txt install.ksh read.me Mail list.jsp result.jsp a.txt local.cshrc su.txt classes_20010820.tar local.login test.login20030117 core local.profile testpass.sh editerc msjdbc.tar RSWWW001# ksh install.ksh install.ksh[2]: ^M: 見つかりません。 install.ksh[3]: clear^M: 見つかりません。 install.ksh[4]: ^M: 見つかりません。 ============================================================ = SQLServer 2000 driver for JDBC Installation = = Version 2.2.0021 = ============================================================ Initializing..... install.ksh[13]: ^M: 見つかりません。 install.ksh[17]: ^M: 見つかりません。 ================================================================= = SQLServer 2000 driver for JDBC License Agreement = ================================================================= Press <enter> to view License Agreement. install.ksh[24]: DUMMY^M: 英数字以外の文字が使用されています。 install.ksh[25]: ^M: 見つかりません。 : ファイルもディレクトリもありません。 install.ksh[27]: ^M: 見つかりません。 Do you agree to the terms of the License Agreement? <y/n> (y) install.ksh[30]: ^M: 見つかりません。 install.ksh[31]: ANSWER^M: 英数字以外の文字が使用されています。 install.ksh[32]: ^M: 見つかりません。 ' 異常終了しました。 エラー 行目34 : `in RSWWW001# **************************************************************** そこでinstall.kshの記述に沿う形で /opt/msSQLjdbc/lib以下にjarファイルを格納して作業を進めています。 (2)については、 Soralis7/富士通WebServer(INTERSTAGE)→JDBCDriver→WinNTServer/SQLServer2000 という環境下で、前述のWindows(TOMCAT)上で動作していたJSPを動かそうとしたところ、 JDBCDriverをロードする際に、ClassNotFoundExceptionが発生してしまいます。 **************************************************************** Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); **************************************************************** CLASSPATHの設定もしているのですが、原因が掴めません。 (1)(2)についてご助言頂ければ幸いです。 是非宜しくお願い致します。 |
|
NO3039の続き >>3040 お返事ありがとうございます。言葉足らずで申し訳ありませんでした。 そのサンプルは単純にデータを取得して、ファイルに保存するだけのものです。 http://www.ncad.co.jp/~komata/netprg のHTTPのサンプルソース一式 を参照しました。 作者のホストには例題としてアクセスしてみました。 自分のwebページは持っていません。学校の共有PCでやっているので学校内の他のPCからファイルを もってくるにはchmodを使うものだと思いました。 僕の中では最終的には複数のクライアントからの処理を並列処理(マルチスレッドを利用する予定)してサーバー 、クライアント間でデータをアップロード、ダウンロードできるようにしたいです。 プログラムはCでしか出来ませんが何かよいプログラムなどはあるでしょうか? よろしくおねがいします。 |
|
>>3041 has > DNSサーバアドレス192.168.0.1を割り出し、そのDNSポート53にtelnet > してみたところ、アクセスはrefusedでした。 まず、DNS の query は TCP じゃなくて UDP ですが、それは OK ですか? > Windowsネットワークにlinuxをクライアントとして参加させる方法 マイクロソフトネットワークについての知識はほとんどないのですが、 http://www.hyperdyne.co.jp/~oohashi/work/resolve/resolve.shtml などを読む限り、その方向性はなんか違うような気がします。 Windows マシンでパケットアナライザを使って、DNS サーバに query を投げているかどうか確認してみてはどうでしょうか。 >>3042 AMA > install.ksh[25]: ^M: 見つかりません。 スクリプトの改行コードが Windows 式の 0x0D 0x0A になっている からでしょう。 > CLASSPATHの設定もしているのですが、原因が掴めません。 どのように設定したのか書かないと誰にもわからないと思いませんか? あと、tomcat は起動スクリプト内で CLASSPATH を設定しなおすんじゃ なかったでしたっけ (tomcat4 だけだったかも)。 てゆーか、インストールが成功したかどうかは、まずコマンドライン アプリケーションから確認すべきだと思います。 http://java-house.jp/ml/archive/j-h-b/021880.html#body >>3043 コーコー > 自分のwebページは持っていません。学校の共有PCでやっているので > 学校内の他のPCからファイルをもってくるにはchmodを使うものだと > 思いました。 校内のマシンに apache や IIS などの web サーバを立てましたか? 立ててないなら無理です。まずは、ブラウザで http://www.example.co.jp/foo.html などとアクセスできるようにサーバ側を設定する必要があります。 しかし > Not FoundやForbiddenというのがでます。 というのを見ると web サーバは設定済のようにも読めますし、 よくわかりませんね。ブラウザで見るとどうなるんですか? サンプルプログラムの引数には何を設定しているのですか? > http://www.ncad.co.jp/~komata/netprg/ この作者の書いた「C for UNIX」という本は買いましたが、 セマフォあたりの解説で 「よくわからんがこんな感じで動いている」 といったことが書いてあり、なかなか脱力させていただきました。 サンプルの httpget.c も、 - htons を使わず、わざわざ short_conv なる関数を自作している。 - select(2) のループ内で struct timeval をリセットしていない。 - main の戻り値が void。 - インデントが厨房くさい (作者の中では一貫した基準らしきものが あるようだが…)。 - shutdown -> close という手順を踏んでいる意味がわからない。 (close でいいんじゃない?) - 戻り値が int の関数であっても、呼び出し前に宣言すべきでは? (引数の型チェックができないし) と、なかなか怪しげです。 # ま、僕も他人のことは言えないのですが。 ただし書籍の価値は読む人との相性次第で決まると思うので、だからと 言って悪い本だとはいいません。あなたが理解しやすいと思ったら それはよい本なのでしょう。そのうちもっとよい本を読んで正しい知識 を身につけてください。 |
|
>>3044 68user Windows2k上でパケット監視してみました。 Operaにてwww.jp.freebsd.orgに接続しに行ったところ、DNSへの問い合わせを 実行しており、正常な応答をもらっているようでした。 で、それとは別に最近気づいたのですが、Win2k上でnslookupが うまくいってないようなので、ついでにそちらも監視してみたところ、 Non-Existent Domainが返されていました。まだ修正方法すら調べてませんが、 これから勉強してみようと思います。 # まあこれはlinuxの設定を使用しているわけではないので、本来の目的と # 直接は関係ないのですが…(^^;) それと以前にも「linuxでパケット監視したら?」とアドバイスをもらってた ような気がするもののまだ試していないので、それも今度こそやってみます。 > まず、DNS の query は TCP じゃなくて UDP ですが、それは OK ですか? OKじゃありませんでした。上のパケット監視中UDPで送られてるのを確認しました。 http://www.atmarkit.co.jp/fsecurity/rensai/iprotect01/iprotect01.html telnetで試しに接続してみる、というのは↑を参考にしてやってたんですが、 勉強が足りなかったようです(--;) >> Windowsネットワークにlinuxをクライアントとして参加させる方法 > マイクロソフトネットワークについての知識はほとんどないのですが、 > http://www.hyperdyne.co.jp/~oohashi/work/resolve/resolve.shtml > などを読む限り、その方向性はなんか違うような気がします。 なるほど。Windowsでも「ドット区切りもしくは15文字以上のコンピュータ名は DNSで引く」ということですね。この点はどうなってるのか知らなかったので、 はっきりできてよかったです。 |
|
68user様ご助言ありがとうございました。 kshの実行については、ご指摘のとおり改行コードを直す事で 正常に実行できました。 環境変数の設定については、.cshrcに setenv CLASSPATH /opt/msSQLjdbc/lib/msbase.jar:/opt/msSQLjdbc/lib/mssqlserver.jar:/opt/msSQLjdbc/lib/msutil.jar との記述をしていたのですが、上手くいかなかったため、 (JDKインストールフォルダ)/jre/lib/ext以下に jarファイルをコピーする事で正常動作させることができました。 初UNIXで分からない事ばかりですが、このページでいろいろと 勉強させて頂きたいと思います。 ありがとうございました。 |
|
初めてメールいたします。 色々なゲームソフトをあっちこっちで拾い集めてPCにインストールしたところ C¥:REM[Header] 環境変数のため領域が足りません。 上記のメッセージが出てきてwindowsが立ち上がりません。 どのような処理をしたらいいのか教えてください。 ただ、c:\ winと入力すればたちあがってくるのですが・・・ |
|
シェル実行中にCtrl+Cして、強制終了させたときに、 バックグラウンドで動いていたシェルも終了させたいんですが、 イマイチうまく動きません。ちなみにKシェルです。 back_pid=`job -l awk '{print $3}'`でPIDを取得して kill -9 $back_pidで強制終了 というのを、trap '〜' INTの中でやろうと思ったんですが、 trapの''の中にawkの''があるせいで、エラーになってしまいます。 でも、これだと、バックグラウンドで動いてるプロセスが無い場合も、 未設定の値でkillが走ってしまうので、あまり良くないですが・・・ 何か良い方法はありませんか? |