シリアル通信やら赤外線リモコン信号やら…
創造工学演習にて、実際にプログラムを動かし始めるチームがではじめ、 その動作確認をするための環境のお手伝い。
Bluetooth経由でLEGO操作のチームでは、ひとまずシリアル通信の実験をしてもらうために、 シリアル信号をオシロスコープでみせたり、 端末ソフトと他のパソコンとつないで実験するためのクロスケーブルを渡したり。
赤外線リモコン制御に関係するチームには、ひとまず実証対象として、 部屋にあったSONYのTVを動かしてもらうために、 手元資料の赤外線波形とリモコンコードの表を渡して解説。 理解を深めてもらうために、赤外線リモコンのデコーダICの結果を、 オシロスコープにつないで波形観察。
相変わらず、説明ネタの幅が広くて疲れる授業時間でした…
ファイルの説明の前にOSの歴史
前期中間以降は、ファイルの入出力の講義が中心になるけど、 最も共通の知識として「OS寄り」な部分を説明となるので、 OSの歴史として説明を行う。
古くはOSを起動するときのモニタであり、 次の8bitパソコンの時代では、 BASICがOSの役割を担っていたことを説明。 その後、16bit CPUの出現で Intel 8086 がIBM-PCの OSとしてMS-DOSを紹介。 その後、Apple社のMacintoshのGUIに触発されて、 Windowsが開発された点を説明。 しかしながら、この時代までは、「シングルタスク・シングルユーザ」のOSであった。
この後、Windows/95 あたりでインターネットの普及が起こるが、 このあたりから32bit CPUの普及がはじまる。 32bitCPUでは、メモリ保護機能が実装され、「マルチユーザ・マルチタスク」のOSが 普及していく。 IBMのOS/2に始まり、Windows NT,2000と開発されていく。
これと並行して、汎用機の世界では、マルチタスク・マルチユーザの取り扱いでは、 Multics というOSが作られるが、ミニコンで使うために規模を縮小した unix が開発される。 unix は、研究機関のBSD系,企業でのSystemV系と分かれて開発がすすむが、 その中で、教育用のMINIXに触発され、Linux が開発され、オープンソースの流れのなか、 サーバ分野で普及していく…
この話の中で、「ハッカー」とは「コンピュータの世界で崇拝される専門家」であり、 「コンピュータの犯罪者」は「クラッカー」だよ…といった説明も行う。
停電によるサーバ停止(2009/06/26-29)
停電に伴い、下記の時間帯に電子情報のサーバを停止します。
2009/6/26(Fri) 17:00~ 6/29(Mon) 8:00 理由:6/27(Sat) 11:00~12:00 の停電に伴うネットワーク停止。
追記:停電より復旧しました。 停止期間は、6/27 10:00-15:00 でした。
リスト構造の簡単処理とリスト生成
mallocの課題で、独学でリスト構造を勉強している人が、すでにリスト構造で 課題を提出してきたひともいたりするんだが….
前回の講義に引き続き、必要に応じてメモリを確保するリスト構造について 説明を行う。list要素の全印刷の説明のあと、簡単なサンプルプログラムを 黒板で書いてもらう。int sum(List*); int max(List*); int find(List*,int); などの プログラムを出題するが、次に説明する予定の再帰によってプログラムを 書く人もいて、授業に熱心な人が増えている結果だと思える。
ループによるsum,max,findの後、再帰によって処理の例を示す。 再帰によるプログラミングは、単純リスト構造ではあまり必要ではないが、 再帰関数の処理速度のオーダなどの説明でも、再帰に慣れてほしいし、 後で出てくる2分木構造での導入にもなるので、解説を行った。
データ構造の宣言の説明では、古い教科書でtypedefを使った宣言の例も多いので、 typedefによるList宣言や、C++での構造体タグ名が型名として使えることを説明する。
TeraStationにAppleTalkを入れて文字化け対策
TeraStation を使っているが、Windowsファイル共有のファームウェアが、samba 2.x 系 であるため、Mac,Linuxからマウントすると漢字ファイル名が文字化けしてしまう。 "mount -t cifs …. iocharset=xxx,codepage=xxx" などを色々試すが、やっぱり無理。
ひとまずMac側からは、TeraStation 側で AppleTalk を動かし afp で接続したら、 文字化け問題はなくなった。 相変わらず、Linux 側からは文字化け。"mount -t afp" のネタを探すけど、 見つからない。
GrWinを用いた仮想関数演習の考え方
仮想関数と派生を理解した後の、グラフィックスの演習で、 図形クラスより、より具体的な四角クラス・丸クラスを作り、 この処理に色を使うクラスを追加するのが演習の目標。 これにより、色の取り扱いを、様々なクラス階層で作れることを考えてもらいたい。
しかし、C++初体験組が多いし、上位クラスのメソッドを呼び出すために、 クラス指定子「クラス::メソッド()」なんかの説明も足りないので、 ヒントをWebに掲載する。
単純に基底クラスが色を持つ
色を追加する際に、サンプルで示した処理の中に色を埋め込ませる事例。 色の取り扱いのために追加した部分が、元プログラムの中に色々と組み込まれる。
// 基底クラスが色の情報を持つ // Figure(color) // ↓派生 // FigureBox(width,height) class Figure { private: int color ; // 色を追加(元サンプルでは、何も無かったけど) public: Figure( int col ) // 色付き基底クラスのコンストラクタ : color( col ) {} virtual void draw( int , int ) { // 描画の前に色を設定 GWsetpen( color , 1 , 1 , -1 ) ; // 色以外は基本設定 } } ; class FigureBox : public Figure { // 派生クラスで色の処理を追加 private: int width , height ; public: FigureBox( int col , int w , int h ) : Figure( col ) , // 色付き基底クラスを初期化 width( w ) , height( h ) {} virtual void draw( int x , int y ) { Figure::draw( x , y ) ; // 基底クラスで色を設定 // ここに四角を描く処理 } } ; int main() { FigureBox cbox( 13 , 100 , 100 ) ; // 赤い100x100のBox cbox.draw( 10 , 10 ) ; // (10,10)にBoxを描く : }
既存クラスを流用し色の扱いを追加
元のプログラムを触らず、追加した色のクラスをさらに派生させる考え方。
// 色を持った派生クラスを作る // Figure(無し) 純粋基底クラス // ↓派生 // FigureBox(width,height) // ↓派生 // FigureBoxColor(color) class FigureBoxColor : public FigureBox { // FigureBoxに色を追加 private: int color ; public: FigureBoxColor( int x , int y , int col ) : FigureBox( x , y ) , // 基本となるクラスを初期化 color( col ) {} // 追加された色を初期化 virtual void draw( int x , int y ) { GWsetpen( color , 1 , 1 , -1 ) ; // 描画の前に色を設定 FigureBox::draw( x , y ) ; } } ; int main() { FigureBoxColor cbox( 100 , 100 , 13 ) ; cbox.draw( 10 , 10 ) ; : }
既存クラスを流用し多重継承を使ってみる
元のプログラムを触らず、追加した色のクラスも多重継承を用いる考え方。 Javaならば、インタフェース機能などを使わないとダメなケース。
ただし、FigureBoxColorと、FigureBoxCircleを派生させたあとで、 「指定した色で四角の中に丸が描かれるような1図形」などといった 要求がでてきたら、ダイヤモンド型の派生となる。 こういう場合がどういったデータ構造になるのかが、注目すべき事例。
// 多重継承で動かしてみる // Figure(無し) // 派生↓ // FigureBox Color(color) // 派生\ /派生 // FigureBoxColor class Color { private: int color ; public: Color( int col ) // 色を初期化 : color( col ) {} void setcolor() { // 描画前に色を設定するメソッド GWsetpen( color , 1 , 1 , -1 ) ; } } ; class FigureBoxColor : public FigureBox , public Color { public: FigureBoxColor( int w , int h , int col ) : FigureBox( w , h ) , // 基底クラスの初期化 Color( col ) {} // 色クラスを初期化 virtual void draw( int x , int y ) { 色を設定する処理を呼び出す。 FigureBoxのdrawを呼び出す。 } } ;
メール受信BOXがToDo
以前よりIMAPを使い、仕事がメールで送られてきたり、 口頭でつたえられた仕事は自分自身にメールして、 処理が終わると、内容別フォルダに移動する方式をとっている。 これと同じ方法が、Web記事に載っていた。 やっぱりToDoソフトばかりが便利とはかぎらない。
情報系大学編入試験問題の質問
大学編入を目指す学生さんが、編入試験の過去問にて質問。 先日は、処理のオーダなどの絡んだ問題で、それなりに苦労したが、 今回はちょっと楽チン。
しかし、fputc(int,FILE*) で処理を書かせたり、main(int argc,char**argv) を使った 処理を書かせたり。ちょいとこれはC言語に慣れ親しんでいないと、 引数順序やコマンドライン引数の取り扱いルールといった、 本来のプログラミングの知識以外の部分を暗記していないと解けない問題。 ということで、なんだかなぁ…と思いながら解説を行った。
テスト採点結果と解説
プログラミング応用のテスト結果と解説を行う。 単純に解説しているだけではもったいないので、出題ネタにからんだ発展ネタを説明しながら 解説を行う。
動作順序トレースでは、逐次除算して素数を求める処理を出題。 これに関係して、エラトステネスのふるいなども概要を紹介。N進数ネタもあったことだし、 2進数1111…(2N-1)のメルセンヌ素数もネタのみの紹介。
N進数変換では、16進一桁は記憶するのが普通だったことを紹介しながら、 古いコンピュータのネタを紹介。昔はトグルスイッチで機械語入力といった話をする。 その中で、磁気コアなども説明する。
C言語のプログラムで、printf("%6f"…) といった桁数指定フォーマットなどは、 ヒントを記載しておいたが、回答で使いこなせない人がいたので、 左寄せ"%-6d",0埋め"%06d",固定小数型"%6.3f",指数型"%6.3e",自動選別"%6.3g" などを 紹介する。
学研(大人の科学)、4bitマイコン
毎度ながら、面白そうなものを売り出してくれる学研さんだが、 次号は4ビットマイコンだそうな。 Data メモリ 8word, プログラムメモリ 40word 搭載で、 電子オルガンやらモールス電文発生などのサンプルも掲載となっている。
内容によっては、2年、3年の計算機アーキテクチャネタには十分だろうし、 実験にも使えると予想される。 ということで、個人的に購入するだろうな…
追記:関連授業&実験の先生に宣伝しているうちに、思わず予約購入ボタンを押しちゃった….楽しみ…