etch は archive.debian.org に

今更etchつかわなくても・・・って話ではあるんだけど、etchな環境があって、apt-get update したら、

# apt-get update                        
Ign http://ftp.jp.debian.org etch Release.gpg                                  
Ign http://ftp.jp.debian.org etch Release                                      
Ign http://ftp.jp.debian.org etch/main Packages/DiffIndex
Ign http://ftp.jp.debian.org etch/contrib Packages/DiffIndex
Ign http://ftp.jp.debian.org etch/non-free Packages/DiffIndex
Ign http://ftp.jp.debian.org etch/main Sources/DiffIndex     
Ign http://ftp.jp.debian.org etch/contrib Sources/DiffIndex  
Ign http://ftp.jp.debian.org etch/non-free Sources/DiffIndex 
Err http://ftp.jp.debian.org etch/main Packages              
  404 Not Found [IP: 130.54.59.159 80]
Err http://ftp.jp.debian.org etch/contrib Packages           
  404 Not Found [IP: 130.54.59.159 80]
Err http://ftp.jp.debian.org etch/non-free Packages          
  404 Not Found [IP: 130.54.59.159 80]
Err http://ftp.jp.debian.org etch/main Sources               
  404 Not Found [IP: 130.54.59.159 80]
Err http://ftp.jp.debian.org etch/contrib Sources            
  404 Not Found [IP: 130.54.59.159 80]
Err http://ftp.jp.debian.org etch/non-free Sources           
  404 Not Found [IP: 130.54.59.159 80]
Failed to fetch http://ftp.jp.debian.org/debian/dists/etch/main/binary-i386/Packages.gz  404 Not Found [IP: 130.54.59.159 80]
Failed to fetch http://ftp.jp.debian.org/debian/dists/etch/contrib/binary-i386/Packages.gz  404 Not Found [IP: 130.54.59.159 80]
Failed to fetch http://ftp.jp.debian.org/debian/dists/etch/non-free/binary-i386/Packages.gz  404 Not Found [IP: 130.54.59.159 80]
Failed to fetch http://ftp.jp.debian.org/debian/dists/etch/main/source/Sources.gz  404 Not Found [IP: 130.54.59.159 80]
Failed to fetch http://ftp.jp.debian.org/debian/dists/etch/contrib/source/Sources.gz  404 Not Found [IP: 130.54.59.159 80]
Failed to fetch http://ftp.jp.debian.org/debian/dists/etch/non-free/source/Sources.gz  404 Not Found [IP: 130.54.59.159 80]
Reading package lists... Done
E: Some index files failed to download, they have been ignored, or old ones used instead.

的な感じでエラーになりまくった。

どうやら、もうetchな時代じゃないってことで、パッケージが移動しちゃったみたい。てことで /etc/apt/sources.list を ftp.jp.debian.org から、 archive.debian.org に変更。

# etch
#
deb     http://archive.debian.org/debian/     etch main contrib non-free
deb-src http://archive.debian.org/debian/     etch main contrib non-free


もうlennyにしろってことですよねー

aptitude のインタラクティブな質問に自動でYって答える(confnewの選択)

% sudo apt-get -y install hoge

とかでなんとかなるやつなら良いけど、たとえば、

Configuration file `/etc/hoge.conf'
 ==> File on system created by you or by a script.
 ==> File also in package provided by package maintainer.   
What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : background this process to examine the situation
 The default action is to keep your current version.
*** hoge.conf (Y/I/N/O/D/Z) [default=N] ? 

みたいなダイアログで、 デフォルトで new の方になってくれない+ Y って答えてくれない場合があって、自動化でなんちゃらやるスクリプトとか書いて実行してるとそこで止まって悲しい。

そういうときは、apt-get とかで

% sudo apt-get -y --force-yes -o Dpkg::Options::=--force-confnew install hoge

とか。Dpkg::Options をつける。


まあ、よく分からないパッケージをインストールするときは注意が必要だけど、設定ファイルとかもろもろパッケージ化したりして管理してる場合には役に立つかも。

C++ で継承したときにサブクラスのメンバ関数を呼ぶためには virtual をつけて仮想関数にする

いや,このネタは半年くらい前に学んだ話の超初歩だと思うんですけど.
C++ で Factory Method について書こうと思ったときに,とりあえずここからまとめておこうかと.

ようするに,A というクラスを継承した B や C があって,そいつらを使うときには,型 A で変数を宣言するとします.そして,そのときに A に存在するメンバ関数を B などでオーバーライドしたい場合.同じ名前のメンバ関数を作ればオーバーライドされるわけではなくて,仮想関数として明示的に宣言してあげなきゃだめ.

#include <iostream>

using namespace std;

class Hoge {
public:
  Hoge() {} 
  ~Hoge() {}
  void Hello() {}
};

class Fuga : public Hoge {
public:
  Fuga() {}
  ~Fuga() {}
  void Hello() { cout << "Hello" << endl; }
};

int main()
{
  Hoge *a = new Fuga();
  a->Hello();
  delete a;
}

としたときに,これでは実は a の Hello は Hoge のほうだけ見てちゃってて,Fuga の Hello が呼ばれない.
なので,Hogeの定義を

class Hoge {
public:
  Hoge() {}
  ~Hoge() {}
  virtual void Hello() {}
};

としてあげるといい.

あ,どういう原理(内部的に)でこうなるんだっけ.関数のバインドが実行時だから実行時にサブクラスへのポインタを保持するかみたいなテーブルがあるんだっけ.わすれた.あとで調べ...る?

あと,サブクラスのインスタンス化をしたときに,基底クラスのコンストラクタを呼ぶようにするには,

class Fuga : public Hoge {
public:
  Fuga() : Hoge() {}
  ~Fuga(){}
  void Hello() { cout << "Hello" << endl; }
};

としなきゃだめとか.

C++は色々あるよね.いや,というよりも,ある意味基底クラスの作成者の想定したメンバ関数しかオーバーライドできないってことですね.他のオブジェクト指向言語だと,なんだろ,基本的にはオーバーライド可能で,サブクラスでオーバーライドさせたくない場合には final つけるとか.そんなかんじかなあ.どっちがいいんだか?

リソース管理

リソースを開放するコードを直接書かなければならないなら(つまり,リソース管理オブジェクト以外の場所にdelete文を書かなければならないなら),何かが間違っている

Effectove C++ 第3版 p64. リソース管理

あとでもう一度読む.


Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

memusage コマンド

実行するプログラムのメモリ使用量を,

Memory usage summary: heap total: 7976, heap peak: 3352, stack peak: 912
         total calls   total memory   failed calls
 malloc|        361           7976              0
realloc|          0              0              0  (nomove:0, dec:0, free:0)
 calloc|          0              0              0
   free|        361           7976
Histogram for block sizes:
    0-15             97  26% ===================
   16-31            250  69% ==================================================
   32-47              4   1%
   64-79              2  <1%
  128-143             4   1%
  256-271             2  <1%
  352-367             2  <1%

こんな感じで見ることができるハイパー便利デバッグ用コマンド memusage ですが,なんかどっかで使ったはずなのに,今のUbuntu環境に入ってなくて,入れ方もわからなくて(gmemusageはaptitudeにあるんだけど),前どの環境で使ったのかも全く思い出せなかったから探してたら,glibcのパッケージに入ってるらしい?うーん,でもパッケージからのいれかたがわからないなあ.

とりあえず,

を参考にして,

から取得してきて ~/bin に入れといた.