C言語でsocketを用いたftpクライアント(Asciiモード)を作成し、solaris上で実行したところ、ftpからのリターンメッセージ、およびgetしたファイルの改行コードに『CR』が付加されてしまい、とても困っております。 これは、どのような要因が考えられますでしょうか? よろしくお願いします。 |
>>3268 ma-chan ASCII モードは LF を CRLF に置換するわけで、「CR が付加される」 というのは納得できる結果だと思います。というわけで、何に困って おられるのかよくわかりません。 |
説明が足りなくて申し訳ありません。 改めまして詳細を説明させて頂きます。 テスト環境は、Solarisサーバー2台で、 片方のサーバー上に作成したPGMを置いて、テキストファイルの 送受信を行っています。 扱うテキストファイルは、Solaris上で作成したファイルで、 改行コードは、『LF』のみです。 で、PGM内からASCIIモードでファイルをPUTする分には、 問題ないのですが、 ファイルをGETすると、改行コードに『CR』が付いてしまうという 現象が発生しております。 (ちなみに、コマンドレベルでftpをASCIIモードで実行した場合は、 『CR』は付きませんでした。) 私の認識では、UNIXサーバー側でファイルをGETする場合は、 改行コードに『CR』は付かないと思うのですが... (Windows環境でプログラムを動かしてファイルを受信した場合は、 『CR』が付くと思っています。) この認識自体が間違っていますか? よろしくお願いします。 |
>>3270 ma-chan 理解しました。 ASCII モードというものをより正確に書くと、 あなたがデータを送信するときは、事前に NVT-ASCII に変換 しておいてね とクライアントとサーバが約束すること、です。そして NVT-ASCII に おける改行は CRLF です。 なので、TYPE A で CRLF が送られてくるのは正しいわけで、CRLF を LF に変換するのはクライアント側の仕事なのです。 NVT-ASCII については (読んでませんが) 多分 RFC 854 に書いて あるんじゃないかと思います。 |
はじめまして。いつも参考にさせて頂いてます。 <環境> マシン:UNIX B2000(OKITAK9000) OS:HPーUX Ver.11.0 端末:dtterm 言語:C 上記の環境で、wgetch関数(nodelayモード)を使って、キー入力を受け取る プログラムを作成しているのですが、2つほど質問させてください。 1.キーボードからの入力をロックする方法。 キーを入力してもwgetchがコードを返却しないようにしたい。 2.ある特定のキーについて,wgetchが返却するコードを変更する方法。 たとえば,Insキーが押下されたら0x12を返却するようにしたい。 既出でしたら、申し訳ありません。 よろしくお願い致します。 |
場違いかも知れませんが藁をも掴むつもりで投稿しました。 FreeBSD4.7にてSSHでPg.pmをインストールしようとしています。 SHELLはtcshなのですが、以下の方法でインストールは可能でしょうか? cd src tar zxvf pgsql_perl5-1.9.0.tar.gz cd pgsql_perl5-1.9.0 setenv POSTGRES_INCLUDE "/usr/local/pgsql/include" setenv POSTGRES_LIB "/usr/local/pgsql/lib" perl Makefile.PL make make test root # make install 何かヒントでもいいのでよろしくお願いいたします。 |
>>3272 keijirou curces に詳しくないので回答しなかったのですが、誰か知ってる人 いませんかねぇ。 >>3273 Been > 以下の方法でインストールは可能でしょうか? よさそうに見えますが、とりあえず make test、make -n install まで 試してみればいいんじゃないでしょうか。 てゆーか、一般的には DBI と DBD::Pg モジュールを使うことが 多いと思いますが、あえて Pg なのですか? 2000年で更新止まってるし、RDBS 取り換えたら書き直しだし、あまり いいことはないと思います。 |
はじめまして。kotaroと申します。 さっそくですが、質問をさせていただいてよろしいでしょうか。 C言語において、IPアドレスのみで通信を行うプログラムの作成は可能でしょうか。 socket関数を用いた場合は、 TCPやUDPのトランスポート層の通信になると思いますが、 トランスポート層のプロトコルを解釈せずにIPヘッダーのみで通信を行う、 ルーティングのような機能を実現したいと思っています。 (ネットワークカードは2枚使用し、IPパケットを通過させる仕組み) 突然の質問で申し訳ありませんがよろしくお願いします。 |
>>3275 kotaro > IPアドレスのみで通信を行う IP (インターネットプロトコル) のみで通信を行う、という ことでしょうか。 UNIX なら可能です。Windows なら XP からですね。「raw socket」 などで検索してみてください。 |
ありがとうございます。 socket関数にrawIPを使う機能がありました。 この機能を使えば、raw(生)のIPデータグラムを扱えるので IPヘッダ以外にもTCPやUDPヘッダも自由に付けることができそうです。 |
No3272 で質問させて頂いた者です。同環境でもう1つ質問させてください。 printfで画面出力した文字を、カーソルを文字の先頭に移動させて、再度取得する方法は? カーソルの移動はエスケープシーケンスで行っています。 cursesを利用すれば表示した文字を再度取得することは可能なのですが、エスケープシーケンスを標準出力する方法が判らないのでしかたなくprintfを使っているという状況です。 cursesでエスケープシーケンスを標準出力できればよいのですが。。。 printfの文字取得、もしくはcursesでのエスケープシーケンスの標準出力、 について情報お持ちの方、回答よろしくお願いします。 |
>>3278 keijirou > printfで画面出力した文字を、カーソルを文字の先頭に移動させて、 > 再度取得する方法は? 原理的に無理でしょう。自分で出力した文字を覚えておくくらいしか ない (≒curses の再実装) と思います。 > カーソルを文字の先頭に移動させて これを curses で行えばよいだけのように見えますが、curses では ダメな理由があったりしますか? |
>>3279 68user 早速の回答ありがとうございます。 printfの文字を再度取得することは無理なんですね。 実際にprintfで出力した文字の先頭に、cursesで移動して、文字取得を行ったところ、何も取得できませんでした。 おそらく、cursesが持っているバッファからデータを持って来るようなので、printfの文字は取得されないものと思われます。 扱うデータがエスケープシーケンス入りのデータなので、printfがそのまま使えれば、解析せずに済むかと思い、質問させて頂きました。 また、画面に表示した文字のハードコピーを印刷するのにprintfの文字を再取得しようと考えてました。 もし、なにかよい方法がありましたら、またよろしくお願い致します。 |
>>3280 keijirou > printfの文字を再度取得することは無理なんですね。 そうですね。stdio ライブラリは出力した文字を覚えていませんし、 kterm などの端末エミュレータも受け取った文字を覚えていません ので。 # もし端末エミュレータが覚えていたとしても、アプリが # 端末エミュレータに文字を問い合わせるような仕組みがない。 > 扱うデータがエスケープシーケンス入りのデータなので もし curses がそのようなデータを扱えるとしたら、 1. curses が出力するデータの中身を解析し、エスケープシーケンス取得。 2. 環境変数 TERM を見て、エスケープシーケンスがその端末でどのような 挙動をするのかを調べる。 3. エスケープシーケンスを出力する代わりに、curses のライブラリを叩く。 という機能を持ってないといけないでしょうが、多分そのような 機能はないと思います。 データがエスケープシーケンス入りと言っても、ごく限られた 数種類程度のエスケープシーケンスではないですか? もしそうであれば、自前でデータを解析し、エスケープシーケンスを 出力する代わりに curses のライブラリ関数を呼ぶ、ってのが簡単 そうな気がします。 |
muleで韓国語を入力したまではよかったのですが・・・ 印刷しようとすると化けてしまいます。 コマンドを教えてください。 p.s 「any2ps hangul.tex | lpr -Pstd1pr1」を試してみましたが、 結果は、m2ps: Invalid argument: hangul.tex でした・・・。 |
>>3281 68user 回答ありがとうございます。 やはり、自前でエスケープシーケンスを判断しなければいけないようですね。 その方向で開発をすすめてみます。 いろいろとありがとうございました。 |
>>3282 ゆう 韓国語関連は全く知りませんが、引数ではなく標準入力から 渡さないといけなんじゃないですかね? http://www.tk.airnet.ne.jp/nagae/jp/comp/mule/any2ps.html |
私はネットワークについて初心者で、検索ページからこのサイトを拝見しました。噛み砕いた説明のおかげで理解しやすくとても参考になり、本当に感謝しています。ありがとうございます。 |
シェルの環境変数で宣言している物が,未定義変数だといわれ止ってしまいます。エラーが出ない場合のほうが多いのですが,さっきまで回っていたものが、未定義だと言われてとまってしまい,困っています。 なにか、アドバイスいただければ幸いです。 |
find コマンドで検索するときに、サブディレクトリを検索させない ようにすることは、出来ますか? (例)find / -name *.txt とすると、/配下のディレクトリまで検索してしまいますが、そうでは なくて、/だけを検索させたいのですが‥ ちなみに、Solarisを使用しています。 |
いつもお世話になります 早速ですが、cursesの関数で、現在のカーソル位置を記憶する、および 記憶したカーソル位置の復帰を行う関数は存在するでしょうか? 自前で現在位置を覚えておいて、wmoveで移動する方法しかないのでしょうか? |
UNIXの部屋のリファレンスを求めて初めておじゃましました。 ちょっと気づいたのですが、文字コードの指定がない上にShift_JISや EUCが混在していたりするため、しばしばブラウザが文字コード判定に失敗するようです。 <head>中に<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">等の表記を入れて頂ければうれしく思います。 |
>>3285 umio ありがとうございます。わかりにくい記述などを見つけたらぜひ教えてください。 >>3286 ゆみ > なにか、アドバイスいただければ幸いです。 情報不足です。ここらへん http://www.hyuki.com/writing/techask.html#procedure を読むとよい質問ができるようになると思います。 >>3287 bebe > find コマンドで検索するときに、サブディレクトリを検索させない > ようにすることは、出来ますか? > ちなみに、Solarisを使用しています。 GNU find などなら find / -maxdepth 1 ですが、Solaris の find では できない、と思っています。無理矢理やるなら % find `ls -dF /* | egrep -v '/$'` -type f -name \*.txt とかですが、「そんなの ls /*.txt でいいじゃん」と言われるでしょうね。 >>3288 keijirou > 現在のカーソル位置を記憶する、および記憶したカーソル位置の復帰を > 行う関数は存在するでしょうか? curces の全関数を知っているわけではないですが、多分存在しないんじゃ ないでしょうか。 >>3289 通りすがり > 文字コードの指定がない上にShift_JISやEUCが混在していたりするため、 > しばしばブラウザが文字コード判定に失敗するようです。 対処します (8月中にはなんとか…)。 しかしすべてのページは EUC-JP で統一していると思っていたんですが、 Shift_JIS なページがありましたっけ? |
文字コードなんですけど、いろいろな種類のブラウザで 全く文字化けが起きないようにするには工夫がいるみたいです。 特にApache 1.3系では、 ・ApacheのAddCharset設定で日本語コードを指定しておく ・各ページにMETAタグを入ておく の両方を行わないとだめみたいです。 かなり古い話ですがApache 1.3.12の頃からそうなってます。私の経験では <Directory /> Options FollowSymLinks AllowOverride None AddCharset ISO-2022-JP html AddCharset ISO-2022-JP htm AddCharset ISO-2022-JP shtml AddCharset ISO-2022-JP shtm </Directory> でISO-2022-JPで決めうちしたあと METAタグでShift_JISにしたりEUC-JPにするといい感じでした。 http://www.asahi-net.or.jp/~AE5T-KSN/apache/charset-problem.html |
と思って実際の設定を調べてみたのですが、普通に AddCharset EUC-JP html 等で済ませてました。これとMETAタグ併用でした。 |
はじめましてperlをはじめて半年レベルです。 貴殿のページでネットの勉強はじめましたが、レンタルサーバーのためtelnetが使えません。参考のplを実行させたいのですがどうすればやれますでしょうか。 初歩的な質問で申し訳ありませんがご指導ください。 |
>>3291 Netboy > ・ApacheのAddCharset設定で日本語コードを指定しておく > ・各ページにMETAタグを入ておく これ、いまだに迷っているのですが、HTTP ヘッダに charset を 含めるのと、meta で書くのとどっちがいいんですかね。 前者だと、ローカルにある HTML ファイルを直接ブラウザで見たりなんか すると、charset がないのでエンコーディングを誤判定してしまいます。 # IE は保存時に meta 埋めてくれますが。 でも meta だと、ファイルのエンコーディングを変えたらいちいち charset を変更しなければいけないのか、って話になりますし。 個人的には、エンコーディングくらいブラウザが自動的に (そして もっと賢く) 判定しろよ、と思います。 > http://www.asahi-net.or.jp/~AE5T-KSN/apache/charset-problem.html これについては、apache のソースをいじって charset=iso-8859-1 を 削る対応が好きです。と言っても、x68000.startshop.co.jp では やってませんが。 >>3293 kazu > レンタルサーバーのためtelnetが使えません。 ftp でサーバに CGI スクリプトを置いておくだけでいいです。 と言っても、telnet 可能かどうかは作業効率に大きく関わるため、 telnet 可なサーバに乗り換えることをお勧めします。 乗り換えたくないなら、ローカルにも perl や web サーバを入れ、 サーバ側とできるだけ同じ環境を構築して、ローカルでテストが 可能なようにしておくとよいでしょう。 |
>これ、いまだに迷っているのですが、HTTP ヘッダに charset を >含めるのと、meta で書くのとどっちがいいんですかね。 世間ではMETA優先なんじゃないでしょうか。 でもcharsetでiso-8859-1が来るとコード自動判別とMETAタグが 両方とも無効になるブラウザがあるので charsetで何か日本語コードが来るようにしないとだめみたいです。 >でも meta だと、ファイルのエンコーディングを変えたらいちいち >charset を変更しなければいけないのか、って話になりますし。 そういう場合は文字コード判別&タグ入れをスクリプトで自動化して 一括して行うしかないと思います。 全然参考にならなくて済みません。 |
>ftp でサーバに CGI スクリプトを置いておくだけでいいです。 いろいろ試しましたがよく解りませんでした。 ありがとう御座いました。 |
>>3293 kazu >ftp でサーバに CGI スクリプトを置いておくだけでいいです。 いろいろ試してみましたがうまく行きませんでした。 ありがとうございました。 |
UNIXサーバを自動運転で動かしています。 管理する他のクライアントから、起動・シャットダウンの命令を自動で行うように設定してあります。 一昨日から、UNIXサーバを起動する(自動運転)と時刻がシャットダウンした後(直後の時刻)になってしまいます。 端末については、正常な時刻になっています。 特にntpを使用している訳でもありません。 何か考えられる原因はありますでしょうか? また、怪しい部分などがありましたら教えてください。 |
>>3298 user326 > 何か考えられる原因はありますでしょうか? まぁ一番に疑うべきはハード故障なんでしょうね。手動でシャット ダウンしたらどうなるんでしょうか。 > 端末については、正常な時刻になっています。 これは意味がわかりませんでした。端末が時刻を保持している はずはないし、端末からログインして date を叩くと見ると 正常な時刻ということなら、さらに謎な挙動ですね。 |
Netboy さんと startshop さんと両毛インターネットさんの ご好意で使わせていただいておりました このサーバですが、 諸事情により使えなくなりそうです。 いつ使えなくなるかは現時点ではわかっていないのですが、 もしいきなり接続できなくなった場合は、 http://210.249.139.22/ http://home.jp.freebsd.org/~matsu/ のいずれかに移転のお知らせを出します。 が、わたしは現在ネットカフェ経由でないとこのマシンに ログインできないという情けない状況なので、お知らせが 遅れるかもしれませんがご了承ください。 |
とりあえずサーバ自体はしばらく残していただけるそうですが、 ドメインはどうなるかわかりません。 もし急に x68000.startshop.co.jp の名前が引けなくなったら http://210.249.139.22/~68user/ で見てください。 |
初めまして。 ネットワークプログラミングの基本を勉強したいと思い、いつも拝見させていただいています。 今はFTPクライアントを勉強中のところなんですが、どうしてもわからないところがあり、教えていただきたいと思って書き込みます。 68userさんのプログラムを参考にした上で、Passiveモードを使ってFTPサーバのファイルリストを取得するのみのプログラムを組んでいます。 サーバ側にまずUSER、PASSコマンドを送信するところまでは成功しました。(レスポンスを見て確認しました) しかし、その後にPASVコマンドを送っても、サーバから何の応答もありません。 これは何が悪いのでしょうか? ちなみに相手サーバは、インフォシークのレンタルweb用のFTPサーバです。 |
>>3302 ken なんでですかね。仮に PASV 未対応の FTP サーバであっても、 500 Commando not understood 程度は返してくると思います (今どき PASV 未対応はありえないと 思いますが)。 一般的に、あらゆる ftp クライアントにデバッグモードが実装されて いると思うので、まずは今お使いの ftp クライアントで試して、 デバッグ表示を見るのがよいでしょう。 それでも解決しなかったら、telnet で USER・PASS・PASV を叩いた 結果を (ユーザ名・パスワード部分は隠した上で) 見せてください。 あと、もし問題なければ > インフォシークのレンタルweb用のFTPサーバ のホスト名を教えてください。 |
はじめまして、ソケット通信を勉強したくてこちらのHPにたどりつきました。すみませんがひとつ質問させてください。 ソケット通信でindex.htmlというファイルの中身は取得できたのですが、同じようにしてindex.cgiというファイルを指定すると The requested URL /index.cgi was not found on this server.<P> という返信が返ってきてしまいます。実行ファイルの場合は何か指定の仕方が違うのでしょうか。 どうぞ宜しくお願い致します。 |
>>3304 SL > 実行ファイルの場合は何か指定の仕方が違うのでしょうか。 同じリクエストの仕方で問題ありません。 http://www.asahi.com/index.html は取得できるのに http://www.asahi.com/index.cgi は取得できないのはなぜか? asahi.com が index.cgi を置いてないからです。 |
>>3304 68user ご回答ありがとうございました。 > asahi.com が index.cgi を置いてないからです。 確かにそのとおりでした。すみません。 自分で置いてテストしたのですが、確認したら指定を間違えていました。 他サイトにあるスクリプトをソケット通信で実行したいと思って、やっているのですが、ブラウザからは実行できるのにソケット通信だとできないので、もしかしたら実行ファイルは他の設定があるのかと考えてしまいました。 ブラウザからは実行できるのにソケット通信では実行できないということはあるのでしょうか。 宜しくお願い致します。 |
>>3306 SL > 他サイトにあるスクリプトをソケット通信で実行したいと思って、 > やっているのですが、ブラウザからは実行できるのにソケット通信 > だとできないので これは index.cgi とは別の問題ですか? どんなリクエストを送っているかを明らかにしていただくのが早い んですが、まぁ想像するに Host ヘッダを送ってない、てなところでは ないかと思いました。 いずれにせよクライアントを作る前に telnet で試してみてください。 |
>>3307 68user ご回答ありがとうございます。 > これは index.cgi とは別の問題ですか? 他のサイトにあるスクリプトが実行できないので、自分のところにスクリプトを置いて実験しているだけですので、困っていることはひとつです。 > んですが、まぁ想像するに Host ヘッダを送ってない、てなところ Hostヘッダというのは送ってないような気がします。68userさんが公開してくださっているソースをそのまま使っただけですので。 ご指摘のhostヘッダの件が問題点のような気がします。 http://www.shop-link.net/tie-up/test/socket4.txt ソースは上記です。すみませんが見ていただけますか。 宜しくお願い致します。 |
>>3308 SL > ご指摘のhostヘッダの件が問題点のような気がします。 ブラウザで http://219.109.215.211/cgi/gp_new.CGI を見ると not found になるということは、そういうことでしょうね。 http://x68000.startshop.co.jp/~68user/net/http-4.html を見て、 Host ヘッダを追加してみてください。 |
>>3309 68user ありがとうございました。 なんとか動くようになりました。 Hostヘッダを追加して、proxyを使用しないようにしました。 本当にありがとうございました。 また何かありましたら宜しくお願い致します(^^; お礼と言ってはなんですが、メルマガ出してますので、何か宣伝したいことがあったらメールして下さい。<m(_w_)m> |
ご返答ありがとうございました。 えっと…結論から言うと、解決しました(^^; ftpコマンドでもtelnetコマンドでも問題が無かったので、 やはり自分のプログラムに問題があるのだろうと思い、もう一度見直しました。 どうやら、全箇所でレスポンスを受け取ってないのが原因かと思いました。 ぼくは、要所要所でだけ、受け取ったレスポンスを表示させればいいのかと思ってたんですけど、どうやらそれがいけなかったようですね。 それによっていろいろと狂ってきたようです。 レスポンスをすべて表示させたりしたら直りました。 ではでは、ありがとうございましたm(_ _)m |
初めて投稿させていただきます。 UNIXはまだ初心者です。 教えていただきたいことなんですが、今Cシェルを作成しています。 その中で処理終了後にメールを送ろうとしているのですがFrom句(差出人) を任意で変更したいと考えているのですが可能なのでしょうか。 いろいろ調べてみましたがFrom句を変えるようなものはありませんでした。 ご存知のかたがいらっしゃったら教えていただけないでしょうか。 Subjectだけ指定したソースを記載しておきます。 お願いします。 サーバ(username)[1]:/usr/ucb/mail -s "test" test@test.co.jp < test.txt |
>>3312 さんぺい > /usr/ucb/mail -s "test" test@test.co.jp < test.txt test.txt に From: hoge Subject: test To: test@test.co.jp 本文 などとヘッダ類を全部書いて、 % /usr/ucb/mail -t < test.txt でいけると思います。 ただ、エラーが発生したときに戻ってくるメールアドレス (envelope-from) はこれでは書き換わりませんのでご注意を。 もしそれも変更したいなら sendmail を直接呼ぶしかないと 思います。 |
初めて投稿させていただきます。 UNIXは学生の時に整った環境で触っていた程度です。 今、職場の方でUNIXにユーザ追加をし、メールユーザを増やそうとしています。 方法としては、 「vipwコマンド」を使用してユーザを追加しました。 ユーザ自体は追加できたのですが、いざメールを使用してみると、パスワード認証エラーがでてはじかれます。 パスワードがおかしいのかと思い、「passwdコマンド」でパスワードを変更してみたのですが結果は同じでした。 他になにか、設定がいるのでしょうか? ちなみに、「fingerコマンド」を使用して追加したユーザ情報を表示したところ、ユーザは存在すると認識されているようです。 お手数ですが、素人な私にどうかご教示下さい。 |
はじめまして、tomtom といいます。 ソケット通信に興味があり、勉強に励んではや3ヶ月の初心者です。 最近、自分で簡単なクライアントサーバのソケット通信プログラムを 作成してみたのですが、recv関数で受信エラーが発生してしまいます。 メッセージの送信元で、send関数により送信された内容と、 実際にrecv関数で受信した内容を確認してみたところ、きちんと 同じものが受信できているようでした。 そこで、エラー番号から何がおきているのか解析しようとしたのですが、 やり方が間違っているのかエラー番号を何も出力してくれません。 もし、何かお気づきのことがあるようでしたら、 ご指導いただけないでしょうか? 問題の箇所: if(recv($sock_id, $msg, $MAX_BUFF, 0) eq undef){ print "$msg"; print "errno = $!"; } |
度々すみません。 先ほど投稿させていただいたtomtomです。 処理系を書き忘れたので,再度書き込みをさせていただきました。 動かしている処理系は、linuxです。 余談ですが、linux-perlとactive-perlとで、recvやsendなどの システムコールの処理結果は、異なるのでしょうか? (NG時undefを返さず、別のものを返す、、など) クライアントをlinux-perlで、サーバをactive-perl(WinXP)で 起動しおり、サーバの方は、同様のrecv記述で上手く受信できているの で、なにか関係あるのかな、と素人ながら少し気になりました。 以上、度々失礼しました。 |
>>3315 tomtom > if(recv($sock_id, $msg, $MAX_BUFF, 0) eq undef){ undef かどうかのチェックは、正しくは if ( ! defined recv($sock_id, $msg, $MAX_BUFF, 0) ){ です。recv は相手側のアドレス (IP アドレス+ポート番号) を 返すので、それが undef と一致する、と解釈されているのかも しれません。 # でも、この書き方では undef を返さない限り eq undef と # ならないような気がするなぁ。 >>3314 mikan > いざメールを使用してみると、パスワード認証エラーがでて > はじかれます。 メールを使用というのは、POP を使ってメールを取得してみた ということですか? もしそうなら、telnet で POP サーバに アクセスし、本当に認証エラーになっているのか調べてください。 http://x68000.startshop.co.jp/~68user/net/pop3-1.html あと、ユーザ追加だけで OK か、というのは職場のメールサーバの 設定次第なので何とも言えません。 |
tomtomです。 68userさん、アドバイスをありがとうございます。 自分が素人であることを実感いたしました。 undefを判別するのには、define関数をもちいるのですね。 アドバイスに感謝いたします。 早速、試してみますね。 ではでは |
perlでテキスト処理をしていますが、有るリストをキーとしたハッシュ を生成したんですが、そのキーとなるファイルのサイズが110Mb程、キー数 (レコード数)は約1000万弱のレコードが有ります。 そのハッシュのキーを使い別のCSVのフィールドの中に同じキーが存在 する場合に必要な処理を行なっています。 if(exists $KEY{$csv_key_field}){ 処理 } で、実際に動かすと500Mbのメモリを使い切り(何故?)、1Gbのスワップ さえも使いきり止まってしまいます。 根本的にこのアルゴリズム自体が悪いのか、それとも何かメモリ使用量を 抑える解決方法があるのか教えてください。 ちなみに、キーとなるデータを配列に格納して grep で検索するとさらに べらぼうに時間が掛かります。 具体的には2つのリストの合成処理なんですが、このくらいの規模になると DBに置き換えて処理した方が良いのでしょうか? (最終的には何らかのDBに格納されるそうです) もちろん、変数は可能な限り局所化しています。(つもりです(^^;) もっと言えば、上記は最大サイズのリストではありますが、キーリストは 複数あり、それらを順繰りに処理しています。 どうぞお助けくださいm(_ _)m |
>>3319 スナフキン > そのキーとなるファイルのサイズが110Mb程、キー数(レコード数)は > 約1000万弱のレコードが有ります。 全体のデータ容量がわからないですが、仮に 300MB 程度だとしても、 1.5GB 喰い尽くしてもおかしくないかなぁとは思います。 perl の内部構造は知りませんが、スカラー 1つ、配列の一要素、 ハッシュ 1キーなど、それぞれに必ず何バイトかずつ管理用データを perl が保持しているからです。 実感としては、100MB 程度でもデータの持ち方次第ではまともに 動かないこともあるんじゃないかと思います。 > このくらいの規模になるとDBに置き換えて処理した方が良いので > しょうか? perl でもがんばれば何とかなるかもしれませんが (実データはファイルに 保存し、ハッシュにアクセスされるたびに tie でそのファイルを見にいくとか)、 1. データが固定長 (もしくは最大長が決まっている) 2. CSV の項目名や項目長が変わる可能性は少ない 3. 処理内容が変わる可能性が少しでもある (この条件に引っかかるレコードは除外する、とか) であれば、DB に突っ込んだ方がよろしいのではないでしょうか。 わたしならそうします。 項目名や項目長も変わるかもしれないなら、DBD::CSV モジュールとか (使ったことないですけど)。 |
助言ありがとうございます。 >仮に 300MB 程度だとしても、1.5GB 喰い尽くしてもおかしくないかなぁとは思います。 うーんやはりそうですか。 データの持ち方の影響も大きいとは思いますが、ハッシュは内部で キーのインデックスを作っているために、キー全体のデータよりも 相当数のメモリを食うのかな?となんとなく考えていましたが、 まさかこれほどとは思いませんでした。 > 1. データが固定長 (もしくは最大長が決まっている) > 2. CSV の項目名や項目長が変わる可能性は少ない > 3. 処理内容が変わる可能性が少しでもある > (この条件に引っかかるレコードは除外する、とか) >であれば、DB に突っ込んだ方がよろしいのではないでしょうか。 2と3は該当するので、DBに変換して処理する方向でやってみます。 ただ、元の入力ソースの総合計が2.6Gbも有るので、DB化する事に かかる時間やファイル占有量がわからなくてその選択肢を選びま せんでした。 全て書き直しになりそうだ・・・汗 |
突然のメールですみません。 岩崎と申します。 実は、WebでMewの操作について探していたところ、貴殿を拝見し、 もしかしたら、下記の対応方法をご存じなのではないかと思い、 メールをお送りさせていただいております。 お忙しいとは思われますが、もし、ご存じでしたならば対処方法を 教えてください。 ---- 質問 ---- 現在、MewにてMailチェックをしております。 emacs上でM-x Mewとタイプするとパスワードが聞かれると同時に 過去のMail(以前受信したMail)も表示されます。 しかし、昨晩より、M-x Mewと打ち込んでも新規に受信したmail しか閲覧できません。おかしいとおもい、Mail/inbox配下を 見たところ、確かに1〜3500件までは入っております。 再度、「i」コマンドで新しいMailを受信すると、受信したMailは 3501件目と表示されますが、3500件目より以前のmailは見えません。 「Shift-O」で順番を整理すると、整理はできるようです。 Mewにて何故か?見えなくなった過去のMailを見えるようにするには どのようにすればよろしいのでしょうか? ご存じであれば、教えてください。 よろしくお願いいたします。 また、できれば、CCでiwanov@relief.ne.jpまで情報を転送 いただければ幸甚です。、 |
ご存知の方がいらっしゃれば、教えてください。 UNIXサーバで、あるファイルがなくなりました。 いつ、どのように消えてしまったかを知る術はあるのでしょうか? 領域不足で、優先度が低く削除されたとか、 誰かがrmコマンドを実行したとか…。 教えてください。 |
>>3322 岩崎 Mew のことは http://www.mew.org で質問した方が早く解決すると思います。 >>3323 pyontan > いつ、どのように消えてしまったかを知る術はあるのでしょうか? 残念ながら、よっぽど特別な仕掛けでも仕込んでおかない限り 無理だと思います。 > 領域不足で、優先度が低く削除されたとか、 さすがにこれはないでしょう。ちなみに UNIX では、ファイルに 優先度という概念はないです。 > 誰かがrmコマンドを実行したとか…。 というようなログも、一般的な UNIX では用意されていないです。 |
こんばんは。 現在、DNSクライアントを勉強中です。 サンプルをまだ解析中なんですけど、どうしてもわからない箇所がいくつかあるので…質問させていただきます。 まず、フラグについてです。 えっと…少し説明しにくいんですけど、何故、16ビットと書いてあるのに第15ビットまでの説明までしかないのでしょうか? 次に、ネットワークバイトオーダについてです。 サンプル中で、質問数、回答数、権威数などはpackするときにネットワークバイトオーダに変換しているのに、IDとフラグを変換しないのは何故でしょうか? どういう物をネットワークバイトオーダに変換しなければいけないのかよくわからなくて…。 最後に、サンプル中に出てくる$restについてです。 データを受信した時、細かく言うと$restにはどういった順番でデータが入っているのでしょうか? それがよくわからなく、get_domainサブルーチンに渡したときの処理の仕方がよくわかりません…(−−; 以上長々と申し訳ありませんが、どうかよろしくお願いしますm(_ _)m |
>>3325 ken > 何故、16ビットと書いてあるのに第15ビットまでの説明までしか > ないのでしょうか? http://x68000.startshop.co.jp/~68user/net/resolver-2.html#flag のところですね。わたくしの誤りです。RCODE が 3ビットとなって いますが、正しくは4ビットです。近いうちに直します。 # 表の部分で「1……15bit」とあるところも、「1……16bit」の # 誤りですね。 > 質問数、回答数、権威数などはpackするときにネットワークバイト > オーダに変換しているのに、IDとフラグを変換しないのは何故でしょうか? http://x68000.startshop.co.jp/~68user/net/resolver-3.html#4 の以下の部分ですね (一部略)。 sub make_query { my ($type, $class) = @_; # 識別子設定 my $id = pack('B16', '0000000000000000'); # フラグを構成する各要素を設定 my $qr = QR::Query; # 0:質問 my $opcode = OPCODE::StandardQuery; # 0:標準照会 my $aa = 0; # Authoritative Answer (応答時にセット) # フラグ (0 と 1 の文字列) my $flg_binary = sprintf("%d%04d%d%d%d%d%03d%d", $qr, $opcode, $aa, (略)); # フラグ (2バイトのバイナリ) my $flg = pack("B16", $flg_binary); # 質問数のみ 1。回答数、権威数、追加情報数はいずれも 0。 my $question_count = pack('n', 1); my $response_count = pack('n', 0); # foo.example.com というホスト名を 3foo7example3com という形に変換。 my $query_name = &make_domain($query_host); # リクエストは「識別子+フラグ+質問数+回答数+権威数+追加情報数+質問」からなる。 my $request = $id.$flg.$question_count.$response_count.$auth_count.$ext_count.$question; return $request; } ID やフラグは pack('B16') でバイナリデータに変換していますが、 その際に順番が入れ替わることはありません。 pack('B16', '1111000000000011') は順序を保持したまま 1111000000000011 となります。 0000001111110000 となることはありません。 ただし数値の場合は、Short 値を作ろうとして素直に my $question_count = pack('s', 1); などとしてしまうと、リトルエンディアンな Intel 系では 0x01 0x00、 ビッグエンディアンな Motorola・Sparc 系では 0x00 0x01 となって しまいます。よってこの場合は my $question_count = pack('n', 1); と n を使って、どの環境でも 0x00 0x01 となるようにするわけです。 > データを受信した時、細かく言うと$restにはどういった順番でデータが > 入っているのでしょうか? 以下、http://x68000.startshop.co.jp/~68user/net/sample/resolver-1.pl の sub parse_response 関数の説明をします。 my ($id, $flg, $question_count, $response_count, $auth_count, $ext_count, $rest) = unpack('nnnnnna*', $org_dgram); の時点では、$rest には「(7)質問レコード以降のデータ」(回答レコード・権威 レコード・追加情報レコードも含む) が入っています。 データの順序は http://x68000.startshop.co.jp/~68user/net/resolver-2.html#4 の「解析した応答の構成」の順のとおりです。 $rest の先頭のデータは「(7)質問レコード」ですが、「(7)質問レコード」は (7.1)照会名 (可変長) (7.2)照会タイプ (7.3)照会クラス から成り立っていますので、$rest の先頭データは「(7.1)照会名」であるとも 言えます。 その後、 foreach my $count ($question_count){ my $domain; # この時点で $rest の先頭データは「(7.1)照会名」 ($domain, $rest) = get_domain($rest, $org_dgram); # この時点で $rest の先頭データは「(7.2)照会タイプ」 my ($type, $class) = unpack('nn', $rest); # ↑「(7.2)照会タイプ」と「(7.3)照会クラス」を取り出す。 substr($rest, 0, 4) = ''; # ↑取り出した「(7.2)照会タイプ」と「(7.3)照会クラス」を削る。 printf "質問: ドメイン名: %s\n", $domain; printf "質問: タイプ: %d (%s)\n", $type, TYPE::getName($type); printf "質問: クラス: %d (%s)\n", $class, CLASS::getName($class); print $hr_line; } といったふうに、$rest の先頭部分から順に、データを取り出す⇒削る という処理を繰り返します。 質問部分を読み終わると、$rest にはリソースレコード (回答・権威・追加情報) が 残っています。リソースレコードは ドメイン名 (可変長) タイプ クラス 生存時間 (TTL) リソースデータ長 リソースデータ (可変長) から成っていますので、 foreach (1 .. $count){ my $domain; ($domain, $rest) = get_domain($rest, $org_dgram); # ↑ここでドメインを切り出す。 my ($type, $class, $ttl, $rdata_length) = unpack('nnNn', $rest); # ↑タイプ・クラス・生存時間・リソースデータ長を取り出す。 substr($rest, 0, 10) = ''; # ↑タイプ・クラス・生存時間・リソースデータ長の分を削る。 my ($rdata) = substr($rest, 0, $rdata_length); substr($rest, 0, $rdata_length) = ''; # ↑リソースデータ取得 } と、ここでもやはり「データを先頭から取り出し、削る」の繰り返している わけです。 |
なるほど…だいたいよくわかりました、ありがとうございます。 でもまだget_domainサブルーチン中の処理がよくわかりませんねぇ…。 while文の最初のif文の中です。 493: if ( ( $len & 0xc0 ) == 0xc0 ){ 494: # 上位 2ビットが立っていたら、もう 1バイト読みこむ (合計 16ビット)。 495: # そして上位 2ビットを落とし、残り 14ビットを DNS サーバから 496: # 返された UDP データグラム先頭からのオフセットとして再帰。。 497: 498: my $offset = unpack('n', $data) ^ 0xc000; 499: my $new_data = substr($org_data, $offset); 500: substr($data, 0, 2) = ''; 501: 502: my ($domain_part) = get_domain($new_data, $org_data); 503: push(@domains, $domain_part); 504: last; 505: 506: } else { 507: # 上位 2ビットが立っていないので、カウンタとして扱う。 508: substr($data, 0, 1) = ''; 509: } まず、if文の中で$dataの上位2ビットが立っていたときに、その2ビットを除いた上位14ビットを$offsetに入れて、$org_dataの$offset番目からのデータを$new_dataに入れて、$dataの上位2ビットを落としたところまではわかりました。 そのあと再びget_domainサブルーチンを呼び出すところからが…どうなるのでしょうか??(^^; また、else文の中の1行はどういった意味を持っているのでしょうか? ここでいう「カウンタ」という物もよくわからなくて…。 どうか、よろしくお願いします |
>>3327 ken > そのあと再びget_domainサブルーチンを呼び出すところからが… > どうなるのでしょうか??(^^; http://x68000.startshop.co.jp/~68user/net/resolver-2.html#6 の例だと、 最初に get_domain が受け取った $data が (0x04)www2(0xC0)(0x13).... で、一回目の while ループが終了した時点で $data = "(0xC0)(0x13)...." @domains=('www2');★1 となっています。 二回目の while ループでは my $len = unpack('C', $data); で $len は 0xC0 になり、 if ( ( $len & 0xc0 ) == 0xc0 ){ が真なので my $offset = unpack('n', $data) ^ 0xc000; ⇒ $offset は 0x13 my $new_data = substr($org_data, $offset); ⇒ $new_data は、UDP データグラム全体 ($org_data) の 0x13バイト目 substr($data, 0, 2) = ''; ⇒ $data は "(0xC0)(0x13)...." から "...." となる (先頭 2バイトを削る) となります。$new_data には (0x09)startshop(0x02)co(0x02)jp(0x00) が入っています。 ここで my ($domain_part) = get_domain($new_data, $org_data);★2 push(@domains, $domain_part);★3 と get_domain を再帰呼び出しすると、 sub get_domain { my ($data, $org_data) = @_; の $data には (0x09)startshop(0x02)co(0x02)jp(0x00).... が入っています。再帰呼び出しされた get_domain が処理を終えるときには @domains = ('startshop', 'co', 'jp'); となっており、最終的に return 'startshop.co.jp'; とドメインの一部を返します。 で、再帰呼び出しした側の get_domain に処理が戻ると、以下のような 流れになります。 ★1 の @domains にはすでに www2 が入っている ★2 の $domain_part には、再帰呼び出しした get_domain から受け取った startshop.co.jp が入っている ★3 で @domains = ('www2', 'startshop.co.jp') となる > また、else文の中の1行はどういった意味を持っているのでしょうか? > ここでいう「カウンタ」という物もよくわからなくて…。 (0x03)www(0x02)jp(0x07)FreeBSD(0x03)org(0x00) の 3・2・7・3・0 がここでいうカウンタです。$len には その後に続くバイト長が入っており、 508: substr($data, 0, 1) = ''; はその $len の部分を削っています。 # 説明文で使用していない用語 (カウンタ) を、ソースで使ってはいけませんね。 |
先日質問させていただいた、tomtomです。 クライアントが受信待ちの状態の時に、サーバに ソケットをクローズされたら、クライアントは、 どうなるのでしょうか? 以前質問させていただいた時に、undefを受信してしまう という問題があったのですが、サーバ側で勝手にセッションを 終了してしまっていた可能性があるので、その辺が関係している かどうか疑問に思ったため、再度質問させていただきました。 |
あ〜っ、なるほど! わかりました!完璧にわかって疑問が紐解けましたよ〜! get_domainの再起呼び出し後はそういう処理だったんですね…。 カウンタの意味もわかりましたし(^^;)、もうばっちりです! 長々と本当にありがとうございましたm(_ _)m もしまた何かありましたら…よろしくお願いいたします(^^; |
こんにちは、今Perl で UDP 通信を行うスクリプトを作っているの ですが、少し分からないところがあるので質問させてください。 普通に UDP 通信は問題なく行えているのですが、送信元の IP アドレスが 拾えなくて悩んでおります。 recv 関数の戻り値で「送信元のアドレス」は拾えるのですが、送信元が 「どこへ宛てて送信したか?」が分からないのです。 IO::Socket::INET モジュールを使用していますが、peeraddr メソッドを 使っても何も返ってきません。 http://x68000.startshop.co.jp/~68user/net/udp-3.html に UDP で connect 出来ると書かれていますが、connect すれば送信先アドレスを 拾う事ができますでしょうか? ご存じの方、よろしくお願いいたします。 |
>>3329 tomtom > クライアントが受信待ちの状態の時に、サーバにソケットを > クローズされたら、クライアントは、どうなるのでしょうか? 単に相手がソケットをクローズしただけなら、recv は 0 を 返します。 もし A が listen → B が connect → A がソケットクローズ → B が send → B が recv なら、B は SIGPIPE を受けます。 >>3331 lopper > recv 関数の戻り値で「送信元のアドレス」は拾える > のですが、送信元が「どこへ宛てて送信したか?」が > 分からないのです。 ソケットが送信先を記憶していないからです。同じ相手に 連続して UDP データグラムを送信する場合、 socket(SOCKET, PF_INET, SOCK_DGRAM, 0); send(SOCKET, "hoge1", 0, $sock_addr); send(SOCKET, "hoge2", 0, $sock_addr); と、毎回 send の引数に宛先である $sock_addr を指定 しなければいけません。なぜなら、一度目の send を 実行した後、SOCKET は $sock_addr に送信したことを 覚えていないからです。 # ソケットの先のアドレスが確定していないので、相手側で # エラーがあって ICMP メッセージが返ってきても、カーネルは # どのソケットにエラーを伝えればよいかわからない。だから # 非 connect な UDP では相手側のエラーを拾えないわけです。 > connect すれば送信先アドレスを拾う事ができますでしょうか? できます。 socket(SOCKET, PF_INET, SOCK_DGRAM, 0); connect(SOCKET, $sock_addr); この処理で SOCKET は「宛先が $sock_addr であること」を 覚えます。よって、この後 send する場合は send(SOCKET, "hoge1", 0); と宛先を省略できるのです。 C で言うと、connect(2) することで、sendto(2) ではなく send(2) が使えるということです。 |
68user さん、お返事ありがとうございます。 socket => connect を行う事で send を呼ぶ時に IP アドレスを 指定しなくても良くなるわけですね。 逆に recv などで受信する時はどうなのでしょうか。 例えば 192.168.0.255 宛のブロードキャストメッセージを受信しても 受信側からはブロードキャストメッセージを受信したのか、ユニキャストを 受信したのか分かりません。 Java などで UDP を使う時は相手が送信した IP アドレスと相手の IP アドレス両方が分かるようですが、Perl では難しいのでしょうか? |
ちょっと前にこのページが移転するかもと言っていましたが、 継続して使わせていただけることになりました。 68user's page は Startshop さん http://www.startshop.co.jp/ 両毛インターネットさん http://www.takauji.or.jp/ Netboy さん のご厚意により、回線・マシンを無料で使用させていただいて おります。ここに改めて感謝の意を表したいと思います。 |
>>3333 lopper > 例えば 192.168.0.255 宛のブロードキャストメッセージを受信しても > 受信側からはブロードキャストメッセージを受信したのか、ユニキャストを > 受信したのか分かりません。 一般的な BSD ソケットの API を使う以上は判断できないと思っています。 > Java などで UDP を使う時は相手が送信した IP アドレスと相手の IP > アドレス両方が分かるようですが、Perl では難しいのでしょうか? Java なら受け取ったデータグラムがブロードキャスト宛かどうかを 判断できるのでしょうか。 もしそうなら、Java が BSD ソケット API を使用せずネットワーク 機能を自前で作っているとは考えづらいので、BSD ソケット API で 実現可能なのだろうと思います。 DatagramSocket や DatagramPacket を見る限りでは、Java であっても 無理ではないかと思いましたが、もし可能なのであれば Java で記述 したサンプルプログラムを見せていただけますでしょうか。 |
おお、それはすばらしいですね。 もし私が両毛地方とか県南・県央(一部重複してますが)に住むことに なったら、率先して両毛インターネットさんを選びたいという気持ち でいっぱいです。 |
お返事ありがとうございます。 確実に Java で宛て先アドレスを取得できるという確認はしていない のですが、以下の IP Messenger for Java の中では行っている ようです。 http://www1.ttv.ne.jp/~digitune/Java/IPMsg/ からソースコードをダウンロードして、その中にある IPMProxyEvent.java ファイルの中にある、getToIPMAddress で見ている見たいです。 P.S. 私は Java には詳しくはないので、確実かどうかわかりません。 |
>>3336 へにか > 率先して両毛インターネットさんを選びたいという気持ちでいっぱいです。 本当に一銭たりともお金を払っていないので申し訳ないことです。 機会があればぜひとも。 >>3337 lopper > IPMProxyEvent.java ファイルの中にある、getToIPMAddress で > 見ている見たいです。 ぱっと見、Java 版 IP Messenger 独自機能である proxy 機能の ソースのように見えます。README には「proxy 機能は TCP で実装 されている」とありましたので、多分違うのではないかと思います。 ちなみに 本家 IP Messenger は、受けたメッセージがブロード キャストだと、ログに「(多)」などと表示されます。 しかしこれは UDP のレイヤで判別しているのではなくて、IP Messenger のアプリで使用するコマンドの IPMSG_BROADCASTOPT が 立っているかどうかで判断しています。 |
lopper です。 お返事ありがとうございます。 ブロードキャストの件了解しました。なるほど Java版 ではプロキシに TCP を 使用しているので IP アドレスが拾えるのですね。わかりました。 色々とありがとうございました。自分なりに他の道を探してみます。 |
tomtomです。 68userさん、お返事ありがとうございます。 そうですか、、もし、undefを返すなら以前の 説明がつくと思ったのですが、どうやら見当違い のようですね。 また、色々考えてみる事にします。 原因が分かったら、また書き込みさせていただきます。 |
こんにちわ。以前質問させてもらった者です。 それで、また質問なのですが(笑 Perlカテゴリの中のProxy Serverのことで質問です。 SIGPIPEシグナルが飛んで来た時用 ということで、$SIG{PIPE}を作られていますが、 これはどこで使用されているのでしょうか? 作っとけば勝手にってことなのでしょうか? お忙しいかと思いますが、よろしくお願いします。 |
>>3341 のぐけん。 > $SIG{PIPE}を作られていますが、これはどこで使用 > されているのでしょうか? 作っとけば勝手にって > ことなのでしょうか? 勝手に使用されます。 シグナルを最初に受けるのはカーネルです。カーネルは プロセスごとに「SIGINT がきたらどーする、SIGPIPE が きたらこーする」というテーブルを参照し、適切な動作を 行います。 つまり %SIG の書き換えというのは、自分のプロセスの シグナル処理用テーブルを更新なわけで。 |
ところで、 http://x68000.startshop.co.jp/~68user/net/link-book.html#8 の「UNIX ネットワークベストプログラミング入門」ですが、 UNIX ネットワークプログラミング入門 http://www.gihyo.co.jp/books/syoseki.php/4-7741-1754-4 として新版が出版されてるのを見付けました。 買ってませんが、立ち読みした限りでは htons は使われて いました (笑)。大幅な内容追加というわけではないようなので、 「ベスト」の方を持っている人は不要かなーという感じです。 クライアントとサーバ両方を自作してみるというのは重要な ことだと思いますので、改めてお勧めしておきます。 |
始めまして、Tsunと申します。 何時も勉強させて頂いております。 共通鍵暗号のページで3DESでの鍵長が56*3にならない訳ですが、3DESは DESプロセスを3回繰り返すと言う意味で、使う鍵は実は2個なのです。 具体的に言うと、56ビットの鍵AとBを用意して、以下の様に暗号化します。 元データ→鍵Aで暗号化→鍵Bで復号化→鍵Aで暗号化→暗号データ (1) (2) (3) (2)で(1)で暗号化したものとは別の鍵で復号化する訳ですから、当然正しく復号されません、しかし見方を変えれば、これは別の鍵で暗号化したものと、同値となります。ただ鍵としては56ビットを2つ使っているだけなので、鍵の強度としては112ビットの鍵長と同等となります。 この方式の利点は、実質的には56ビットの演算量+αで112ビット相当の鍵強度が得られる所にあります。 鍵長と演算量の比は対数的ですから、112ビットの鍵を使って1回演算するより、56ビットの鍵を使って、3回演算するほうが有利となります。 |
お世話になります。UNIXを学びはじめて1か月半の初心者です。grep, findの使用方法を完全理解していないためだと思いますが、(すみません。)ある文字列を含む、ファイル名を検索するにはどのように、grepあるいは、findを使用すればよろしいでしょうか? |
はじめまして。私は普段、 find ./ -type f | xargs grep -n "foo" とかやってますが。後はお好みでgrepに-iつけてみたり。 |
こんばんは初めまして。pranky と申します。 ここで、いつもネットワークプログラミングなどを勉強させて頂いております。 今回 TCP で実装してあった双方向のプロトコルをファイアウォールにも 対応させなくてはならなくなり、困っているのでご相談させて下さい。 今のところ考えているのは、現在の TCP のプロトコルを HTTP の上に乗せて HTTP プロキシに対応する事でファイアウォールを越えようと考えています。 開発言語は Perl を使用しておりますので、テスト的に HTTP:Daemon モジュールを 使用してサーバを構築し、LWP::UserAgent でクライアントとして動作を させてみました。 1. 基本的に既存のプロトコルが Peer to Peer なので、起動時にクライアント側から サーバ側へ HTTP 接続をし、その起動中はつないだままにしておきたい。 2. 接続中はクライアント側からもサーバ側からも数KB 位のデータのやりとりを 双方向で行いたい。 この上記2 点は両立するものでしょうか? 上の 1. は keepalive を行えばできそうな感じはしますが、下の 2. はできる のでしょうか。 通常のブラウザを見ていると 1. サーバ側へファイル要求 2. サーバ側がファイル送信 という事の繰り返しですが、MSN Messenger が HTTP を使用している事を 考えると上記の 1. 2. の両立が出来そうな気がします。 |
はじめまして。 いつもUNIXの情報を参考にさせて頂いております。 現在、あるファイルに書かれたファイル名を取得し、 そのファイル名が存在するか判定するCシェルを作成しております。 set FILE_NAME = `awk '{printf $1}' fileA` というコマンドでファイル名は取得できたのですが、 ファイル内で改行されている際に改行コードまで取得してしまい、 ファイルの存在判定が正しく行えません。 改行を除外してファイル名を取得する事は出来ないでしょうか? ご存知でしたら御教授して頂きたく思います。 宜しくお願い致します。 |
>>3344 Tsun 勉強になります。ありがとうございます。 もうちょっと勉強して自分のモノにしてから web の方も 修正したいと思います。 >>3345 asachio > ある文字列を含む、ファイル名を検索するには 「ある文字列を含むファイル」の名前の一覧がほしいなら >>3346 4lj で紹介していただいた方法で。 じゃなくて「ファイル名にある文字列を含むファイル」の名前の 一覧が欲しいのなら % find /dir -name \*hoge\* -print などなど。 >>3347 pranky > 1. 基本的に既存のプロトコルが Peer to Peer なので、起動時に > クライアント側からサーバ側へ HTTP 接続をし、その起動中は > つないだままにしておきたい。 > 2. 接続中はクライアント側からもサーバ側からも数KB 位のデータの > やりとりを双方向で行いたい。 1 は keep alive を使ったとしても、proxy のタイムアウトが ある or あるかもしれないので無理ではないかと思います。 2 も HTTP ではサーバプッシュができないので、純粋な意味での 双方向通信は無理ではないでしょうか (サーバから不定期に クライアントにデータを送るのは不可能だが、クライアントが 定期的にサーバに接続し、そのレスポンスにサーバからのデータを 載せるなら可能)。 > MSN Messenger が HTTP を使用している事を考えると上記の > 1. 2. の両立が出来そうな気がします。 MSN Messenger は UPnP を使用しており、UPnP が HTTP の上を 流れているだけです。よって、純粋な HTTP では実現不可能では ないかと思います。 どこまで実現可能かは、プロトコルの詳細がわからないとなんとも 言えないです。 >>3348 YK > set FILE_NAME = `awk '{printf $1}' fileA` > ファイル内で改行されている際に改行コードまで取得してしまい、 > ファイルの存在判定が正しく行えません。 csh は set foo=`bar` とした時点で改行コードを除去すると思う のですが、改行コードまで取得してしまうというのは本当でしょうか? どういう方法で改行コードが原因だと確認されましたか? UNIX の改行コードは 0x0a ですが、DOS や Windows は 0x0d 0x0a です。それが残っているのであれば、tr などで 0x0d を削除してください。 http://x68000.startshop.co.jp/~68user/unix/pickup?tr |
Solaris8で (1) 100M Full-Duplex (2) 1000M Full-Duplex が混在(共存)している環境を設定するには、どうしたらいいでしょうか。 因みに (1) hme0 (2) ge0, ge1 という名で認識されるようです。 よろしくお願いします。 |
>>3347 pranky ファイアウォールがHTTP/1.1のCONNECTメソッドの使用を許可している環境で あればそれを使用すれば解決しますね。 CONNECTの使用ができない場合にはHTTPトンネルと呼ばれるソフトウェアを使用すれば 良いと思います。 私が以前作成したHTTPトンネルが http://www.jumperz.net/index.php?i=2&a=0&b=0 にあります。 68userさんのおっしゃる >2 も HTTP ではサーバプッシュができないので、純粋な意味での > 双方向通信は無理ではないでしょうか (サーバから不定期に > クライアントにデータを送るのは不可能だが、クライアントが > 定期的にサーバに接続し、そのレスポンスにサーバからのデータを > 載せるなら可能)。 を実装したものとなっています。 その他上記URLからリンクしていますが、C言語で書かれたGNU Httptunnelなど同じ種類の ソフトウェアがいくつか存在します。 |
名づけのページを作っています。 漢字の組み合わせで名前を作るため 例えば 亜xあyあい 井xい のようなデーターを作り while(<FILE>){ chomp; $key=$_; ($key,$values)= split(/x/, $_); $t3{$key}=$values; } のような連想配列に入れていました。 (色々と考えて漢字のデータはeuc,cgiスクリプトはsjisです) これを使って名づけのCGIをホームページで公開しているのですがある人から「治」という字が使えないとメールがありなぜかなと考えてみました。 ローカル(windowsXP)な環境ではキチンと表示されます。がプロバイダにアップロードすると使えなくなります。(wakwakとNETAGEどちらも) そこでアップロードして実験してみました。 @rkey= values %t3; @rkey2= keys %t3; これでキチンと配列が作られているか---連想配列は出来ていました。 次に $nnn='治'; &jcode'convert(*nnn,"euc"); $us=$t3{$nnn}; とやってみたのですがこれだと$usの値が見つかりませんでした。 そこで コードのせいかと思い単純に $nnn='治';#これはsjis &jcode'convert(*nnn,"euc"); として$nnnをHTML(euc)で表示したらコードの変換がうまくいかないようで文字化けします。 そこで $nnn='治'; &jcode'convert(*nnn,"euc"); $code=&jcode'getcode(*nnn); としてコードのチェックをしてみたのですが何もコードの判別ができないのです。 ちなみに違う漢字では上の実験はキチンと反応しました。 結果どうも治の文字コードの変換がうまくいかないように思うのですがどうしたらいいのかわからないのです。何かいい方法はありませんか?教えてください。お願いします。 |
>>3351 金床 金床さま、はじめまして pranky です。 ありがとうございます! http tunnel で調べてみたところ CPAN に http-tunnel を実装した モジュールがありましたので、簡単なソフトを作成して AnHTTPD と 一緒に使用してみたところ、TCP が接続できました! この方法で試してみます! |
>>3350 セルゲイ > (1) 100M Full-Duplex > (2) 1000M Full-Duplex > が混在(共存)している環境を設定するには、どうしたらいいでしょうか。 100M な NIC と 1000M な NIC の 2枚差しではダメでしょうか。 って、まわりにギガビットな環境が全くないのでわからない んですけどね。 >>3352 落合 Shift_JIS の「治」は 0x8e 0xa1 ですが、EUC-JP の半角カナの 句点「。」も 0x8e 0xa1 だからです。 > $nnn='治'; > &jcode'convert(*nnn,"euc"); > $code=&jcode'getcode(*nnn); > としてコードのチェックをしてみたのですが何もコードの > 判別ができないのです。 jcode.pl を読めばわかりますが、理論的にエンコーディングの 正確な自動判断は不可能なので、 - EUC-JP として解釈できるバイト数 - Shift_JIS として解釈できるバイト数 を比べ、バイト数が大きい方を getcode の結果としています。 しかし 0x8e 0xa1 の場合はどちらも 2バイトなので判断がつかず getcode は undef を返します。 > 色々と考えて漢字のデータはeuc,cgiスクリプトはsjisです であれば、jcode.pl にエンコーディングを教えてやればよいです。 &jcode'convert(*nnn, 'euc', 'sjis'); # perl4 的な書き方 jcode::convert(\nnn, 'euc', 'sjis'); # perl5 的な書き方 と書けば、きっちりと Shift_JIS から EUC-JP に変換してくれます。 |
>>3344 Tsun > 共通鍵暗号のページで3DESでの鍵長が56*3にならない訳ですが せっかく教えていただいたので、勉強してみました。といっても 暗号技術大全 http://www.amazon.co.jp/exec/obidos/ASIN/4797319119/ref%3Db%5Fbb%5F1%5F25/249-2894126-9073950 を読んだだけですが。 「鍵Aで暗号化 → 鍵Bで復号化 → 鍵Aで暗号化」という方法を EDE (Encrypt-Decrypt-Encrypt) と言う。DES なら DES-EDE などと書く。 Encrypt-Decrypt-Encrypt が特に解読しづらいわけではないので、 Encrypt-Encrypt-Encrypt でも別に構わない。 ただ、EDE の利点は、鍵A と 鍵B を同じにすれば一度だけ暗号化 したのと同じ結果が得られること (DES-EDE に対応しておけば、 DES にも対応したことになる)。 なぜ 3回必要なのか、2回の暗号化 (つまり 2DES) ではダメな 理由はというと、2回の暗号化では中間値探索 (meet-in-the-middle) 攻撃に弱いため。56bit の DES で 2回暗号化した場合、総当たり 攻撃に限ると 112bit の強さを持つが、中間値探索には 57bit の 強さしかない。 3DES には鍵を 2つ使う方法と、3つ使う方法がある。 鍵を 3つ使う 3DES は総当たりに対しては 56*3=168bit の強度が あるが、中間値探索に対しては 112bit の相当の強度になる。 一方、鍵を 2つ使う 3DES は中間値探索の弱点はないため、総当たりと 中間値探索のいずれに対しても 112bit の強度になる。 よって、現実的な強さとしては鍵 3つの方が優秀である。 OpenSSL で実装されている暗号で言うと、 鍵2つの 3DES: des-ede-cbc(=des-ede), des-ede-cfb, des-ede-ofb 鍵3つの 3DES: des-ede3-cbc(=des-ede3=des3), des-ede3-cfb, des-ede3-ofb となる。 ただ、 > 鍵長と演算量の比は対数的ですから、112ビットの鍵を使って > 1回演算するより、56ビットの鍵を使って、3回演算するほうが > 有利となります。 ここはよくわかりませんでした。DES の鍵は結局は 16ラウンド それぞれの 48bit 内部鍵の元となるだけなので、対数的ではない のではないかと思いました。 |
ども。おひさしぶりです。 これまでときどき私のlinux環境からDNSの名前解決ができない という件でいろいろと相談させて戴いていましたが、今回たまたま Redhat 9 publisher editionをインストールし試してみたところ、 なぜか無事名前解決できるようになりました。 もしかしたらこれまでインストール時に何かのチェックボックスに チェックを入れなかったなど、気づいていなかったミスがあったかも しれませんが、とにかく使えるようになりましたのでまずはご報告 します(もうしないかもしれませんが…^^;)。 というわけでこれまでいろいろアドバイスいただきまして、どうも ありがとうございました。これで晴れて開発環境を手に入れ、無事 プログラミングにいそしむことができます。今後もどうぞよろしく お願いします。 |
「ネットワークプログラミングの基礎知識」の「リンク集・参考書籍」 http://x68000.startshop.co.jp/~68user/net/link-book.html を更新し、以下の書籍の紹介を追加しました。 - C言語による TCP/IP ネットワークプログラミング - IPv6 ネットワークプログラミング - 暗号技術大全 - 暗号解読―ロゼッタストーンから量子暗号まで― 一番お勧めなのは、「暗号解読」のところで触れている フェルマーの最終定理 http://shinchosha.co.jp/cgi-bin/webfind3.cfm?ISBN=539301-4 だったりします。 # 次点が「暗号解読」 |
はじめましてyudaiと申します。 突然お邪魔して誠に失礼とは思いますが、ご教授いただけませんでしょうか? Perlでファイルオープン open(TESDAT, "tesdata.txt" ); #エラー処理略 @list=<TESDAT>; #testdata.txt内容 m_A9<>太郎<>26歳 f_C5<>花子<>23歳 m_G7<>一郎<>19歳 #ここまで 等として読み込むと 1行ごとに配列の要素となると思うのですが、、この場合に添え字[2]でなく要素の値(f_C5等)で参照する方法はございませんか? htmlフォームから"f_C5"の入力を受け取りtesdata.txtを読み込み文字列を参照して $ID="f_C5"; $name="花子"; $old="23歳"; のような結果を得たいのです。 尚、データベースモジュールは使えない環境です。 乱文にて恐縮ではございますがどうかお教えください。 |
>>3356 has > なぜか無事名前解決できるようになりました。 そうですか、原因がわからず解決してしまって残念です :-) ときにウチの環境でも返ってくる AAAA レコードが壊れていたり、 DNS サーバからの返事がなかなか返ってこなかったり、と思ったら 急になおったり、使用する DNS サーバを変えると再現しなかったり、 でも動作がおかしい DNS サーバはひとつではなかったり、と なかなか大変です。 >>3358 yudai 案1: my $input_id = 'f_C5'; # web からの入力 open(TESDAT, "tesdata.txt" ); while (<TESDAT>){ chomp; my ($ID, $name, $old) = split($_, '<>'); if ( $ID eq $input_id ){ # なんらかの処理 } } 案2: my $input_id = 'f_C5'; # web からの入力 my %namehash; my %oldhash; open(TESDAT, "tesdata.txt" ); while (<TESDAT>){ chomp; my ($ID, $name, $old) = split($_, '<>'); $namehash{$ID} = $name; $oldhash{$ID} = $old; } if ( defined $namehash{$input_id} ){ # なんらかの処理。 # print "$input_id $namehash{$input_id} $oldhash{$input_id}\n"; # とか。 } というのが回答になっていますか? |
はじめまして、yoshiと申します。 FTPについてご教授頂きたく思い、書き込ませていただきます。 同一ネットワーク内において、 パソコン(Windows98)→ワークステーション(UNIX)へのFTPでのログインはcmd.exe上からFTPにてログインする事で、可能なのですが、 ワークステーション(UNIX)→パソコン(Windows98)へのFTPでのログインは可能でしょうか? 普通にFTPでログインしようとすると、「接続が拒否されました」と弾かれてしまいます。 可能だとしても、パソコン側で何か設定変更が必要なのでしょうか。 初歩的な質問で申し訳御座いませんが、よろしくお願い致します。 |
>>3360 yoshi Windows98 上で FTP サーバを動かせば可能です。デフォルトでは FTP サーバは用意されていないでしょう。フリー物がよければ http://www.forest.impress.co.jp/library/tinyftpd.html などがよさそうに見えます。 なので、UNIX マシンに FTP でログインできるのも、 「その UNIX マシン上で FTP サーバが動いているからログインできる」 ということです。 |
はじめまして。 UNIXのことについて色々調べていたらこちらにたどり着きました。 以後よろしくお願い致します。 Tarコマンドについて質問があるのですが、 Tarコマンドのディレクトリ数の指定パラメータで 「.」と「./*」があり、 「./*」で指定した場合、ディレクトリ数の上限値があるそう なのですが、その値はいくつなのでしょうか? よろしければ教えてください。 |
>>3361 68user ありがとう御座いました! そういう事だったのすね、早速やってみます! |
>>3361 68user 間違えて、書き込んでいる途中で送信してしまいました・・。 しかも脱字でした、すみません。 ×そういう事だったのすね → ○そういう事だったのですね 家では実験できないので、会社で試してみるつもりです。 結果が分かり次第、報告させて頂きます! |
>>3352 落合 http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse を読んだ後に cgi-ml で得た情報をコッチにも提供して欲しい気持ち。 >>3359 68user > my ($ID, $name, $old) = split($_, '<>'); split の引数が逆ですぜ。 |
>>3362 しん > Tarコマンドのディレクトリ数の指定パラメータで > 「.」と「./*」があり、 > 「./*」で指定した場合、ディレクトリ数の上限値があるそう > なのですが、その値はいくつなのでしょうか? 「ディレクトリ数の指定パラメータ」というくだりが いまいち よくわかりませんが、要は % tar cf /foo/bar.tar . だとエラーにならないのに、 % tar cf /foo/bar.tar ./* だとエラーになるのはなぜか、ということでしょうか? であれば http://www.jp.freebsd.org/QandA/HTML/2111.html をどうぞ。 ちなみに ARG_MAX は FreeBSD なら 64KB ですが、Solaris は 1MB です。手元の Linux マシンを見てみると 128KB でしたが、 ディストリビューションごとに異なる可能性はあります。 |