体育祭
今日は朝から体育祭。 電子情報の応援では、例年よりは力強さをアピールするような応援の声でした。 デコレでも、ステージ上でのパフォーマンスはノリも良く、フィットネスネタが 良かったかな….
別の意味では、今日は新しいカメラの動作試験。ズームも利いて面白く写真が取れました。
- T-Saitohの撮影した体育祭の写真 (IDとパスワードは教員室前などに掲示)
歯みがきロボコンルール原案決め
歯みがきロボコンでは、「斬新なアイディアで、正確に歯をみがこう」との趣旨で、 ルールの基本的な見直しを検討中。
今までは、「ブラシの加工NG、モータ・電池の制限アリ」であったけど、 今度は制約を最小限のルールになりそう。 「虫歯マグネットのペナルティを大きくして正確に…」というルールがあれば、 「ハイパワーでまるごと根こそぎブラッシング…」という作戦ができなくなるためで、 リモコン(操縦)部門・自律部門ともに制限を減らし、斬新なみがき方の車体を 期待することになった。
# さて、ルール文面原案を書き直し…
創造工学演習テーマを具体化
第3回目の授業ということで、前回提出してもらったアイディア草稿を、 各グループに分かれてもう少し具体化したアイディアに直してもらう。
- 開発に必要な物品の検討
- 実際の処理で行う内容の検討
- グループの役割分担などの検討
最終的にグループ毎で、物品・処理・分担などをレポート用紙にまとめて提出してもらう。
PHP講習会/H8割り込み講習会
4EIの実験時間を用いた創造工学演習向けの基礎講習会の2回目。 40人を2つに分けて実施するため、場所が狭かったり実験が困難だったり。 H8の割り込み講習会の参加グループの方が、実際の実験環境の準備が大変で、 割り込みやモータ制御の文献調査になってしまった。
PHP講習会の方は、簡単にアクセスカウンタのプログラムを説明し、 何らかのファイル操作を伴うプログラムを作成し、 レポートに「この知識を自分のテーマに使えそうか?」、 「PHPのプログラムの起動の際のユーザ権限」、 「ファイルロックなどの問題点」などを、各自選んでレポートとして記載し提出してもらう。
<?php if ( ($fp = fopen( "count.txt" , "r" )) != FALSE ) { $count = fgets( $fp ) ; fclose( $fp ) ; } else { $count = 0 ; } $count++ ; print "counter = $count" ; // このプログラムのディレクトリは、 // 誰からも書き込みできる許可を与えておく。 // 別途危険性は説明する。 if ( ($fp = fopen( "count.txt" , "w" )) != FALSE ) { fputs( $fp , "$count" ) ; fclose( $fp ) ; } ?>
プログラムをちょっと修正したら、レポートを書きだすと思っていたけど、 予想に反して、くだらない機能追加なんだけど、全員が積極的に「修正」している。
# レポート作成に時間を取ってほしいんだけど….
整数の型と数値の範囲
整数型の様々な型と数値の範囲についての解説。 N進数の変換、小数を含む場合の変換の説明と、2の補数を紹介し、 char / unsigned char / short int / unsigned short int / int / unsigned int / long int / unsigned long int などの扱える数値の範囲を紹介。
数値の範囲が及ぼす具体的な事例をいくつか紹介。
((16bitコンピュータにて)) int i ; // i:16bit for( i = 0 ; i < 1000 ; i++ ) ; // 1μsecの処理。 ならば、100μsecは、 × for( i = 0 ; i < 100000 ; i++ ) ; // 100000 > (2^15-1) ○ for( j = 0 ; j < 100 ; j++ ) for( i = 0 ; i < 1000 ; i++ ) ; ○ long i ; for( i = 0 ; i < 100000 ; i++ ) ; ((16bitコンピュータにて)) int x1 , y1 , x2 , y2 ; // (x1,y1),(x2,y2)の距離を求める。 int r = sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) ) ; // 負の数の平方根はエラーとかが発生。 ((32bitコンピュータにて)) int t1 , t2 ; // 1970年1月1日からの積算秒(unix time) × int tm = (t1 + t2) / 2 ; ○ int tm = t1 + (t2 - t1) / 2 ;
来週は、浮動小数点の扱いと double / float 型 , 文字列の扱いをやりたいな…
2009年4月26日 (第109回)
- 英語の囃子 第8回 吉田三先生、電子情報4年丸山さん
eng090426.mp3 - メールテーマ: 名物先生、名物授業
- ゲスト: 1年電子情報工学科 山本さん
PHPによるWebアプリケーションとセキュリティ
5EI学生を対象とした、PHPによるアプリケーションでのセキュリティネタを解説するための 実験を担当し、今日はその第1クールの1週目。 ちょうど、自分の卒研の学生でWebアプリケーション系のテーマの人がいたので、 内容的にもちょうどいい。
余計な処理をしない、セキュリティ的に穴だらけのプログラムを示し、 具体的なトラブルを発生させて、問題点を考えてもらい、 実験ではプログラムの修正を行ってもらう。
- あえてC言語で書いたCGIにて、バッファオーバフローの体験
- PHPの基礎として極めて単純な動作例を示す
- ディレクトリトラバーサルのネタ
- 入力値の単純表示処理によるフィッシングネタ
- コマンドインジェクションのネタ
再帰方程式の説明
処理速度の分析の第2段階として、再帰を含む処理の処理速度について説明を行う。
再帰による階乗の処理速度
再帰で階乗の処理を記述し、その動きを説明したあと、処理速度を分析してみる。
((階乗の再帰)) int fact( int x ) { if ( x <= 0 ) return 1 ; else return x * fact( x - 1 ) ; } ((処理速度の再帰方程式)) T(0) = Ta T(N) = Tb + T(N-1) | N≧1 ((再帰方程式を代入法で予測)) T(0) = Ta T(1) = Tb + T(0) = Ta + Tb T(2) = Tb + T(1) = Ta + 2*Tb : T(N) = Ta + N * Tb よって、再帰による階乗の処理は、O(N)
再帰による2分探索の処理速度
次に2分探索法を再帰によって記述してみる。 この処理にかかる時間は、データ件数Nに対して….
((2分探索の再帰による記述)) int find( int data[] , int L , int R , key ) { if ( L+1 == R ) { if ( data[ L ] == key ) return L ; else return -1 ; } else { int M = (L + R) / 2 ; if ( data[ M ] == key ) return M ; else if ( data[ M ] > key ) return find( data , L , M , key ) ; else return find( data , M , R , key ) ; } } int array[8] = { 12 , 23 , 34 , 45 , 56 , 67 , 78 , 89 } ; void main() { printf( "%d番目に見つかった" , find( array , 0 , 8 , 78 ) ) ; } ((処理速度の分析)) この関数は、対象となるデータ件数によって時間が変化し、 対象となるデータ件数(R-L) の関数Tであるとして... T(1) = Ta T(N) = Tb + T( N / 2 ) で表すことができる。 代入法で予測してみると、 T(1) = Ta T(2) = Tb + T(1) = Ta + Tb T(4) = Tb + T(2) = Ta + 2 * Tb : T(2^m) = Ta + m * Tb ただし m = log2( N ) だから、 T(N) = Ta + Tb * log(N) よって、O(log(N))
ハノイの塔や再帰によるフィボナッチ数列の処理速度
Moodle講習会に参加
大学連携で県立大学を中心として整備をすすめている f-leccs.jp の 活動の一環として、LMS(Learning Management System) Moodle の講習会(県立大学開催、仁愛大学篭谷氏講師)に参加。 連携校の登録された先生であれば、講義の日程管理・配布資料・小テスト・評価管理 をWebインタフェースで自由に登録管理ができる。
参加する学生さんとしても、小テストでは携帯Web機能のモジュールも追加されているので、 多少の制限はあるけど、携帯で回答するなどもできるようになっている。 ただ、資料の準備には慣れも必要だし、一度頑張ってコンテンツを作っちゃえば、 使い回しもできるようになるんだし、最初のひと頑張りが大切かな。
予習ができなきゃね…
私自身は、ずいぶん前から、講義のあとの要点をまとめたメモを講義録として、 日記に記載してきている。 しかし、あくまでも講義の後。 大学は予習した上で授業に臨むのが前提だから、 講義録ではすでに遅れているんだよなぁ… さて、頑張って『授業の前』に Moodle 上でコンテンツを作らねば…
VOD化
f-leccs.jp で狙っているの講義へのネット技術の活用の1つには、 講義のVOD(Video On Demand)化もあげられている。 映像系の担当の方との雑談では、なかなか全員の人に認知してもらえるまでが大変そう…
VOD化といっても、常にビデオの専門家に来てもらうのはコストもかかる。 それに講義の話って、重要そうなネタを表現を色々と変えながら何度も話すことを 繰り返したりするから、映像的には動画がでかい+内容もかなり冗長ということで、 ケチくさい考え方の染み付いたサーバ屋の視点では、 『なんだかもったいないよぉ…』って気分。
それ以上に、ビデオに撮られること自体が恥ずかしい…って障壁の方が大きかったりして….
C言語からC++でオブジェクト指向
先週のC言語によるオブジェクト指向の導入に引き続き、 C++を実際に使ってみるようにと、ベースのプログラムを、 メソッド呼び出し表記に変えたり、コンストラクタを使うように修正したりしながら 説明を行う。
class Person { private: // private宣言で、クラス以外で使えない。 char name[ 10 ] ; int age ; public: // public宣言で、クラス以外でも使える。 void set( char s[] , int a ) { // C言語なら、対象オブジェクトを明記したけど、不要となる。 strcpy( name , s ) ; age = a ; } void print() { printf( "%s %d" , name , age ) ; } } ; void main() { Person saitoh ; saitoh.set( "T-Saitoh" , 44 ) ; saitoh.print() ; } ((上記の説明の後)) class Person { : Person( char s[] , int a ) { // データ初期化⇒コンストラクタ strcpy( name , s ) ; age = a ; } } ; void main() { Person saitoh( "T-Saitoh" , 44 ) ; : }