シングルトン()笑

2010 年 6 月 18 日

会社でこんなソースを見かけた。所々端折ってるけど、処理の本質は抑えてある。

class Hoge
{
public:
    static Hoge *Instance;
    static Hoge *getInstance() { return Instance; }
 
    Hoge() {
        Instance = this;
    };
 
    void initialize() {
        if (Instance == 0) Instance = new Hoge;
    }
    (略)
};
 
// シングルトン
static Hoge hogeInstance;
 
void doSomething()
{
    hogeInstance::Instance->func();
}

見かけたというか、同じ仕組みのクラスがあっちこっちに散らばってた。念のために言っておく、コードはこれで間違いない。何度も見直したからねw

色々と突っ込みどころはあるけど、まず、シングルトンを想定してるのにコンストラクタがpublicって…。

いやいやいや、グループ会社内で(自称)一番技術力が高いと公言してるところの、仮にも俺より高給取りで優秀なプログラマが書いたコードだ。きっと俺なんぞには考えもつかない、深遠なる理由があるに違いない。

でも、色々と考えてみたけど、やっぱり何がしたいのか解らなかった。しかし、メンバ変数を触らないメンバ関数は、クラスの実体が無くても正常に呼べるって事は解った(実験済み)。つまり、上のクラスのinitialize()は期待通りの動作をする。これがC++の仕様の範疇かどうかは知らない。

静的メンバ関数がヌルポで呼び出せる(static_cast<Hoge*>(0)->staticFunc();)のは知ってたけど、メンバ関数も大丈夫だとはねぇ…。よーく考えてみれば、確かに呼べてもおかしくないはない感じはするが、やっぱり気持ち悪い。

DiskWarrior神

2009 年 9 月 17 日

Mac mini鯖に繋いでるデータ置き用HDDがぶっ壊れた。ディスクユーティリティで修復を試みるも「Bツリーが壊れてて直せない」的なエラーで修復不能だった。

「それでもTimeMachineなら・・・TimeMachineなら何とかしてくれる・・・!!」と思ってバックアップを除いてみたら、最新のバックアップは2009年7月2日とか言ってるの。え?何それ?バカなの?死ぬの?

fsckを直接叩いてみると、BAD SUPER BLOCK: MAGIC NUMBER WRONGだとかLOOK FOR ALTERNATE SUPERBLOCKS? [yn]とか言われ、代替ブロックを探すも見つからず、newfsを使った方法でもダメで、もはやお手上げ状態。

壊れたHDDにはそれほど重要なデータは入ってないから、もし本当にデータが飛んだとしてもそんなに痛くはない(夜のお供(自重汁)が減る程度で済むwある意味一大事ではある)が、諦めるのも何なのでDiskWarrior 4をポチった。

結果、いとも簡単に修復完了。1分も掛かってないんじゃなかろうか。

そんなわけでDiskWarriorは神。それに引き換えDrive Geniusは………買ってはみたものの、どうすんのよこれ………。

LeopardとXcodeでSubversion 1.6を使う

2009 年 8 月 12 日

MacPortsでSubversion 1.6を入れただけでは、Xcodeから上手く使えない(システム標準の1.4が使われてしまう模様)ので、使えるようにするメモ。

…と言っても、単にコマンドとライブラリを置き換えてるだけ。

Subversion 1.6のインストール

MacPortsから入れる。variantsは適当に。

sudo install subversion +bash_completion+mod_dav_svn+tools+unicode_path

/usr/binの関連コマンドの置き換え

cd /usr/bin
 
#一応前のコマンドを退避
sudo mkdir svn_old 
sudo mv svn* svn_old
sudo mv apr-1-config svn_old
sudo mv apu-1-config svn_old
 
sudo ln -s /opt/local/bin/svn* .
sudo ln -s /opt/local/bin/apr-1-config .
sudo ln -s /opt/local/bin/apu-1-config .

/usr/libの関連ライブラリの置き換え

元からあるシンボリックリンクは、可能な限りそのまま活用する方針で。

cd /usr/lib
sudo mkdir svn_old
sudo find . -regex ".*libsvn_.*-.*1\.0\.0\.0\..*" -exec mv {} svn_old \;
sudo mv libapr-1.0.2.7.dylib svn_old
sudo mv libaprutil-1.0.x.x.dylib svn_old # バージョン番号を失念してしまったので、適当に補完して下さい。
 
sudo find . -regex ".*libsvn_.*-.*1\.0\.0\.0\..*" -exec rm {} \;
sudo rm libapr*
 
sudo find /opt/local/lib -regex ".*libsvn_.*-.*1\.0\.0\.0\..*" -exec ln -s {} . \;
sudo ln -s /opt/local/lib/libapr-1.0.3.5.dylib .
sudo ln -s libapr-1.0.3.5.dylib libapr-1.dylib
sudo ln -s libapr-1.0.3.5.dylib libapr-1.0.dylib
sudo ln -s /opt/local/lib/libaprutil-1.0.3.7.dylib .
sudo ln -s libaprutil-1.0.3.7.dylib libaprutil-1.dylib
sudo ln -s libaprutil-1.0.3.7.dylib libaprutil-1.0.dylib

swingとかperl用のモジュールが足りてないような気がするけど、うちでは関係なさそうなので気にしてない。無いと困るって人は、上手い事対処して下さい。

SubversionのサーバとしてMac OS Xを使用し、svn+sshでアクセスする場合はサーバ側でも同様の置換を行う。