ホーム » 2013 » 4月

月別アーカイブ: 4月 2013

2013年4月
« 3月   5月 »
 123456
78910111213
14151617181920
21222324252627
282930  

最近の投稿(電子情報)

アーカイブ

カテゴリー

EI-OBが、海外で繋がる時代

4年の創造工学の授業で企業から非常勤にて来て頂いている、 北野くんが仕事でベトナムに行って現地企業の方と ランチミーティングをしていたら、相手もEI-OBの ダン君だったとのこと。

彼ら同士は初面識ですが、同じ福井高専OBということで、 話がはずんだ様子ですね。 福井高専もインターナショナルになってますなぁ。

1304301744_668x411.png

2013年4月28日(第318回)

  • まるよし Train Pops ~ 国語と遊ぼう! 第4便 「あいさつについて」後半
  • 体育祭について
  • クラブ紹介について

担当:前田勝(4EI)、西(教員)

debian/wheezy で qmail を入れる

Debian/wheezyのstable化が近づき、メイン稼働でないものから、 squeeze から wheezy に切り替え作業。 といっても、ちょっと心配なので、不要パッケージを削除して、 testing 用の sources.list を加え、ひとまず stable にとどめておく。

この作業で、update したら、qmail が更新された。 しかもお堅い配布方針で qmail-src から入れるしかなかった qmail で バイナリパッケージが提供されている。しかしながら、設定の方針の違いで パッケージのインストールに失敗した。

いまどき、postfix 入れろよ…という意見もあるだろうが、ひとまずはサービス維持を優先。

qmail を更新すると、alias のグループIDが、今までは nogroup/65534 になっていたけど、 nofiles というグループを作ってそれを使えとの指示。 さらに、ホームディレクトリを /var/qmail だったのを /var/lib/qmail に変更しろとの指示。

(( /etc/group ))
nofiles:x:64011:
(( /etc/password ))
alias:x:64010:64011:qmail alias,,,:/var/lib/qmail/alias:/bin/false
qmaild:x:64011:64011:qmail daemon,,,:/var/lib/qmail:/bin/false
qmails:x:64012:64010:qmail send,,,:/var/lib/qmail:/bin/false
qmailr:x:64013:64010:qmail remote,,,:/var/lib/qmail:/bin/false
qmailq:x:64014:64010:qmail queue,,,:/var/lib/qmail:/bin/false
qmaill:x:64015:64011:qmail log,,,:/var/lib/qmail:/bin/false
qmailp:x:64016:64011:qmail pw,,,:/var/lib/qmail:/bin/false
(( /etc/init.d/qmail ))
sh -c "start-stop-daemon --start --quiet --user qmaild \
--pidfile /var/run/tcpserver_smtpd.pid --make-pidfile \
--exec /usr/bin/tcpserver -- -R -H \
-u `id -u qmaild` -g `id -g qmaild` -x /etc/tcp.smtp.cdb 0 smtp \
$rblsmtpd /usr/sbin/qmail-smtpd 2>&1 \
| $logger &"

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

先週でクラスの定義や、データ構造(オブジェクト)とそれに対する手続き(メソッド)を、 まとめて扱う(クラス)について紹介したので、その書き方の復習から、 コンストラクタ・デストラクタなどの説明を行う。

配布資料として、上記のものを示し、構造体表記、クラス導入、 クラスには初期化などが重要であり、コンストラクタ・デストラクタなどの使い方を解説する。

今年は、参考としてC++による演算子オーバーライドなども紹介する。 これらの演算子の再定義は、Javaでは実装されていないし、 オブジェクト指向に必須の機能ではない。 しかし、オブジェクト指向に興味を持って参考書を読む際には、 「こんなこともできる…」という点で知っていてほしい。 さらに、オブジェクト指向に「どっぷり漬かる」のであれば、 最終的にSTLとかboostとかに興味を持ったら、読みこなすための重要な知識であろう。

最後に、複素数クラスの直交座標系データを、 利用者に解からないように内部データを極座標に書き換えることも可能という点を示す。 特に、プログラムやデータ構造をより良く書き換える作業を一般的に、 「リファクタリング」と呼ぶことを説明する。 オブジェクト指向が正しく適用されていれば、クラスの利用者側にリファクタリングしていることを 気づかせないまま、改良していくことが可能ということを解説する。

マージソート処理時間分析とメモリ利用の効率

先週の再帰処理の時間分析ということで、ハノイの塔の処理ステップの 数学的帰納法による証明を説明する。この後、マージソートの分析とメモリ利用の効率 について説明を行った。

マージソートの分析

マージソートは、与えられたデータを2分割し、 その2つの山をそれぞれマージソートを行う。 この結果の2つの山の頂上から、大きい方を取り出す…という処理を繰り返すことで、 ソートを行う。

このことから、再帰方程式は、以下のようになる。

  • Tm(1)=Ta

この再帰方程式を、N=1,2,4,8…と代入を繰り返していくと、 最終的に処理時間のオーダが、 となることを示す。

また、この結果を踏まえ、 最大選択法Tm(N)のプログラムと、クイックソートO(N×logN)処理時間はTq(N) があって、 Tm(100)=1msec , Tq(100)=2msec であったとして、 データ件数N=200の時には、どちらのアルゴリズムの方が速いか? データ何件以上で、クイックソートを採用すべきか…といった問題について説明を行う。

メモリ利用の効率

次にメモリの利用効率の話について解説する。
例えば、1クラスの名前のデータを覚えるなら、以下のような宣言が一般的であろう。

#define MEMBER_SIZE 50
#define NAME_LENGTH 20
char name[ MEMBER_SIZE ][ NAME_LENGTH ] ;

しかしながら、クラスに寿限無のような名前の人がいたら、20文字では足りない。 また、クラスの人数も、巨大大学の学生全員を覚えたいとい話であれば、 10000人分を用意する必要がある。 ただし、10000人の寿限無ありを考慮して、5Mbyte の配列を使うのは、 明らかにメモリの利用効率が低い。

このため、最も簡単な方法は、以下のように巨大な文字配列に先頭から名前を入れていき、 文字ポインタ配列に、各名前の先頭の場所を入れる方式であれば、 途中に寿限無がいたとしても、問題はない。

char array[2000] = "ayuka¥0mitsuki¥0t-saitoh¥0tomoko¥0....." ;
char *name[ 50 ] = {
array+0 , array+6 , array+14 , array+23 , ...
} ;

この方式であれば、2000byte + 4byte(32bitポインタ)×50 のメモリがあれば、 無駄なメモリ空間も必要最低限とすることができる。

来週は、必要に応じてメモリを確保する、mallc() + free() を解説する予定。

数値の範囲と型

構文,変数の話をしたので、続いては数値範囲について解説。

変な動きのプログラム例

(( 平均を求める処理 ))
int a[ 3 ] = { 10 , 10 , 20 } ;
int s = 0 , i ;
for( i = 0 ; i < 3 ; i++ ) {
s += a[ i ] ;
}
printf( "%f" , s / 3 ) ; // 13.3333 ?
(( 簡単な三角関数の計算 ))
printf( "%f" , tan( 1/4 * 3.141592 ) ) ; // 1.0 ?
(( 2点間の距離を計算 ))
// 以下の計算を16bitコンピュータで実行したら...
int x0 = 100 , y0 = 100 ;
int x1 = 300 , y1 = 300 ;
int r = sqrt( (x1-x0)*(x1-x0) + (y1-y0)*(y1-y0) ) ;
printf( "%d" , r ) ; // 200*1.4142 = 282.84 ?

上記のプログラムは、どれも期待した答えが求まらない。 その理由を考える。

2進数でN[bit]の桁数があったら、1bitで2とおり,2bitで4とおり,Nbitで、 通りの状態を表せる。 これを数値として考えれば、2bitであれば00=0,01=1,10=2,11=3 として扱えばいい。 よってN[bit]の符号なし整数であれば、 0〜 の数値を扱える。

負の数を扱いたい場合には、最上位bitを符号を表すbitとして考え、 2の補数表現を用いる。2の補数表現は、引き算を足し算だけで扱える。

x = 10 で 8[bit]の場合
0000,1010 = 10 = x
+ 1111,0101 = (1の補数) ~x で表現
------------
1111,1111 = x + (~x) = 全bit1
+ 0000,0001 ← 1を加えたら
------------
1,0000,0000 = x + (~x) + 1 = 0 ただしN[bit]まで
よって、(~x) + 1 = -x 負の数の表現に便利

2の補数表現によるN[bit]の数の場合、 〜0〜 を扱うことができる。

この他に、2000年問題と、unix時間が1970年からの経過秒数で表現していることによる、 2038年問題を説明する。

WebサーバのCGI実行のトラブル。

5年の実験にて、CGIを使った処理が動かなくなったとの指摘があり、 あらためて、そのサーバの /var/log/apache2/error.log を確認。 すると以下の様なメッセージが残っていた。

Mon Apr 22 12:21:20 2013] [crit] [client xx.xx.xx.xx]
(13)Permission denied:
/home/xxxx/xxxx/public_html/.htaccess pcfg_openfile:
unable to check htaccess file, ensure it is readable

よく解らないので、"permission denied pcfg_openfile unable to check htaccess…"で検索すると、下記のページが見つかる。

http://d.hatena.ne.jp/memdhoi/20100425/1272195882

ポイントは、<Directory />…</Directory>で、 AllowOverride Allになっていて、 上位ディレクトリの .htaccess が読めないのが 原因みたい。上記サイトの例のように、AllowOverride None に 変更することで、無事動き出す。

今までは AllowOverride が yes の時に、.htaccess が無くても 動いていたものが、apacheのセキュリティ方針の変更の中で、 厳密に上位ディレクトリの .htaccess を確認するように なったみたい。

2013年4月21日(第317回)

  • まるよし Train Pops ~ 国語と遊ぼう! 第3便 「あいさつについて」
  • 新入生歓迎会について
  • 部内ロボコンについて

担当:前田勝(4EI)、松島(2C)、西(教員)

4/27(土)にネットワーク工事

4/27(土)に、総合情報処理センターにて、 仮想サーバ群のメンテナンス作業が行われます。 このため、下記の日程にて学外からWebなどの サービスが一時的に停止します。

学内でもWeb閲覧・メール送配信にも影響があります。

日時: 2013年4月27日(土) 10:00〜14:00
    (実質の停止時間は1時間程度と思われます)

学科サーバの対応

上記のネットワーク作業に伴い、ネットワーク監視ソフトnagiosも 停止させないと、復旧時に大量のメールが舞い込む。

ということで、自分が管理しているサーバ群で、

# echo "/etc/init.d/nagios3 stop"  | at 10:00 04/27/13
# echo "/etc/init.d/nagios3 start" | at 14:00 04/27/13

を実行しまくる。

アットウェア北野氏と創造工学演習

今年度は創造工学演習にて、OBの方の指導で、先端技術に触れてもらおうということで、アットウェアの北野氏に協力してもらっています。

1304191150_640x480.JPG