ホーム » スタッフ » 斉藤徹 (ページ 116)

斉藤徹」カテゴリーアーカイブ

2025年7月
 12345
6789101112
13141516171819
20212223242526
2728293031  

検索・リンク

今日はキャンパスウォーク

今日は、オープンキャンパスの第1段のキャンパスウォーク。 午前は進学を検討している中学生向け、午後は一般の方を対象に、 学科設備などの見学をしてもらいました。

1405101424_1136x852.jpg

5年生も説明スタッフとして頑張ってくれました。

うちの中3も見学…

うちの子供も今年は、中学3年なので見学。 見学者向けの昼食「カツカレー」をすこし分けてもらいました。

1405101424_3264x2448.jpg

子供は「美味しい!!」と喜んでます…

子供の見学の後で、学生さんに後で聞いたら、 「奥さんも元電子情報ということで、 下手な説明すると突っ込まれるかと緊張した…」 とのことでした….(^_^;

隠蔽化とコンストラクタとgetter,setter

前回までの授業で、簡単なクラスを作るまでを説明したので、 複素数クラスのリファクタリングを通して、隠蔽化を説明。

getter,setterメソッド

前回の授業では、以下のプログラムを示していたが、 例えば名前nameや年齢ageを外部で使用したい場合には、 name,age のprivate設定を、public にする方法が考えられる。

class Person {
private: // publicにする?
char name[ 20 ] ;
int  age ;
public:
void set( char s[] , int a ) {
strcpy( name , s ) ;
age = a ;
}
void print() {
printf( "%s %d¥n" , name , age ) ;
}
} ;

しかし、name,age を public にすると、不容易にクラス内の変数を 触られてトラブルの元凶となる場合がある。 こういった場合、フィールドを参照するだけのメソッド(getter), フィールドに値を参照するだけのメソッド(setter)を定義する方法が 有名である。 また、getterメソッドなどは、値を参照するだけで、クラス内に副作用を与えないことを 明示するために、const メソッドを指定することもできる。 setter では、代入時に想定外の値が入力されないように、 開発中だけ、値のチェック処理を埋め込むなどの使い方もできる。

class Person {
private:
char name[ 20 ] ;
int  age ;
public:
// getter
const char* get_name() const {
return name ;
}
int get_age() const {
return age ;
}
// setter
void set_name( char s[] ) {
strcpy( name , s ) ;
}
void set_age( int a ) {
// リリース版ではif文をコメントアウト
if ( a < 0 )printf( "set_age(int) : domain error¥n" ) ;
age = a ;
}
} ;

コンストラクタとデストラクタ

最初の例のset() メソッドのように、オブジェクトは何らかの初期化をするのが通常であり、 逆に初期化を忘れたオブジェクトは、後々異常動作の元になる。 このため、データの初期化を簡単に扱えるようにコンストラクタ(構築子)を用いる。

また、データを生成し何らかの処理を行った後、そのデータを廃棄する前に必ず処理を 呼び出したい場合がある。こういった場合にはデストラクタを用いる。

class Person {
private:
char name[ 20 ] ;
int  age ;
public:
// コンストラクタ(データを初期化するメソッド)
Person( char s[] , int a ) {
strcpy( name , s ) ;
age = a ;
}
// デストラクタ(データを廃棄するときに自動的に呼び出し)
~Person() {
printf( "destructor %s,%d¥n" , name , age ) ;
}
void print() {
printf( "%s %d¥n" , name , age ) ;
}
} ;
int main() {
Person saitoh( "t-saitoh" , 49 ) ;
saitoh.print() ;
// saitoh.print() で "t-saitoh 49"が表示され
// mainを抜ける際にデストラクタが呼び出され、
// "destructor t-saitoh,49"が表示される
return 0 ;
}

複素数クラスで隠蔽化とリファクタリング

前述のような、getter,setterによりデータを不用意に扱われないようにする 対策に合わせ、クラス利用者にクラス内の情報を知らなくても扱える(データ構造の隠蔽化)、 そのメソッドがどのように実装されているか知らなくても使える(手続きの隠蔽化)を 行うことを総称して、隠蔽化(あるいはブラックボックス化)と呼ぶ。

隠蔽化を施せば、後で内部構造や内部処理を書き換えても、クラスの利用者には 影響を少なくできることを示すために複素数クラスを考える。 最も一般的な方法であれば、実部と虚部で以下のように実装するだろう。

class Complex {
private:
double re , im ;
public:
Complex( double r , double i )
: re( r ) , im( i ) {
// 上記は要素を指定値で初期化する場合の書き方。
}
void print() {
printf( "%lf+j%lf" , re , im ) ;
}
void add( Complex z ) {
re = re + z.re ;
im = im + z.im ;
}
void mul( Complex z ) {
double nr = re * z.re - im * z.im ;
double ni = im * z.re + re * z.im ;
re = nr ;
im = ni ;
}
} ;
int main() {
Complex a( 1 , 2 ) ;
Complex b( 2 , 3 ) ;
Complex c( 3 , 4 ) ;
a.add( b ) ;  // a.add( Complex( 2,3 ) ) ; もアリ
a.print() ;   // 3+j5 を表示。
a.mul( c ) ;
a.print() ;   // (3+j5) * (3+j4)
return 0 ;
}

上記のプログラムでは、add() はシンプルに記述できたけど、 乗算はそれなりに複雑(という程でもないけど…)になった。 しかし、複素数を絶対値と偏角で記述することも可能となる。

class Complex {
private:
double abs , arg ;
public:
Complex( double r , double i ) {
abs = sqrt( r*r + i*i ) ;
arg = atan2( i , r ) ;
}
void mul( Complex z ) {
abs *= z.abs ;
arg += z.arg ;
}
// 他のメソッドは記載省略
} ;

上記の例の様に、当初のクラス設計で不具合があった場合に 後で「内部設計・メソッドを全面変更」を行うと、通常であれば クラス利用者にも影響が大きい。 しかし、内部設計の変更の影響が出ないように、適切なメソッドを 定義しておけば、クラス利用者に内部変更が解らない様にすることができる。 これが、隠蔽化の利点である。

このように、適切な隠蔽化が行われていれば、クラス内の設計変更は 気軽に行えるようになる。 そして、クラス内部の設計変更を積極的に行うことで、プログラムの改善を 行うことはリファクタリングなどと呼ばれる。

IPアドレスの管理スクリプト適用

自宅のサーバで、IPアドレスの管理のスクリプトを書いたので、 早々に職場にも適用。 /etc/dhcp/dhcpd.conf,/etc/hosts,/etc/samba/lmhosts を テンプレート生成するようにしてみた。

hosts,lmhosts は、あまり使われないけど、 ネットワークトラブル時に、この辺の設定があると 対応がしやすいので…

画像探索(最小二乗法)

創造工学の競技部門向けの予備実験として、簡単な画像探索プログラムの実験を行った。

処理の内容は、大きな元画像の中から、その一部をクリップした部分を検索するプログラムを動かしてもらった。 サンプルでは、全2次元空間をしらみつぶしに探す方法で、極めて遅いプログラムを示し、 改良高速化をしてもらうこととした。

ppm画像の読み込みサンプル

4年当初では、コマンドライン引数やら、画像形式の読み込みなどが理解していないため、 下記の readppm.cxx を示して、ppm画像の読み込み処理と、コマンドライン引数を説明。

画像探索プログラムのサンプル

前記プログラムがわかった所で、画像探索プログラムのサンプルコードを示す。 このプログラムは、1ドット毎に左上から右下まで移動させながら、 画素のRGBのズレの合計スコアの最小の場所を記憶させる手法。

自宅マシンで動かすと、600×400程度の画像の中から、100×100程度の画像を検索するのに、40秒ほどかかる。 実験では、動作確認のあと、処理の高速化をしてもらった。

また、問題が起こりそうな事例ということで、 検索画像が輝度補正がかっている場合(HSVなりYCbCrなりの色空間で比較が必要)や、 ぼけた画像でも正しく動くのか試してもらった。

Googleさんが、緊急メールを迷惑メールに入れた…

子供の中学校から、緊急メールが流れてきたんだけど、 Gmail宛に送ってるけど、迷惑メールに分類されてた。(T_T;

まあ、確認のためのURLの中に、メールアドレスが埋め込んでいるし、 典型的な迷惑メールのスタイルといえばそうなんだけどさぁ…

ターミナルソフト RLogin.exe いいね。

知り合いのつぶやきから、RLogin.exe なるターミナルソフトを発見。 今までは TeraTerm を使っていたけど、複数接続のタブ表示なども できるようなので、こちらに切り替えてみた。

default が黒背景になっていて、黒背景に久々感を感じながらも、 こだわりがある訳じゃないので、そのまま使う。 ただ、フォントの青が暗めで読み辛いので、青だけ設定を明るめに直す。

なかなかいいな…

1404012156_767x659.png

高専技科大連携のテレビ会議システム

テレビ会議システムの使い方説明会がありました。連携向けで閉じているので、他の会議システムと繋ぐのは難しいらしい。

1403311648_320x320.JPG

校内WiFi教室電波状況(2部屋)

前日に測定した1部屋内の電波強度測定に続いて、校内WiFiの電波強度測定 part2。

どの程度まで電波が届くのか、 隣の部屋の電波がどの程度入ってくるのかを 測定してみた。

電波強度が落ち込んでいる部分は、壁で測定できなかった場所と、 電波が弱くてdB値が測定できなかった場所。

このmapを見ると、教室の後ろでは隣の部屋の電波がある程度 とれると予測していたが、影響が小さいことがわかる。

また、廊下の電波強度を見ると、中間の位置で電波が取れない 場所があるし、隣接するAPが無い所では、電波が取れないこと が確認できた。

1403290650_841x582.png

校内WiFi教室電波状況

追加補正予算で導入された校内の無線LAN環境。 まずは、この時期だからこそできる、人が居ない状態での 教室内の電波状況を計測してみた。

まずは、5EIの教室で測定した結果。 教室右前方のアクセスポイント直下が最大で、電波強度が落ちていく。

明日は、本館で隣接する教室のアクセスポイントが拾える教室で実験しよう。

1403272154_514x387.png

このデータは、教室内を6×8の格子に区切り、パソコンで電波強度[dB]を測定し、 見やすいように間を平均値補間した電波強度の等高線。

授業アンケート結果

恒例の授業アンケートの、プログラミング応用とデータベースが送られてきた。

データベース

例年であれば、80ポイント前後のところが85ポイントとなっており、 他の科目などにも比べ高い評価となった。

興味関心については、90ポイントを越え、学生の興味のある領域を 話せたのかと安堵感。

プログラミング応用

例年であれば、3年は辛めの評価が多いのであるが、その中で約82ポイントは 良い法だと思われる。シラバスへのポイントが低めであるが、 予定通り進んでいることなどをもう少し PR しながら進める必要が あるかもしれない。

システム

最新の投稿(電子情報)

最近の投稿(斉藤 徹)

アーカイブ

カテゴリー