授業資料/09 の変更点


#CONTENTS

//  第 9 回 -- RCS

* Revision Control Software: バージョン管理, RCS [#u86665f0]

Computer をしばらく使っていると気づくだろうが,
われわれは一つのファイルを何度も修正することがある.
&br;&br;
このファイルが大きかったり内容が複雑だったりする場合,
修正は常に「改善」であるとは限らず,「改悪」であるかもしれない.
修正作業そのもののミスにより,意図しない修正を施してしまうこともある.
また,修正によって大事な情報を削除しないといけないというケースも存在するだろう.
&br;
こうしたとき,以前の状態のファイルを全てバックアップして保存しておけば,
こうした問題は解決できる.  
つまり,「ファイルのバージョン違い版を管理する」ことが適切に行えれば良いのだ.
&br;&br;
こうした,ファイルのバージョン変更にまつわる情報を管理するツールを
「バージョン管理ソフト」と呼ぶ.
&br;
&br;
本講義では,バージョン管理ソフトとして「RCS」を学ぶことにする.
この RCS は個人ユーザが使うのに適しており,比較的使いやすく,かつ,
unix の歴史上も由緒正しいものであり,最初に学ぶには最適である.
また,単純な分だけ,単独のファイルを管理するには後述のものより適しているとも言える.
&br;
また,より進化したバージョン管理ソフトとして他に 「CVS」や「Subversion」がある.
これらは機能がより高度化した優れたツールであるが,その分,使い始めるにはやや敷居が高く,また,
個人ユーザにはやや over spec な感がある.
そこで,RCS の機能に不満を感じるようになったらこれらの利用を検討すればよい.
&br;
&br;
なお,本講義では RCS を一人で単独で使うことを前提に解説する.
複数の人間で同一ファイルを編集する際にはまた異なった注意が必要であるが,
そうした目的には CVS や Subversion がより適しているので,それらを使うのが良かろう.

&br;&br;
** Reference: RCS 参考資料 [#bbd848d3]

RCS は 1982 年には既に姿を見せていたバージョン管理ソフトであり,
古くからよく知られている.
概念はシンプルで,使うコマンドもそう複雑ではないが,
参考となる資料があればより理解も深まるだろう.

&br;&br;
- [[&ref(/materials/JNorth_arrow-right-sm.png); Official RCS Homepage:http://www.cs.purdue.edu/homes/trinkle/RCS/]]
… RCS の公式 web. 配布ファイルが少しだけ古いかな.
&br;&br;
- [[&ref(/materials/JNorth_arrow-right-sm.png); GNU RCS:http://www.gnu.org/software/rcs/rcs.html]]
… 泣く子も黙る GNU の RCS. まあ,ここを情報の起点としておけば間違いない.2012年6月公開の最新バージョン 5.8.1 も置いてある.
… 泣く子も黙る GNU の RCS. まあ,ここを情報の起点としておけば間違いない.2013年5月公開の最新バージョン 5.9.0 も置いてある.
&br;&br;
- 「Unix 流プログラミング 36--42」
… 今泉氏 in "Unix Magazine", 1993.10 -- 1994.04, ASCII社.
&br;&br;
- ''man rcsintro''
&br;
と入力して unix 上で入門マニュアルを読む.
簡潔で良くできた入門マニュアルである.
&br;
&br;
- [[&ref(/materials/JNorth_arrow-right-sm.png); Revision Control System RCS:http://www.naney.org/comp/rcs/index.html]]
&br;
渡部氏 の web.
ここの RCS FAQ は RCS を使っていて困ったときに役立つだろう.
&br;
&br;
- その他いくらでもネットワークで検索を.
&br;
&br;
- 昔あった資料.ネットワークからは消えているけれども, 君は見ることができるか?((webから消えてもすぐ諦めてはいけない.不完全ではあるが,我々には過去へ戻るマシンがあるではないか!))
-- RCS: Revision Control System (http://www.swlab.csce.kyushu-u.ac.jp/Info/services/rcs.html)
-- RCS 超入門,RCS 初級講座,RCS 中級講座,RDCS のメカニズム,等々(http://www.dais.is.tohoku.ac.jp/~kabe/vsd/rcs/rcs.html).
-- RCS を使おう講座 (http://www.proc.org.tohoku.ac.jp/~minatsu/guide/rcs0.html)
-- The RCS Mini-Howto (http://www.linux.or.jp/JF/JFdocs/RCS.html)

&br;&br;
** Introduction for RCS: RCS の概念 [#zd6185f0]

RCS を理解するには,おおざっぱに言って
バージョン,
バージョン管理ファイル,チェックイン,チェックアウト,ロック
という概念が分かれば良い.
それらについて説明しよう.


: バージョン(Version), リビジョン(Revision) |
日本語で言うと「バージョン = 版」,「リビジョン = 改版」ということになる.
ファイルを更新したら「新しい版になった=バージョンが上がった」と考えれば,
大体分かるだろう.
&br;
&br;
: バージョン管理ファイル |
管理対象のファイルの全てのバージョンの情報が詰まったファイル.
&br;
管理したい対象のファイル名が例えば dummy.tex であるとすると,
''dummy.tex,v'' という名前になるのが普通である.
つまり,元のファイル名の末尾に ",v" 
をつけたファイルがバージョン管理ファイルであると思えば良い.
&br;
&ref(/materials/warning.png); OS の制約等で違うこともある((例えば,拡張子は3文字までという制限がある DOS という OS 用の RCS では拡張子の最後の1文字を強制的に v に変更するという手法をとっていた)).
&br;
&br;
なお,バージョン管理ファイルは,初めてチェックインするときに自動的に作られる.
&br;
&br;
このとき通常は,管理したいファイルが存るディレクトリ(仮に dirA とする)の下に
''RCS''
という名前のディレクトリがあればそこ(dirA/RCS)の中に,無ければそのディレクトリ(dirA)に, バージョン管理ファイルが作られる((どうするか尋ねてくることもある.その時は好きな方を答えれば良い)).
&br;
&br;
: ロック |
本来はバージョン管理ファイルに「鍵」をかけること,である.
意味としては,「ただいま私が編集中なので,他の人はいじれません」ということになる.
&br;
実際,ファイルをロックすると,ロックした本人しか新しいバージョンのファイルを登録できない.
&br;
&ref(/materials/warning.png); この場合でも,他人はそのファイルを読み出すことはできる.
&br;
&br;
この機構によって,RCS は複数の人間による単一ファイルのバージョン管理を行っている.    
これを「ロッキングによるファイル衝突の防止」とよぶ.
&br;
&br;
: チェックイン |
ファイルをバージョン管理ファイルに「このファイルが最新バージョンですよ〜」と登録する作業を言う.
&br;
&ref(/materials/warning.png); 注意:
ロックしてあるファイルしか登録できないので注意すること.
&br;
ロックしていないファイルはチェックインできない.
こういう時は
''rcs␣-l␣ファイル名''
とするとファイルがロックされ,チェックインできるようになる.
詳しくは後述の ''rcs'' コマンドを参照すること.
&br;
&br;
初めて登録する時には,「そのファイルがどんなファイルなのか」を尋ねてくるので,丁寧に記述しよう.
&br;
&ref(/materials/warning.png); もちろん英語で(^-^).
&br;
&ref(/materials/warning.png); Emacs の Version Control 機能を用いると日本語で記述することもできるかも知れない.
&br;
&br;
登録するたびに「そのファイルのどこをどのように変更したのか」を尋ねてくるので,
これも後々のために丁寧に記述しておくべし(これももちろん英語で).
&br;
&br;
: チェックアウト |
バージョン管理ファイルからファイルを取り出す作業を言う.
&br;
&ref(/materials/warning.png); 注意: 
ロックして取り出すと編集可能に,
ロックしないで取り出すと編集不可になることに注意せよ.
&br;
&br;
一人だけで使う場合は,常にロック状態で作業するか,
ロック機構を無効にするかすればよい.
ロック機構を無効にする方法も後述の ''rcs'' コマンドを参照すること.



&br;&br;
** Flow of operations: RCS でのファイル管理,編集の流れ [#f4515c30]

CENTER:&ref(./rcs-howto.png,150%);

&br;
RCS を個人一人で用いる時は,通常は上の図にあるように
「ロックつき」でチェックイン,チェックアウトしていればまず問題はないだろう(ちょっと邪道だが).
&br;&br;
流れをもう少し詳しく書くと,RCS では

+ 管理したいファイルを「バージョン管理ファイル」に
''チェックイン''する.
&br;
&ref(/materials/warning.png); バージョン管理ファイルは,初めてチェックインするときに自動的に作られる.
&br;
&br;
+ バージョン管理ファイルから,使いたいファイルを
''ロックつきでチェックアウト''
して取り出す.
&br;
&br;
+ ファイルを編集する.
&br;
&br;
+ 1. へ戻る.

という繰り返しで用いるのが普通である.
&br;
何か特別なことをしたい時だけ,別のことをすればよい.  
&br;
&br;
&ref(/materials/OK.png);
実は,下で示す
''ci␣-l␣-zLT''
というコマンドだけ覚えておけばだいたいなんとかなる.

&br;&br;
&ref(/materials/notes.png); 実習: 
以下の手順に従い,rcs を試してみながら理解せよ.

+ RCS の練習用に適当なディレクトリに移動する.
&br;
&br;
+ そのディレクトリの下に,バージョン管理ファイルを置く特別なディレクトリ ''RCS'' を作っておく.
&br;
具体的には
> ''mkdir␣RCS''
<
とする.
&br;
&br;
+ 次の内容のサンプルファイルを,ファイル名 dummy.txt で作る.
  Sample File
  My name is hogehoge.
  なんでもいいから書け.
  $Id$
  $Date$
&br;
&ref(/materials/warning.png); 最後の2行は必ず書き入れること.
&br;
&br;
+ 初めてのチェックインを行う.
&br;
より具体的には
ロック付きでチェックイン &amp; チェックアウトしてみる,ということになる.
&br;
実際には,
//
> ''ci&#9251;-l&#9251;dummy.txt''
<
とするだけだ.
&br;
&ref(/materials/OK.png);
''ci&#9251;-l'' 
は,「チェックインした後,自動的にロック付きでチェックアウト」
するという便利なコマンドである.
&br;
&br;
すると,最初は次のようにメッセージが出る.
  dummy.txt,v  <--  dummy.txt
  enter description, terminated with single '.' or end of file:
  NOTE: This is NOT the log message!
  >>
//
ここでは
「このファイルの内容を記述せよ」と言われているので,
後々のためにも(英語で)きちんと記入すること.
なお,記入し終わったら,
&quot; . &quot;(ピリオド)のみの行を記入すれば「記入終わり」となる.
&br;
&br;
記入が終わると,
  initial revision: 1.1
  done
//
という表示が出て,バージョン 1.1 という真新しいバージョンでこのファイルが登録されたことが分かる.
&br;
&br;
+ ディレクトリ ''RCS'' の中にバージョン管理ファイルができているか確認する.    
&br;
> ''ls&#9251;RCS''
<
とすればよいだろう.
&br;
&br;
+ ''ci&#9251;-l'' の自動チェックアウトがうまくいったか,つまり,
チェックアウトされたファイル dummy.txt が存在するか確認する.
&br;
> ''ls&#9251;dummy.txt''
<
とすればよいだろう.
&br;
&br;
+ チェックアウトされたファイルがどう変わったか見てみる.
&br;
> ''less&#9251;dummy.txt''
<
とすればよいだろう.
どこがどう変わったかよく見てみよ.
&br;
また,時間がどう記述されているか,自分の腕時計などと比べてみよ.
&br;
&br;
+ サンプルファイルの中身を編集して変えてみる.
&br;
&ref(/materials/warning.png); $Id$, $Date$ の部分はいじらないこと.
&br;
&br;
+ 再びチェックイン &amp; チェックアウトを行ってみる.
&br;
さて今度は,''-zLT''という特別なオプションをつけて
&br;
> ''ci&#9251;-l&#9251;-zLT&#9251;dummy.txt''
<
としてみよう.
&br;
&ref(/materials/warning.png);
''-zLT'' 
は,「ローカル時間を用いて時間表示を記述する」というオプションである.
ここでは,「日本時間」で時間が表示されるということになる.
&br;
&br;
すると,
  RCS/dummy.txt,v  <--  dummy.txt
  new revision: 1.2; previous revision: 1.1
  enter log message, terminated with single '.' or end of file:
  >>
//
という表示が出る.
ここでは
「このファイルをどう変更したか記述せよ」と言われているので,
後々のためにもこれも(英語で)きちんと記入する.
なお,記入し終わったら,
&quot; . &quot;(ピリオド)のみの行を記入すれば「記入終わり」となるのも先と同様である.
今度は終了は単なる
  done
//
と表示されるだけである.
&br;
&br;
+ チェックアウトされたファイルがどう変わったか再び見てみる.
&br;
> ''less&#9251;dummy.txt''
<
とすればよいだろう.
どこがどう変わったかよく見てみよ.
&br;
とくに時間の記述がどう変わったか,自分の腕時計などと比べてみよ.
&br;
&br;
+ ''dummy.txt を消去してみる!''
&br;
> ''rm&#9251;dummy.txt'' 
<
としてみれば良いだろう.
&br;
&br;
+ ''dummy.txt を復活!''
&br;
バージョン管理ファイル自身は消えていないので,
そこからチェックアウトすれば,ファイルが復活することになる.
&br;
具体的には,
&br;
> ''co&#9251;-l&#9251;-zLT&#9251;dummy.txt''
<
とすればよい.
&br;
&ref(/materials/warning.png);
チェックアウトコマンド ''co'' 
は特に指定しなければ最新バージョンのファイルを取り出す.
&br;
&br;
+ 古いバージョンとの違いを調べてみる.
&br;
具体的には,
&br;
> ''rcsdiff&#9251;-zLT&#9251;-r1.1&#9251;dummy.txt''
<
とすればよい.
これは,最新バージョンとバージョン 1.1 の dummy.txt を比べよ,
というコマンドになる.
&br;
&br;
+ これまで dummy.txt に加えた編集の履歴を見る.
&br;
具体的には,
&br;
> ''rlog&#9251;-zLT&#9251;dummy.txt''
<
とすればよい.
こうすると,今までのチェックインの際に記述した変更内容などがリストアップされる.
&br;
&br;
+ dummy.txt に埋め込んであるキーワード(Id, Date)を取り出してみる.
&br;
具体的には,
&br;
> ''ident&#9251;dummy.txt''
<
とすればよい.
こうすると,$Id$ や $Date$ と書き込んだ部分が出力される.
&br;
&br;
&ref(/materials/warning.png);
この機能はバイナリファイルに対しても有効であるので,
本格的なプログラミングにも適用できる.
&br;
例えば,バイナリであるコマンド
''rcs''
自身にはどのようなキーワードが埋め込まれているのだろうか.
調べてみよ.

&br;&br;
** Embedding of keywords: RCS: キーワードの埋め込み [#haca0e66]

上にも出てきたように,
$Id$ や $Date$ などとファイルのなかに決まったキーワードを埋め込んでおくことで,
RCS の様々な情報を自動的に記述することができる.
以下に,どのようなキーワードがあるのかを示しておく.

| キーワード | 意味 |h
| $Id$ | ファイルの名前,バージョン,日時,作成者,状態,ロックした者&br;という情報.大体はこれで十分だろう. |
| $Header$ | $Id$ とほぼ同じ情報になるが,ファイル名が「フルパス」で記述される.&br;情報が無駄に長くなるだけなので一般にあまり使われないが,使いたい場面もあるかも知れない. |
| $Date$ | そのバージョンがチェックインされた日時. |
| $Revision$ | バージョン.       |
| $Author$ | そのバージョンをチェックインしたユーザ名. |
| $Locker$ | 現在そのファイルをロックしているユーザ名. |
| $RCSfile$ | ファイル名. |
| $Source$ | ファイル名.ただし,フルパス. |
| $State$ | そのバージョンの「状態」.通常は ''Exp'' になっているだろう. |
| $Log$ | そのチェックインの際の「変更点記述」を表示する.&br;ファイルが大きくなってしまうのと,''rlog'' で同じことができるということから,あまり使われない. |

&br;&br;
&ref(/materials/notes.png); 実習:
上のキーワードを全て書き込んだファイルを作成し,チェックイン &amp;
チェックアウトして,キーワードがどう作用しているか確認せよ.

&br;&br;
** Commands: RCS の コマンド [#hf00ce53]

以下に,RCS のコマンドについて簡単な一覧を載せよう.
詳しくは man コマンドで調べれば良いが,通常はこれぐらい知っていれば十分なはずである.

: ci&#9251;オプション&#9251;ファイル名 |
チェックインコマンド.
&br;
何もオプションをつけないと,ファイルが登録 &amp; 
吸収されてしまって,手元に元のファイルが無くなるが慌てないように.
こういう時は慌てずにチェックアウトすれば良いだけだ.
&br;
オプション(つけなくてもよい)は以下の通り.
&br;
&br;
'' -l ''
&nbsp;
チェックイン後,自動的に「ロック付きで」チェックアウトする.
&br;
'' -u ''
&nbsp;
チェックイン後,自動的に「ロックなしで」チェックアウトする.
&br;
'' -zLT ''
&nbsp;
時間表記を「ローカル時間」で行う.
これが無いときは,グリニッジ標準時で時間表記される.
&br;
'' -rリビジョン番号 ''
&nbsp;
指定したリビジョン番号でチェックインする.
リビジョンを大きくあげたい,というときなどに用いる.
&br;
'' -f ''
&nbsp;
ファイルが変更されていなくても強制的にチェックインする.
&br;
&br;
: co&#9251;オプション&#9251;ファイル名 |
チェックアウトコマンド.
&br;
オプション(つけなくてもよい)は以下の通り.
&br;
&br;
'' -l ''
&nbsp;
「ロック付きで」チェックアウトする.
&br;
'' -u ''
&nbsp;
「ロックなしで」チェックアウトする.
&br;
'' -zLT ''
&nbsp;
時間表記を「ローカル時間」で行う.
これが無いときは,グリニッジ標準時で時間表記される.
&br;
'' -rリビジョン番号 ''
&nbsp;
指定したリビジョン番号のバージョンのファイルをチェックアウトする.
&br;
'' -f ''
&nbsp;
既にファイルが存在していても,チェックアウトして強制的に上書きする.
&br;
&br;
: ident&#9251;オプション&#9251;ファイル名 |
ファイル内のキーワードを読み出すコマンド.
&br;
大きく動作が変わるオプション(つけなくてもよい)はない.
&br;
&br;
: rlog&#9251;オプション&#9251;ファイル名 |
バージョン管理ファイルのログ(履歴記録)メッセージや,関連情報を出力するコマンド.
&br;
オプション(つけなくてもよい)は以下の通り.
&br;
&br;
'' -L ''
&nbsp;
ロックされているファイルだけを対象とする.
&br;
'' -R ''
&nbsp;
バージョン管理ファイル名を表示する.
&br;
'' -h ''
&nbsp;
関連情報を表示する.
&br;
'' -t ''
&nbsp;
関連情報を表示する.''-h'' オプションよりも少しだけ情報が多い.
&br;
'' -rリビジョン番号 ''
&nbsp;
指定されたリビジョン番号のファイルの情報のみを表示する.
&br;
&br;
: rcsdiff&#9251;オプション&#9251;-r番号1&#9251;-r番号2&#9251;オプション&#9251;ファイル名 |
バージョン管理されているファイルのバージョン違いを比べる.
&br;
&br;
二個の番号は省略が可能で,番号の個数によって次のように動作する.
&br;
''番号1 と番号2 が与えられている''
&nbsp;
各々の二つのバージョンのファイルを比較する.
&br;
''番号1 のみが与えられている''
&nbsp;
番号1 のバージョンのファイルと,現在存在するファイルとを比較する.
&br;
''番号は一つも与えられていない''
&nbsp;
登録済みの最新バージョンと,現在存在するファイルとを比較する.
&br;
&br;
: rcs&#9251;オプション&#9251;ファイル名 |
バージョン管理ファイルの様々な性質を変更する.
&br;
オプション(省略できないかも)は以下の通り.
&br;
&br;
'' -l ''
&nbsp;
ファイルをロックする.
&br;
'' -u ''
&nbsp;
ファイルをロック解除する.
&br;
'' -L ''
&nbsp;
ロックを厳密に行うモードにする(普通はデフォルト).
&br;
'' -U ''
&nbsp;
ロック機構がほぼ無効なモードにする.
このモードでは,ロックされていないファイルでもチェックインできる.
たまにロックが役に立つことがあるので,ロックそのものを無効にすることはあまりお勧めしない.



&br;&br;
* Report: レポート [#kd54a7d5]

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

** Exercises: 課題 [#w60729b0]

+ この授業でこれまでに作成したファイルの全てに RCS でのバージョン管理を試みてみよ.
&br;
その際,$Log$ 機能を盛り込んでみて支障がないかどうかチェックせよ.
もし支障があるならば,どうやって解決すれば良いかマニュアルを調べるなどして考えよ.
&br;
&br;
+ RCS の面白い使い方が何かないか考えてみよ.
&br;
&br;
+ RCS の GUI(グラフィカルユーザーインターフェース)版というべきソフトウェアが無いか探してみよ.
見つけたならば,使ってみてレビューせよ.
&br;
&br;
+ RCS の進化版ともいえるバージョン管理ソフトの CVS, Subversion について調べ,
RCS のチェックイン,チェックアウトに相当する操作は CVS, Subversion ではどうなっているのかを記せ.




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

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;

// 空白記号
// &#9251;