2009年11月22日(第139回)
テスト期間中につき、数学科 長水先生、電子情報工学科 奥田先生、西の3名でお送りしました!
- にしにしの部屋 起業された呉高専岩本先生とお話
nishi091122.mp3 - 歯磨きロボットコンテストについて
「そんなこともあろうかと…」(by 真田@ヤマト)
明るい技術系のニュースかもしれないが、小惑星探査ロケットの「はやぶさ」が、エンジン不調で地球への帰還が危ない状況であったが、技術者の機転で帰還できるようなったとのニュース。
帰還が可能になったのは、「本来だったら無用な電子回路がエンジンにつながっていたため」 らしい。私自身も含め記事への感想の多くは、 SFの戦艦ヤマトの真田技師長「そんなこともあろうかと」の言葉を引用しながら、 帰還の可能性が残ったことを喜んでいるみたい。 ただ、知り合いの、技術者だったら、一度は『そんなこともあろうかと』と言いながら、 かっこよく難局を乗り切ってみたいものだ…との感想に、思いっきり吹いてしまった。
私はまだこういった、かっこよく難局を乗り切れた経験はありません。 結果オーライとか、偶然OKなら、あるけどね…あと、真田みたいに、緊急事態に『動作テストしてないけど…』と言いながら、実運用はするなよ!
久々にブログ更新のやる気アップ
電子情報OBの方に、 「講義のメモやまとめが掲載されている。いずれも基本的で重要なものばかり。」 とお褒めの言葉をTwitterでつぶやいていただいた。 講義録は、学生からの「みてますよ」の声も、テスト直前にならないと聞こえないので、 惰性で書いている所が無いわけでもない。だけど、こういう言葉で、やる気あっぷ。
ただし実践OBに見られていると細かい間違いも指摘されそうで、 思わずブログの説明文に、『講義録などの間違いはツッコミ下さい。修正しますので…(^_^;』 の言葉を追記した…
クラス費にてマスク購入
以前より、学生がマスクありますか?と来ることがあり、 売店のマスクも花粉用の薄手のマスクだったりしたので、 クラス費にて、マスク(50枚×2箱)と、消毒用ウェットティッシュ(でかめ)を購入する。 学生さんには、ムダ使いは控えた上で、自由に使うように伝える。
SQLの応用的な使い方
SQLの応用として、比較演算子以外のin,between,like等の説明、 集約関数、副問合せ、ソートとグループ化について説明する。
比較と集約関数
where句に指定できる、2項演算子でない比較演算子
- A in ( a,b,c… )
メンバー比較()の中に A が含まれているか? - A between B and C
値Aが、B~Cの間の値か判定 - A like B
正規表現っぽい"_"⇒任意の1文字、"%"⇒任意の0文字以上で、 文字列マッチング - A is null
NULLかどうかをチェックする。
雑談: in,between,like といった演算子は、英語処理記述でCOBOLっぽさが全開。 ということで、COBOL等は、埋め込み型SQLによって通常のCOBOL処理の中で、SQLがそのまま使えたりすることを紹介。 教科書では、埋め込み型SQLインタフェースを持つ言語の中に、PL/I が紹介されている。 個人的に最初のプログラム言語が PL/I であっただけに、久々にみた言語名で懐かしさ全開。
select句に記載できる、集約関数
- COUNT(),SUM(),AVG(),MAX(),MIN()
関数の処理は名前どおりだし、特に説明はいらんだろう。
副問合せとソートとグループ化
where句の()の中に、別途SQLを実行するように、SQL命令を書くことができる。 副問合せを先に実行してから主問合せをするもの、
select S.業者名, S.所在 from S where S.業者名 in ( select SG.業者番号 from SG where SG.商品番号 = 'G2' and SG.在庫量 >= 200 ) ;
()の中の副問合せは、from句の S と無関係なので 先に副問合せを実行し、その結果の中に S.業者名 が 含まれるのかを判定される。
主問合せの中から何度も副問合せを実行する2つの方法がある。
select G.商品名, G.色, G.価格 from G where 'S4' in ( select SG.業者番号 from SG where SG.商品番号 = G.商品番号 ) ;
G.商品番号は、主問合せの中の from 句の G でレコードを変化させながら、副問合せを呼び出す。
並び替え:データベースのデータは、2分探索木やらハッシュやらの手法で保存されており、 検索結果は、登録順序毎に出力される訳ではない。だからこそ、表示順序などが 問題になるのであれば、"order by カラム {ASC|DESC}"で、ソートができる。
グループ化:指定されたカラムについて、同じ値を持つレコードをグループ化することができる。 having 句は、特定のグループを選択するための条件。 指定されたカラム別に、テーブルを一旦作ってから、having句内部の評価を行う。 この中に集約関数を使えるところがキモ。
集合計算:2つのSQL問合せ結果を集合とみなして、集合和(union)/集合差(except)/集合積(intersection)をとることができる。SQL_A union SQL_B みたいな使い方。
昨年度の非常勤講師の方の進行とずれが出てきたため、シラバスを書き換える。 JABEE的にも次回講義の時に説明が必要。
2分木の応用
2分木データ構造の応用として、意思決定木と2項演算子による式の表現を説明する。
意思決定木
質問を繰り返した後に、その結果を示すような意思決定木を、 2分木で表現する事例を紹介する。進路決定の時期の4年生というのもあって、 勉強好き?もっと勉強したい?といったようなネタで、例を示す。
プログラム例として、以下のようなものを示す。
char input[ 10 ] ; struct DTree* p = 何らかの木の生成 ; // 質問を繰り返す。 while( p->yes != NULL || p->no != NULL ) { printf( "%s¥n" , p->mes ) ; scanf( "%s" , input ) ; // 質問への回答を入力 if ( strcmp( input , "yes" ) == 0 ) p = p->yes ; else p = p->no ; } // 枝の末端であれば、結論を表示する。 printf( "あなたは... %s¥n" , p->mes ) ;
2分木を用いた式の表現
式を表現する手法として、演算子の優先順位を()で表現しないのであれば、 式を逆ポーランド記法に変換しておけば、スタックなどを用いてその処理は容易。 しかしながら、木を用いれば演算式を表現することもできる。 これに合わせて、演算子には単項演算子、2項演算子、3項演算子(?:演算子)が あることを説明する。また、"1+2+3"は"(1+2)+3" , "a=b=c=0" は "a=(b=(c=0))" として扱われ、左結合演算子や右結合演算子の2種類がある。 "1+2"中置記法、"+,1,2"前置記法、"1,2,+"後置記法といった、表現法を説明する。
struct Expr { int value ; char op ; // 演算子は1文字だけを考慮 struct Expr* left ; struct Expr* right ; } ; // 整数値の木の生成関数 struct Expr* Integer( int x ) { struct Expr* ans=(struct Expr*)malloc(sizeof(struct Expr)) ; if ( ans != NULL ) { ans->value = x ; ans->left = ans->right = NULL ; } return ans ; } // 演算子の木の生成関数 struct Expr* Operator(char op,struct Expr*l,struct Expr*r) { struct Expr* ans=(struct Expr*)malloc(sizeof(struct Expr)) ; if ( ans != NULL ) { ans->op = op ; ans->left = l ; ans->right = r ; } return ans ; } void main() { struct Expr* e // 2分木の式 1+2*3 = Operator( '+' , Integer( 1 ) , Operator('*' , Integer( 2 ) , Integer( 3 ) ) ) ; // 式の値を評価したい printf( "%d" , eval( e ) ) ; } int eval( struct Expr* p ) { if ( p->left == NULL && p->right == NULL ) { return p->value ; // 枝の末端なら定数値 } else { switch( p->op ) { // 再帰呼び出しで右辺左辺を計算 case '+' : return eval(p->left)+eval(p->right) ; case '*' : return eval(p->left)*eval(p->right) ; } } }
超音波センサー壊れてる
専攻科の実験の第3クール目の担当ということで、 オムニホイール車体の制御をArduino Nano で制御をテーマとした。 ただ、同じプログラムばかりでは面白くないだろうと、 昨年度創造工学演習のものづくり用に購入していた、超音波センサーPINGを 使って、身近なものを追いかける車体を作ってもらおうと考えた。
んで、Arduinoの使い方は、簡単に理解してもらえて、PINGを試すが、動かない。 最小配線にして、低電圧源にして動かすけど、ダメ。 3個買ってあったので、交換試験をするけど3個とも動かない。 5000円ほどしたんだけどなぁ…×3で15,000円。 昨年の創造工学の実験中にすでに壊れていたとしか思えない…
# ちょっと涙目…
共用体とグラフィックス基礎
構造体の演習も終わり、シメのネタということで、共用体と列挙型の説明を行う。 後半は次のグラフィックスの講義の導入として、ディスプレィの構造について説明する。
共用体と列挙型
共用体の説明として、1つの変数に異なる型のデータを覚える場合の、 メモリのムダ対策として以下の例を示す。
配列[0]=整数の123; 配列[1]=実数の0.234; 配列[2]=文字の"ABCD";
を覚えたいならば、
struct A { int num ; double real ; char str[ 8 ] ; } ; struct A data[1000] ; data[0].num = 123 ; data[1].real = 0.234 ; strcpy( data[2].str , "ABCD" ) ;
しかしながら、メモリの2/3はムダになる。 共用体を使えば、要素の記憶場所が同じ場所を使うようになる。
union A { int num ; double real ; char str[ 8 ] ; } ; union A data[ 1000 ] ;
列挙型は、プログラム記述時に、定数に名前をつけるときに使う。 例えば、1週間の曜日に応じた処理をプログラムで書く場合は、
#define SUN 0 #define MON 1 #define TUE 2 : #define SAT 6 int week ; for( week = SUN ; week <= SAT ; week++ ) { if ( week == WED ) { 水曜日の処理 ; } }
と書くけど、define文の羅列を記述するのは面倒なので、列挙型を使う。
enum WEEK { SUN , MON , TUE , ... , SAT } ; enum WEEK week ; for( week = SUN ; week <= SAT ; week++ ) if ( week == WED ) { : }
追記:上記のプログラムは、"week++"が警告を吐くかもしれない。列挙型の具体的な数値が、連続と言う保障はないから…。警告が不気味なら、weekの宣言は "int week ;"にしておくべき。
グラフィックス・ディスプレィの構造
ディスプレイの構造として、CRT,液晶,プラズマなどの構造を説明する。
CRT(Cathode Ray Tube:陰極管,ブラウン管)は、 高電圧による電子放出された電子が(電子銃)、 偏向ヨークで電子の軌道を曲げ、蛍光板にぶつかって光る という構造にて説明する。(画像はWikipediaより引用)
上記の構造で、画面上の任意の場所を指定した色で発色することができるが、1画面を構成するために、昔はベクタースキャン方式で一筆書きのような絵を表示していた。 TVなどはラスタースキャン方式で、表示位置を左上から1行ごとに点で光らせ、1画面を構成する。
さすがにくだらないネタも細かく記載されているWikipedia、個人的にはベクタースキャン方式のStarWars のゲーム機の記載が懐かしく思う。
液晶モニタは、バックライト、偏向板、透明電極、液晶、カラーフィルタから構成される。 液晶は、電圧により光の偏向方向を制御できる液体。 自然光は、様々な波の方向を持った光の集まりだけど、偏向板を通り抜けると1方向だけの波になる。偏向板と液晶でバックライトの光の量を調整し、カラーフィルタで色をつける。
2つの方式の利点欠点として、CRTは薄型にすることが困難で大型化すれば重量も問題となる、液晶は画像の時間的な追従性が悪く、色の再現性も低いといった点を説明する。 時間追従性の性能の違いとして、『ゲーマーはシューティングの僅かな遅れも問題とするので、 ゲーマー御用達は CRT 』といった説明をすると、こういう時だけ寝ることもなく興味を持って聞いている。毎年ながらだけど…
ネットワークと物理層
計算機システムのネットワークの説明ということで、今日は物理層のお話。
パラレルインタフェースとシリアルインタフェースの説明を行い、 速度や配線の容易さという観点で利点や欠点を説明する。 配線でのノイズやインダクタンス・容量成分で波形が鈍ることから、 配線への電気的な配慮からもシリアルが普及し高速でもシリアルが普通になっていることを紹介。 USBやRS-232Cなどを事例で名前を上げる。
LAN
Ethernetの事例として、10BASE/5,/2,/T等の配線方法やターミネータの必要性を話しながら、 10BASE/Tの普及を説明し、HUBの内部構造を簡単に説明する。
WAN
Wide Area Network として、AM/振幅変調、FM/周波数変調、PM/位相変調などを説明したあと、電話線+モデムによる通信(64Kbps)、デジタル化したISDN(128Kbps)、基地局に近ければ高周波帯域を使った通信のADSLなどを紹介する。 さらに、光ファイバやCATVなどの方式でのWANなどを紹介。
残り講義もあと1つ程になってきたので、2回分の資料を作っていったけど、やっぱり1回分の話の範囲しか進めなかった。来週CSMA/CDと、IPアドレス+ルーティング、TCP再送、DNSとhttp+メールまで、進めるかなぁ…
2009年11月15日(第138回)
- メールテーマ:冬支度
- 英語の囃子 第20回 吉田三先生、電子情報4年丸山さん
英語の桃太郎を読んでみよう
eng091115.mp3 - ライブラボ第5回 「映画の虎」
ハロウィンにまつわる映画についてコバピーが熱く語りました。