後回しにしていた、UPKI…(06/21)
この記事は、 の @TohruSaitohに掲載した #fnct タグ付き記事を、まとめたものです。
UPKIのオープンドメイン証明書の更新
学術機関向けにサービスされているUPKIのオープンドメイン証明書の 更新の時期となった。 国立情報学研究所より、更新の連絡が来ていたので、作業を行う。 といっても2年ぶり?の作業ですっかり忘れている。 ひとまず自分のページに貼ってあったメモ記事と、 更新マニュアルを見ながら作業を行い、ようやく切替成功。
リスト処理演習
リスト処理の基本の説明として、簡単なリスト処理・データの先頭追加・末尾追加、途中データの挿入削除の解説が終わったので、今日は演習。
出席番号を除算した余りで、下記のデータの中から1つについて作成する。 データに対する処理は、条件で検索であったり、平均計算であったり、自分の理解度に応じて 何らかの計算処理を施すプログラムとした。
- 名前と誕生日
- 名前と身長体重
- 名前と成績(例:国語,算数,理科,社会,英語)
OSの歴史と絶対PATH/相対PATH
前期中間から前期期末までは、ファイルに関する説明を行う。 これにあたり、ベースとなるOSの話が重要となるので、 簡単にOSの歴史と、PATHの概念を説明する。
OSの歴史
初期のコンピュータは、ハードウェア中心でOSという概念は無かったが、 ハードウェアの使い方を共通化しないと、プログラムを作る手間が増えるため、 プログラムの起動方法を定めた制御モニタなどが使われるようになり、 これがOSとして発達していく。 大型コンピュータでは汎用機のためのOSが発達していく。
一方、家庭用のコンピュータでは、8bitコンピュータでは機能が無かったため、 プログラム言語BASICがOSの代りとなっていた。 まともなOSは、intel系ではCP/Mぐらいしか無かった。 16bitコンピュータが出始めた頃、IBMのAT機のためのOSが必要となり、 マイクロソフト社が DR-DOS などを元に MS-DOS を開発し普及していく。
一方、Apple社は Apple-I,Apple-IIの開発の後、16bitコンピュータに GUI操作が便利な Macintosh を開発する。このGUIの操作性は広く普及していき、 マイクロソフト社は、MS-DOS上のGUI環境 MS-Windows を発表する。 この後、MS-DOS,MS-Windows を統合した Windows-95 などが発表される。 しかし、この時代のコンピュータは、シングルユーザ・シングルタスクであり、 フィアルの所有者の概念もなく、プログラムも処理の切り替えをある程度 意識して作らなければならなかった。また、複数のプログラムを動かせても、 他のプログラムのメモリ領域を触ろうとしても、OSが保護する機能は無かった。
32bitコンピュータが出た頃から、CPUがメモリ保護機能を実装したころから、 複数のプログラムの並列処理が安定してできるようになり、マルチユーザ・マルチタスク のOSが一般的になる。Windowsは、NT,2000,Xp,Vista,7と開発されていく。 一方、汎用機のOSを目指して作られた unix で、Macintosh 用のOSとして、 Mac OS X も開発される。unix は、インターネットのオープンソースの開発者 のもと、Linux や FreeBSD が開発されていった….
絶対PATH/相対PATH
コンピュータの中には沢山のファイルがあり、これらを分類して保管するための機能が、 ディレクトリ(最近のOSではフォルダと呼ばれる)である。 分類されて管理された大量なファイルを使う場合、そのファイルの場所を指し示す 必要があり、その概念がPATHである。起点となる場所から、目的のファイルにたどり つくまでのディレクトリ名を書き連ねれば良い。
ディスクの大元の根っこから、ディレクトリ名を書き連ねる方式は、 絶対PATHと呼ばれる。絶対PATHはファイルの場所を明記できるが、 ディレクトリの深い底のファイルをアクセスするには、長いPATHとなってしまう。 これに対応すべく、あらかじめ起点となるディレクトリを指定しておき、 その起点からファイルの場所を記述する方法が相対PATHと呼ばれる。
簡単な演習として、Windows のコマンドプロンプトを立ち上げ、 C言語のbin,includeなどを例としてPATHの説明を行った。 (親ディレクトリ・カレントディレクトリの説明がまだなので、来週の最初に説明しよう)
多重継承
多重継承の説明の前に、オブジェクト指向とは少し違うけど実装方法として 主流となっているテンプレート機能について説明を行う。
テンプレート機能
オブジェクト指向でよく言われる「プログラムの再利用」では、 継承を使った物が多い。 コンテナクラスでは、汎用のデータの入れ物となる純粋仮想基底クラスを宣言し、 自分で取り扱いたいデータ構造がでてくると、基底クラスから派生クラスを作り、 必要最小限の仮想関数を記述するスタイルが一般的。
しかし、純粋仮想基底クラスによるコンテナクラスでは、処理の実装の負荷が高いので、 最近ではテンプレート機能が利用されることが増えた。
template <class T> class Data { private: T data ; public: Data( T x ) : data( x ) {} void print() { cout << data << endl ; } } ; void main() { Data<int> a( 123 ) ; a.print() ; Data<double> b( 1.23 ) ; b.print() ; } ;
このプログラムでは、Data<int> の型が宣言されると、型Tにintが割り当てられ、 int型のDataが宣言され、Data<double> で、double型のDataが作られる。
多重継承
課題としている、純粋基底クラス「図形」から、具体的な「四角」や「丸」の 図形表示クラスを派生させ、さらに「色付」の「四角」や「丸」の図形クラスの プログラムでは、様々な実装方法がある。 一つの方法として、多重継承がある。 複数の異なる基底クラスから派生クラスを作る方法で、課題であれば 「色クラス」と「図形クラス」から、「色付の四角」といったクラスを派生させる。
多重継承は、以下のように書けば良い。
class Figure { public: virtual void draw() ; } ; class Color { private: // 色情報 : } ; class FigureBoxColor : Figure , Color { // FigureとColorの特徴を多重継承 } ;
ただし、多重継承は実装時の複雑さや効率の問題から、 すべてのオブジェクト指向言語で利用できる訳ではない。 Java は、様々な問題を考慮し、多重継承は実装せず、 代わりに interface 機能を用いる。
// 多重継承がややこしい例 class どうぶつ { // } ; class とり : どうぶつ { // 卵生・くちばし } ; class ほにゅうるい : どうぶつ { // 胎生・4つ足 } ; class かものはし : とり , ほにゅうるい { // } ; // (a) とり,ほにゅうるいが、同名のメソッドfoo()を持っていたら、 // かものはし.foo() は、どちらが呼び出されるのか? // (b) どうぶつ が、要素を持っていた場合、 // かものはしは、2つの要素を持つことにならないか?
トクトクきっぷ2000円か…
週末の日曜日は、バドミントン部の交歓試合で石川津幡までのおでかけ。 電車で移動となると団体割引などの申請が面倒なんだけど、 学生さんに準備を頼んだら、 トクトクきっぷ(一日普通列車乗り放題=2000円)なるものがあり、 津幡往復=1890円×2×50%=1890円と遜色なし。
団体で移動すると、福井乗車・下車があると団体行動からはずれる度に、 駅員に「福井で下車するので…」と説明+団体券への書き込みをしてもらう 必要があるけど、不要になる。切符取得も3日前までにとればいいみたい。 なんてべんりなんだ…
2012年6月17日(第273回)
小水力発電コンテストについて
- テスト勉強について
担当:川上先生(電子情報工学科)、田中(5E)、前田剛(4E)、前田勝(3EI)、西(教員)
川上先生にスタジオまでお越しいただきました。
2012年6月10日(第272回)
テスト期間中につき、収録でお送りしました。
ゲスト:電子情報工学科教員 小松先生
- 新任の小松先生のご紹介
- 高校総体県予選について
担当:長水先生、五味先生、西(教員)
WiFi通信のXBee / WPA,W…(06/15)
- 06/14 WiFi通信のXBee / WPA,WPA2に対応可能 http://www.marutsu.co.jp/shohin_132580/ #fnct
この記事は、 の @TohruSaitohに掲載した #fnct タグ付き記事を、まとめたものです。
リストの生成
テストを返却した後、前回の授業の続き。 リストの生成と挿入削除について説明を行う。
// 前回の授業で説明した時のコード struct List { int data ; struct List* next ; } ; struct List* cons( int x , struct List* n ) { struct List* ans ; ans = (struct List*)malloc( sizeof( struct List ) ) ; if ( ans != NULL ) { ans->data = x ; ans->next = n ; } return ans ; }
リストの入力と追加
top = cons(1,cons(2,…)) といった方法では、動作確認の時にしか使えない。 実際にデータを入力しながら、リストに保存するプログラムを考える。 前述の cons() の補助関数を使えば、簡単に記載ができる。
struct List* top = NULL ; int x ; while( scanf( "%d" , &x ) == 1 ) { top = cons( x , top ) ; } // 11,22,33の順でデータを与えると、 // top[◯]→[33|◯]→[22|◯]→[11|×]
しかし、この方法では、データを11,22,33の順序で与えても、 生成されるリストは、逆順となってしまう。
そこで、リストの末尾を覚えるポインタを作っておいて、 下記のように記述すれば良い。
struct List* top = NULL ; struct List** tail = &top ; int x ; while( scanf( "%d" , &x ) == 1 ) { *tail = cons( x , NULL ) ; tail = &( (*tail)->next ) ; } // 11,22,33の順でデータを与えると、 // top[◯]→[11|◯]→[22|◯]→[33|×]
リストへの挿入・削除
リスト処理の良い点は、必要に応じてメモリを確保していくため、 配列の容量オーバーといった問題を気にしなくて良い所。 一方、配列で途中にデータを挿入する場合、 挿入場所を作るために後続のデータを1つ後ろにずらす処理が必要となる。 また、配列の途中のデータを抜く場合、 後続データを1つ前にずらす処理が必要となる。 でも、リスト構造であれば、ポインタの繋ぎ変えだけで済む。
// 挿入 // ポインタpには、挿入したい場所の直前のセルの場所。 void insert( struct List* p , int x ) { p->next = cons( x , p->next ) ; } // 削除 void delete( struct List* p ) { struct List* d = p->next ; p->next = p->next->next ; free( d ) ; }