ありがとうございます。 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 でしたが、 ディストリビューションごとに異なる可能性はあります。 |
>>3365 /tk > を読んだ後に cgi-ml で得た情報をコッチにも提供して欲しい気持ち。 http://script.lovely.to/bbs/infolng.cgi?print+200309/03090012.txt には報告して、こっちには報告してくれないのは嫌われている からでしょうか。 って、どうせもう読んでないだろうからどうでもいいんですが。 最近は返事がなくても、クイズのつもりで回答しています。 悟りの境地に達したのかもしれない。 >> my ($ID, $name, $old) = split($_, '<>'); > split の引数が逆ですぜ。 おっと失礼しました。 my ($ID, $name, $old) = split('<>', $_); ですね。 |
ftp上のlsの挙動に関する質問です。 ftpサーバのOSはSolaris9です。 Bシェルでクライアント側のプログラムを作成しています。 ftp上で下記のようにワイルドカードでファイルを指定し、その結果をlsresult.txtファイルに出力しようとしています。 ftp>ls ?????.txt lsresult.txt しかし、?????.txtに該当するファイルが無いと、クライアント側にはlsresult.txtファイルが作成されません。 様々な挙動調査の結果、lsを行うディレクトリがrootユーザーのものだとlsresult.txt自体が作成されませんが、一般ユーザーだと0バイトのlsresult.txtが作成されるという挙動の差異がありました。 lsに該当するファイルがなかった時に表示される「No such file or directory」というメッセージがlsresult.txtに出力される事を期待していますが、そのメッセージが応答されていないようです。 また、プログラムからでなく、コマンドラインから同じ事をしても同様の挙動でした。 なお、Solaris8等の他のマシンで動作確認したところ、lsに該当するファイルが無い場合には、lsresult.txtに「No such file or directory」のエラーメッセージが出力されました。 エラーメッセージの出力に関する設定、ftpdの違い、OSの違い等、疑うところはいろいろあるのですが、ftp上のls自体は機種等の環境に依存してしまうものでしょうか。 上記の説明で何が問題か分かりますでしょうか。 よろしくお願い致します。 |
>>3368 gaji ftp サーバの OS は Solaris9 だと言うことはわかりましたが、 クライアント側の環境は何ですか? ftp プロトコル自体には結果をファイルに落とすかどうかという やりとりはありません。よって、ファイルに落とすか処理を行なう のはクライアント側です。まずはクライアント側の環境を疑った 方がよいと思います。 > lsを行うディレクトリがrootユーザーのものだとlsresult.txt自体が > 作成されませんが、一般ユーザーだと0バイトのlsresult.txtが作成 > されるという挙動の差異がありました。 「ls を行うディレクトリ」というのは、 ftp> cd /hoge ftp> lcd /fuga ftp> ls ?????.txt lsresult.txt としたときの「/hoge」のことを指していますか? それとも「/fuga」の ことを指していますか? また、ftp クライアントを実行するユーザの違いで挙動が変わりますか? |
>>3369 68user 早速回答いただきましてありがとうございます。 今、お答えできる情報のみで申し訳ありませんが回答致します。 >ftp サーバの OS は Solaris9 だと言うことはわかりましたが、 >クライアント側の環境は何ですか? Solaris2.6です。 >「ls を行うディレクトリ」というのは、 > ftp> cd /hoge > ftp> lcd /fuga > ftp> ls ?????.txt lsresult.txt >としたときの「/hoge」のことを指していますか? それとも「/fuga」>のことを指していますか? /hogeの事を指しております。 クライアント側は同じ状態にしておいて、FTPサーバ側をいろいろ変えて挙動が変換するので、サーバ側の問題かと思っていましたが、クライアント側も調べてみます。 |
>>3370 gaji ftpのlsを調査した結果、以下の事が分かりました。 ---------Solaris8がFTPサーバの時---------------------------- ftp> ls ?????.txt local.txt 200 PORT command successful. 150 ASCII data connection for /bin/ls (192.168.122.8,45207) (0 bytes). 226 ASCII Transfer complete. local: local.txt remote: ?????.txt 49 bytes received in 0.012 seconds (3.90 Kbytes/s) ---------Solaris9がFTPサーバの時---------------------------- ftp> ls ?????.txt local.txt 200 PORT command successful. 550 ?????.txt: No such file or directory. Solaris8のケースでは、/bin/lsによって処理されて、該当ファイルが存在しなくてもlocal.txtが作成され、中にエラーメッセージが出力されました。 Solaris9のケースでは、/bin/lsを使用していない?様です。 ftpdの内部コマンドで処理されているのでしょうか。 この場合は、local.txtが作成されていません。 ちなみに、ftp上でls -a等を行うと、Solaris8,9共に/bin/lsで処理されているようです。 lsとls -aでは、FTPプロトコルはNLSTとLISTのように違うと思いますが、インターネットで調べた限りでは「ls -aやdirなどは/bin/lsで処理され、lsはftpdの内部コマンドで処理される事が多い。」との記述がありました。しかし、今回のケースではSolaris8でのlsは/bin/lsで処理されているようです。ftpのNLSTが内部コマンドを使用するか、/bin/lsを使用するかは設定可能なものでしょうか。 もし、Solaris9でのlsも/bin/lsを使用するように設定変更可能なものであれば、設定変更して動作検証したいと思います。 もし、ご存知でしたらご教授いただきたいと思います。 |
>>3371 gaji なるほど、ftpd の挙動が変わったのですね。 > ls -aやdirなどは/bin/lsで処理され、lsはftpdの内部コマンドで > 処理される事が多い。 そういう実装が多かった、というのは確かかもしれません。 ただ、ProFTPD のように /bin/ls に一切頼らない ftp サーバもありますので、あくまで「多かった」という程度 だと思います。 > ftpのNLSTが内部コマンドを使用するか、/bin/lsを使用するかは > 設定可能なものでしょうか。 Solaris8, Solaris9 の ftpd を見る限りでは、そのような 設定はできないようです。 http://www.freebsd.org/cgi/man.cgi?query=ftpd&&manpath=SunOS+5.8&format=html http://www.freebsd.org/cgi/man.cgi?query=ftpd&&manpath=SunOS+5.9&format=html > ftp> ls ?????.txt local.txt > 200 PORT command successful. > 550 ?????.txt: No such file or directory. もしクライアント側が LIST を発行しているとしたら (ftp -d で確認できます)、LIST に対して 550 を返すのは RFC 違反ではないかなぁと思いました。 http://hp.vector.co.jp/authors/VA002682/rfc959j.htm より引用 以下の表では、それぞれのコマンドごとの成功・失敗の応答を一覧表にしてあ る。これらは、確実に忠実でなくてはならない。サーバーは応答中の文章を変更 してもよいが、その意味、コード番号により示される動作と指定されたコマンド 応答シーケンスは変更してはならない。 コマンド応答シーケンス LIST 125, 150 226, 250 425, 426, 451 450 500, 501, 502, 421, 530 この解釈が正しいなら、Sun に文句を言えば直してくれる かもしれません。 ただ、ftp は規格が曖昧で、実装依存の塊みたいなものなので、 ls してクライアント側で grep した方が後々のためにもよい かもしれません。ファイルに落として grep するとか、 ftp> ls . "|grep ^.....\.txt$ >hoge" とするとか。 |
>>3361 68user 68userさんのご助言通り、 ftpサーバをPCに入れてみました所、上手くいきました。 ありがとう御座いました! |
>>3371 gaji 確か、Solaris9からwu-ftpdベースになっている筈です。 以下man ftpaccess(4)から... /etc/ftpd/ftpaccess lslong /usr/bin/ls lsshort /usr/bin/ls lsplain /usr/bin/ls 上記3行を追加してみては如何でしょうか... 外していたらごめなさい。 ではでは |
>>3374 とーりすがり 情報の提供ありがとうございます。 試してみたいと思います。 >確か、Solaris9からwu-ftpdベースになっている筈です。 これは、私も何かの書籍で見た記憶があります。 また、何か情報がございましたらお願いします。 |
イーサカード(hme等)のインスタンス番号についてご教授ください。 hme0と認識されているカードをカード実装位置を変えずにhme5のようにインスタンス番号のみ変更することは可能でしょうか? |
送信サーバ認証が不要な SMTPサーバではサーバ外メール送信は実現できています。 しかし、送信サーバ認証が必要な SMTPサーバではサーバ外メールを送信できません。(Outlook Express ではサーバ外メール送信OK) SMTP AUTH と POP Before SMTP を試しました。 SMTP AUTH は NONE-SUPPORT のメッセージが返りました。 POP Before SMTP として、POPサーバに USER と PASS コマンドを使い認証を受けた後(正常終了)で QUIT の直後に、SMTPサーバ にconnectし、HELO, MAIL FROM: とコマンドを送信し、RCPT TO: で 550 5.7.1 と Relay エラーを出してしまいます。 POP Before SMTP を実現するためのコマンドシーケンスを教えてください。 VC++ 6.0 Windows98SE 宜しくお願い致します。 |
関数にリダイレクションを引数として渡したいのですが どうも上手くいきません。ご教示お願いいたします。(OS:HPUX) KANNSUU(){ echo "A" $1 tmp.txt } KANNSUU > 結果:"A > tmp.txt"と表示されてしまう。 |
>>3374 とーりすがり > 確か、Solaris9からwu-ftpdベースになっている筈です。 おお、ほんとうですね。 http://docs.sun.com/db/doc/816-3965/6ma7896j8?l=ja&q=wu-ftpd&a=view 知りませんでした。 ってゆーか、まわりに Solaris9 環境がなかったりするんですけどね。 >>3376 新米 > hme0と認識されているカードをカード実装位置を変えずにhme5の > ようにインスタンス番号のみ変更することは可能でしょうか? (Solaris かどうか書いてないのでわかりませんが) Solaris の ifconfig はいろんな設定ができるので、できるかもしれませんし、 できないかもしれません。 >>3377 foofoo > POP Before SMTP を実現するためのコマンドシーケンスを教えてください。 POP でアクセスすればそれでよいはずです。 その前に、調べ方が効率悪すぎです。 まずはサーバがどういう認証方法を取っているか調べましょう。それが できないなら、ethereal などのパケットアナライザを使って、Outlook が どういうふうに接続しているか調べましょう。 >>3378 リダイレクションを引きとして渡す eval を使って KANSUU(){ eval "echo 'A' $1 tmp.txt" } とします。しかし、そのうちメッセージやファイル名に空白や シングルクォート・ダブルクォートが入ってたら〜とかいう 話になると思うので、 KANSUU(){ if [ $2 = 0 ]; # file 出力モード echo $1 > tmp.txt else # 標準出力モード echo $1 fi } 的な書き方をお勧めしておきます。 |
>>3379 さん、ありがとうございました。 > POP でアクセスすればそれでよいはずです。 何かが悪いのでしょうが、前の記述通り、POP から SMTP の切替て RCPT TO:で 550 が発生してしまいます。 うまく行っている Outlook を ethereal でトレースしようと思います。 ethereal のようなトレースツールも知りたかったので大変うれしく思っています。 早速 ethereal をダウンロードしてトレースしてみます。 テスト後ご報告致します。 foofoo |
>>3379 68user 68userさん、大変ありがとうございました。 etherealを使いトレースしたところ、Outlook Expressは、POP Before SMTP ではなく、AUTH LOGIN コマンドを使っていることがわかりました。 < EHLO xnn000<CR><LF> > 250 < AUTH LOGIN > 334,334,235 < MAIL FROM: > 250 : : Outlook Expressと同じ手順でOKにはなりました。 新たに不明な点が出てきました。 AUTH LOGIN の前に発行するEHLO に不明なアドレスのパラメータがついていました。 そのアドレスは、レジストリーで調査してもWindowsに設定されたアドレスでもなく、Outlook Express の設定の中にも無い下記のようなアドレスでした。 EHLO xnn000<CR><LF> 注:x:a〜zまでの内の1文字 nn:00〜99までの数字 所持メールアドレスは、送信メールサーバで認証の必要なものは1つしか持ち合わせがないため、他のメールサーバの時にどうなるかを確認できません。 このアドレスの根拠についてご存知の方、教えてください。 宜しくお願いします。 |
>>3381 foofoo 記載ミス 失礼しました、コマンドを統一表記していませんでした。 EHLO 以外も、Trailer として <CR><LF> は全て付加されています。 |
お久しぶりです。質問です。 さいきん MovableType に手を染めたのですが、 結構快調に使えていたんですが、rebuild 時に 500 Internal Server Error になるようになりました。 ずっとエラーになっても、再構築はできてたっぽかったんですが、 このたびついに再構築じたいできなくなりました。 (いつまでたっても古いページのまま) ドキュメントを見ると index.html を index.html.new に 退避してから書き込み動作を行い、 それが終わったら new を index.html に変名するような仕様に なっているが、この場合 mt ルートディレクトリののパーミッションが 777 になってないといけない、とあったので、 みてみると、たしかに 755 だったので、777 にすると、 今度は書き込み動作をしようとするといきなり 500 になりました。 あわてて 755 に戻すと、書き込み動作時のエラーはなくなりましたが、 相変わらず再構築時にエラーになります。 で、ドキュメントに、index.html.new を作らない設定にするには mt.cfg の NoTempFiles 1 を非コメント化するようにと言われたので、 しましたが、効きません。 なお、ルートには確かに index.html と index.html.new があって、 index.html のタイムスタンプは最後に再構築できたときです。 パーミッションは両方 666 です。 Perl は 5.005_03、 UNIX は FreeBSD 4.5-RELEASE-p36 #2 です。何かわかりましたら教えてください。 あと、板違いの場合はよさげな板を教えてくだされば幸甚です。 よろしくお願いします。 |
<<3383 ティピカルな問題かも。 http://www2h.biglobe.ne.jp/~hnakamur/technolab/diary/2003/20030810.htm system 'ulimit'; とかどっかに入れたろか ;;; |
>>3381 foofoo > EHLO xnn000<CR><LF> > 注:x:a〜zまでの内の1文字 nn:00〜99までの数字 これについてはわかりません。 http://www.puni.net/~mimori/smtp/ref.html#ehlo には SMTPサーバは、実際にはTCP/IP接続のIPアドレスなどの情報から クライアントを識別すべきである。 とあるので、Outlook Express はあえて適当なホスト名を生成して いるのかもしれません。 自分の FQDN を知っているならそれを、知らないなら IP アドレスを 渡しておけばいいのではないでしょうか。 >>3383 ふくし > rebuild 時に 500 Internal Server Error になるようになりました これだけでは「理由はわからないがエラーになる」と言っているのと 同じなので、原因を調べましょう。 - web サーバのエラーログには何と出ているか - CGI として起動したときの truss や ktrace の結果はどうなるか - コマンドラインから実行するとこけるか もし原因が limit である可能性が濃いなら、さらに以下のことを 調べましょう。 - CGI として起動したときの limit 値は (apache なら設定ファイルに書いてあるかも) - コマンドラインから起動したときの limit 値 (シェルの limit 値) は - ソフトリミットか、ハードリミットか (ハードリミットなら変更不可) - suid などで他の権限になれるか。なれるとしたらそのリミット値は? - なぜこけるのか。 手元の Solaris で試した限りでは、 - datasize の制限なら、malloc(3) して、brk(2) したときに ENOMEM が返ってきてこける - stacksize の制限なら、segmentation fault でこける。 となりました。FreeBSD でも同じかどうかはわかりません。 > system 'ulimit'; とかどっかに入れたろか ;;; これだと子プロセスのシェルの limit 値は変わるかもしれませんが、 自分自身の limit 値は変わりません。 CPAN から setrlimit(2) するライブラリを拾ってくるか、自分で syscall で呼ぶ必要があります。 # ただし、ハードリミットならどうしようもありません。 |
>>3385 68user さん、いつもありがとうございます。 すみません、レンタルサーバー(さくらウェブ)が ログを見せてくれません。 telnet は使えるので、もう少しいろいろやってみます。 検索した限りでは同じサーバーで同病の人が多いので 制限のようですが、どのレベルでの制限かはまだわかりません。 |
>>3385 68user 68user さん、ありがとうございました。 コメントを参考に対処していきます。 |
fork関数とselect関数の違いが分かりません。誰か教えてくれませんか? |
>>3388 peace fork は子プロセスを生成します。 select は複数の入出力インタフェースを監視するものです。 |
selectは親プロセス、子プロセスが存在しないのですか? |
>>3390 peace select は複数のプロセスを扱うためものではなく、1 つの プロセスが複数のソケット (*1) を同時に扱うためのものです。 たとえば http://www.goo.ne.jp http://www.yahoo.co.jp http://www.asahi.com を読みたいが、時間短縮のため 3サーバ同時に接続したい、という例が http://x68000.startshop.co.jp/~68user/net/http-parallel-1.html にあります。 ここではプロセスはひとつしか出てきませんが、ソケットは 3つ 使用しています。 *1: 本当はファイルディスクリプタ |
ありがとうございました。 |
以下のコマンドの意味が解りません。よろしくお願いします。 jobschmsgevent jobschcontrol if ( -f ./renkei.zip ) thenの中の-f ./ |
>>3393 doronjo jobなんたらは判らないのですが,-fはファイルテスト演算子です. ./renkei.zipがファイルとして存在するとき真を返します. ./は相対パスでrenkei.zipが実行中のスクリプトと 同じディレクトリにあることを示します. 68userさん hosts.allowの件いかがですか. どうにもなりませんか... |
>>3393 doronjo > jobschmsgevent > jobschcontrol Systemwalker のコマンドのようですね。付属のマニュアルを 読みましょう (わたしは Systemwalker を持ってないので わかりません)。 >>3394 Netboy > hosts.allowの件いかがですか. ああああすいません、すっかり忘れていました。本日中には必ず。 |
68userさん、ありがとうございました。 |
はじめまして。 LINUX上にて複数のGIFファイルを1つのPDFファイルに 変換指定のですが…。 とりあえず convert コマンドでできますかね…? こんな感じで… convert abc*.gif newfile.pdf |
いつも参考にさせていただいています。 質問があります。 FreeBSD4.8でウェブサーバをたてました。 インストール時にタイムゾーンを JST に設定しました。 FTPアカウントを一つ設定し、3ヵ月後にFTPアカウントをいくつか追加しました。 インストール後にすぐ作成したアカウントを使い、 FTPサーバにFTPクライアントでログインし、 新規にファイル等をアップロードすると、ファイル作成日が正しくJSTで表示されます。 しかし、追加した方のアカウントで同じようにFTPでログインし、 ファイル等をアップロードした所、なぜかUTCでファイル作成日等が表示されてしまいます。 date コマンドでは Thu Nov 6 18:42:54 JST 2003 等と正しく表示されます。 .shtml ファイルをアップし、そのなかにSSIコマンドでローカルタイムを取得すると、 どちらのアカウントでも正しくJSTで表示されます。 なぜ同じサーバなのに、FTPクライアントのみUTCで表示されたり、 アカウントによってタイムゾーンが異なって表示されたりするのでしょうか? FTPクライアントの設定は全く同じ環境ですし、クライアントマシン自体のタイムゾーンももちろんJSTです。 /stand/sysinstall で再度タイムゾーンの設定もしました。 ntpdate コマンドで、再度時刻修正もしました。 申し訳ありませんがご教授願います。 |
>>3397 しんさん > とりあえず convert コマンドでできますかね…? > convert abc*.gif newfile.pdf 実際に試してみればできるかどうかはわかるでしょう。 convert は ghostscript に頼らないと pdf を読み書き できないはずです。あと、複数の画像をひとつのファイルに まとめることができるのかどうかは非常に怪しいような気が します。 >>3398 MAX > 新規にファイル等をアップロードすると、ファイル作成日が正しく > JSTで表示されます。 これと > ファイル等をアップロードした所、なぜかUTCでファイル作成日等が > 表示されてしまいます。 これは、当然同じ FTP クライアントを使っているんですよね。 また、サーバ再起動などもしてないんですよね。 うーん、なんでしょうねぇ。/etc/login.conf の ftp-chroot や timezone の違いですかねぇ。 |
>>68userさん レスありがとうございます。 すみません、自己解決できました! 最初に作成したFTPアカウントは、/etc/ftpchroot にアカウント名を記載しておらず、 後で作成したFTPアカウントは、/etc/ftpchroot にアカウント名を記載してました。 ftpchroot すると、/etc/localtime を読まなくなるんですね。。。 この事を知らなかった為、こういう事になっていました。 お騒がせしてスミマセンでした ^^; |
ご返答ありがとうございます。 今はLINUXの環境が無いので整い次第試してみます。 すみませんが、初心者の為もう少し突っ込んだ質問をさせて下さい…。 1.LINUX上でGIFファイルをPDFファイルに変換する為には ghostscript を使用しなければ出来ないのですか? 2.ghostscript について知りたいので簡単で良いので説明していただけませんか? ※無理であれば何処か参考になる URL を教えてください。 3.convert コマンド以外の方法は何かありますか? よろしくお願いします。m(_ _)m |
初めまして。初めて書き込みします。konと言う者です。よろしくお願いします。 早速質問なのですが、最近BSD(すいませんバージョンは分かりません)のrootログインシェルをchshコマンドで変更していたところ、ファイルの場所を間違って指定してしまったために Permission denied と出てログインできなくなってしまいました。どうすれば元に戻すことが出来るのでしょうか?どなたかアドバイスをお願いします。 |
質問があります。とても困りました。 rootで作業中、/binを誤って別名のディレクトリに変えてしまいました。 すると、全くログインできなくなってしまいました。 復旧するにはどうすればいいのでしょう?よろしくお願いします。 |
>>3400 MAX > ftpchroot すると、/etc/localtime を読まなくなるんですね。。。 わかっておられるかもしれませんが、読まないというよりは 読めない、です。 /home/ftp/ に chrootするとしたら、/home/ftp/ が / になり、 /home/ftp/etc/localtime が /etc/localtime になるわけで、 /etc/localtime を /home/ftp/etc/localtime にコピーして おく必要があります。 >>3401 しんさん ghostscript に関する情報は、google で調べる方が早いでしょう。 要は ps2pdf という PostScript を PDF に変換するアプリが ghostscript に同梱されており、convert はそれを利用して PDF を出力している、ということです。ps2pdf は直接実行する こともできます。 >>3402 kon シングルユーザモードで起動してシェルを元に戻すしかないと 思います。もしマシンがリモートにあるなら、手の出しようが ないです。 あるいは一般ユーザでログインし、root 権限を奪取するような 脆弱性を突くとか。 >>3403 てんびん 別のメディアからブートして /bin を元に戻してください。 FreeBSD なら fixit フロッピーでブート。Solaris なら http://sdc.sun.co.jp/solaris/solaris2-faq/Q5.47.html など。 |
初めて書き込みをしますyuuといいます、どうぞよろしくお願いします。 ここのページを見て、ネットワークプログラムを勉強しようとしているのですが、どうもfork関数を使ったサーバと、select関数を使ったサーバの違いが理解できないでいます、なにぶんまったくの初心者なので・・・もしよろしかったら教えていただけないでしょうか? |
>>3405 yuu http://x68000.startshop.co.jp/~68user/net/echo-3.html http://x68000.startshop.co.jp/~68user/net/echo-4.html を読んでください。 これでわからないなら、 「自分はこのように理解しているが、この部分の違いが わからない」 という書き方をしてください。 |
>>3404 68user CDROMから起動し、/binに戻すことができました。 どうもありがとうございました。 |
if ( $BS_FLG == "1")の中の『==』はどういう意味でしょうか |
>>3408 doronjo $BS_FLG の内容が 1 ならば、ということです。 |
if文の"="と"=="の違いを教えて下さい。 |
どこまでこんがらがるか楽しみなのでお付き合いします。 > if文の"="と"=="の違いを教えて下さい。 言語名が書いてないので if ( $BS_FLG == "1") と書くことのできる言語を想像すると、わたしの脳内では csh と perl が候補にあがりました。 csh では if ( $BS_FLG = "1" ) はエラー。 if ( $BS_FLG == "1" ) は文字列として比較。 # ただし試したのは FreeBSD の csh なので、実質 tcsh ですね。 perl では if ( $BS_FLG = "1" ) は代入文扱いされ、常に真。 -w オプションを付けると「== と書け」と怒られます。 if ( $BS_FLG == "1" ) は数値として比較でした。 |
ちょこちょこ何度もすみません。 またif文なんですが、 if ( -z zbwsy200.csv ) then の"-z"の意味と、ほかのif文で"&&"とありますがこれはandと同じ意味ですか |
>>3412 doronjo then ってことはおそらく csh なので、csh のマニュアルを 読んでください。 man csh で読めます。 |
ありがとうございました。 cshの本をいいのがないか本屋で探しているんですが見つかりません。 いい本知ってましたら教えていただけないでしょうか。 (特にif文が詳しく載っている物) |
いつもすいません。 KNOPPIX(Debian ベース、unstable)でサーバーを立て、 Postfix を入れましたが、メールが受信できません。 (前はできていたが、何らかのきっかけでできなくなった) Nov 13 22:52:10 myserver postfix/smtp[747]: 32C741384AD: to=<me@myserver>, relay=none, delay=27294, status=deferred (Name service error for myserver: Host not found, try again) メールをくれた人のサーバーも自分も無事 dig できます。 /var/spool/postfix/etc/resolv.conf も最新です。 /etc/postfix/master.cf で chroot は全部 n です。 /etc/postfix/main.cf はこんな感じです。 # see /usr/share/postfix/main.cf.dist for a commented, fuller # version of this file. # added by suggestion (fukushi) myhostname=myserver.mydomein alias_maps=hash:/etc/aliases alias_database=$aliase_maps # Do not change these directory settings - they are critical to Postfix # operation. command_directory = /usr/sbin daemon_directory = /usr/lib/postfix program_directory = /usr/lib/postfix smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) setgid_group = postdrop biff = no # appending .domain is the MUA's job. append_dot_mydomain = no home_mailbox=Maildir/ allow_mail_to_commands=alias,forward,include ignore_mx_lookup_error = yes メーラーは Mew ですが、 ログインしたら you have mail じたいでないので postfix が悪いのかと・・・ 思ってたら /var/spool/postfix/deferred に着いたメールがたまってました。 何かお分かりでしたらご教示願います。 |
自己レスです。 読めないと騒いでいたのは同じ社内の Windows クライアントから Outlook で同じ社内の Exchange Server を使って出したメール なのだが、 me@myserver ではだめで、 me@myserver.domain でFQDN名で指定しないとダメでした。 おさわがせしました。 |
UNIX の部屋 http://x68000.startshop.co.jp/~68user/unix/ を更新しました。 |
はじめまして。UNIXのコピー(?)というかフリーソフト が欲しいんですけど、配られてるところ(URL)を 教えてくれませんか?? |
>>3418 初心者 OS はなんですか? (FreeBSD 4.8 とか Solaris 8 とか RedHat Linux 9 とか Debian GNU/Linux 3.0 とか) |
こんにちは、以前質問させて頂きましたyoshiと申します。 unameコマンドについて質問なのですが、 このコマンドの語源は何なのでしょうか? 他のコマンドは大体英単語を捩った物が多いと思うのですが、 このコマンドだけ、"u"の意味が良く分からないもので・・・。 ご存知の方いらっしゃいましたら、ご教授願います。 |
>>3420 yoshi > unameコマンドについて質問なのですが、 > このコマンドの語源は何なのでしょうか? FreeBSD 5.1-RELEASE の uname(1) には http://www.freebsd.org/cgi/man.cgi?query=uname&manpath=FreeBSD+5.1-RELEASE&format=html HISTORY The uname command appeared in PWB UNIX. とあります。 PWB (Programmers Work Bench) UNIX の位置付けは http://www.levenez.com/unix/history.html をどうぞ。簡単に言うと V6 UNIX から分岐し、SVR3 に統合された古代の UNIX です。 # ちなみに他の OS のマニュアルにはたいしたことは書いてありませんでした。 で、古代の UNIX と言えば、SCO が公開した V6 や V7 のソース http://minnie.tuhs.org/TUHS/archive_sites.html をあたってみるべきです。そこをつらつらと眺めると…おぉ、そのもの ずばり PWB という文字を発見。 http://www.tribug.org/pub/tuhs/PDP-11/Distributions/usdl/bostic_pwb.tar.gz 早速展開してみると、マニュアルがありました。 % find . -name uname\* ./pwb.5/pwb.2/usr/man/man1/uname.1 ./pwb.5/pwb.2/usr/man/man2/uname.2 uname.1 の中身は以下の通り。 % cat ./pwb.5/pwb.2/usr/man/man1/uname.1 .th UNAME I 5/31/77 .sh NAME uname \*- print name of current UNIX .sh SYNOPSIS .ft B uname .ft R .sh DESCRIPTION .it Uname prints the current name of UNIX on the standard output file. It is mainly useful to determine what system one is using. .sh "SEE ALSO" uname(II) PWB で拡張されたシステムコールらしきソースをみると、以下のように なっています。 ./pwb.5/pwb.2/sys/sys/os/pwbsys.c pwbsys() { extern uchar; register i; register *p; register struct buf *bp; switch(u.u_arg[0]) { case 0: /* uname */ if (copyout(&pwbname, u.u_ar0[R0], 8)) u.u_error = EFAULT; return; つまり uname(2) は pwbname を返しているだけ。その pwbname は char pwbname[9] "pwbname"; と定義されていました。 uname(2) のマニュアルには (以下、FreeBSD の nroff に喰わせた出力) uname get name of current PWB/UNIX (pwbsys = 57.; uname = 0) (pointer to name in r0) returns in the 8 byte character name of the current PWB/UNIX. The name is not null-terminated. By convention, the name is of the form pwb?date. For example, pwba0401 would indicate that this is PWB/UNIX System A and that its operating system was last modified on April 1. This function is kept in the library. un- ame(I) The error bit(c-bit) is set if can not be written. From C, a 1 return indicates an error. とありますので、リリース時は pwbname で、バージョンアップ時に pwba0401 などと書き換えてからコンパイルすることを意図したもの だったようです。 というわけで、今日のトリビア: uname の u は … UNIX の U である。 uname(2) は … 昔は uname(II) と書いていた。 補足トリビア: 当然 clri(8) は clri(VIII) である。 |
>>3421 68user 回答有難う御座いました! お蔭様で、unameコマンドの語源を理解する事が出来ました。 調べるというのは、こういう事を言うのだなぁと目から鱗な心境です。 私もいつか68userさんの様に、自力で調べられる様に頑張りたいと思います。 |
>>3419 68user あまりよく分からないんですけどBSD系(?)がほしいです(^^; |
はじめまして。Perlのネットワークプログラミングに際し、大変重宝させていただいております。 http://x68000.startshop.co.jp/~68user/net/http-parallel-1.html の"HTTPの並行アクセス"スクリプトについて、ちょっと気になる点がありましたので書かせていただきます。 読み込みが終了したソケットについて $selecter->remove($sock); # select の対象から外す として、セレクタから外すだけになっていますが、外した後で $sock->close; としてソケットを閉じたほうがいいんじゃないでしょうか? そうしないと、すべてのデータの転送が完了しスクリプトが終了するまで、全ソケットが開きっぱなしになってしまうように思うのですが。 もし、ソケットを一つ一つ閉じる必要がないのでしたら、その理由を教えていただきたいです。 |
>>3243 ひろ UNIX 的 OS を欲しいのか、UNIX 上で動作するソフトウェアが 欲しいのかわからなかったのですが、とりあえず前者とすると、 以下の URL などがよろしいのではないかと。 FreeBSD http://www.jp.freebsd.org/www.FreeBSD.org/doc/ja_JP.eucJP/books/handbook/install.html http://www.h4.dion.ne.jp/~katsuwo/index.html NetBSD http://www.jp.netbsd.org/ja/Releases/ OpenBSD http://www.jp.openbsd.org/faq/faq4.html >>3424 George > $sock->close; > としてソケットを閉じたほうがいいんじゃないでしょうか? ごもっともです。修正しましたのでご確認ください。 > すべてのデータの転送が完了しスクリプトが終了するまで、 > 全ソケットが開きっぱなしになってしまうように思うのですが。 その通りですね。正確に言うと、 スクリプトが終了するまでクライアント側は CLOSE_WAIT のまま、 サーバ側は TIME_WAIT のままになってしまう ですね。 …と思ったら、close しなくてもクライアントが FIN を送っている 場合もあるようです。 http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/sample/http-client-parallel.pl?rev=1.2 は close していないので、最後にまとめてクライアントが FIN を 送っているかと思ったのですが、途中で FIN を送っています (★ の部分)。 なぜだろう。 # tethereal -n 0.000000 192.168.1.11 -> 133.8.2.33 DNS Standard query A www.goo.ne.jp 0.021875 133.8.2.33 -> 192.168.1.11 DNS Standard query response A 210.150.25.37 0.022862 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [SYN] Seq=1244798117 Ack=0 Win=57344 Len=0 0.036368 210.150.25.37 -> 192.168.1.11 TCP 80 > 1515 [SYN, ACK] Seq=4071082836 Ack=1244798118 Win=5792 Len=0 0.036411 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798118 Ack=4071082837 Win=57482 Len=0 0.036763 192.168.1.11 -> 210.150.25.37 HTTP GET / HTTP/1.0 0.037493 192.168.1.11 -> 133.8.2.33 DNS Standard query A www.yahoo.co.jp 0.049007 210.150.25.37 -> 192.168.1.11 TCP 80 > 1515 [ACK] Seq=4071082837 Ack=1244798134 Win=5792 Len=0 0.049052 192.168.1.11 -> 210.150.25.37 HTTP Continuation 0.057874 133.8.2.33 -> 192.168.1.11 DNS Standard query response A 203.141.35.113 A 210.81.150.5 A 202.229.198.216 0.058447 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [SYN] Seq=830980655 Ack=0 Win=57344 Len=0 0.061073 210.150.25.37 -> 192.168.1.11 TCP 80 > 1515 [ACK] Seq=4071082837 Ack=1244798160 Win=5792 Len=0 0.088037 210.150.25.37 -> 192.168.1.11 HTTP HTTP/1.1 200 OK 0.088665 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.088688 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071085641 Win=54678 Len=0 0.102552 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.103180 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.103199 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071088445 Win=51874 Len=0 0.103815 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.105548 203.141.35.113 -> 192.168.1.11 TCP 80 > 1516 [SYN, ACK] Seq=1395064875 Ack=830980656 Win=65535 Len=0 0.105566 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980656 Ack=1395064876 Win=57482 Len=0 0.105937 192.168.1.11 -> 203.141.35.113 HTTP GET / HTTP/1.0 0.106691 192.168.1.11 -> 133.8.2.33 DNS Standard query A www.asahi.com 0.117698 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.117743 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071091249 Win=49070 Len=0 0.118337 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.119744 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.119759 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071094053 Win=46266 Len=0 0.128571 133.8.2.33 -> 192.168.1.11 DNS Standard query response CNAME mf3.asahi.com A 210.173.168.48 0.129171 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [SYN] Seq=286646349 Ack=0 Win=57344 Len=0 0.131878 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.132505 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.132524 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071096857 Win=43462 Len=0 0.133124 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.134528 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.134543 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071099661 Win=40658 Len=0 0.135144 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.136529 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.136550 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=37854 Len=0 0.140743 210.173.168.48 -> 192.168.1.11 TCP 80 > 1517 [SYN, ACK] Seq=2302041965 Ack=286646350 Win=8767 Len=0 0.140767 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646350 Ack=2302041966 Win=57974 Len=0 0.141054 192.168.1.11 -> 210.173.168.48 HTTP GET / HTTP/1.0 0.141407 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=41950 Len=0 0.143290 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=46046 Len=0 0.143673 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=50142 Len=0 0.143868 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=54238 Len=0 0.144062 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=57482 Len=0 0.147471 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.148088 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.148139 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071105269 Win=56080 Len=0 0.148713 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.148817 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071106671 Win=57482 Len=0 0.150165 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.151563 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.151615 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071109475 Win=56080 Len=0 0.152194 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.153553 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.153603 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071112044 Win=54913 Len=0 0.154219 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.155605 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.155627 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071114848 Win=52109 Len=0 0.155939 210.173.168.48 -> 192.168.1.11 TCP 80 > 1517 [ACK] Seq=2302041966 Ack=286646366 Win=33221 Len=0 0.155970 192.168.1.11 -> 210.173.168.48 HTTP Continuation 0.158143 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071114848 Win=56205 Len=0 0.164042 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.164676 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.164701 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071117652 Win=56080 Len=0 0.165306 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.165407 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071119054 Win=57482 Len=0 0.166710 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.168113 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.168134 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071121858 Win=56080 Len=0 0.168750 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.168851 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071123260 Win=57482 Len=0 0.170143 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.171551 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.171596 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071126064 Win=56080 Len=0 0.171881 210.173.168.48 -> 192.168.1.11 TCP 80 > 1517 [ACK] Seq=2302041966 Ack=286646392 Win=33229 Len=0 0.173514 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.173630 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071127466 Win=57482 Len=0 0.174146 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.175384 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.175412 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071129502 Win=56848 Len=0 0.175904 210.173.168.48 -> 192.168.1.11 HTTP HTTP/1.1 200 OK 0.177488 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.178123 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.178173 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071132306 Win=56080 Len=0 0.178749 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.178853 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071133708 Win=57482 Len=0 0.180158 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.181557 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.181610 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071136512 Win=56080 Len=0 0.182194 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.182321 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071137914 Win=57482 Len=0 0.183582 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.184982 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.185024 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071140718 Win=54678 Len=0 0.185560 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.185590 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071141836 Win=53561 Len=0 0.187683 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071141836 Win=57482 Len=0 0.250874 203.141.35.113 -> 192.168.1.11 TCP 80 > 1516 [ACK] Seq=1395064876 Ack=830980672 Win=32939 Len=0 0.250973 192.168.1.11 -> 203.141.35.113 HTTP Continuation 0.269692 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302042221 Win=57974 Len=0 0.282256 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.282646 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [FIN, ACK] Seq=1244798160 Ack=4071141836 Win=57482 Len=0 ★ 0.282841 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.282862 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302045049 Win=56560 Len=0 0.296511 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.296865 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302046463 Win=57974 Len=0 0.297081 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.297650 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.297676 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302049291 Win=55146 Len=0 0.298737 210.150.25.37 -> 192.168.1.11 TCP 80 > 1515 [ACK] Seq=4071141836 Ack=1244798161 Win=5792 Len=0 0.300072 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302049291 Win=57974 Len=0 0.304631 203.141.35.113 -> 192.168.1.11 HTTP HTTP/1.1 200 OK 0.305360 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.305414 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395067680 Win=56080 Len=0 0.306088 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.306190 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395069082 Win=57482 Len=0 0.310105 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.310686 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.310712 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302052119 Win=56560 Len=0 0.312365 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.312466 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302053533 Win=57974 Len=0 0.312940 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.314229 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.314250 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302056361 Win=56560 Len=0 0.323278 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.323656 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302057775 Win=57974 Len=0 0.323846 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.324419 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.324446 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302060603 Win=56560 Len=0 0.325721 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.325821 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302062017 Win=57974 Len=0 0.327029 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.328325 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.328347 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302064845 Win=56560 Len=0 0.328904 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.330194 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.330221 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302067673 Win=53732 Len=0 0.332620 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302067673 Win=57828 Len=0 0.337018 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.337585 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.337636 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302070501 Win=56560 Len=0 0.338157 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.338260 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302071915 Win=57974 Len=0 0.339466 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.340760 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.340783 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302074743 Win=56560 Len=0 0.341338 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.341437 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302076157 Win=57974 Len=0 0.342637 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.343937 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.343958 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302078985 Win=56560 Len=0 0.344512 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.344613 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302080399 Win=57974 Len=0 0.345803 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.347099 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.347121 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302083227 Win=56560 Len=0 0.347680 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.347795 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302084641 Win=57974 Len=0 0.348975 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.350554 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.350609 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302087469 Win=56560 Len=0 0.351108 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.351146 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302088699 Win=56745 Len=0 0.352602 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.354088 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.354145 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395071886 Win=56080 Len=0 0.354811 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.354939 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395073288 Win=57482 Len=0 0.356410 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.358002 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.358059 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395076092 Win=54678 Len=0 0.360242 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395076092 Win=57482 Len=0 0.399452 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.400187 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.400233 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395078896 Win=56080 Len=0 0.400937 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.401824 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395080298 Win=57482 Len=0 0.402549 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.404149 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.404191 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395083102 Win=54678 Len=0 0.404891 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.406482 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.406498 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395085906 Win=51874 Len=0 0.407229 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.413462 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395087308 Win=54568 Len=0 0.425540 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395087308 Win=57482 Len=0 0.448696 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.449436 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.449485 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395090112 Win=56080 Len=0 0.450211 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.450826 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395091514 Win=57482 Len=0 0.451828 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.453227 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.453277 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395093266 Win=55731 Len=0 0.486867 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [FIN, ACK] Seq=830980700 Ack=1395093266 Win=57482 Len=0 0.486941 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [FIN, ACK] Seq=286646392 Ack=2302088699 Win=57974 Len=0 0.498176 210.173.168.48 -> 192.168.1.11 TCP 80 > 1517 [ACK] Seq=2302088699 Ack=286646393 Win=33229 Len=0 0.536535 203.141.35.113 -> 192.168.1.11 TCP 80 > 1516 [ACK] Seq=1395093266 Ack=830980701 Win=32947 Len=0 # www.goo.ne.jp (210.150.25.37) # www.yahoo.co.jp (203.141.35.113) # www.asahi.com (210.173.168.48) # FreeBSD 4.9-RELEASE + Perl 5.005_03 |
>>3425 68user > なぜだろう。 あーそうか。$sock がどこからも参照されなくなったので、 perl がガベージコレクトして、デストラクタが close して いるんですね。 |
こんにちは。 初めて書き込みいたします。 私は、CGIの使えないサイトで、ちょっとしたプロフのページを管理しています。 このサイトでは、自作CGIは一切使えず、既成のCGIを使うしかないのですが、最近、BBSのほうにおかしな書き込みが増えて困っています。 そこで、アクセス元のログを取ろうと考えまして、自作CGIを書きましたがここで問題が生じました。 おわかりかと思いますが、自作CGIを直接設置できないことが問題です。 ただ、このサイトでは、外部から一枚だけ、画像をリンクして表示できるんですね。 そこで、画像の参照元である手持ちのサーバの.htaccessをいじり、 画像がCGIとして機能するように設定しました。 それで、このCGIファイルを画像のように偽装してサイトにアップロードしました。 これによって、外部CGIを呼び出してログを保存することが出来ましたが、私の考えで言えば、いまどき、 print map {"$_ = $ENV{$_}"} keys %ENV; で表示されるデータなど、あまりあてにはできない... できれば、もっと確実なところで、匿名Proxy経由であれば、telnetを起動して接続元をファイルに保存、などの手法をとりたいのです。 ところが、画像のトリガーを使った方式ではこれが上手くいきません。 ヘッダの出し方に問題があるはずですが、なんとかならないものでしょうか? パワーユーザーの皆様、良い知恵がございましたらご教授ください。 宜しくお願いいたします<m(__)m> |
はじめまして^^ ネットワーク関連のプログラムいつも参考にさせていただいております。 今回ちょっとおききしたいことがありまして書き込ませていただきます。 内容がこちらのページの趣旨と離れて申し訳ないのですが、 お返事いただければ幸いです。 いきなり本題にはいらせていただきます。 <a href="$ENV{'SCRIPT_NAME'}?para=data"> としてリンクを作成して、その先のページで <form action="$ENV{'SCRIPT_NAME'}?para2=data2" method='POST'> とします。 このときフォームデータの取り込みのハッシュを%FORMとしたとき 2つめの$FORM{'para2'}が存在しません。 これがなぜおこるのかさっぱりわかりません。 またメソッドをGETでも試しましたがダメでした。 ただし、出力先のURLにはhttp://***.cgi?para2=data2と表示されます。でもprint文では表示されないのです。 原因がわかれば教えていただけないでしょうか? ちなみにperl5でapache1.3.14仕様です。 よろしくおねがいします;; |
>>3427 Mule 試してませんが、画像側で Location: telnet://example.com:1234 ではダメですか? (ダメなような気もしますが) 掲示板側では img src でしか外部リソースを呼び出せない、 という条件のもとでは、これ以外の方法は思いつきません でした。 >>3428 perler 誰かが環境変数 %ENV を解析し、その結果を %FORM に セットしなければならないわけですが、その部分はどこが 担当していますか? (CGI モジュールですか?) |
>>3429 68user ご返事ありがとうございます。 Locationは私も考えましたが、その方法は無理でした。 しかし、コマンドで上手く行きそうです。 現在、実験中ですので、詳細はまたご報告いたします。 とりあえず、今日はご報告まで。 お忙しい中、返事をいただきましてありがとうございました。 |
>>3430 Mule できそうですか。ぜひ結果を教えてください。 |
初歩的な質問で、申し訳ないのですが、教えていただけると助かります。 Bシェルでは、 if [$a = $b] then echo "ok!" fi などと、if文の中で、変数同士の値を比較してイコールならば、とかけますが、 Cシェルでは出来ないのでしょうか? |
通りすがりですが、 #!/bin/csh set a = 2; set b = 2; if(a == b) then echo "a = b" else if(a < b) then echo "a < b" else echo "a > b" endif で良かったと思います。 |
cshさん書き込みありがとうございます 実は、変数には、どの値が入ってくるか、分からないのです。 例えば、 ps -o user,pid,ppid,comm -A | grep -i $1 | grep -v grep > lis.txt set cmd1=(`awk '{print $2}' lis.txt`) set cmd2=(`awk '{print $3}' lis.txt`) @ cnt1=0 @ cnt2=0 foreach pid1 ( $cmd1 ) @ cnt1++ foreach ppid1 ( $cmd2 ) @ cnt2++ if ( $pid1 と$ppid1に入った値がイコールならば ) then echo 'zero!!' echo $pid1 $ppid1 >> procs1.txt ....... end end 。。。。。。みたいに。その、かっこの中を、どう書いてもエラーが出るんです。基本的なミスなのか、それともcでは出来ないのか、、、分からなくて。 if ($a==1) thenはOKでも、($a==$b)、はだめでした。 |
あ、すみません。。。。半角カナ。 |
>>3434 初心者 HP-UX11.0の環境で確認しましたが「==」で問題無く一致を検知できました。 「==」の前後に空白が無いと上記OSでは文法上のエラーになりました。 ご参考になれば。 |
>3429 お早いお返事ありがとうございました。 質問の答えなのですが、同プログラム内で%FORMによみこんでおります。 sub func { my($query,$pair); if($ENV{'REQUEST_METHOD'} eq 'POST'){ read(STDIN,$query,$ENV{'CONTENT_LENGTH'}; }else{$query=$ENV{'QUERY_STRING'};} foreach $pair (split/&/,$query){ ($key,$value)=split(/=/,$pair); #デコード処理 $FORM{$key}=$value; } このサブルーチンで処理させております。 ちなみにただのメールフォームではなにも問題なく動作します。 |
BSD UNIX 類のどれか欲しいんですけどお勧めはありますか? |
>>3437 perler > <form action="$ENV{'SCRIPT_NAME'}?para2=data2" method='POST'> という書き方をした場合、メソッドは POST ですが para2=data2 は 環境変数 QUERY_STRING 経由で渡されます。よって、 POST なら標準入力から読む というやり方では、QUERY_STRING からの入力は無視されてしまいます。 >>3438 超初心者 初心者ということであれば、FreeBSD 4.9-RELEASE がお勧めです。 http://www.h4.dion.ne.jp/~katsuwo/index.html |
>>3434 初心者 シェルの一行目を #/bin/csh -x に変更して再実行すれば 実際に変数に何が入ってくるか確認できますよ。 |
No. 3436 の通りすがりさん、No. 3440 zshさん、 書き込みありがとうございます 私の環境が違うのかも知れません。下記のように表示されてるので。 Digital UNIX V4.0B (Rev. 564 Digital UNIX Japanese Support V4.0A (rev. 3.1) で、やっぱりおっしゃるとおり実行したのだけど、だめなんです。 if ( $a == $b ) の、右辺の変数名が、分かりません、とかそう言うエラーが出るので、 結局 @ df=$a - $b if ($df == 0 ) で、何とかうまくいきました。 ありがとうございました。 |
>>3431 68user こんにちは、Muleです。 すみません、コマンドでtelnet起動、失敗しました(^^; これが出来たら、結構使えるスクリプトになるかもと思っていたのですが、やはり無理がありますかね... コード全体の流れとしては、 プロキシのチェックルーチンをよび、flagが立っていればif分岐、という典型的な処理です。 if($flag){ #telnetを起動し、接続元をファイルに記録する処理 } else{ my $img = 'file.gif'; my $byte = (stat $img)[7]; print "Content-Type: image/gif\n"; print "Content-Length: $byte\n\n"; open IMG,$img; binmode((binmode(IMG),$|=1)[0]); print map {$_} <IMG>; close IMG; } やはり、イメージで呼び出すという方式では、FTPで、というのが、現実的でしょうか? socketと組み合わせれば、なんとかなりそうな気がしていろいろ試してみましたが...上手く行かないものですね。 |
>>3442 Mule わたしは http は proxy 経由かもしれないが、ftp や telnet は proxy 経由でないことを期待して、クライアント側から ftp や telnet でサーバに接続させるように仕向けて、 IP アドレスを取得する と思っていたのですが、そうではないようですね。 > コード全体の流れとしては、プロキシのチェックルーチンをよび、 > flagが立っていればif分岐、という典型的な処理です。 「proxy のチェック」というのは公開 proxy サーバかどうかを 調べるため、クライアントの IP アドレスに接続してみる、という ことですよね。 telnet で接続、というのは http://x68000.startshop.co.jp/~68user/unix/pickup?sleep てな方法でできます。もちろん代わりに Socket を使ってもいいです。 方法はともかく、公開 proxy かどうかの判断はやろうと思えばできます。 で、なぜ if($flag){ #telnetを起動し、接続元をファイルに記録する処理 } と proxy チェックルーチンを呼んだ後 ($flag が確定した後) に もう一度 telnet を実行する必要があるのでしょうか? #telnet を起動し、クライアントの IP アドレスに接続。 #接続できたら $flag=1; if($flag){ #接続元をファイルに記録する処理 open(LOG, ">log"); print LOG "$ENV{REMOTE_ADDR} is open proxy\n"; close(LOG); } とすればよいのではないですか? |
>>3439 68user お返事ありがとうございました。 なるほど、それがperlの仕様なんですね^^ 原因がわかりました。 実は <form action="$ENV{'SCRIPT_NAME'}?para2=data2 method='POST'> <input type="hidden" name="mode" value="res"> <input type="submit" value="返信"> </form> とやっていたためPOSTとGETが混在してしまっていたようでした。 この形ではPOSTをGETにかえても成功しませんでした。 管理人さんの助言でこれに気づくことができました。 どうもありがとうございました。 結果だけお伝えしておきます。 method='POST'の場合 http://xxx.cgi?para2=data2となりmode=resがおくられない。 method='GET'の場合 http://xxx.cgi?mode=resとなりpara2=data2がおくられない。 でした。 |
>>3444 perler > なるほど、それがperlの仕様なんですね^^ perl とは関係ないです。これは HTML と CGI の領域です。 apache-1.3.29・IE6・Mozilla-1.5 で試した結果、 > method='GET'の場合 > http://xxx.cgi?mode=resとなりpara2=data2がおくられない。 これは正しいです。正確に言うと 「ブラウザが para2=data2 を送らない」 です。 > method='POST'の場合 > http://xxx.cgi?para2=data2となりmode=resがおくられない。 これは間違いです。標準入力を解析していないだけ、でしょう。 以下の CGI スクリプトを実行し、GET と POST それぞれで QUERY_STRING と標準入力にどういう値が入っているか確認 してください。 ------- #!/usr/local/bin/perl print "Content-type: text/html\n\n"; $script_name = $0; $script_name =~ s|.*/||; print <<END; <html><body> <form action="$script_name?para2=data2" method='GET'> <input type="hidden" name="mode" value="res"> <input type="submit" value="GET"> </form> <form action="$script_name?para2=data2" method='POST'> <input type="hidden" name="mode" value="res"> <input type="submit" value="POST"> </form> END print "REQUEST_METHOD=$ENV{REQUEST_METHOD}<br>\n"; print "QUERY_STRING=$ENV{QUERY_STRING}<br>\n"; print "STDIN=\n"; print <STDIN>; |
>>3445 68user お返事ありがとうございました。 なるほど、標準入力を解析しないということがわかりました。 パラメーターを指定しているのにPOSTをつかったのがいけなかったようですね。 またGETをつかってもパラメーターを送らないので素直に違う方法を考えます。 ご教授ありがとうございました。 |
>>3443 68user こんにちは、Muleです。 ご返事、ありがとうございます。 中途半端なコードを書いたせいか、誤解があったようですが、わたしも68user様が言われた、 >http は proxy 経由かもしれないが、ftp や telnet は >proxy 経由でないことを期待して、クライアント側から >ftp や telnet でサーバに接続させるように仕向けて、 >IP アドレスを取得する という、まさにそのことを考えております。 proxyのルーチンは、proxy経由かどうかを最初にチェックする為のもので、 httpからのアクセスがproxy経由でなければ、画像を出力し普通に接続元を記録する。 そうでなければ、クライアント側からtelnetでサーバに接続させて、接続元を記録する、という流れです。 FTPと書いたのは、わたしのほうで、FTPを用意し、CGIから出力する画像の参照元に、FTPサーバにある画像を指定して出力させれば、FTPのログに元の接続先が残るのではないかと思うからです。 考え方として、何か大きな間違いをおかしているでしょうか? ご指摘いただければ、幸いです。 |
>>3447 Mule > そうでなければ、クライアント側からtelnetでサーバに接続させて、 > 接続元を記録する、という流れです。 なるほど。つまり、 >>3442 Mule のサンプルは、 接続元 IP アドレスに接続 [*1] if ( 接続成功 ){ クライアント側が telnet でサーバに接続してくるような 出力を行なう (例えば Location とか)。[*2] } else { 画像を表示 } ということですね? もしそうなら納得です。 ただ、*1 の部分は可能ですが、*2 の部分はよほどセキュリティが 甘いブラウザでないと無理なのではないか、と思います。 |
>>3448 68user さっそくのご返事、感謝いたします。 私が考えているのは、68user様のひながたに沿って考えると、最初にtelnetを起動するというのではないです。 たとえば、こんな感じになると思います。 use CGI qw(:standard); $addr = remote_addr; $host = remote_host; $host = gethostbyaddr(pack("C4",split /\./,$addr),2) if($host eq '' || $host eq $addr); unless($host){ クライアント側が telnet でサーバに接続してくるような 出力を行なう (例えば Location とか)。 } else { 画像を表示 } です。 素朴に疑問なのですが、最初にtelnetを起動して、接続元に接続できるかどうかの判定を行わなければ、理屈的に無理なのでしょうか? 私は、proxy経由のアクセスがあった時にのみ、if文を実行させたいと思うのですが... |
>>3449 Mule > $host = gethostbyaddr(pack("C4",split /\./,$addr),2) if($host eq '' || $host eq $addr); 逆引きに成功したら (つまりクライアントが FQDN を持って いたら) proxy 経由でない、逆引きに失敗したら proxy 経由 という判定方法ですね。 これは proxy 判定にはなっていません。なぜなら技術的には、 「FQDN を持つかどうかと proxy サーバであるかどうか」 は関係がないからです。 後は統計的に 「proxy サーバは FQDN を持たないケースが多い」 と言えるかどうかですが、特にそういうこともないと思います。 むしろわたしは 「proxy サーバは FQDN を持つ可能性が高い」 と思います。 > 素朴に疑問なのですが、最初にtelnetを起動して、接続元に > 接続できるかどうかの判定を行わなければ、理屈的に無理 > なのでしょうか? 理屈的には、100% の精度の proxy 判定は不可能です。 ただ、完璧でなくていいなら、以下のような策はあります。 1. proxy 特有のヘッダ、例えば以下のようなものが設定されて いるか調べる。 HTTP_PROXY_CONNECTION HTTP_SP_HOST HTTP_VIA HTTP_X_FORWARDED_FOR http://taruo.net/e/ などで判定しているのはコレでしょう。 http://www2s.biglobe.ne.jp/~cru/library/lq/index.html でも 同様の判定を行っているようです。 ただし、proxy サーバの管理者が適切に設定すれば、これらの ヘッダを渡さないようにすることは可能です。 2. クライアント側の適当なポートに接続し、公開 proxy か どうか (誰でも接続できる proxy かどうか) 判断する。 例えば 2ch ではこれをやっているんでしょう。 http://info.2ch.net/guide/faq.html#F5 ただし、以下のような欠点があります。 - どのポート番号に接続するかは適当に決めなければならない。 全ポートをポートスキャンしていると時間がかかる。 - あくまで「公開 proxy」かどうかの判定にしか使えない。 (世の中の proxy の大多数を占める) 特定のネットワーク内から のみ使用可能な proxy は判定できない。 - ポートスキャンは反社会的。やりすぎると相手からクレームを 付けられる可能性が高い。 3. telnet・Java Applet などで直接接続させるよう仕向ける。 詳しくは以下のサイトをどうぞ。 http://akademeia.info/main/lecture3/tokubetu_IP_nuki.htm http://www.nurs.or.jp/~telnet/tips.html の 「telnetプロトコルによるIP抜き」 ただしこれも反社会的です。いきなりこれをやられたら、 わたしならそのサイトには二度と行きません。 普通は 1 でやめておくのがいいでしょう。2・3 は真面目な ページでやるには過激すぎると思います。 |
質問ではないんで、邪魔だったら消してくださいね。 過去ログを時間が許すままに読んじゃいました。 とってもおもしろかったです^^ まだまだいっぱい残っているので読破しようとおもいます。 言語はたくさん覚えたけど、UNIXには触ったことがないというある意味 希少なプログラマーなのでちょっとわからないこともあるんですけど、 予想するのが楽しいです。 最近のログをみていると応援の書き込みが少なかったので「管理がんばってください」の意味をこめてかきこませていただきました。 お目汚し失礼いたしました。 |
大変、参考になりました。 私がproxyのチェックを行う際には、hostが存在するかどうかの他に、以下のような環境変数を配列に入れて、foreach文や正規表現と組み合わせてチェックしています。 @proxy = ("HTTP_CLIENT_IP", "HTTP_VIA", "HTTP_CACHE_INFO", "HTTP_CACHE_CONTROL", "HTTP_FORWARDED", "HTTP_X_FORWARDED_FOR","HTTP_SP_HOST", "HTTP_TE","HTTP_XONNECTION","HTTP_PROXY_CONNECTION", "HTTP_XROXY_CONNECTION","HTTP_X_LOCKING", "HTTP_PRAGMA","HTTP_IF_MODIFIED_SINCE","HTTP_PC_REMOTE_ADDR"); この他に、 $ENV{'HTTP_CONNECTION'}を調べ、値がkeep-alive以外であればproxyと... しかしこの方法では、精度の高いproxyの判定は、厳しいのではないか...というのが現実でした。 最初から言えばよかったのかも知れませんが...というか、上手く説明できなったのですが、 私がやりたかったことは、結局のところ、 imgタグでしかCGIを起動できない環境で、3 ができるかどうかでした。 コードを直接置ける環境での、3のコードは書いたことがありますので、これをイメージをトリガーにした方法で実装できるかどうかが問題でした。 (telnetの自動起動は、いくらでも未然に防げるものの...) これまでいろいろご教授いただきまして、ありがとうございました。 また書き込みにくるかもしれませんが、暫くは教えていただいた情報を元に試行錯誤してみます。 それでは、よい休日を。 |
みなさん こんにちは。 すごく簡単な質問だと思うのですが、 過去ログを見てもわからなかったため質問いたします。 UNIXコマンドの compress a 1>/dev/null 2>&1 というコマンドについて。 compress a は、aファイルをcompress形式で圧縮するということはわかるのですが、 1>/dev/null 2>&1 は、どういう処理をしているのかわかりません。 よろしくお願いします。 |
>>3451 perler ありがとうございます。それなりにがんばります :-) >>3452 Mule どうもお互い無駄な時間を浪費したように感じます。掲示板で 円滑なコミュニケーションを行うにあたり、質問時にどの程度の 情報を書くべきかについて ご一考ください。 >>3453 あかつき compress の出力を全て捨てるということです。 http://x68000.startshop.co.jp/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8 http://x68000.startshop.co.jp/~68user/unix/pickup?%2Fdev%2Fnull |
ご回答ありがとうございました。 すでにまとめてありましたね。 こんどから、もっときちんと調べます。 |
大雑把な質問ですがResetConnect関数はどのように使うものなのですか? |
挨拶が抜けましたが、初めて書き込みます。宜しくお願いいたします |
>>3456 Hide ResetConnect関数とは何ですか? (google でも 6件しか 引っかからないようですけれども) |
一般的な関数でないのでしょうか? RST送信するんですが・・ |
>>3459 Hide わたしは初めて聞きました。 |
Bシェルなのですが、tarで標準出力した結果をteeでファイルに出力し なおかつ、tarの正常、異常を判断したいのですが、どうすればよい のですか。 tar -cvf /dev/rmt/0m * 2>&1 | tee -a kekka.txt と行ったのですが、標準出力及びkekka.txtに出力されたのですが、 $?の値が常に「0」の状態です。 標準出力、ファイルへの出力、$?の判定を行えるよにするにはどう すればよいのですか。 |
>>3461 だん ちゃんとステータスコードを取れるみたいですよ。 % true | tee -a kekka.txt; echo $? 0 % false | tee -a kekka.txt; echo $? 255 と思ったら、取れるのは csh・tcsh だけで sh (Solaris2.6)・bash は 無理みたいですね。 sh では % true && succeed=OK % echo $succeed % false || succeed=NG % echo $succeed や % true && echo OK | tee -a kekka.txt % false || echo NG | tee -a kekka.txt はいけるのに、 % true && succeed=OK | tee -a kekka.txt % echo $succeed % false || succeed=NG | tee -a kekka.txt % echo $succeed は $succeed に値が入らない。なんでだろう。 # サブシェルで実行されるから? というわけで、Solaris2.6 の sh では % (true; echo $? >result) | tee -a kekka.txt % cat result % (false; echo $? >result) | tee -a kekka.txt % cat result とステータスコードをファイルに保存するというかっこ悪い方法で 実現できました。より美しいやり方を募集中です。 |
>>3462 68user 俺には美しいやり方なんて無理ですが、ファイルじゃないだけなら % ( true ; rc = $? ) | tee > kekka.txt てのは?;-) |
>>3463 has ああ、すみません、3462をよく読んでませんでした。 68userの言う、&&とか||の処理詳細と(;)の違いは良く知らないんですが、 redhat 9.0のshでは3463のやり方ができたもので。 一応ご報告まで。 |
>>3463 has それだと (〜) の部分はサブシェルが実行することになります。 サブシェルのシェル変数は確かに $rc=1 になるけれど、親の シェルのシェル変数には影響しないので、結局 (〜) の外から $rc を参照することはできないと思います。 ちなみに a && b は、a のステータスコードが 0 のときのみ b を実行 a || b は、a のステータスコードが >0 のときのみ b を実行 です。 |
はじめまして. httptalker をしばらく前から愛用しております. 非常に強力なツールで,Webから必要な情報を取得し目的にあわせて加工するなど の用途でたいへん助かっているのですが,ひとつ質問をさせてください. パスワードの認証の後でCookieを受け渡す形式のWebSite のデータをGETする よい方法は,あるでしょうか? httptalker のScript の中にCookie のやりとりをする機能を埋め込めばよさそう ですが,わたしにはかなり難しいのです. |
>>3466 capricio えーっと、お使いのものはこれですか? http://x68000.startshop.co.jp/~68user/net/sample/http-client-2.pl これは解説用のサンプルなので、実際の使用はおすすめしません。 じゃなくて http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/bin/httptalker これをお使いなら、あまりに汚いコードだったので、さきほど少し 書きなおしました。ついでに追加ヘッダを指定できるようにしました。 % ./httptalker -GET http://example.com/foo/bar -add-header 'Cookie: a=b' で cookie を送信できます。 http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/bin/httptalker?rev=1.3&content-type=text/plain ここからどうぞ。 ただし、これの使用もおすすめしません。テストもしっかりしていないし、 機能面でも劣るからです。 というわけで、できるならば - wget (--load-cookies=ファイル名 で cookie を指定できる) - LWP モジュール付属 (libnet モジュール) の GET コマンド。 オプション -H 'Cookie: a=b' で cookie 送信可能。 - H_HTTP モジュール (http://www.studyinghttp.net/H_HTTP.html) などを使った方がよいでしょう。 |
>>3462 68user $ ( true | tee -a kekka.txt ) & ; wait $! ・・・・・やっぱり綺麗じゃないですね。 |
すみません徹夜明けでボケてました。 吊って来ます・・・ |
>>3463 has 俺には美しいやり方なんて無理ですが、ファイルじゃないだけなら % ( true ; rc = $? ) | tee > kekka.txt てのは?;-) 私は、HP-UXを使用しているのですが、 % ( true ; rc = $? ) と実行するとシステムのシャットダウンになります。 他のOSも同じだと思うのですが、使用するときは注意した方が 良いと思います。 |
>>3470 くに > % ( true ; rc = $? ) > と実行するとシステムのシャットダウンになります。 /etc に PATH が通っていたため /etc/rc が実行されたのではないかと 思います (引数は = と $?)。 sh の変数代入は = の前後に空白を入れてはいけないので、 rc = $? でなく、rc=$? ですね。 |
lsコマンドについて質問です。 lsと実行するとファイル名やディレクトリ名が表示されますが、 ファイル名だけとかディレクトリ名だけとかを表示させたいの ですが、できるのでしょうか。 manで調べてみたのですが該当するものもありません。 何かと組み合わせてて1行でできないものでしょうか。 |
>>3472 hanzen > lsと実行するとファイル名やディレクトリ名が表示されますが、 > ファイル名だけとかディレクトリ名だけとかを表示させたいの > ですが 以下のやりとりを参考にしてください。 >>3245 bebe >>3246 68user |
>>3465 68user すみません、勘違いしてました。 3463 でできたと思っていたら、1行ずつ実行したときにセットした rcの値が表示されただけでした。 >>3470 くに それは予想していませんでした。 何にせよ紛らわしいのはよくないですね。 気をつけます。 というわけで何かよい方法はないか探してみましたが、 bashだとこういうのがあるみたいです。 (ただしシェルスクリプト内限定らしいですが) $ echo $BASH_VERSION 2.05b.0(1)-release $ cat pipetest.sh #!/bin/bash true | false | true | false echo ${PIPESTATUS[@]} $ ./pipetest.sh 0 1 0 1 あとはこんなん:-< cp /dev/null kekka.txt ; tail -f kekka.txt & pid=$! ; command > kekka.txt ; st=$? ; kill $pid echo $st |
>>3465 68user 恥の上塗り。 いろいろと試してみましたが、 ファイルを作成せずにステータスは取得できそうにありません。 後は作成するファイルが通常のファイルかFIFOかくらいの違いでしょうか? ------ #!/bin/sh fifo="fifo.$$" mkfifo -m 600 $fifo trap "rm -f $fifo" 0 1 2 3 15 ( command ; echo $? >$fifo ) | tee kekka.txt & rtn=`cat $fifo` echo $rtn >>3472 hanzen >>3473 68user 後は ls -F | grep '/' とかでしょうか。表示に/がついてしまいますが。 |
UNIXでファイルを開かずにファイルの解析を行いたいのですが、 fileコマンドでは実行ファイルなのかどうかなど、詳しいことが わかりませんでした。 #C言語関連のソースかどうか確認したいのです。 何か、他にいい方法はないでしょうか? 教えていただけるとありがたいですm(__)m |
こんにちは。 以前、こちらで幾らか質問させて頂いた tomo と申します。 今、perlでタイマ処理をする事を考えているのですが、 perlではC言語の様にタイマIDという形で複数のタイマを 識別管理する事は出来ないのでしょうか? |
>>3476 橘 調べたいのは > fileコマンドでは実行ファイルなのかどうか と > C言語関連のソースかどうか のどちらですか? 「〜かどうか判定したい」ということなら、何らかの判断基準が ないと判定できませんので、そこらへんを明確にしてください。 >>3477 tomo > perlではC言語の様にタイマIDという形で複数のタイマを > 識別管理する事は出来ないのでしょうか? C にも perl にもタイマ ID という概念はありません。 そもそも「タイマ ID」とは Win32API (MFC?) のそれですか? なら、perl で Win32API を利用できるモジュールを探せば できるでしょうが、あいにく Windows には明るくないので http://www.cpan.org から探してみてください。 |
68user 様 UNIXの部屋等、ちょくちょく参考にさせて頂いております。ありがとうございます。 私、現在、DNSまわりのプログラミングを行っておりまして、ネットワークプログラミングの基礎知識の DNS クライアントを作ってみようのページを、基礎から理解する意味で読ませて頂いたのですが、 この(2)のページ、http://x68000.startshop.co.jp/~68user/net/resolver-2.htmlの DNSヘッダのフラグの部分の第13〜15bitの3bitがRCODEとなっていますが、これは第13〜16bitの4bit分の 間違いだと思うのですがいかがでしょうか。 細かい部分で申し訳ないのですが、気になりましたのでご報告させて頂きました。お忙しいとは思いますが、 よろしくお願いいたします。 |
>>3479 なっち ご指摘ありがとうございます。修正しました。ついでに 1…15bit、16…31bit となっていたものを 1…16bit、17…32bit に修正しました。 # http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/org/resolver-2.html しかし、一般的には MSB を第 0bit とする場合が多いでしょうか? 「詳解TCP/IP Vol.1」では 0〜31bit となっていましたので、 悩むところです。 |
何をもってして一般的というかによりますが・・・ ハードウェアでは、例えばverilogのバス表記の例にとると、 [15:0] > [0:15] >>> [1:16]という頻度で見かけます。 僕の知っている限りの物理層では、[0]が時間軸で最初に 送受信されるので、[0:15]という表記が現れます。 とはいえ、中身を解釈する際に、[15:0]のように置き換え ないと、人間には理解し難い事が多々あり、そのような処理 は僕はよくします。 |
awkの使い方について教えて下さい。 awkを使用して、以下の出力を、数字は、3桁毎にカンマで区切り、 出力位置を揃えて出力したいのですが、 180 file1.txt 1821 file2.txt 113457 fil3.txt を 180 file1.txt 1,821 file2.txt 113,457 file3.txt と出力したいのですが、 数字の部分を揃えることができません。 そのため、たの部分もそろいません。 どうすれば上手くできますか。 ------------------------------- #!/bin/sh # cat list.txt | sort -n -r | awk ' function put_comm(val) { if (val < 1000) { printf("%d",val) ; } else { put_comm(val / 1000) ; printf(",%03d",val % 1000) ; } } { if ($1 < 1000) { printf("%d",$1) ; } else { val=$1 ; put_comm(val) ; } } { #printf "\n" printf(" %s\n",$2) }' |
いつも参考にさせていただいてます dtterm上で動作するC言語のプログラムを作成しています そのプログラムで、cursesのwaddchとwrefreshを使用して1画面分の描画を1文字ずつ行っているのですが、 その際にカーソル表示がされているため、ちらついてしまいます カーソルを一時的に消す方法は無いでしょうか? ちなみに、waddchで画面編集後、最後にwrefreshを1回呼ぶ方法ですと、 一気に1画面分を表示できるのですが、編集時間が長く感じられるため、 1文字ずつパラパラと表示したいと考えています。 |
>>3482 米 桁数の上限がわからないと駄目ですが こんなのでどうでしょ?(下では8桁まで) ------ $ cat list 123 file1.txt 123456 file2.txt 1234567 file3.txt $ cat test.awk #!/bin/nawk -f { i = sprintf("%d",length($1) / 3) ; j = sprintf("%d",length($1) % 3) ; if ( i > 1 ) { if ( j == 0 ) j = 3 ; str_buf = sprintf("%s",substr($1,0,j)) ; for ( k=0 ; k<i ; k++ ) { cut_str = substr($1,j+(k*3)+1,3) ; if ( cut_str == "" ) break ; str_buf = sprintf("%s,%s",str_buf,cut_str) ; cut_str = "" ; } } else { str_buf = $1 ; } printf("%10s %s\n",str_buf,$2) ; } $ ./test.awk list 123 file1.txt 123,456 file2.txt 1,234,567 file3.txt |
>>3481 へにか > 僕の知っている限りの物理層では、[0]が時間軸で最初に > 送受信されるので、[0:15]という表記が現れます。 なるほど。ネットワークプログラミングでは当然ネットワーク バイトオーダで MSB が先になるわけなので、 [0:15] か [1:16] のどちらかで決まりですね。 個人的には「プログラマたるもの数えるときは 0 から」という ことで、そのうち [0:15] に修正しておこうと思います。 >>3483 tonpei curses はよくわかってませんが、curs_set(0) ですかね。 capability 的には cursor_invisible (vi) っぽいです。 ただ、端末エミュレータにカーソルを消す機能があるかという 問題があるかもしれません。うちの FreeBSD の /etc/termcap に xterm-basic|xterm common (XFree86):...:vi=\E[?25l:... とあったので xterm で % printf "\033[?25l" とするとカーソルが消えましたが、kterm-6.2.0_5 では消えません でした。kterm にカーソルを消す機能がないような感じがします。 でもまぁ dtterm なら多分大丈夫だとは思います。 |
>>3484 zsh 環境も書かずに質問して申し訳ありません。 HP-UX11.00です。 nawkが入っていないので、awkに変えて実行しました。 一応、上手く動きました。 cat list.txt $1 | sort -n -r | awk ' { i = sprintf("%d",length($1) / 3) ; j = sprintf("%d",length($1) % 3) ; if ( i > 1 ) { if ( j == 0 ) j = 3 ; str_buf = sprintf("%s",substr($1,0,j)) ; for ( k=0 ; k<i ; k++ ) { cut_str = substr($1,j+(k*3)+1,3) ; if ( cut_str == "" ) break ; str_buf = sprintf("%s,%s",str_buf,cut_str) ; cut_str = "" ; } } else { str_buf = $1 ; } printf("%10s %s\n",str_buf,$2) ; }' |
>>3486 米 以下の様に、数字が5桁、4桁は正しくでませんでした。 123 file1.txt 1234 file2.txt 12345 file3.txt 123456 file4.txt 1234567 file5.txt |
>>3487 米 if ( i > 1 ) { を if ( i >= 1 ) { です。 |
>>3488 米 すみません、その部分のif文自体不要でした。 (不要になるように修正してたのを忘れてました。) ----- $ cat list 1 file1.txt 12 file1.txt 123 file1.txt 1234 file2.txt 12345 file3.txt 123456 file4.txt 1234567 file5.txt $ cat test.sh #!/bin/sh sort -n -r $1 | awk '{ i = sprintf("%d",length($1) / 3) ; j = sprintf("%d",length($1) % 3) ; if ( j == 0 ) j = 3 ; str_buf = sprintf("%s",substr($1,0,j)) ; for ( k=0 ; k<i ; k++ ) { cut_str = substr($1,j+(k*3)+1,3) ; if ( cut_str == "" ) break ; str_buf = sprintf("%s,%s",str_buf,cut_str) ; cut_str = "" ; } printf("%10s %s\n",str_buf,$2) ; }' $ sh test.sh list 1,234,567 file5.txt 123,456 file4.txt 12,345 file3.txt 1,234 file2.txt 123 file1.txt 12 file1.txt 1 file1.txt |
68Userさん、回答ありがとうございました またまた質問がありますので、どなたか回答よろしくお願いします 環境:HP-UX Ver.11.0 1.XWindowのログイン後、言語選択の画面が表示されますが、この画面を出さずに、デフォルトで ATOKを選ぶ方法は? 2.XWindowの起動後、ウインドウ内に、ツールバー(端末起動、エディタ起動などのボタン郡)が 表示されますが、これを非表示(アイコンも無くす)にする方法は? 以上、2件についてご存知でしたら、回答お願いします |
HP-UXですが、シェルについて教えて下さい。 printfを使用して書式で、変数の中身を出力しているのですが 上手くできません。 ----------------- #!/bin/sh name1="yamada" name2="taro" printf "%s %s --> %s\n",${name1} ${name2} NG exit 0 ------------ とすると yamada NG --> ,taro となってしまいます。 |
>>3490 tonpei http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse の 「回答をもらったら結果を報告する」 をよく読んでください。なお、>>3490 の質問については わかりません。 >>3491 みの > printf "%s %s --> %s\n",${name1} ${name2} NG カンマが余分だと思います。 printf "%s %s --> %s\n" ${name1} ${name2} NG > yamada NG --> > ,taro > となってしまいます。 本当ですか? taro NG --> ,yamada になりませんか? |
http://x68000.startshop.co.jp/~68user/net/ ネットワークプログラミングの基礎知識 の http://x68000.startshop.co.jp/~68user/net/crypt-1.html 暗号化のお話 (1) 共通鍵暗号方式 を更新し、 http://x68000.startshop.co.jp/~68user/net/crypt-2.html 暗号化のお話 (2) 公開鍵暗号方式 http://x68000.startshop.co.jp/~68user/net/crypt-3.html 暗号化のお話 (3) 署名 http://x68000.startshop.co.jp/~68user/net/crypt-5.html 暗号化のお話 (5) まとめ を追加しました。 |
>>3492 68user 安易な回答をしてしまい申し訳ありませんでした。 利用規約を読ませていただきましたので、改めて回答させてください。 御指摘頂いた、curs_set(0)使用することで、dtterm上でカーソルの消去ができました。 また、printfの方法でも可能でした。 ありがとうございました |
>3492 すみません カンマが余分でした。 ありがとうございます。 |
HP-UXでのawkについて質問なのですが、 awkを使用してファイルのENDを判断できるのですか。 例えば、 cat date.txt aaa aaa bbb aaa bbb ccc 111 111 222 111 222 3333 とあった場合、 ------------------------ #/bin/sh awk ' function sub() { } getline ; 処理省略 { if (NF == 0) next ; if (NF >= 1) sub() ; ※ }' data.txt ---------------------- ※の場所でファイルのENDか判断したいのですができるのでしょうか。 |
>>3496 ブラウン ファイルのENDというのが最後の行の事なのか EOFの事なのか不明ですが、最終行であれば以下のように。 ちなみに環境はSolarisです。 ------ #!/bin/sh max_line=`wc -l $1 | awk '{ print $1 }'` awk '{ print ; if ( NR == max_line ) printf "END\n" }' max_line=$max_line $1 ------ 行数を取得する為だけにawk使うのはどうかと思いますが。 |
はじめましてです。C言語を勉強しているものです。 質問なんですが、ネットワークプログラミングで チャットを使ったゲームみたいなものを作りたいなと思っておりまして、 具体的にチャットではサーバーがクライアント全員にメッセージを送る 形になりますが、このゲームではクライアントが メッセージを送る人を選ぶことができるようにしたいのです。 たとえば会話しているのは5人いるけどそのうち3人に送ろうという 感じです。クライアント側で、全ユーザーの名前が表示され その中から送る人を選ぶみたいなかんじのゲームなんですが。 チャットにおいて選んだユーザーにだけメッセージを送るというのは 一体どうすれば可能なのですか? |
>>3497 zsh ありがとうございます。 説明不足ですみません。 ファイルのENDというのは、最終行ではなく、EOFのことです。 また、行数を取得するためにawkを使用していません。 awkを使用して、ファイルから1レコードづつよみこみ条件 毎に処理を行い、EOFだったら終了と考えていたのですが。 |
>>3499 ブラウン 取得したいのがEOFだとすると getlineの戻り値見るくらいしか思いつきません。 普通にENDに記述じゃダメですか? 或いは行数+フィールド番号でファイルの最後をチェックするとか。 >また、行数を取得するためにawkを使用していません。 すみません、行数を取得するためだけにawkを使うのはどうか というのは自分に対して言ったものです。 |
あけましておめでとうございます。 朝早くから失礼いたします。 このページは、EmacsLipsでネットワークプログラミングについて ぐぐっていたら、たどり着きました。 早速一つ質問させてください。 telnetでウェブサーバからファイルを取ってこようとしたところ、 GET /hoge.rdf HTTP/1.0 で、404になってしまいます。ブラウザやwgetだと取ってこれます。 こういう場合は、どのようにすればいいのでしょうか? # あと、私事で恐縮なのですが、SEGA BBSのログを発見したので、 # ためしに名前を入れてみたらおもいっきりヒットしました。(^_^;) # いやー懐かしい。とにかく懐かしいです。(;_;)ホロホロ # ちなみに、SEGA BBSのトップにあるsagabitoへのリンクって #「くにおにく」さんのページですよね? # 当時、「くにおにく」さんに大変世話になった記憶があります。 # 無事で過ごされているようでしたらなによりです。 # 以上、私事で失礼しました。 |
>>3501 けんおお すみません。自己解決しました。 GET /hoge.rdf HTTP/1.1 Host:hoge.jp Connection:close でいけました。 最近は、HTTP/1.0ではファイルを取ってこれなくなったんでしょうか? それでは、失礼します。 |
はじめまして。 検索辿ってこちらを拝見させていただきました。 早速質問させていただきたいのですが、 SunのUltra10 SPARKマシンで、SunOSのデスクトップに ファイルを配置するためにデスクトップの絶対パスを調べたいのですが、 Windowsのデスクトップのようにショートカットの絶対パスを辿ろうと しても一向に見つかりません。 もしかしてSunOSのデスクトップ(ワークステーション?)上のショートカットは実体のない参照(リンク)でしかなくて、デスクトップの絶対パスなんてものは存在しない(ファイルを置くことはできない)のでしょうか。 よろしくご教示お願いします。 |
>>3498 ポッしブル > チャットにおいて選んだユーザーにだけメッセージを送るというのは > 一体どうすれば可能なのですか? 名前と IP アドレスの一覧のテーブルを内部に持っておいて、選択 された名前から対応する IP アドレスを得て、その IP アドレス宛に メッセージを送信すれば可能でしょう。 要は、そういう動作をするように、あなたがプログラムを組まなく てはならないということです。 >>3501 けんおお >>3502 けんおお GET /hoge.rdf HTTP/1.0 が 404 not found なのは、 バーチャルホストな web サーバだったからでしょう。 http://x68000.startshop.co.jp/~68user/net/http-4.html さらなる改善点・バーチャルホストに対応 を読んでください。 HTTP/1.1 で OK だったのは、HTTP/1.1 だと Host ヘッダが 必須なため、結果的にバーチャルホストに対してホスト名を 提示することができたからだと思われます。 > # ちなみに、SEGA BBSのトップにあるsagabitoへのリンクって > #「くにおにく」さんのページですよね? そうです。でも今は公開されていないようですね。1年ほど前に BBS があることは確認しましたが、今は見つけられません。 >>3503 ShinoP CDE ですか? CDE をまともに使ったことはありませんが、 Solaris2.6+CDE 環境で試してみると、 ~/.dt/Desktop/.!dtdesktop ~/.dt/sessions/current/.!dtdesktop などのファイルに、リンク先のフルパスが保存されているような 気がします。 |
>>3504 68user いえ、リンク先のフルパスが知りたいのではなく、目的は 「デスクトップ」自体の絶対パスを知りたい、ということです。 少々説明が足りませんでした。 その手段としてWindowsと同じ感覚でショートカットのリンク先ではなく ショートカット自身の絶対パス (Windows2000ならば "C:\Documents and Settings\administrator\デスクトップ" で表されるような) を調べようとしたのですが、 どうにも見つかりません。 これは現在疑ってる通り、ショートカット自体には実体がなく、 したがってデスクトップに実体ファイルを配置する、 ということは不可能だということなのでしょうか。 |
>>3505 ShinoP そういうことであれば > ショートカット自体には実体がなく、したがってデスクトップに > 実体ファイルを配置する、ということは不可能 だと思います。 ただしわたしは CDE は常用しておらず、今回初めて CDE のヘルプを 見たくらいなので、間違っている可能性は多分にあります。 |
>>3506 68user CDEのデスクトップショートカットはシンボリックリンクみたいなもの、 ということのようですね。 断念して代替パスを設定する方向で進めようと思います。 ありがとうございました。 |
>>3500 zsh >取得したいのがEOFだとすると >getlineの戻り値見るくらいしか思いつきません。 >普通にENDに記述じゃダメですか? >或いは行数+フィールド番号でファイルの最後をチェックするとか getlineの戻り値ですか。 ファイルの総行数を取得して、読み込んだ行数と比較するかと思う のですが。 >或いは行数+フィールド番号でファイルの最後をチェックするとか ちなみにどうするのですか。 >普通にENDに記述じゃダメですか。 とはどういう意味ですか。 ファイルの最後にENDを付けた様式ということですか。 それでしたら無理です。 |
>>3508 ブラウン >> 普通にENDに記述じゃダメですか。 > とはどういう意味ですか。 { 行ごとの処理 } END { 終了時の処理 } という書き方ではどうか、ということでしょう。これは awk の設計思想に沿った最も自然な書き方だと思います。 それがダメなのなら、わたしも getline の戻り値を 取るのがよいと思います。 |
>>3509 68user フォローありがとうございます。 >>3508 ブラウン >ファイルの総行数を取得して、読み込んだ行数と比較するかと思う >のですが。 それは以前提示したスクリプトの方法ですが、 それだと最終行かどうかの判断であり、EOFかどうかの判断ではありません。 >>或いは行数+フィールド番号でファイルの最後をチェックするとか >ちなみにどうするのですか。 あまり意味のない方法ですので、気にしない方が良いと思います。 |
シェルについて2点教えて下さい。 1.フィールドの区切がカンマ「,」となっている行から 例えば、 山田 太郎,ヤマタ゛ タロウ,Yamda Taro,18,1760/12/24 山田 花子,ヤマタ゛ ハナコ,Yamda HANAKO,18,1760/12/24 から、 先頭のフィールドかあとか、 フィールドの3,4,5を取り出したいのです が、awkを使う以外にないのでしょうか。 2.シェルで、今日から10日前の日付を取得することはできるのでしょうか 環境は、HP-UX11.00、Bシェルです。 |
>>3511 ブラウン シェルについて2点教えて下さい。 1.フィールドの区切がカンマ「,」となっている行から 例えば、 山田 太郎,ヤマタ゛ タロウ,Yamda Taro,18,1760/12/24 山田 花子,ヤマタ゛ ハナコ,Yamda HANAKO,18,1760/12/24 から、 先頭のフィールドから順にとか、フィールドの3,4,5を取り出したい のですが、awkを使う以外にないのでしょうか。 awkを使わないで出来る方法と、awkを使ってできる方法を教えて 下さい。 2.シェルで、今日から10日前の日付や、指定した日付の10日前を 取得することはできるのでしょうか 環境は、HP-UX11.00、Bシェルです。 |
>>3511 ブラウン 質問したら必ず結果を書いてください。 http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse |
賢いやり方か、上手いやり方か分からないが こうすればできる。 -------------------------------------------- #!/bin/sh back_to_day() { case $MM in 0) MM=12 MAX=31 ;; 1|3|5|7|8|10) MAX=31 ;; 4|6|9|11) MAX=30 ;; 2) if [ `expr $YYYY % 4` -eq 0 ]; then MAX=29 else MAX=28 fi ;; esac } YYYY=`echo $1 | cut -c1-4` MM=`echo $1 | cut -c5-6` DD=`echo $1 | cut -c7-` DD=$((DD-7)) if [ ${DD} -le 0 ] ; then MM=$((MM-1)) if [ ${MM} -eq 0 ] ; then YYYY=$((YYYY-1)) back_to_day DD=$((DD*-1)) DD=$((MAX-DD)) fi fi printf "%d%02d%02d\n" $YYYY $MM $DD exit 0 |
>>3512 ブラウン 区切り文字がカンマで、awkを使用しない場合。 ------ $ cat data.txt 山田 太郎,ヤマタ゛ タロウ,Yamda Taro,18,1760/12/24 山田 花子,ヤマタ゛ ハナコ,Yamda HANAKO,18,1760/12/24 $ cat sam1.sh #!/bin/sh OIFS="$IFS" i=0 while read line ; do IFS="," i=`expr $i + 1` set -- $line j=0 while [ $# -gt 0 ] ; do j=`expr $j + 1` echo "$i - $j : $1" shift done IFS="$OIFS" done < data.txt $ sh sam1.sh 1 - 1 : 山田 太郎 1 - 2 : ヤマタ゛ タロウ 1 - 3 : Yamda Taro 1 - 4 : 18 1 - 5 : 1760/12/24 2 - 1 : 山田 花子 2 - 2 : ヤマタ゛ ハナコ 2 - 3 : Yamda HANAKO 2 - 4 : 18 2 - 5 : 1760/12/24 ------ 指定された日付の10日前の日付を取得するのは面倒そうなのでパス。 単純に今日から10日前を取得する方法については、 下(↓)を良く読みましょう。 http://x68000.startshop.co.jp/~68user/unix/prgmemo.html#date |
>>3515 zsh ありがとうございます。 行の編集についてはできました。 しかし、日付の操作については、 http://x68000.startshop.co.jp/~68user/unix/prgmemo.html#date を参考にしてやって見ました。 タイムゾーンを設定して、URLの例にあるのでは、上手くいったのですが % env TZ=JST+15 date (1日前の時刻を表示) % env TZ=JST-33 date (1日後の時刻を表示) 2日前では、 -9+48=39 % env TZ=JST+39 date は上手く行きませんでした。 環境は、HP-UX11.00、Bシェルです。 |
初めて投稿いたします。 UNIXのコマンドで、split というファイル分割コマンドがありますが、分割後のファイルをWindowsで結合させるための、MS-DOS コマンド、あるいは、フリーのソフトを知らないでしょうか。 |
>>3517 せんべい > 分割後のファイルをWindowsで結合させるための、MS-DOS コマンド copy a.txt+b.txt+c.txt out.txt でできたような気がします。 > あるいは、フリーのソフトを知らないでしょうか。 http://www.so-net.ne.jp/download/win/util/file/spl_mrg/ など。 |
はじめまして,unix初心者です,教えて下さい。 異常終了させてしまい,1つのハードがmountされません。fsckを使って修復しようとしたのですが,エラーメッセージによると部分的なセクターが破損しているため修復できないとの内容でした。破損している箇所だけのフォーマットは可能なのでしょうか?もしあれば方法を教えて下さい。お願い致します。 |
>>3519 初心者 詳しくないのでなんともいえませんが (これまで fsck でこけた 経験がないので)、少なくとも以下の情報は必要でしょう。 - OS 名とバージョン - ファイルシステム名 (ufs, ext2 など) - 正確なエラーメッセージ (エラーメッセージで検索できるよう原文を提示する) 検索のキーワードとしては「スーパーブロック」ですかねぇ。 |
unixのfindコマンドについて教えて下さい。 findを使用するとファイルの検索ができますが、 自分がいるカレントのみを検索し、その配下にあるディレクトリ を検索したくないのですが、どうすれば可能でしょうか。 例えば、 現在位置 cd /tmp/tool/bin /tmp/tool/bin 入るとします。 find .. -name ".log" -type f -print と行うと、tool及び、bin配下やよのたのディレクトリを検索 find .. ! -depth -name "*.log" -print と行うと検索しない。 1つもだった、ところのファイルのみを検索したい |
>>3521 yabu -maxdepth 1 でいけるでしょうが、-maxdepth に対応 していない find もあります。 単にファイル名でマッチさせたいだけあれば、 % echo *.log でもいいでしょう。 |
Sunでaliasの設定でつまづいてます。。(alias rm="rm -i") シェルはshなので.profileに記述しましたが効きません。 ネット検索しましたがshでのalias設定なしとありました。 shでのalias設定はどう行えばいいでしょうか? ご教授お願いします |
>>3522 68user >-maxdepth 1 でいけるでしょうが、-maxdepth に対応 >していない find もあります。 HP-UX、SunOSともに対応していませんでした。 >単にファイル名でマッチさせたいだけあれば、 > % echo *.log >でもいいでしょう。 でやらせていただきました。 |
IE などブラウザ上のボタンなどの操作を外部からしたいのですがしたいのですが、可能でしょうか? 例、VC++ のソフトで、Yahoo の検索を検索キーワードを入力や検索ボタンを押したい。 例、証券会社のHPで定期的に株価更新のため株価ボタンを押す。 などです。 ここの主旨から外れるかも知れませんが、宜しくお願いします。 |
>>3523 moko まずは $ . $HOME/.profile としましょう。それで alias が効かないなら .profile の書き方が悪い。alias が効くなら .profile が読み込まれ ていないか、.profile 読み込み後に unalias されている んでしょう。 >>3525 external 詳しいところは知らないので、キーワードだけ並べておきます。 COM (Component Object Model) OLE (Object Linking and Embedding) ActiveX |
初歩的な質問ですが、Solarisのhostsについて教えて下さい。 他の端末と通信する為には/etc/inet/hostsにIPを書くと思っています。 でも、/etc/hostsにも同じhostsがあり、両方直しています。 /etc/hostsには/etc/inet/hostsと違った意味があるのでしょうか。 宜しくお願いします。 |
>>3527 yuki http://www.freebsd.org/cgi/man.cgi?query=hosts&manpath=SunOS+5.9 NOTES /etc/inet/hosts is the official SVR4 name of the hosts file. The symbolic link /etc/hosts exists for BSD compatibility. というわけで、同じでしょう。 |
Volumeの初期化に関して,どうのような操作をすれば良いか教えてください。digital unix 4.0 |
crontabを実行した時間がわかるようにするためにはどのような書き方をしたらよいかわかりません。教えていただけないでしょうか。 よろしくお願いいたします。 |
こんばんは。 Perlのほうが文字列処理などが書きやすい、でもCのほうが速度が速かったりするなどの理由から、XSを使用して二つの言語を合わせてみようと思いました。 そこで、CのヘッダをXSにかけてからPerlを実行したのですが、 "Your vendor has not defined Prime macro Prime" というエラーが出てしまいます。 XSによって生成されたのはPrimeというディレクトリで、その中にあるPrime.pmに、Perlから第一引数として数字を渡すものでした。 Perlのほうからは、 Prime::Prime($ARGV[0]) として呼び出しましたが、何がいけなかったのか、教えていただきたく思います。 よろしくお願いします。 |
AIXに付いて教えて! AIXマシンでは、gettimeofday()関数が使えない! よくよく調べると、コンパイル時、XOPEN_SOURCEを指定している為 である事が判ったが、XOPEN_SOURCEを外す訳にもいかず困ってます。 gettimeofday()関数と同じ機能で、置き換えられる関数ってないでしょうか? |
>>3529 kai Volume ってなんですか? 音量のことですか? であれば わかりません (ioctl とか使うんですかね)。 >>3530 momo 1. cron から実行するスクリプト内でファイルに時刻を記録する 2. * * * * * date>>/foo/bar/log; command とする。 3. /var/cron/logs などにあるログを見る。 >>3531 ken XS はよく知りませんが、perl のバージョンも、何をどうやったの かも書かれていないので何ともいえません。 下記は perl 5.005_03 の例ですが、まずはここからでしょう。 % h2xs -A -n Prime % cd Prime int Prime(num) int num; CODE: RETVAL = 2*num; OUTPUT: RETVAL % perl Makefile.pl % make hoge.pl を作成 % cat hoge.pl use ExtUtils::testlib; use Prime; print Prime::Prime(123),"\n"; % perl hoge.pl 246 >>3532 Hiro なぜ XOPEN_SOURCE が指定されていると gettimeofday が使えない のかよくわかりませんが、古い形のプロトタイプ宣言が〜とかいう 話ではないかと思うので、mygettimeofday.c を作って、 #include <sys/time.h> int gettimeofday (struct timeval *, void *) #undef XOPEN_SOURCE int mygettimeofday (struct timeval *Tp, void *Tzp){ return gettimeofday(Tp, Tzp); } とするとか。 |
>>3533 68user > int gettimeofday (struct timeval *, void *) #undef XOPEN_SOURCE int gettimeofday (struct timeval *, void *); #undef XOPEN_SOURCE のタイプミスです。 |
さきほどXSのことを質問させていただいたのですが、なんとか解決しました(汗 どうやら、根本的に思い違いをしていたのが原因のようで...。 わざわざのご回答、ありがとうございます。 もう少しぼくが早く解決して書き込んでいれば良かったのですけどね。 |
>>3528 68user The symbolic linkでしたか。 ぜんぜん気がつきませんでした。有難うございました。 |
はじめまして。タカと申します。 Perl関連について御教授ください。 Windows端末にてActivePerl-5.8.2.808-MSWin32-x86をインストールし Perlを作成しております。 そこで、PerlでExcelファイルに出力するプログラムを 作ろうと思っております。 その為、Spreadsheet-WriteExcel-0.42モジュールを、 ダウンロードしました。 本モジュールはWindowsでも機能すると表示されているのですが、 どうやって使用すればいいのか分かりません。 Spreadsheet::WriteExcel version 0.33(日本語訳)の HPを見ているのですが、私の知識不足で不明です。 もしご存知であれば御教授いただきたいのですが、 よろしくお願いいたします。 |
>>3537 タカ http://member.nifty.ne.jp/hippo2000/perltips/module_install.htm によると、ActivePerl の場合は PPM なるものを使うそうです。 # わたしは使ったことはありません。 |
ありがとうございました。 ちょっと試してみます。 |
クッキーに関する↓の冒頭でRFCに盛り込まれていないとありますが、 どうも2109で触れているそうですよ。 http://x68000.startshop.co.jp/~68user/webcgi/cookie.html 参考にさせていただいたサイト: http://www.nonki.net/technical/report/http-cookie/ http://www.ietf.org/rfc/rfc2109.txt |
>>3540 has ありがとうございます。とりあえずそこだけ直しておきます。 > どうも2109で触れているそうですよ。 RFC 2109 は obsolete で、今は RFC 2965 です。 http://www.studyinghttp.net/rfc_ja/rfc2965_ja.html でもまぁ、Set-Cookie2 は全然流行っていませんけどね。 |
はじめまして 右院堂 と申します。 いきなり質問で エゴ丸出しで申し訳ないですが ASP には Response.Buffer = True というのがあって、 ある html の form から 呼ばれた asp が 呼び元へ 自分の form を Response.Redirect で 返す時、Response.Redirect が実行されるまで HTMLヘッダーの出力を引き伸ばすことが出来ます。 これをやらないと HTMLヘッダーが 自分自身として Redirectされる前に出力されてしまうからです。 Perl では これに相当する記述はあるんでしょうか。 |
>>3542 右院堂 ASP はよく知りませんが、素の perl を使う場合は (そういう機能を 持つモジュールを使わない限りは) 相当する機能はないです (そういう 機能を持つモジュールの存在は知りません)。 $buf .= "出力文字列1"; $buf .= "出力文字列2"; ... print $buf; や、 open(STDOUT, "> /foo/bar/tmp.$$"); print "出力文字列1"; print "出力文字列2"; ... close(STDOUT); open(IN, "/foo/bar/tmp.$$"); print <IN>; close(IN); などと自分でバッファに保存し、最終的に出力するのが よいと思われます。 |
ポートに関しては初心者です。 すいませんが、ポート番号について教えて下さい。 Solarisを使用していますが、ポート番号は任意の決め事ですか? 現在使用しているSolarisは下記設定になっているようです。 WEBサーバはポート=80、FTP=20、プリントサーバ=9100 これらは、標準で決まっているのでしょうか? また、相手側を意識せず勝手にきめてもよいのでしょうか? 他に、ポートの設定をみる方法とかありましたらご教授下さい。 宜しくお願いします。 |
>>3544 yuki > Solarisを使用していますが、ポート番号は任意の決め事ですか? おおまかな指針はありますが、任意です。 > WEBサーバはポート=80、FTP=20、プリントサーバ=9100 デフォルトではそのような設定になっていますが、ほとんどの 場合は (サーバソフトウェアが対応していれば) ポートは変更 できるでしょう。ポート変更方法は各サーバソフトウェアの マニュアルに書いてあるはずです。 > また、相手側を意識せず勝手にきめてもよいのでしょうか? 標準的でないポートを使用するよう設定変更してもいいですが、 利用者に通知しないと使うことができません。 例えば web サーバであれば http://www.example.co.jp/ ではなく http://www.example.co.jp:8080/ にアクセスするようアナウンスしないといけませんし、プリンタで あれば自組織の環境設定手順書に 「プリンタの設定時に、ポート xxxx を使用するように設定してください」 と書いておく必要がある、といった感じです。 というわけで、標準的でないポートを使うことはできますが、 なにかとめんどくさい、という感じです。また、外部向けの サービスであれば、ファイアウォールで弾かれたりする危険性は 高まりますね。 |
irix使ってますが、ls -lでfileの詳細を見ると、拡張子の後に*が表示されてます。これはなにを意味するのでしょうか? |
>>3546 yosi 実行ファイルと思われます。ls の -F オプションの説明を読んでください。 |
UNIXのCシェル2点につてい教えて下さい。 1点目 以下の、a.txtファイルから第1フィールドの値を 先頭の'0' or "> 0 "のゴミを取って、10桁(先頭0なし)だけを また、第1フィールドの文末の半角スペースや’|’を取ってとり だしたいのですが、第1フィールはawkを使って取得できますが、 その後に編集ができません。たしか、sedの何かを使えば数字のみ だけを取り出せたと思うのですが、浮かんできません。 教えていただけないでしょうか。 cat a.txt | awk -F"," '{ print $1 }' | sed a.txt 09012345678,aaaa 07055593850,bbbb 9098765432,cccc 7012345678,ddddd > 07012345679 | ,eeeee 07012345670 ,ffff 出力結果 9012345678 7055593850 9098765432 7012345678 7012345679 7012345670 2点目 Cシェルで定義ファイルに設定してある項目を読み込むには どうしたらよいのですか。 定義ファイル MN=ABCDEFG FILE=/work/temp.txt set PARM1 = `grep ^MN 定義ファイル| awk -F"=" '{ print $1 }'` set PARM2 = `grep ^FILE 定義ファイル| awk -F"=" '{ print $1 }'` と繰り返すかないのでしょうか。 また、何も、タブとか半角スペースから始まっている場合もあると思うの ですが、どうすればよいのですか。 |
>>3548 つくも 1点目はawkのみで可能。 (古いawkではダメとかあるかも知れないけど。) ------ awk 'BEGIN { FS = "," ; } { i = match($1,"[1-9]"); print substr($1,i,10); }' a.txt ------ 2点目は、こんな事が許されるのか判りませんが ------ eval `awk 'BEGIN{ FS="=" }{ if(NF != 0) print "set " $1 " " $2}' param.txt` ------ 大人しく定義ファイルで「set A=val」と書いて sourceすべきだと思いますが・・・ |
>>3549 zsh 2点目は以下の間違い。 ------ eval `awk 'BEGIN{ FS="=" }{ if(NF != 0) print "set " $1 "=" $2 }' param.txt` ------ >68user様 半角カナ失礼しました。 |
>>3549 zsh >>3550 zsh ありがとうございました。 両方ともできました。 ただ、2点目については、定義ファイルでの変数名とシェル内での設定 する変数名がことなっていたので最初は誤ってしまいました。 |
はじめまして、恵美といいます。 いろいろ検索していましたら、このページにたどり着きました。 私は某会社のSE見習いなのですけれど、perlのリファレンスでつまづき悩んでいます。 ハッシュのリファレンスを上手にコピーする方法がよく、...いえ...さっぱりわからないです。 会社の人にきいたら、リファレンスは知らないと言われ、ダブルショックでした。 リファレンスを、1つ1つコピーすると $hash->{'str'} = $hash2->{'str'}; これだけなのですが、複数の値を同時にコピーするといつも失敗してます。 普通のハッシュでスライスを使うと、 my %hash = (a=>1,b=>2,c=>3); my %hash2 = (x=>11,y=>12,z=>13); @hash{'a','c'} = @hash2{'x','z'}; print $hash{'a'},$hash{'c'},"\n"; 11 13 となるのですけれど、同じことをリファレンスでやると失敗するんですよ。 $hash = {a=>1,b=>2,c=>3}; $hash2 = {x=>11,y=>12,z=>13} このとき、 print $hash->{'a'},$hash->{'c'},"\n"; の答えはどうしたら、 11 13 になるのでしょうか。 よろしくお願いします。 |
>>3552 恵美 - ($x{'k1'}, $x{'k2'}) は @x{'k1','k2'} と等価 (*1)。 - ハッシュのリファレンス $y のデリファレンスは $$y{'k1'} ($y->{'k1'} と同じ)。 をふまえた上で、今回は ($$y{'k1'}, $$y{'k2'}) を代入したい ので、*1 を素直に置き換えると @$hash{'a','c'} = @$hash2{'x','z'}; となります。 てゆーか、ハッシュスライスは使わない方がいいですよ。配列と 間違えやすいので、可読性低すぎです。わたしなら 2 項目であれば $hash->{'a'} = $hash2->{'x'}; $hash->{'c'} = $hash2->{'z'}; と 2行で書きます。 どうしても短く書きたい場合でも ($hash->{'a'}, $hash->{'c'}) = ($hash2->{'x'}, $hash2->{'z'}); とします。 項目数が多いなら my %map_table = ('x'=>'a', 'z'=>'c'); while (my ($fromkey, $tokey) = each %map_table){ $hash->{$tokey} = $hash2{$fromkey}; } とか。長くはなりますが、項目の対応がもっともわかりやすく、タイプ ミス ($hash と $hash2 を書き間違えるとか) の可能性も減ります。 |
こんにちは恵美です。 どうもありがとうです(^^)v すっかり解決して嬉しいです。 リファレンスはいまいちよくわかってないけど... 複数行で記述するのを1行でって思ってずっと悩んでいたんだけど、心の中を読まれちゃったかな... なんか、すごすぎるページなのでちょくちょく見に来ます。 おやすみなさい。 今日はありがとう(^^) |
はじめまして、瀧上と申します。 現在UNIX環境でのバッチ処理方式・環境設計を行っています。 開発経験はあるのですが、環境構築からやるのは初めてで頭を悩ましています。宜しければ下記の点についてご教授下さい。 デバッグメッセージの出力有無の切替について教えて下さい。 開発言語はCシェル&Cです。 以前のプロジェクトではC言語におけるデバッグメッセージを出力するしないを、環境変数で設定してしました。おそらく、これを見る事によりデバッグメッセージ出力用の共通関数にデバッグのON/OFFを切り替えさせていたのだと思います。 もし、上記以外に一般的な(適切)な方法があるなら教えて下さい。 レベルの低い質問で申し訳ないのですが、よろしくお願い致します。 ※UNIXの環境構築や、ジョブスケジューラにおけるNET設計の参考となる URLをご存知であれば教えていただきたいです。 |
>>3555 瀧上 > 上記以外に一般的な(適切)な方法があるなら教えて下さい。 しょせん決め事なので、一般解はありませんが、 - コマンドオプション (--debug や -d など) を指定する - make debug で、デバッグ用バイナリを生成する - make install すると ~/bin/ に通常バイナリを、~/bin/debug/ にデバッグ用バイナリを格納する などの方法があります。 どれでもいいので、いずれかをプロジェクトのルールとして決定して おくのがよいでしょう。 わたしの場合、 「デバッグモードは開発時のためのモードではなく、通常運用時や 後々のバグ追及時にこそ有用なもの」 という考え方なので、わたしが好む方法は以下の通りです。 - デバッグモードを実装する。デバッグモードの場合、rollback するなどして、データを一切更新しないようにする (まわりの環境に 一切影響を与えない) - デバッグモードとは別に、冗長なメッセージを出すだけの冗長 モード (verbose モード) を実装する。冗長モードの場合は、 通常どおりデータを更新する。 - エラー発生に気づきやすいよう、ログに吐いたメッセージは 標準出力・標準エラー出力にも吐くようにする。 - オプションでデバッグモード・冗長モードを切り替えられること。 例えば --debug でデバッグモード、--verbose で冗長モード、など。 デバッグモードの場合、自動的に冗長モードも有効にするようにする。 コード例は以下の通り。 int debug_flg = 0; int verbose_flg = 0; for ( i=1 ; i<argc ; i++ ){ if ( strcmp(argv[i], "--debug") == 0 ){ debug_flg = 1; verbose_flg = 1; } if ( strcmp(argv[i], "--verbose") == 0 ){ verbose_flg = 1; } } /* こんな感じで各種情報を出力 */ verbose("ほげほげ foo=[%d]", foo); .... if ( debug_flg ){ EXEC SQL ROLLBACK RELEASE WORK; } else { EXEC SQL COMMIT RELEASE WORK; } void verbose(char *fmt, ... ){ va_list ap; char buf[8192]; /* verbose モードでなければ、何もしない */ if ( ! verbose_flg ){ return; } va_start(ap, fmt); vsnprintf(buf, sizeof(buf-1), fmt, ap); va_end(ap); fprintf(stderr, "debug: %s", buf); } 使い方としては、 - 単に詳細なメッセージを表示したい場合は冗長モードを使う。 - まわりの環境に影響を与えず、とりあえずうまく動くか確かめたい 場合はデバッグモードを使う。 となります。 > UNIXの環境構築 UNIX の環境構築と言っても範囲が広すぎるので、なんともいえません。 > ジョブスケジューラにおけるNET設計 これは何でしょうか? JP1 とかの話? |
大変参考になります。 方式だけでなく、考え方とコードまで載せていただいたのは恐縮です。 参考例を深慮して方式を定めます。 ありがとうございました。 > UNIXの環境構築 UNIX の環境構築と言っても範囲が広すぎるので、なんともいえません。 →そうですね、すみません、主にUNIX環境でのバッチ処理におけるShellの置き場所や構成の最適な方式を調査できるHPを探していました。「コンパイラ等、ツールの環境(変数)設定ファイルは全て別で持つのが好ましいのか」、、とか、「バッチ処理起動shellでsourceする環境設定ファイルにディレクトリとOracleSIDを考えているが、これが最適なのか?」等です。。。開発、本番時に必要な要件を洗い出していけばおのずと出てくると思うので、考えてみます。 開発とUNIXでの開発経験が乏しいので、自分の知っている方式を、プロジェクトの標準として使っていいのか不安なのです(^^;) > ジョブスケジューラにおけるNET設計 これは何でしょうか? JP1 とかの話? そうです。本日書籍購入しました。上記と同じで、もし有効なHP等ご存知であれば教えてもらいたいと思ったので。。。。 |
>>3557 瀧上 > 主にUNIX環境でのバッチ処理におけるShellの置き場所や > 構成の最適な方式を調査できるHPを探していました。 そういうことを書いている web は見たことないですね。基本的に趣味で やってる人には関係ないし、それを知ってる企業は「ノウハウ」として 隠してしまいますので。 # しょーもないやり方を「ノウハウ」などと称しているところも # 多いわけですが。 ちょっと長くなりますが、まぁひととおり書いてみます。 まず、ユーザを複数作ります。例えばユーザ名が hoge なら、 hogedevel (開発環境) hogesi (SI (結合テスト) 環境) hogert (RT (受入テスト) 環境) の 3つくらい。それぞれのホームディレクトリは /home/hogedevel, /home/hogesi, /home/hogert などとします。 さらに DB が必要であれば、これも 3つ (hogedevel, hogesi, hogert) 作ります。 通常の開発は hogedevel を使います。hogesi や hogert は テストの段階で初めて使います。 「開発者は基本的に hogedevel しか使ってはいけない」 というシバリを入れるのもよいでしょう。 各ホームディレクトリの下には src/ ソース置き場。CVS などでソース管理すること。 conf/ 手で管理する設定ファイルなどを置く場所。 bin/ バイナリ置き場。src で make install すると作成される。 lib/ バイナリ以外の設定ファイルやデータファイルなど。 src で make install すると作成されるものに限る。 log/ ログファイル置き場 dat/ 生成するデータファイル・他から送られてきたデータファイル とします。 つまり src/ で make install すると bin/, lib/ が作成される わけなので、bin/ や lib/ は消しても src/ を元に再作成する ことができます。 しかし conf/ は手動管理の設定ファイル群なので、こちらは 消してはいけません (conf/ も CVS などで管理するのがよい でしょう)。 lib/ には、プログラムで生成する雛型のファイルとか、SQL*Loader 用に喰わせるファイルなど、devel, si, rt で共用のファイルを置き ます (実行形式のバイナリではないけど、プログラムの一部と見なして よいものを置く)。 で、環境変数は /home/hogedevel/conf/env.sh /home/hogesi/conf/env.sh /home/hogert/conf/env.sh に ORACLE_SID=hogedevel HOME=/home/hogedevel PATH=/home/hogedevel/bin ORACLE_HOME=... 書きます。 これを source して各アプリが起動し、 - DB の接続先は $ORACLE_SID とする - $HOME/log/ にログを吐く - $HOME/data/ にデータファイルを作成する とします。 というわけで、基本的には > バッチ処理起動shellでsourceする環境設定ファイルにディレクトリと > OracleSIDを考えているが、これが最適なのか? それでよいと思います。 > コンパイラ等、ツールの環境(変数)設定ファイルは全て別で持つのが > 好ましいのか どういうファイルのことを指しているのかよくわかりませんが、 $ORACLE_HOME/precomp/lib/env_precomp.mk とかですか? 基本的に、この辺は共通でよいのではないでしょうか。もし、一部の プログラムで特殊なことをしたければ Makefile 内で上書きすればよい わけで。 あと、いくつか気をつけるポイントをあげておきます。 - ディレクトリやファイルは絶対に手で作成しない。 手で作成するとかならずミスするので、全て Makefile に 記述する。 - CVS などのソース管理ツールを活用する。 /home/hoge{si,rt}/src/ に手でソースを配置し、手で make install する、というやり方は極力避ける。CVS などでマスタ管理し、 毎日朝 AM6:00 に、自動的に ~hoge{si,rt}/src にソースを checkout し、make install などと、全てを自動化するのがベスト。 この他に何か質問があれば、もう少しポイントを絞って、具体例を あげてください。 >> これは何でしょうか? JP1 とかの話? > そうです。本日書籍購入しました。 非オープン系なアプリの場合、web 上からの情報収集は厳しいかと 思います。 JP1 は使ったことがないのでわかりません (わたしは cron の代替品、程度の 認識しかありませんが)。やっぱり便利なんですかねぇ。 |
>>3558 68user > しかし conf/ は手動管理の設定ファイル群なので、こちらは > 消してはいけません (conf/ も CVS などで管理するのがよい > でしょう)。 lib/ との違いがわかりづらい気がするので補足。 hoge{devel,si,rt} で異なる設定ファイルは conf/ に、そうでない ものは lib/ に置く、という意味です。 もちろん make 時に環境によって異なるファイルを lib/ にインス トールできれば conf/ などいらないのですが、それを実現するためにMakefile に複雑な細工をしなければいけないケースがあったりするので。 |
おひさしぶりです。困ったときばっかり登場してすみません。 たぶんあけましておめでとうございます。 ここ5年ぐらいメンテしてる CGI なんですが、 根本的な改革を迫られました。 A.cgi が生成するページにおいて、 ボタンを押したら(可変パラメータ付きで) B.cgi が生成するページに進み、 リンクを押したら(可変パラメータなしで) C.cgi が生成するページに進むという実装になっています。 ところが、ここで C.cgi にも A.cgi で選択入力する可変パラメータを渡さなければ ならなくなったのです。 A、B、C 非常に肥大化していて、安易な解決法が欲しい状況です。 CGI のみで解決できればうれしいですが、 場合によっては JavaScript でもかまいません。 なにかあればご教示願えれば幸甚です。よろしくお願いします。 |
>>3560 ふくし これを機にリファクタリングした方が、のちのち幸せになれると 思いますよ。 …というのは十分承知しておられると思うので、その場 しのぎな案を 2つばかり。 1. B.cgi で受けたパラメータを print qq(<input type=hidden name="param_from_a" value="$ENV{QUERY_STRING}">\n); などとまるごと C.cgi に渡す。 2. 隠しフレームを作っておいて、A.cgi で選択されたら onClick などでフォーム内容を隠しフレームに転記して おき、(B.cgi は無修正で) C.cgi がその隠しフレームを読む。 |
アクセスが遅くなり申し訳ありません。瀧上です。 丁寧なご回答ありがとうございます。 工程別のユーザの切り分けは私の方でも近い形で考えており、ご回答に近い形で定めようと思っています。→開発環境ではユーザを分けますが。 とりあえず考え方に大きなずれが無い事が判明してほっとしています。 ディレクトリですがConfの概念は無くこれはこちらを参考に構成を考えようと思います。CVSはシステム標準で構成管理ツールとして使用することが決定しています。デバッグモードの考え方は、色濃く方式に出そうです(^^;) ところで申し訳ないのですがもう少し勉強させてもらいたい事がありまして、お言葉に甘えていくつか質問させてください。 →たとえばログイン時に「.cshrc」から「環境変数設定ファイル」をSourceしたとして、この時「環境変数設定ファイル」から設定した環境変数は、サーバDOWNかそれを書き換えるまで確実に保証されるのでしょうか? →LIBがmakeInstall時に取り込まれるものだとしたら、 動的なライブラリはUNIXにおける開発ではあまり使用しないものなのですしょうか?システム共通部品等は動的ライブラリから呼び出すのが一般的かなと思っているのですが。 /COMMON/bin/xxxxx.so←拡張子も「.so」一般的なのか疑問ですが、 dllでは無いと思うので。。。 もしくは実行ファイルとしてbinに持つ? |
>>3651 68user すいません、題意を間違えて伝えたかもしれません。 これでよかったです。 A.CGI start_form(action="B.CGI"); フォーム要素1; end_form; start_form(action="C.CGI"); フォーム要素2; end_form; 要は B と C に別の可変要素を渡すのなら、これでできたんですね。 昨日それでできるんじゃないカナと思ってたんですが、 コードにバグをつくっていました。 なお、ボタンを submit にしないで、name をつけ、 name を JavaScript で読み取って切り分ける、という方法も あるようです。これならフォーム要素を共有できるな。 http://webmaster.hatena.ne.jp/1069376628 ★ 事情を説明すると、5年越しということでおわかりいただけると 思いますが、FileMaker で作っていた経理システムが 2000 年問題で 止まる(私製のテンプレートがダサくて)という話があり、 その時個人的に見積書を CGI で出していたことがバレ、 2000 年の 3 月にはちゃんとした業者ウェアを入れるから それまでそれっぽいものを動かしてよ、と言われました。 で、2000 年の 3 月に、業者ウェアの日本語対応ができないと分かり (ガイシ系なんで・・・) その年いっぱい動かすことになりました。 以下、同じことが 200年、2001年、2002年、2003年に起こりました。 いよいよ今年の5月にこのシステムが正式に引退させることが 決定した(・・・)のですが、その前にどうしても大きな山を 乗り越えるためにプログラムを改造することになったのです。 でも「どうせ5月に引退すると決まっているシステムに大金を 投じるわけにはいかない」ので、それだけに長い時間を避けないんです。 人生いろいろですね:) |
教えてください。 指定したポートを開放するために必要なinetd.confの設定方法を教えてください。また、他に必要な設定が必要でしょうか。 ご教授お願い致します。 |
>>3562 瀧上 > たとえばログイン時に「.cshrc」から「環境変数設定ファイル」を > Sourceしたとして、この時「環境変数設定ファイル」から設定した > 環境変数は、サーバDOWNかそれを書き換えるまで確実に保証される > のでしょうか? setenv で更新したら変更されます。.cshrc を更新しても、 明示的に source したり、ログインしなおさないと反映 されません。 よって、プログラムの先頭で source するか、cron であれば * * * * * . /home/hoge/env.sh && /home/hoge/bin/foo としておくのがよいでしょう (JP1 でも何かしら環境変数を 指定するような設定があるのではないかと想像します)。 > LIBがmakeInstall時に取り込まれるものだとしたら、 そういう意図ではなく、実行時に必要ないろいろなファイルの 置き場所、として書きました。 もし動的ライブラリを使うなら lib/ に置くことになる でしょうね。 でなくて、静的にリンクするなら、ライブラリは src/ の 下だけ置いて、アプリのmake install 時にリンクしmasu. ライブラリ自体は lib/ に make install しません (実行時 には必要ないので)。 で、それはそれとして > 動的なライブラリはUNIXにおける開発ではあまり使用しない > ものなのですしょうか? についてですが、わたしの場合は静的にリンクする方法を 好みますが、別に動的リンクがダメと言うほどではないです。 業務系では多少のメモリ使用量の多寡ははどうでもよいので、 構成管理のやりやすさだけを考慮すれば構わないと考えます。 で、例えば、 1. ライブラリ関数 func をプログラム A・B・C が使用している。 2. プログラム A に不具合が発生。すぐに修正版をリリース しなければならない。 3. 原因は func であることが判明。しかし func の呼び出し方の 違いから、プログラム B・C ではこの現象は発生しない。 という状況を考えます。 静的にリンクしている場合、もし人的リソースに余裕があり、 func 修正時にプログラム A・B・C のテストをすることができる なら、修正版 func のリリース時にプログラム A・B・C を再 コンパイルすることができます (これが最も望ましい)。 しかし、プログラム B・C をテストする余裕がない場合、 func を修正して再コンパイルし、プログラム A を再コンパイル とすることで、プログラム B・C に影響を与えず func を修正 するという選択肢をとることができます。 ただしこれは プログラム A が使用している func と、プログラム B・C が使用している func が異なる という管理しづらい状況になるため、次期リリース時に全てを 再コンパイルするまでの時間かせぎです。 つまり、静的リンクの場合、 目の前のリスクを少なくしたいなら → プログラム A のみを再コンパイル 構成を単純にしたいなら → プログラム A・B・C を再コンパイル と、状況に応じた選択が可能です。 しかし動的ライブラリだと、動的ライブラリを入れ替えて、 プログラム B・C に不具合が出るかもしれないリスクを負う という選択肢しかありません。 よって、わたしは静的にリンクする方を選びます。 ただし静的リンクの場合、再コンパイル忘れなどで各プログラムが 使用しているライブラリのバージョンが異なる、という状況が発生 する可能性がありますが、この対策として、定期リリース時に商用 環境の - 全ソース・全プログラムを削除 - 最新版のソースを全て再コンパイル - 全プログラムを make install とすれば OK でしょう (最上位ディレクトリで make && make install すれば全アプリ入れ替え完了)。 # 仮に動的リンクを選択したとしても、上記の「定期リリース # ごとに全部インストールしなおす」というやり方は強く # おすすめしておきます。 |
>>3564 たけ > 指定したポートを開放するために必要なinetd.confの > 設定方法を教えてください。 質問が曖昧すぎて答えられません。inetd のマニュアルと /etc/inetd.conf にある他の設定例を見てください。 それでもわからなければ、何がしたいのかを明記した上で 再度質問してください。 |
はじめまして。初心者ですが、コマンドはどこに打てばいいんですか? |
以下のようなファイルからaddとmodとdelのerrrorがある行を 取り出したいのですが、 ------ ここから ----------- ---- server1 ---- add:yamada:success add:saito:error mod:yamamoto:success mod:ikeda:error del:yamaguchi:success del:butou:error ---- server2 ----- add:yamada:success add:saito:error mod:yamamoto:success mod:ikeda:error del:yamaguchi:success del:butou:error ------ ここまで ---------- grep -v "\-\-\-" ファイル名 | grep -v success で一応とりだせるのですが、改行の2行が含まれて しまいます。空改行を含まず1回の処理でやりたいのですが どうすればよいのですか。 |
>>3568 すすむ 環境を書き忘れました。 SunOSで、Bシェルです。 |
>>3568 すすむ errorを取り出したいなら素直に grep ":error" filename とすれば良いのでは? まぁ名前にerrorが含まれる人がいると引っかかってしまうので 正規表現使うべきなんだろうけど。 |
>>3568 すすむ 賢いかはわかりませんが、 grep -v "\-----" ファイル名 | grep -v success | awk '{ if(NF != 0) print $0 }' でできませんか。 |
>>3568 すすむ 「success」と「error」と簡単に書きましたが、 成功の場合は、「success」で、失敗の場合は、エラーメッセージが でます。 「error」だけでは、引っ掛けられません。 |
>>3567 うこん あなたが置かれている状況がわからないので、回答できません。 >>3568 すすむ わたしなら egrep '^(add|mod|del):' | grep -v ':success$' とします。 |
>>3572 すすむ であれば、 egrep -v '^(-|$|.*:success$)' filename とか? |
>>3573 68user >>3574 zsh zshさん、68userさん ありがとうございます。 egrepですか。 使用したことがないのですが、 「'^(-|$|.*:success$)' 」 の使い方につてい教えてください。 |
>>3561 68user > 1. B.cgi で受けたパラメータを > print qq(<input type=hidden name="param_from_a" > value="$ENV{QUERY_STRING}">\n); > などとまるごと C.cgi に渡す。 「などと」と書いてあるので, 細かいところは省略してあるのでしょうが このままの記述ですと, パラメータの区切りが「&」という前提にて パラメータの名前が「copy」や「reg」だった時に悲しい結果が待ってます。 理由はこのへん http://www.ne.jp/asahi/minazuki/bakera/html/opinion/ampersand |
>>3565 ご回答ありがとうございます。 ライブラリの考え方は参考になります。 要件が無ければ原則禁止にしてしまおうかななんて。。。検討中です。。 ところでshellでバッチを走らせる時はユーザ設定を行わないようにするのがいいのですね。UNIXの部屋にある↓を見て気づきました。 「#!/bin/csh -f というのをよく見かけるが、その場合ユーザ独自の ~/.cshrc は読まれないので、エイリアスやシェル変数は使用できなくなる。」 なので今回はshellの構成は下記の様にするつもりです。ご報告まで。。。 ---------------------------------- #!/bin/csh -f #------------------- #shell # #------------------- source COMMON.src #→システム共通のパス(oracle等)や文字指定(LANG等) source 環境.env #→システム共通環境変数設定等 処理・・・・ ----------------------- |
Makeの環境について教えて下さい。 現在下記のディレクトリを作成して開発環境としようと考えていました。 /src /* makefileとsrcを保管 */ /obj /* make時の中間ファイルを保管 */ /bin /* 実行ファイルを保管 */ するとあるガイドに「.oと.cを別ディレクトリに置くとmake時のタイムスタンプの比較が困難になるのでやめるべきだ」、と書いてありました。 「個々の依存関係をいちいち指定しなければならない。」ともあり、「いちいち」等と書かれると非常に非効率な事の様に感じるのですが。。。 「.cと.oは同一ディレクトリに持つ」が一般開発業務で用いられる主要な方式なのでしょうか? 単体環境だと不特定多数の人間が多様なsrcファイルを作るのであまり余計なファイルを置いてごちゃごちゃさせたくないと言うのが理由で分けてるだけなので同一ディレクトリも特に問題は無いのですが。。。(消されても問題は無いファイルですし。。) 依存関係をmakefileに指定して別ディレクトリ管理と言うのはやらないのですかね? |
No.3568さんに似たような質問なんですが、 ファイルが以下のようにあったとします。 _________________________________________ aaa bb ccc 02/22 ddd e1.3 fff _________________________________________ その時に、実行するたびにe1.3の数字をe1.4、e1.5と実行 するたびに数字を0.1ずつ変更したいんですがCシェルで そのような事をしたいのですが、どうしたらいいのでしょうか。 ご教授お願いします。 |
>>3579 UNIX10ヶ月目 例えば、0.0から9.9まで表示するには以下のような方法があります。 ------ @ i = 0 while ( $i < 10 ) @ j = 0 @ n = $i * 10 while ( $j < 10 ) @ m = $n + $j set cnt = `echo "scale=1; $m/10" | bc` printf "0.1f\n" $cnt @ j++ end @ i++ end ------ ※:シェル変数cntに代入してprintfしているのは、0.0を出力するためです。 >>3575 すすむ 申し訳ありませんが、正規表現について解説された書籍を見るか Webサイト等を探してください。 自分で回答しておいてなんですが、68user様の方法が良いと思います。 自分のはコマンドを強引に1つにまとめただけですので。 |
Bシェルにつてい教えて下さい。 Bシェルで一次元配列を使用しているのですが、 HP-UX11.00で動いていたシェルスクリプトをSunOS5.8に移して 動かしたのですが上手くうごきません。 MONTHES[0]=Dec: 見つかりません。 MONTHES[1]=Jan: 見つかりません。 : 置換が正しくありません。 となります。 どうのように修正すれば、動きますか。 ------------------ #!/bin/sh # MONTHES[0]="Dec" MONTHES[1]="Jan" MONTHES[2]="Feb" MONTHES[3]="Mar" MONTHES[4]="Apr" MONTHES[5]="May" MONTHES[6]="Jun" MONTHES[7]="Jul" MONTHES[8]="Aug" MONTHES[9]="Sep" MONTHES[10]="Oct" MONTHES[11]="Nov" i=0 while [ $i -le 11 ] do echo ${MONTHES[$i]} i=`expr $i + 1` done |
これなら動く筈。(未確認) ------------------ #!/bin/sh # MONTHES0="Dec" MONTHES1="Jan" MONTHES2="Feb" MONTHES3="Mar" MONTHES4="Apr" MONTHES5="May" MONTHES6="Jun" MONTHES7="Jul" MONTHES8="Aug" MONTHES9="Sep" MONTHES10="Oct" MONTHES11="Nov" i=0 while [ $i -le 11 ] do eval echo $"MONTHES$i" i=`expr $i + 1` done |
>3582 zshさん ありがとうございます。 上手くいきました。 |
>3582 UNIXといってもHP-UXとSunOS(Solaris)で違うのだから Bシェルだからといって同じ機能jが使えるわけではない のですね。 |
>>3584 つとむ HP-UXは知らないのですが、配列使えるあたりがkshっぽいですね。 他の部分(スクリプト)がどうなっているかにもよりますが kshに変えたほうが修正が少なくて済むかも知れません。 下ののシェルだったら、 一行目を「#!/bin/ksh」に変えるだけで動きそうです。 |
はじめまして。本日暗号化について調べていたらこのホームページにたどり着きました。暗号化したいのは会社でPOPメールの受信ができないためメールを受信して暗号化し、Webメールなどに投げるようなプログラムでも作ろうかと思い立っていたため、こちらのホームページの内容は非常に役に立ちました。ありがとうございます。 |
>>3577 瀧上 > 「.oと.cを別ディレクトリに置くとmake時のタイムスタンプの > 比較が困難になるのでやめるべきだ」 かどうかは知りませんが、とりあえずわたしは .o と .c を別にするやり方を知りません。 # *BSD などは .c と .o が別になっているので、やろうと # 思えばできるとは思いますが。 で、分ける必要があるかどうかですが、 > あまり余計なファイルを置いてごちゃごちゃさせたくない という理由であれば、cvs add しなければリポジトリに 登録されないので、「*.o は cvs add してはいけない」 という教育さえしておけば十分ではないでしょうか。 時間が経つにつれソース置き場にゴミがたまるのが嫌だ ということであれば、定期的にソース置き場を削除し、 checkout することをお勧めします。 わたしは開発環境であっても、毎日ソース置き場を削除、 checkout、make、make install して、まっさらにする 方法が好みです。 # メンバ全員のアカウントをあらかじめ作成しておき、 # 開発は、各メンバのホームディレクトリで行わせる。 >>3585 zsh > HP-UXは知らないのですが、配列使えるあたりがksh > っぽいですね。 /usr/xpg4/ に POSIX 系を集めている Solaris とは 違い、HP-UX は OS 全体として POSIX を重視している ような印象を受けます。sh と ksh は別コマンドに なってはいますが、sh はかなり POSIX 寄りです。 Bourne shell は /usr/old/bin/sh にあったりします。 >>3575 すすむ > 「'^(-|$|.*:success$)' 」 'a(x|y|z)' は ax か ay か az にマッチするので、 '^(-|$|.*:success$)' は ^- か ^$ か ^.*:success$ にマッチします。後は正規表現を勉強してください。 |
>>3586 まさどん ありがとうございます。 ついでと言ってはアレですが、掲示板の名称を 「UNIX、CGI、ネットワーク、Java Servlet についての掲示板」 改め 「UNIX、CGI、ネットワーク、暗号技術についての掲示板」 としました。 ついでに今日調べたことのメモ。OpenSSL を使って RSA で暗号化 & 復号化。 --------- ここから --------- #include <stdio.h> #include <openssl/rsa.h> #include <openssl/engine.h> int main(){ unsigned char plain_str[]="hogehoge"; unsigned char crypted_str[200]; unsigned char decrypted_str[200]; char errbuf[1024]; RSA *rsa; int n; ERR_load_crypto_strings(); rsa = RSA_generate_key(1024, 65537, NULL, NULL); printf("rsa->n = 0x"); BN_print_fp(stdout, rsa->n); putchar('\n'); printf("rsa->e = 0x"); BN_print_fp(stdout, rsa->e); putchar('\n'); printf("rsa->d = 0x"); BN_print_fp(stdout, rsa->d); putchar('\n'); printf("rsa->p = 0x"); BN_print_fp(stdout, rsa->p); putchar('\n'); printf("rsa->q = 0x"); BN_print_fp(stdout, rsa->q); putchar('\n'); /* printf("RSA_size(rsa)=%d\n", RSA_size(rsa)); */ /* 暗号化 */ n = RSA_private_encrypt(strlen(plain_str), plain_str, crypted_str, rsa, RSA_PKCS1_PADDING); if ( n == -1 ){ printf("in encrypt: err=%s\n", ERR_error_string(ERR_get_error(), errbuf)); goto ERR; } /* printf("%s\n", crypted_str);*/ /* 復号化 */ n = RSA_public_decrypt(n, crypted_str, decrypted_str, rsa, RSA_PKCS1_PADDING); if ( n == -1 ){ printf("in decrypt: err=%s\n", ERR_error_string(ERR_get_error(), errbuf)); goto ERR; } /* 検証 */ if ( strncmp(plain_str, decrypted_str, n) == 0 ){ printf("OK! plain_str=[%s] decrypted_str=[%.*s]\n", plain_str, n, decrypted_str); } else { printf("NG! plain_str=[%s] decrypted_str=[%.*s]\n", plain_str, n, decrypted_str); goto ERR; } return 1; ERR: RSA_free(rsa); return 0; } --------- ここまで --------- 実行例: rsa->n = 0xCA0CBEC6C0384F0387557A9E27A60A9039AB9FAC4D4AE1DA1E08F00093632FAA734AF75E86632E7AFC660A00BF1D703902B57B64CFACD0069314A105295F7624157D3A484C6E1FEBA5A46047E6AE91161DCD51BA7D75B83358F3506D069AEB987D183C0FC21C1BE1F2DF5A0BFF991DB13EFD1E9F079E92BE25CB2BB7D7AD703F rsa->e = 0x10001 rsa->d = 0x35DA87CEF9D5085A6C6C002EBF6AA64E22D0F7D23917C87316A653321416CFD1A2C14C85C9540E43819AC0F7C9F8D2BC9F5837F77AD318EF67AC8BEE90447D7C4F705C57130095BFB51697ECB64CF686414980E1BC814F6AD3EDB3BC2232F88D32892592093E6103AAF89C23B9544254386611B145B9327AA074398D15E60A41 rsa->p = 0xE4A4D51718E83BF3CF91E0C187EB910FFAED34C37858667A6C27F83020DCF7D2DABA5D0B2CD0FAD0A075E06938420F09111F0A5DEA9B443CAAF6674C343944E7 rsa->q = 0xE2395BC32DAA75945F637F88F9BB7C05157464C99168E229E5ED86A3A1EE19498BC357E849505F3C2CA7DC868068880E14FA7ADA01B7BD9897A18FB3573336E9 OK! plain_str=[hogehoge] decrypted_str=[hogehoge] RSA_generate_key() で RSA 鍵を生成できる。 引数: 鍵の bit 数 (この例では 1024 bit)、e (3,17,65537 など)、その他 鍵長についてはよくわからない。上記の例 (平文が hogehoge) では、bit 数を 145 以上にしないと encyrypt 時にエラーになる。なぜ 145? 平文を m として、 m<n ならよいのではないの? 戻り値は typedef struct { BIGNUM *n; BIGNUM *e; BIGNUM *d; BIGNUM *p; } RSA; 的な構造体のポインタ。これが RSA 鍵。詳細は rsa(3)。 それぞれ、以下のような感じ。 e: encryption exponent (OpenSSL 的には public exponent。暗号化指数) ここでは 65537 (=0x10001)。 n: RSA-modules (OpenSSL 的には public modulus と表記) d: decryption exponent (OpenSSL 的には private exponent。復号化指数) p,q: 素数のペア 公開鍵は e,n。秘密鍵は d,n。ただし、「秘密鍵は d」と定義している web・本も散見される。どちらが正しい? まぁ n は公開するわけなので、 どっちでもいいのか? BIGNUM は OpenSSL 付属の多倍長整数ライブラリ。上記の例のように BN_print_fp などを使うことで、内容を確認できる。詳細は bn(3)。 ちなみに BIO は OpenSSL 付属の I/O 抽象化レイヤ。詳細は bio(3)。 crypto 関係のエラーコードは unsigned long ERR_get_error(void) を 使うことで取得できる。そのコードを ERR_get_string() に喰わせると error:0407006A:lib(4):func(112):reason(106) という文字列が得られるが、これではわけがわからん。そこで、あらかじめ ERR_load_crypto_strings(); としておけば、ERR_get_string() の結果が error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01 という文字列になる。ちなみに % openssl errstr 0407006A error:0407006A:rsa routines:RSA_padding_check_PKCS1_type_1:block type is not 01 とすればコマンドラインからでも取得可能。 RSA の秘密鍵による暗号化は RSA_private_encrypt() を使う。 第四引数はパディング方式。ここでは RSA_PKCS1_PADDING として いるので、PKCS#1 の方式で勝手にパディングしてくれる。 RSA_NO_PADDING を選ぶとパディングが行われないので、呼び出し側が 平文を適切な長さにパディングする必要がある。RSA_private_encrypt の 戻り値は暗号文の長さ。 復号化は RSA_public_decrypt() で。戻り値は復号化した結果の 長さ。復号化されたデータの文字終端などが自動でセットされる わけではないので、printf("%.*s") などと自分で長さを管理すること。 上記の例では、暗号化した文字列を unsigned char crypted_str[200] に入れているが、正しくは RSA_size() で得た長さ分の領域を確保して おくこと。 参考: http://www.cybersyndrome.net/rsa/ |
RSA で暗号化してみよう (1)・(2) を作成しました。間違いや わかりにくい部分の指摘は大歓迎です。 http://x68000.startshop.co.jp/~68user/net/rsa-1.html http://x68000.startshop.co.jp/~68user/net/rsa-2.html しかし暗号はおもしろい。何かリクエストがあれば (わたしの レベルを見極めた上で) 書いてください。 |
暗号技術大全を持ってらしているのですね。奇遇ですね、僕もこの間 購入してしまいました。僕はハードっぽい図と数学っぽいところに惹 かれて、立ち読みじゃ飽き足らず、買ってしまいました。 #眠いときは枕代わりになるし、持って動かせば筋トレにもなるし、 #一冊三鳥にもなる、良い本です。←冗談です・・・ 今のところリクエストはありませんが、確かに暗号技術は面白いの で、そのうちあるかもしれません。その節は宜しくお願いいたします。 それに、妖精現実フェアリアルも参考にされているのですね! 僕は 双方向処理で行き着いたところは異なりますが、これも奇遇ですね。 というか、そのサイトは凄すぎです。作者は何者なんだ?と思いつつ、 読んでいます。 #全く関係ないですが、Java Servletは興味から外れたのですか? ご存知だとは思いますが、妖精現実フェアリアルから引用しますので、 ご参考までに。 このウェブサイトは、まもなく終了します。 このページに書いてあった 情報は、特に断り書きがない限り、自由に使ってください(コピー、 改変を含む)。 転載先においても転載自由にしてかまいません。 |
>>3590 へにか > 暗号技術大全を持ってらしているのですね。 まぁ理解できていませんけどね。 理論を学びたいと思って、他にも以下の本を買ってみました。 理解できたかどうかは聞かないでください。 暗号理論入門 http://www.amazon.co.jp/exec/obidos/ASIN/4320120442/249-3448296-8649958 暗号の代数理論 http://www.amazon.co.jp/exec/obidos/ASIN/4431708472/249-3448296-8649958 代数と数論の基礎 http://www.kyoritsu-pub.co.jp/series/21seiki/01561-4.html 暗号は技術的にも非常に面白いですが、暗号として強いのか 弱いのかが第三者からはっきり評価される世界ですので、 やじうま的視点で見ても、とてもおもしろいです。 http://x68000.startshop.co.jp/~68user/net/crypt-1.html で紹介した すずきひろのぶ氏の AES 選定にまつわる話も そうですが、IPA の CRYPTREC http://www.ipa.go.jp/security/enc/CRYPTREC/ に応募したものの、門前払いをくらった暗号がどんなものなのか 調べると、非常に興味深いものがあります。 こんなおもしろい世界を学者のモノだけにしておくのは もったいない。ぜひ興味を持っていただけると幸いです>All > このウェブサイトは、まもなく終了します。 これは前々から気になっています。終了されると非常に困る んですが、webarchive.org (正式にはWayback machine って いうのかな?) があるから まぁ大丈夫かな、と思っています。 # http://web.archive.org/web/*/http://www.faireal.net/articles/7/01/ > Java Servletは興味から外れたのですか? 諸般の事情から、このサーバでは Java Servlet が動かないのです。 そして仕事でも Servlet はやっていないので、遊べる場所がないのです。 今のわたしの興味は 暗号 > 逆転裁判3 > 質の高い業務系システムを構築する方法 >>>> WEB > UNIX > Java です。 |
メモ。blowfish による暗号化 & 復号化。 #include <stdio.h> #include <openssl/blowfish.h> int main(int argc, char *argv[]){ BF_KEY key; unsigned char keybuf[]="SECRETKEY!"; unsigned char plain[128]="This is plain!"; unsigned char encrypted[128]; unsigned char decrypted[128]; unsigned char ivec[8]; BF_set_key(&key, strlen(keybuf), keybuf); printf("plain=[%s]\n", plain); memset(ivec, 0, sizeof(ivec)); BF_cbc_encrypt(plain, encrypted, strlen(plain), &key, ivec, BF_ENCRYPT); printf("encrypted=[%s]\n", encrypted); memset(ivec, 0, sizeof(ivec)); BF_cbc_encrypt(encrypted, decrypted, strlen(plain), &key, ivec, BF_DECRYPT); printf("decrypted=[%s]\n", decrypted); return 0; } |
ちゃんと読んでません、と書かれているのに突っ込みを入れるのは 失礼かもしれませんが・・・ #こんなこと言っておきながら、嘘だったらごめんなさい。 http://x68000.startshop.co.jp/~68user/net/crypt-1.html で紹介している http://www3.sympatico.ca/wienerfamily/Michael/MichaelPapers/TwokeytripleDES.pdf ですが、確かに2つの鍵を使う3DESは攻撃方法がある、ということも 書いていますが、どっちかって言いますと、既存の方法、すなわち、 §2の、Merkle-Hellman Attackの方法よりも、早い方法がありますよ、 という論文のような気がします。 恐らく、Merkle-Hellman Attackの方法はA=0となる解を2の56乗用意 して、何とかするけれど、この論文の方法はKnown-Plaintextを用いると、 もっと早く解析できますよ、といっているような。 #そのKnown-Plaintextがなんじゃらほい、というところまでは #精査していませんが。 それ以降はハードウェアのインプリメンテーションの話ですね。 |
>>3593 へにか ありがとうございます。お返事は後ほど。 で、メモその 2。EVP 版 blowfish 暗号化・復号化。なお、 http://www.openssl.org/docs/crypto/EVP_EncryptInit.html は古いバージョンの API。OpenSSL の web は本当にひどい。 #include <stdio.h> #include <openssl/evp.h> int do_crypt(FILE *in, FILE *out, int enc_mode){ unsigned char key[]="SECRET!"; unsigned char iv[8]; EVP_CIPHER_CTX ctx; char outbuf[256]; int outlen; memset(iv, 0, sizeof(iv)); EVP_CipherInit(&ctx, EVP_bf_cbc(), key, iv, enc_mode); while (1){ char inbuf[128]; int inlen; inlen = fread(inbuf, sizeof(inbuf[0]), sizeof(inbuf)/sizeof(inbuf[0]), in); if ( inlen==0 ){ break; } EVP_CipherUpdate(&ctx, outbuf, &outlen, inbuf, inlen); fwrite(outbuf, sizeof(outbuf[0]), outlen, out); } EVP_CipherFinal(&ctx, outbuf, &outlen); fwrite(outbuf, sizeof(outbuf[0]), outlen, out); return 0; } int main(int argc, char *argv[]){ int enc_mode; if ( argc == 1 ){ printf("Specify enc or dec.\n"); exit(1); } if ( strcmp(argv[1], "enc") == 0 ){ enc_mode = BF_ENCRYPT; } else if ( strcmp(argv[1], "dec") == 0 ){ enc_mode = BF_DECRYPT; } else { printf("Specify enc or dec.\n"); exit(1); } do_crypt(stdin, stdout, enc_mode); return 0; } |
>>3587 68user ご回答ありがとうございます。 .oがsrcと同一ディレクトリに存在するのは基本なのですね。 検討した結果、下記の様な仕様にしました。 単体環境:make終了後*.oは自動削除する。単体で1プログラムを対象(実際には共通ライブラリも含まれますが。。)にmakeするのにタイムスタンプを管理する必要は無いと言う結論です。 結合環境:全コンパイルが必要となる結合以降はsrcファイルと同一ディレクトリに.oを保管する。単体完となっているはずなので、修正のあったファイルをupdateするのみとする。 以上結論報告です。(報告されても。。。と思われるかも知れませんが。。(^^;)) |
質問するのはお久しぶりです。 つかぬ事をお伺いしますが、VineLinux起動中の停電後の再起動で、 非常に冷や汗モノのメッセージが出現しました。 Mounting proc filesystem: mount /proc/: can't read superblock これがそのメッセージですが、HDDのブート関連の情報が消えたと言う 事になるのでしょうか・・・(死刑宣告?) もしその最悪の状態の場合に、その他のパーティションのデータ復旧は 望めないでしょうか。 ちなみになぜかCDブートも出来ない状態です。 ファイルシステムはex3です。 神様仏様どうか最悪の状態では無いように・・・アーメン 何でこんな時に・・・ |
追加情報ですが、df の表示は /dev/hda6 としか表示されません。 fdisk /dev/hda の結果は、Unable to open /dev/hda です。 う〜ん・・・ |
>>3593 へにか いまだ調査中、というか英文と格闘中です。 >>3595 瀧上 単体環境と結合環境のやり方を変える必要があるのかどうかは疑問です。 Makefile を 2つ作るのか、Makefile は 1つで、環境変数などを見て 単体環境の場合のみ *.o を削除するのか、などの実現方法がわからない のですが、例えば - Makefile に記述した依存関係が不正確だった - しかし単体環境では毎回全ソースを build するので影響がなかった - ところが結合環境に修正ソースを上げたら、依存関係の不正確さから 狙いのソースがコンパイルされず、古い版の *.o がリンクされてしまった などということにならないでしょうか? ソースが非常に大規模なのでこういう仕組みを作らないと運用できない、 などの理由があるなら仕方ないでしょうが、 単体と結合でやり方が違う というのはミスの元ですので、それなりの利点がないなら避けるべきこと と思います。 > 報告されても。。。と思われるかも知れませんが。。(^^;) 掲示板に質問しておいて結果報告すらしない輩が多いですが、 瀧上さんはちゃんと報告していただけるので、こちらとしても 非常にうれしいことです。 >>3596 スナフキン そこらへん詳しくないんですが、/proc はカーネル内部のプロセス 状態を見るための覗き穴なので、そこで Can't read superblock とは 奇怪なことです (/proc に superblock なんか存在するのか? という話)。 そもそもこのエラーが出た結果、マウント対象となる HDD が読め ないなどの異常が発生しているのでしょうか? もしそうなら /proc マウントにさえ行き着けず、もっと前に /dev/hda などに関する エラーメッセージが表示されているのではないかと思うのですが。 > fdisk /dev/hda の結果は、Unable to open /dev/hda です。 /dev/hda が / なのでしょうか? /etc/fstab を見せていただけませんか? あと、/etc/fstab から /proc に関する行をコメントアウトすると どうなりますか? で、本当に superblock が飛んでいたりするなら、わたしの手には 負えないです。「ext3 superblock 復旧」などでぐぐると、いくつか ヒットするようです。 |
早速の御返答ありがとうございます。 /etc/fstab の中身です。(多分大丈夫だと思いますが書き写し漏れがあるかも) LAVEL=/ / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 none /dev/pts devpts gid=5,mode=620 0 0 LABEL=/home /home ext3 defaults 1 2 none /proc /proc defaults 0 0 LABEL=/usr /usr ext3 defaults 1 2 LABEL=/var /var ext3 defaults 1 2 /dev/hda7 swap swap defaults 0 0 /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0 (タブを全角スペースに置き換えしてます) >あと、/etc/fstab から /proc に関する行をコメントアウトすると ダメです。Read Only になっているので書き込みが出来ませんし、 そもそも vi が何も反応せずに起動しません… 植物状態って事?(T@T) 不思議なことに、インストーラーCD内のfdiskだとパーティション情報が 正常に表示されますが、HDDのモノだと前記の通りです。 |
>>3599 スナフキン > /etc/fstab の中身です LABEL=... という記述を初めて見たのですが、Linux には ラベルという仕組みがあるのですね。 要は /dev/hdx がどのマウントポイントに相当するのか、 知りたかったのですが、これではわからないですね。ログ ファイルなどに記録が残っていませんか? > Read Only になっているので書き込みが出来ませんし、 mount -o rw,remount /dev/hdx /hoge などで再マウント できませんか? > インストーラーCD内のfdiskだとパーティション情報が > 正常に表示されますが、HDDのモノだと前記の通りです。 正常に表示、とは何が表示されるのですか? わたしは Linux に詳しいわけではないのですが、全体的に 情報が少なすぎます。 Q1. そもそもマシンに何個の HDD が付いているのですか? Q2. そのうちどれが壊れたかわかりますか? その根拠は? Q3. シングルユーザモードで起動して、一部だけでも手動で マウントできませんか? Q4. どこまでマウントに成功しているのですか? / 以外は 全滅ですか? /boot も /usr も /home も /var も 見えないのですか? |
ごめんなさい、どんな情報が必要かわからなかったのと、自分でも 何が問題なのかよく判らないもので・・・ >再マウントできませんか? いろいろと指定を変えて試しています。 ただ、パーティンション情報が間違っている時に rw で書き込んで 大丈夫でしょうか? A1 HDDはIDEが一台のみです。 A2 メッセージをかいつまんで見る感じでは、superblock が読めない と表示されているように思いました。 A3 シングルモードで試してみましたがROでマウントされている状態が 変わりません。 A4 起動中に /proc へのアクセスが出来なくてエラーとなっているようです。 /boot /var /usr /proc のマウントが失敗しているようですが、 / に /usr /var というファイルが存在しますが、/proc というファイルは 存在していません。 関連サイトをあさって情報を探していますが、ファイルシステムは(も) よく判らない状態です・・・ ログは /var へアクセスできないのでお手上げです。 |
"Merkle-Hellman" DESと、Googleで検索をかけたところ、 http://info.isl.ntt.co.jp/~ohta/BOJ-Seminar.pdf を見つけました。21枚目あたりが参考になるかも知れません。 #なんだか、いらない突っ込みしてしまって、余計な苦労を #かけてしまったとしたら、申し訳ないです。 #お忙しいでしょうし、僕の意見も間違っている可能性大い #にあるでしょうから、その内気が向いたらで結構です。 |
>>3601 スナフキン > A3 シングルモードで試してみましたがROでマウントされて > いる状態が変わりません。 シングルユーザモードで起動すれば、Read Only でマウント されているものだと思います。狙いは / のみがマウントされ ている状態にすることで、その後ひとつひとつマウントして みることで、どの部分が壊れているのか原因がわかると考えました。 あとですね、この fstab では LABEL=/home などとファイル システムのラベルを指定しています。わたしの知る限り FreeBSD や Solaris にはこういった機能はないので想像ですが、fstab に ラベルを指定すると、まず全デバイスのラベル名を取得し、 ラベル名が一致したデバイスを mount しようとするのでは ないかと思います。 で、マウントしようとしているデバイスとは異なる場合でも、 ラベル取得時に壊れたファイルシステムが原因でエラーに なるのではないかと想像しました (違うかもしれませんが)。 よって、ラベルを使わず # mount -o rw,remount /dev/hdx /hoge などとデバイス名を指定してマウントしてみてください。 > /usr /var というファイルが存在しますが マウントポイントは最初から必ず存在します。存在するか どうかではなく、その下にファイルがあるかどうか、つまり マウントに成功しているかどうかを教えてください。 > パーティンション情報が間違っている時に rw で書き > 込んで大丈夫でしょうか? 保証はできませんが、大丈夫だと思います。もしファイル システムとして認識できなければマウントできません。また、 /usr を /var に間違えてマウントしたとろで、/var/bin とか /var/sbin とか /var/X11R6 などができてしまう程度 です (当然 umount すれば元通りです)。 ただ、そこでプログラム類が悪さをして /var などの下の ファイルを操作してもらっては困るので、そういう意味でも 「シングルユーザモードで起動」をお勧めします。 |
結果から書くと諦めました。 教えてもらった事と、考えられる事を幾つか試してみましたが、 何らかのエラーのオンパレード・・・ remount も試しましたが、その内 / に居るのに /etc の内容が 見えたり完全におかしくなって来ました。 ちなみに、/ の中には、 /boot 空 /home 空 /usr 壊れたファイルの断片を含んだファイル /var 同上 といった内容でした。 (lsコマンドが正常なうちの結果) まともだった頃の、幾つかのコマンド結果を書いてみます。 #fsck /dev/hda2 Couldn't open /proc/partitions: Input/output error Is /proc mounted? # mount /proc mount: non: can't read superblock # fdisk /dev/hda modprobe: modprobe: Can't locate module char-major-27 modprobe: modprobe: Can't locate module char-major-27 Unable to open /dev/hda しかし、ext3 がクラッシュに強いってのは信じられなくなり ました、4年近く使っている古いext2のシステムは、大きなト ラブルも無く今だ健在なのにたった一度の不正終了で・・・。 運が悪いといえばその通りなんでしょうが・・・(涙) お付き合いありがとうございました。 |
インストーラーで、前のパーティションを残してインストールする選択 肢が有ったので、/home を残して再インストールしたところ、ラッキー な事にデータを残せたようです。 /etc は全滅なので全て再設定を行う必要が有りますが、一番重要なデ ータが残せた事でよしとします。 また、今回のトラブルでファイルシステムのキーワードを沢山見つけま したが、自分はシステムを作るヒトじゃなく使うヒトなので、あまり 深入りするつもりは有りません。 しかし、バックアップの重要性は友人にあれほど言っている自分が今回 の様なトラブルにあった事でよい戒めとなりました。 ジャーナルシステムを過信するとワタシの様な目に遭いますので、皆さ まご注意を(^^;;;; お騒がせいたしまして申し訳有りませんでしたm(_ _)m |
英語と格闘させてしまってるところ、申し訳ないのですが、 暗号技術大全§15.2をご覧ください。 #ごめんなさい。手元にあるのに気が付かなくって。 しかも、Merkle-Hellmanの論文はacmに登録しないと読めない ようなので、僕が一人相撲をとっていたようですね。 #間抜けなことをしでかして、すみません。 |
色々と調べたのですが、どうしても分かりません。 以下の機能のスクリプトを作成中です。 1.ユーザーに入力を促し、ユーザーID、パスワードを入力させる。 2.入力されたパスワードの整合性チェック 文字数、英文字数、数字文字数、ユーザーIDと不一致etc. 3.正しいパスワードであった場合、passwdコマンドを実行し該当ユーザーのパスワードを変更。 問題は、上記の「3」です。 ユーザーが入力したパスワードをそのままpasswdコマンドに渡し、パスワード変更を行いたいのですが、入力されたパスワード文字列をpasswdコマンドに渡すことが出来ません。 通常時のpasswdコマンド実行時の様に旧パスワード/新パスワード/新パスワード(再入力)を促さずに、変数として持っているパスワード文字列をpasswdコマンドに渡すことは出来ないでしょうか? 環境はAIX 5.2でシェルは出来ればkshで実現したいと考えています。 |
>>3607 バンガード AIX は知りませんが、一般的な UNIX では root 権限があれば 元パスワードを聞かれることはないと思います。 http://publib16.boulder.ibm.com/pseries/Ja_JP/cmds/aixcmds4/passwd.htm ただしプログラムで制御するなら、pwdadm を使った方が よいような気がします。 http://publib16.boulder.ibm.com/pseries/Ja_JP/cmds/aixcmds4/pwdadm.htm passwd は人間が操作することを前提としたコマンドなので。 |
>>3607 バンガード passwdコマンドは端末からの入力しか受け付けないため シェルからpasswdコマンドへ直接値を渡すことは出来ません。 expectを使うのが一般的?かなと思います。 (Solaris以外はさっぱりなので参考程度に。) >>3608 68user AIXにはpwdadmというコマンドがあるのですね。 HP-UXのshの話といい、色々と参考になります。 |
>>3609 zsh > passwdコマンドは端末からの入力しか受け付けないため > シェルからpasswdコマンドへ直接値を渡すことは出来ません。 UNIX 一般の話であれば、そうでもありません。Linux では % ( echo oldpasswd ; sleep 3 ; \ echo newpasswd ; sleep 3 ; \ echo newpasswd ) | passwd でできました。Solaris8 だと不可でしたが、本当に端末が ない状況 (cron からとか、CGI からとか) でやるとうまく いったりするかも、とか思ったりします。 なぜ sleep が必要かについてはよくわからないんですが、 そのうち Linux の passwd のソースを読んでみよう。 >>3593 へにか 遅くなりましたが、2key-3DES について。お待たせしたわりに 技術的な話ではないんですが…。 http://x68000.startshop.co.jp/~68user/net/crypt-1.html では、 2key-3DES はやめといた方がいいよ。なぜなら、こんな 攻撃方法があって、現時点では (全数探索を除くと) 最も 現実的な攻撃と思われるからでありますよ。 ということを書きたかったのです。よって、これに対して > 確かに2つの鍵を使う3DESは攻撃方法がある、ということも > 書いていますが、どっちかって言いますと、既存の方法、すなわち、 > §2の、Merkle-Hellman Attackの方法よりも、早い方法がありますよ、 という指摘はちょっと意図が図りかねるなぁと思っておりました。 つまり Merkle-Hellman Attack の選択平文攻撃よりも既知 平文攻撃の方が脅威であるため、 「Merkle-Hellman Attack の方は紹介しなくていいかな。 論文も見つからないし」 と思ったわけです。もしこの認識が誤りであればご教示願います。 |
>>3610 68user > つまり Merkle-Hellman Attack の選択平文攻撃よりも既知 > 平文攻撃の方が脅威であるため、 > 「Merkle-Hellman Attack の方は紹介しなくていいかな。 > 論文も見つからないし」 当時の僕は論文の意図しか見ておらずこの、「論文も見つからない」 ということ、特に誰でも容易にハイパーリンクを辿ることによって 確認できる方法が無い、というところまで、頭が回っていませんでした。 > と思ったわけです。もしこの認識が誤りであればご教示願います。 いえ、少なくとも現在の僕の認識とは同一です。 #僕の勇み足だったと思います。お詫び申し上げます。 |
>>3610 68user バンガードです。 この掲示板を使うのが初めてなので、うまくコメント出来ていなかったら御免なさい。 >UNIX 一般の話であれば、そうでもありません。Linux では > % ( echo oldpasswd ; sleep 3 ; \ > echo newpasswd ; sleep 3 ; \ > echo newpasswd ) | passwd >でできました。Solaris8 だと不可でしたが、本当に端末が >ない状況 (cron からとか、CGI からとか) でやるとうまく >いったりするかも、とか思ったりします。 at コマンドで試してみましたが、残念ながら駄目でした。 引き続きpwdadmについて調査致します。 また、結果を報告させていただきます。 |
>>3608 68user >ただしプログラムで制御するなら、pwdadm を使った方が >よいような気がします。 pwdadmについても確認しましたが、残念ながらpasswdと動作は変わらない様です。 (もう少し、細かい設定が出来はしますが) やっぱり、旧/新パスワードを聞いてきて、それぞれの入力が必要であると言う部分では、全く変わりませんでした。 >>3609 zsh expectについては、昨日も調査を致しました。 しかしながら、expectおよびTclの導入が必要ですので、採用を躊躇しています。 |
>>3613 バンガード 3608 でも書いたように、root 権限で実行したら 旧パスワードは聞かれないと思いますが、どうですか? |
>>3614 68user はい。この件は返事が抜けていましたね。 申し訳ございません。 仰る通り、root権限であれば確かに古いパスワードは聞かれません。 ですが、結局は新パスワードに入力が必要であり、ここでユーザーの介在が必要なことに変わりはありません。 やっぱり、expectを導入するしかないのだろうかと考え始めています。 |
>>3615 バンガード > やっぱり、expectを導入するしかないのだろうかと考え始めています。 もし AIX の passwd が、どうしても端末からしか読んでくれないなら、 expect などに頼るか、PAM を使ったパスワード変更プログラムを 書くことになるかと思います。 |
LinuxASからsolaris9に乗せ替えるのですが、 クーロンはどのように移行できるのでしょうか? まだ実機が来ていなくて何も環境が見えません。 これまでの設定ファイルやスクリプトファイルが そのまま使えるのか、シェルの変更をしないと使えないのか、 どこに配置するのか・・・少しでも事前に解っていれば助かるかな〜って思ってます。 |
>>3617 ビギナー あらーそれは大変ですね。基本的に機能面 (コマンドの数とかオプションの 種類とか) で言うと Linux > Solaris なので (正確には GNU モノ > Solaris)、 Linux から Solaris への移行は結構面倒です。 まずは Sun が提供している 「Linux から Solaris オペレーティング環境への移行」 http://sdc.sun.co.jp/solaris/migration/linux/index.html をどうぞ (ドキュメントを読むにはユーザ登録が必要だと思われます)。 上記ドキュメントには、当然ながら Sun に都合が悪いことはあまり書かれて いませんので (互換性ないですよ、とはあまり書かれていない)、以下わたしの 印象を書きます。 全体的に言えることは、 - Linux (というより GNU) 独自の機能を使っていたら移行に苦労する - 古来からの UNIX の機能しか使っていないならあまり苦労しないかも ということです。GNU モノの一覧はこちらを。 http://www.linux.or.jp/JM/INDEX/gnu.html 特に Solaris の find・date・grep・tar・make・awk・sed コマンドの機能は、 Linux のそれと比べると貧弱な印象があります。 まぁ Solaris でも GNU モノをインストールすることはできるので、 がんばってプログラムを直すか、Solaris に GNU モノを入れるかという 選択肢はありますけどね。 なお、apache や perl など、Linux にも Solaris にも属さないもの (第三者が開発しているもの) は、基本的に同じ動きをします。 > クーロンはどのように移行できるのでしょうか? 基本機能は同じですが、例えば http://www.linux.or.jp/JM/html/cron/man5/crontab.5.html の name=value という書き方は Solaris ではできません。 0-23/2 というのもダメなはず。 上記 man には ATT や BSD の cron では "1-3,7-9" は拒否されるだろう -- "1-3" または "7,8,9" のいずれかだけしか指定できない。 とありますが、Solaris ではどうだったかなぁ。 Solaris の crontab(1) はこちら。 http://www.freebsd.org/cgi/man.cgi?query=crontab&apropos=0&sektion=0&manpath=SunOS+5.9&format=html > 設定ファイル OS の設定ファイル名や内容は、同じものは同じですが、違うものは 違います (としか言いようがない)。 同じもの: /etc/hosts, /etc/resolv.conf, /etc/nsswitch.conf 違うもの: その他たくさん。Linux の /etc/fstab は、Solaris では /etc/vfstab など。 > スクリプトファイル Linux では sh は bash ですが、Solaris は古来からの sh です。例えば Solaris の sh では export A=B はダメで、 A=B export A としなくてはいけません。このような bash 依存な書き方をしていなければ 少しの修正でいけるかもしれませんが、bash の便利な機能を活用しまくって いるなら苦労するでしょう。 |
>>3618 68user 参考にさせていただきます。 実機の搬入が来週なので、結果報告はその時にします。 |
>>3616 68user 現在expectで対応する方向で準備中です。 ありがとうございました。 |
度々申し訳ございません。 今度はkshで教えてください。 ======= test_file ======== aix4-r1 aix4-r2 aix4-r3 aix4-r4 aix3-r1 aix3-r2 aix3-r3 aix3-r4 aix2-r1 aix2-r2 aix2-r3 aix2-r4 ======= test.ksh ======== #!/usr/bin/ksh file="test_file" nawk '{ if ( (substr($0,1,4) == "aix4") )\ {\ printf "TRUE:%s\n",$0; \ }\ else {\ printf "FALSE:%s\n",$0; \ }\ }' $file 上記の様に文字列の先頭数文字のみを見て一致するかの判定を行いたいのですが、ksh単体での実現方法が分からず苦労しています。 やはり、上に示したようにawkを使用して、その中でsubstr関数を使用するしかないでしょうか? 本当に基本的なことで申し訳ございませんが、よろしくお願い致します。 |
>>3621 バンガード こんな感じですかね。 while read line; do prefix=${line%-r[0-9]} if [ "$prefix" = "aix4" ]; then echo "TRUE:$line" else echo "FALSE:$line" fi done < test_file |
>>3622 68user > prefix=${line%-r[0-9]} > if [ "$prefix" = "aix4" ]; then これだと、私が例で示させていただいたパターンにしか対応できませんよね。(そういう意味では私の示した例が悪かったですね) これを「aix4-r23,aix-r4x3」なども「一致」と見るような方法は無いでしょうか? たとえば、以下のようなif文は無理でしょうか? if [ $line = "aix4"* ]; then |
>>3623 バンガード > 「aix4-r23,aix-r4x3」なども「一致」と見るような方法は無いでしょうか? > if [ $line = "aix4"* ]; then aix4* では aix-r4x3 はマッチしないように見えますが、 またしても不適切な例ではありませんか? > if [ $line = "aix4"* ]; then if ではできませんが、case ならできます。 while read line; do case $line in aix4*) echo aix4 ;; aix5*) echo aix5 ;; *) echo others ;; esac done < test_file |
>>3624 68user >aix4* では aix-r4x3 はマッチしないように見えますが、 >またしても不適切な例ではありませんか? おっしゃるとおりです。 重ね重ね申し訳ございません。 >if ではできませんが、case ならできます。 なるほど、caseでなら「aix4*」が可能ですか。 助かりました。 |
初めまして、裏方と申します。 WinSockを用いたウィンドウズネットワークプログラムで、インター ネットを介して、私のマシン名からIPアドレスを取得する方法に ついて悩んでいます。言語はC言語を扱っております。 ローカルネットワークではマシン名からIPアドレスを取得するには Gethostbyname関数で取得できるのですが、インターネットを介した 遠方のマシンのから私のマシンのIPアドレスを取得する事が出来ま せん。(私のはサーバマシンでは無いので当然なのですが・・・) 私のマシンは大学で扱っているもので、ネットワークに繋ぐたびに 動的なIPアドレスが割り当てられるのですがサーバプログラム等を 私のマシン上で動かすときにいちいち相手に今のIPアドレスを教え なければならないので非常に不便です。 どうにかして、私のマシン名からIPアドレスを取得する方法が あるのでしょうか?どなたかアドバイスをお願いします。 |
>>3626 裏方 - 逆引きできないから困っているの? (もしそうなら「マシン名」というのは何?) - IP アドレスがころころ変わるから困っているの? (もしそうなら「マシン名」は関係ないのでは?) - そもそもマシン名って何を指しているの? FQDN? - DHCP で振られる IP アドレスには FQDN が設定してあるが、 外部向け DNS サーバには登録してなくて、内部からしか逆引き できない、という状況? などなど疑問はつきませんが、http://www.dyndns.org/ などの DynamicDNS と呼ばれるサービスを使うのが一つの解でしょう。 ただしこれは、大学とは全く関係ない FQDN を、大学から付与されて いる IP アドレスに結びつけるということです。管理者が寛容である ことを期待するか、リスクを負ってこっそりやるのがよいでしょう。 |
始めまして、UNIX使い始めです。 この度、awkコマンドを使用してファイルを分別して削除するシェルを作成しているのです。 そこでお聞きしたい事がるのです。 awkコマンドのifなどの中で変数は使えないのでしょうか? 現在、全ファイルに作成日付が付加されており、 指定日より前の物を削除したいいのです。 シェルの前半で指定日付を変数へ代入し、 lsとawkをパイプで繋いで削除しようとしています。 awk内のifなどによる条件判断で変数を宣言すると$0のメンバー名全体が表示されており、判別できないのです。 (ifを削除しprintで変数を表示させて確認) 出来ないのであれば何か別の方法を考えなくてはいけないのですが、 何方かお答えください。 |
>>3628 Tangerine 具体的にどのようなスクリプトなのか見せて頂けませんか? (そもそもawkを使う必要があるのでしょうか?) |
返信遅れてすいません。 えっと、確かに自分もawkを使う必要があるのか微妙ですが、 #! /usr/bin/sh make_date=`date +"%Y%m%d"` make_date=`echo $make_date"-1" | bc` echo $make_date ls *.*.* | awk -F. '{if($2<make_date) print $0}' 問題としているのはこのあたりです。 変数make_dateに昨日の日付けが入り、 それ以前のものを表示させたいのです。 正直なところを言えば、awkを使う必要性はまったくといってないです。 ただ、自分が色々調べた結果awkを使ってやれば出来るのか? と、考えて使ってみただけですので。 awkじゃなくて別の方法で行えるのであれば、 御教授いただけると嬉しいです。 |
>>3630 Tangerine 単純に昨日以前のファイルを表示するのであればこんな感じで。 (ファイルが無い時を考えるとls使った方がいいのかな?) ------ #!/bin/sh make_date=`date '+%Y%m%d'` for f in `echo *.[0-9]*.*` ; do d=`echo $f | cut -d. -f2` [ $d -lt $make_date ] && echo $f done ------ awkを使うのであればこんな感じかな。 実装されているawkによって変数の設定の仕方が違うので注意してください。 ------ #!/bin/sh make_date=`date '+%Y%m%d'` ls *.[0-9]*.* | awk -F. '{if($2 < d) print}' d=$make_date |
>>3631 zsh おおっ!!有難う御座います(T▽T) なるほど、forですね。なんとも勉強不足でした(^^; やはりawkでは変数をそのまま引き継げないのですね。 awk内で更に変数に入れ込まなければいけないとは(^^; 有難う御座います。 教えていただいた方法で作成していきます。 本当に助かりました(w |
>>3632 Tangerine > やはりawkでは変数をそのまま引き継げないのですね。 そういうわけではありません。 > ls *.*.* | awk -F. '{if($2<make_date) print $0}' awk はどういう引数が欲しいか、というと awk -F. '{if($2<$make_date) print $0}' や awk -F. '{if($2<make_date) print $0}' ではなくて、 awk -F. '{if($2<20040315) print $0}' となってほしいわけです。 で、こうなるように書くにはどうすればよいか。 [方法1] まず awk -F. '{...}' と '' で囲ってはいけません。'' で囲った時点で中に入っている 変数が展開されなくなります。というわけで、 awk -F. "{...}" と "" で囲みます。これで中の変数が展開されます。しかし awk -F. "{if($2<$make_date) print $0}" と書いてしまうと、$2 や $0 まで展開されてしまいます。$2 や $0 は awk にそのまま渡したいので、 awk -F. "{if(\$2<$make_date) print \$0}" と \ でエスケープします。 [方法2] 方法1 のエスケープがうっとうしいなら、まず awk -F. '{...}' と '' で全体を囲みます。そして狙いのところだけ '' の外に出します。例えば awk -F. '{if($2<'$make_date') print $0}' こんな感じ。つまり 'x'$y'z' という形にするわけですが、これは 'x' + $y + 'z' というふうに結合されるので うまく動きます。 いずれの場合であっても、 % sh -x hoge.sh と -x オプションを付け、変数が狙い通り展開されているかどうか チェックする癖をつけましょう。 |
なるほど〜、ややこしい事になっていたのですね〜 おかげさまで希望の日付以前のファイルを削除することが出来ました、 有難う御座います。 追伸 >% sh -x hoge.sh 使うようにしてみます(^^; |
>>3633 68user その方法があることをすっかり忘れてました。 (というか使った試しが無い・・・反省) いつもながら勉強になります。 |
初めまして、Perl初心者です。 Socketを使ってUDPのプロキシ機能を作りたいのですが、 Send関数のあて先の指定で、inet_atonを使わずに指定 する方法がわかりません。というのも、あて先IPアドレスは 分かっているのですが、/etc/resolv.confには記述されて いないからなのですが。 やっぱりinet_aton関数を使ってホスト名からIPアドレスを 取得しないとダメなのでしょうか? どなたか教えてください。 環境は、Solaris8 、perl5 です。 今はこんな感じなのですが、、、 socket(SOCKET, PF_INET, SOCK_DGRAM, 0); $ip = '192.168.253.155'; $sock_addr = pack_sockaddr_in(2426, $ip); send(SOCKET, "test", 0, $sock_addr); |
>>3636 tomato inet_aton には IP アドレスも渡せます。なので、 socket(SOCKET, PF_INET, SOCK_DGRAM, 0); $ip = '192.168.253.155'; $iaddr = inet_aton($ip); $sock_addr = pack_sockaddr_in(2426, $iaddr); send(SOCKET, "test", 0, $sock_addr); でよいです。 http://x68000.startshop.co.jp/~68user/net/func.html#inet_aton ではホスト名しか渡せないような書き方をしていますので、ちょっと 不適切でした。 そもそも、C 言語での inet_aton の機能は、 aaa.bbb.ccc.ddd という文字列を解析し、in_addr 構造体に格納する というもので、名前解決は行いません。一方、perl の Socket パッケージの inet_aton は、ホスト名も受け付けるように機能拡張されているわけです。 |
また初歩的なことで申し訳ありません。 以下のプログラムで、13行目以降で配列(CMD)の内容を表示させて いるのですが、全てNULLになってしまいます。 +1 #!/usr/bin/ksh +2 INDEX=0 +3 TEST=`ls -l | +4 while read LINE +5 do +6 CMD[$INDEX]=$LINE +7 echo $INDEX":"${CMD[$INDEX]} +8 let "INDEX = INDEX + 1" +9 done` +10 echo "$TEST" +11 +12 INDEX=0 +13 while [ $INDEX -lt 5 ] +14 do +15 echo $INDEX":"${CMD[$INDEX]} +16 let "INDEX = INDEX + 1" +17 done このプログラムの3行目から10行目を以下の様に修正すれば、13行目 以降でも配列の中身が正常に表示されます。 +3 ls -l | +4 while read LINE +5 do +6 CMD[$INDEX]=$LINE +7 echo $INDEX":"${CMD[$INDEX]} +8 let "INDEX = INDEX + 1" +9 done +10 最初のプログラムの様に、最初のループの結果を変数にセットする 場合で、ループから出た以降も配列の中身を保つ方法は無いでしょう か? |
>>3638 バンガード バッククォーテーションでくくると別プロセスになるから 変数を保持することはできないと思いますが・・・ |
>>3638 バンガード > このプログラムの3行目から10行目を以下の様に修正すれば この修正ではなぜダメなのか理由を書いていただかないと、代案が出せないです。 |