図形クラスと多重継承

すべて、Figure から派生 他の類似の図形,色が出てきたときに 同じ処理をなんども記述

class Figure {
public:
  virtual void draw() = 0 ;
} ;

class FigureBox : public Figure {
private:
  int width , height ;
public:
  FigureBox( int w , int h )
    : width( w ) ,
      height( h ) {}
  virtual void draw() {
    // 四角形を描く処理(実際には長い処理をイメージ)
  }
} ;

class FigureBoxColor: public Figure {
private:
  int width , height , color ;
public:
  FigureBoxColor( int w , int h , int c )
    :  width( w ) , height( h ) , color( c ) {}
  virtual void draw() {
    // 色を変える処理
    // 四角形を描く処理
  }
} ;

元のプログラムを極力活用する場合

色付き図形は、元図形から派生 色を処理する命令を加えるだけ。 FigureBox をうまく活用できる。 色の処理が共通化できていない。

class Figure {
public:
  virtual void draw() = 0 ;
} ;

class FigureBox : public Figure {
private:
  int width , height ;
public:
  FigureBox( int w , int h )
    : width( w ) , height( h ) {}
  virtual void draw() {
    // 四角形を描く処理
  }
} ;

class FigureBoxColor: public FigureBox {
private:
public:
  FigureBoxColor( int w , int h , int c )
    : FigureBox( w , h ) ,
      color( c ) {}
  virtual void draw() {
    // 色を変える処理
    FigureBox::draw() ;
  }
} ;

多重継承を使った場合

多重継承を使った場合 上の2つの例の問題を解決できている。

class Figure {
public:
  virtual void draw() = 0 ;
} ;

class Color {
private:
  int color ;
public:
  Color( int c )
    : color( c ) {}
  void set_color() {
    // 色を替える処理
  }
} ;

class FigureBox : public Figure {
private:
  int width , height ;
public:
  FigureBox( int w , int h )
    : width( w ) ,
      height( h ) {}
  virtual void draw() {
    // 四角形を描く処理
  }
} ;

class FigureBoxColor: public FigureBox , public Color {
private:
public:
  FigureBoxColor( int w , int h , int c )
    : FigureBox( w , h ) ,
      Color( c ) {}
  virtual void draw() {
    Color::set_color() ;
    FigureBox::draw() ;
  }
} ;

qmail-smtpdが動いていない

昨日、定例の作業ということで、サーバの更新をかけていたけど、 その余波なのか、緊急連絡システムのメール受信(qmail-smtpd)が動いていない。

最初、"ps ax | grep qmail" を実行したら、qmail 関連プロセスが動いていなかったので、 /etc/init.d/qmail を作成(systemdで起動されてるはずなんだけどなぁ...) それでも起動してくれないし、確認すると

  root@fnctemc:~/qmail# qmailctl stat
  /etc/service/qmail-send: up (pid 3925) 20 seconds
  /etc/service/qmail-send/log: up (pid 3937) 20 seconds
  /etc/service/qmail-smtpd: down 0 seconds, normally up, want up
  /etc/service/qmail-smtpd/log: up (pid 3942) 20 seconds
  /etc/service/qmail-verify: up (pid 3940) 20 seconds
  /etc/service/qmail-verify/log: up (pid 3943) 20 seconds
  messages in queue: 0
  messages in queue but not yet preprocessed: 0

qmail-smtpd が動いていない。"telnet localhost 25" も "Connection refused." 調べてみると、qmail-smtpd の使用メモリ量を制限している、部分でプロセス起動に失敗しているみたい。

(( /var/qmail/supervise/qmail-smtpd/run ))
- exec /usr/local/bin/softlimit -m 700000 \
+ exec /usr/local/bin/softlimit -m 2000000 \

ということで、"qmailctl restart" を実行して無事復旧。

wheezy が oldoldstable に

職場で運用している Linux サーバだけど、 よく使うサーバは基本的に testing を入れている。 日々の update で支障がでることもあるけど、 ボチボチ update をしていれば、stable の 代替わりが発生しても、特に大きな変更はでない。

だけど、安定運用が期待されるサーバは、stable を 使っているけど、メンテナンスが面倒だと、oldstable も 運用していた。

んで、先日、Debian 9.0 / stretch が、stable として 公開された。oldstable なサーバでは、たっぷりの更新が 表示された。ただ、近々に使う予定もあるので、動かないと 困るので、apt の設定を、oldoldstable(wheezy) に変更。

wheezy が oldold になっちゃったのか...

scikit-learn のメモ

本科4年のプログラミングの授業課題レポートの評価中。 結果表示のprintf()が、"\n"と"/n"のタイプミスの プログラムリストで提出してある。 そのくせ、実行結果は普通に改行されてる。 インデントもグダグダだし。

 printf( "%d %d/n" , x , y ) ;

タイプミスした古いバージョンで提出してしまった...とか 言い訳がありそうだけど、 こんなタイプミス2年ならあるかな...とは思うけど、4年だぞ。

自分で動かしていないのがミエミエ。

最後の設問で、プログラム作成時のトレードオフ関係にある3つを 答えさせ、その例を説明せよ....との問題で、 トレードオフ関係の3つとして、

  • 処理速度
  • メモリ使用量
  • わかりやすさ

をあげてくれるのは、過去問でもだしているから、ほぼ正解してくれる。

でも、説明の文章をみていると、処理速度の話に、 「処理の最適化」のネタを書いてくるのが目立つ。

コンパイラがやってくれるような最適化とか、 ループ展開とかすれば、処理が速くなる。 でも、情報構造論では、アルゴリズム(プログラムの考え方)の 議論をしている。

だから、最適化は「処理は速くなるけど、プログラムの考え方は同じ」 なので、処理速度の例にかかれても評価は低い。

適切なアルゴリズムを選べば、処理オーダが変化する。 適切な最適化では、処理オーダは変化しない。

可変長配列のサンプル

可変長サイズの配列の説明で malloc() + free() を解説。 名前と電話番号のデータベースを作ってもらう課題の時間とした。 (1)名前長,電話番号桁が可変、(2)データベースのサイズの配列が可変、(3)その両方が可変 という内容を、自分の理解度に応じてチャレンジしてもらう。

ただ、授業で見せた malloc の事例は、起動時点で配列サイズを入力してもらう方式で説明した。 しかし、現実のプログラムでは、それも不明なのが普通。

ということで、配列サイズが不足したら倍のサイズにコピー&拡大していく方式のサンプルを示す。

#include <stdio.h>
#include <stdlib.h>
// 配列のサイズを可変にするプログラム。                                         
// 開始時点で最大数も不明とする。                                               
int* array ;
int  asize ;
int  size = 0 ;

void init() {
  asize = 10 ;
  array = (int*)malloc( sizeof( int ) * asize ) ;
}

void append( int x ) {
  if ( array != NULL ) {
    if ( size >= asize ) {
      // 配列の大きさを2倍                                                      
      int* new_array = (int*)malloc(sizeof(int)*asize*2) ;
      if ( new_array != NULL ) {
        // 新しい配列にコピー                                                   
        for( int i = 0 ; i < asize ; i++ )
          new_array[ i ] = array[ i ] ;
        free( array ) ;
        array = new_array ;
        asize *= 2 ;
      }
    }
    array[ size ] = x ;
    size++ ;
  }
}

int main() {
  init() ;
  for( int i = 0 ; i < 100 ; i++ )
    append( i ) ;
  for( int i = 0 ; i < 100 ; i++ )
    printf( "%d\n" , array[ i ] ) ;
  return 0 ;
}

先週末の金曜に、情報処理学会北陸支部の運営会議が金沢大学角真キャンパスであり、福井高専代表として参加。

その時、講演会もあって、東北大 大関 真之先生による「機械学習入門 - 深層学習とスパースモデリング」を聞いてきた。 最初は(人のことどうこういえる人間ではないが)怪しさ満点と思っていたけど(これは最近の「機械学習」がトレンドワード(バズワード?)だからこその怪しいとの先入観を生んでいる)、進学塾講師経験もある方とのことで、数学的な背景を納得できるズバっとした表現で「これなら答え収束しそうだな」って感じで面白かった。

最後のまとめシート引用

機械学習という現代の魔法

  • 深層学習
    • 単純な繰り返しによる複雑な関数f(x)の近似
  • スーパースモデリング
    • Find x by sparsity(圧縮センシング)
    • Make x sparse(辞書学習)
  • L1ノルム
    • スパースな解を当てることができる。
    • 数学や統計物理による数理的保証がある。
  • ADMM(alternating direction of multiplier method)
    • 拡張ラグランジュ法による最適化手法
    • 複数のコスト関数があっても良い
  • 鍵は最適化問題
    • 量子アニーリングほか世界各国で最適化専門のマシン・チップが登場

その先生の著書をその場でAmazonポチったけど、数式のない本だった。(^_^;

今日のオブジェクト指向プログラミングの授業では、複素数を例題として、 オブジェクト指向のデータ隠蔽化・手続き隠蔽化といった話をする予定。 ついでに、お薦めはしないけど...演算子オーバーロードっちゅーのもあるよということで、 以下のコードも紹介しよう。

#include <stdio.h>

class Complex {
private:
  double re , im ;
public:
  // 基本コンストラクタ
  Complex( double r , double i )
    : re( r ) , im( i ) {}
  // 表示メソッド
  void print() {
    printf( "(%lf + j%lf)" , re , im ) ;
  }
  // フレンド関数(Complexのメソッドではないけど、re,imに触れる)
  friend Complex operator+( const Complex& a ,
                            const Complex& b ) {
    return Complex( a.re + b.re , a.im + b.im ) ;
  }
  friend Complex operator*( const Complex& a ,
                            const Complex& b ) {
    double r = a.re * b.re - a.im * b.im ;
    double i = a.re * b.im + a.im * b.re ;
    return Complex( r , i ) ;
  }
} ;

int main() {
  Complex a( 1 , 2 ) ;
  Complex b( 3 , 4 ) ;

  // 普通の変数の様に複素数の計算が書ける。
  Complex c = a + b * Complex( 2 , 0 ) ;
  c.print() ;
  return 0 ;
}

演算子のオーバーロードは、入出力にも使われていて、

#include <iostream>
using namespace std ;
int main() {
  cout << "Hello" << endl ;
}
class Complex {
  :
  friend ostream& operator<<( ostream& os,const Complex& z ) {
    return os << "(" << z.re << " + j" << z.im << ")" ;
  }
}
int main() {
  :
  cout << c << endl ;
  cout << ( Complex( 1 , 2 ) + Complex( 2 , 1 ) ) << endl ;
}

丹南地区向けに提供している緊急連絡システムで、 利用をしている学校より「一部メールが届いていない」 との連絡を受ける。

緊急連絡システムでは、qmail を使っているけど、 オンプレミスで動かしていたサーバの故障と共に、Azure に移行した。

DNSトラブル対応

この際に、qmail のインストールを行ったけど、 icloud.com のメールアドレスに届かないトラブルが発生した。 原因は、icloud のメールサーバの情報を DNS に問い合わせを する際に、512 byte 以上の情報を qmail が正しく処理できない のが原因であった。 そこで、qmail には、DNS のパッチ(qmail103-dns.patch)を適用して 導入している。

Spam 扱いを受けないように

でも、一部の利用者からメールが届かないといった報告があり、 以前に適用していた「短時間に大量のメールを送るとspamサーバ認定 をうける可能性」があることから、一定時間内に特定ドメインに 送るメールの最大数の設定 qmail-1.03-concurrencydomain.patch を適用した。(GW前)

それでも Spam 扱いを受けてしまった....

しかしながら、改めてGW 明けに、メールが届かない人がいる...との 連絡より、改めて状況を確認すると、qmail の LOG に、

 failure: Connected to xx.xx.xx.xx but sender was rejected.
   Remote host said: 550 5.7.1  Mail from IP xx.xx.xx.xx was
   rejected due to listing in Spamhaus PBL.
   For details please see
   http://www.spamhaus.org/query/bl?ip=xx.xx.xx.xx

といった記録が残っている。調べてみると、Spamhaus PBL (Spamhaus の Policy Block List) に xx.xx.0.0/16 にて迷惑メールサーバ に登録されているのが原因であった。Azure のサーバなので、 IP アドレス近隣で他のサーバが、大量メール送信なりで迷惑行為 があれば、その被害を受けた可能性も高い。

ということで、指定されたページより、解除請求を行った。

自分の IP アドレスと、メールアドレスを入力し、解除請求を 行い、メールにて送り返されてきた 5桁の番号を入力して、 請求完了。

効果がでたかどうかは、様子見だな。

2017/05/11 次の日に、状況確認ということで、" grep Spamhaus LOGFILE " を実行してみたけど、 前日は27件のメッセージがあったけど、今日は皆無。効果テキメンかな。\(^_^)/

2017年6月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

アーカイブ

Google

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。