>>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回演算するほうが有利となります。 |