F1キーでヘルプファイルがないと怒られる

 ので、何とかしようと調べたら、キーバインド排除しようとのこと。

 参考は「MFC アクセラレータとF1キーのヘルプの抑制 」。

 アプリケーションクラス定義 CPP の上のほうにある Message Map から、F1キー(ID_HELP)のマップを排除する。

BEGIN_MESSAGE_MAP(MyApp, CWinApp)
	/* HELP なし	ON_COMMAND(ID_HELP, &CWinApp::OnHelp)	*/
END_MESSAGE_MAP()

 ちなみに Message Map そのものをなくしてしまうと、ビルドエラーが出る。

エラー 1 error LNK2001: 外部シンボル ""protected: virtual struct AFX_MSGMAP const * __thiscall MyApp::GetMessageMap(void)const " (?GetMessageMap@MyApp@@MBEPBUAFX_MSGMAP@@XZ)" は未解決です。

今年もズワイガニと1文字、チャリティー

 去年と同じカニを手配。

 先週、試食会をしたら、やはり身がパンパンに詰まってて、抜群にうまかった。凍ったまんまを流水解凍して、そのままいただく。鍋も美味。

 タラバにしよか、って話もあったんだが、今年は漁獲が悪く高価に過ぎるとのことだったので、例によって本ズワイ(紅じゃない)。

 12月18日13時より、場所は山王ココ商店街イベント会場。

 今年の売り上げは大田区姉妹都市?である宮城県東松島市に全額寄付とのこと。

 詳細は下記。

 東京大森・山王ココ商店街 - 12/16-18 ウィンターセール2011チャリティーイベント

RAID を組んでみる - SAPARAID-PCI

 7月に節電でお亡くなりになった基幹システムサーバ。

 復旧に当たって耐久性というか復旧性を上げようってことで、RAID を組むことに。

 当初はRAID 組んだサーバマシンをDELL に注文しようって話だったが、予算の関係で余ったマシンで再構築することになったので、玄人志向SAPARAID-PCI を購入して実装してみた。

マシン
DELL DIMENSION 8200
Kernel
Linux 2.6.35 gentoo r4

 とりまRAID ボードに同容量のHDD をぶっさして起動。起動画面で Ctrl-Z を3連打*1して、「手動」でミラーリング設定。ブートフラグはつけない。じゃないとなぜかうまくいかない。

 Gentoo インストールCD を入れて再起動。コマンド gentoo dodmraid 。

 インストールの手順はほぼ従来通り

 ただしデバイスが /dev/hda とか /dev/sda とかじゃなくて、/dev/mapper/* になる。このマシンでは /dev/mapper/via_cdfajgcjga ってのが、RAID ボードの認識。

fdisk /dev/mapper/via_cdfajgcjga

 デバイスのパスが特殊な以外は、いつもと同じようにパーティションを切れる。ちなみにこのとき、/dev/dm-0 とか /dev/dm-1 とか言うデバイスがあるが、これは dmraid 用のエイリアスみたいなものらしく、ここをいじるとおかしくなるので注意。

 パーティションを切ったらフォーマット。ここでもデバイス指定は /dev/mapper/* になる。

mkfs.ext2 /dev/mapper/via_cdfajgcjga1
mkfs.ext3 -b 1024 -i 1024 /dev/mapper/via_cdfajgcjga3
mkswap /dev/mapper/via_cdfajgcjga2

 ブロックサイズや inode の指定が上記みたいになるのは、これがサーバマシンだから。デフォルトのままでフォーマットすると、大抵 inode が枯渇する。

 続いてさくさくインストールを進めていくと、次の特記事項になるのは dmraid のインストール。これがないとインストールしたカーネルが dmraid を利用できない。

emerge -pv dmraid

 そしてカーネルコンパイル。一々が面倒なので genkernel 1択。dmraid を指定する。

genkernel --dmraid all

 /etc/fstab でも、上記のように /dev/mapper/* を指定。

/dev/mapper/via_cdfajgcjga1   /boot   ext2   noauto,noatime  1 2
/dev/mapper/via_cdfajgcjga2   none    swap   sw               0 0
/dev/mapper/via_cdfajgcjga3   /       ext2   defaults         0 1

 最後に GRUB の設定。カーネルオプションに dodmraid をつける。また grub-install がうまくいかないのでGRUB コンソールを立ち上げて、/dev/mapper/via_cdfajgcjga にちまちま設定していく。

 GRUB インストールが終わったら再起動。

 これでなにもかもうまくいくはずだった。

だが起動しない

 というかBIOSRAID ボードをbootable として認識しない。

 色々調べていくと、そもそもDELL に発注した際に RAID オプションを指定していないと、BIOS も対応していないものになるらしい。

 はははのは。

そもそも boot は RAID じゃなくてヨクネ?

 というわけで、お亡くなりになったマシンのHDD を挿して boot することに。

 サーバマシンというか Web サーバマシンなので、データは /var に集約されている。

 だから /var に RAID をマウントすればよい。boot やシステムファイルは hda で十分。

  1. インストールCD で起動。
  2. hda のルートパーティションを /mnt/gentoo にマウント
  3. RAID を適当にマウント
  4. hda の /var を RAID にまるっとコピー
  5. RAID アンマウント
  6. hda の /etc/fstab で /var に RAID をマウントするよう指定
  7. インストール時と同様に各種 boot/var/proc/dev をマウント
  8. chroot /mnt/gentoo /bin/bash
  9. dmraid をインストールして genkernel --dmraid all
  10. GRUBカーネルオプションに dodmraid を追加して、/dev/hda に再インストール

 所要2時間。問題なく起動して稼動して運用中。

 はじめっからこうしときゃよかった。

 boot 用のHDD が近々お亡くなりになる可能性もあるが、データはRAID で保護しているのでクリティカルではなかろう。基幹システムとはいえ3ヶ月止まってても問題なかった会社だし。

 gentoo のインストールだけなら1日もかからない。

参考文献

すけすけ。[http
//d.hatena.ne.jp/pideno/20080624/1214340620:title=GentooオンボードRAIDを使ってみる] : http://d.hatena.ne.jp/pideno/20080624/1214340620

 非常に助かりました。Special Thanks!

おまけ - tar でまるっとコピー

cd /mnt/gentoo/var
tar cf - . | (cd /mnt/gentoo/mnt/RAIDforVAR; tar vxf -)

*1:Please って言われた瞬間に3連打。それ以外の方法ではなぜか起動しない

Form Post の結果を素敵に表示

function formPreview(form) {
	var query = $(form).toQueryString();
	var facSubmit = new Request();
	facSubmit.onSuccess = function(responseText, responseXML) {
		SqueezeBox.initialize({size:{x:600,y:400}});
		SqueezeBox.setContent('string', responseText);
	}
	facSubmit.send({data:query, url: form.action});
}

 CMS(Joomla!)で書いてる途中の記事をLightBox 的にプレビューしたくて、色々調べた結果、mooforumに行き着いて真似してみた。

 ところが、IE で「modal.js: 種類が一致しません」とか意味が分からないエラーが出る。

 仕方ないのでソースを解析して自分なりに解決してみた。現時点での最新 IE/FF (Windows) で動作を確認。

 主な流れとしては、

  1. Ajax でフォームの内容を送信
  2. success イベントで結果を取得
  3. 取得した結果を、string ハンドラで SqueezeBox に渡す

 散々、悩まされた割にはシンプルな出来になった。

PHP5.3.3 のバグ? アクセス権がなにやらおかしい

class Hoge {
	protected $fuga = 'piyo';
	public function display() {
		echo $this->fuga;
	}
}

$hoge = new Hoge();
$hoge->display();

 上記のようなソースで結果が空になることがある。

 「ことがある」というのが重要で、そうなるクラスファイルとならないクラスファイルがある。

 一度発生すると、そのクラスでは発生しっぱなし。

 上記で display() を

$fuga = $this->fuga;
echo $fuga;

 ってすると、直ったりするし直らなかったりする。

 またあるファイルを修正すると、他のファイルでまた起こったり。

 コンパイルの問題か

 おれが何か間違ってるのか

節電、熱暴走の夏

 部品メーカーに納品した在庫管理システムが動かないと連絡を受けて見に行ったら、HDD がクラッシュしていた。

 非公開の内部システムなので、社内に設置したサーバマシンで運用していたのが仇に。

 節電、室温30度超。

 木金休み明け、土曜の昼下がり。

Graph API で改行を使えない?

 https://graph.facebook.com/me/feed へのPOST で、link/name/caption/description/picture を指定すると、リンクへの投稿となり、リンク先の説明を設定できる。

 このリンク先の説明となる description 内で改行を使いたいのだが、br も CRLF も利かない。

 ドキュメントを読み漁っても Line Break の説明は見当たらないし、Google で検索しても、「どうすればいいんだー!」って記事しか出てこない。

 どうしようもないんかなぁ。