授業資料/02 の変更点


#contents

//  第 2 回 -- タイピング,雑多なコマンド,ファイル操作,エディタ


* Typing Basics: タイピングの基本 [#je6fac79]

ここで改めて,キーボードの扱い方,タイピングの基本について簡単に触れておく.
というのも,キーボードの扱い方を正しく知らないと,効率が悪いだけでなく,健康上の問題を引き起こす可能性があるからである

// キーボードをあまり使わない gui 環境ではこれは効率が悪いと言うだけの話で済むかもしれないが,
// タイピングが操作の中心となる unix cui 環境では健康上の問題に発展する恐れがある.

&ref(/materials/warning.png); キーボードを使ったタイピングの基本は,以下の三大原則を守ることである.

+ 打つときにキーボードを見ない(タッチタイプ).
+ キーを打つ指を基本に沿って決めておく.
+ 指を「ホームポジション」に常に戻す.

特に,&br;&br;
■ 左手の人指し指用ホームポジション[F]&br;
■ 右手の人指し指用ホームポジション[J]&br;&br;
にはくぼみや出っ張りがついていて,触っただけでホームポジションが分かるようになっている(一部の変態キーボード等を除いて).
//
これらキーの基本とホームポジションは次のようになる(以前の阪大「利用の手引 web 版」より図式を引用後着色).
&ref(./touchtype-image.png);

** Warning of typing injury, Selection of keyboard: Typing Injury の警告とキーボードの選択 [#mb9263c8]

コンピュータを通常から長時間に渡って使用する人間は,頭痛, 眼の痛み,腱鞘炎等の障害(Typing injury, より詳しくは反復性疲労障害(Repetitive Strain Injury))などの障害に悩まされることがある.
それも当然で,キー配置図と指の関係を見てもわかるように,通常のキーボードは指や手への負担に関して合理的な造りをしていない(ただキーを並べただけだ).
通常のキーボードを長時間使用することにはリスクがあるのである.
これに対し,様々な医学的な配慮にもとづき,より合理的な形状をした入力装置が存在するので,できるだけそうしたものを選択しよう.

参考のため,キーボードの選択にあたっての大ざっぱな目安を示しておく.
// 費用の許す範囲で良いものを選択するのが基本であるが,あまりお金がない,という場合でもせめて「ランク C」の品の購入を検討するべきである.
好みもあるので,この基準は絶対的なものではないが,何も知らないよりはマシだろう.

CENTER:■ キーボードの良し悪しの目安 ■
| ランク | キー間距離 | 全体形状 | キータッチ |  例 |  備考 |h
|  A : 非常に良い | 非常に短い | Ergonomic 形状 | 軽いがタッチ感アリ | DataHandなど. | 非常に高価. 使いこなすまでに非常に時間がかかる. 入手が日本では非常に難しい.|
|  B : 良い | 普通 | Ergonomic 形状 | 軽いがタッチ感アリ | Kinesis など. | 高価. 大きい. 入手が日本ではやや難しい. |
|  C : 普通 | 普通 | 普通 | (軽い or しっかり) かつ タッチ感アリ | Happy Hacking Keyboard, Realforce など. | 比較的安価. 入手しやすい. |
|  D : 改善が必要 | 普通 | 普通 | タッチ感が無い,重すぎる,軽すぎる等. | 通常販売されているキーボードの多くはこれである. | ほとんどが非常に安価. ''健康を害する恐れアリ'' |

&ref(/materials/notes.png); 実習

+ ネットワークで適当なタイピング練習ソフトを探し出し,少し練習してみよ.
+ 上記ランク A, B, C のキーボードについて調べてみよ. 自宅に PC がある者は,自分が利用しているキーボードのランクがどの程度か判定せよ.
+ 人間の体に対する負荷が小さい入力方法として,どのようなものが考えられるか.自分で考えてみよ.

* Misc Commands: 雑多なコマンド [#MiscCommands]

良く使われるが分類しにくいコマンドを簡単に解説する.
# 詳しくはオンラインマニュアルで調べよ.

: clear | 画面クリア. ^L で代用できることも多い.
: date  | 日付と時刻の表示、設定.
: cal   | カレンダー
: bc | 計算言語. ごく簡単なプログラミング機能もあり,なかなか使える.

&ref(/materials/Gnome-Preferences.png); ''階乗 n! の計算例'' 
    > bc -l        ← bc の後は ハイフン と 小文字のエル.
      bc 1.06
      Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
      This is free software with ABSOLUTELY NO WARRANTY.
      For details type `warranty'.
      
      define f(n) {
        z = 1;
        for ( i=1; i<=n ; i++) {
          z = (z*i);
          };                                ← 順番にかけていく定義だとこんな感じ.
        return (z);
        }
      
      f(1)
      1
      
      f(3)
      6
      
      f(10)
      3628800
      
      define fact(n) {
        if (n==1) return(1) else return(n*fact(n-1));  ← 再帰定義だとこんな感じ.
        }
      
      fact(20)
      2432902008176640000
      
      quit         ← ^d でも代用できる.

: script | 端末上に表示した全てのログ(写し)をとる.  ''unix 管理者の基本コマンドの一つ.''  作業記録を残したいときに使うので,良く覚えておくこと. 普通のユーザにとっても便利である. 例えば宿題をやる時… とマニュアルにもある(^-^).
: lpr | (ファイルを)印刷する.
: a2ps | テキストファイルを Postscript ファイルに変換する. unix マシンに繋がっているプリンタは Postscipt プリンタであることが多いので,これはテキストファイルを印刷可能形式に変換する,ということを意味する.
: enscript | テキストファイルを「綺麗に」整形して出力する.a2ps よりずっと良い.使えると時々便利.ただ,通常は日本語には非対応.
: lynx, w3m | 文字端末用 web ブラウザ.

&ref(/materials/notes.png); 実習

+ 1 から 1000 までの和を求めたい. ''bc'' を使ってこの答えを求める方法を具体的に述べよ.
+ ''lpr'' で命令した印刷があるが,プリンタが故障したためこの印刷を取り消したい. こういう時にはどのようなコマンドを用いればよいか.
+ ''lynx'' , ''w3m'' を用いてこの web にアクセスしてみよ. ただし,それらがインストールされていなければやらなくて良い.
+ ''script'' を使って作業記録をとる練習として,''script'' を用いた状態で(テンポラリな)ディレクトリを作って,中を覗いてみて,そのディレクトリを消す,という一連の動作を行なえ.また,その際の記録を確認せよ.

* File Operations: ファイル操作 [#u18d1640]

// コンピュータ上での作業とは本質的に情報処理である.
// そして,情報処理とはデータを処理する作業のことであり,
unix ではデータの多くはファイルとして保存されるため,ファイル操作に慣れ親しむことは重要である.
そこで,
// ファイル操作を理解し慣れ親しむために,
まずファイルそのものの仕組みを解説し,その後にファイル操作について学習する.

** File System Structure: ファイルシステム -- その構造 [#lc4592cf]

unix ではファイルを管理するために,原則としてたった一種類の形式のファイルとディレクトリからなる階層的ファイルシステムを用いている. 
さらに,ディレクトリの階層構造を完全な一本の木構造(ツリー構造)とすることで,システムの全体構造を普遍的なものにしている.

ファイルシステム構造のこのシンプルさと統一性は unix のファイルシステムの大きな特徴である.

: ファイル | 
unix でのデータを物理的媒体に記憶するときの単位,というかデータの塊. ユーザからは名前のついたデータそのもののように見える. unix では基本的に一種類しかない.
&br;
→ ファイルに関するコマンド群の種類が一種類で済む.
: ディレクトリ |  
ユーザから見たとき,unix でファイルを入れておく場所,もしくは箱のような単位. 
住所,と思っても良いかもしれない. 
ディレクトリの中にはファイルも入れられるし,ディクレトリも入れられる. 
MS-windows で言うフォルダ. 本当はファイル名を管理するファイルのことだが… 
: 木構造 |  
&ref(./tree-sample-s.png);&br;
数学でいうグラフ理論の単語から(^-^). 
といっても,別に難しい話じゃなくて,節と枝だけからなる図形(グラフ)の一種で,ある節から他の節へ枝を通っていく行き方が必ず一通りあって,かつ,その一通りしかない,というものをグラフ理論では「木」と言い,そうした構造を木構造という.
unix のファイルシステム全体を,ディレクトリ = 節,ファイル     = 葉,として,ディレクトリ → 入ってる物(ファイル,ディレクトリ)の向きに枝をつけたグラフにすると, まさにこの構造になる.
これは偶然ではなく,これから示すようにいろいろ便利なのである. 
: ルートディレクトリ(root directory) | 
ファイルシステムを木構造で描いてみたとき,一番上に来るディレクトリをいう. 
これは,木構造を引っくり返してみると,そこが根(ルート)にあたることからそういう. 
このディレクトリは unix 上では  /  という記号で表される. 下のパスの「起点」の一つとなる場所である. 
: カレントディレクトリ(current directory) |  
unix では「いまどのディレクトリで動作しているか」が意識される.
cui ではシェルがどこで動作しているかということになる.
この,「現在作業をしているディレクトリ」をカレントディレクトリという.
: パス(path) | 
&ref(./file-image-s.png); &br;
ファイルシステムを木構造で描いてみると,どのファイルもどこかの「葉 = 末端の節」になっている. 
そして,木構造の性質から,どのディレクトリからもそのファイルまでの道筋(path)が必ず在る.
そこで,そのファイルがどこにあるかを指定する方法として,「どこかからの道筋」を用いることにして,それをパス名(path name)と呼ぶ. 
ディレクトリとディレクトリ(ファイル)との間を区切る記号として / を用いる.
# 本当は「枝」がディレクトリやファイルにあたるんだが,慣れないとグラフの枝を実体として扱うことに混乱するのでこう描いている. 
&br;
なお,パスは「ファイルの住所」と考えると分かりやすい.  簡単な例を示しておこう.
&br;
&ref(./address-tree.png);&ref(./file-tree.png);
: 絶対パス | 
パス名の起点としてルートディレクトリを用いる方法. 先頭に必ず / がつく.
: 相対パス | 
パス名の起点としてカレントディレクトリを用いる方法. 
先頭に / がついてない場合はこれ扱い.
&br;
&ref(/materials/warning.png); 絶対パスと相対パスの違いは初心者はよく混乱するので,注意すること.
: 親ディレクトリ,カレントディレクトリの特別な表記 | 
どのディレクトリでも表示される特別なディレクトリが二つある. 
&br;&br;
''..'' (ピリオド二つ): 親ディレクトリを表す.
親ディレクトリとは,自分が含まれる一段階大きなディレクトリのこと.
&br;&br;
''.'' (ピリオド一つ): カレントディレクトリを表す. 
// 様々な技術的理由から存在する. 
そのディレクトリにあるファイルを「確実に」指定したい時に使うと便利.
例えば,そのディレクトリに hoge というファイルがあるとしたら,./hoge と指定すれば,それはそのディレクトリにあるファイルが確実に指定されたことになる.

** Commonly Used File-Operations: 通常ファイル操作 [#wbf851bf]

: pwd |  現在いるディレクトリ(カレントディレクトリ)を示す.
: cd ディレクトリ名 |  指定したディレクトリへ移動する.
: pushd ディレクトリ名 | 
指定したディレクトリへ移動する. &br; それまでのカレントディレクトリを記憶してくれるので,次の''popd'' と組み合わせると便利である.
: popd |  ''pushd'' で記憶している最新のディレクトリへ戻る.
: ls | 
ディレクトリの内容をリスト表示する.   最も良く使うコマンドの一つなので,適切なオプションを alias で指定しておくようにするのがよい.

&ref(/materials/Gnome-Preferences.png); ''ls の便利な設定例'' &br;
bash の場合: ''alias&#9251;ls='ls&#9251;-Fa'''
&br;
tcsh の場合: ''alias&#9251;ls&#9251;ls&#9251;-Fa''

: touch&#9251;ファイル名 |  ファイルを新たに作成する. &br;     本来はファイルの「時刻属性」を変更するコマンドだが,存在しないファイル名を指定するとそのファイルが作成される.
: cp&#9251;元ファイル名&#9251;移動先 |  ファイルをコピーする.
: mv&#9251;元ファイル名&#9251;変更先 |  ファイル(ディレクトリ)を移動 or 改名する.
: rm&#9251;ファイル名 |  ファイル(ディレクトリ)を消去する. &br; unix では消去したデータは元に戻らないため,安全のためにオプション''-i'' などを alias しておくのが望ましい.
: ln&#9251;-s&#9251;元ファイル名&#9251;新ファイル名 | シンボリックリンク.実体は1つだが見かけ上,ファイルを複数にする. ''-s'' オプションをつけないハードリンクもあるが,まあ普通は使わないだろう.&br;  シンボリックリンク = ファイルの別名 = windows での「ショートカット」と思えば(やや不正確にしろ)わかりやすいか.
: mkdir&#9251;ディレクトリ名 |  ディレクトリを作る.
: rmdir&#9251;ディレクトリ名 |  ディレクトリを消去する.
: cat&#9251;ファイル名 |  ファイルの内容表示(本来は,ファイルを結合するコマンド).
: more&#9251;ファイル名 |  ファイルの内容表示. モニタでの表示に便利な機能がいくつかついている.
: less&#9251;ファイル名 |  ファイルの内容表示. more よりもさらに便利. オンラインマニュアルの表示などに用いられる.
: wc |  ファイルのサイズ,単語数,行数を表示.
: du&#9251;-k&#9251;ディレクトリ名 | ディスク使用統計の表示. &br;  指定したディレクトリ以下の各々のディレクトリにあるファイルの合計サイズ等を示す. 自分はどれくらいディスクを使っているのかな〜 なんていう時に便利.
: nkf |  漢字コード変換コマンド. &br;     通常は windows と unix ではファイルに用いる(デフォルト)漢字コードも改行コードも異なるため,こうしたコマンドにはかなりお世話になることだろう.

&ref(/materials/Gnome-Preferences.png);''nkf の便利な利用例''
&br;
あるテキストファイルを windows や mac とやりとりしたいのだがという時に…

windows 用のファイルを新しく作る: ''nkf&#9251;--windows&#9251;&lt;&#9251;元ファイル名&#9251;&gt;&#9251;新ファイル名''
&br;
unix 用のファイルを新しく作る: ''nkf&#9251;--unix&#9251;&lt;&#9251;元ファイル名&#9251;&gt;&#9251;新ファイル名''
&br;
mac 用のファイルを新しく作る: ''nkf&#9251;--mac&#9251;&lt;&#9251;元ファイル名&#9251;&gt;&#9251;新ファイル名''

: tar | 
(テープ)ファイルアーカイバ. 数多くのファイルをまとめて一つのファイルとして「書庫(arhive)」に入れる,という動作の為のコマンド. ただし,ファイル圧縮機能は無い. &br;      # テープという部分は現在ではユーザにはあまり意味はないだろう. &br; windows/dos では似たような目的のためのツールとして, zip や lha などが知られている. &br; ''tar''の使い方については,バックアップについて学習する際に詳しく解説する.
: whatis |  ''apropos'' の厳密版. ''apropos'' はなんだったかというと?
: which&#9251;コマンド名 |  コマンドプログラムがどこにあるか,を教える. ただし,パス変数の中からしか探さない.
: whereis&#9251;ファイル名 |  コマンドに限らず,様々な種類のファイルを探し出す. ファイルの種類はオプションで指定.
: find |  ディレクトリの木構造を下へ下へと下がっていきながらファイルを探して,処理を行なう. &br;     例えば,カレントディレクトリ(.) よりも下のディレクトリでファイル名の終りが .txt であるファイルを探したい,というときは &br; ''find . -name '*.txt' -print'' &br;  となる. / なんかで似たようなことをやるとひどい目にあうのでよく考えてから実行すること(^-^).
: file&#9251;ファイル名 |  ファイルの種類を判定する. ファイルの中身に触れる事なく判定できるので,安全だ(^-^).
: diff&#9251;ファイル名1&#9251;ファイル名2 |  二つのテキストファイルの違いを表示する. ちょっとだけ違うはずのファイルがどこが違うかを知るのに便利.

&ref(/materials/notes.png); 実習

上に示したコマンドを,オンラインマニュアルを用いて調べながら一通り試してみよ.

* Permissions for File Operations: ファイルシステム -- ファイル保護機構 [#f2011d49]

unix ではアカウントによって利用権限等が区別されるタイプのファイル保護機構が組込まれている.

これは,マルチユーザシステムとしての機能の一つとして,ファイルの持ち主や利用権限をきちんと定めるものである.
より細かくは,個々のファイルやディレクトリに,各アカウントにたいしてどうした操作を許可するのかが設定されている,ということになる.

ファイルの様々な操作の 許可/禁止 はユーザが制御できるので,上手に制御することで他ユーザから自らの秘密データを守ったり,データ交換を行なったりすることができる.

この許可設定のことを''ファイルパーミッション''とか''ファイルモード''などと呼ぶ.

ファイルパーミッションは,そのファイルを「誰に」「どんな操作を」許可 or 禁止するかを設定するものである.おおまかには,

-「誰に」が 「所有者」「ファイルグループに属する人」「それ以外の人」の 3種類,
-「操作」が 「読み込み」「書き込み」「実行」の 3種類

あるので,計 9 つの 許可/禁止 を設定する項目がある.
以下,ファイルの「所有者」と「ファイルグループ」に関して簡単に説明しておく.

: ファイル所有者 (Owner, User) |  ファイルの属性の一つ. そのファイルの所有者が誰か,を表す. &br;     ''ls&#9251;-l'' コマンドで3つめに表示される要素.
: ファイル(アクセス)グループ (Group) | 
ファイルの属性の一つ. そのファイルがどのグループに属しているかを表す. ここでいうグループとは,通常ユーザを分類するときにも用いられるグループのこと. &br; ''ls -l'' コマンドで4つめに表示される要素.


** "Looking" of File Permissions: ファイルパーミッションの設定を「見る」 [#h7d533d1]

まず,ファイルパーミッションの 9つの設定項目がどうなっているかを調べる方法について触れよう.

通常は,''ls -l'' というコマンドを実行したときに一番左に出る10文字列からなる項目を正式な「ファイルモードの表示」とよび,この後ろ側 9文字がファイルパーミッションを表す.
# 頭の 1文字はファイルの「型」とよばれ,"d" の1文字の場合はディレクトリを,"-" の1文字の場合はファイルを意味する.

ファイルパーミッションは [3文字の塊 x 3] の構成をしており,左の塊から各々
&br;
「所有者に対する許認可」
&br;
「グループに対する許認可」
&br;
「それ以外に対する許認可」
&br;
を意味する.

文字は各々,
: "r" | 読出し可能
: "w" | 書込み可能
: "x" | 実行可能(ディレクトリの場合,探索可能)

を意味しており,該当する部分が "-" のときはその操作が「禁止」されていることを意味する.
以上をまとめると,次の表のようになる.

CENTER:■ ''ls&#9251;-l'' コマンドの表示の最左端 10 文字の読み方 ■
|>|>|>|>|>|>|>|>|>| ファイルモード |
| 型 |>|>|>|>|>|>|>|>| ファイルパーミッション |
|~|>|>| 所有者に対して |>|>| グループに属する user に対して |>|>| それ以外に対して |
| d:ディレクトリ &br; -:ファイル | 読出し &br; r:許可 &br; -:禁止 | 書込み &br; w:許可 &br; -:禁止 | 実行 &br; x:許可 &br; -:禁止 | 読出し &br; r:許可 &br; -:禁止 | 書込み &br; w:許可 &br; -:禁止 | 実行 &br; x:許可 &br; -:禁止 | 読出し &br; r:許可 &br; -:禁止 | 書込み &br; w:許可 &br; -:禁止 | 実行 &br; x:許可 &br; -:禁止 |
| 1つ目 |  2つ目 |  3つ目 |  4つ目 |  5つ目 |  6つ目 |  7つ目 |  8つ目 |  9つ目 |  10つ目 |

&ref(/materials/Gnome-Preferences.png);''パーミッションに関する表示例''

例えば,''ls&#9251;-l'' を実行したところ

  drwxr-xr-x  1 paoon  Lab       512   3 26 22:45 tmp
  -rw-------  1 paoon  Lab      6665   3 26 22:45 dummy1
  -rw-r-----  1 paoon  Lab     50102   4  5 22:19 dummy2

と表示されたとすると,

- tmp というディレクトリは,
-- 所有者 paoon は読み,書き,検索が可能.
-- グループ Lab に属するユーザは 読み,検索が可能.
-- それ以外のユーザは 読み,検索が可能.
- dummy1 というファイルは,所有者 paoon だけ,読み,書きができる.
- dummy2 というファイルは,
-- 所有者 paoon は読み,書きが可能
-- グループ Lab に属するユーザは 読みが可能.

ということがわかる.
後述するコマンド ''chmod'' を使えば,この属性を書き換えられるので,自分のファイルの保護レベルを自由に設定できることがわかるだろう.

** "Change" of File Permissions: ファイルパーミッションの設定を「変更する」 [#s770ec22]

ファイルパーミッションを制御するには,主に ''chmod'' というコマンドを用いる.
詳細はオンラインマニュアル等を参照するとして,大まかな文法は以下の通りである.

: chmod&#9251;許可設定&#9251;ファイル名 | 許可設定は ''[ugoa][+-=][rwx]'' の形で表す. この文字の意味は各々以下の通り.&br;&br;''u'' 所有者に対する設定を意味する.&br;''g'' グループに属するアカウントに対する設定を意味する.&br;''o'' それ以外のアカウントに対する設定を意味する.&br;''a'' 全アカウントに対する設定を意味する.&br;&br;''+'' 許可を意味する.&br;''-'' 禁止を意味する.&br;''='' その(許可)設定以外は禁止を意味する.&br;&br;''r'' 読み出しに関する設定を意味する.&br;''w'' 書き込みに関する設定を意味する.&br; ''x'' 実行(ディレクトリの場合は検索)に関する設定を意味する.

また,各シェルが提供する内部コマンドとして,''umask''というコマンドがある(シェルによって機能や文法が異なる).このコマンドを用いると,ファイルを作成するときに自動的に設定するパーミッションを制御できる.
bash, zsh の場合などは  ''chmod''  と同じ表記で「初期値」を設定できる.

通常はパーミッションを「誰に」ごとに 8進数表記(octal notation)した 3桁の数字でマスク値を指定する方法なので,使い方はやや難しい.

&ref(/materials/Gnome-Preferences.png);''パーミッションの変更・設定例''

: chmod&#9251;u=rw,&#9251;og=r&#9251;ファイル名 | パーミッション指定を'' rw-r--r-- ''とする. 通常のファイルはこうしておけばよいだろう.
: chmod&#9251;u=rw,&#9251;og-rwx&#9251;ファイル名 | パーミッション指定を'' rw------- ''とする. メールやその他,秘密性の高いファイルはこうしておくべきである.
: umask&#9251;u=rwx,&#9251;go=rx  ''(bash, zsh の場合)'' | ファイルが作成される時の通常のパーミッション指定を'' rw-r--r-- ''とする. &br; ''umask 022''と等価. 通常は,このように 8進数3桁の数字でパーミッションのマスク値を指定しないといけない.
: umask&#9251;-S ''(bash, zsh の場合)'' | ファイルが作成される時の通常のパーミッション指定がどうなっているかをパーミッション表示で表示する.
: umask | ファイルが作成される時の通常のパーミッション指定がどうなっているかを8進数3桁の数字で表示する.

*** How to Use Online Manuals: 組み込みコマンドのオンラインマニュアルの引き方について [#c525be1c]

''umask'' のようなシェルの組み込みコマンドは,オンラインマニュアルを引くのにちょっとしたコツが必要である.
以下に各シェル毎にその具体的な方法を記しておく.

: bash, tcsh の組み込み系コマンドについて調べるには | ''(j)man&#9251;bash'' や ''(j)man&#9251;tcsh'' としてオンラインマニュアルを表示させてから,その中でそのコマンドの文字列(例えば umask など)を探せばよい.
: zsh の組み込み系コマンドについて調べるには | ''(j)man&#9251;zshbuiltins'' としてオンラインマニュアルを表示させてから,その中でそのコマンドの文字列(例えば umask など)を探せばよい.

&ref(/materials/notes.png); 実習

+ ''touch'' コマンドを用いて適当なファイルを作成し,''chmod'' を使って次のようにパーミッションを変更してみよ.
++ 誰にでも読み書き,実行できるように.
++ 誰にでも読め,実行できるが,書込めないように.
++ 自分だけが読み書き,実行できるように.
++ 自分でも読めるだけのように.
+ ''touch''コマンドを用いて自分のディレクトリに適当なファイルを作成し,「隣の席の人がそのファイルを読めるが,書き込みはできないように」''chmod'' を使って適切にパーミッションを設定せよ.その後,確かに隣の席の人が「そのファイルを読めるが,書き込みはできない」ことを確認せよ.

* Text Files and Editors: テキストファイルとエディタ [#p895553a]

エディタとはファイルの中身を直接編集するためのソフトウェアのことである.
unix cui 環境を使っている時間の大半は,コマンドを用いているかファイルを編集しているかであるので,エディタを使用する時間は非常に多いことになる.
そこで,ここではエディタについて詳しく解説する.  

まず,エディタで主に扱うファイルの形式であるテキスト形式について解説し,それからエディタについて解説する.

** Text Files: テキストファイルについて [#h289aadf]

unix 上では,ファイルはなるべくテキストファイルとして保存することが望ましいとされる.
テキストファイルとは,人間に読める文字だけでデータが記述されたファイルのことをいう. そうでないファイルを一般にバイナリファイルと呼ぶ.

# 映像,音声ファイルのように,圧縮しないと非常に大きくなるファイルなどは,少しでもファイルを小さくできるバイナリファイルの方が適しているが,そうしたもの以外はテキストファイルが望ましい.

テキストファイルとバイナリファイルの違いは ''less'' などのファイル閲覧コマンドでファイルを見てみれば一目瞭然である.

ただし,バイナリファイル中の文字列がシェルの設定等を書き換えてしまうことも多いので,実はこれはお勧めしない(^-^). ファイルを閲覧する前に,''file''などを用いて,ファイルの正体を見るのが正しい.
また, どうしてもバイナリファイルの中身を見てみたいという場合は,'' cat&#9251;-v '' か'' vis '' を用いるのがよい(どちらもマニュアルで調べること).

CENTER:テキスト/バイナリファイル を見てみた様子
| &ref(./text-sample.png);  &br; テキストファイルの中身を見るとこんな感じ. | &ref(./binary-sample.png); &br; バイナリファイルの中身を''less''などで無理やり見ようとするとこんな感じ. |

テキストファイルが良いとされる理由は次のようなものである.

- テキストファイルは見ただけで人間が理解できる(閲覧に関する汎用性が高い).
- テキストファイルであればあれこれと便利な処理ができる. なぜなら,unix にはテキストファイルを半自動的に処理するツールが豊富にあるからである(後の授業で学習する).
- OS やソフトの間での変換性,互換性が高い. よって,ソフトや OS の違いを越えて利用可能である.

&br;&br;
&ref(/materials/notes.png); ''例えば,20年前のデータファイルを考えてみよう''&br;
その当時のソフト専用の形式のファイルと,テキストファイルがあったとして,現在も利用可能なファイルはどちらだろうか.
&br;&br;

これらは「閉じた商用ソフト」にとっては逆に不都合である,ともとらえられるため,windows などの OS の商用ソフトは逆にデータをテキストファイルとせず,バイナリファイルと呼ばれるファイルでデータをファイル化する傾向が強い.
つまり,互換性を低くすることによって,他の会社のソフトへの移行を阻害する,人間に読めないようにして,どういう処理をしているかを隠す,ユーザがそのソフト無しではファイル修正等が出来ないようにして,そのソフトへの依存性を高める… といった具合いである(麻薬への依存のようなものだ).
この副作用は,windows や Mac OS では長い目で見るとユーザの熟練度が上がりにくい,という傾向となって現れる.

つまり,バイナリファイルで互換性の低い形式を扱うソフトというのは,ユーザの便益を蝕んで儲けていると非難されても仕方がなく,逆にユーザはこうしたソフトを忌避するよう自衛する必要がある.

さて,以上より推測できると思うが,unix cui 環境でファイルを編集するという場合はたいていはテキストファイルを扱うことを意味する(例外はもちろんある).

** Editors: エディタについて [#tdd87197]

エディタ(Editor)とは,ファイルを編集する為のソフトウェアである.詳しくは編集するファイルによって
&br;&br;
テキストエディタ( = テキストファイルを編集する)
&br;
バイナリエディタ( = バイナリファイルを編集する)

と呼び分けられるが,通常はエディタと言えばテキストエディタを指すことが多く,この区別はあまり気にされない.今回の授業で扱うのももちろんテキストエディタである.
テキストエディタを用いた作業は概念図的には以下のようになる.

■ エディタを用いた作業のおおよそ ■
&ref(./editor-image-s.png);

エディタの最も典型的な使い方は,以下の通りになる.
+ 編集するファイルのバックアップをとる(''重要!''). 
+ (エディタ起動)
+ 編集したいファイルをエディタに読み込む.
+ エディタで編集する.
+ 編集が済んだデータをファイルとして書込む(saveする).
+ (エディタ終了)

という流れになる.

エディタは unix cui 環境では最も頻繁に用いるソフトウェアの一つである.なぜなら,人間が computer にデータを入力する際に最もよく用いる方法の一つが入力したいデータをファイルという形式で入力することだからである.
よって,unix cui 環境を使いこなすには, エディタを自由自在に使いこなせないといけない.幸い,unix cui 環境で用いるエディタの種類はそう多くはないので,あるエディタに慣れる前に他のエディタに目移りするということはそうそうない.以下に,代表的なエディタを示すので,これらに良く触れて習熟するのがよい.

CENTER:■ unix cui 環境でよく用いられるエディタ ■
| 名称 | 特徴 |h
| vi | unix と名のつく OS ならばほぼ間違いなくデフォルトで入っているエディタ.&br;エディタとしての機能に絞った設計になっており, 非常に素朴な環境でも動作し,動作も速い.全ての動作が「コマンド」として体系化されており,キーボードだけで作業が効率よくできるようになっているが,これは逆にコマンドを記憶する必要があることを意味する.&br;# かなり使い込まないと習熟できないため,このエディタを推奨するのは少々ためらわれる(もちろん,熱狂的なファンも多いが).&br;unix 自身のインストールのかなり早い段階から使えるエディタであること,OS 自身の動作が危うくなっているときでも動作する可能性が高いことなどから,unix 管理者は好きと嫌いとに関わらず ''vi'' を使えるようにならないといけない(最低限のレベルで構わないが).  |
| emacs | ''elisp'' という言語で書かれたマクロファイルを使用してほぼあらゆるカスタマイズが可能な非常に優秀かつ柔軟なエディタ.適切に設定すれば, ''emacs'' の中から OS の操作を全て行なうことも可能で,エディタというよりも unix 環境そのものであるとも言われる.&br;unix で最も良く使われているエディタはおそらくこの ''emacs''である.&br;このエディタもやはり習熟には時間を要するが,''vi'' よりは難易度が低い.どちらかというと ''emacs'' をエディタとして推奨する.&br;''vi'' 同様にほぼ全ての unix 環境で使えるが,''vi'' がシステムのデフォルトで用意されているエディタであるのに対し,''emacs'' はほぼデフォルトで用意されているアプリケーションソフト,という立場である.&br;# であるから,''emacs'' が使えない状態の unix 環境というのもいくらでも存在する. |

上記特徴より推測できると思うが,unix cui 環境で用いるエディタとしては以下のように推奨することになる.自らの unix に対する取り組み方を考えて選択するのがよい.
#もちろん異なる組み合わせも可能である. 最終的には好みの問題である.

- 通常ユーザには …''emacs'' を推奨.
- (将来の)unix 上級者, 管理者には … ''vi'' のごく簡単な操作 + ''emacs''  を推奨(というか必須に近い).

*** How to Develop Your Skill of Editor Opeartions: エディタ操作の習熟について [#ladcf583]

cui 環境ではマウスやメニューといったグラフィカルな要素は使えないと考えるべきである.つまり,見た目で直感的に操作はできない.そのため,どちらのエディタも操作にはかなりの習熟が必要である.

言い換えると,最初から使いこなせなくても当たり前なので,すぐ投げたりしないでじっくり使い込んでいくのがよい.

*** Backup: バックアップについて [#q939e06a]

忘れてはならない大前提として「人間はミスをする」というものがある.コンピュータの操作および設定はこの前提の下に行なわれないと, あとで酷い目に会うだけである.
ファイルのバックアップは, ファイル操作およびその編集作業でのミスに対する保険の一つである.これは手持ちのデータ全てをバックアップするレベルやrcs,sccs といったバージョンコントロールソフトの使用と兼ねるものなどがあるが,それらについては後の授業で解説する.

ここでは, 最も単純で OS 等に依存しない素朴な方法をとりあえず記述しておく.

&ref(/materials/Gnome-Preferences.png);例えば,dummy.txt というファイルのバックアップを例に挙げてみると…

    > ls dummy.*    ← 似たような名前のファイルが無いか事前チェック
    dummy.txt
    
    > cp dummy.txt dummy.txt.bak-20110422    ← 一目でバックアップだと分かるように
                                                出来れば日付等も明記しておくと良い

等としてバックアップを取っておく.この方法だとバックアップファイルがだんだん増えていく, 分かりにくいので管理がしにくい, 等のデメリットが大きいが, バックアップしないよりは 100倍マシである.
よりきちんとしたバックアップの方法についてはこれからの授業で学習する.

* Emacs: エディタ emacs -驚異の万能戦艦- [#icc47472]
* Emacs: エディタ emacs -驚異の万能戦艦- [#Emacs]

emacs と一口にいっても,多国語化を押し進めてきたバリエーションとしての mule,グラフィカルな要素を強化してきた xEmacsなどの細かいバリエーションがある.こうした要素は emacs のバージョンが上がるにつれて統合されていくが,まずはなるべく基本的かつ共通である cui 機能だけで扱えるようになろう.
また,これ以降は ''emacs'' と書いた場合はこれら多くのバリエーションをまとめて呼んでいるものとする.

: 起動方法 | 
kterm 中で ''emacs'' もしくは '' emacs&#9251;&amp;'' もしくは '' emacs&#9251;-nw '' とコマンドを入力する.
&br;&br;
''emacs'' … その文字端末「内」で普通に emacs を起動
&br;
'' emacs&#9251;&amp;'' … emacs をバックグラウンドジョブとして起動(詳しくはプロセス管理の説明をする授業で学習する)
&br;
'' emacs&#9251;-nw '' …emacs を kterm の中に完全な cui モードで起動.
// # 教育用計算機システムで日本語をきちんと使いたい場合は, ''emacs'' ではなくて ''xemacs'' を使うのが良いだろう.
: 終了方法 | emacs で '' C-x C-c '' と入力(''C-'' は "[Ctrlキー] を押しながら" を意味する).
: 編集操作 | 
まずは入門ガイド(Tutorial)に従って操作して学習するのがよい.
入門ガイドは emacs にはほぼ必ず用意されている.
&br;emacs を起動し,'' C-h&#9251;t'' もしくは '' [F1キー] t'' と入力すれば入門ガイドモードに入る.
&br; emacs を起動した後,何もしないで画面を良くみると,&br;  '' C-h t で XEmacs の使用方法の実習を開始できます''&br;  もしくは&br;  '' Get a tutorial   f1 t ''&br;  もしくは&br;  '' Type C-h t for a tutorial on using Emacs''&br;などという表記がある.
このように最低限の操作方法は最初に表記されるので,まずはじっくりこの画面を読むのも良いだろう.
: emacs の操作で困ったら | emacs で変な操作をしてしまって,どうしたらよいか分からなくなることがある.こうしたときは,慌てずに ''C-g '' を何回か入力しよう.このキーは「動作中のコマンドを中止」するもので,変な操作中の状態から通常状態に戻してくれる.&br; ただし,「してしまった操作」を元に戻すものではない.操作を取り消したい,という場合は undo コマンドを用いる. 具体的にどうしたらよいかは入門ガイドで学習しよう.
: 表示されたキーを入力しても動作しないが? | 入門ガイド等で表示されたキー操作をしてもその通りに動作しない,ということがある.これは,貴方の個人環境では「キー操作が書き換えられている」ために起こる現象である.その為に,標準的なキー操作を想定して書かれているものと違ってくるのである.&br; ~/.xemacs や ~/.emacs などにその「キー操作書き換え設定」が書かれていることがある(一度見てみよ.他にも便利なことが書いてある).&br; 例えば,本来ヘルプを呼び出すキー操作である''C-h''が一文字消去という動作をするように書き換えられていることがある.このため,入門ガイドで''C-h''と書いてある部分はそのまま入力してもうまくいかない,ということになる.&br; こういう場合は,''[F1キー]''がたいていはヘルプになるようになっているので,''C-h''の代わりに''[F1キー]''を押せばよい.
: emacs を早く使いこなせるようになりたい | 下を読もう.

** Tips to Use Emacs: emacs を早く使いこなすためのいくつかコツ [#c39edea0]

: ''カーソルキーを使うな!'' |
emacs には効率的にカーソルを移動させる方法が豊富に存在する.カーソルキーを使うとこうした効率的な方法を使わなくなってしまうため,結果として emacs をいつまでたっても使いこなせないうえ,作業が鈍いということになる.
カーソルキーは「初心者用の麻薬」であって,「一見気楽」ではあっても「後で泣く」ことになるのを知るべきである.
また,カーソルキーを使うためには手をホームポジションから大きくずらすことになり,手に負担がかかる上,キー操作は遅くなる.
「カーソルキーは本来キーボードに存在しないもの」でもあることを自覚し,emacs では絶対に使わないのが cui ユーザの正しい姿である(^-^).
: ''マウスを使うな!'' |
これもほぼ理由は同じである.emacs を使う上でマウスを使う理由はほとんどない.
: ''単純作業を繰り返すな!'' |
たいがいのことは自動化できる,そうした機能がある,というのが emacs である.
同じ作業を延々手で繰り返すようなことを無反省にしているようでは emacs はいつまでたっても使いこなせない.
作業が多くなりそうだったら,作業に取り掛かる前に emacs にそういうことを自動的に行なうような機能がないかまず調べるべきである.

emacs の操作方法はある程度「覚えないといけない」.そのため,最初は適当なマニュアルを手元に用意しておくか, 自分でメモをしてそれを見ながら使うようにするとよい.
emacs はもしかするとこれから何十年も使うことになるツールであるので, ゆっくりと確実に使えるようになるのが良い.

&ref(/materials/notes.png); 実習

+ emacs を起動し,tutorial (使用方法の実習)を行う.
+ コマンドを用いて適当なファイルを作成し,emacs を用いてその中身に適当な文章を書き込んで保存した後,emacs をいったん終了する.
+ emacs を起動して,先ほど作成して書き込んだ複数のファイルの内容を一つのファイルにまとめ直せ.

* Vi: エディタ vi -Simple is BEST!!- [#v827fc79]

vi にも emacs 同様多くのバリエーションがあるが,これもやはり最も基本的なものから学習するのがよい.
現代の unix 系 OS の多くでは vi の実体は実は vim という「改良された」vi である.
そのため,意識せずに vim の改良された機能(モード表示機能など)が使えてしまう(^-^).

: 起動方法 |
kterm 中で'' vi'' とコマンドを入力する.
: 終了方法 |
vi で([Escキー] を何度か入力後) '' ZZ'' (Z は大文字) もしくは '':x '' もしくは '':wq '' もしくは '':q! '' と入力.
&br;&br;
'' ZZ'' … 終了. ただし,編集中で save していないファイルがあると終了できない. '':q '' と入力するのと同じ.
&br;
'':x '' … 終了. 未save ファイルは save する.
&br;
'':wq '' … ファイルを save して終了.
&br;
'':q! '' … ファイルを save せずに強制終了.
&br;
(注) 終了方法が多くてわかりにくいが, そういう時は '':wq '' と '':q! '' とだけを意識して使うようにするのが安全でよいだろう.
: 編集操作 |
vi を理解するには,vi の「モード」かコマンド体系をきちんと理解する必要がある(どちらかを理解すればよい).
ここでは, 通常良く使われる「モード」による説明を行なっておこう.
コマンド体系による綺麗な説明に関しては, 参照図書 "新 The Unix Super Text(改訂増補版)(上)" の 18.2 (pp.255-) を読むのが良い.
&br;
他,詳細も下記に記す.
: vi のモード | 下の図と解説を読もう.

** Modes of Vi: vi のモード [#s4e6b024]
■ vi のモードの概念図 ■
&ref(./vi-mode.png);

vi のモードは大雑把に次のように分類される.
: コマンドモード |
vi の基本モード. カーソル移動,文字削除等を行なう.
: 挿入モード |
文字を入力するモード.
: exコマンドモード(コロンモード) |
「: キー」を押すとこのモードになる.
ファイル操作等の OS 操作や(正規表現による)置換など.
vi の終了操作は OS とのやりとりということでここに分類される.

&ref(/materials/warning.png); [Escキー] を何回か押せば必ずコマンドモードになるので,どのモードにいるか分からないときはとにかく [Escキー] を何回か押せばよい.

** Operations of Vi: vi の編集操作 [#g5317db8]
以下に vi の編集操作で最低限必要なものを記そう. vi の操作は結構奥が深いので,興味あるものは参照文献などを参考にして勉強するのがよい.

CENTER:■ vi の編集操作表 ■
| 分類 | キー | 機能 | 使えるモード |h
| カーソル移動 | h | 左へカーソル移動 | コマンドモード. |
|~| j | 下へ. | 〃 |
|~| k | 上へ. | 〃 |
|~| l | 右へ. | 〃 |
|~| 0 (数字の0) | 行頭へ. | 〃 |
|~| $ | 行末へ. | 〃 |
|~| 0 (数字の0) | 先頭行へ. | ex コマンドモード |
|~| $ | 最終行へ. | 〃 |
| 挿入 | i | カーソルの「前」で挿入モードに移行. | コマンドモード |
|~| a | カーソルの「後ろ」〃 | 〃 |
|~| o | カーソルのある行の「次の行として」〃 | 〃 |
|~| r ファイル名 | ファイルの内容を挿入. | ex コマンドモード |
| 貼り付け &br; (paste) | p | 削除もしくはコピーされた内容を挿入する. | コマンドモード |
| 削除 &br; (cut) | x | 一文字削除.  | 〃 |
|~| dd | 一行削除. | 〃 |
|~| D | 行末まで削除. | 〃 |
|~| J | その行の改行文字の削除.つまり,今の行と次の行とを繋げて1行にする. | 〃 |
|~| d カーソル移動 | 現在地から移動先までを削除. | 〃 |
|~| C-h | 一文字削除 | 挿入モード |
|~| C-u | 一行削除 | 〃 |
| コピー &br; (copy) | yy | 一行コピー. あとで ''p'' で貼り付けるために使う. | コマンドモード |
|~| y カーソル移動 | 現在地から移動先までをコピー. あとで ''p'' で貼り付けるために使う. | 〃 |
| 検索,置換 | /文字列 | カーソルの「後ろ」に向かって検索. | 〃 |
|~| ?文字列 | カーソルの「前」に向かって検索. | 〃 |
|~| n | 前と同じ検索,置換. | 〃 |
|~| c カーソル移動 | 置換. &br; カーソルを移動してから挿入モードに移行し,元の位置から移動位置までを挿入モードで入力した文字列に置換. | 〃 |
|~| %s/元文字列/新文字列/g | 置換 | exコマンドモード |
| 繰返し | . | 直前の編集コマンドを繰り返す | コマンドモード |
| 復元 | u | 直前の編集コマンドを取り消して元に戻す | 〃 |
| ファイルへ書込み &br; (save) | w ファイル名 | ファイルに書込む. | ex コマンドモード |
| 終了 | wq | ファイルに書込んでから終了. | 〃 |
|~| q ! | ファイルに書込まずに終了. | 〃 |
|~| x | save してない場合はファイルに書込んでから終了. | 〃 |
|~| ZZ | save してある場合のみ 終了. | コマンドモード |

** To be good at Vi: vi に習熟するために [#xeb499ea]
&ref(./rogue-sample.png);

unix には実は vi と同じキー配置のカーソル移動等をもつゲームが多く存在する.
こうしたゲームで遊ぶことで vi のキー配置を体に染み込ませる,のは 20年以上の長い歴史をもつ由緒ある「正しい学習方法」(^-^)であるので,暇がある人にはおすすめである.

具体的には,''Rogue'',''Hack'',''Nethack'',''Larn'',''Moria'',''Omega'',''Angband'',''ADOM''などがあるので,興味あるものはネットワーク検索などで調べてみるとよい.
windows や Mac に移植されたものも多いので,自宅の PC で遊んでみるのもよいだろう.
中にはグラフィカルなものや,マルチプレイヤー対応のものなどもある.

左は kterm 上で rogue を動作させたときの様子である.(ただし,rogue はインストールされていないため,各自で用意する等の必要がある)

&ref(/materials/notes.png); 実習

+ コマンドを用いて適当なファイルを作成し,vi を用いてその中身に適当な文章を書き込んで保存した後,vi をいったん終了する.
+ コンピュータに詳しい人にお願いするなどして,rogue を体験してみよ.

* Report: レポート [#y13e0349]

「実習」と記された部分について,能う限り賢明な調査と考察を行い,
&br; 
''AppliedMath7-Report-02''
&br;
という題名をつけて e-mail にて教官宛にレポートとして提出せよ. なお,レポートを e-mail の代わりに TeX で作成した書面にて提出してもよい.  

&br;&br;
&br;&br;
* about Icons, ClipArts [#vdb985aa]

For details, see [[&ref(/materials/JNorth_arrow-right-sm.png); this>materials]].

// ━┃┏┓┛┗┣┳┫┻╋


// コマンドライン入力は「行頭を > で始める」.
// コマンドライン出力は「行頭をブランクで始める」.

// 実習アイコン
// &ref(/materials/notes.png); 

// 注意アイコン
// &ref(/materials/warning.png);

// Link アイコン
// &ref(/materials/JNorth_arrow-right-sm.png); 

// OK アイコン
// &ref(/materials/OK.png);

// NG アイコン
// &ref(/materials/NG.png);

// サンプルアイコン
// &ref(/materials/Gnome-Preferences.png);

// 大文字での強調 
// CENTER:&size(24){''ほげほげ''};

// programu source 表記
// #highlighter(language=ruby,number=on,cache=on){{}}

// パイプ
// &brvbar;#contents