68user's page 掲示板

Prev< No. 2276〜2366> Next  [最新発言に戻る] [過去ログ一覧]
No. 2276 # ふくし [E-mail] 2001/11/19 (月) 13:48:26
みーさん:

なんかすいません。
たぶんぼくのやり方すごく非標準的なので、
もっとカッコいい方法はいくらでもあると思うんですが、、

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 は消えてなくなる

こんな感じでしょうか。

No. 2277 # 68user 2001/11/19 (月) 14:17:20
>>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」を付けずに試行錯誤すれば
よいので、いろいろなところで応用が効くと思います。

No. 2278 # 68user 2001/11/19 (月) 14:20:22
>>2270 ふくし
> 場違いでしたら情報のポインタや、討議するのにふさわしい
> 掲示板等教えてください。
場違いではないですが、わかりません。会社では Windows Me だし (笑)

ふさわしいところは… fj.kanji くらいしか思い付かないなぁ…。

後は
>>2269 kouji
ですが、これはちょっと調べてから回答したいと思います。

No. 2279 # みー(お礼) [E-mail] 2001/11/19 (月) 16:05:11
ふくしさん、68userさんどうもいろいろありがとうございました。とっても勉強になりましたし、助かりました。perl -pi.bakの方法で、一括変換変換させる方法をバックアップファイルも一緒に作成できるので、実施したいと思います。簡単なテストをしたところ、大丈夫そうでしたので…。他の方法も、今後時間のある時に試してみたいと思います。迅速なご回答と親切な説明、本当にありがとうございました。

No. 2280 # ぷたろ 2001/11/19 (月) 19:38:13
始めましてm(__)m
UNIXを学校で使っています。
家では使えないんでしょうか?
家にパソコンはあるのですが…(-.-;)

No. 2281 # ふくし [E-mail] 2001/11/19 (月) 20:21:53
ぷたろさん、はじめまして。
・家のパソコンに UNIX(FreeBSD とか Linux)を入れる。
    いろんな本に、すでに入ってる OS(Windows ですか?)と切り替える方法が
    書いてある<=管理が大変だけど
・家のパソコンをインターネットにつなぎ、
    会社のパソコンに Telnet(Windows だと Teraterm が有名)で
    ログインする。リモートコントロールの感覚ですね。
    グラフィックなソフトは使えないけど、、。
    この場合は学校の管理者の人に聞いてみてください。

No. 2282 # ぷたろ 2001/11/19 (月) 21:00:16
ふくしさん、ありがとですm(_ _)m
家のパソコンのOSはwindowsです。
外付けのハードを買って
そこにLinuxを・・・。
ってな具合にはいかないですか?
う〜ん、どうしよう(--;)

No. 2283 # ふくし [E-mail] 2001/11/19 (月) 23:49:50
>ぷたろさん
いちから 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 からハードウェアの設定を
読みこんで自動インストールしてくれるそうです。
ぼくはどっちも使ったことないし、設定は人に任せているのでくわしいことは
わからないのですが、トライしてみたらどうでしょうか。

No. 2284 # ぷたろ 2001/11/20 (火) 02:28:31
ふくしさん、親切にありがとうございますm(_ _)m
同じHDDにいれるんだったら
HDDを分割するソフトがないと
ダメですよね?
HDDを新しく買って
Linuxを一からやってみようかな。。。
Linuxを自分で管理って大変なんですか?
「いちから Linux を入れて自分で管理する気があるんだったら」
ってあるから大変そう・・・。
う〜ん。新しい事をするのは難しいです(-.-;)

No. 2285 # ふくし [E-mail] 2001/11/20 (火) 13:49:19
>ぷたろさん
HDDにパーティションを切るソフトは、商用のLinuxにはたいてい
ついてきます。少なくともMLD5にはついてきます。
あと、FIPSというフリーのパーティションソフトもあります。
新しいHDDを買ってきてもいいですが、
どのディスクからブートするかを指定する何らかの手段が必要です。
この掲示板だけではフォローしきれないと思うので(^^;
適当な入門用Linuxを買ってみるといろいろ書いてあると思います。
それから大変かどうかですが、それは人によります。
最近の入門用のディストリビューションは
最初からなんでも使えるようになっているようですが、
もしネットワークにつなぎっぱなしにする環境なら、
不要なサービスを殺さないと外からどんどん入ってこられます。
最低でも root(管理者用ユーザー)のパスワードは設定してください。
では、がんばってくださいー。

No. 2286 # みー [E-mail] 2001/11/20 (火) 15:16:24
たびたび申し訳ありません。また、教えて下さい。perlのコマンドでカレンドディレクトリの中の複数ファイルを対象に、該当の文字(/usr/kokyaku)を特定の文字(usr/okyaku)に置換させようと考えています。下記のコマンドを実施したところ、特定文字を含まないファイルについても、バックアップファイル**.bakが作成されてしまいます。該当のファイルのみバックアップファイルを作成することは可能でしょうか?
perl -pi.bak -e 's/\/usr\/kokyaku/\/usr\/okyaku/g' *

カレントディレクトリーには、20ほどのファイル(ほとんどがシャル)が存在し、上記文字を含むファイルが6つほど存在するので、6つのみファイルの中身を置換し、バックアップファイルも6つのみ作成してほしいのですが、わがままなお願いでしょうか?お手数をおかけいたしますが、簡単な方法があれば教えて下さい。

No. 2287 # 68user 2001/11/20 (火) 15:56:00
>>2286 みー
> バックアップファイル**.bakが作成されてしまいます。
おそらくそういう仕様です。


で、どうすればいいと思いますか?

不要なファイルができて困るのなら、不要なファイルを作らないように
するか、不要なファイルを削除すればいいわけで。

まずは自分で考えてみて下さい。

No. 2288 # TAKE 2001/11/21 (水) 01:51:43
今晩は、初めまして。
突然ですが質問して宜しいでしょうか。
ホスト名と、IPアドレスの頁を読ませていただいたのですが、まだ良く分かっていないので、この場をお借りして質問させていただきます。
IPアドレスが微妙に違って、でもホスト名が同一の場合、それは同一のパソコンからアクセスしていると解釈していいのでしょうか?
すみません、物知らずで…教えてくださると嬉しいです。

No. 2289 # みー [E-mail] 2001/11/21 (水) 09:45:55
68userさん、回答ありがとうございました。仕様でそうなっているのでは、仕方がないので諦めて、カレトディレクトリーに該当ファイル数が少ない場合はファイルを指定し、該当ファイル数が多い場合は、不要なファイルを後で、rmで削除することにします。

No. 2290 # ふくし [E-mail] 2001/11/21 (水) 11:51:57
>みーさん
えーシェルスクリプトも Perl もつかえる環境なのに手動でやるんですか、
それはもったいない、、失敗もしそうだし、、

>TAKEさん
相手がプロバイダーの場合など、同じホスト名でも
ちがうパソコンのことがあるのでは、、。

No. 2291 # 68user 2001/11/21 (水) 22:45:27
回答が遅くなったので、もう見ておられないかもしれませんが…

>>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 を
使った方がよいでしょうけれども。

No. 2292 # 68user 2001/11/21 (水) 22:58:37
>>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 なので、
そのページはまだ見ていません。

No. 2293 # 68user 2001/11/21 (水) 23:19:24
>>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


他にも「前に情報提供したのにまだ反映されていない」という部分が
ありましたら、ご指摘いただけると幸いです。

No. 2294 # kouji 2001/11/23 (金) 09:08:52
>68userさん
ありがとうございました。
include virtualを使います。

No. 2295 # TAKE 2001/11/23 (金) 22:43:20
ふくしさん、ご回答有難うございました。
参考になりました。

No. 2296 # ふくし [E-mail] 2001/11/26 (月) 01:03:02
Perl の質問ですが、(101) とか ($x) とかいう式は、
・スカラーをカッコに入れたもの
と思われるのでしょうか、
・要素数が1個のリスト
と思われるのでしょうか。

($x) = (6,7,8);
と書くと、$x には 6 が入るので、($x) はリストのようです。
でも、そのあと、
$n = ($x);
と書くと、$n には ($x) の要素数 1 ではなく、$x の値 6 が入ります。

$n = ();
と書くと、$n にはゼロは入らないで undef が入るようです。
ということは、() は空リストではなく、
「無」をカッコで囲んだ式が入ってるということでしょうか。
というのは、空リストだとすると、
$n には空リストの要素数 0 が入るように思うからです。

No. 2297 # ひろ 2001/11/26 (月) 11:41:26
みなさん、はじめまして。
ちょっと、C言語の質問をさせてもらっていいっですか?
自分は、redhadのLinux2.1を使っているのですが、
タイム関数の
#include<time.h>
が、使うことが出来ませんが、Linuxにおいては
タイム関数は対応していないのでしょうか?
ある、実験において実験結果をグラフにしようとしている
のですが、タイム関数が使えないために、横軸がLOOP回数での
表示しか出来ずにグラフが成立しなくて困っています。
どうか、良きアドバイスをいただけないでしょうか?
お願い致します。

No. 2298 # 68user 2001/11/26 (月) 11:45:44
>>2296 ふくし
@a をスカラーコンテキストで評価すると、@a の要素数が得られますが、
(6,7,8) をスカラーコンテキストで評価すると最後の要素の 8 が
得られます、ってことで回答になってますでしょうか。

>>2297 ひろ
POSIX にもある関数ですので使えるはずです。どうやったらどういう
エラーが出たのかを詳しく書きましょう。

No. 2299 # ふくし [E-mail] 2001/11/26 (月) 13:26:51
68 ユーザーさん>
なるほど〜そのとおりのようですね。どうもありがとうございました。

No. 2300 # maru 2001/11/26 (月) 15:54:45
はじめまして。UNIX初心者で申し訳ない質問なんですが、、
今自分が使っているOSのバージョンを知るコマンドってあるのでしょうか?
DOSで言う「ver」にあたるものです。
手持ちの本に載ってなかったので、くだらない質問で申し訳ないんですが、
お願いします。

No. 2301 # ふくし [E-mail] 2001/11/26 (月) 17:06:43
maru さん、はじめまして。
uname -v ですな。(DOS の方を知らんかった、、;;;)

No. 2302 # maru 2001/11/26 (月) 17:18:30
ふくしさん、さっそくありがとうございます。
DOSでのコマンド、お役にたててなによりです。(笑)

No. 2303 # ken 2001/11/26 (月) 22:02:12
はじめまして、けんといいます。すごく初心者なのですが、質問
させてください。

ネットワークプログラムをやろうと思い、
UNIXネットワークプログラミング(リチャードスティーブンス)
の本を買ってきたのはいいですが、プログラムの実行の仕方が
わかりません。学校のソラリスにTELNETでつないで、最初の例題
timetcpcli.cという、時間を返してくれるプログラムを
書いて、gccで実行したのですが、例題に特殊な"unp.h"という
ヘッダーがあり、それを作者のHPからダウンロードしてきて、
timetcpcli.cと同じディレクトリーにコピーしました。

そしていざ、gccをやってみても、そのようなファイルもディレクトリ
も存在しませんと返ってきました。ファイルとヘッダーを同じ
ディレクトリーに置いといて実行できるのでしょうか?

大変初心者ですいません。自分がこのようなプログラムをやる
域に達していないのですが、どなたかご教授ください。

No. 2304 # 68user 2001/11/27 (火) 01:14:21
>>2303 ken
> ファイルとヘッダーを同じディレクトリーに置いといて
> 実行できるのでしょうか?
#include "unp.h" と書いてあるならいけるはずです。
もしかして #include <unp.h> と書いてませんか?

No. 2305 # ひろ 2001/11/27 (火) 10:18:32
68userさん>失礼しました。今後、気をつけます。
                        さて、プログラムの方なのですが、参考図書とにらめっこして      いたところ、恥ずかしい事にタイム関数の使い方を間違ってい      ました。今後、こんなことのないように気をつけます。
                        有難うございました。

No. 2306 # pon 2001/11/27 (火) 10:50:21
こんにちは、
Solaris2.6を使用しておりますが、
印刷のコマンドの「lp」と「lpr」の違いはなんでしょうか。
いろいろ調べたんですが、なかなか意味が理解できなくて。。
「lpr」の方はSunOS/BSD互換パッケージコマンドとありますが、それだけ
の違いでしょうか。
よろしくお願いします。

No. 2307 # まさお 2001/11/27 (火) 11:11:42
こんにちは。質問したいことがあります。
UNIX上で、あるアプリケーションの画面(検索結果を表示しているような一般的
な画面)をそのままハードコピー感覚で印刷したいのですが、
これにはどういった処理・手順が必要なのでしょうか。

単純にlpコマンドではうまく印刷できないですよね?
PostScriptに変換しないとやはりダメでしょうか。
ちなみにOSはSolaris2.6で出力プリンタはEPSON LP9200SXです。
(プリンタはLAN上にいます)
プリンタの方でも何か設定が必要でしたら教えてください。
よろしくお願いします。

No. 2308 # 68user 2001/11/27 (火) 11:14:33
>>2306 pon
> 「lpr」の方はSunOS/BSD互換パッケージコマンドとありますが、
> それだけの違いでしょうか。
それだけです。

BSD 系 UNIXには lpr の方しかなくて、SystemV 系は lp です。
Solaris の /usr/usb/ の下にあるのは全て BSD 互換コマンドです。

# ucb=University of California, Berkeley

No. 2309 # 68user 2001/11/27 (火) 11:23:40
>>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

あるいは、とにかくブラウザが見える画像形式に変換して、
ブラウザから印刷する、とか。

No. 2310 # まさお 2001/11/27 (火) 11:56:08
68user様、ありがとうございました。
やはりPostScript への変換が必要なのですね。
ところでこのPostScript変換ツールというのは、テキスト用、画像用とかいろいろとあるようですが、これらはみな1ツールとしてOSにインストールする必要があるということですよね。

以上ありがとうございました

No. 2311 # ken 2001/11/27 (火) 12:57:02
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

No. 2312 # 68user 2001/11/27 (火) 14:04:40
>>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
とするとちゃんと表示されますか?

No. 2313 # まさお 2001/11/27 (火) 16:29:25
>68userさん
いろいろとありがとうございました。よくわかってきました。

ところで、もっと漠然とした質問で申し訳ないんですけど、UNIX上で画像などを印刷する場合は、ファイルをPostScript形式に変換しなければどんなことしても絶対印刷は無理!ということなのでしょうか。
(要はImageMagickやxvのインストールは必須ということでしょうか。)
Postscriptがなかった時代は印刷できなかったんですかね。

では失礼します。

No. 2314 # 68user 2001/11/27 (火) 21:14:57
>>2313 まさお
要は、プリンタが解釈できる言語を流してやる必要があります。

PostScript プリンタは PostScript を解釈できます。LIPS な
プリンタには LIPS で、ESC/Page なプリンタには ESC/Page な
データを流してやらないといけません。

そのための変換ツールが、lipsf だとか、gs (GhostScript)
だとか、a2ps とか dvi2ps とかなわけです。

どうでもいいですが、PostScript プリンタってのは価格が高いので、
普通の企業では LIPS とか ESC/Page なプリンタを買うことが多いです。

Canon やら Epson がドライバを出しているので Windows からの利用は
OK なんですが、UNIX から非 PostScript プリンタを使うのは何かと
面倒だったりします。

No. 2315 # まさお 2001/11/28 (水) 11:19:44
>68userさん
ありがとうございました。
いろいろ複雑ですね。ますます考えることが多くなってきました。

要はUNIXからアプリケーションの画面(スナップショット)を印刷する処理を
考えているところなのです。
プリンタがEPSON LP8200LP2 でOSがSolaris2.6です。

画像なので、以前教えていただいたようにImage Magickなどの変換ツールを
あとからインストールしないとダメなようすね。
OSの方にあらかじめ組み込まれているコマンドとかがないのか探しているんですけど、
みつかりません。「jtops」というコマンドがOSにあるのですが、これはテキスト専用
でしょうか。
あと、教えていただいたLIPSやESC/PAGEというメーカーの制御コードもテキスト
専用なんですよね?

画像の印刷はやはりPostscript変換ということですよね。

たびたび失礼しました。

No. 2316 # 68user 2001/11/28 (水) 13:02:21
>>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 でもできます。

No. 2317 # まさお 2001/11/28 (水) 15:40:30
>68user さん
ありがとうございました。
勉強になりました。

No. 2318 # ken 2001/11/28 (水) 16:05:37
ネットワークプログラムなのですが、エラーメッセージとしては、
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と
うっても、上記のようなエラーが返ってきます。ヘッダーファイル
が同じディレクトリーにあるのにこのようなメッセージが返ってくる
ということは、やはりどこかに、なんらかの間違いがあるということ
でしょうか?よろしくお願いいたします。

No. 2319 # 68user 2001/11/28 (水) 17:58:16
>>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 になって
いるわけです。本に、ヘッダファイルやソースファイルをどういう
ディレクトリ構成で置きなさい、という記述はありませんか?

No. 2320 # 68user 2001/11/29 (木) 00:03:18
>>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 に
変わっています。

んで、ここを書き換えるとコンパイルが通りました。

No. 2321 # lee [E-mail] 2001/11/29 (木) 23:13:35
.tgzとして拡張子があるファイル、どう展開しますか?

No. 2322 # pon 2001/11/30 (金) 10:39:35
ひとつ教えてください。
Windowのダンプのコマンドの一般的な使い方は、
xwd -out display.xwd
と入力し、そのあとにダンプしたいWindowをマウスで選択しますが、
このとき、ダンプをとりたいWindowをマウスで指定するのではなく、
プログラム上で指定したいのです。(たとえば、Window上に「印刷」ボタンを設け、それが押されたら今アクティヴなWindowを印刷する、とか。)
そういった処理を行うこと可能なのでしょうか?

No. 2323 # kura 2001/11/30 (金) 10:55:29
はじめまして、
ネットワークプログラミング駆け出し者です。
このような、すばらしいHPを開かれている皆様に感謝致します。
とても、参考になります。
これからも、宜しくお願いします。

No. 2324 # なっち 2001/11/30 (金) 13:44:59
かなり勉強になりました。
telnetのところでGET index.html HTTP/1.0をやっても403エラーと
出てしまいます。どうしたら、うまくいくか教えてください。
お願いします。

No. 2325 # zone [E-mail] 2001/12/04 (火) 13:55:08
cookの作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?の作成はどの様にすればいいですか?

No. 2326 # ひよっこ 2001/12/04 (火) 14:43:58
はじめまして。
最近unixを触りだしたひよっこです。
大変素晴らしいHPでとても助かります。
実は、unixのシステム管理業務の一環として時間別/日別のcpuの使用率及びメモリ使用率を調べるコマンドを探しています。
cpu使用率はsar -Aでデータを取る事が出来たのですが、メモリ使用率
が分かりません。
どうしてよいのか途方に暮れています。良きアドバイスを頂けないでしょうか?

No. 2327 # ふくし [E-mail] 2001/12/04 (火) 19:36:21
いつもお世話になっております。Perl で助けてください。
0x00 から 0xff までループ、というつもりで、

    for ("\x00".."\xff") {
        ...
    }

とやってますが、\x00 のとき1回だけやって終わるみたいです。
なじぇ?(?.?) どなたかお願いします。

No. 2328 # 68user 2001/12/04 (火) 21:24:48
>>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", $_);
    }
あたりで。

No. 2329 # ふくし [E-mail] 2001/12/05 (水) 00:28:02
いつもお世話になっております。
>実は本当にやりたいのは
ばっちりです、、;;;

No. 2330 # しんベエ 2001/12/05 (水) 16:53:48
はじめまして。
ここのプログラムは凄く参考になり助かっています。

サンプルプログラムの間違いなんですが、
http://jfx.startshop.co.jp/~68user/net/module-2.html
にある、モジュールを使ったマルチスレッド版echoプログラムの
31行目「if ( fork() ){」は、
正しくは「if ( $pid = fork() ){」ですよね?

No. 2331 # なっち 2001/12/05 (水) 18:14:10
お答えありがとうございました。
かなり役に立ってます。すごいです。
また、質問何ですが、UNIXで壁紙を自分のもっている画像にしたいので
すが、xvコマンド以外で何か良い方法ありませんか?

No. 2332 # わたなべ 2001/12/06 (木) 02:51:39
はじめまして。
このページではいつも色々と勉強させて貰っています。

さて、質問なのですが、今現在CVSにてあるプロジェクトを管理しており、
そのリポジトリをcvswebにて閲覧出来るようにしようとしているのですが、
ある特定のファイル達の中身を表示しようとしたときに、
cvs checkout: cannot exec co: No such file or directory
cvs checkout: could not check out xxx/yyy/Zzz.java
という様なメッセージが出てしまいます。
CVSも使い始めたばかりのため、何が原因なのかが分かりません。
もし良かったら何かヒントや、cvswebに関しての解説があるような
ページがありましたら教えていただけると嬉しいです。

よろしくお願いします。

No. 2333 # 68user 2001/12/06 (木) 04:11:41
>>2330 しんベエ
> 正しくは「if ( $pid = fork() ){」ですよね?
ご指摘ありがとうございます。その通りですね。修正しておきます。

>>2331 なっち
> お答えありがとうございました。
> かなり役に立ってます。すごいです。
じゃなくて、回答した結果、解決したかどうかをちゃんと書いて
ください。とりあえず
        http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse
を読んでください。

> UNIXで壁紙を自分のもっている画像にしたいのですが、
> xvコマンド以外で何か良い方法ありませんか?
ImageMagick が入っているなら
    % display -window root 画像ファイル
でできるかも。

>>2332 わたなべ
あなたも
    http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse
を読んでください。少なくともこの掲示板ではマルチポストは
ダメですし、2ch でも歓迎はされないでしょう。

あと、OS は何ですか? cvs のバージョンは? RCS のバージョンは?
cvsweb には zeller 版と knu 版がありますが、どっちを使って
いますか? また、そのバージョンは? 内容を表示って、x-cvsweb-markup
のことですか? それとも text/plain ですか?

仮にうちと同じ knu 版 cvsweb-1.105.1.65 だとすると、その
エラーが出そうなところは
    exec($CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where);
しかなさそうなので、オプションなどの値を表示させてみて、
同じことをコマンドラインからやってみてはどうですか。

# http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/cgi-bin/cvsweb.cgi?rev=1.9&content-type=text/x-cvsweb-markup

No. 2334 # わたなべ 2001/12/06 (木) 13:05:37
渡辺です。
>>2322 pon
は非常に浅はかな行動だったと認識しました。
申し訳ありませんでした。
今後気を付けます。

質問の続きをさせて頂いてもよろしいでしょうか…?
使っている各ソフトウェアのバージョンですが、
OS : Solaris SunOS 5.8
CVS : 1.9
RCS : 5.7
cvswebは、68userさんが使われているのを、http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgiのリポジトリから拝借しました。(ひょっとして、これもまずい行動でしたか。)
そして、内容の表示というのは、x-cvsweb-markupも、text/plainもです。
表示出来るファイルに関しては、双方とも表示出来るのですが、エラーが起きるファイルに関しては、両方ともに起きます。

また、68userさんがおっしゃってる通り、
exec($CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where);
でエラーが起きているであろうと考え、それをコマンドラインで実行してみたのですが、コマンドラインからは実行できました。
(実行できました。といいますか、あるファイルをチェックアウトでき、標準出力に出力されるという結果を得ました。)
オプションの値を変更して…という事ですが、CVSに明るくないため、何をどうかえたら良いのかがわかりませんでした。

これで足りますでしょうか?
もし、>>2332での事をお許し頂けるなら、何がアドバイス等を頂けたら嬉しいです。
結果報告もきちんとしますので、よろしくおねがいします。

No. 2335 # わたなべ 2001/12/06 (木) 14:02:08
>>2334 わたなべ
での書き込みにある、>>2322は>>2332の間違いです。
重ねてお詫びします。申し訳ありません。

No. 2336 # 68user 2001/12/06 (木) 14:58:28
>>2334 わたなべ
> ひょっとして、これもまずい行動でしたか。
問題ありません。書いてある通り、covered by the BSD-Licence です。

checkout できるファイルとできないファイルがあるということですから、
まずはリポジトリのパーミッションはどうなっているか確認して下さい。

同じディレクトリでも co できるファイルと co できないファイルがあれば、
ファイルのパーミッションが怪しいですし、あるディレクトリの下のファイルが
全て co できないならディレクトリのパーミッションがおかしいでしょうし。

うちの Solaris2.6 では
    % chown -R cvs /cvsroot (グループは cvs グループで統一)
    % chmod -R g+w /cvsroot (cvs グループに書き込み権限を与える)
    % find /cvsroot -type d | xargs chmod g+s (BSD タイプのパーミッションに)
とかしてます。でも、cvsweb.cgi は nobody で動かしているから
これは関係ないかな…。

また、CGI の実行権限は何ですか? 例えば nobody なら su nobody して
から checkout してみて下さい。

実際にどういうコマンドが実行されているかは、
    if (! open($fh, "-|")) { # child
        open(STDERR, ">&STDOUT"); # Redirect stderr to stdout
        exec($CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where);
    }
の前に
    print "Content-type: text/plain\n\n";
    print qq(exec($CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where););
    exit;
などと書けばわかるでしょう。

それでもダメなら
        exec($CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where);

        exec("/bin/truss", $CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where);
として、どのファイルをオープンしようとしてエラーになっているかを
調べて下さい。ちなみに、こちらでやってみると
    open("/MASTER/cvs/CVSROOT/config", O_RDONLY) = 4
    open("/MASTER/cvs/CVSROOT/cvsignore", O_RDONLY) Err#2 ENOENT
    open("//.cvsignore", O_RDONLY) Err#2 ENOENT
    open("/MASTER/cvs/CVSROOT/cvswrappers", O_RDONLY) = 4
    open("/MASTER/cvs/CVSROOT/modules", O_RDONLY) = 4
    ..
    open("/MASTER/cvs/admin/public_html/cvsweb.cgi,v", O_RDONLY) = 5
となります。

No. 2337 # aki 2001/12/06 (木) 15:18:16
特定の一般ユーザをroot権限と同様な権限を与えたいのですが、
設定方法を教えてもらえないでしょうか。
/etc/groupのファイルのrootグループに追加するだけで
はいけないのでしょうか。

No. 2338 # わたなべ 2001/12/06 (木) 16:29:03
度々すいません。
>>2336 68user
>同じディレクトリでも co できるファイルと co できないファイルがあれば、
>ファイルのパーミッションが怪しいですし、あるディレクトリの下のファイルが
>全て co できないならディレクトリのパーミッションがおかしいでしょうし。
リポジトリのパーミションを確認しました。
$CVSROOTディレクトリは 755
その中のプロジェクト毎のディレクトリは 775 でした。
各プロジェクト毎のディレクトリ内にある、サブディレクトリは 775
そして、ファイルは全て 444 でした。
チェックアウト出来るファイル/出来ないファイル、全て同一のパーミションで、同一のディレクトリ内にあるファイルでもチェックアウト出来るものと出来ないものがありました。

>また、CGI の実行権限は何ですか?
>例えば nobody なら su nobody してから checkout してみて下さい。CGI は nobody で動いています。
su nobody をやってみたのですが、パスワードを求められました。
僕はこのサーバの管理者ではないので nobody にはなれない様な気がしているのですが、可能なのでしょうか?

>実際にどういうコマンドが実行されているかは、
これは最初に書き込みをした時点でやってみました。
CGI からではなく、ターミナル上のコマンドからならチェックアウト出来ることも確認しております。

>exec("/bin/truss", $CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where);
やってみたところ、以下の様な出力を得ました
= From ========================================
cvs checkout: cannot exec co: No such file or directory
cvs checkout: could not check out xxx/yyy/Zzz.java
waitid(P_PID, 17464, 0xFFBEF1C0, WEXITED|WTRAPPED|WNOWAIT) = 0
ioctl(0, TIOCGPGRP, 0xFFBEF17C) Err#22 EINVAL
getpgid(17464) = 350
ioctl(0, TIOCGPGRP, 0xFFBEF17C) Err#22 EINVAL
waitid(P_PID, 17464, 0xFFBEF1C0, WEXITED|WTRAPPED) = 0
waitid(P_ALL, 0, 0xFFBEF160, WEXITED|WTRAPPED|WNOHANG) = 0
fork() = 17467
waitid(P_PID, 17467, 0xFFBEF270, WEXITED|WTRAPPED|WNOWAIT) = 0
ioctl(0, TIOCGPGRP, 0xFFBEF22C) Err#22 EINVAL
getpgid(17467) = 350
ioctl(0, TIOCGPGRP, 0xFFBEF22C) Err#22 EINVAL
waitid(P_PID, 17467, 0xFFBEF270, WEXITED|WTRAPPED) = 0
waitid(P_ALL, 0, 0xFFBEF210, WEXITED|WTRAPPED|WNOHANG) = 0
llseek(0, 0, SEEK_CUR) Err#29 ESPIPE
_exit(0)
= End =========================================
上のメッセージの3行目以降は、チェックアウト出来たファイル/出来なかったファイル共に出力されていました。

現状報告だけで申し訳ありません。
このページで学んだ通り、ユーザ権限で CGI を動かすようにもしてみたのですが、それでも何も状況は変わりませんでした。

No. 2339 # わたなべ 2001/12/06 (木) 16:31:23
>>2338 わたなべ

>例えば nobody なら su nobody してから checkout してみて下さい。CGI は nobody で動いています。

>例えば nobody なら su nobody してから checkout してみて下さい。
CGI は nobody で動いています。
と訂正させてください。
毎度毎度申し訳ありません。

No. 2340 # 68user 2001/12/06 (木) 17:09:12
>>2332 わたなべ
> cvs checkout: cannot exec co: No such file or directory
ん〜、これってもしかして、単に co(1) が見付からないって
言ってるのかな? co(1) にパスは通ってます?

# って、どういうときに co(1) が使われるのかいまいちわかってませんが。
## これが原因なら、かなり的外れなことを言ってたことになるなぁ。

No. 2341 # わたなべ 2001/12/06 (木) 17:47:06
>>2340 68user
>ん〜、これってもしかして、単に co(1) が見付からないって
>言ってるのかな? co(1) にパスは通ってます?

co(1) という書き方が何を指すのか、わからないのですが、
which co
で得られるパスを、 cvsweb.conf の $command_path にコロンでつなげて
記述すればいいんですよね?
一応それはやってあります。
CVS も RCS も、root が入れたものではなく、ユーザ権限でインストール
したもので、それらをユーザの ~foo/cgi-bin/cvsweb/ で使おうと
しているのですが、その辺りに問題があったりしますか?

No. 2342 # 68user 2001/12/06 (木) 18:35:12
>>2338 わたなべ
> which co で得られるパスを、 cvsweb.conf の $command_path にコロンで
> つなげて記述すればいいんですよね?
はい、そうです。

> リポジトリのパーミションを確認しました。
ではリポジトリのパーミッションは問題ないでしょう。

> 僕はこのサーバの管理者ではないので nobody にはなれない様な気が
> しているのですが、可能なのでしょうか?
一度 root にならないと nobody にはなれません。

truss の結果 (システムコールでこけているわけではないらしい) と、
> cvs checkout: cannot exec co: No such file or directory
> cvs checkout: could not check out xxx/yyy/Zzz.java
のメッセージから、単に PATH を検索して、co が見付からないので
    co -r1.1 /cvsroot/xxx/yyy/Zzz.java,v
がこけているのかと思ったのですが、違うのかなぁ。成功するファイルと
失敗するファイルがあるというのが謎ですが…。

でも、最近の cvs (少なくとも cvs-1.11) では rcs (co も含む) は
使っていないはずなので違うかなぁ (cvs は rcs を使わないけど、
cvsweb は rcs を使う)。

…と書いたところで今気づきましたけど、
> CVS : 1.9
古いです。最新版は cvs-1.11.1-p1 のようですが、最低でも cvs-1.11
にして下さい。ここが一番怪しいかな。

ちなみに、最新版の cvsweb はこちらです。
    http://www.idaemons.org/cgi-bin/cvsweb.cgi/cvsweb/

No. 2343 # わたなべ 2001/12/06 (木) 20:15:55
>>2342 68user
>…と書いたところで今気づきましたけど、
>> CVS : 1.9
>古いです。最新版は cvs-1.11.1-p1 のようですが、最低でも cvs-1.11
>にして下さい。ここが一番怪しいかな。
cvs-1.11をインストールしてみましたところ、無事にcvswebも問題なく
動き出す様になりました。
最初に無礼を働いてしまったにも関わらず、解決まで長々と
付き合って頂き、本当にありがとうございました。

これからもちょくちょく来て、勉強させて頂きます。
ありがとうございました。

あと、ちょっとメインの話とはずれるのですが、
>>2340 68user
にあった
>co(1)
というのはどのような時に書く方法なのでしょうか?

No. 2344 # 68user 2001/12/06 (木) 20:46:58
>>2343 わたなべ
> 無事にcvswebも問題なく動き出す様になりました。
それはよかったです。バージョンは? と聞いておきながら
古いのを見落としていたのは失敗でした。

>> co(1)
> というのはどのような時に書く方法なのでしょうか?
セクション番号を表します。セクション 1 はコマンドなので、
「co(1)」は「コマンド co」という意味です。
# http://X68000.startshop.co.jp/~68user/unix/pickup?man

No. 2345 # わたなべ 2001/12/07 (金) 00:07:54
ありがとうございます。
>>2344 68user
>セクション番号を表します。
あ、すでに書かれているところがありましたか…。ちゃんと見てから
質問しないとダメですね…。本当にすいません。
今回色々勉強させて頂きました。
本当に感謝感謝です。

なんだか、頼りっぱなしだったのでちょっと一人で勉強してきます。
また何かあったら質問しにくるかもしれませんが、その時はよろしく
おねがいします。

No. 2346 # ゆき 2001/12/07 (金) 20:10:52
はじめまして。ゆきと申します。当方の環境はSUN Sparc Solaris2.51
です。

会社でC++の環境が必要になり、UnixもC、C++もさほど詳しくない私が、
インターネットを頼りにgcc2.95.3のインストールをしました。
それで、渡されたC++のソースをコンパイルしたのですが、以下のような
エラーが出ます。渡した本人は、エラーが出るのはおかしいと言って
います。
% gcc -lstdc++ -o hello hellocpp.cpp
hellocpp.cpp:1: iostream: No such file or directory
hellocpp.cpp:2: string: No such file or directory

これは要するにインクルードファイルを見に行けない状態なんだと
思いますが、gccのインストールが上手くいっていないのでしょうか?
ちなみにC++のソースは以下です。
---------------------------------------------------------
#include <iostream>
#include <string>
using namespace std;

class CHello
{
private:
        string m_strOut;
public:
        CHello(){ m_strOut = "Hello World!"; };
        virtual ~CHello(){};

        void print(void);
};

void CHello::print(void)
{
        cout << m_strOut << endl;
}

int main()
{
        CHello chHello;
        chHello.print();
}
---------------------------------------------------------
何でも良いので、何かお気付きのことがありましたら、教えて下さい。
よろしくお願い致します。

No. 2347 # ふくし [E-mail] 2001/12/07 (金) 21:08:54
>2346 ゆきさんはじめまして
iostream じゃなくて iostream.h、
string じゃなくて string.h だと思います。
h は Header に通常つく拡張子です。

No. 2348 # ふくし [E-mail] 2001/12/07 (金) 22:42:14
とかいって、<iostream> だけの書き方もあるんですね。
手元の cpp ソースは、<iostream.h> でコンパイルできていたのを
<iostream> だけにしたら同様のエラーが出たので、
「.h を付けてみる」をトライする価値はあると思いますが。

No. 2349 # ゆき 2001/12/09 (日) 01:32:16
>2348 ふくしさんへ

お返事ありがとうございます。土曜は会社に行っていないため、教えて
頂いたことはまだ試していないのですが、日曜に休日出勤(サービス)
でもして試してみようかと思います。ところで、申し訳ありませんが、
もしご存知であれば、もう少し教えて頂けないでしょうか。

今回、私にソースを渡した人は、Linux環境で試したらしいのですが、
コンパイル時は gcc -lstdc++ -o hello hellocpp.cpp
というふうにしろと言っています。調べてみるとオプション-lは、
ライブラリファイルへのリンクだと知りました。こちらのマシーンを
覗いてみますと、-lstdc++は、どうやら/usr/local/bin/libstdc++を
見に行くように指定しているようなのですが、これがファイルではなく、フォルダなのです。そういうことで、よろしいんでしょうか?

しかし、仮にlibstdc++フォルダを見に行くとしても、libstdc++直下
には、iostream(.h)もstring(.h)もありません。これらは、
usr/local/bin/libioというフォルダの中にありました。

ふくしさんは、iostream.hとすると上手くいったということですが、
libstdc++フォルダの中に、iostream.hもstring.hもあったと認識して
よろしいのでしょうか?もしそうなら、それらが入っていない私の
環境は、やはりインストール時の失敗ということでしょうか・・・

もしよろしければ、お教え頂けませんか?よろしくお願い致します。

No. 2350 # 68user 2001/12/10 (月) 11:00:48
>>2348 ふくし
> とかいって、<iostream> だけの書き方もあるんですね。
C++ はよく知りませんが、namespace 対応の C++ コンパイラならば
.h を省略できるはずです。

gcc は長らく namespace への対応がダメダメでしたが、少なくとも
gcc-2.95.3 では OK です。

で、iostream はヘッダファイルです。libstdc++ はライブラリです。
ヘッダファイルがないと言われているのにライブラリのことを気に
するのは間違っています。

>>2349 ゆき
> これらは、usr/local/bin/libioというフォルダの中にありました。
それはライブラリのソースでしょう。それが /usr/local/bin/ に
あるのはおかしいです。

> コンパイル時は gcc -lstdc++ -o hello hellocpp.cpp というふうに
> しろと言っています
-lstdc++ は不要です。C で -lc が不要なのと同じで、わざわざ指定
しなくても勝手に libstdc++ はリンクされます (指定してもいいですが)。

> -lstdc++は、どうやら/usr/local/bin/libstdc++を見に行くように
> 指定しているようなのですが
どうしてそのように判断しましたか? 普通 -lhoge とすると /usr/lib/libhoge*
というファイルがリンクされます。


手もとの環境を見てみると、ヘッダファイルとライブラリは以下の
場所に置いてありますので、参考にしてみて下さい。

    Solaris8 + gcc-2.95.2
        /opt/sfw/include/g++-3/iostream
        /opt/sfw/include/g++-3/iostream.h
        /opt/sfw/lib/libstdc++.a.2.10.0
        /opt/sfw/lib/libstdc++.so.2.10.0

    FreeBSD + gcc-2.95.2
        /usr/include/g++/iostream
        /usr/include/g++/iostream.h
        /usr/lib/libstdc++.a
        /usr/lib/libstdc++.so

    Linux + gcc-2.95.2
        /usr/include/g++-3/iostream
        /usr/include/g++-3/iostream.h
        /usr/lib/libstdc++-libc6.1-2.a.3
        /usr/lib/libstdc++-libc6.1-2.so.3

結局のところ、うまくインストールできていないのではないかと思います。

No. 2351 # yama 2001/12/10 (月) 12:45:31
はじめまして。yamaと申します。
Perlで困っています。
STDOUTの初期化の方法がわかりません。
print文にてhtmlを出力していますが、途中でエラーが発生
した場合、出力済みの情報を初期化し、エラーメセージを出力したい
と考えています。
*STDOUT="";
としましたが、エラー表示以前の分も出力されます。
このようなことは不可能なのでしょうか。
プロバイダ環境はUNIXでApacheのサーバです。
なお、UNIX、Apache、Perlのバージョン
等詳しくは聞いていません。

No. 2352 # 68user 2001/12/10 (月) 13:07:35
>>2351 yama
> このようなことは不可能なのでしょうか。
不可能です。stdout に出力したものは既に出力済かもしれませんし、
まだバッファに溜っているかもしれませんが、それをクリアする
方法はありません。出力済かどうかを判断する方法もありません。

# Java Servlet だとできるんですけどね。

というわけで、自前でバッファリングしましょう。

No. 2353 # yama 2001/12/10 (月) 15:29:39
>>2352 68userさんへ

お返事ありがとうございます。
「不可能」ですか。
ロジックを変更し、必要なチェックを先にするようにします。

今後ともよろしくご指導ください。

No. 2354 # ゆうすけ [E-mail] 2001/12/10 (月) 17:30:08
いつも、お世話になっています。ダウンロードについてなんですが、
.lzhのファイルをコンパイルすることは、UNIXではできるのでしょうか。
もしできるようであれば、ダウンロードの仕方を教えてください。
ちなみに、僕は「Solaris2.6」を使っています。お返事お願いします。

No. 2355 # ふくし [E-mail] 2001/12/10 (月) 18:09:03
>2354
ゆうすけさん、はじめまして。
「lzh のファイルを UNIX でコンパイルする」
と言われると複数に解釈できて、
1)UNIX 上にある複数のファイルを固めて lzh の圧縮書庫を作る
2)どっかから持ってきた lzh の圧縮書庫を展開して、
        その中の C とかのソースツリーをコンパイルする
のどっちでしょう。

で、どっちもできます。ただし条件があって、お使いの Solaris に
lha というプログラムがあるかどうかです。
コマンドラインで「lha」と打ち込んでみてください。
ある場合は使い方が表示され、ない場合は「ない」と起こられます。

で、ある場合はそれを使い、ない場合はインストールします。
で、使い方/インストールの仕方ですが、
とりあえず「lha」というコマンドの名前までわかったので、
あとは検索するなりしてがんばってみて、
どうしてもダメだったらまた聞いてください。
そのとき上の1)なのか2)なのかそれ以外なのかも教えてください。

>2350
68userさん、フォローありがとうございます。
ていうかいつもご苦労様です。
ちょっとでも負担を軽減しようとがんばってみたんですが
役に立たず、申し訳ありません ;;;

No. 2356 # ゆき 2001/12/10 (月) 18:42:36
>>2350 68userさんへ

お返事ありがとうございました。下記2349の中で、私は勘違いな発言を
していたようです。
>-lstdc++は、どうやら/usr/local/bin/libstdc++を見に行くように
>指定しているようなのですが
とありますが、違いますよね。libstdc++の中の、libstdc++.aという
ライブラリファイルを見に行ってるということですね。ということは、
----------------------------------------------------
hellocpp.cpp:1: iostream: No such file or directory
hellocpp.cpp:2: string: No such file or directory
----------------------------------------------------
と言うエラーで見に行っているインクルードファイルは、自動的にリンク
されなければならないということでしょうか。私の行ったインストールは
どうもおかしいような気がしてきました。

ちなみに、こちらの環境は以下のようになっていました。
/usr/local/bin/libstdc++/iostream
/usr/local/bin/libio/iostream.h
/usr/local/bin/libstdc++/libstdc++.a
libstdc++.so*は検索しても無いような状況でした。やはり再インストール
をしてみようと思いますが、上記フォルダ階層はそもそも間違いで、
正しいインストール先というのは、インストール時に指定できるように
なっているものなのでしょうか?何度も申し訳ありませんが、よければ
その辺りのことを詳しくお教え願えませんでしょうか?
よろしくお願い致します。

No. 2357 # 68user 2001/12/10 (月) 19:11:40
>>2356 ゆき
> libstdc++の中の、libstdc++.aというライブラリファイルを見に行ってる
> ということですね。
インクルードとリンクは全く別物です。インクルードファイルと
ライブラリには何の関係もありません。

> 自動的にリンクされなければならないということでしょうか。
インクルードファイルはリンクするものではなく、インクルードする
ものです。

-v を付けてコンパイルすると以下のようになります。

% g++ -v a.cpp
Using builtin specs.
gcc version 2.95.2 19991024 (release)
  /usr/libexec/cpp -lang-c++ -v -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -Di386 -Dunix -D__FreeBSD__=4 -D__FreeBSD_cc_version=420000 -D__i386__ -D__unix__ -D__FreeBSD__=4 -D__FreeBSD_cc_version=420000 -D__i386 -D__unix -Acpu(i386) -Amachine(i386) -Asystem(unix) -Asystem(FreeBSD) -D__EXCEPTIONS -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__ELF__ a.cpp /tmp/ccFhD943.ii
GNU CPP version 2.95.2 19991024 (release) (i386 FreeBSD/ELF)
#include "..." search starts here:
#include <...> search starts here: ← ここ★
  /usr/include/g++ ← ここ★
  /usr/include ← ここ★
  /usr/include ← ここ★
End of search list.
The following default directories have been omitted from the search path:
End of omitted list.
  /usr/libexec/cc1plus /tmp/ccFhD943.ii -quiet -dumpbase a.cc -version -o /tmp/cctFu943.s
GNU C++ version 2.95.2 19991024 (release) (i386-unknown-freebsd) compiled by GNU C version 2.95.2 19991024 (release).
  /usr/libexec/elf/as -v -o /tmp/ccvXl943.o /tmp/cctFu943.s
GNU assembler version 2.10.0 (i386-unknown-freebsd4) using BFD version 2.10.0
  /usr/libexec/elf/ld -m elf_i386 -dynamic-linker /usr/libexec/ld-elf.so.1 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/libexec/elf -L/usr/libexec -L/usr/lib /tmp/ccvXl943.o -lstdc++ -lm /usr/lib/libgcc.a -lc /usr/lib/libgcc.a /usr/lib/crtend.o /usr/lib/crtn.o

★を付けた部分でインクルードファイルの取り込みが行われます。

この環境では、標準のインクルードファイルは /usr/include/g++、
/usr/include である、ということがわかります。そこにインクルード
ファイルが置いてあれば何もエラーは起こらないはずです。

で、★の部分が終わったら初めてライブラリが出てくるわけで
(ld がライブラリをリンクする)、★がうまくいかないのに
ライブラリが云々と悩むのはおかしいです。

> /usr/local/bin/libstdc++/iostream
> /usr/local/bin/libio/iostream.h
> /usr/local/bin/libstdc++/libstdc++.a
これはソースで、本来不要なファイルではないですか? /usr/local/bin/ に
ファイルを展開して、そこで make したんじゃないかと想像しますが。

> 上記フォルダ階層はそもそも間違いで、
おそらく間違いでしょう。

> 正しいインストール先というのは、インストール時に指定できる
> ようになっているものなのでしょうか?
ソースからコンパイルしたなら、make 時に指定することもできますが、
普通はデフォルトのディレクトリにインストールします。

とりあえず package を利用してはどうですか?
    ftp://SunSITE.sut.ac.jp/pub/sun-info/Solaris/sparc/2.5/gcc-2.95.3-sol25-sparc-local.gz

No. 2358 # 68user 2001/12/10 (月) 22:38:31
>>2337 aki
おっと、見逃していました。

> /etc/groupのファイルのrootグループに追加するだけで
> はいけないのでしょうか。
root グループにはなれますが、root にはなれません。
sudo など、setuid などで検索してみてください。

No. 2359 # kanji 2001/12/11 (火) 14:58:52
はじめましてkanjiと申します。コマンドのページを良く利用させて頂いています。感謝です。
UNIXの掲示板で、Linuxの質問をよろしいでしょうか。
本題の質問なのですが、初めてRedHat Linux7Jをインストールし、Webサーバの構築を考えています。
ですがPCMCIAのNWカードを認識してくれません。(3com 3c589Dを使用)
そこでPCMCIAのドライバをインストールしようとpcmciacs.3.1.30.tar.gz を入手し、
#zcat pcmciacs.3.1.30.tar.gz | tar xvf -
#cd pcmciacs.3.1.30.tar.gz
#make config
を行なうと、configエラーが出ます。ソースツリーが無いと言われます。
ソースツリーとはどのようなもので、どうやってインストールすれば良いのでしょうか。
よろしくお願い致します。

No. 2360 # ふくし [E-mail] 2001/12/11 (火) 15:26:42
>>2359 kanji
pcmciacs.3.1.30.tar.gz を展開した
pcmciacs.3.1.30 以下のディレクトリ構造がソースツリーでは。

% cd pcmciacs.3.1.30.tar.gz
ではなくて、
% cd pcmciacs.3.1.30
では?
〜.tar.gz は圧縮ファイルです。
cd は Change Directory です。

No. 2361 # 68user 2001/12/11 (火) 15:34:40
>>2360 ふくし
> pcmciacs.3.1.30 以下のディレクトリ構造がソースツリーでは。
Linux も pcmcia も全然知りませんけど、
    http://www.linux.or.jp/JF/JFdocs/PCMCIA-HOWTO-2.html
などを見るに、カーネルソースを展開して、そこに pcmciacs*.tar.gz を
展開して、make config && make all && make install してモジュールを
インストールすべきなのに、カーネルソースツリーが存在していないので
エラーになってるんじゃないでしょうか。

>>2359 kanji
> configエラーが出ます。
具体的にどういうエラーが出るかをちゃんと書けば、何が問題か
わかる人にはわかるでしょう。

# 僕は残念ながら わからない人です。

No. 2362 # kanji 2001/12/11 (火) 15:48:57
>>2360 ふくし
>>2361 68user
すみません、わかりました。
ありがとうございました。

カーネルソースの展開が抜けているのでしょう。
早速やってみます。

No. 2363 # inaba 2001/12/12 (水) 15:01:21
初めまして、inabaと申します。

>>2359 kanji
3com だったら、ディフォルトで認識してくれると思いますが…。
ただ、network と pcmcia の起動順が逆なので失敗しているのかも。
# cd /etc/init.d
# ./pcmcia restart
# ./network restart
と入力してみてください。
# ifconfig
で、eth0 が認識されていませんか?
見当違いだったらすみません。

No. 2364 # わたなべ [E-mail] 2001/12/12 (水) 19:16:45
はじめまして、渡邊と申します。
ネットワークプログラムに興味があり、POP3 クライアントを作ってみよう(2)の POP3 クライアントサンプルを動作させてみました。
お聞きしたいのは、このままでちゃんとメールが表示されるプロバイダーと表示されないプロバイダーがあり、ニフティでは途中で固まってしまいます。認証までは動いているようで、LISTので止まっているようです。
どうすれば、いいか教えていただけませんか?

No. 2365 # 68user 2001/12/12 (水) 22:11:13
>>2364 わたなべ
> LISTので止まっているようです。
http://x68000.startshop.co.jp/~68user/net/sample/pop3-client.pl ですね?

telnet で pop3 サーバと話してみるとどうなりますか?

LIST 送信の後の
    while (<SOCKET>){
        m/^\.\r\n$/ && last;

    while (<SOCKET>){
        print "[$_]";
        m/^\.\r\n$/ && last;
として実行すると何が表示されますか?

Windows マシンで動かしていますか? (環境はちゃんと書きましょう)
もしそうなら
    socket(SOCKET,PF_INET,SOCK_STREAM,0)|| die ...
の後に
    binmode(SOCKET);
という行を追加するとどうなりますか?

No. 2366 # kuw 2001/12/12 (水) 23:55:57
はじめまして。いつも勉強させてもらっています。

>>2364 わたなべ
> LISTので止まっているようです。
私も、pop3 クライアントを自作したときに、同じことを経験しました。
そのときは、pop3 サーバが NT で、
> +OK IMS POP3 Server 0.87 Ready
というものだったのですが、
LIST の返事に、"." のみの行がなかったのです。
> +OK 0 message (0 octets)
> 0 messages (0 octets)
こんな感じでした。

Prev< No. 2276〜2366> Next  [最新発言に戻る] [過去ログ一覧]