「ネットワークプログラミングの基礎知識」で勉強させていただきました。とてもわかりやすくて入門にはピッタシカンカンでした。 難しかったのは、ソケットからの入力のバッファリングを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 やらビデオカードやらには詳しくないので、 # 書いてもらっても答えられないかもしれませんが。 |
こんにちは。いつもお世話になってます。 Perlについて質問があります。 各ファイルに ”ー1”と ”ー2”が含まれた行があって、それを区切りに2つのファイルに分けたいのですが、なかなかうまくいきません。 EXAMPLE: *File0001の内容ーー 0001ー1 C100 Open C101 NG 0001ー2 C102 Open C103 Open *File2の内容ーー 0002ー1 C200 Open C201 NG C202 Open 0002ー2 C203 Open C204 NG この0001と0002の2つのファイルを0001ー1と0001ー2、0002ー1と0002ー2の4つのファイルに分けたいのです。 下のスクリプトは全然間違ってるのですが、/-1/ と /-2/ があった行数を記憶して、後から 行の番号を比較してどうにか区切ろうと思ったのですが、やっぱり最初は$barcode22=0だし、全然駄目です。 普通、どのようにするのか教えて頂けませんか? よろしくお願いします。 sub read_file_to_array { my($file)=$filename; open (FILE, "<$dir\\$database\\Defect\\$file") or die "Can't open $file\n"; $line=0; while (<FILE>){ if ($_ =~ /-1/) {$barcode11=$.}; if ($_ =~ /-2/) {$barcode22=$.}; if ($line > $barcode22) {print "$_ ";}#試しにSTDOU#に出力してみるだけ } $line++; } |
動くかわからんけどとりあえずできた sub read_file_to_array { #←? my $file = shift; open (FILE, "<$dir\\$database\\Defect\\$file") or die "Can't open $file\n"; open (OUT1, ">$dir\\$database\\Defect\\${file}_1") or die; open (OUT2, ">$dir\\$database\\Defect\\${file}_2") or die; my ($flag1, $flag2); while (<FILE>) { if ( /-1/ ) { $flag1 = 1; } if ( /-2/ ) { $flag2 = 1; $flag1 = 0; } if ($flag2) { print OUT2; next; } if ($flag1) { print OUT1; next; } } } |
うぎょぎょ。。if ($flag2) {〜の部分の順番が逆になっちゃってるし。ダサ・・ closeしてないし・・終了時に閉じられるから大丈夫かアハハ |
>>2251 ミング 必ずデータの先頭が .*-1 か .*-2 であるなら while (<FILE>) { if ( /-[12]/ ){ chomp; open (OUT, ">$dir\\$database\\Defect\\$_") or die; next; } print OUT; } かなぁと思うんですが、違うかな? 業務用プログラムかだとちゃんとエラーチェックしないとまずい でしょうが、データの内容がある程度保証されているなら、こんな テキトーな感じでよろしいかと思います。 |
ナナシサソさん、68userさん 出来ました!! ご指導どうもありがとうございました。 |
二日連続の質問になってしまいますが、よろしくお願いします。 No.2251のInput file名は"Ab00010", "Cd00020", のように文字と数字からなっているのですが、Outputは別のDirに"Ab00010" "Ab00011" "Cd00020" "Cd00021"というように、/-2/の部分は”元のファイル名+1”というファイル名にしたいのですが、、、、 800ページあるらくだの本も一応買ってきたのですが全然分からないので、ウェブサイトで調べてみたのですが、唯一これかな?と思ったのが: $string="abcd771gfds"; $string=~/(\W+)\s+(\d+)/; とすると、$1=abcd, $2=7771, $string=abcd771gfds になる、とあったんですが、 試してみると$1=" ", $2=" ", $string="4294967295"になってしまい、訳が分からなくなってきたのですが、これは全然違うアプローチなんでしょうか? どうしたら ”Ab00011”が作れるんでしょうか? |
$flag == 2 ? $string ++ : ; でいいと思う・・ゲロゲロ |
UNIXの歴史について、知ってる範囲で教えてください。 できれば、メールの方がありがたいです。 |
>>2257 ナナシサソ でもアルファベットと数字からなってるので、数字だと見てくれないみたいなんですけど、、、 |
>>2259 ミング Perlは妙なことが出来たり・・ 多分うまくいくと思うんだけどな・・ |
ミングさんはじめまして。 まず abcd771gfds の件です。 #!/usr/bin/perl $string = "abcd771gfds"; $string =~ /(\W+)\s+(\d+)/; print "1:<$1> 2:<$2> string:<$string>\n"; を動かすと 1:<> 2:<> string:<abcd771gfds> と出ました。 \W+ は、英数字(word)以外1文字以上なので、なくてあたりまえ。 \s+ は、空白文字(space)1文字以上なので、なくてあたりまえ。 \d+ は、数字(digit)1文字以上だが、前に \W も \s もないのでダメ。 もし、$1 に abcd、$2 に 771(7771 は間違い?)を入れようとするなら、 $string =~ /^([a-zA-Z])(\d+)/; とかでしょうか。 ^ は文字列の先頭を示します。 これをやらないとどこからサーチしはじめるかわからん。 [a-zA-Z] は英字。\d は数字。 (わー、目からウロコ。英字のカンタンな文字クラスってないんですね) #!/usr/local/bin/perl $string = "abcd771gfds"; $string =~ /^([a-zA-Z]+)(\d+)/; print "1:<$1> 2:<$2> string:<$string>\n"; を動かすと 1:<abcd> 2:<771> string:<abcd771gfds> となりました。 |
ミングさん、つぎにファイル名生成の件です。 もっとカッコいいプログラムはいくらでもあるかと思うんですが、 ここではわかりやすく確実に動くのを取りました。 #!/usr/bin/perl $fname = "Ab00010"; $fname =~ /([a-zA-Z]+)(\d+)/; $fname_a = $1; # 英字部分 $fname_n = $2; # 数字部分 $fname_n++; # 数字部分に1加算 $fname_n = sprintf "%05d", $fname_n; # 先頭にゼロを詰めて5文字に $fname = $fname_a.$fname_n; print "fname: $fname\n"; $fname_n++; # 数字部分に1加算 $fname_n = sprintf "%05d", $fname_n; # 先頭にゼロを詰めて5文字に $fname = $fname_a.$fname_n; print "fname: $fname\n"; $fname_n++; # 数字部分に1加算 $fname_n = sprintf "%05d", $fname_n; # 先頭にゼロを詰めて5文字に $fname = $fname_a.$fname_n; print "fname: $fname\n"; 実行してみます。 fname: Ab00011 fname: Ab00012 fname: Ab00013 ポイントは sprintf でしょうか。 これは文字列をいろんな形で整形しますが、汎用性が高すぎるので、 sprintf "%0n", m; n はケタ数、m は数字 で、m を n ケタ、ゼロ詰めで表示するとだけ今はご説明します。 ただですね、これだと1ファイルが10個以上のサブファイルに分けると Ab0002n に突入してしまって、 もし Ab00020 という元ファイルがあると名前が衝突しますが、 それはいいですか。 |
>>2258 オハツ > UNIXの歴史について、知ってる範囲で教えてください。 「UNIXの1/4世紀」 http://www.ascii.co.jp/books/detail/4-7561/4-7561-3659-1.html を読みましょう。 |
ふくしさん、ナナシサソさん、 ご教授どうもありがとうがざいました。 やっと出来ました。 とても分かり易く助かりました。 今後もいろいろと宜しくお願いいたします! |
はじめまして。教えていただきたいことがあります。 こちらを参考に、perlのネットワークプログラムを作りたいと思っています。OSはPlamo Linux、perlは5.005です。 やりたいのはローカルネットワーク上に、ブロードキャストでメッセージを送って、ポートを開いている全部のコンピュータがそのメッセージを受信するというものです。 試験として #!/usr/local/bin/perl use IO::Socket; $socket = IO::Socket::INET->new( PeerAddr => '192.168.0.255', PeerPort => 2425, Proto => 'udp', ); if ( ! $socket ){ die "接続できませんでした。 $!\n"; } print $socket "test"; $socket->flush(); $socket->close(); と、いうのを動かしてみました。ブロードキャストである192.168.0.255ですから、2425でポートを開いている他のPC(VBのwinsockを使いました)にtestが表示されるかと思ったのですが、 > 接続できませんでした。 不正なファイルデスクリプタです というエラーが返って来てしまいます。 このエラー、192.268.0.3の様にIPを指定すると、出現しません。 いろいろとサーチエンジンなどもあたったのですが、どうしてもこの原因がつかめず、困っています。 perlを使って、udpとブロードキャストアドレスでネットワーク通信されている方がいらしたら、ブロードキャストアドレスをどうやって指定しているか、教えていただけませんでしょうか? よろしくお願いいたします。 |
>>2265 武田一浩 broadcast するときは、socket option の設定 $socket->setsockopt(SOL_SOCKET, SO_BROADCAST, 1) || die "$!"; が必要です。 IO::Socket じゃなくて普通の Socket モジュールを使うなら setsockopt($socket, SOL_SOCKET, SO_BROADCAST, 1) || die "$!"; ですね (これは IO::Socket で生成したソケットに対しても有効です)。 ただ、こちらで試した限りでは、 > 接続できませんでした。 不正なファイルデスクリプタです というエラーは出ませんでした。if ( ! $socket ) でエラー になっているということは、何か別の原因があるような気がします。 ちなみに printf $socket "1:%d:name:hostname:%d:ext\0group", time(), 0x1; で参加通知です。 |
No. 2266 # 68user さん、リプライありがとうございます。 次の様に修正してみました。 #!/usr/local/bin/perl use IO::Socket; $socket = IO::Socket::INET->new( PeerAddr => '192.168.0.255', PeerPort => 2425, Proto => 'udp', ); $socket->setsockopt(SOL_SOCKET, SO_BROADCAST, 1) || die "$!"; if ( ! $socket ){ die "接続できませんでした。 $!\n"; } printf $socket "test"; $socket->close(); 結果は、 Can't call method "setsockopt" on an undefined value at ./udptest.pl line 11. でやはり駄目でした。 192.168.0.255のアドレスを、特定のPCのIPに設定すると、そのPCにはtestの表示が出ますから、スクリプトそのものにはエラーがないのだと思いますが、なぜか私の環境ではブロードキャストアドレスが使用できない(?)のではないかと思います。 とりあえず、Perlやスクリプトには異常がなさそうなので、Plamo Linux のMLにでも質問をあげてみることにします。 ありがとうございました。 |
・・ <% strPathName = "HTTP://××/××/××/○○○.xls %> <a href=<% =strPathName%> ><% = strData(cnt)(0)%></a> ・・ </html> 上記のようにリンクしたいパス名を設定しました。 やりたいことは、 既存のダイアログ『ファイルのダウンロード画面 次の場所からファイルをダウンロードするように選択しました』 を表示させてからExcelを表示したいのですがどうしたらいいですか? 現象として、 すぐにExcelが表示されてしまいます。 |
はじめまして、どうしても分からない事があるので質問させて下さい。 HTMLの中にSSIでCGIのファイルを読み込ませようとしたのですが <!--#include file="test.cgi" --> だとOKなのですが <!--#include file="test.cgi?id=kouji" --> のように引数を付けると [an error occurred while processing this directive] とエラーになってしまいます。 「?」の部分からエラーが表示されるのですが、これを回避する方法を教えて下さい。 webも調べてみたのですが、結局分かりませんでした。 http://tohoho.wakusei.ne.jp/wwwssi.htm こちらの下の方に書いてあるexecの例で >○ <!--#exec cgi="xx.cgi"--> >× <!--#exec cgi="xx.cgi arg1 arg2"--> >× <!--#exec cgi="xx.cgi?arg1+arg2"--> >× <!--#exec cmd="xxx.pl"--> >○ <!--#exec cmd="/bin/xxx arg1 arg2"--> >○ <!--#exec cmd="./xxx.pl arg1 arg2"--> これの○で書いてあることみたいに引数を渡そうとしても駄目でした・・・ よろしくおねがいします。 |
なんでも聞いてすいません。 Windows 2000 以降についてくる「メモ帳」の「名前をつけて保存」では、 ISO-2022-jp および Shift_JIS(正確には Windows 932 および Windows 1152)のことを 「ANSI」と呼び習わしていますが、これはどういう経緯でしょうか? ANSI といえばアメリカの工業規格で、ASCII や ISO-8859-1 を規定してるもんだと 思い込んで生きてきましたが、Delphi の入門本とか ML とかを見ても 「ANSI 文字列を Unicode に変換、、」とかいって、 Windows で使える Unicode 以外の文字、という意味で ANSI 文字列、 と書いてあるようなんですが、この言葉は正しい業界用語なんでしょうか? それとも Windows ローカル語? この言葉のスコープはどこまでなんでしょうか? 「メモ帳」といえば UTF-16LE-BOM のことを「Unicode」、 UTF-16BE-BOM のことを「Unicode Big Endian」、UTF-8 のことを「UTF-8」と言ってますが、 これなんかも業界用語なのか Windows 語なのか単なるメモ帳の開発者の気の迷いなのか わかりません。(あ、でも Word も共通なんだよな、、) 場違いでしたら情報のポインタや、討議するのにふさわしい掲示板等教えてください。 よろしくお願いいたします。 |
とても素人で、申し訳ないのですが、ご存知の方がいらしたら、教えて下さい。ハードは、IBM社のRS/6000を使用しています。kシェルを作成して下記の作業を行いたいと考えています。 複数のテ゛ィレクトリーに10〜30のファイルが存在しています。 各ファイル中に/usr/kokyakuと記述があれば、/usr/okyaku と変更したいと考えています。sedコマンドを利用すればそれぞれのファイルの中身を変更させることは可能であることは、分かったのですが、対象の ファイル数が多い為、該当のディレクトリーにcdし、 grep -l'/usr/kokyaku' * > filename などで、対象ファイル名を保存したファイルを作成し、そのファイルを自動的に読み込んでファイル名をいちいち指定せずにsedコマンドを実行でき ないものでしょうか?awkコマンドでファイル名が保存されているファイルを読み込み、sedコマンドの出力ファイルを$1の名前にするなどは可能なのでしょうか? ちなみに、イメーシ゛的には、カレントディレクトリーの下のファイル(*)の内容を自動的に置換してほしいのですが… sed 's/\/usr\/kokyaku/\/usr\/okyaku/g' * >*の出力 つたない説明で、申し訳ありませんが、お知恵を頂けたらありがたいです。 |
みーさん: Perl ですいません、一応テストもしました。 ミソは find コマンドの出力を ` ` で配列に入れて for で処理している、、(フツーやんねえかな、、) #! /usr/local/bin/perl -w # kokyakuokyaku $tmp = "TempFileDayooon"; # 中間ファイル。存在しないファイル名を選ぶこと for $file (`find . -print`) { chomp; if (-f $file) { open FILE, $file; open TMP, ">$tmp"; while (<FILE>) { s|/srv/kokyaku/|/srv/okyaku/|g; print TMP; } close TMP; close FILE; rename $tmp, $file; } } |
(一応)ふつー File::Find 使うよね。知ってるー (^^;;; |
ふくしさんどーもありがとうございました。大変申し訳ないのですが、findコマンドの使い方をよく理解していないので、どなたかお教え頂けないでしょうか?私の理解としては、ディレクトリー内の条件にあったファイルを探す時に使うコマンドだと思っていたので、例えば、頭に’m*’がつくファイルを探したりする時に使用するものだと思っていました。1つあるいは複数のファイルから、指定パターンに合致した行を探しその対象のファイル名を表示させる為には、grepしか使用出来ないと思っていたのですが、findコマンドで、ファイル(シェル)中に/usr/kokyakuと記述されているファイル名をfindコマンドで探す場合は、どのように記述すればよいのでしょうか? また、ふくしさんの記述して下さった各行の処理内容をもう少し詳細に教えて頂けないでしょうか?お手数をおかけいたしますが、よろしくお願いいたします。 |
>>2267 武田 一浩 $socket = IO::Socket::INET->new( PeerAddr => '192.168.0.255', PeerPort => 2425, Proto => 'udp', ) || die "$!"; とした方が、どこでエラーが出ているかを把握しやすいでしょう。 > とりあえず、Perlやスクリプトには異常がなさそうなので、 そうですね。perl か OS の問題ではないかと思います。 あと、ifconfig -a して、デバイスに fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 と、「BROADCAST」が付いていてブロードキャストに対応していることを 確認して下さい。もしかして ppp デバイスだったりすると付いてないかも。 >>2268 もみの木 > 現象として、すぐにExcelが表示されてしまいます。 要は、ASP は全く関係なくて <a href="HTTP://××/××/××/○○○.xls">hoge</a> というリンクをクリックしたときの挙動ですよね? Windows は よくわからないので、 http://www.parkcity.ne.jp/~chaichan/bin/qanda.cgi?modefg=9 で質問した方がよろしいと思います。 あとの話題は後ほど。 |
みーさん: なんかすいません。 たぶんぼくのやり方すごく非標準的なので、 もっとカッコいい方法はいくらでもあると思うんですが、、 find はファイル名の検索、 grep はファイルの中の文字列の検索、 で、合ってます。 ぼくのスクリプトでは各ファイルの中での文字列検索/置換を 自分で書いています。(while のあたり) #! /usr/local/bin/perl -w # kokyakuokyaku $tmp = "TempFileDayooon"; # 中間ファイル。存在しないファイル名を選ぶこと for $file (`find . -print`) { chomp $file; # すいません、ココ、間違ってました if (-f $file) { open FILE, $file; open TMP, ">$tmp"; while (<FILE>) { s|/srv/kokyaku/|/srv/okyaku/|g; print TMP; } close TMP; close FILE; rename $tmp, $file; } } `UNIXコマンド` …バッククォート(`)でUNIXのコマンドを囲むと、 出力結果をリストで返す for $変数 (リスト) { ...なんだかんだ... } …リストの要素を1個ずつ $変数 に入れながら、 「なんだかんだ」の部分を繰り返す。 上では find の結果を1行ずつ $file に入れて処理している。 それはカレント ディレクトリ以降のファイル/ディレクトリである。 % find . -print …カレント ディレクトリ以降のファイル/ディレクトリを一覧表示する。 chomp $file; …$file(find の結果の1行)の末尾から改行を取り除いて、 ファイル/ディレクトリ名として正しいものにしている -f 文字列 …「-f」はファイルテスト演算子のひとつ。 右に来る文字列がふつうのファイルだったら真を返す。 ここではディレクトリをはじいている。 open FILE, $file; …ファイル名 $file のファイルを入力で開いて、 ファイルハンドル FILE で入力アクセスできるようにする open TMP, ">$tmp"; …ファイル名 $tmp のファイルを出力で開いて、 ファイルハンドル TMP で出力アクセスできるようにする while (<FILE>) { ...なんだかんだ... } …ファイルハンドル FILE で読み込まれる ファイル $file(ここでは find の結果のうち、ファイルのみ)の 1行1行を、$_ という特殊な変数に入れながら 「なんだかんだ」の部分を繰り返す。 $file を読み終わったらループを脱出する s|/srv/kokyaku/|/srv/okyaku/|g; …デフォルトの作用対象である変数 $_ に対して、 「/srv/kokyaku/」を「/srv/okyaku/」に置換する。 s は substitute(置換)、g は global(全体的に)の略。 g を略すと1行に1回しか置換しない print TMP; …TMP ファイルハンドルに、デフォルトの作用対象 $_ を出力する ここで $_ は FILE の1行1行に 「/srv/kokyaku/」=>「/srv/okyaku/」の置換を施したものである close TMP; close FILE; …ファイルを「閉じる」。 (ファイルアクセスのために確保されていたメモリなどの資源を解放する) rename $tmp, $file; …置換する前のファイル名が $file、 置換したあとのファイル名が $tmp なので、 $tmp を $file に改名する。 これで置換したファイルで元ファイルは上書きされ、 中間ファイル TempFileDayooon は消えてなくなる こんな感じでしょうか。 |
>>2271 初心者みーです。 複数ファイルの中身を一括置換する、という目的に限れば、 http://x68000.startshop.co.jp/~68user/unix/pickup?perl の perl -pi.bak -e .. ところをどうぞ。 > findコマンドで、ファイル(シェル)中に/usr/kokyakuと > 記述されているファイル名をfindコマンドで探す場合は、 > どのように記述すればよいのでしょうか? いろいろありますが、以下のような感じです。 % find . -exec grep -l /usr/kokyaku {} \; … 機能は実現できるけど、遅い。 % grep -l * … ファイル数が多すぎるとダメ。ファイル数が数千程度ならこれでいいでしょう。 % find . -print | xargs grep -l … ファイル数が多くても OK。 % find . -print0 | xargs -0 grep -l … ファイル数が多くても OK。ファイル名に改行が含まれていても OK。 今回は grep -l でいいのではないでしょうか。 あと、 > sed 's/\/usr\/kokyaku/\/usr\/okyaku/g' * >*の出力 で実現できることはわかっているので、後はこれを複数のファイルに対して実 行すればよいのです。いろいろ方法はありますが、お勧めなのは「文字列をい じくってコマンドラインを作り、sh に喰わせる」方法です。 grep -l * で、 file1 file2 file3 という出力が得られるとします。次に grep -l * | sed "s|\(.*\)|sed 's./usr/kokyaku./usr/okyaku/.g' < \1 > out/\1 | " とすると、 sed 's./usr/kokyaku./usr/okyaku/.g' < ./file1 > out/./file1 sed 's./usr/kokyaku./usr/okyaku/.g' < ./file2 > out/./file2 sed 's./usr/kokyaku./usr/okyaku/.g' < ./file3 > out/./file3 という文字列が得られます。それをよく確認して、よさそうなら grep -l * | sed "s|\(.*\)|sed 's./usr/kokyaku./usr/okyaku/.g' < \1 > out/\1 | " | sh と末尾に | sh を付ければ、そのまま実行されます。 正しいコマンドラインができるまでは「| sh」を付けずに試行錯誤すれば よいので、いろいろなところで応用が効くと思います。 |
>>2270 ふくし > 場違いでしたら情報のポインタや、討議するのにふさわしい > 掲示板等教えてください。 場違いではないですが、わかりません。会社では Windows Me だし (笑) ふさわしいところは… fj.kanji くらいしか思い付かないなぁ…。 後は >>2269 kouji ですが、これはちょっと調べてから回答したいと思います。 |
ふくしさん、68userさんどうもいろいろありがとうございました。とっても勉強になりましたし、助かりました。perl -pi.bakの方法で、一括変換変換させる方法をバックアップファイルも一緒に作成できるので、実施したいと思います。簡単なテストをしたところ、大丈夫そうでしたので…。他の方法も、今後時間のある時に試してみたいと思います。迅速なご回答と親切な説明、本当にありがとうございました。 |
始めましてm(__)m UNIXを学校で使っています。 家では使えないんでしょうか? 家にパソコンはあるのですが…(-.-;) |
ぷたろさん、はじめまして。 ・家のパソコンに UNIX(FreeBSD とか Linux)を入れる。 いろんな本に、すでに入ってる OS(Windows ですか?)と切り替える方法が 書いてある<=管理が大変だけど ・家のパソコンをインターネットにつなぎ、 会社のパソコンに Telnet(Windows だと Teraterm が有名)で ログインする。リモートコントロールの感覚ですね。 グラフィックなソフトは使えないけど、、。 この場合は学校の管理者の人に聞いてみてください。 |
ふくしさん、ありがとですm(_ _)m 家のパソコンのOSはwindowsです。 外付けのハードを買って そこにLinuxを・・・。 ってな具合にはいかないですか? う〜ん、どうしよう(--;) |
>ぷたろさん いちから Linux を入れて自分で管理する気があるんだったら、可能ですよ。 いまの Windows の HDD に余裕があるんだったら、 同じ HDD にパーティションを切って入れてもいいし、 新しい HDD を買う予定があるんだったら、ぷたろさんがおっしゃるように 外付けのでも新しい内蔵のでも入れて、そこに入れてもいいし。 要するに、今使ってる Windows のマシンに新しく Linux を入れて、 Linux と Windows と切り替えて使うことは可能です。 体験するだけだったら、ここの会社 http://www.mlb.co.jp/ のが 面白そうです。Live Linux というのは Windows マシンに CD-ROM を 突っ込むと Linux 体験が出来るそうです。あと MLD5 というのは Windows のパーティションを壊さずに(フォーマットせずに)そのまま Linux を入れられ、Linux は Windows からハードウェアの設定を 読みこんで自動インストールしてくれるそうです。 ぼくはどっちも使ったことないし、設定は人に任せているのでくわしいことは わからないのですが、トライしてみたらどうでしょうか。 |
ふくしさん、親切にありがとうございますm(_ _)m 同じHDDにいれるんだったら HDDを分割するソフトがないと ダメですよね? HDDを新しく買って Linuxを一からやってみようかな。。。 Linuxを自分で管理って大変なんですか? 「いちから Linux を入れて自分で管理する気があるんだったら」 ってあるから大変そう・・・。 う〜ん。新しい事をするのは難しいです(-.-;) |
>ぷたろさん HDDにパーティションを切るソフトは、商用のLinuxにはたいてい ついてきます。少なくともMLD5にはついてきます。 あと、FIPSというフリーのパーティションソフトもあります。 新しいHDDを買ってきてもいいですが、 どのディスクからブートするかを指定する何らかの手段が必要です。 この掲示板だけではフォローしきれないと思うので(^^; 適当な入門用Linuxを買ってみるといろいろ書いてあると思います。 それから大変かどうかですが、それは人によります。 最近の入門用のディストリビューションは 最初からなんでも使えるようになっているようですが、 もしネットワークにつなぎっぱなしにする環境なら、 不要なサービスを殺さないと外からどんどん入ってこられます。 最低でも root(管理者用ユーザー)のパスワードは設定してください。 では、がんばってくださいー。 |
たびたび申し訳ありません。また、教えて下さい。perlのコマンドでカレンドディレクトリの中の複数ファイルを対象に、該当の文字(/usr/kokyaku)を特定の文字(usr/okyaku)に置換させようと考えています。下記のコマンドを実施したところ、特定文字を含まないファイルについても、バックアップファイル**.bakが作成されてしまいます。該当のファイルのみバックアップファイルを作成することは可能でしょうか? perl -pi.bak -e 's/\/usr\/kokyaku/\/usr\/okyaku/g' * カレントディレクトリーには、20ほどのファイル(ほとんどがシャル)が存在し、上記文字を含むファイルが6つほど存在するので、6つのみファイルの中身を置換し、バックアップファイルも6つのみ作成してほしいのですが、わがままなお願いでしょうか?お手数をおかけいたしますが、簡単な方法があれば教えて下さい。 |
>>2286 みー > バックアップファイル**.bakが作成されてしまいます。 おそらくそういう仕様です。 で、どうすればいいと思いますか? 不要なファイルができて困るのなら、不要なファイルを作らないように するか、不要なファイルを削除すればいいわけで。 まずは自分で考えてみて下さい。 |
今晩は、初めまして。 突然ですが質問して宜しいでしょうか。 ホスト名と、IPアドレスの頁を読ませていただいたのですが、まだ良く分かっていないので、この場をお借りして質問させていただきます。 IPアドレスが微妙に違って、でもホスト名が同一の場合、それは同一のパソコンからアクセスしていると解釈していいのでしょうか? すみません、物知らずで…教えてくださると嬉しいです。 |
68userさん、回答ありがとうございました。仕様でそうなっているのでは、仕方がないので諦めて、カレトディレクトリーに該当ファイル数が少ない場合はファイルを指定し、該当ファイル数が多い場合は、不要なファイルを後で、rmで削除することにします。 |
>みーさん えーシェルスクリプトも Perl もつかえる環境なのに手動でやるんですか、 それはもったいない、、失敗もしそうだし、、 >TAKEさん 相手がプロバイダーの場合など、同じホスト名でも ちがうパソコンのことがあるのでは、、。 |
回答が遅くなったので、もう見ておられないかもしれませんが… >>2269 kouji exec cgi、include file には引数を渡せない、という仕様の ように思えます。ソースを読んでみたのですが、いまいち わからなかったので自信はないのですが。 ただし、include virtual なら <!--#include virtual="./a.cgi?a=b&c=d" --> というふうに書けば引数を渡せます。 どうしても include file、exec cgi で、ということなら <!--#set var="QUERY_STRING" value="hoge=1" --> <!--#include file="./a.cgi" --> <!--#exec cgi="./a.cgi" --> などとやってみたのですが、QUERY_STRING の値は上書き されてしまうようなので、これはダメ。よって、 <!--#set var="MY_QUERY_STRING" value="hoge=1" --> <!--#include file="./a.cgi" --> <!--#exec cgi="./a.cgi" --> などとして、CGI 側では QUERY_STRING でなく MY_QUERY_STRING を 使う、という方法しかないように思えます。 まぁそんなことをするくらいなら、素直に include virtual を 使った方がよいでしょうけれども。 |
>>2236 Ka23 > UNIX プログラミング FAQのサイトが > http://www.adl.rd.nacsis.ac.jp/~moro/unix-programmer/faq-j_toc.html > に移転しているようです。 遅くなりましたが修正いたしました。 # http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/org/link-book.html が、今 www.adl.rd.nacsis.ac.jp には unreachable なので、 そのページはまだ見ていません。 |
>>2159 Nira > そういえば、httpsの取得に良いサイトを発見しました。 > https://www2.ggn.net/cgi-bin/ssl です。 http://x68000.startshop.co.jp/~68user/net/ssl.html に反映しました。 # http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/org/ssl.html 他にも「前に情報提供したのにまだ反映されていない」という部分が ありましたら、ご指摘いただけると幸いです。 |
>68userさん ありがとうございました。 include virtualを使います。 |
ふくしさん、ご回答有難うございました。 参考になりました。 |
Perl の質問ですが、(101) とか ($x) とかいう式は、 ・スカラーをカッコに入れたもの と思われるのでしょうか、 ・要素数が1個のリスト と思われるのでしょうか。 ($x) = (6,7,8); と書くと、$x には 6 が入るので、($x) はリストのようです。 でも、そのあと、 $n = ($x); と書くと、$n には ($x) の要素数 1 ではなく、$x の値 6 が入ります。 $n = (); と書くと、$n にはゼロは入らないで undef が入るようです。 ということは、() は空リストではなく、 「無」をカッコで囲んだ式が入ってるということでしょうか。 というのは、空リストだとすると、 $n には空リストの要素数 0 が入るように思うからです。 |
みなさん、はじめまして。 ちょっと、C言語の質問をさせてもらっていいっですか? 自分は、redhadのLinux2.1を使っているのですが、 タイム関数の #include<time.h> が、使うことが出来ませんが、Linuxにおいては タイム関数は対応していないのでしょうか? ある、実験において実験結果をグラフにしようとしている のですが、タイム関数が使えないために、横軸がLOOP回数での 表示しか出来ずにグラフが成立しなくて困っています。 どうか、良きアドバイスをいただけないでしょうか? お願い致します。 |
>>2296 ふくし @a をスカラーコンテキストで評価すると、@a の要素数が得られますが、 (6,7,8) をスカラーコンテキストで評価すると最後の要素の 8 が 得られます、ってことで回答になってますでしょうか。 >>2297 ひろ POSIX にもある関数ですので使えるはずです。どうやったらどういう エラーが出たのかを詳しく書きましょう。 |
68 ユーザーさん> なるほど〜そのとおりのようですね。どうもありがとうございました。 |
はじめまして。UNIX初心者で申し訳ない質問なんですが、、 今自分が使っているOSのバージョンを知るコマンドってあるのでしょうか? DOSで言う「ver」にあたるものです。 手持ちの本に載ってなかったので、くだらない質問で申し訳ないんですが、 お願いします。 |
maru さん、はじめまして。 uname -v ですな。(DOS の方を知らんかった、、;;;) |
ふくしさん、さっそくありがとうございます。 DOSでのコマンド、お役にたててなによりです。(笑) |
はじめまして、けんといいます。すごく初心者なのですが、質問 させてください。 ネットワークプログラムをやろうと思い、 UNIXネットワークプログラミング(リチャードスティーブンス) の本を買ってきたのはいいですが、プログラムの実行の仕方が わかりません。学校のソラリスにTELNETでつないで、最初の例題 timetcpcli.cという、時間を返してくれるプログラムを 書いて、gccで実行したのですが、例題に特殊な"unp.h"という ヘッダーがあり、それを作者のHPからダウンロードしてきて、 timetcpcli.cと同じディレクトリーにコピーしました。 そしていざ、gccをやってみても、そのようなファイルもディレクトリ も存在しませんと返ってきました。ファイルとヘッダーを同じ ディレクトリーに置いといて実行できるのでしょうか? 大変初心者ですいません。自分がこのようなプログラムをやる 域に達していないのですが、どなたかご教授ください。 |
>>2303 ken > ファイルとヘッダーを同じディレクトリーに置いといて > 実行できるのでしょうか? #include "unp.h" と書いてあるならいけるはずです。 もしかして #include <unp.h> と書いてませんか? |
68userさん>失礼しました。今後、気をつけます。 さて、プログラムの方なのですが、参考図書とにらめっこして いたところ、恥ずかしい事にタイム関数の使い方を間違ってい ました。今後、こんなことのないように気をつけます。 有難うございました。 |
こんにちは、 Solaris2.6を使用しておりますが、 印刷のコマンドの「lp」と「lpr」の違いはなんでしょうか。 いろいろ調べたんですが、なかなか意味が理解できなくて。。 「lpr」の方はSunOS/BSD互換パッケージコマンドとありますが、それだけ の違いでしょうか。 よろしくお願いします。 |
こんにちは。質問したいことがあります。 UNIX上で、あるアプリケーションの画面(検索結果を表示しているような一般的 な画面)をそのままハードコピー感覚で印刷したいのですが、 これにはどういった処理・手順が必要なのでしょうか。 単純にlpコマンドではうまく印刷できないですよね? PostScriptに変換しないとやはりダメでしょうか。 ちなみにOSはSolaris2.6で出力プリンタはEPSON LP9200SXです。 (プリンタはLAN上にいます) プリンタの方でも何か設定が必要でしたら教えてください。 よろしくお願いします。 |
>>2306 pon > 「lpr」の方はSunOS/BSD互換パッケージコマンドとありますが、 > それだけの違いでしょうか。 それだけです。 BSD 系 UNIXには lpr の方しかなくて、SystemV 系は lp です。 Solaris の /usr/usb/ の下にあるのは全て BSD 互換コマンドです。 # ucb=University of California, Berkeley |
>>2307 まさお > プリンタはEPSON LP9200SXです。 これ、PostScript プリンタですよね。 http://www.i-love-epson.co.jp/products/printer/laser/lp9200ps3/9200ps32.htm ImageMagick 付属の convert で PostScript に変換して、 lp に流すのはどうでしょうか。 % xwd > image.wd % convert image.wd image.ps % lp -d printername image.ps あるいは、とにかくブラウザが見える画像形式に変換して、 ブラウザから印刷する、とか。 |
68user様、ありがとうございました。 やはりPostScript への変換が必要なのですね。 ところでこのPostScript変換ツールというのは、テキスト用、画像用とかいろいろとあるようですが、これらはみな1ツールとしてOSにインストールする必要があるということですよね。 以上ありがとうございました |
68userさん、さっそくのお返事ありがとうございます。 <unp.h>ではなく、"unp.h"としてもこのような、ファイル、 ディレクトリはありませんと返ってきます。 僕はウィンドウズユーザーなので、UNIXをやるときは学校と つなげるしかありません。僕の環境はOSはWin2000,next ftp とtera term proで学校のSun OS5.8につないでいます。 作者(リチャードスティーブン)のHPからunp.hと例題が 詰まったフォルダーをダウンロードしてきて、WIN上で解凍。 それをFTPで自分の学校のアカウントにおくりました。 自分のアカウントではcというディレクトリを作り、その中に、 例題のdaytimetcpcli.cというファイルと,"unp.h"という ファイルをおいて、gcc daytimetcpcli.cとうつと、このファイル、 ディレクトリはありませんとでてきます。例題も、unp.hも コピー&ペーストでありつけたので、打ち間違えはないのですが、 どこに問題があるのでしょうか?たいへんすいません、よろしく お願いします。 ちなみにunp.hというファイルは下記のURLにいって、それをコピー してきました。 http://www.sfc.wide.ad.jp/~nob/webdoc/unpv12e/lib/unp.h |
>>2310 まさお > テキスト用、画像用とかいろいろとあるようですが、これらはみな1ツールとして > OSにインストールする必要があるということですよね。 「1ツール」の意味がよくわかりませんが、 - テキスト用としては a2ps - dvi なら dvi2ps - 画像用としては convert で PostScript に変換 などと、別々のアプリケーションで配布されています。 ファイル形式ごとに、いちいちどの変換フィルタかますかを考えるのが面倒、 ということなら、file コマンドなどでファイル形式を判断し、適切なフィルタを 経由して lp にデータを渡すシェルスクリプトを書く、という手もあります。 >>2311 ken > このような、ファイル、ディレクトリはありません 意訳せず、正確なエラーメッセージを書いて下さい。 例えば unp.h を置いて、以下の内容のような foo.c というファイル #include "unp.h" main(){ } を置き、コンパイルすると % gcc foo.c In file included from foo.c:1: unp.h:7: ../config.h: No such file or directory In file included from foo.c:1: unp.h:200: ../lib/addrinfo.h: No such file or directory となります。config.h や addrinfo.h を用意していないということはありませんか? でなくて、 foo.c:1: unp.h: No such file or directory と出るなら本当に unp.h がないのでしょう。unp.h が置いてあるディレクトリに行って、 % cat unp.h とするとちゃんと表示されますか? |
>68userさん いろいろとありがとうございました。よくわかってきました。 ところで、もっと漠然とした質問で申し訳ないんですけど、UNIX上で画像などを印刷する場合は、ファイルをPostScript形式に変換しなければどんなことしても絶対印刷は無理!ということなのでしょうか。 (要はImageMagickやxvのインストールは必須ということでしょうか。) Postscriptがなかった時代は印刷できなかったんですかね。 では失礼します。 |
>>2313 まさお 要は、プリンタが解釈できる言語を流してやる必要があります。 PostScript プリンタは PostScript を解釈できます。LIPS な プリンタには LIPS で、ESC/Page なプリンタには ESC/Page な データを流してやらないといけません。 そのための変換ツールが、lipsf だとか、gs (GhostScript) だとか、a2ps とか dvi2ps とかなわけです。 どうでもいいですが、PostScript プリンタってのは価格が高いので、 普通の企業では LIPS とか ESC/Page なプリンタを買うことが多いです。 Canon やら Epson がドライバを出しているので Windows からの利用は OK なんですが、UNIX から非 PostScript プリンタを使うのは何かと 面倒だったりします。 |
>68userさん ありがとうございました。 いろいろ複雑ですね。ますます考えることが多くなってきました。 要はUNIXからアプリケーションの画面(スナップショット)を印刷する処理を 考えているところなのです。 プリンタがEPSON LP8200LP2 でOSがSolaris2.6です。 画像なので、以前教えていただいたようにImage Magickなどの変換ツールを あとからインストールしないとダメなようすね。 OSの方にあらかじめ組み込まれているコマンドとかがないのか探しているんですけど、 みつかりません。「jtops」というコマンドがOSにあるのですが、これはテキスト専用 でしょうか。 あと、教えていただいたLIPSやESC/PAGEというメーカーの制御コードもテキスト 専用なんですよね? 画像の印刷はやはりPostscript変換ということですよね。 たびたび失礼しました。 |
>>2315 まさお > 「jtops」というコマンドがOSにあるのですが、これはテキスト専用 > でしょうか。 のようですね。 > あと、教えていただいたLIPSやESC/PAGEというメーカーの制御コードも > テキスト専用なんですよね? いいえ、イメージもいけます。 てゆーか、そんなに難しく考える必要はなくて、PostScript プリンタ なんだから PostScript で送ってやればいいんですよ。 例えば ftp://gatekeeper.dec.com/contrib/share/lib/ghostscript/examples/tiger.ps を落として % lp -d printername < foo.ps で印刷できるはず。 あとは任意の画像を PostScript に変換するツールをインストールすれば おしまいです。convert でも xv でも gimp でもできます。 |
>68user さん ありがとうございました。 勉強になりました。 |
ネットワークプログラムなのですが、エラーメッセージとしては、 68userさんがおっしゃったように、 In file included from daytimetcpcli.c:1: unp.h:7: ../config.h: No such file or directory In file included from daytimetcpcli.c:1: unp.h:200: ../lib/addrinfo.h: No such file or directory というメッセージが返ってきます。しかし、unp.hも、addrinfo.h, config.hも同じディレクトリーにいれてgcc daytimetcpcli.cと うっても、上記のようなエラーが返ってきます。ヘッダーファイル が同じディレクトリーにあるのにこのようなメッセージが返ってくる ということは、やはりどこかに、なんらかの間違いがあるということ でしょうか?よろしくお願いいたします。 |
>>2318 ken /home/user/c/daytimetcpcli.c /home/user/c/unp.h というファイル配置で、カレントディレクトリが /home/user/c/ のとき ../config.h は /home/user/unp.h を表します (.. は親ディレクトリを表すから)。同様に ../lib/addrinfo.h は /home/user/lib/addrinfo.h を表します。 そこにヘッダファイルがないので No such file or directory になって いるわけです。本に、ヘッダファイルやソースファイルをどういう ディレクトリ構成で置きなさい、という記述はありませんか? |
>>2318 ken unpv12e.tar.gz を持ってきて試してみたところ…README にやり方が ちゃんと書いてありますがな。ドキュメントはちゃんと読みましょう。 % ./configure % cd lib % make % cd ../intro % make daytimetcpcli でうまくいきました。 Solaris8 (SunOS5.8) ではどうかはわかりませんが、FreeBSD では lib の make 時に IPV6_DROP_MEMBERSHIP というマクロが未定義だ というエラーが出ました。これは古いマクロで、今は IPV6_JOIN_GROUP に 変わっています。 んで、ここを書き換えるとコンパイルが通りました。 |
.tgzとして拡張子があるファイル、どう展開しますか? |
ひとつ教えてください。 Windowのダンプのコマンドの一般的な使い方は、 xwd -out display.xwd と入力し、そのあとにダンプしたいWindowをマウスで選択しますが、 このとき、ダンプをとりたいWindowをマウスで指定するのではなく、 プログラム上で指定したいのです。(たとえば、Window上に「印刷」ボタンを設け、それが押されたら今アクティヴなWindowを印刷する、とか。) そういった処理を行うこと可能なのでしょうか? |
はじめまして、 ネットワークプログラミング駆け出し者です。 このような、すばらしいHPを開かれている皆様に感謝致します。 とても、参考になります。 これからも、宜しくお願いします。 |
かなり勉強になりました。 telnetのところでGET index.html HTTP/1.0をやっても403エラーと 出てしまいます。どうしたら、うまくいくか教えてください。 お願いします。 |
cookの作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか? |
はじめまして。 最近unixを触りだしたひよっこです。 大変素晴らしいHPでとても助かります。 実は、unixのシステム管理業務の一環として時間別/日別のcpuの使用率及びメモリ使用率を調べるコマンドを探しています。 cpu使用率はsar -Aでデータを取る事が出来たのですが、メモリ使用率 が分かりません。 どうしてよいのか途方に暮れています。良きアドバイスを頂けないでしょうか? |
いつもお世話になっております。Perl で助けてください。 0x00 から 0xff までループ、というつもりで、 for ("\x00".."\xff") { ... } とやってますが、\x00 のとき1回だけやって終わるみたいです。 なじぇ?(?.?) どなたかお願いします。 |
>>2321 lee > .tgzとして拡張子があるファイル、どう展開しますか? 「tgz 展開」で検索しましょう。 >>2322 pon > たとえば、Window上に「印刷」ボタンを設け、それが押されたら今アクティヴな > Windowを印刷する、とか。 というのができるのかどうかはわかりませんが、xwd の -id や -name オプションでウィンドウは指定できるでしょう。指定する 値は % xwininfo -root -all で表示されるものです。 >>2324 なっち > telnetのところでGET index.html HTTP/1.0をやっても403エラーと > 出てしまいます。 ブラウザでアクセスしても 403 となるなら、telnet でやっても 当然 403 です。もしブラウザでうまくいくのなら、Host ヘッダを 付けてやってみて下さい。 >>2326 ひよっこ OS は何ですか? 僕なら top を使いますが、sar -k とかでも できませんか? (試したことはありませんが) >>2327 ふくし > \x00 のとき1回だけやって終わるみたいです。 終わってしまいますね。よくわかりませんが、 for ("\\1" .. "\\9") { for ("!1" .. "!9") { などでも同様なので、\ という *文字* はマジックインクリメントの 対象外なんじゃないでしょうか。 で、実は本当にやりたいのは for (0x00 .. 0xff) { じゃあないですか? じゃなくて、もし \xXX という文字列が 欲しいのならば for (0x00 .. 0xff) { $hex = sprintf("%02x", $_); } あたりで。 |