学力強化週間でプロ応補講
今週は、後期授業を前に『学力強化週間』ということなので、 3EIのプログラミング応用で成績の悪かった人に集まってもらって、 補講を行いました。
制御構文(break,continue等が怪しかった)や、 大域変数・局所変数・仮引数・実引数の説明などを導入に、 ポインタや文字列などの演習を交えながら、 確認を行った。
素数生成で、制御構文と配列を確認したり、 このプログラムをあえて、ポインタ操作に書き換えたりしながら、 3時間にわたる説明となった。
最後に、慣れてきたかと、文字列の回文判定を書いてもらったけど、 関数を書いて…という段階で、返り値の型やら引数宣言やらで、 目の前真っ白という状況であった。この補講を踏まえて、 成績があがってくれるといいのだが….
第7回歯みがきロボットコンテスト
9/22(日)に勝山越前大仏にて、歯みがきロボットコンテストが開催され、 電子情報工学科では、5EI渡辺君,4EI金巻君が自律部門で参加しました。
残念ながら自律部門では、入賞できませんでしたが、以前から歯みがき ロボコンに参加していた1年生の学生さんが、 リモコン部門で優勝となりました。

授業アンケートシステムも怪しい…
立て続けにトラブルが続いているが、 実は数日前から、授業アンケートシステムも HTTP/SSH が 接続が切れてる。
ひとまず前期授業アンケートは終わっているので、 後回しにしていたけど、改めてe-Learning室のサーバ部屋で、 動作を確認すると、システムは動いているけど、console で login が出来ない状態。最悪、完全ダウンを想定していたけど、 システムは動いているので一安心。
Alt+Ctl+Del も動かないし、ブチ切りReset。 しかしながら、無事に起動で元通りとなった。 ただ、この状況は、明らかにシステムダウンの予兆。 ひとまず授業アンケートシステムのプログラムとデータを バックアップし、別サーバにコピーしておいた。
別途、仮想サーバ上に新しい授業アンケートシステムを 構築する予定。
緊急連絡システムもトラブル
昨夜実行した、OS の更新は、様々なトラブルを起こしてくれた。
緊急連絡システムで、症状としては、メールを送信しているのに、 手元に届かない。 PHPのバージョンアップで微妙に発生している警告の出る点を 修正しながら、原因をつきつめていった。
すると、qmail を使っているのに、なぜだか exim4 が入ってる。 そして、mb_send_mail() 関数で呼び出される sendmail が、 exim4 を使っていることが判明。
(( /etc/php5/apache2/php.ini )) sendmail_path = /usr/bin/qmail-inject
の設定を書き加えて、無事復旧。
職場でもlibperl5.18のトラブル
自宅サーバでも手間取ったlibperl5.18だけど、 学科サーバでも同様のトラブル。自宅でパッケージ更新をかけてる 途中でサーバ再起動をかけたら、動かなくなったので、 最悪OS起動ができなくなったかと思ったけど、OS起動は無事だった。
ネットワークのトラブルは、旧サーバのIPアドレス上でも動くように、 "eth0:0"を旧サーバに設定していたんだけど、/etc/network/interfaces に、"auto eth0:0"が記載してなかっただけ。
しかしながら、libperl5.18 が入ってしまったトラブルは解消に 手間取った。
あまりにもうまくいかないので、一旦 apt ソースから、testing を 消し、この状態で "aptitude install libperl5.14"を実行させたら、 パッケージを無事ダウングレードできた。
この後、改めて testing を戻して、消えたパッケージを再インストール。
授業アンケート(2PSオブジェクト指向)
恒例の授業アンケートの結果を見てみた。 回答数が少ないため、評価値はあんまり宛てにはならないが、 例年通りのポイントであった。
今年は、オブジェクト指向が応用でどのように使われているのか、 事例をプログラム例を見せながら説明したりして、例年よりは 進度が早まった。(その点UMLの図法の詳細説明を省いている)
さらに講義室に、大型テレビがあったので、パソコンで 以前の自分のBLOG記事や、他のWebの解説記事などを見せながら 説明したり、プログラムを実演しながら見せたりと、 パソコン画面を用いた説明を増やしてみた。
概ね好評であったと思うが、ポイントには出ているのかは、 少数データで判別は困難かな…
大雨後の濁流の動画(卒研用)
今年の卒業研究では、型落ちしたスマホなどが出た時の活用として、 川の氾濫警報のための監視システムを作ることをテーマにしている。
そこで、平常時の川の写真よりも、濁流となった状態がどういったものなのか、 サンプルが欲しいということで、今朝の川の動画を撮影してみた。
これより解かることとして、濁流状態では水しぶきで霞んだ状態になっている。 このため、時間軸の差分法では、明確な「濁流」を検出することは難しいと思われる。
コンテナクラスとテンプレート(C++),Generics(Java)
オブジェクト指向で、純粋仮想基底クラスと、仮想関数を使った応用では、 コンテナクラスと呼ばれる方法が使われる。 コンテナクラスでは、空っぽの純粋仮想基底クラスを使って、データを便利に扱える 処理(アルゴリズム)を記述しておく。 自分でデータを扱うプログラムを作成する場合には、その空っぽクラスから派生させた クラスを定義し、仮想関数のメカニズムを使ってそのアルゴリズムが動くようにしておく。 こうすれば、面倒なアルゴリズムを、違う型でもそのアルゴリズムを使える。 このようなクラスは、コンテナクラスなどと呼ばれたり、Generic クラスなどと呼ばれる。
過去の記事では純粋仮想クラスの説明で、Object という純粋仮想基底クラスで、 データ並び替えなどのアルゴリズムが、使える例を示した。
しかし、この過去の記事では、配列には、Object から派生させた Integer や、CString が 入っている例で、便利に使える例として説明しているが、 一つの配列の中に、Integer や CString が混在したら、実は cmp() 関数で、 異なる型のことを考えていないため、実行時に動かなくなる。
こういった問題の解決として、色々なテクニックが考案されているが、この例が、 C++ のテンプレート機能と、Java の Generics 機能である。 ただ、この2つの機能は、文法の字面では似ているが、考え方はまるっきり違う。 以下に、固定長スタックを例に使い方を中心に説明する。
C++ テンプレート
C++のテンプレート機能の基本原理は、実はあんまりオブジェクト指向と関係はない。 例えば、整数データを記憶するスタックのプログラムは以下のようになる。
class Stack { private: int data[ 100 ] ; int sp ; public: Stack() { sp = 0 ; } void push( int x ) { data[ sp++ ] = x ; } int pop() { return data[ --sp ]; } } ; void main() { Stack s ; s.push( 1 ) ; s.push( 2 ) ; printf( "%d" , s.pop() ) ; printf( "%d" , s.pop() ) ; }
しかし、整数を覚えるスタックは記述できたが、実数を覚えるスタックや文字列を覚えるスタックは、改めて記述する必要がある。 この不便さを解消するのがテンプレート機能である。
template<class T> class Stack { private: T data[ 100 ] ; int sp ; public: Stack() { sp = 0 ; } void push( T x ) { data[ sp++ ] = x ; } T pop() { return data[ --sp ] ; } } ; void main() { Stack<int> si ; // 型Tにintを割り当てた、処理が生成される。 si.push( 1 ) ; printf( "%d" , si.pop() ) ; Stack<double> sd ; // 型Tにdoubleを割り当てた、処理が生成される。 sd.push( 1.23 ) ; printf( "%lf" , sd.pop() ) ; }
テンプレートの基本は、型情報を<class T>として雛形プログラムを記述しておき、 具体的に型を明記して使われた時点で、その型に応じた機械語を生成してくれる。
JavaのGenerics
JavaのGenericsは、字面や使い勝手では、C++のテンプレートと同じように使う。 しかし、実際は、Java の全データの純粋仮想基底クラスの Object 型を使っている。
public class Stack<T> { private T[] data ; private int sp ; public Stack() { sp = 0 ; data = (T[]) new Object[10] ; } public void push( T x ) { data[ sp++ ] = x ; } public T pop() { return data[ --sp ] ; } public static void main() { Stack<Integer> si ; // Integerはintのラッパークラス si.push( 1 ) ; System.out.println( si.pop() ) ; Stack<Double> sd ; // Doubleはdoubleのラッパークラス sd.push( 1.23 ) ; System.out.println( sd.pop() ) ; } }