2010年06月15日 情報科学類 コンピュータリテラシ 筑波大学 システム情報工学研究科 コンピュータサイエンス専攻, 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2010/2010-06-15
あるいは、次のページから手繰っていくこともできます。
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-2010/2010-06-15/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 オプションを付ける。
/usr/lib
以外の場所にあるライブラリを使うには、-L オプションで
ディレクトリのパス名を与える。
C言語と比べて近代的な機能、豊富なライブラリがある。 「オブジェクト指向」は、難しい。
コンパイラとインタプリタの2つを使って動作する。
$ mkdir ~/java_progs
$ cd ~/java_progs
$ ls
(何も表示されない。mkdir 直後は、ディレクトリは空。)
$ cp ~yas/public_html/coins/literacy-2010/2010-06-15/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(書類)に、多くのファイルを放置することはよくない。 ディレクトリを作成し、整理すべきである。
$ 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
ファイルを消すには、rm (remove) コマンドを用いる。
$ rm file1
このファイル file1 が削除される。
rm コマンドで消してしまったファイルは、一般的には2度と戻らない。 消す前に、本当に不要かどうかを確認すること。
コマンド名の置換え(alias)等て、rm を rm -i に変えることは、一般的には勧
められない。「rm -i y」という操作が、一連の操作として身に付い
てしまうので。
文字 | 単語 | 意味 |
r | read | 読込み可 |
w | write | 書込み可 |
x | execute | ファイルの場合、プログラムと として実行できる。 ディレクトリについて、それ以下を検索したり、cd できる。 |
$ ls -l file1.txt
-rw-r--r-- 1 yas prof 2 5 10 18:59 file1.txt
$ chmod go-r file1.txt
$ ls -l file1.txt
-rw------- 1 yas prof 2 5 10 18:59 file1.txt
$
5月18日の練習問題(1008) 等では、
ホーム・ディレクトリや~/public_html/
のモードについて述べた。
$ ls -ld ~ ~/public_html
drwxr-xr-x 59 yas prof 12288 6 14 11:57 /home/prof/yas
drwxr-xr-x 30 yas prof 8192 6 2 11:59 /home/prof/yas/public_html
$
Web サーバ Apache のプロセスは、UID 70 _www, GID 70 _www で
動いているので、ファイルやディレクトリへのアクセス制御では
その他(others)のものが使われる。
Web ページとして世界に公開するためには、このプロセスが読めるようにする
必要がある。
$ chmod o+x ~ ~/public_html
$
この結果、Apache プロセスから読めるようになったが、副作用として、他の人
も、そのファイルやその他ファイルをアクセスできるようになっ
た。もしも、読まれたくないファイルやディレクトリがあれば、chmod でモー
ドを変更する必要がある。
chmod go-r file
chmod go-rx dir
/home/yas/public_html/index.html
を、Web サーバのプロセスが
がアクセスできるには、ルートからそこに至る全てのディレクトリでx ビット
が必要である。
/home/yas/Mail
の group, others に対するx ビット(とrビット)
を落としておけば、その下のファイル mail1
, mail2
,
mail3
のモードにかかわらず、group, others はアクセスできない。
大量の情報を保存するには、木構造を使うしかない。 しかし、木構造だけではうまくいかない。
図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 5 12 15:44 /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つの名前を持つ。)
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 を見なさい。
$ ls -ld ~
ホーム・ディレクトリのモードを chmod コマンドで変化させた時に、他の人や
Web サーバ Apache からアクセスできる状態がどのように変化するかを調べな
さい。
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)。 手引き 2.6.2 項 参照、 The Unix Super Text 37.2 節 参照。 作成した tar ファイルに含まれているファイルの一覧を、展開することなく 画面に表示しなさい(tar t)。 作成した tar ファイルの内容を、別のディレクトリに展開しなさい(tar x)
tar コマンドと ssh コマンドを組み合わせると、異なるコンピュータ間でファ イルをディレクトリ構造を保ったままコピーすることができる。
作成したファイルを、別のディレクトリに移動して、展開しなさい。展開する には、Finder で、ダブルクリックするか、端末でunzip コマンドを使う。
(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) 練習問題(1807) を行いなさい。問題が見 つかった場合には、どのような問題があってどのように修復したのかを書きな さい。問題が無かった場合には、レポートにはそのように書きなさい。
(5) The Unix Super Text の次の部分を読みなさい。
(6) [加点] ファイルのアーカイブと圧縮について、次のようなことを行ってみなさい。
(7) [加点] 複数のアーカイブ・プログラムを比較して、使いやすさ、圧縮率、 エラーに対する対策をなど観点から評価しなさい。