学外から電子情報サーバが見えない時がある。
テストを返却したら、学生さんより「電子情報サーバが見えない時がある」との報告をうける。
自宅にて調べてみたら、負荷分散用のラウンドロビンDNSの設定がされているけど、 その一方のアドレスにて、アクセスすると学校のサーバに接続できない。 負荷分散用対外接続サーバの内向きProxyが一方だけ動いていない様子。 このため、確率1/2でつながったり、つながらなかったりという状況が発生している。 センターに報告し、修正してもらう。
MindStorm NXT Programming Sotware
MindStorm NXT Programming Sotware
LEGO MindStorm NXT でのロボット作りのチームより、 「使いやすそうなプログラミング環境は?」と聞かれる。 ひとまず、 色々と探してみる(MindStorm NXT Programming Sotware) けど、 Next Byte Codes & Not eXactly C あたりが良さそう。
仮想関数をもちいたグラフィック
今までの仮想関数の説明だと、新しい考え方に悩んでいそうなので、 簡単に総括説明をしたあと、演習の導入を説明する。
例年どおりの、図形クラスへの機能追加をテーマとする。 ただし、EI系以外の学生さんだと、グラフィックスプログラミングの 経験がないので、まずは演習とは関係無く、グラフィックス機能の演習を行う。
++i と i++ の違いを質問される。
printf( "%d\n" , i++ ) ; は、 printf( "%d\n" , i ) ; i = i+1 ; と同じ。 printf( "%d\n" , ++i ) ; は、 i = i+1 ; printf( "%d\n" , i ) ; と同じ。 基本的に、式全体の評価の前に i=i+1 するのが "++i"
「+=」と「=+」の違いを質問される。
比較演算子 i <= 10 と i =< 10 と書いても同じように、 どちらで書いても良い….といいたいけど、
i=+1; ~が「i = (+1)」と「i=i+1」の間違った2つの解釈の可能性がある。
このため、慎重なプログラマーは、
i += 1 ; // += 演算子の前後に必ず空白を入れる。
電子回路シミュレータ(QUCS)
spice とかを入れてみたけど、操作なども初心者にもわかり難かったけど、 この QUCS は、メニューも日本語化されているし、Linux,Windows で動く。
仮想関数
仮想関数のメカニズムの説明。 昨年度の資料に、資料を追加して説明を行う。
- vsample0.cxx ~単純な派生での派生クラスの格下げ問題の提起
- vsample2.cxx ~仮想関数をまずは使ってみせる。
- vsample4.cxx ~Object基底クラスより整数・実数・文字列を派生させた例。(追加資料)
- vsample1.cxx ~仮想関数と同じことを無理やりunionでやってみる。 ただし巨大なswitch文が必要となる事例で紹介。
- vsample3.cxx ~Cでも関数ポインタなどを使えば、巨大switch無しでも書ける事例。 これより、仮想関数の内部メカニズムを紹介。
Rgrey(S25R+greylisting)
SPAM排除のために 「メールの配送が来たら再送要求で送り返して、ちゃんと再送してきたら受け取る」 というテクニック。 コンテンツフィルタ方式とは違うために、軽い実装が可能らしい。
会社宛のエロSPAM対策は管理者の責任に…
職場に大量に届くエロSPAMですが、何もしないまま「利用者で分類駆除してね..」だと、 セクハラ対策不備で管理者の責任が問われる時代だそうだ。
ガッコの方は、この半年ほど「SPAMフィルタの性能が上がった+あっさり削除」の方針の おかげで、随分と迷惑メールが減った。 これに比べ自宅宛(プロバイダ=丹南CATV)メールは、SPAMのラベリングはしてくれるけど、 誤認削除への責任対策なのか「あっさり削除」まで踏み込んでくれない。 SPAMラベリングを「無料」で唱っているんなら、あっさり削除のオプションも追加して欲しい。
たまに yahoo 発信を誤認識して SPAM ラベルつけてくれているけど、 そりゃ送るヤツも悪いということで、あっさり消して欲しいなぁ…
SPAM
グラフ電卓TI89にウィルス
数学科の先生が関数の概念の早期習得を目指して、 全学生が購入しているグラフ電卓TI89ですが、 ウィルスの標的になっているそうです。
学生と話していても、電卓の極座標変換さえも知らない学生さんがいるかと思えば、 機械語まで使って公開されているゲームまで動かして、駆使している人もいる。 ということで、そーゆー人はひとまず注意してね。
高専プロコン予選応募
昨日(締め切り)時点で、プロコンに学内審査を通った4作品を登録した。 週の始めに登録作業をおこなったため、若い登録番号となった。 FN 例年であれば、登録番号が60番台といった 「締め切り仕事バレバレじゃん」といった状況ばかりであった。 /FN みなさんの積極的な早期に資料が完成できた成果ということで、ありがとうごぜーます>4EI学生さん。
さて、数多い予選通過を期待しましょう。
派生クラスと継承
前回までの範囲でカプセル化による、プログラムがわかりやすくなるといった事例の 紹介。これ以降の継承などを使えるようになれば「車輪の再発明」と言われるような、 他人が作ったものと同じようなものを、また作らないといけない… ということが減らせるはず。
派生の必要となりそうな事例ということで、基本データにオプショナルな要素が 加わったデータ事例にて、問題点を示す。
派生がないと発生する手間
// C言語でオプショナルな要素の加わった場合。 // 基本型: 名前・身長 // 追加データ:親の情報 struct Person { char name[ 20 ] ; double height ; } ; void print_Person( struct Person* p ) ; // ダメダメな追加データの型 struct Child { char name[ 20 ] ; double height ; struct Person* parent ; // 追加データ } ; // この方法では、同じようなプログラムをまた作ることになる。 void print_Child( struct Child* p ) { また同じ処理を書く羽目になる... } // ちょっとマシな追加データ型 struct Child { struct Person super ; // 基底クラス struct Person* parent ; } ; // 同じ処理を書くよりはマシだけど、 // 基底クラスのメソッド呼出しを何度も書く必要がある。 void print_Child( struct Child* p ) { print_Person( &(p->super) ) ; }
導出を使って
この様に、オプショナルなデータの増えたプログラムで手抜きができるために、 オブジェクト指向言語では、派生(導出)といった方法が使われる。
class Person { private: char name[ 20 ] ; double height ; public: Person( char s[] , double h ) { strcpy( name , s ) ; height = h ; } void print() { printf( "%s %f" , name , height ) ; } } ; class Child : public Person { private: Person* parent ; public: Child( char s[] , double h , Parent* p ) : Person( s , h ) { parent = p ; } } ; void main() { Person saitoh( "斉藤" , 172 ) ; saitoh.print() ; Child mitsuki( "みつき" , 130 , &saitoh ) ; mitsuki.print() ; // 基底クラスの print を継承し、流用してくれる。 Person tomoko( "ともこ" , 148 ) ; Child ayuka( "あゆか" , 122 , &tomoko ) ; Person* family[ 4 ] ; family[0] = &saitoh ; family[1] = &mitsuki ; // ChildがPersonに格下げして代入 family[2] = &tomoko ; family[3] = &ayuka ; // Personに格下げ // 家族全員を表示 for( int i = 0 ; i < 4 ; i++ ) // PersonとChildが混在するけど family[ i ]->print() ; // 正しく表示ができる。 }
問題提起
前述のChildクラスでは、printメソッドは継承を利用していたが、 Child クラス用の処理を書いたとする。すると、格下げの問題が表面化してくる。
class Child : public Person { : void print() { // 子供は、親の名前も表示したかったとする。 Person::print() ; printf( "%s" , parent->name ) ; // "public Person" で派生したから } // できる芸当である。 } ; // 家族全員の表示。 for( int i = 0 ; i < 4 ; i++ ) family[ i ]->print() ; // この結果では、family に代入する時点で、 // Child も Person に格下げされているので、 // mitsuki の親の名前は表示されない。 -----> 仮想関数で解決できる。