Linux その4 伊藤敏 この連載をきっかけに,Linuxを導入された方の多くが,DOSやMS-Windowsの環境を合わせ持っておられることと思います.そして,DOS等で作った多くの文章やデータがあると思われます.そこで,DOS等のデータをLinuxの環境に持ってくる方法の紹介と設定をしましょう. Linuxから直接DOS等のハードディスクにアクセスできるようにします.現在の筆者の環境は連載1で述べたようにIDEのハードディスクの /dev/hda1 がDOS /dev/hda4がLinuxのパーティションです.そこで,Linuxのファイルシステムの一部にDOSのパーティションをくっつけてしまいます.これから述べる作業はrootでloginして,設定をしてください. rootでloginして,/dos/cと言うディレクトリを作ります. # mkdir /dos # mkdir /dos/c この/dos/cにDOSのパーティション領域を表す/dev/hda1をマウント(mount: つぎ木)します.手でマウントする時は # mount -rt msdos /dev/hda1 /doc/c とします.これでDOSの領域を読み取ることが出来ます.書き込みも可能にするには # mount -t msdos /dev/hda1 /doc/c とオプションの -rt の 'r' をとります.いずれにしても,マウントはrootでないと原則として出来ません(リムーバブルなメディアに対しては,ユーザでもマウントできるような設定を同時に紹介します).DOSとのデータのやりとりをするたびにrootになり,マウントするのは面倒です.そこで,Linuxを立ち上げる時に自動的にマウントするようにしましょう.立ち上がる時に自動的にマウントするには /etc/fstab と言うファイルにマウントするパーティションとマウント先を設定します. /etc/fstabをMuleでリスト1のように編集しましょう. ** リスト1 /etc/fstabファイル /dev/hda3 swap swap defaults /dev/hda4 / ext2 defaults /dev/sda3 /home ext2 defaults /dev/hda1 /dos/c msdos umask=000 <- この行を追加 /dev/scd0 /cdrom iso9660 user,auto,ro <- 'user,auto'を追加 none /proc proc defaults ******* これで,次回からLinuxを立ち上げると /dos/c にDOSの領域がマウントされます(また,CD-ROMもユーザがマウントしたりアンマウントできます).もちろん,DOSが入っている領域が/dev/hda1以外にもあり,そこも起動時にマウントしたい場合はマウント先を作り/dev/hda1の行と同様に皆さんの環境のパーティションを入れた行を追加して下さい.では,DOS領域のファイルのリストを取って見ましょう. # ls /dos/c 123r4jw/ batfiles/ configus.us* lgpib.vi* stw_win/ 26.dat* cholest/ cq/ lotusapp/ tool/ 中略 autoexec.us* config.us* labview/ sb16/ wterm/ これで,Linuxから直接DOSのファイルを見たり,加工したり,消去ができます.ただし,これら(見るのはユーザでも可能)ができるのは現状ではrootの権限を持たなければできません.しかし,通常の仕事は先月登録をしたlogin名で行います.そして,DOSとのやりとりにいちいちrootになっていては面倒です.そこで,自分のlogin名でもDOSへのアクセスができるようにしましょう.設定ファイルは /etc/group です.このファイルはスーパユーザ(root)だけが編集できます.rootのままで,/etc/groupをリスト2のように編集します. ** リスト2 /etc/groupファイル root::0:root bin::1:root,bin,daemon 中略 tty::5: disk::6:root,adm,itou <- 自分のlogin名を追加 lp::7:lp 中略 wheel::10:root floppy::11:root,itou <- 自分のlogin名を追加 mail::12:mail 後略 ****************** ここでは,diskにアクセスできるようにしただけでなくfloppyにもlogin名を登録しました.これで,5インチのフロッピディスクを持っておられる方は,自分のlogin名でも5インチのフロッピディスクにアクセスできるようになります.逆にいいますと/etc/groupのfloppyのところに設定をしないと自分のlogin名ではDOSで言うBドライブにはアクセスができませんでした. さらに,LinuxにはDOSにアクセスをするためにmtoolsと言うコマンド群があります.slackwareを通常にインストールすると入っております.これはDOS領域をマウントすることなくアクセス可能にするもので,コマンド名はDOSのコマンドに'm'を付けたものです.copyするときは'mcopy'とします.すでに,フロッピィのフォーマットで'mformat a:'というコマンドを使用してます.設定ファイルは /etc/mtools です.リスト3を参考に自分の環境に合わせて編集をして下さい. ** リスト3 /etc/mtoolsファイル # Parameters for the /usr/bin/mtools utilities # Uncomment these if your boot drive is 1.44 MB, and your second drive # is 1.2 MB: # A /dev/fd0 12 80 2 18 # 1.44 MB first floppy A /dev/fd0 12 80 2 9 # low density A /dev/fd0 12 0 0 0 # Generic autodetect B /dev/fd1 12 80 2 15 # 1.2 MB second floppy B /dev/fd1 12 40 2 9 # low density B /dev/fd1 12 0 0 0 # Generic autodetect # Using these may be a bad idea from what I hear, so be careful. C /dev/hda1 16 0 0 0 <- /dev/hda1にCドライブとしてアクセス F /dev/sda4 16 0 0 0 <- /dev/sda4にfドライブとしてアクセス #D /dev/hda6 16 0 0 0 ********************* DOSのFドライブの F:\CHEM\GEL ディレクトリのリストを見るには # mdir f:\\chem\\gel とします.ここで,DOSのパスを区切る'\'記号は2つ続けます.DOSのFドライブの F:\CQ\LINUX に現ディレクトリにある test.fil をコピーするには # mcopy test.fil f:\\cq\\linux DOSの F:\LC\KINETICSディレクトリにある全てのファイルを,Linuxの現ディレクトリにコピーするには # mcopy f:\\lc\\kinetics\\'*' . とします.DOSの場合は「全てのファイル」と指定する場合は「*.*」としましたが,ここでは「'*'」です.このようになる理由は正規表現を利用しているからです.説明になっておりませんが,詳しくは他のunixの本の「正規表現」の部分を参照して下さい.最後の'.'(現ディレクトリ)を忘れないで下さい.mtoolsのコマンドを表1に示します.これらは man mtools で参照ができます. 表1 mtoolsのコマンド mcopy コピー mdir ディレクトリ表示 mcd ディレクトリ変更 mformat 初期化,先にfdformatが必要 mtype ファイル内容表示 mmd ディレクトリ作成 mren ファイル名変更 mread DOSからLinuxへコピー mwrite LinuxからDOSへコピー これで,DOSとのデータのやりとりに必要な設定は終りました. つぎに,rootをlogoutして,自分の登録名でloginしましょう.早速,DOSとのデータのやりとりをします.では,自分のlogin名でmtoolsを使って見ます. % mdir c: Volume in drive C is MS-DOS_5 Directory for C:/ IO SYS 34726 3-10-93 5:00a MSDOS SYS 39122 3-10-93 5:00a DOS 2-18-95 10:41a COMMAND COM 62074 3-10-93 5:00a 中略 BATFILES 5-03-95 11:31a 55 File(s) 10289152 bytes free フロッピィからファイル表示やコピーをするには % mdir a: % mcopy a:test.fil . とします. コンソールならばkonを立ち上げて日本語が表示できるようにしましょう. X Windowが使える環境ならXを起動します.Xの初期設定ファイルは'.xinirc'です内容はリスト4に示します.また,筆者の使っているウインドウマネージャはfvwmです.それの標準での設定ファイルは /usr/X11R6/lib/X11/fvwm/system.fvwmrc を用います.少しLinuxを使うことに余裕がでて来たら,このファイルを自分のディレクトリに'.fvwmrc'としてコピーして自分なりに修正して使うと良いでしょう.機会があれば紹介します.これらの設定でMule等を起動した画面を図1に示します. ********** 図1 X Windowの画面 (capture.tif) *********** ** リスト4 '.xinitrc'のリスト # setting for background #/usr/local/bin/vplay /dos/c/windows/tada.wav <- サウンドブラストでX起動時に音をならす xsetroot -solid SlateGray <- Xの背景(rootという)の色設定 xset s blank <- スクリーンセーバを働くようにする xset s 60 <- 60秒入力が無いとスクリンセーバ起動 xset b 40 400 120 <- ビープ音設置 40:音量 400:周波数(Hz) 120:継続時間(ms) # setting for kterm kterm -g 80x32+3+292 -km euc -fn om8x18 -fr om8x18k -fk jis16x18 -sb -fg GhostWhite -rv -ms LightGoldenrod1 & kterm -g 80x17+420+30 -km euc -fn om8x18 -fr om8x18k -fk jis16x18 -sb -rv & xclock -g 103x113+1+1 & exec fvwm <- ファイルマネージャfvwmの起動 **** list 4 end *** では,DOSのC:\CQ\NIHONGO.FIL をLinuxへコピーして,内容を見て見ましょう.X Windowを起動して以下の作業をします. % startx ktermの中から % mcopy c:\\cq\\nihongo.fil . nihongo.filのコピー % cat nihongo.fil testpt@CB DOSp{R[hLinux(Unix)pR[hB AR[hvOpB 残念ながらさっぱり読めません.DOSとの互換性が無いのでしょうか?理由は文字コードの違いです.DOSで普通に用いる日本語のコードがMSコード(シフトJIS sjis)ですが,Linuxで普通に用いるのはeucコードです.そこで,ktermの漢字コードをsjisに替えましょう.crtlキーを押しながらマウスボタンの真ん中,または2ボタンマウスの場合は両方のボタンを押しますと図2の様なメニューがでます.ここで,「Shift-JIS Kanji Mode」に切替えます.先程と同じ操作をすると日本語が表示されます. ****** 図2 ktermのメニュー1 (kterm-euc.tif) ********* 日本語の漢字コードはDOS等で用いられるsjis,Linux等のunixで多く用いられるeuc,そしてネットワークで用いられるjisコードがあります.これらの漢字コードを変換するプログラム'nkf'が用意されております.Kterm の表示漢字コードをsjisに変換せずに先程のnihongo.filを表示するには % nkf -e nihongo.fil > test.fil % cat test.fil の様にします.'nkf'により漢字コードがeucに変換され,正常に日本語が表示されます.'nkf -s'がsjisへ,'nkf -j'がjisコードへの変換です.なお, nihongo.filの中身を表示するのに'cat'コマンドを使いましたが,'less'を使えば,漢字コードを自動判別してeucに変換し表示してくれます. もう一つ,DOSとunixのテキストファイルでの違いがあります.DOSテキストには各行末で,つぎの行頭へのreturnを表す'\r'が,改行コード'\n'の前に付いております.それを取り除きましょう.MuleでCのプログラムをリスト5の様に組んで見ましょう. % mule dos2unix.c *** リスト 5 #include main() { int c; while((c=getchar()) != EOF){ if( c != '\r' ) putchar(c); } } *********** 後はgccでコンパイルをして % gcc -o d2u dos2unix.c これで,d2uと言う実行ファイルが出来上がります. % d2u < test.fil > test.unix 本当に,'\r'(^Mと表示される)が消されたかの確認は,日本語対応のviで見れます.試して下さい. 自分で作った最初のプログラムですから,自分のホームディレクトリの下に bin を作り,その下にコピーしましょう.普通のunixコマンドのように 'd2u test.fil > test.unix' としたければ,リスト6のようにします. *** リスト6 dos2unix.cの2 #include "stdio.h" main(argc,argv) int argc; char *argv[]; { FILE *fopen(), *fp; if (argc == 1){ fprintf(stderr, "Usage : %s file\n", *argv); exit(-1); } fp = fopen(*++argv, "r"); if (fp == NULL){ fprintf(stderr, "**** can't open %s ****\n", *argv); exit(-1); } convert(fp); fclose(fp); } convert(fp) FILE *fp; { int c; while((c = getc(fp)) != EOF ) { if(c != 0x0d && c != 0x1a) putc(c, stdout); } } リスト5のプログラムとの相違は前半のファイル処理関係が増えたのと,さらにdosでファイルの最後に加えられるEOF(^Z)を削除しております.コンパイル方法は同じです.お好きな方を利用して下さい.このプログラムをいつでも使えるように設定しましょう. % cd <- ホームディレクトリのトップに戻る % mkdir bin % cp d2u ~/bin これで,先月に設定をしたパスが有効に働くはずです.Cシェルでは set path=(~/bin $path) Bシェルでは PATH="/home/itou/bin:$PATH" でした.自分のlogin名でログインした場合はどのディレクトリにいても 'd2u' とタイプすると /home/itou/bin/d2u を実行してくれます.これからも自分で作ったユーティリティプログラムは ~/bin(/home/itou/bin)に移動しておきましょう. ユーザの権限でCD-ROMをマウントしたり外したり出来るように, /etc/fstab に設定をしました.具体的には % mount /cdrom <- マウントする %umount /cdrom <- アンマウントする とすることで可能です. さあ,先月は触りだけで失礼をしたgnulotをもう少し使って行きます.先月は % gnuplot と打ち込んで,gnuplotが起動したら gnuplot> plot sin(x) とすると,別の窓が開いて,sin(x)のグラフが描かれました.終了方法はquitまたはexitを入力します. もう少し詳しく見ると2次元プロットは plot [1 範囲] [2 関数またはデータ] [3 表題] [4 スタイル] の形で入力します. いくつかの例を示します.そして,[1 範囲] [2 関数またはデータ] [3 表題] [4 スタイル]の詳しい使い方は表2を見て下さい. ** 表2 gnuplotの2次元プロット [1 範囲] 既定の範囲を用いる場合は省略可 xの範囲のみ指定 [-10:10] x,yの範囲を指定 [-10:10][-5:5] yの範囲のみ指定 [][0:10] x,yの最大値のみ指定 [:10][:5] x,yの最小値のみ指定 [-10:][-pi:] [2 関数またはデータ] 関数:Fortranやその他で使われている関数と同じ sin(x), cos(x), tan(x), log(x), log10(x), exp(x), sinh(x), cosh(x), tanh(x) abs(x) xの絶対値 acos(x) 逆余弦(ラジアン) asin(x) 逆正弦(ラジアン) atan(x) 逆正接(ラジアン) sqrt(x) 平方根 floor(x) xより大きくない最大整数 int(x) xを0に近い方で丸めた整数 arg(x) x(複素数)の偏角(ラジアン) real(x) x(複素数)の実数部 imag(x) x(複素数)の虚数部を実数で gamma(x) ガンマ関数 besj0(x) j0ベッセル関数 besj1(x) j1ベッセル関数 besy0(x) y0ベッセル関数 besy1(x) y1ベッセル関数 演算子: ** べき乗 * 積 / 商 % 剰余 ! 階乗 データに付いては後述 [3 表題] plot cos(x) とすると'cos(x)と言う表題で表示 title 'Function of Cosine' Function of Cosine と表示 t 'Function of Cosine' Function of Cosine と表示 [4 スタイル] lines, points, linespoints, impulses, dots, errobars,steps,boxes,boxerrorbarsの9種類あり with lines 線でつなぐ with points 点を打つ with linespoints 点を打ち,線で結ぶ with impulses x軸から垂線を引く with dots 小さな点を打つ with errobars クサビ型のエラーバー表示(データからのプロットのみ) with steps ステップ上に表示 with boxes 箱型で表示 with boxerrorbars 箱型のエラーバー表示 *** Table 2 end *** gnuplot> plot [-2*pi:2*pi][-0.7:0.7] sin(x)*cos(x) title 'Function of y=sin(x)*cos(x)' with impulses とすると,図3のように,「関数」sin(x)*cos(x)を,「範囲」横軸xが-2πから2πまで,たて軸yが-0.7から0.7で,「スタイル」x軸からの垂線(impulses)にて描きます.「タイトル」は Function of y=sin(x)*cos(x) と表示します. *** 図3 sin(x)*cos(x)のグラフ (sincos.ps) 複数のグラフを描く場合は,','(コンマ)で区切ります.また,記述が長くなる場合は'\'を行末にいれることで命令がつぎの行に続くことを示せます.フーリエ変換を説明するのに使う例で示しましょう. gnuplot> plot [0:2*pi] sin(x),\ > sin(x)+1.0/3.0*sin(3*x),\ > sin(x)+1.0/3.0*sin(3*x)+1.0/5.0*sin(5*x) 結果は図4に示します.ここで, 次の入力を促す > は前の行末の'\'を見てgnuplotが自動的に出します.1行目は sin(x)のグラフを,x軸が0から2πまで描き,2行目でそのグラフに 1/3*sin(3x) を加えたグラフを描きます.3行目はさらに 1/5 sin(5x) を加えたものを示します.カラーのX Window上で見ていると1行目からそれぞれ赤,緑,青と色で区別されます. *** 図4 フーリエ変換の例 (ft.ps) これは短形波を三角関数から作る場合の手順を目で見える形にしたものです.式で書くと 短形波= sin x + 1/3 sin 3x + 1/5 sin 5x + ... です.すなわち,短形波を作るには,元になる sin x のグラフの一番飛び出しているπ/2の値を少し減らして,代わりにへこんでいる0,π付近の値を増やすために,周期が三分の一の sin 3x を少し小さく(1/3に)して加えます.さらに,得られたグラフを短形波に近付けるには 周期を五分の一の sin 5x を更に小さくして加えます.同じように周期と大きさを1/7,1/9とした波形を加えることで限りなく短形波に近付けることが出来ます. では,3次元プロットをしましょう.2次元プロットで示した表2の規則の'plot'の部分をを'splot'命令に置き換えるだけで,そのまま使えます. gnuplot> splot sin(x)*y これで, z= sin(x)*y のグラフが表示されます.メッシュが荒く見づらいです.もう少し見やすく加工しましょう. gnuplot> set samples 40 <- 関数のサンプリング数 gnuplot> set isosamples 40 <- 網目の密度 gnuplot> replot <- 再表示 gnuplot> set hidden3d <- 隠線消去の指定 gnuplot> replot <- 再表示 gnuplot> set xrange [-5:5] <- x座標の範囲指定 gnuplot> splot sin(x)*y <- sin(x)*Yの3次元表示,replotでも良い この結果を図5に示します. *** 図5 3次元プロット例 z = y sin x (gnuplot3d.ps) 最後に,数値データのグラフ化について,紹介します.リスト7のデータをプロットします. ** リスト7 水の密度の温度変化 # This is data file # The density of water 0.0 0.99984 1.0 0.99990 2.0 0.99994 3.0 0.99996 4.0 0.99997 5.0 0.99996 6.0 0.99994 7.0 0.99990 8.0 0.99985 9.0 0.99978 10.0 0.99970 *** list 7 end これは水の密度の温度による変化です.はじめの2行の先頭にある'#'はこの行がコメント行であることを表しております. gnuplot> plot 'gnuplot-data.dat' using 1:2 with linespoints で,図6が描かれます.ここで,using 1:2 は1行目のデータをx軸に,2行目のデータをy軸に描くように指示しております.これを逆にして 'using 2:1' とするとたて横が入れ替わったグラフが描かれます. *** 図6 リスト7のデータのプロット (data-plot.ps) では,'quit'または'exit'を入れて,gnuplotを終了しましょう. 日本語や英語を入力するのにエディタは欠かせません.DOSやMS-Windowsの世界ではワードプロセッサがあり,理工系と言えどもパソコンの利用の第一はワープロの利用ではないでしょうか.LinuxでもX上でも英文用ワープロとして'doc' があります.しかし,大部分のLinux利用者はMule(またはemacs)等のエディタを利用して文章を入力し,LaTeXで処理をしていると思います.また,プログラムのコーディング等にはエディタは欠かせません. 来月は,前回紹介したMuleを利用方法をもう少し詳しく紹介し,さらにLaTeX等を利用して人に見せれるように文書の整形をしましょう.