UNIX TIPS

AGATASHI's Archive| ↑↑トップページ


もくじ


ほんぶん

ホスト名からIPアドレスを得るには
 知っていれば簡単.hogehogeというホストのIPアドレスを知りたい場合は
% nslookup hogehoge
とします.逆にIPアドレスからホスト名(ドメイン名までくっついたもの)を引くこともできます.他にもいろいろ機能のある命令です.man nslookupをよく読んでみましょう.これはDNSからIPアドレスを引っ張ってくる命令ですが,DNS自体をどこにするかという設定は,普通は/etc/resolv.confに置かれます.
(2000.10.16) ↑ページ先頭
 
通信相手は生きているか?
 これも基本知識ですが,簡単すぎると思われてるのか,書いてない資料もありますね.ping命令です.
% ping hogehoge
とします.OSやpingのバージョンによって動作は少し違いますが,いちばん簡単な反応を返すものは,もし相手とIPで通信できる場合にはhogehoge is aliveといった行を表示します.ただし,異常終了する場合は,大きく分けて三つの可能性があるのできちんと区別しなければなりません.
  1. そもそも相手が通信可能でない(シャットダウン/ケーブル異常など) 数秒の沈黙ののち,no answer from hogehogeといった文字列が出てきます.
  2. それ以前に自分が通信可能でない(笑) ping 127.0.0.1してみましょう.
  3. ホスト名からIPアドレスがわからない
    1. DNSが死んでいる 
    2. ホスト名間違い unknown host hogehogeのようにでます
というわけで問題は相手側にあるのかDNSにあるのか判断する必要があります.上記nslookupでホスト名からIPが得られるかどうか確認し,もし確認できたらDNSの問題ではありません.というわけで次に
% ping 123.45.67.89
のようにIP直打ちでpingしてみましょう.どうしても相手に到達できない?まず近くのホストにはpingできますか?近くの相手から始めて,だんだん遠くのホストにpingの対象を移してゆきましょう.どこが原因か大体分かるはずです.
(2000.10.18/10.22改) ↑ページ先頭
 
tcshでのファイル名オートコンプリートで,候補一覧を出す
 bashのファイル名オートコンプリートでは,TABを押したときに複数の候補がある場合は,それがズラリと表示されます.tcshでは,Ctrl-Dを押せば同じ機能が使えます.
(2000.10.18) ↑ページ先頭
 
コマンドの連続実行.ただしエラーが起きたらそこで止める
 makeを試し,上手くいったら生成されたプログラムをすぐ実行するということを考えてみましょう.このとき,(出来るプログラムの名前をhogehogeとすると)
% make; ./hogehoge
なんてやりたくなりますが,これだとmakeが異常終了した場合も./hogehogeが実行されてしまいます.makeが正常終了した場合のみ次の./hogehogeを実行するようにするには,&&でコマンドをつなぎます:
% make && ./hogehoge
のような感じです.
(2000.10.26) ↑ページ先頭
 
csh(tcsh)のforeachループとsh(bash)のforループ
 どちらか一方を覚えるともう片方を忘れてしまう人(もちろん私のこと(笑))のために:csh(tcsh)の場合は
% foreach F ( *.html )
foreach? echo $F
foreach? end
(表示される)
という感じ.カッコの前に「in」をつけてしまうと間違いです.
 続いてはsh(bash)の場合:
$ for F in *.html ; do
> echo $F
> done
(表示される)
というわけで,リストにかっこは不要で,またindoが必要(forと同じ行にdoを書くなら,その直前にセミコロンが必要)という点が注意です.
(2001.2.3) ↑ページ先頭
 
cshでのファイル名オートコンプリート
 オートコンプリートは,何もbashtcshの専売特許ではありません.Ctrl-Dを押したときに,候補が表示されます(それは完全なオートコンプリートとは言わないかもしれませんが).ただし,それには
% set filec
を行っておく必要があります(もちろん~/.cshrcで行ってもよい).
(2000.10.18) ↑ページ先頭
 
grepで,大文字小文字を区別しない比較を行う
 grepで,たとえば「START」と「start」と「Start」を全部同時に探したい場合,もちろん正規表現を使ってもいいのですが,-iオプションを用いると簡単な場合があります.
% grep -n -i start *.c
こんな感じです.aliasigrepなんて命令を「作って」も面白いですね.
(2000.10.20) ↑ページ先頭
 
csh, tcshで安全に複数のファイルを消去する
 複数のファイルを,ワイルドカードを使って一気に消去したい場合,rm -f *.f90~などのようにすればいいのですが,これは危険です.というのはrm -f *まで打ったときに間違えてリターンを押してしまったらどうなりますか?というわけで,消去すべきファイルを確認してからそのファイルだけを消す方法が欲しくなります:
% ls *.f90~ (もちろん-alFはなくてもいい)
 foo.f90~  bar.f90~  hoge.f90~
(↑これでファイルを確認)
% ^ls^rm -f
rm -f *.f90~
こんな感じです.これはcshに備わっているヒストリー機能の一つ(前に行なった作業の一部を変えてもう一度行なうときに便利)を用いるものです.
(2000.10.21) ↑ページ先頭
 
find命令のexec方法を忘れてしまった人のために
 非常に便利なのだけどちょっとややこしく,かつあまり使う頻度が大きくないためにどうしても忘れがちなのがこれ.使いたいときに限ってどうしても思い出せないフラストを感じた人いません?
% find . -name '*.dat' -exec gzip {} \;
という感じで,該当ファイル名を「{}」で表し,execさせるコマンドの終了はエスケープした「;」となります.
(2001.1.26) ↑ページ先頭
 
muleで最初からline-number-modeにする
 基本中の基本.ぜひ覚えましょう.こんな行を~/.emacsに追加します.
;
; set line-number-mode
;

( line-number-mode 1 )

(2000.10.15) ↑ページ先頭
 
mule*.f90などもfortran-modeで動くようにする
 *.f*.forなど,Fortran77ちっくなファイルしかfortran-modeで動かないようになっている場合があります(fortran-modeのバージョンによるのでしょうが).その時は,こんな風な行を~/.emacsに追加します.
;
; for *.F
;

(setq auto-mode-alist
      ( cons '("\\.F$" . fortran-mode)
             auto-mode-alist))

;
; for *.F90 and *.f90
;

(setq auto-mode-alist
      ( cons '("\\.[Ff]90$" . fortran-mode)
             auto-mode-alist))

;
; for *.inc
;

(setq auto-mode-alist
      ( cons '("\\.inc$" . fortran-mode)
             auto-mode-alist))
		
これで,*.F*.F90*.f90*.incを開いたときに,自動的にfortran-modeになります.
(2000.10.16) ↑ページ先頭
 
 
mulefortran-modeで,FORTRAN90を使いやすくする
 fortran-modeのバージョンによっては,次のような点でFortran90の仕様に難点を覚えるかもしれません:
  1. 行頭で数字を入力すると勝手に行番号とみなされ,自動的にその行の2〜5カラムに数字が飛ばされてしまう
  2. C-c ;などでコメントを入れるとコメント文字が「!」でない(涙)
ここは,fortran-modeに入ったときC-h mをおしてfortran-modeのヘルプを見てみましょう.そうすると,たくさんの設定可能変数が出てきます.以下では(ちょっと筆者自身の好みも入っていますが)FORTRAN90でも何とか使えるようにこれらの変数を変えてみることを試みてみました.次のような行を~/.emacsに加えます:
(add-hook 'fortran-mode-hook
      '(lambda ()
        (setq comment-start "!")
        (setq fortran-do-indent 4)
        (setq fortran-if-indent 4)
        (setq fortran-structure-indent 4)
        (setq fortran-blink-matching-if t)
        (setq fortran-cotinuation-string "&")
        (setq fortran-comment-region "!!")
        (setq fortran-electric-line-number nil)
	(abbrev-mode 1)
        ))

なお,;in<スペース>と打っただけでinteger と入力されるAbbrev-modeというモードにすることができ,これは上記の(abbrev-mode 1)により自動的にONになります.これは後で詳しく書くかもしれません.
(2000.10.16 / 10.21改) ↑ページ先頭
 
muleの中からgrepする
 muleM-x grep(リターン)と押すと,画面下にRun grep (like this): grep -nのようにでてきます.カーソル位置にgrep命令を,たとえば
Run grep (like this): grep -n hogehoge *.c
のように,つまりいつものシェルからのgrep命令と同じように入力すると,現在カーソルのあるウィンドウにとってのカレントディレクトリの下をgrepして,その結果を別ウィンドウに表示してくれます.たとえば上記のカレントディレクトリが~/pub/fooでgrep -n stderr *.cした結果はこんな表示になります:
cd ~/pub/foo/
grep -n stderr *.c /dev/null
hogehoge.c:31:      (void) fprintf(stderr, "line %d of %s: %s\n", line, file, nc_strerror(stat));
fugafuga.c:56:      /* Error output to stderr */

grep finished at Thu Oct 19 14:54:41
ここでは,stderrという文字列は二つ見つかりました.それぞれの行は「ファイル名:行番号:行の内容」という順番になっています. さて,この二つのうち,二つ目の行,つまりファイルfugafuga.cの56行目をエディットしたいとしましょう.どうしますか? これは そうすると,結果ウィンドウとは別のウィンドウに,当該ファイル(fugafuga.c)が開き,そして嬉しいことに当該行(56行目)にカーソルが自動的に移っています.
(2000.10.19) ↑ページ先頭
 
Xウィンドウ環境において,xtermなどからmuleを立ち上げるとき,新たなwindowを開かず現在の端末でmuleが実行されるようにする.
 X環境でxtermなどの端末からmuleを起動するとき,大抵は(←設定による)新しいウィンドウが開いてその中でmuleが実行されます.これはこれで便利なのですが,muleを実行するホストと画面を表示するホストが異なる場合(Xではこれが柔軟に行える),設定がきちんとしていないとエラーが出ることがあります.
 もちろんきちんと設定をすればいいんでしょうが,いろいろ事情があって出来ないとか,どうやってもだめだった,という場合がありますね.こういう場合はもとの端末画面の中でmuleを実行するという手があります.
%mule -nw
のように,-nwオプションをつけて実行すればその端末の中でmuleが実行できます.
(2001.2.2) ↑ページ先頭
 
並列メイク
 makeで多くのファイルをコンパイルしているときに,こういうことを考えたことはないでしょうか?「それぞれのコンパイルが並列で走ればもっと速くなるのに」.それは実は簡単に可能なのです.ただしmakeとしてSun Workshop Compilers付属のdmakeかGNUのgmakeを使う場合です.まず,SUNのdmakeの場合は
% dmake -j 4
(4並列の場合)とします.一方,GNUのgmakeの場合は,
% gmake -j4
(4並列の場合)とします.どちらも4つのジョブが同時に動き始めます.複数のCPUがある場合は非常に高速化がはかれます(実はdmakeは−rshdmakeをリモート起動できるならば−複数のホストに負荷を分散するという強烈な並列化が可能です).おそらく一般ユーザが最も簡単にできる並列化でありましょう.なお,dmakeについてはdocs.sun.comの「dmakeユーティリティの使用」(「Sun WorkShop TeamWare ユーザーズガイド」より) ,gmakeについてはGNUのマニュアル内の「Parallel Execution」を参考にしてください.
(2000.10.16) ↑ページ先頭
 
【SUN FORTRAN】並列化初歩の初歩
 SUN Workshop Compilers(現在はForte Developerという名前)で,f77あるいはf90を使うとき,おそろしく簡単に並列化が出来てしまう方法があります.それは,コンパイルオプションをすこし追加するだけで出来るのです.
% f77 -parallel -o hogehoge hogehoge.f
こんな感じです.そして実行のときには,
% setenv PARALLEL 3
% ./hogehoge
(3並列の場合←ちなみに並列数はCPUの数マイナス1より多くしない方が賢明です.数字が大きすぎるとかえって遅くなりますし,OSのスケジューリング機能がタコな場合は他人のプロセスに悪影響を与える場合も考えられます)とします.簡単でしょう?並列化というと何かすごそうですが,少なくとも入り口は敷居が低いのです. しかしここで疑問が出てくるかもしれません.いったいコンパイラは,プログラムのどこを並列化したのでしょうか?それは要するに,コンパイラが「これは並列化できるな」と思ったところだけ並列化したのです.具体的にはA(:,:)=B(:,:,3)のような配列演算や,単純なDOループ(なかでcallを行わず,また各ループ間依存が明らかに存在しないということがコンパイラのような機械仕掛け判定ですら分かる)などが考えられます.しかしこの判定はかなり慎重なもので,ちょっとでもアヤシイ部分は並列化されないようです.
 プログラマ側が「ここのループは絶対に並列化しろよ」と明示的に指定する方法については別に解説します.
 また,POSIX threadやSolarisThread系の並列化(コード中でスレッド分けやロックをきめこまかく行う)についてはあまりにマニアック高度になるのでここでは解説しません.HPC(High Performance Computing)のプロになりたい人はぜひ学んで欲しい事柄ですが.
 なお,このコンパイラによる並列化の詳細についてはdocs.sun.comの「並列化」(「Sun WorkShop Fortran プログラミングガイド 」より)を参考にしてください.
(2000.10.22/10.25改) ↑ページ先頭