はじめまして 最近CGIを作りはじめたして、問題が・・・ サーバはUNIXでCGIの処理を行なった後に作られたファイルの所有権がすべてnobodyになってしまっていて、その作られたファイルの操作が全くできなくなってしまいました。所有権の変更も出来ないんです。 だれか助けて下さい。。 おねがいします。 |
>>2159 Nira > そういえば、httpsの取得に良いサイトを発見しました。 ありがとうございます。このページをサンプルとして載せておきます。 >>2161 あやの > その作られたファイルの操作が全くできなくなってしまいました。 #!/usr/bin/perl system("rm -f ファイル"); print "Content-type: text/plain\n\n"; print "File removed.\n"; というような CGI スクリプトを作って、ブラウザから CGI に アクセスすれば消せます。 > 所有権の変更も出来ないんです。 普通ファイルの所有者を変更できるのは root のみです。 # 設定次第でできる OS もありますが。 よって、 - 事前にファイルを作成しておき、nobody が中身を変更できる ようにパーミッションを設定する。 - ファイルの所有者は nobody とし、他のユーザがそれを 参照・変更できるようにパーミッションを設定する。 - ファイルの所有者を nobody 以外とする。 サーバ管理者に suExec や cgiwrap を入れてもらうか、 自分で suid なプログラムを作る。 # http://x68000.startshop.co.jp/~68user/webcgi/permission.html のいずれを選ぶ、ということになります。 |
はじめまして、こんばんはっす。 突然ですがシェルスクリプトをつかってファイルを 書き換えようとしてるのですが "ディレクトリースタックの番号指定が深過ぎます." とコメントされ動いてくれません。どういうことなんでしょうか? ちなみに このシェルスクリプトです。 わかるかたがいたら教えて下さい。 #!/bin/tcsh set d=1 while(d<=16){ cat -n invar3_$d.dat > ninvar3_$d.dat d++} end |
>>2163 けんじ 突っ込みどころがたくさんありすぎて書ききれないので、とりあえず 動くものを置いておきます。 #!/bin/tcsh set d=1 while ( $d < 16 ) cat -n invar3_$d.dat > ninvar3_$d.dat @ d = $d + 1 end まずはマニュアルか、初心者向けの csh プログラミングの本を 読んで下さい。よい本が見付からなければ sh で書くのも手です。 sh なら結構な種類の本が出ています。 |
すいません、丁寧に教えていただき ありがとうございます。 はい、もっともっと勉強していきます! ただ、perlやshではうまくいってくれるのですが なぜかcshでは教えてくださったようにしても "ディレクトリースタックの番号指定が深過ぎます." といって動いてくれません。 特になにも変更等していないのですが、、、、。 なにはともあれありがとうございました! |
とても長いCGI処理がしたくてforkで子プロセスに処理を投げてあげたときは、ブラウザがすぐ開放されることは分かったんです。でも、処理中にエラーとか発生したときは見た目で分からなくなっちゃうんですよね?? エラーのときはなんか表示させたいのですが良い方法はあるのでしょうか? それとも長い処理はもっとfork以外の違う方法があるんですかね?? よろしくおねがいします。。。 |
>>2165 けんじ > ただ、perlやshではうまくいってくれるのですが perl と sh と csh は全く別物ですけど、それは理解されてますか? > 特になにも変更等していないのですが、、、、。 という文章は、sh で動いたものをそのまま csh でも動かそうと しているように見受けられます。 > "ディレクトリースタックの番号指定が深過ぎます." $d<=16 を d<=16 と書けばそうなります。 >>2166 かな 掲示板の一番上にある「使い方」を全く読んでいませんね。 # http://www.parkcity.ne.jp/~chaichan/qanda/qa1999.htm?01-10-03-19-11 |
>>2158 68user > print 文でデータを出力してみて下さい。そしたらどこで化けて > いるかわかるでしょう。また、フォームが書いてある HTML の文字 > コードが何になっているかも調べて下さい。 やってみたら,どこで化けているかわかりました。 jcode::convert(\$str, 'euc'); で化けていて,これを削除したら化けなくなりました。 なぜでしょうか? フォームが書いてあるHTMLの文字コードはeucにしています。 その場合は,コンバートする必要がないということでしょうか? とりあえず解決したみたいなのですが(?), 気になるのでぜひ教えて下さい。 > $file1[9] が正しい、ってことでしょう。 あ,確かに。 本からそのまま写して問題なく動いていたので 全然気付きませんでした。 人に見せると恥ずかしいので,早速,修正しました。 ありがとうございました。 > その本は捨てましょう。 あはは(^^; 確かに,少なくとも私のような初心者は 正しい記述の本で勉強した方がいいでしょうね。 私でも気付くような間違いがあちこちにあることは確かです。 でも,プログラミングのアイデアというかミソというか 参考になる点もたくさんあって,結構重宝してます。 |
とても初歩的な質問だと思いますが、教えて下されば幸いです。 掲示板を最近設置したのですが、サーバがアメリカにあるため 時差があるタイムスタンプをします。この時間を 16 時間早めたいのですが どのような記述をすればいいのか、わからないのです。恐らく下記の一行が関係するのだと思います。 $TimeDiff = 0; よろしくお願いいたします。また、過去ログを一応見ましたが既出の質問であった場合はお詫び申し上げます。 |
>>2168 椎 > なぜでしょうか? なぜでしょうね? 正確なところは各部分で s/([^-_a-zA-Z0-9])/sprintf("%%%02lX",unpack("C",$1))/eg; として URL エンコードした結果を見ないとわかりません。 > フォームが書いてあるHTMLの文字コードはeucにしています。 > その場合は,コンバートする必要がないということでしょうか? NN4, NN6, IE4, IE5 あたりなら、フォームの書いてある HTML と 同じエンコーディングで、フォームデータを送ってきますので、 フォームの書いてある HTML と、処理するデータのエンコーディングが 一致しているなら jcode::convert は必要ありません。 ただし、これは規格として明文化されているわけではないので、 あくまでも NN と IE がそういう挙動をする、ということです。 もし Shift_JIS や ISO-2022-JP で送ってくるブラウザがいた 場合は化けます。 >>2169 ジュン > この時間を 16 時間早めたいのですが 言語は何ですか? 以下は perl だと仮定して…。 $TimeDiff をどのように利用しているのかわからないと なんとも言えませんが、秒数なら $TimeDiff = 60*60*16、 時間なら $TimeDiff = 16 でしょうか。 localtime を使っているなら、その前の行に $ENV{TZ}='JST-9'; と 書いておけばうまくいくかもしれません。 |
> その本は捨てましょう。 う〜ん、ここは68userのボードなので構わないのですが、 なんか、2ch化しているようでちょぴりショックだなぁ(^^ゞ 多分typeでしょう、本当にその様に書くことを勧めているのであれば 68userさんと同じ意見ですが… だけど、椎さんがコマンドの本来の項を読まずに、理解しようとしないで コピーしているだけであれば、椎さんの手抜きでしょうけど(^^ゞ まあ、自分もはじめはそうだったので人の事を言えませんが(笑) ちなみに、テストの為にコンバートした短い文字列を表示していませ んか?昔のネスケでの挙動ですが、短い文字列の場合はブラウザで文字 コードの判別がつかずに化ける場合があります。 その場合はそこそこの長文を表示すると、うそのように表示される場合 が有りました。 原因はSJISとEUCの文字コードが一部かぶる為です。(自分のスクリプ トはSJISで記述の為) あと、よくやるのがEUCでコンバートして出力していながら、CGIの他の 表示部分で違うコードを出力していたり(結構気付かなかったりします) プログラマーな人は、この様な無駄なトラブルを減らす為にALL EUCで 作る人が多いようですね。 >プログラミングのアイデアというかミソというか 自分の場合は、他人のスクリプトを解析することでいろいろ覚えました。 リファレンス以外はこの手法が一番お勧めです。 無駄を省いたルーチンは誰が作っても大体同じようなものになるはずです。 この掲示板のソースだってかなり勉強になるはずですよ(^^ゞ >>2166 かな 「使い方」を読むどころか、コピー文章ですね(^^ゞ ここまで典型的なのもはじめて見ました(笑) ところで、最近JAVAに嵌まっているようですが、JAVAはJavaScriptと perlとどちらに近い印象でしょうか?>68userさん 敬遠していたJAVAも覚えた方がいいかなぁ、と思う今日この頃(^^ゞ |
>>2168 椎 > jcode::convert(\$str, 'euc'); > で化けていて,これを削除したら化けなくなりました。 > なぜでしょうか? とりあえず, getcode 関数の戻り値を確認してみましょう。 http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-1 http://www.din.or.jp/~ohzaki/perl.htm#JP_Code >>2157 椎 >> スライス? > すみませんが,意味がわかりませんでした。 ありゃ。すみません。 >>2158 68user > $file1[9] が正しい、ってことでしょう。 という意味でしたが, 断言する自信が無いのと もし, 意図的にやっている事ででしたら その理由が聞きたかったもので… ちなみにスライスについては http://www.context.co.jp/perlnews/bn/perl-newsletter-0010.html http://www.context.co.jp/perlnews/bn/perl-newsletter-0013.html が参考になると思います。 |
>68userさん 素早い回答と、明確のお答えありがとうございます。 使っている言語はperlで、秒数の設定により解決しました。ありがとうございました。 |
>>2170 68user > 一致しているなら jcode::convert は必要ありません。 必要ないということは,あってもいいのでしょうか。 つまりeucをeucにコンバートする処理をしても問題はないんですよね? そうだとしたら,今回の問題はまだ解決できていないということですね。 >>2171 スナフキン > コピーしているだけであれば、椎さんの手抜きでしょうけど(^^ゞ ええ,その通りです。まだわからないことが多いので,とりあえず(^^; > そこそこの長文を表示すると、うそのように表示される場合 > が有りました。 そうかもしれません。ただ,短い文字列を入力するようにしていますので, 根本的に解決しないとダメですね。 > CGIの他の表示部分で違うコードを出力していたり イメージできないんですが,具体的にどんな場合でしょうか。 エディタでeucで保存するようにしているのですが, これだけではeucにならないものでしょうか。 > この掲示板のソースだってかなり勉強になるはずですよ(^^ゞ 機種依存文字の検出のところなど,参考にしたいなと思っていました。 とはいえ,今日初めてソースを見たのですが, 理解するのに,かなり時間がかかりそうです。 >>2172 /tk > とりあえず, getcode 関数の戻り値を確認してみましょう。 おお,これは使えそうですね。やってみます。 > ちなみにスライスについては なるほど〜。よくわかりました。 必要がないのにスライスを使っていたことになるわけですね。 意図的でなくて申し訳ない感じです。 |
こんにちは、はじめましてTOMです。 初級アマチュアプログラマーです。 ちょっと自分で解決できなかったので質問を聞いてください。 ・モジュールAに、ライブラリlib30.soをリンクしています。 ・モジュールBに、ライブラリlib40.soをリンクしています。 ・さらに、ライブラリlib40.soの中で、ライブラリlib30.soの中の関数Func09が 使用されています。 ライブラリlib30.soの中の関数Func09が修正されました。 再コンパイル、再リンクは、 全て(モジュールA・モジュールB・lib30.so・lib40.so) 行わなければならないのでしょうか? よろしくおねがいします。 |
>>2175 TOM Func09 の引数の数や、引数の型、戻り値の型を変更しましたか? また、Func09 から他の部分のグローバル変数を参照するところ を変更しましたか? いずれの変更もしてないなら、ライブラリ利用側の再コンパイル・ 再リンクは不要です。 引数や戻り値を変えた (=インタフェースを変えた) なら、 再コンパイル・再リンクのし忘れを防ぐため、メジャー番号を lib30.so.1 -> lib30.so.2 などと上げた方がよいでしょう。 >2174 >> 一致しているなら jcode::convert は必要ありません。 > 必要ないということは,あってもいいのでしょうか。 あってもよいです。僕は必ず jcode::convert は付けます。 > つまりeucをeucにコンバートする処理をしても問題はないんですよね? 本来問題ないのですが、Shift_JIS の半角カナと EUC-JP を正確に 判別することはできないので、EUC-JP な半角カナを Shift_JIS の 文字列だと誤認してしまい、EUC-JP に変換しようとする、ということは あります。 一応 jcode.pl がエンコーディングを自動判別する際は、「Shift_JIS と して解釈できる部分の長さ」と「EUC-JP として解釈できる部分の長さ」を 比較して長さが長い方を採用しますが、もちろんこれでも完璧では ありません。 # たしか両方の長さが一致したら、EUC-JP とみなされたと思う。 > 必要がないのにスライスを使っていたことになるわけですね。 いいえ、@a[0] はスライスを使っているわけではありません (よね?)。 perl がおせっかいなので @a[0] -> $a[0] という読み替えをしている だけです。 % perl -we '@a=(100,200);print "@a[0]\n"' Scalar value @a[0] better written as $a[0] at -e line 1. 100 >>2171 スナフキン > ところで、最近JAVAに嵌まっているようですが、JAVAはJavaScriptと > perlとどちらに近い印象でしょうか?>68userさん うーん、どっちも遠いですねぇ…。でもまぁ僕がやってるのは サーバサイドの方なので、どちらかと言えば perl ですか。 でも、perl とは似てないですね。 とにかくクラス設計が楽しいです。 |
すいませんでした。 以後気を付けます。。 |
はじめまして。 ネットワーク関係の関数でちょっと質問なのですが。 inet_aton(hostname)になっていますがこれをinet_aton (ipaddres) にしても問題はないのでしょうか? hostnameが解決されていない場合、IPアドレスをそのまま 使用してみたのですが表面上問題はでていませんが、 内部的にどうかまで分からなかったので。 どなたか教えて下さい。 分かり難い内容の書き込みになってすみません。 |
>>2176 68user > # たしか両方の長さが一致したら、EUC-JP とみなされたと思う。 一致した場合は undef では? > いいえ、@a[0] はスライスを使っているわけではありません (よね?)。 > perl がおせっかいなので @a[0] -> $a[0] という読み替えをしている > だけです。 http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html を読んだうえでの僕の解釈は @a[0] はスライスです。 但し, 要素数が 1 のリストであり, スカラー値ではありません。 たまたま @a[0] をスカラーで評価したときに, その最後の要素である $a[0] が返されただけです。 となるのですが 例によって勘違いしている可能性大です。 |
>>217668user 68userさん インターフェイスの変更は、ありませんので ライブラリ利用側を再コンパイル・再リンクせずに利用できました。 回答ありがとうございました。 |
/tkさんが教えてくれた↓のページを読むと, > http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-1 ・convert()は内部ではgetcode()を自動的に呼び出し文字コードを判断する ・getcode()では,半角カナは文字コードの自動認識の判断対象からはずされる とあります。また,スナフキンさんが > そこそこの長文を表示すると、うそのように表示される場合が有りました。 と言われたように,私の場合も半角カナ以外の文字をある程度以上追加すると 文字化けしないことがあります。 例)アイウエオ(半角) →竺軸宍雫七(全角) アイウエオ(半角)あいうえお(全角)→アイウエオ(半角)あいうえお(全角) これらのことから,今回の文字化け現象の原因は,convert()が (正確にはgetcode()が)半角カナの文字コードを 正確に判別できていないことのようです。 これを調べるためにコンバートの前後でgetcode()をかけてみました。 $code1 = &jcode::getcode(\$str); jcode::convert(\$str, 'euc'); $code2 = &jcode::getcode(\$str); その結果,次のようになりました。 $str = 'あいうえお' → $code1 = 'euc',$code2 = 'euc' $str = 'アイウエオ(半角)' → $code1 = 'sjis',$code2 = 'euc' つまり,getcode()は半角カナの「アイウエオ」をsjisと判定して sjisをeucに変換する処理をしていたのです。 長々と書きましたが,68userさんが書かれたように, > Shift_JIS の半角カナと EUC-JP を正確に > 判別することはできないので、EUC-JP な半角カナを Shift_JIS の > 文字列だと誤認してしまい、EUC-JP に変換しようとする、ということは > あります。 ということのようです。 で,ここでどうするかというプログラム上のアイデアが問われるのですが, (残念ながら例の本には載っていません・笑) 今は,「$strに全角文字を数個追加して,コンバート後にそれを除く」ということを 考えています。 ただ,自分でもかっこ悪いなぁと思うので,他にアイデアがあれば教えて下さい。 >>2176 68user > いいえ、@a[0] はスライスを使っているわけではありません (よね?)。 私は/tkさんが教えてくれたページを読んでスライスを覚えたので No.2179の/tkさんと同じ解釈をしたのですが, この解釈の違いによって,使い方とその結果が変わるということが ないのであれば,あまり本質的な問題ではないような気がします。 68userさんが正しい知識を教えようとしてくれる気持ちはとてもありがたいです。 |
シイ |
すみません。下の書込は私,椎です。 今回のことがあって,名前のような文字数が少ないフォームへの 日本語の記入に抵抗を感じたので, これから椎はやめてshiiにしようと思います。 |
>>2178 SA > inet_aton(hostname)になっていますがこれをinet_aton (ipaddres) > にしても問題はないのでしょうか? 問題ないと思います。FreeBSD では inet_aton と inet_addr は同じ 関数になってます。 # http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/net/inet_addr.c?rev=1.12.2.1 >>2179 /tk > @a[0] はスライスです。 ん〜、(@a)[0] とは違うということですか? >>2179 /tk > 一致した場合は undef では? >>2181 椎 > ・getcode()では,半角カナは文字コードの自動認識の判断対象からはずされる そうでしたっけ…。昔 jcode.pl を読んだときはそうじゃなかった ような気がしますが、読み違えていたのかもしれません。 > 今は,「$strに全角文字を数個追加して,コンバート後にそれを除く」と > いうことを考えています。 追加する全角文字のエンコーディングを EUC-JP にするか、Shift_JIS に するかが問題です。どちらか決めるためには追加対象文字列のエンコーディングを 自動判別しなきゃいけません。で、それが正確にはできないので…と堂々めぐりです。 まぁ、元のフォームが EUC-JP であるということなので、 /([\x00-\x7F]|[\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE])*/ にマッチすれば EUC-JP として解釈できる文字列である、ということですから 無変換、でいいと思います。 # jcode.pl は汎用ライブラリですからそうもいきませんが。 > すみません。下の書込は私,椎です。 名前の部分にカーソルがある状態で Enter を押しても書き込み しないようにすればよいのかな? (どうやるのかさっぱりわかりません) |
>>2184 68user > 追加する全角文字のエンコーディングを EUC-JP にするか、Shift_JIS > にするかが問題です。 半角カナ「アイウエオ」の場合,後ろにスペースを3つ追加するだけで 上手くいきました。多分,全角文字なら判別対象になるので, それをある程度の長さで追記すればいいのかなと思いました。そこで, html側で別に送った全角文字を追加して判別するつもりでした。 ただ,こちらの掲示板では短い半角カナの「シイ」を判別できたので, jcode.plのせいではないようです(私の方ではシイも化けました)。 cgi-lib217.plを使っているせいかも……? 人様のプログラムの改造から使い始めたPerlですが, 以前に比べればいろいろなことがわかってきました。 上述のことを確かめる意味でも, 自分が理解できる範囲で1から作り直してみることにします。 (jcode.pjは深く考えずに使いますが……(^^;) それを検証できたらまた報告しますね。 |
>>2174 椎 >イメージできないんですが,具体的にどんな場合でしょうか。 すみません、よく読んでいませんでした。 CGIで出力するページソースの中の日本語コメントがSJISでEUCに変換 した日本語を同時に出力と言うケースでしたが、shiiさんの場合は まったく違うようですね。 >>2176 68user サーバーサイドという事は常駐システムですね。 さすが68userさん(笑) 自分も先日初心者用のCD付き本を買ってきて、JDKをインストールして みましたが、いきなりサンプルの Hello! が動かないトラブルで、 既にめげています(笑) ざっと見た感じでは、関数類を覚えれば特に難しく無さそうな感じも しますが、甘いかな?(^^; もしよければ、お勧めの初心者向けサイトを教えてくれると嬉しいです。 >2184 >名前の部分にカーソルがある状態で Enter を押しても書き込み こういう事でしょうか? <HEAD〜内 <SCRIPT LANGUAGE="JavaScript"> <!-- function submit_check(){ if(!document.FORM.elements.MESSAGE.value){ alert("メッセージを記入してください。"); return; } if(!document.FORM.elements.NAME.value){ alert("名前を記入してください。"); return; } document.FORM.submit(); } //--> </SCRIPT> <FORMへ <FORM METHOD=POST ACTION="$script_name" NAME="FORM" OnSubmit="submit_check();return false;"> 外してます? |
>68userさん ありがとうございました。 IPアドレスで使用していきます。 |
cgi-lib217.plを使わずにreadで読んでやってみましたが やはり文字化けしました。引き続き調査中です。 |
すいません、また怪奇現象が起こったのでお力をお貸しください。 Excel のワークシートを単純に <a href> タグでリンクすると クリックすると中が見えてしまう(文字化けの文書として開こうとする)ので、 いぜん別の場所で教えてもらった方法をアレンジして 下のような CGI スクリプトで行っています。 --- download.cgi --- #! perl $arg = $ENV{'QUERY_STRING'}; $arg =~ /name=(.*)/; $excelfile = $1; $pwd = `pwd`; chomp($pwd); unless (open (FL, $excelfile)) { print "Content-type: text/plain\n\n"; print "error opening $excelfile because $! at $pwd"; exit; }; print <<HEAD; Content-type: application/octet-stream Content-disposition: attachment;filename="$excelfile" HEAD print <FL>; close(FL); ------------------- これを、 <a href="http:.../cgi-bin/download.cgi?name=test.xls">ここをクリック</a>して xls ファイルを、、 のように呼び出そうという寸法です。 これが、場所によって挙動が異なるのです。 project | cgi-bin | | download.cgi | subproj1 | | aaa.html | | xxx.xls | subproj2 | | subdir | | | bbb.html | | | yyy.xls ここで、 http://org/~project/subproj1/aaa.html として見える aaa.html の中に、 <a href="http://org/~project/cgi-bin/download.cgi?=xxx.xls">XXXをダウンロード</a> と書くとうまくいくのですが、 http://org/~project/subproj2/subdir/bbb.html の中に、 <a href="http://org/~project/cgi-bin/download.cgi?=yyy.xls">YYYをダウンロード</a> と書くと、 error opening yyy.xls because No such file or directory at /.../project/cgi-bin と表示されます。 パスが何らかの理由で見えないのかと思って <a href="http://org/~project/cgi-bin/download.cgi?=../subproj2/subdir/yyy.xls">YYYをダウンロード</a> と書くと、なんと download.cgi という名前でファイルを保存しようとします。 保存して中を開けてみると、中身はなんと yyy.xls! 1回目の実験は xxx => yyy の順番で行ったので、 何らかのキャッシュが行われているのかと思い、yyy => xxx の順で行っても同じです。 ということでよろしくお願いします。 サーバー側は FreeBSD 2.2.8-RELEASE+Apache(Apache のバージョンの見方がわかりません、、)、 クライアント側は Windows2000 Server+NC4.51 および IE6 です。 |
↓下の件ですが、Apache は 1.2.5 だと管理者からメールが来ました。 |
>>2185 shii そうですか、できましたか。どうも僕だけ話をわかってなくて 間違ったことばかり言っているようです。すみません。 >>2189 ふくし download.cgi が実行されたときのカレントディレクトリは、download.cgi のある ディレクトリになっているはずです。 よって、cgi-bin/xxx.xls も cgi-bin/yyy.xls もないので両方失敗するはずです。 なのに xxx.xls だけ成功するということは、cgi-bin/ の下に xxx.xls だけファイルが 置いてあったとか、シンボリックリンクが張ってあったとかいうオチではないかと 思うのですが、いかがでしょうか。 >>2186 スナフキン > サーバーサイドという事は常駐システムですね。 うーん、CGI を常駐システムと呼ばないのと同じで、Java Servlet も 常駐システムとは呼ばないと思います。 > ざっと見た感じでは、関数類を覚えれば特に難しく無さそうな感じも > しますが、甘いかな?(^^; いや、そんなもんじゃないですか? 標準クラスライブラリを組み合わせて パズルのようにプログラムを組み上げて行く感じです。 書き込みミスをした原因は >>2184 68user > 名前の部分にカーソルがある状態で Enter を押しても書き込み > しないようにすればよいのかな? のせいですか?>shii さん もしそうなら >>2186 スナフキン > <FORM METHOD=POST ACTION="$script_name" NAME="FORM" OnSubmit="submit_check();return false;"> を組み込みます。 |
>68user さん すいません、、xxx.xls がなんかのはずみで cgi-bin に 入ってました、、いつもすいません、、。 ../ で cgi-bin に遡れないんですね。 (download.cgi として yyy.xls が保存できたのがわからんが、、) cgi-bin の下に project に対するシンボリックリンクを張って 解決しました。 |
>>2191 68user > そうですか、できましたか。どうも僕だけ話をわかってなくて > 間違ったことばかり言っているようです。すみません。 え。何も間違ってないですよ(と,思うのですが)。 私の書き方がわかりにくかったらすみません。 というか私が無知で,68userさんが書いていることを理解できて いないような気がします。 > 書き込みミスをした原因は 申し訳ないと思いつつ,半角カナを試させていただいたのです。 ですから書き込みミスではありません。すみません。 プログラム上は同じ事をやっている気がするのに, どうしてこちらの掲示板では半角カナを判別できるのか が現在の謎です。 ちなみに, 私のCGIでは「シイ(半角)」が「鴫」と化けます。 有名なTeaCupの掲示板でも同じように化けました。 私がこちらのソースを見ただけでは,わからなかったのですが, コード判別で何か特別なことをされていますか? 私のjcode.plのバージョンはv 2.3 1997/02/23ですが, バージョンのせいってことがあるのかな……? |
大ショックです。 jcode.plを最新版(v 2.13 2000/09/29)に入れ替えたら 半角カナを認識しました。それだけのことだったのです。 大解決です。ここまでたどりつけたのも皆様のおかげです。 ありがとうございました。 それから,いろいろと変なことを書いたりやったりして すみませんでした。 ちなみに下に書いた私が使っていたjcode.plのバージョンは, 中に書いてあった記述をそのままコピーして貼ったのですが, ちょっと変ですね(^^; |
思わず,半角カナを認識したと書きましたが,正確には違うようです。 半角カナのsjisとeucは判別しようがないですよね。 中の説明には特に書かれていないようですが, 判別不能な場合の処理として, 古いバージョンではsjisと判断していたところを eucに判断するようにしたのではないでしょうか。 |
どうやら,2.3から2.6にバージョンアップしたときに 修正されたようです。以下,引用です。 (バージョンの記述が変だったというのは私の勘違いでした。) −−−−−−−−−−−−−−−−−−−−− jcode.pl-2.6 をリリースしました。 ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/jcode.pl-2.6 2.3 からの変更点は、以下の通り。 - &jcode'tr の中で JIS コードの認識方法をちょっとだけ変更 - JIS X 0208-1990 のシークエンスを認識するように変更 - &jcode'getcode のバグを修正して、説明を追加 --utashiro |
はじめまして。玉中と申します。 突然の投稿で失礼致します。 1台のパソコンにネットワークカードが複数枚ささっており、それぞれにIPアドレスが割り当てられている場合に、それら全てのIPアドレスを取得するにはどのようにすればよいのでしょうか。言語は C/C++ です。 NIC が1枚だけの場合は、gethostname() と gethostbyname() で取得できるのですが、複数の場合の取得方法が分かりません。 つまりは、ifconfig コマンドのようなことをやりたいのですが、 どなたか方法をご存知ありませんでしょうか。 よろしくお願い致します。 |
UDPクライアントをPerlで作成したいのですが なかなか上手く行きません。 特定のポート番号(例 NTPの123)にメッセージをなげて そのポート番号が存在するかしないかを確かめたいのですが・・・ どなたか詳しい方いらっしゃいませんか? |
>>2198 SA > 特定のポート番号(例 NTPの123)にメッセージをなげて 送るだけなら、多分こんな感じだったかと。 use Socket; my $iaddr = inet_aton("10.0.0.1"); my $sock_addr = pack_sockaddr_in(123 ,$iaddr); socket(SOCKET, PF_INET, SOCK_DGRAM, 0); send(SOCKET, "hoge", 0, $sock_addr); ただし、 > そのポート番号が存在するかしないかを確かめたいのですが・・・ UDP なので、送ったデータが相手側に到達したかどうかは 判別できません。 >>2197 玉中 > つまりは、ifconfig コマンドのようなことをやりたいのですが、 ioctl & SIOCGIFCONF でやるか、BSD 系なら getifaddrs(3) ってのが 使えるはずです (OS 名くらい書きましょう)。どちらも http://www.mmjp.or.jp/pearsoned/washo/network/wa_net28-j.html の16章に載ってます。 あとは ifconfig のソースなどを参考にして下さい。 http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/sbin/ifconfig/ |
>>2184 68user >> @a[0] はスライスです。 > ん〜、(@a)[0] とは違うということですか? どちらもスライスだと思うのですが @a は配列のスライスで, (@a) はリストのスライスかと… ただし, どちらも一般的には「配列スライス」で括られると思います。 要は, 単数であっても配列やリストの添え字であった場合には スライスと呼べるだろうという個人的解釈です。 # ↑突っ込み大歓迎モード |
AGEと申します。 Red Hot Linux 7.0J を使用しています。 「ntp-4.1.0.tar.gz」をインストールしてみました。 しかし、rpm のものがあったのでアンインストールしたいのですが インストールされたファイルを知る方法はあるのでしょうか? よろしくお願いいたします。 |
>>2191 68user ServletもCGIと同じくリクエスト毎に起動するのですか? 不勉強でした。セッション管理ができると言うので常駐するものと 勘違いしていました。 >パズルのようにプログラムを組み上げて行く感じです。 そのパズルが難しそう(^^; >>2201 AGE >インストールされたファイルを知る方法はあるのでしょうか? man rpm をどうぞ。 ntpってRHLに標準で入っている(はず)の xntpdとは別物なんですね。 |
>>>2202 スナフキン >man rpm をどうぞ。 すいません。言葉足らずでした。 xntp はインストールされてなかったので、 ntp はソースから make install しました。 その場合のインストールされたファイルを知りたかったのです。 ntp を削除して、管理しやすい xntp(ntp-4.0.99-15〜.rpm)を インストールしようとおもってます。 |
ええと,結局,最新版jcode.plでも半角カナは文字化けしました。 たまたま「シイ」はOKでしたが「アイウエオ」はNGでした。 こちらの掲示板でもたぶん化けると思います。 そこで,前に書いた方法をスクリプトにしてみました。 尚,送信ページには,↓この1行が入っています。 <INPUT TYPE="hidden" NAME="assist" VALUE=" "> VALUEは,全角スペース5個です。 −−−− # コード判別補助文字列名(送信ページと統一,半角英数字に限る) $assi = 'assist'; read(STDIN,$input,$ENV{'CONTENT_LENGTH'}); @parts = split(/&/,$input); # コード判別補助文字列$ASSIST0の取得 foreach(@parts) { ($key0,$val0) = split(/=/); # 最初の=で分離 $key0 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; if ($key0 eq "$assi") { $ASSIST0 = $val0; } } foreach(@parts) { ($key,$val) = split(/=/); # 最初の=で分離 $val =~ tr/+/ /; # trは1文字単位の置換 # コード判別補助文字列の追加 if ($key ne "$assi") { $val = $val.$ASSIST0; } $key =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; jcode::convert(\$key,'euc');#---- from jcode.pl jcode::convert(\$val,'euc');#---- from jcode.pl if ($key eq "$ass") { $ASSIST = $val; } $val =~ s/($ASSIST)$//g; # コード判別補助文字列の除去 $key =~ s/\r\n|\r|\n//g; # gはマッチする文字全て $val =~ s/\r\n|\r|\n//g; $key =~ s/,/,/g; $val =~ s/,/,/g; $key =~ s/</</g; $val =~ s/</</g; $key =~ s/>/>/g; $val =~ s/>/>/g; $key =~ s/"/”/g; $val =~ s/"/”/g; $key =~ s/&/&/g; $val =~ s/&/&/g; $in{$key} = $val; } −−−− これで「ア」などという1文字の半角カナもコード判別できているようです。 もうちょっとスッキリできればいいのですが……。 |
>>2204 shii http://www.din.or.jp/~ohzaki/perl.htm#JP_Code っていうかそのコードには 気になる点がいろいろと・・・ |
>>2205 ナナシサソ リンク先はPerlメモのgetcode関数のところですね。 できれば気になる点を具体的に指摘していただけると とてもありがたいのですが。 |
>>2204 shii 考え方はよいのですが、もちっとスマートにやるなら、 「あ」の文字コードを調べるスクリプト require 'jcode.pl'; $_="あ"; jcode::convert(\$_, 'euc'); s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "あ in euc-jp: $_\n"; $_="あ"; jcode::convert(\$_, 'sjis'); s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "あ in shift_jis: $_\n"; $_="あ"; jcode::convert(\$_, 'jis'); s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "あ in jis: $_\n"; 実行結果: あ in euc-jp: %A4%A2 あ in shift_jis: %82%A0 あ in jis: %1B%24B%24%22%1B%28B # これは他のパターンも有りうるかも を踏まえて、 <input type="hidden" name="assist" value="あ"> としておき、 read(STDIN,$input,$ENV{'CONTENT_LENGTH'}); ($assist_code) = $input =~ s/(^|&)assist=(.*?))($|&)//; if ( $assist_code =~ m/^\%A4\%A2$/i ){ $input_encoding = 'euc'; } elsif ( $assist_code =~ m/^\%82\%A0$/i ){ $input_encoding = 'sjis'; } elsif ( $assist_code =~ m/^\%1B\%24B\%24\%22\%1B\%28B$/i ){ $input_encoding = 'jis'; } @parts = split(/&/,$input); foreach(@parts) { ($key,$val) = split(/=/); $key =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; jcode::convert(\$key,'euc', $input_encoding); jcode::convert(\$val,'euc', $input_encoding); } くらいがよろしいかと思います (動作確認はしていません)。 >>2203 AGE > ntp はソースから make install しました。 > その場合のインストールされたファイルを知りたかったのです。 もし Makefile に uninstall とか deinstall とかいうターゲットがあるなら、 # make uninstall # make deinstall ですが、なさそうならば # make -n install して、インストールされるファイルをメモって、手動で rm ですね。 >>2202 スナフキン > ServletもCGIと同じくリクエスト毎に起動するのですか? いいえ、しません。そういう意味では常駐していますね。 しかし、CGI を使うときも apache が常駐していますが、「常駐 システムを開発している」という意識は僕にはありません。それと 同様に、Servlet コンテナが常駐していても「常駐システム」とは 呼ばないんじゃないなぁ、ということです。まぁ、ここらへんの 感覚は人によって違うのかもしれません。 >>2200 /tk > どちらもスライスだと思うのですが えっと、@a[0] と (@a)[0] は違うんですよね? ということです。 要は、 「@a[0] は文法エラーのところを perl があえて $a[0] に読み変えている」 とこれまで思っていたのですが、 「@a[0] は文法的には正しいけれど、$a[0] の方が適当なので perl があえて警告するようにしている」 ということでしょうか? > @a は配列のスライスで, (@a) はリストのスライスかと… perl に配列とリストという区別はあるんでしたっけ。 |
>>2207 68user おお,なるほど!ありがとうございます。 ダミーを送るのなら,それをわざわざ対象文字列に結合しなくても いいわけですね。私が間抜けでした。 文字コードを調べるスクリプトが面白いですね(勉強になります)。 今回の件を自分のCGI向けに最小限にカスタマイズした(つもりの) スクリプトが下記です。 #--------------------------------------------------------- read(STDIN,$input,$ENV{'CONTENT_LENGTH'}); @parts = split(/&/,$input); foreach(@parts) { ($key,$val) = split(/=/); $val =~ tr/+/ /; $key =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $val =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $code = &jcode::getcode(\$key); jcode::convert(\$key,'euc',$code); jcode::convert(\$val,'euc',$code,"z"); $val =~ s/\r\n|\r|\n//g; $val =~ s/,/,/g; $in{$key} = $val; } #--------------------------------------------------------- 入力項目名に半角カナ以外の日本語を使用することが前提なので, 汎用性はありません。 getcode関数を全項目に使っているところが余分なのですが, 見た目は,以前に比べてすっきりしました。 ところで, > ($assist_code) = $input =~ s/(^|&)assist=(.*?))($|&)//; ここはassistの中身のみを残して残りを消す作業だと思うのですが, ($assist_code)にカッコがついている理由と, 正規表現内のカッコの数が合わない理由を教えてください。 ・「行の先頭」または「&の直後」にある「assist=」 ・「任意の1文字の0回以上の最短マッチ」 ・「行の終わり」または「&の直前」 と,部分的にしか理解できませんでした。 |
>>2208 shii おいらはこう書くべきと思うけどな my ($assist_code) = $input =~ /(?:^|&)assist=([^&]*)/; どうせassist=なんじゃら、なんて残ってたって関係ないし。 > 正規表現内のカッコの数が合わない理由を教えてください。 ミスだねこれは だいたい、これだと > ($assist_code) = $input =~ s/(^|&)assist=(.*?))($|&)//; $assist_codeに入るのは(^|&)の部分になっちゃう |
>2207 68user >もし Makefile に uninstall とか deinstall とかいうターゲットがあるなら、 > # make uninstall これでうまくいきました。ありがとうございました。 |
メールを送るCGIについて。 フォームに入力されたメールアドレスに対して、Sendmailを使って CGI(Perl)からメールを送る時のことです。 ユーザやホスト名などが間違ったメールアドレスを入力しても、外部の サーバ宛てなら、正常にCGIが終了し、エラーメールが戻ってきます。 ここまでは良いのですが、CGIやSendmailがあるサーバと同じサーバ 宛てにメールを送る場合、アドレスが正しければもちろん正常にCGI は終了し、メールは届きますが、UserUnknownになるようなメールアド レスを指定して送ると、正常にCGIは終了せず、サーバエラーになっ てしまいます。 このようなサーバエラーを回避する方法はあるのでしょうか? どなたか教えて下さい。よろしくお願いします。 |
初めましてpearlともうします。 以下のことで大変困っており、この掲示板にたどり着きました。 どうぞアドバイスをよろしくお願いします。 NTサーバーのあるディレクトリ(aaa)以下の 複数のサブディレクトリ(x1,x2,x3...)にある全てのファイルを 階層構造を保ったまま、Solarisのあるディレクトリにそっくり 移動(転送)したいのです。操作できるのは、Solaris側のみで、 シェルスクリプトによる自動実行を目指しております。 当初は、ftpのオプションで簡単に出来ると思っておりましたが・・。 また、不定期にサブディレクトリおよびファイルの追加があり 出来得るならば、初回以降は差分ファイルの転送だけ行いたい のですが、実現可能な方法をどなたかご教示願えませんか? |
>>2209 ナナシサソ > おいらはこう書くべきと思うけどな そうですね、僕の書いたコードではうまく動きませんでした。 >>2211 ぷよ丸 要はエラーを無視できればよいのですか? 何もエラー処理を 考えずに書けば無視できるのではないかと思うのですが、 具体的にどのように sendmail を実行していますか? >>2212 pearl おそらくは rsync を使うのがベストではないかと思います (使った ことはありませんが)。それがダメなら wget かなぁ。あるいは Solaris に sharity-light を入れて SMB しゃべれるようにして、 NT 側は共有フォルダ (って言うのかな) にしておくとか (これも 使ったことはありません)。 |
「エラー処理を無視できれば・・・」で、ひらめいて、エラーログ を見ながらいろいろとやってると解決できました。 つまり、sendmailでメールを送るときに、同一サーバ宛てのメー ルアドレスが間違っていると、標準出力にUserUnknownのエラーが 書き出され、HTML出力前にそうなるから、エラー(BadHeader のエラーかな?)になっていたんですね。 それが分かったので、HTMLを先に出力してから標準出力を閉じ、 sendmailでメール送るという順序にすることで解決しました。 これだと、sendmailの実行時にエラーが出てもCGIからは無視し た感じになりますものね。 めでたしめでたしで解決したので報告します。 コメントありがとうございました。 これからもよろしくお願いします。 |
>>2207 68user > 要は、 > … cut … > ということでしょうか? そういう事だと思います。 以前書いた時に記述した近藤さんのサイトにも > @a[0]のような書き方はPerlのコードとして正しいものだからです。 と書かれていますし。 > perl に配列とリストという区別はあるんでしたっけ。 ん〜, スカラーで評価した時に, 配列は要素数を返し リストは最終要素を返す。 とかそういう話ではなくてでしょうか? でも, scalar (@a); とか書いたら, しっかり最終要素が吐き出されたので なんか, 自分でも @a と (@a) の違いはよくわかりません。 少なくとも > えっと、@a[0] と (@a)[0] は違うんですよね? はい。そうです。 とは言えなくなってしまいました。 # 読み返すとゴミのような発言ですが, ご容赦下さい。m(_ _)m |
訂正です。 >>2215 /tk > 最終要素が吐き出されたので 要素数が吐き出されたので |
はじめましてです。 『HTTPクライアントを作ってみよう』の辺を参考にHTTPクライアントを 作っているのですが、うまくいきません。 まず、”作ってみよう”の前にtelnetを使ってのところでつまずきました。 % telnet test.hoge.com 80 Trying 123.123.123.10... Connected to test.hoge.com. Escape character is '^]'. GET /test/test.html HTTP/1.0(リターン) とやると、『NOT FOUND』になってしまいます。 ※ブラウザでhttp://test.hoge.com/test/test.htmlは表示される。 ※ちなみに、http://123.123.123.10/test/test.htmlは『NOT FOUND』 おそらく、Apacheでヴァーチャルホストで設定しているのだと 思いますが、このような場合どのようにすればよいのでしょうか? 以上 宜しくお願いいたします。 |
>>2217 QDAK GET / HTTP/1.0(改行) Host: test.hoge.com(改行) (改行) |
>>2207 68user 「常駐システム」という言葉が悪かったですね、訂正します。 >Servlet コンテナが常駐して あえて言えば mod_perlに近いのでしょうか? まあ、そのうちに勉強して理解できるように頑張ります。 #なかなか時間が取れませんが… >>2217 QDAK ナナシサソ(舌を噛みそう(^^;)さんも書いていますが、 http://X68000.startshop.co.jp/~68user/net/http-4.html の「さらなる改善点・バーチャルホストに対応」をどうぞ。 |
>2213 アドバイス有り難うございました。検討した結果使うことは出来ませんでしたが大変勉強になりました |
はじめまして。 「UNIXの部屋」でコマンド集を ”かなり”の量コピーさせていただきました。現場用サブnoteに保存して活用いたします。 また何か困ったことがあればここに来ると思いますがそのときはよろしくお願いします。 ありがとうございました。 |
crontab -e user でcronを登録したのですが起動するときにどうも環境設定が user で ログインした状態と違うみたいです。 .cshrc を取り込まずに cron が 動いてるらしくパスやら環境変数やらまるで違うのです。 そこで以下のようにむりやり設定するようにしたのですが 35 18 * * * setenv LANG ja;setenv ・・・ 結果は駄目でした。 cronが起動される際の環境設定(環境変数やパス)はどこでどうやって 設定するのか分かりますか? |
下記No.2222 は解決したので無視してください。 申し訳ありません。 |
1./usr/local/reg/env/.cshrc.sun中で設定され ている a-e, l, m で始まる alias を実際の file に基づき説明 せよ(Mule の複数バッファの機能やカット,ペーストの機能を利 用すると良い). 2.ヒストリ機能で直前のコマンドを少し変更する方法を 調べろ.(cp foo bar と入力する代りに cp ffo bar と入力して しまった場合等に便利) 3.*等のグロッビング用の文字を普通に入力するための方法を 調べろ(ファイル名が * のものを作成せよ.ただし,Mule は使 用しない.set noglob もしない). 4.(t)csh において,~ は特別な意味を持つ文字である.この意 味を調べろ(複数あるかもしれない). (参考)Emacs には,shell という関数や manual-entry という関数が存在する. 1〜4 に対する回答を,Subject が Report 5 なる mail で, 10/25(木)までに ip-rep@j-lab.ee.aoyama.ac.jp に送ること. |
No.2224は学校の課題なんですが、メールは送らないでください。このアドレスは先生のなので、意味がないのです。僕は生徒で、答えがわかったら掲示板に書いてください。お願いします。 |
「掲示板に書いてください。」って・・・ 日本語の勉強が先だよな・・ 先生に苦情を送っちゃっていいですか? |
どうもすいませんでした。昨日からずっとインターネットで調べていたのですが、解らなかったので甘い考えでした。でも、自力でやって、二番だけわかったんですよ。やっぱりだめですよね楽しようとしたら。お返事まってます。 |
でも、愚痴を言っていいですか?先生って授業でやってないことを、レポートにすゆんですよ!!パソコン初めてやってるひとにっとっては、とっても大変なんですよ。学校には聞ける友達もいないし・・・どうしたら・・って考えたら、エキスパートに聞くのが一番かなって!でもいつも徹夜とかでやっても、間違ってると零点にするんですよ!努力を認めてくれないんですよ。ナナシサソさんは、UNIXできる方なんですか? |
ちなみに、二番のこたえは、 「Ctrl-P(以下C-p)を押すとhistoryの前に入力したコマンドが現れる直前に入力 したコマンドをcp foo bar と入力する代りに cp ffo bar と入力して しまった場 合には、C-pを押してcp ffo barのffoをoffと書き換えればよい。」 であってますかね。よろしければ、採点のほうよろしくお願いします。 |
>>2229 n > 学校には聞ける友達もいないし・・・ UNIX を勉強するより、 - 詳しい友達を見付ける。 - それほど親しくない友達でも、課題提出前くらいは親しげに話しかけられる ような社交性を身につける。 - 課題だからといって、問題をそのまま掲示板に書き込んでも反感を買うだけ、 ということを書き込む前に推測できるようになる。 - 仮に課題だとしても、そうは見えないようにうまくカムフラージュ できるような文章力を身につける。努力しているという姿勢を アピールする。 といったことを学ぶべきじゃないですかね。いや、ほんとに。 というわけで、 http://cocoa.2ch.net/unix/index.html あたりで再チャレンジしてみては。 |
どうもご迷惑をかけました。ひとつお願いがあります。これからは、ホントに解らない事だけを聞くので、これからもこの掲示板に書き込みたいのです。よろしくお願いします。68USERさん本当にアドバイスありがとうございます。これからは、気おつけます。これからもよろしくお願いしますと、言いたいのですがいいですか?ダメでしたら素直に書き込みはやめます。ちなみに、今回いのレポートは二番だけで送りました。くどいようですが、すいませんでした。そして、ありがとうございます。 |
「ネットワークプログラミングの基礎知識」で勉強させていただきました。とてもわかりやすくて入門にはピッタシカンカンでした。 難しかったのは、ソケットからの入力のバッファリングをOFFにする部分。以下のような説明をされてましたね。 > 26: select(SOCKET); $|=1; select(STDOUT); >ソケットに対してバッファリングしないようにします。 >これもおまじないだと思って下さい。 なかなかこれを理解できずにいたのですが、「プログラミング Perl 2nd」P146によると >autoflush HANDLE EXPR という関数があるらしいですね。"use FileHandle;"宣言が必要ですが・・。 autoflush SOCKET 1 ↑これなら、"おまじない"じゃなくて意味が通じ易くなるかもしれませんね |
おまじないというと、現時点で目先の理解の妨げになるから今はわからなくていいみたいな意味で書籍などでも使われてると思うので意味を通じさせるつもりは無いと思うんですよね。 説明が面倒(できない)でおまじないと言ってるわけじゃないですから。 でも、おまじないと言われて「ここでおまじないするのか」と素直に理解する人もあんまりいないですよね。 こういう時が、自分で調べ初めて自分で答えを見つける習慣を身に付けるチャンスになってるとおもうので良い表現だと思いますが。 |
>>2233 りょうすけ >説明が面倒(できない)でおまじないと言ってるわけじゃないですから。 ええ。そうですよね。"おまじない"という表現に異論はありません。枝葉の部分まで細かく説明するとかえってわからなくなっちゃいますもんね。 まぁ、プログラムの可読性という面でいうとautoflushも明快で良いかな?と思っただけです。(でも動作の仕組みを理解するにはselectでファイルハンドルを操作したほうが勉強になるのかも・・) |
こんにちは。 http://x68000.startshop.co.jp/~68user/net/rfc.html から リンクして頂いているThe WAYというサイトの管理人です。 このたび、RFC2616の日本語訳のURLが http://www.studyinghttp.net/rfc_ja/2616/ に変更いたしました。 是非リンクの変更をよろしくお願いします。 |
UNIX プログラミング FAQのサイトが http://www.adl.rd.nacsis.ac.jp/~moro/unix-programmer/faq-j_toc.html に移転しているようです。 |
また質問ですいません。 ActiveState 以外の Windows 用 Perl で、 自由に配布できるものってなにがおすすめでしょうか? 友人が自費出版本に CD-ROM を付けて売りたいのですが、 ActivePerl のライセンスがやたら面倒くさく、 (なんか 20 ページの英語の書類を書いてどうこう、、という、 手続きぐらいしろよって話なんですけど) なんとかならないか、という話です。 勝利条件としては ・Perl 5.005 移行で ・Windows で動き ・Jcode.pm が動く ということらしいです。 DJGPP 版、というのもあるようですが、 DOS 用ということで 16bit ですよね。 制限きついのかな、、? Cygwin はぁ、、? と聞いてみましたが、 Cygwin はその説明(bash の説明とか)だけで本1冊書かないといけない、 そうです。(そうかぁ、、?) でも cygwin.dll だけあれば Perl は動くのかな? (そういうインストーラー作れるかな?) (そんな部分的な部分を再版しても Cygnus 的に大丈夫なのかな?) もしご存知の方がいらっしゃればご教示ください。 LSI-C とか Borland C++ のフリー版とかで Perl をコンパイルしてみようかな、、。 |
あーなんかボケボケ書いたかも、、(DJGPP あたり、、) また落ち着いて謝りにきます、、;;; |
こんにちは Perlについて質問させてください。 %aa=(a=>1,b=>2,c=>3); %bb=(a=>4,b=>5,c=>6); %cc=(%aa,%bb); これでは%cc は a=4,b=5,c=6 のように上書きされてしまいます。 %cc が a=5,b=7,c=9 になるようにするにはどうしたらいいのでしょうか よろしくお願いします。 |
#質問で迷惑掛けてるので答で貢献;;; mo さん、はじめまして。 %aa=(a=>1,b=>2,c=>3); ていうことは、 $aa{a} = 1; $aa{b} = 2; $aa{c} = 3; と同じです。 a = 1; b = 2; c = 3; ではないです。 %aa はハッシュというものを作っています。 お手もとの参考書などで「ハッシュ」という言葉を調べてください。 で、%bb=(a=>4,b=>5,c=>6); ていうことは、 $bb{a} = 4; $bb{b} = 5; $bb{c} = 6; と同じです。 %cc=(%aa, %bb); ということは、上の結果、 %cc=(a=>1,b=>2,c=>3,a=>4,b=>5,c=>6); と一緒なので、 $cc{a} = 1; $cc{b} = 2; $cc{c} = 3; $cc{a} = 4; $cc{b} = 5; $cc{c} = 6; と一緒なので、結局 $cc{a}、$cc{b}、$cc{c} は2回代入されるので、 後のほうが有効になって、 $cc{a} = 4; $cc{b} = 5; $cc{c} = 6; となっているわけですね。 で、この場合、$cc{a}、$cc{b}、$cc{c} には、 それぞれ $aa{a}、$aa{b}、$aa{c} と $bb{a}、$bb{b}、$bb{c} の 合計が入って欲しいわけだから、 %cc = (a => $aa{a}+$bb{a}, b => $aa{b}+$bb{b}, c => $aa{c}+$bb{c}); とするか、 foreach (a..c) { # $_ が a から c までくりかえし実行 $cc{$_} = $aa{$_} + $bb{$_}; } とするか、%aa、%bb にどんなキーが入っていてもいいことにするには foreach (keys %aa) { # $_ に %aa のキーを次々に入れながら繰り返し実行★ $cc{$_} = $aa{$_} + $bb{$_}; } とするか、 %cc = map {$_ => $aa{$_} + $bb{$_} } keys(%aa); とするか。 ★がついたのが一番おすすめか? foreach、keys、a..c、map については適当な本を調べてください。(ひでえ、、) とりあえず foreach (a..c) { print "$_\n" } とか foreach (keys %aa) { print "$_\n" } とか、 @x = (1..5); @y = map{ $_ * 2 } @x; foreach (@x) { print "$_\n"; } とか動かしてみると面白いと思います。 #もっとあっと驚く回答があったら教えてください |
すいません 下で foreach (a..c) { と書いているのは foreach ('a'..'c') { と書かないと怒られます。(警告だけで、動作はするようです) ようは、a、b、c は変数の名前でなく文字列で、 %aa、%bb、%cc というハッシュのキーですね。 %aa というハッシュの、キーが 'a' の値にアクセスするには $aa{'a'} と書きます。ただしこの場合 a はハッシュのキーであると はっきりしているので $aa{a} と省略形で書けます。 同じハッシュでキー x の値に 550 を、キー y の値に 660 を入れるには キーと値を交互に指定するリストを使って %aa = ('x', 550, 'y', 660); と書きますが、キーと値の関係をはっきりさせるために カッコの変わりに => という記号を使えば %aa = ('x' => 550, 'y' => 660); と書けます。で、この場合は => の左側はハッシュのキーなので 省略して %aa = (x => 550, y => 660); とも書けるわけです。 でも、この '' 省略方式だと、 空白を含むキーが使えません。 %kg = ('yamada tarou' => 80, 'satou tamao' => 50); だと $kg{'yamada tarou'} に 80 が、$kg{'satou tamao'} に 50 が 入りますが、 %kg = (yamada tarou => 80, satou tamao => 50); だとエラーが出て動きません。 $kg{yamada tarou} も怒られて動きません。 下のプログラムで a, b, c というのは、 ハッシュのキーで「文字列」であることを覚えておいてください。 |
ふくしさん、 こんにちわ map の使い方はまだ理解できませんが ★のコードは理解できました。 ありがとうございました。 |
はじめまして。 2日前から調べているのですが、解決できずにここにたどり着きました。 CGIからCGIへデータを渡す際に print "Location: test.cgi?data=1\n\n"; ではなくPOSTでデータを渡したいのですが Socketを使うというのを発見し、いろいろ試したのですが まるで駄目です。(Socket自体、今まで使用したことも無いので(^^;) 具体的には送信元のCGIをindex.cgi、受信するCGIをtest.cgiとしますと index.cgiに下記のような記述をしてみたのですが test.cgiには何を書いてよいのかすら分かりません。 ご教授頂けないでしょうか よろしくお願いします。 ================================ #!/usr/local/bin/perl use Socket; $server='www.*****.com'; $port = 80; $port = getservbyname($port,'tcp') unless $port =~ /^\d+/; $iaddr = inet_aton($server) or die "$serverは存在しないホストです。\n"; $sock_addr = pack_sockaddr_in($port,$iaddr); socket(SOCKET,PF_INET,SOCK_STREAM,0) or die "ソケットを生成できません。\n"; connect(SOCKET,$sock_addr) or die "$serverのポート$portに接続できません。\n"; select(SOCKET); $|=1; select(STDOUT); $file='test.cgi'; $query='data=1'; $len=length($query); print SOCKET "POST $file HTTP/1.0\r\n"; print SOCKET "Content-Length: $len" . "\r\n\r\n"; print SOCKET "$query"; ================================ |
こんな感じでは? if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } @pairs = split(/&/, $buffer); foreach $pair(@pairs){ ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } $data = $FORM{'data'}; って、よくある掲示板のパターンですけど。(はずしてたらごめんなさい) というより、index.cgi は普通にフォームを使うだけでことは足りないのでしょうか? (Socket を使わずに) |
補足・その他です(^^; main.cgi→index.cgi→test.cgi となっていて main.cgiでフォームを使いindex.cgiにpostでデータを送信しています。 この受け取ったデータをtest.cgiにそのまま渡したいのですが、 その方法で悩んでいます。 test.cgiはメンバー入り口で受け取った会員ナンバーによって それぞれのページデータを読み込み表示するスクリプトになっていますので 直接 http://***.com/test.cgi?ID などとされて入室されるのは避けたいのです さらに考えた結果、index.cgiとtest.cgiをまとめてしまえば良い事に気付きました(^^; ですが、今後の為にもSocketを使えるようになりたいので もうちょっと努力してみます。 iwtaさんありがとうございます。 受け側では標準入力で良いのですね。 <SOCKET>をいろいろいじってみたりしてました。。。 ということは受けるほうでは use Socket; は不要なのでしょうか Socketの文献をいろいろ読んだのですが、POSTについての情報がどこも少なく (英文は読んでませんが) いろいろとお尋ねしてお手数をおかけします。 |
>>2232 名無しさん ご指摘ありがとうございます。どうやってわかりやすく説明するかは 非常に悩むところですね。autoflush は「存在自体あまり知られてない」 という痛い欠点があり、難しいところです。次回更新時に何かしら わかりやすい解説を書きたいと思っています。 >>2235 H-Hash > このたび、RFC2616の日本語訳のURLが > http://www.studyinghttp.net/rfc_ja/2616/ に変更いたしました。 ご連絡ありがとうございます。修正いたしました。 >>2236 Ka23 > UNIX プログラミング FAQのサイトが > http://www.adl.rd.nacsis.ac.jp/~moro/unix-programmer/faq-j_toc.html > に移転しているようです。 こちらもありがとうございます。後ほど修正しておきます。 >>2243 sio test.cgi は同じサーバにあるのですか? で、ブラウザから直接呼び出すこと はないのですか? ならば CGI じゃなくてただのスクリプトですので、 main.cgi からは open(IN, "/foo/bar/test.cgi ID |"); と呼び出せばいいでしょう。ソケットを使う必要はありません。 もし test.cgi が同じサーバにあって、これまでは CGI として動いていたけ ど、これからはブラウザから直接参照させたくない、ということならば、 $ENV{REQUEST_METHOD}='GET'; $ENV{QUERY_STRING}='data=1'; open(IN, "/foo/bar/test.cgi |"); と、WWW サーバの代わりに適切な環境変数をセットしてからスクリプトを実行 してやればよいでしょう。 test.cgi が別サーバにあるならば、直接スクリプトを実行することはできな いので、そのときはソケットを使いましょう。 > print SOCKET "POST $file HTTP/1.0\r\n"; > print SOCKET "Content-Length: $len" . "\r\n\r\n"; > print SOCKET "$query"; 送ったはいいけど、これでは結果を受け取っていませんし、ブラウザに何も表 示していません。 while (<SOCKET>){ # ヘッダを捨てる m/^\r\n$/ and last; } print "Content-type: text/html\n\n"; while (<SOCKET>){ # ボディのみ表示 print $_; } とかいうのをこの後に付けて下さい。 > POSTについての情報がどこも少なく あまり書くことがないからでしょう。気を付けるのはContent-length を付け ること、くらいじゃないでしょうか。 あと、CGI 経由で HTTP クライアントを開発するのはやめましょう。まずはコ マンドラインから動くような HTTP クライアントを作り、完成したら CGI 経 由でも動くように改造しましょう。でないと、問題の切り分けが非常に面倒に なります。 |
68userさんありがとうございます。 やりたい事が全てご指摘通りです(^^; open関数のパイプの使い方すら知りませんでした。 今やっと説明されているページを見つけ http://www.kt.rim.or.jp/~kbk/perl5.005/perlipc.html 勉強中です。 Socketについてもようやく理解できました。 データを受け取った側で、ブラウザ処理をしようとするから 訳が分からなくなっていたようです。 今日はperlに浸かり勉強する日にします p(..) |
X Window Systemを立ち上げるときに、 (**) stands for supplied (--) stands for probed/default values (**) ... (**) ... というメッセ-ジが出て立ち上げることができません。 これはいったいどういうことなのでしょうか。 |
正確には (**) stands for supplied, (--) stands for probed/default values (**) ... (**) ... でした。 |
>>2247 sio > データを受け取った側で、ブラウザ処理をしようとするから > 訳が分からなくなっていたようです。 まず、全体の構成を見直すべきでしょうね。 - main.cgi に統合する。 - test.cgi はユーザ名を引数で受け取り、ログイン可能なら 戻り値 0 を、ログイン不可なら戻り値 1 を返す。 などと現在の仕様を比べ、一番良さそうなものを採用しましょう。 >>2249 初心者 > (**) stands for supplied, (--) stands for probed/default values それは起動時に (成功・失敗にかかわらず) 必ず表示されるメッセージです。 また、OS などの環境が何も書いていないので、答えられる人は いないでしょう。 # 僕は XFree86 やらビデオカードやらには詳しくないので、 # 書いてもらっても答えられないかもしれませんが。 |