2011年06月14日
情報科学類 コンピュータリテラシ
                                       筑波大学 システム情報工学研究科 
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
	http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2011/2011-06-14
あるいは、次のページから手繰っていくこともできます。
	http://www.coins.tsukuba.ac.jp/~yas/
	http://www.cs.tsukuba.ac.jp/~yas/
コンピュータを操作する時の態度:
コンピュータと人間

図? コンパイラ方式でのプログラムの実行

図? インタプリタ方式でのプログラムの実行
その中間的な方法もある。
図? コンパイラとインタプリタの併用によるプログラムの実行
http://www.coins.tsukuba.ac.jp/syllabus/GB10714_GB10724.html
http://www.coins.tsukuba.ac.jp/syllabus/GB10734_GB10744.html
http://www.coins.tsukuba.ac.jp/syllabus/GB11911_GB11921.html
http://www.coins.tsukuba.ac.jp/syllabus/GB11916_GB11926.html
コンピュータ・リテラシでは、夏休みに予習するために、C言語で書いたプロ グラムをどうやって学類のコンピュータで動作させるかを説明する。
The Unix Super Text 第57章 Cの使いかた 参照。
$ mkdir ~/c_progs 
$ cd ~/c_progs 
$ ls 
(何も表示されない。mkdir 直後は、ディレクトリは空。)
$ cp ~yas/public_html/coins/literacy-2011/2011-06-14/ex/hello.c . 
$ ls 
hello.c
$ cat hello.c  
#include <stdio.h>
#define NAME "(name)"
int main()
{
        printf("Hello, %s\n", NAME );
}
$ cc hello.c  
$ ls 
a.out   hello.c
$ ./a.out  
Hello, (name)
$ 
c_progs で C programs の意味。
各自自分の分かりやすい名前に置き換えること。
a.out という
ファイルに保存される。
$ cat error.c 
#include <stdio.h>
#define NAME "(name)"
int main()
{
        printf("Hello, %s\n", NAME )
}
$ cc error.c 
error.c: In function 'main':
error.c:8: error: parse error before '}' token
$ 
この場合は、cc は、実行ファイルを作らない。
ファイル名と行番号をたよりに、プログラムを修正して、
エラーが出なくなるまで cc を実行する。
コンパイル・エラーがでなくなっても、プログラムは完成ではない。コンパイ ラにはわからない(分かり得ない) 間違いは残っている可能性がある。
$ ls 
a.out   hello.c
$ rm a.out  
$ ls 
hello.c
$ cc -o hello hello.c  
$ ls 
hello   hello.c
$ ./hello  
Hello, (name)
$ 
#include で読み込まれる。
stdio.h などのヘッダ・ファイルは、/usr/include/ 以下に
ある。他の場所にある時には、cc コマンドに -I オプションで
指定する。
libc (library C)という
ライブラリにある関数を標準で自動的に取り出して結合する(リンクする)。
libc などよくつかわれるライブラリは、
/usr/lib にある。
libc 以外のライブラリを使う時には、cc に -l オプションを付ける。
たとえば、三角関数 sin(), 指数関数 exp() 等を使う時には、-lm (mathematicsの意味)を指定する。
/usr/lib 以外の場所にあるライブラリを使うには、-L オプションで
ディレクトリのパス名を与える。
C言語と比べて近代的な機能、豊富なライブラリがある。 「オブジェクト指向」は、難しい。
コンパイラとインタプリタの2つを使って動作する。
$ mkdir ~/java_progs 
$ cd ~/java_progs 
$ ls 
(何も表示されない。mkdir 直後は、ディレクトリは空。)
$ cp ~yas/public_html/coins/literacy-2011/2011-06-14/ex/Hello.java . 
$ ls 
Hello.java
$ cat Hello.java  
class Hello
{
    static String Name = "(name)";
    public static void main(String args[])
    {
        System.out.printf("Hello, %s\n",Name);
    }
}
$ javac Hello.java  
$ ls 
Hello.class     Hello.java
$ java Hello 
Hello, (name)
$ 
javac コマンドは、拡張子 .java のソース・プログラムを
コンパイルし、結果を
拡張子 .class のファイルに保存する。
javac コマンドに複数のソース・ファイルを与えてもよい。
それぞれの .java に対して .class を生成する。
java コマンドは、拡張子 .class の、拡張子を取り除いたファイル名
を与える。java name.class と、.class まで与える
とエラーになる。
java コマンドに与える .class ファイルには、特定の形式の main 関
数 (main メソッド) が含まれている必要がある。
学類コンピューティング環境では、Dock に Eclipse を実行すためのアイ コンがある。
ホーム・ディレクトリ、 Desktop や Documents(書類)に、多くのファイルを放置することはよくない。 ディレクトリを作成し、整理すべきである。 1つの目安は、ls コマンドで 1画面に入らない時には分割する。
ディレクトリの操作(5月6日) も参照。
$ mkdir dirname 
この結果、dirnameという名前のディレクトリが作らる。
$ mv oldname newname 
この結果、ファイルoldfileのファイル名をnewnameに変更される。
ここで、newname のファイルが存在した場合、元の newname は消されてしまう。
$ mkdir ~/dir1 
$ mv oldname ~/dir1/newname 
この結果、カレント・ワーキング・ディレクトリにある
ファイルoldfileのファイル名は、
~/dir1/newnameに変更される。
次のように、ディレクトリだけを指定することもできる。
$ mv oldname ~/dir1/ 
この場合、次のものと同じになる。
$ mv oldname ~/dir1/oldname 
また、変更先にディレクトリを指定する mv では、ファイル名は1個でなくて
も複数でもよい。
$ mv file1 file2 file3 ~/dir1 
シェルの
ファイル名置換
を使うと便利。
$ ls file[1-3] 
$ mv file[1-3] ~/dir1 
$ ls file? 
$ mv file? ~/dir1 
$ ls file* 
$ mv file* ~/dir1 
ファイルを消すには、rm (remove) コマンドを用いる。
$ rm file1 
このファイル file1 が削除される。
rm コマンドで消してしまったファイルは、一般的には2度と戻らない。 消す前に、本当に不要かどうかを確認すること。
コマンド名の置換え(alias)等て、rm を rm -i に変えることは、一般的には勧
められない。「rm -i 
 y」という操作が、一連の操作として身に付い
てしまうので。
coins のファイルサーバには、過去のある瞬間の整合性がある状態(スナップ ショット)を自動的に保存する機能がある。過去2週間程度のファイルの状態が わかる。
$ ls /home/.snapshot/ 
hourly.0                        nightly.0                       nightly.4
hourly.1                        nightly.1                       nightly.5
hourly.2                        nightly.10                      nightly.6
hourly.3                        nightly.11                      nightly.7
hourly.4                        nightly.12                      nightly.8
hourly.5                        nightly.13                      nightly.9
hourly.6                        nightly.2
lilac-fss(0151728424)_vol1.296  nightly.3
$
nightly*
hourly*
$ cat /home/.snapshot/nightly.9/prof/yas/.bashrc 
cp でコピーしたり、emacs で読むこともできる。
rm コマンドで削除したファイルでも、ディスク上にデータが普通にはアクセス できない形で残されていることが一般的である。場合によっては、そこから機 密情報が漏れることがある。
完全に消し去るには、次のような方法を持ちいる。
過去状態を保存してある場合には、wipe でも削除できないことがある。
例:
何もしないと、自動的に再帰的な処理を行うプログラムもある。例: tar, tree, find 等。
ディレクトリに対しても mv コマンドは有効である。ディレクトリの名前を mv で変更すると、木構造で考えると、それ以下のファイルの名前を全て変更し たことと同じ効果がある。
ファイルのコピーでは、以下で述べるシンボリック・リンク等の問題があるため、 cp -r では不十分なことが多い。
大量の情報を保存するには、木構造を使うしかない。 しかし、木構造だけではうまくいかない。

図13 こうもりの分類(1)

図14 こうもりの分類(2)
木構造は、ファイルを整理するのに非常に強力な構造である。しかし、それだ けでは、ファイルを整理するには不都合が起きる。それを解消するために、次 のような名前で呼ばれる仕組みが用意されている。
注意:bash, csh の alias とファイル名の alias (Macintosh) は、まったくの別物。
 図15 こうもりの分類(別名つき)
木構造を補う方法として、 ハイパーテキスト を使うことがある。
例:cc と gcc-4.2
$ ls -l /usr/bin/cc 
lrwxr-xr-x  1 root  wheel  7  6  1 11:47 /usr/bin/cc -> gcc-4.2
$ 
シンボリック・リンクは、ls -l で見ると、右端に l (小文字の L) と表示さ
れる。
ファイル /usr/bin/cc を参照すると、gcc-4.2 (/usr/binにある)が使われる。
シンボリック・リンクを作成するには、ln -s コマンドを使う。
$ ln -s oldname newname 
この結果、newname でファイルを参照すると、
oldname というファイルが使われる。(このファイルは、
newname と oldname の2つの名前を持つ。)
$ cat file1-slink.text  
file1
$ ln -s file1.text file1-slink.text  
$ ls -l file1.text file1-slink.text  
lrwxrwxrwx  1 yas  prof  10  6 13 12:13 file1-slink.text -> file1.text
-rw-r--r--  1 yas  prof   6  6 13 12:13 file1.text
$ cp file1-slink.text file2.text 
$ cat file2.text  
file1
$ 
MacOSX の Finder は、次のような役割を持つ。
デスクトップは、MacOSX では、ホーム・ディレクトリの下の
「~/Desktop」という名前のディレクトリに対応している。
注意事項
シンボリック・リンクとエイリアスの違い
$ cd ~ 
$ ls -R    . | lv 
$ ls -lR   . | lv 
$ ls -laR  . | lv 
-R オプションは、このようにしばしば-l オプションや
-a オプションと一緒に使われる。また、-R オプションは、大
量の結果を表示することが多いので、パイプに出力してページャで表示するこ
とが多い。
(これらのオプションを忘れた人は、man コマンドを見なさい。)
tree コマンドに -N オプションをつけると、ファイル名に漢字を含むものも表 示できる。
$ tree -N ディレクトリ名 
さらに、nkf を使えば、ファイル名を EUC で表示できる。
$ tree -N ディレクトリ名 | nkf -e 
詳しくは、man tree を見なさい。
1つのディレクトリしか表示しない状態でも移動することはできるが、 マウスの操作が難しいので、2つ開いた方が良い。
option キーを押しながらドラッグすると、移動ではなく、コピーになる。 このことを確認しなさい。
なお、コピーを行った後、元のファイルを消せば実質的に移動(改名)になる。
名称未設定フォルダ」という名前のフォルダが作成される。
$ ls -l /Applications | grep '^l' 
ここで、'^l' は、行の先頭がl で始
まるという意味である。
The Unix Super Text 第32章 正規表現 参照。
端末の文字コードが EUC のものと、UTF-8 のもので、次のコマンドの実行結果 を比較しなさい。
$ locale 
$ echo $LANG 
漢字の名前をディレクトリを含むディレクトリで、次のコマンドの結果を比較 しなさい。
$ cd 漢字のディレクトリを含むディレクトリ 
$ ls 
$ ls -v 
$ ls | cat 
$ ls | nkf -e 
$ ls | nkf -w 
端末の中で Emacs を実行し、M-x set-keyboard-coding-system と M-x
set-terminal-coding-system やで、端末の入出力の文字コードて適合させなさ
い。
$ javac 
(Shift_JISのエラー・メッセージ)
次のように打つと、EUC でエラー・メッセージが表示される。
$ javac -J-Dfile.encoding=eucJP 
(EUCのエラー・メッセージ)
また、Java言語のソース・プログラムの文字コードとして EUC を利用するには、
次のようにする。
$ javac -encoding eucJP file.java 
以上のことを確認しなさい。
$ lynx . 
$ lynx ~ 
$ w3m . 
$ w3m ~ 
$ ssh icho.u.tsukuba.ac.jp 
[s10xxxxx@unix01 ~]$ ls -ld ~
[s10xxxxx@unix01 ~]$ ls -l ~
最近では、複数のファイル(ディレクトリを含んだもの)を、1つにまとめる ために使うことが多い。
tar コマンドは、gzip コマンドや compress コマンドなどの圧縮プログラムと 合わせて使われることが多い。 tar コマンド単体では、圧縮の機能はないが、z オプションを付けると自動的 に gzip コマンドを実行する機能がある。
tar ファイルを作成しなさい(tar c)。 The Unix Super Text 37.2 節 参照。 作成した tar ファイルに含まれているファイルの一覧を、展開することなく 画面に表示しなさい(tar t)。 作成した tar ファイルの内容を、別のディレクトリに展開しなさい(tar x)
tar コマンドと ssh コマンドを組み合わせると、異なるコンピュータ間でファ イルをディレクトリ構造を保ったままコピーすることができる。
作成したファイルを、別のディレクトリに移動して、展開しなさい。展開する には、Finder で、ダブルクリックするか、端末でunzip コマンドを使う。
実習室の iMac (MacOSX) で、次のようにしてこの機能を利用してみなさい。
smb://ログイン名@lilac-fsm.coins.tsukuba.ac.jp/
実習室の iMac では、サーバとログイン名が同一なので「ログイン名」を省略できる。
smb://lilac-fsm.coins.tsukuba.ac.jp/
/Volumes/ログイン名/ にホームディレクトリが現れる。
/Volumes/ログイン名/を
アンマウント(取り出す操作)しなさい。
$ ls /Volumes 
(名前の確認、COINS40 のようなもの以外のものを調べる。
ログイン名や coins-home、webdav のようなものがある。)
$ umount /Volumes/ログイン名 
うまくアンマウントできないことがある。
$ umount /Volumes/名前 
unount(/Volumes/名前): Resource busy -- try diskutil unmount
$
''
このエラーは、あるプロセスがそのファイル・システムのファイルを開いた状
態のまま(利用中である)ことを意味する。その時は、プロセスを終了させたり、
ファイルを閉じてからもう一度試みる。シェルの
カレントワーキングディレクトリ
ということもあるので、cd / もしてみる。
どのプロセスがファイルを開いたままなのか分からない時には、
lsof コマンド(list open files)
で探すこともできる。
実習室の iMac (MacOSX) で、次のようにしてこの機能を利用してみなさい。
この方法は、
練習問題(1725) SMB とほとんど同じである。ただし、
接続する時に smb:// から始まるものではなく、次のように
afp:// から始まり、ファイル・サーバとしては www.coins.tsukuba.ac.jp を使う。
afp://ログイン名@www.coins.tsukuba.ac.jp/
実習室の iMac では、サーバとログイン名が同一なので「ログイン名」を省略できる。
afp://www.coins.tsukuba.ac.jp/
この機能を利用してみなさい。
\\lilac-fsm.coins.tsukuba.ac.jp\ログイン名
~/webdav という名前のディレクトリを予め作成しておく必要がある。
実習室の iMac (MacOSX) で、次のようにしてこの機能を利用してみなさい。
この方法は、
練習問題(1725) SMB とほとんど同じである。ただし、
接続する時に smb:// から始まるものではなく、次のように
https:// から始まり、ファイル・サーバとしては www.u.tsukuba.ac.jp、
ディレクトリ名として /webdav/ まで指定するる
https://www.u.tsukuba.ac.jp/webdav/
ユーザ名とパスワードしては、全学計算機のものを用いる。
初期状態の Windows では、WebDAV が使えないことがある。次のコマンドで使 える場合もある。
net use w: https://ホスト名/ディレクトリ名/
(1) 「ccコマンド」 の所で用いたhello.c をコピーし、
emacsで
(name)を自分の名前で置き換えなさい。これを、コンパイルして実行し
なさい。名前は、漢字ではなく、ASCII 文字だけでローマ字を使いなさい。
端末での、コンパイルと実行の様子を、シェルのプロンプトも含めてテキスト・
ファイルにコピーしなさい。
(2) 「javac コマンドと java コマンド」で用いた
Hello.java をコピーし、
emacsで
(name)を自分の名前で置き換えなさい。これを、コンパイルして実行し
なさい。名前は、漢字ではなく、ASCII 文字だけでローマ字を使いなさい。
端末での、コンパイルと実行の様子を、シェルのプロンプトも含めてテキスト・
ファイルにコピーしなさい。
(3) mkdir, rm, ln -s 等のコマンドや Finder を用いて、ファイルを整理しなさい。 レポートには次の項目を含めなさい。
ディレクトリ構成の説明には、tree コマンドの結果を利用してもよい。ただし、
今回整理した部分だけを含めること。~/Library/ など、自分では整理しなかっ
たファイルについては、含めないこと。
「tree -N」 でファイル名に漢字を含むものも表示できる。
「tree -N | nkf -e 」で、さらにファイル名が EUC に変換される。
課題が出される前に既にディレクトリを作成して既に既に整った状況であった 場合には、問題点の代わりに整理の考え方について説明しなさい。またディレ クトリを新たに作成する代わりに既存のディレクトリについて報告してもよい。
(4) 次のネットワークファイル・システムのいずれかを利用しなさい。
(5) The Unix Super Text の次の部分を読みなさい。
(6) [加点] ファイルのアーカイブと圧縮について、次のようなことを行ってみなさい。
(7) [加点] 複数のアーカイブ・プログラムを比較して、使いやすさ、圧縮率、 エラーに対する対策をなど観点から評価しなさい。