ちょっとつまづくlinux


webをさ迷った結果得られた答え達。 他の場所で同じような記述が見られた場合、そちらが本家です。

Q.1

片やプライベートアドレスのコンピュータ、片やグローバルアドレスのコンピュー タのときに、ファイルを送信しようとftpを起動した。 しかし、下のようなエラーを出してしまう。
ftp> ls
500 Illegal PORT Command
ftp: bind: Address already in use
ftp>
なぜか。

A.1

普通の ftp では制御用とデータ用に2つのコネクションが必要。 一つはポート 21、もう一つはクライアント側が接続時に指定するので決まってい ない。 それで、firewall越し(含 masquerade)の場合には passive mode (ポート21し か使わない)にしないとうまくデータ転送できない。 ちなみに、ncftp や netscape はpassive mode しか利用しない。

MacOS の fetch でも、このような環境の場合、firewall の設定 (passive mode)にしないとうまく使えないと思います。


Q.2

カレンダーをつくりたいのだけれど、簡単に作る方法ってある?

A.2

emacsとplatexだけでつくれる。他のツールは必要ない。 emacs上で「M-x calender」でカレンダーモードに入ってから、 以下のコマンドたちを使って、ソースを生成。 latexで処理をすれば完成。

t m
月間カレンダーを生成(cal-tex-cursor-month)。
t M
横長月間カレンダーを生成
(cal-tex-cursor-month-landscape)。
t d
1日のカレンダーを生成(cal-tex-cursor-day)。
t w 1
1ページの週間カレンダーを生成(cal-tex-cursor-week)
t w 2
2ページの週間カレンダーを生成(cal-tex-cursor-week2)
t w 3
ISO形式週間カレンダーを生成
(cal-tex-cursor-week-iso)
t w 4
週を月曜で始めるカレンダーを生成 (cal-tex-cursor-week-monday)
t f w
システム手帳形式2週間早見カレンダーを生成
(cal-tex-cursor-filofax-2week)
t f W
システム手帳形式週間早見カレンダーを生成 (cal-tex-cursor-filofax-week)
t y
年間カレンダーを生成(cal-tex-cursor-year)
t Y
横長年間カレンダーを生成 (cal-tex-cursor-landscape-year)
t f y
システム手帳形式年間カレンダーを生成 (cal-tex-cursor-filofax-year)

参考ページEmacs Manual


Q.3

PostScriptファイルの連結方法ってある?

A.3

方法その1

gs -q -sDEVICE=pswrite -dNOPAUSE -dBATCH -sOutputFile=ファイル名 PSfile1 PSfile2 ...

方法その2

psmultiを使う。 ただし、そのままではperl5で使えないので、少し手を加えなければならない。 パッチを当てるか、以下の変更をする。


/usr/bin/perl が perl5 になってしまって psmulti が動かなくなったけど、 /usr/local/lib/psmulti/pspp-util.pl の 91 行と 104 行の @ の前に \ を入れれば一応動いているようだ。

Q.4

MP3Serverって本当にあるの?

A.4

ストリーミング放送できるサーバがある。 linuxで使えるフリーのやつだと、icecast+shoutといったところ。

設定方法については、他のページを参照のこと。


Q.5

バイナリファイルをcatなどで表示させたら、端末が化けた。直せるの?

A.5

開き直さなくてもなおる。 "echo" と、"スペース" の 5文字をタイプ。続いて、"Control+V"、"esc"、 "c"、"Enter" と、4文字をタイプ。

Q.6

Linuxでフロッピーのフォーマットはどうするの?

A.6

以下の2つのコマンドを打てば良い。
#fdformat /dev/fd0
     (または,# fdformat /dev/fd0H1440)
# mkfs -t ext2 -m 0 /dev/fd0H1440 1440 

Q.7

Atok Xが体になじみません。どうすればいいですか?

A.7

キーバインドをwnn方式にしましょう。「メニュー」→「カスタマイザ」 で、スタイルをwnnにしましょう。これでかなり違和感は緩和されるはず。

つぎに、「.Xdefaults」に次の一文を加えましょう。 これにより、Ktermがいきなり死ぬことはなくなりました。

KTerm*openIm: true

そのほかに、 えせかんなを利用することも考えられます。 しかし、AtokXに関しては、今はまだ開発版の様です。 もう少し待った方がよいかもしれません。

また、IIIMECFというのもあります。入れてみたけれど、 なんかうまくいかなかったので、使ってません。


Q.8

今度ホームページを移転することになりました。 しかし、ページがたくさんありすぎてメールやリンクのアドレスを 変更するのが一々大変です。何か良いアイディアはありませんか?

A.8

perlでやれば3秒で終了します。

find . -type f -exec perl -pi.back -e 's/kenstar/ks/g' {} \;

このコマンドラインは、findとperlを組み合わせてます。 ここでのfindの使い方は、「.(カレントディレクトリ)」を起点とし、 タイプがファイルであるものを探し、太字の部分を実行する、というもの。 もし、ファイル名で指定したい場合は、「-name "*html"」などとすれ ば良いでしょう。 太字のあとの「{} \;」とは、そこにファイル名が入ってくるよ、 という意味です。 詳しくはmanを見てください。

太字で書かれた部分の説明。
perlのスイッチが3つ。「i」「p」「e」。

つまりこの場合、次のような動作をすることになる。 ファイル名を受取り、そのファイルのバックアップを「〜.back」としてとる。 そして、元のファイル名に処理結果がprintされる。

while(<>){
	s/kenstar/ks/g;
}continue{
	print; #出力ファイルに出力。
     }

途中に改行が入ってるときもうまくやりたいんだけど、という人は、 もう少し複雑にしましょう。かなり長くなりますよ..
当然、本来は一行で書きます。

find . -type f -exec   
perl -pi.back -e 'BEGIN{undef $/;$in="kenstar"; $out  = "ks"; $new = join "\\s*", split /\B/,  $in;} 
s/$new/$out/g' {} \;
ポイントを備忘のために。
  • $/‥$/(=\n)を基準に一行としていたが、定義しないことで、 ファイル全体を一度に読み込む。
  • join "\\s*", split /\B/, $in‥$inの一文字一文字の間に"\\s*"を入れる。
    • split /\B/‥一文字づつを別々にして、配列とする。
    • join "\\s*"‥配列の間に"\\s*"をいれて文字列にする。

Q.9

ターミナルでログをとるとき、時間を入れたいのですが。

A.9

プロンプトに時刻を入れましょう。

TeraTermのロギング機能やscriptコマンドを使用すれば、端末の操作状況を記録 することができます。しかし、コマンドを打ち込んだときの時間は記録されない ため、後から記録したログを参照するときに不便なことがあります。
■scriptでlogに記録
yutaka@kid(~) script log
・・・端末操作・・・
yutaka@kid(~) exit

■logにはCR(0Dh)が付いているので取り除く
yutaka@kid(~) col -bfx < log > log2

■ログを見ると打ち込んだコマンド時の時刻は分からない
yutaka@kid(~) less log2
スクリプトは Sun May 14 14:19:45 2000
 に開始しましたyutaka@kid(~) ls
backup*        doc/   log    root_backup*  tcshrc.org  tool/  vimrc.org
backup.tar.gz  java/  perl/  src/          tmp/        usr/
yutaka@kid(~) date
Sun May 14 14:19:51 JST 2000
yutaka@kid(~) uname -a
Linux kid.homelan 2.2.13-33 #1 Sun Mar 19 15:01:16 JST 2000 i586 unknown
...
スクリプトは Sun May 14 14:20:25 2000
 に終了しました

そこで、プロンプトに時刻を表示させることを考えます。tcshではシェル変数prompt に設定をすることで様々なカスタマイズが可能となっています。
時刻・日付の設定は%t(%T), %p(%P), %d(%D)などです。 詳しい設定方法はman tcshでpromptの節を見てください。
■現在の設定
yutaka@kid(~) set | grep prompt
prompt  %n@%m(%~)
prompt2 %R?
prompt3 CORRECT>%R (y|n|e|a)?

■時刻表示を追加
yutaka@kid(~) set prompt="%n@%m[%P](%~) "
yutaka@kid[14:53:12](~)


Q.10

ディレクトリを下に下がっていって、特定文字列を含むファイルを探した い。

A.10

findとgrepを組み合わせることで、ディレクトリ階層を探索してファイル検索を 行えます。
find . -type f -name "*" -print | xargs grep -n キーワード /dev/null
ファイルのみを対象としたいときはfindのオプションで -type f とします。 -execを使ってgrepを起動することもできますが、ファイルが見つかる度にgrep が 起動されることになり速度が低下します。そこで、xargsを利用して見つかった ファイルを一度にgrepへ渡すことで高速化します。grepに/dev/nullを渡してい る のは、検索対象ファイルが1つのみの場合はgrep出力結果にファイル名が含まれ ない からで、擬似的に/dev/nullという空のファイルを指定することでそれを回避し て います。

コマンドが少し長いのでスクリプト化しておくと便利です。
yutaka@(~/tool) more se
find . -type f -name "*" -print | xargs grep -n $1 /dev/null |more

■Fibreというキーワードで検索
yutaka@kid(/usr/src/linux/drivers/net) se Fibre
./Config.in:235:bool 'Fibre Channel driver support' CONFIG_NET_FC
./Space.c:140:/* Fibre Channel adapters */
./de4x5.h:526:#define MEDIA_FIBRE    0x0008      /* Fibre Media present
*/
./fc/iph5526.c:2: * iph5526.c: IP/SCSI driver for the Interphase 5526
PCI Fibre C
...


Q.11

perlを使って、画像ファイルの大きさを知りたいのですが。

A.11

ImageMagickのperlライブラリである PerlMagickを使うのが一番簡単です。使用例はこうなってます。
     
#!/usr/bin/perl
use Image::Magick;
$image = new Image::Magick;
$image->Read("aa.jpg");
$width =  $image->Get('columns');
$height = $image->Get('height');
print "<img src=\"$_\" width=\"$width\" height=\"$height\">$_\n";
より詳しく知りたければ、 PerlMagick Get an Image Attributeを参照すると情報がたくさん載っています。