unix講習会
卒研の5年生が、Raspberry-PiやらWebサーバ使いたいやらで、 unixを触る機会が多いけど、基本が解らないので 講習会をして欲しいとの要望から、unixの講習会を行いました。 卒研の時間を使ったけど、中途半端になってもいけないので、3時間コースになりました。
unixを使うには
unixを使うと言っても、色々な方法がある。 HDDインストール、USBインストール、 Windowsの仮想サーバ上にインストール(ただしLinuxは不安定)。 自前のサーバでなければ、Remote Desktopで接続、Rloginなどからssh接続。 ちょっと本物との違いがあるかもしれないけど、Cygwin,MinGWをインストール。
unixには様々なものがあるが、大きく分けるとBSD系(FreeBSD,NetBSD)、 Mac OS X、Linux。 Linuxといっても、Linux自体はカーネル部分だけであり、フリーの周辺ソフトを 取りまとめたディストリビューションがいくつかある。 有名なのは、RedHat系(CentOS,Fedra)、Debian系(Debian,Ubuntu)。 最近であれば、Ubuntuを入れるのが無難だろう。
unixの最初
まずは、login してもらって、ディレクトリ構成やら簡単な設定方法を説明。
/boot 起動に必要なもの /bin 必要最低限の実行プログラム /sbin 必要最低限の管理者向け実行プログラム /lib ライブラリやモジュールなど /home ユーザのディレクトリ /etc 設定ファイル /var プログラムが可変データを保存する場所 /tmp だれでも書き込める作業用データの置き場 /usr/bin 一般的な実行プログラム /usr/sbin 一般的な管理者向け実行プログラム /usr/local/bin そのシステム固有の実行プログラム /usr/local/sbin そのシステム固有の管理者向け実行プログラム /dev デバイスファイル
unixで設定を行う場合、システム全体に関係する設定は、/etc/配下のファイル、 各ユーザ固有の設定は、$HOME/配下の "." で始まる隠しファイルを使う。
各ユーザの情報は、/etc/passwd,/etc/group などで管理され、 passwdファイルの最後の欄には、login-shell などが記載される。
shellの基本
shellは、コマンドの対応処理をしてくれるが、基本設定は、.bashrc や .profile で 設定する。サーバの簡単な設定を行うだけであれば、基本的なバッチファイル (shell-script)の書き方を知っていればいい。
変数代入・参照、if,case などの概略だけを説明する。
そういえば、chmod で実行フラグの説明しなかったな…
shell-scriptでは、環境変数とshell変数があり、環境変数は子プロセス起動時に 引き継がれる。 環境変数で、重要な、LANG,PATH,LD_LIBRARY_PATH などを説明する。
分割コンパイルの説明
フリーのソフトを個別ダウンロード・コンパイルする学生も多い一方で、 make の意味やらが解らない人も多いので、分割コンパイルやmakeを説明。
複数のプログラムから、一つのプログラムを作る場合には、ヘッダファイルなどの 書き方が重要なので、4年の情報構造論でやったネタを分割する場合で説明。
(( list.h )) struct List { int data ; struct List* next ; } ; struct List* cons( int , struct List* ) ; void print( struct List* ) ; extern int count ; ------------------------------------------------ (( list.c )) #include <stdio.h> #include <stdlib.h> #include "list.h" int count = 0 ; // cons実行回数のカウント struct List* cons( int x , struct List* n ) { struct List* nn ; count++ ; nn = (struct List*)malloc( sizeof( struct List ) ) ; if ( nn != NULL ) { nn->data = x ; nn->next = n ; } return nn ; } void print( struct List* p ) { for( ; p != NULL ; p = p->next ) printf( "%d¥n" , p->data ) ; } ------------------------------------------------ (( main.c )) #include <stdio.h> #include "list.h" int main() { struct List* l = cons( 1 , cons( 2 , cons( 3 , NULL ) ) ) ; print( l ) ; printf( "%d¥n" , count ) ; return 0 ; }
共通のヘッダファイルには、構造体宣言やプロトタイプ宣言を記載する。
Makefileの書き方
前述のlist.c,main.c をコンパイルするには、必要最小限の処理毎に行う場合は、 以下の3つのコマンドで行う。
$ gcc -c list.c $ gcc -c main.c $ gcc list.o main.o ---------------- $ gcc list.c main.c であれば、一度にできるけどmakeの理解のため。
プログラムの修正があった場合には、3つのどのコマンドを実行すべきかは、 人間が考えるのは煩雑。そこで make を使う。 make は、ファイルの日付情報を元に必要最小限の処理を行ってくれる。
(( Makefile )) a.out: list.o main.o gcc list.o main.o list.o: list.c list.h gcc -c list.c main.o: main.c list.h gcc -c main.c
しかし、gcc のコンパイラを別なものを使うとか、特殊なライブラリを使う場合、 makeの変数を使って書き換えを容易に行えるようにする。
CC = gcc CFLAGS = -Wall # -DDEBUG a.out: list.o main.o $(CC) list.o main.o list.o: list.c list.h $(CC) $(CFLAGS) -c list.c main.o: main.c list.h $(CC) $(CFLAGS) -c main.c
構造図(UML)
先週のUMLの概要説明の後なので、今回は構造図を説明する。
構造図には、以下の記法がメインであり、基本的にプログラムやシステムの構造を記載する記法。
- クラス図とオブジェクト図
- コンポーネント図
- 配置図
- パッケージ図
以下の記事は、IT専科のUML入門の要点をまとめたものであり、詳しくは元を参照。
クラス図とオブジェクト図
クラス図は、クラスの中身と他のクラス間の関係を記述するための図。
1つのクラスは、上段にクラス名・中段に要素・下段にメソッドを記載する。 各要素・メソッドの前には、限定子として("-":private,"+":public,"#":protected)などを 記載する。
IT専科から引用
コンポジションと集約
各クラスの間は、その関係により、線の描き方を変える。 線の両端には、多重度を示す数値や記号、線の中央には役割などを必要に応じて記載する。
関連:────
集約:◇───
コンポジション:◆───
依存:←——-
汎化:◁────
クラスと他のクラスの間の関連は直線で表し、多重度やその役割を書き添える。 継承は白抜き△矢印で表現し、そのクラスの基底クラスに向かって矢印を描く。 関連においてオブジェクトの寿命が同じ(クラスの要素に別要素が包含される)場合は、 コンポジション(合成)と呼ばれ、黒塗り◆で矢印を描く。 寿命などが別であり、ポインタで結合されるような関係は集約と呼ばれ、 白抜き◇で矢印を描く。
class Engine { // エンジン } ; class Tire { // タイヤ } ; class Car { Engine engine ; // コンポジション Tire* wheel[ 4 ] ; // 集約 } ;
is-a,has-a
クラス設計を考えるとき、派生とすべきか、コンポジション(or集約)で実装すべきか 悩む場合も多い。この時の判断の方法では、is-a,has-a関係という言葉が使われる。 基底クラス「どうぶつ」から派生した「哺乳類」は、"哺乳類は動物である"という 言い方ができる。一方で、前コンポジションの説明では、 "Car は、Engine(Tire)を、部品として持つ"という言い方ができる。 このことから、is-a で関係を表現できるか、has-a で表現できるかがカギとなる。
class Animal { //どうぶつ } ; class Mammalia : Animal { // is-a 関係なので派生で実装すべき。 // 哺乳類 } ;
オブジェクト図は、クラス図の理解を助けるために、具体的な値を記載したもの。 クラス図の最上段を下線付きで記載する。
パッケージ図
パッケージ図は、クラス図をパッケージ毎に分類して記載する図。 パッケージの塊を、フォルダのような図で記載する。
IT専科から引用
コンポーネント図とコンポジット構造図
コンポーネント図は、複数のクラスで構成される処理に、 インタフェースを用意し、あたかも1つのクラスのように扱ったもの。 接続するインタフェースを、提供側を◯───で表し、要求側を⊃──で表す。
IT専科から引用
配置図
配置図は、システムのハードウェア構成や通信経路などを表現するための図。 ハードウェアは直方体の絵で表現し、 デバイスの説明は、"≪device≫"などを示し、実行環境には、"≪executionEnvironment≫" などの目印で表現する。
IT専科から引用