↑AGATASHI's Archive| ↑↑トップページ|
foreachループとsh(bash)のforループ
line-number-modeにする
fortran-modeで動くようにする
fortran-modeで,FORTRAN90を使いやすくする
とします.逆にIPアドレスからホスト名(ドメイン名までくっついたもの)を引くこともできます.他にもいろいろ機能のある命令です.man nslookupをよく読んでみましょう.これはDNSからIPアドレスを引っ張ってくる命令ですが,DNS自体をどこにするかという設定は,普通は/etc/resolv.confに置かれます.% nslookup hogehoge
とします.OSやpingのバージョンによって動作は少し違いますが,いちばん簡単な反応を返すものは,もし相手とIPで通信できる場合にはhogehoge is aliveといった行を表示します.ただし,異常終了する場合は,大きく分けて三つの可能性があるのできちんと区別しなければなりません.% ping hogehoge
のようにIP直打ちでpingしてみましょう.どうしても相手に到達できない?まず近くのホストにはpingできますか?近くの相手から始めて,だんだん遠くのホストにpingの対象を移してゆきましょう.どこが原因か大体分かるはずです.% ping 123.45.67.89
なんてやりたくなりますが,これだとmakeが異常終了した場合も./hogehogeが実行されてしまいます.makeが正常終了した場合のみ次の./hogehogeを実行するようにするには,&&でコマンドをつなぎます:% make; ./hogehoge
のような感じです.% make && ./hogehoge
foreachループとsh(bash)のforループという感じ.カッコの前に「% foreach F ( *.html ) foreach? echo $F foreach? end (表示される)
in」をつけてしまうと間違いです.というわけで,リストにかっこは不要で,また$ for F in *.html ; do > echo $F > done (表示される)
inとdoが必要(forと同じ行にdoを書くなら,その直前にセミコロンが必要)という点が注意です.
を行っておく必要があります(もちろん~/.cshrcで行ってもよい).% set filec
こんな感じです.aliasでigrepなんて命令を「作って」も面白いですね.% grep -n -i start *.c
こんな感じです.これはcshに備わっているヒストリー機能の一つ(前に行なった作業の一部を変えてもう一度行なうときに便利)を用いるものです.% ls *.f90~ (もちろん-alFはなくてもいい) foo.f90~ bar.f90~ hoge.f90~ (↑これでファイルを確認) % ^ls^rm -f rm -f *.f90~
% find . -name '*.dat' -exec gzip {} \;
という感じで,該当ファイル名を「{}」で表し,execさせるコマンドの終了はエスケープした「;」となります.
line-number-modeにする; ; set line-number-mode ; ( line-number-mode 1 )
fortran-modeで動くようにする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になります.
fortran-modeで,FORTRAN90を使いやすくするfortran-modeのバージョンによっては,次のような点でFortran90の仕様に難点を覚えるかもしれません: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になります.これは後で詳しく書くかもしれません.
のように,つまりいつものシェルからのgrep命令と同じように入力すると,現在カーソルのあるウィンドウにとってのカレントディレクトリの下をgrepして,その結果を別ウィンドウに表示してくれます.たとえば上記のカレントディレクトリが~/pub/fooでgrep -n stderr *.cした結果はこんな表示になります:Run grep (like this): grep -n hogehoge *.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行目をエディットしたいとしましょう.どうしますか? これは
のように,-nwオプションをつけて実行すればその端末の中でmuleが実行できます.%mule -nw
(4並列の場合)とします.一方,GNUのgmakeの場合は,% dmake -j 4
(4並列の場合)とします.どちらも4つのジョブが同時に動き始めます.複数のCPUがある場合は非常に高速化がはかれます(実はdmakeは−rshでdmakeをリモート起動できるならば−複数のホストに負荷を分散するという強烈な並列化が可能です).おそらく一般ユーザが最も簡単にできる並列化でありましょう.なお,dmakeについてはdocs.sun.comの「dmakeユーティリティの使用」(「Sun WorkShop TeamWare ユーザーズガイド」より) ,gmakeについてはGNUのマニュアル内の「Parallel Execution」を参考にしてください.% gmake -j4
こんな感じです.そして実行のときには,% f77 -parallel -o hogehoge hogehoge.f
(3並列の場合←ちなみに並列数はCPUの数マイナス1より多くしない方が賢明です.数字が大きすぎるとかえって遅くなりますし,OSのスケジューリング機能がタコな場合は他人のプロセスに悪影響を与える場合も考えられます)とします.簡単でしょう?並列化というと何かすごそうですが,少なくとも入り口は敷居が低いのです. しかしここで疑問が出てくるかもしれません.いったいコンパイラは,プログラムのどこを並列化したのでしょうか?それは要するに,コンパイラが「これは並列化できるな」と思ったところだけ並列化したのです.具体的には% setenv PARALLEL 3 % ./hogehoge
A(:,:)=B(:,:,3)のような配列演算や,単純なDOループ(なかでcallを行わず,また各ループ間依存が明らかに存在しないということがコンパイラのような機械仕掛け判定ですら分かる)などが考えられます.しかしこの判定はかなり慎重なもので,ちょっとでもアヤシイ部分は並列化されないようです.