PHP講習会/H8割り込み講習会
今年度の創造工学の活性化のために4年実験の第1テーマを導入教育につかうにあたり、 第1回目に、PHPなどのネットワーク系技術の講習会と、H8などを用いる際に必須の割り込みなどの理解を行うための講習会兼簡単な4EI実験として講義を行った。
PHP講習会
インターネット技術の基礎知識を理解してもらうために、PHPを用いて簡単な講習会を行う。 (斉藤担当)
- 複雑な処理では、複数プロセスの協力も必要であることから、CGIの原理を説明をネタに、 プロセスが協力して処理を行うための問題点として、 SIGNAL,環境変数渡し,共有メモリ,パイプ,スレッドなどの用語も簡単に紹介する。
- HTMLの簡単な説明と、サーバにページを登録し、簡単なHPを設置するまでを説明
- PHPの簡単な例題を解説し、外部から渡される$_GET,$_POSTなどの変数を説明
- 例題として、何らかの簡単な処理プログラムを作ってもらう
- 最後にWeb系プログラムの必須のセキュリティネタとして、入力フォームにタグを埋め込む手法の問題点を1つだけ紹介。
H8割り込み講習会
H8などの組み込み系で何らかのシステムを作る場合には必須となる、割り込みなどの 概念の紹介として、割り込み関数の登録や割り込みが有効になるための設定などの 説明を行う。(担当高久)
組み込み系のC言語のプログラムを理解する際に必須となる、#pragma や、 volatile 宣言などの概念などの説明も行う。 割り込みとしては、時計やPWMによるサーボモータの制御も応用例として多いため、 タイマーA,タイマーWなどを例題として、解説を行う。
変数の取り扱い
今日は、変数の扱いの説明として、変数・関数と引数などを中心に話す。
変数の概念
- 大域変数(global変数)
- 大域変数は、どこからでも触れる変数で、極力使わない….など…
- 局所変数(local変数)
- forループなどのブロック内での変数宣言例など…
//大域変数を使うために起こるトラブル例 int i ; void foo() { for( i = 0 ; i < 2 ; i++ ) printf( "A" ) ; } void main() { // このプログラムは、AAAAと表示されない。 for( i = 0 ; i < 2 ; i++ ) foo() ; }
関数との値の受け渡し
関数と呼び出し側の値の受け渡しということで、値渡し(Call by Value)・ポインタ渡し(Call by Pointer)などの解説。
基本的にC言語では、関数の実引数(real argument)が、仮引数(pseudo argument)に コピーされる値渡しが原則で、関数から複数の値の変化を知りたい場合に、 ポインタと変数のアドレスを使ったポインタ渡しを行うと説明する。
void foo( int *p ) { // ポインタ渡しの例 (*p)++ ; printf( "%d" , (*p) ) ; } void main() { int a = 123 ; foo( &a ) ; foo( &a ) ; }
関数の処理によって値が変化することを副作用と呼び、 副作用は自分の持っているものが想定外に変化するのであれば、 不気味な現象でもあり、極力副作用は小さい方がいい。 だからこそ、変化してほしい値だけをポインタで渡して書き換えてもらう….といった説明を行う。
演算子の前後の()について質問があったので、演算子の優先順位の説明を行う。 ついでだし、右結合・左結合といった話や、趣味の悪い「コンマ演算子」なども 雑学系のネタとして紹介する。
プロトタイプ宣言とプリプロセッサ
この話の中で「なぜ関数実体を読み出し処理より前に書くのか?」との質問がでる。
# 通常私のコーディングは実体を先に書くボトムアップ記述。
基本的にコンパイルは、先頭から命令解析が行われるので、 関数の実体が先にあった方が、関数を呼び出す時に引数や帰り値が何なのか、 分かっていて都合が良いことを説明。 「トップダウン記述」であれば、呼び出し処理を先に書きたいけど、そういうときは プロトタイプ宣言が必要であることを説明する。
これに関連して、プログラム中の#行が、「プリプロセッサ行」であり、 「命令解析前の命令の書き換え処理」が行われると説明し、 "#include <stdio.h>" では、stdio.h というヘッダファイルを読み込み、 そのファイルには、printf(),scanf()のプロトタイプ宣言が書いてあることを説明する。
電子情報系の資格試験情報をアップ
電子情報工学科にてチャレンジできそうな資格試験を集めてみました。
恒例の
今年はT先生がネタにされました。

新入生歓迎会
皆さん芸達者やのぅ〜♪

ネタ切れ学生さんのための「くじ引き一発芸」では、「中学校の校歌をうたってください」 というのもあった。恥ずかしがっている1年に「上級生の同じ中学卒も歌え!」と はやし立てられて、上級生も参戦。 しかし校歌を忘れてしまっている。
駄目だなぁ…と思っていたけど、自分自身の母校の校歌…. 味真野小学校は思いだせるのだが、武生第四中学校(現万葉中)が出てこない。 なんだっけとダメ元でWeb検索。すると、 武生第四中学校校歌が見つかる。
すっげーっと思ったんだけど、出てきた歌詞にまるっきり記憶がなく、 フレーズも出てこない。 おかしい….途中で校歌って変更になったっけ?(ふつーねーよなぁ…)
ループ処理とオーダ記法
ループ処理の時間
先週の、単純検索の処理時間が、 、 2分探索のループ回数が、
の説明に続き、 その処理時間は、
であることを示す。
もう少し複雑になった事例ということで、2重ループを含む最大選択法による並べ替えは、 最内ループ回数が となることを示し、 最大選択法の処理時間は、
で示されることを説明する。
オーダ記法
前述の処理時間の式では、処理時間に関する定数が沢山でてくる。 また、Nが大きく変化した時の処理時間のおおよその予測の際には、 Nの次数の低い項は無視する場合が多い。
このためプログラムのアルゴリズムの効率(処理時間)を議論するときは、 Nが巨大になった時の最も値の大きい項の変化式の部分だけで、 大まかな処理時間の予測ができる。この式でアルゴリズムを表現したものを オーダ記法(ビッグオー記法)と呼ぶ。
よって、 単純検索は、、 2分探索は、
、 最大選択は、
で示されることを説明する。
処理時間の予測
2分探索法で、データ(N)が100件の時の処理時間が1msecであった場合、 データが1000件の場合どのくらいの処理時間となると予想されるか?
オーダ記法では、 は、
なので、
より、
(ただしlogの底は10とする)。 よって、
授業の最後に、複数の項のNの次数が微妙で増加速度の判断が困難な場合の オーダーを求める手法として、ロピタルの定理を用いた方法なども説明する。
Cでのオブジェクト指向もどき
先週の、機械系・電気系学生向けの構造体の説明の続き。 C言語でのオブジェクト指向もどきの解説。
変数と関数
プログラミングの基礎として、大域変数と局所変数を説明。 特に大域変数は、常に操作できる領域で、誤った操作による破壊の可能性が高く、 関数や局所変数を利用すべき点を力説する。 次に、関数と呼び出し側のデータの受け渡しとして、 値渡し・ポインタ渡し・参照渡しなどを説明する。
これにより、必要最小限の情報だけを関数に開示して、 値を修正してもらうことができる点を説明。
/* 値渡し */ void func( int x ) { x++ ; printf( "%d" , x ) ; } void main() { int a = 123 ; func( a ) ; // 124 を表示 func( a ) ; // 値渡しでaへの副作用がないので再び124を表示。 } /* ポインタ渡し */ void func( int* p ) { (*p)++ ; printf( "%d" , (*p) ) ; } void main() { int a = 123 ; func( &a ) ; // 124を表示。 func( &a ) ; // ポインタの先のaが変化しているので125を表示 } /* 参照渡し */ void func( int& x ) { x++ ; printf( "%d" , x ) ; } void main() { int a = 123 ; func( a ) ; // 124の表示。a への副作用あり func( a ) ; // 125の表示。 }
Cでのオブジェクト指向もどき
C言語の構造体だけでオブジェクト指向の雰囲気を示すことができる点を、 下記のプログラムによって説明する。
これによって、main内部では、データの内容を知らなくても(データ隠ぺい), 関数の中身を知らなくても(手続き隠ぺい)プログラムが書けるようになった点を説明。 さらに、struct 宣言がオブジェクト、データ操作の関数をメソッドと呼び、 その2つを合わせてたものをクラス(class)と呼ぶことを説明する。
// Personオブジェクト struct Person { char name[ 10 ] ; int age ; } ; // Personの初期化メソッド void set( struct Person* p , char s[] , int a ) { strcpy( (*p).name , s ) ; // 最初の説明ではあえて (*p).age = a ; // アロー演算子は使わない } // Personの表示メソッド void print( struct Person* p ) { printf( "%sさんは%d才です。" , p->name , p->age ) ; // ちょっと説明したあとでアロー演算子を使う。 } void main() { struct Person saitoh ; // Personのインスタンス struct Person family[ 4 ] ; set( &saitoh , "とおる" , 44 ) ; print( &saitoh ) ; set( &family[0] , "あゆか" , 7 ) ; set( &family[1] , "みつき" , 9 ) ; print( &family[ 0 ] ) ; print( &family[ 1 ] ) ; }
第3回・歯みがきロボコン打ち合わせ
歯みがきロボコンの3回目に備えて、最初の打ち合わせが行われた。
創造工学テーマ検討
例年通り、創造工学が始まった。 昨年度は授業アンケートで、「教員の点数稼ぎにつきあわすんじゃない!」などと記入する 学生もいたし、今年度はテーマ決めの段階でも
- この授業は技術ニーズや仕組みを理解して、新しいアイディアを考え発表する
- そのアイディアの中で自分たちの技術で可能な範囲で実際にもの作りを行って 最終成果を発表する
を実践するのが目標であり、プロコン応募は単なる目標や締切設定にすぎないことを明言する。
携帯のお財布機能利用者5%?
実際に作るアイディアの導入として、既存技術の説明を色々と行う。 その中で、RFIDの応用として「おさいふ携帯使ってるでしょ?」と聞いたら、 43人中たったの2名。予想外に利用者が少ない。 (個人的には1/3程度の普及はしてると思ってた。)
個人的には、70%ほどが最近の3G携帯系でそのほとんどがお財布対応と、 裏付けの無い予想を抱いており、その感触からすれば5%の利用率は、異様に低い。 学生さんに聞いてみると、携帯からチャージする振り込み元の銀行やカードを 持っていないことが原因のようである。
この結果からすると、銀行やカード会社は、親に利用額や支払先をその都度レポート する契約を組み込んだカードを作ると、子供に普及し電子マネー普及に貢献できると 思うのだが….やはり技術的・超過支払の制御の面で難しいネタが潜んでいるんだろう。
才能のない○○にどうやって○○への思いをとどまらせるか…
はてな匿名ライブラリーにて、才能のない子にどうやって美術への進路を思いとどまらせるかというネタが 盛り上がっている。
反応としては、「子供に芸術の才能がないとを告げること」の是非が討論され、 「『芸術家くずれの教員』が冷たく才能を見切ることが本当にいいのか?」 といったような非難をうけていたりする。 たしかに、将来才能を開花させる人もいるだろうし、 変に期待をもって芸術家を目指しても、 本当に才能を開花するひとはほんの一部で、 それ以外だと就職すら大変…という現実が待っているからこそ、 思いをとどまらせるのも大切という意見の対立である。
私の情報系であれば、このネタは、 「プログラミングの才能の無い『単なるゲーム好き』に、 どうやって『ゲーム会社』への就職を思いとどまらせるか…」と 読み替えることができる。 んで、私自身の感想では、この先生の意見に近く、「現実を知らせるべき…」と…
確かに、「お前才能ないし…」と言うのは簡単。 実際、任天堂に就職するのは大変ということは、例年学生に伝えているし、 ゲーム企業への就職希望は持つなと叫んでいる。 ただし、もう大人なんだし、「夢を持つならその努力はすれば、可能性はあるけど…」と、 夢と現実の微妙なところは言及しないようにしている。
さて、今年も例年どおり「ただのゲーマー」が、「ゲーム会社に就職したい」と言っている。 熱心にプログラムを書いているんなら、「厳しいけどがんばれ!」と声をかけるだろう。 でもなぁ….プログラムを2年以上習ってるのに、 100行程度のプログラムしか書いたことが無いとか、 数学の成績も最低レベルとか、 夜更かししてゲームばっかりしてます…というヤツが、そう言うんなら、 冷たい一言も言わざる得ないと思うんだけど…
# 私って、冷たい才能をつぶす悪い教員?