Archive for the ‘Linux’ Category

windows7 を買ったので XP Mode をつかって coLinux を動かしてみました。

環境
windows7 Professional 64bit
coLinux 0.7.4.1

XP Mode を起動して、 coLinux をインストールします。
XP Mode のネットワーク設定は NAT です。さらに coLinux も XP との NAT を設定します。
関係としてはこんな感じ

windows7(host) –NAT– WindowsXP : XP Mode(client&host) –NAT– coLinux(client)

まず最初にやったのが、ブート用のイメージを windows7 上のGドライブに配置して起動してみました。
XP Mode では windows7 のドライブを共有設定していて、\\tsclient\ドライブレター でアクセスできます。
下記のようにコンフィグを修正して起動しました。

kernel=”c:\Program Files\coLinux\vmlinux”

cobd0=”\\tsclient\G\Linux\img\ubuntu4gb.img”
cobd1=”\\tsclient\G\Linux\img\ubuntu-swap.img”
cobd2=”\\tsclient\G\Linux\img\work.img”

root=/dev/cobd0
ro
initrd=”c:\Program Files\coLinux\initrd.gz”
eth0=tuntap, “TAP”

これは失敗。

ext3_get_inode_loc: unable to read inode block

と出てうまく動きませんでした。
今まで問題なく動いてたものなので、イメージが破損しているということはないです。

ネットワーク上のイメージでは駄目なようです。
イメージをXPの仮想ディスク(Cドライブ)にコピーして、コンフィグを書き換えて試してみました。

kernel=”c:\Program Files\coLinux\vmlinux”

cobd0=”c:\Linux\img\ubuntu4gb.img”
cobd1=”c:\Linux\img\ubuntu-swap.img”
cobd2=”c:\Linux\img\work.img”

root=/dev/cobd0
ro
initrd=”c:\Program Files\coLinux\initrd.gz”
eth0=tuntap, “TAP”

これで問題なく動作しました。
イメージはXP側に配置しなければならないようです。

>andLinux is a complete Ubuntu Linux system running seamlessly in Windows 2000 based systems (2000, XP, 2003, Vista; 32-bit versions only).

coLinux がダメなので、coLinux + x な andLinux も vista 64bit 環境では動かないですよね。
うーむ、vista 64bit で動かすにはもはや vm しかないかなぁ。。
今まで windows 側のドライブをマウントして利用していたから何とか使いたいんだけど。

coLinux にubuntuを入れて使っているのだけど、samba を使ってファイルをコピーしていたらディスクが足りないよと警告された。
確かに、システム的な領域は 4G しか確保してないけど、そんなに使った覚えはないぞ。
ってことで、ディスクの容量食ってる箇所を探し始めました(AM2:00)

du -k /lib/
du -k /var/

などしていて、/var/cache/apt/archives/ が犯人だということまで発見。
aptのキャッシュに2Gとか使ってるYO!ちょっと使いすぎDAYO!!

apt-get autoclean

これで、すっきり。ふぅ、やれやれ。。

会社のマシンが新しくなって、環境移行していたのです。
んで、全データを移動して古いマシンはフォーマットされるために連れて行かれました。
ここまでが先日までの話。

で、今日は coLinux を入れるかと思って移動してきたデータを漁っていました。
おや、見つからないなぁー。オヤ、アレ、オカシイナァ・・・
データがナイィィー。察してくだしい。。

作業データは別に残っていたんだけど、coLinux の環境を再構築するようだ orz

昨日書いたエントリ(DirectInput を使うとレジストリ登録される)の原因がわかりました。

DirectInput の初期化の際に、 DirectInput8Create 関数を呼び出すことでレジストリにキーが登録されるようです。
つまり下記のような初期化方法ではレジストリにキーが登録されます。

C++:
  1. HINSTANCE hInstance = ::GetModuleHandle(NULL);
  2. LPDIRECTINPUT8 pDirectInput = NULL;
  3. HRESULT hr = ::DirectInput8Create(hInstance,
  4.                                   DIRECTINPUT_VERSION,
  5.                                   IID_IDirectInput8,
  6.                                   (void **)&pDirectInput,
  7.                                   NULL);
  8. if (FAILED(hr)) {
  9.     //エラー処理
  10. }

ではどうするかというと、下記のような方法で初期化します。

C++:
  1. HINSTANCE hInstance = ::GetModuleHandle(NULL);
  2. LPDIRECTINPUT8 pDirectInput = NULL;
  3.  
  4. HRESULT hr = ::CoCreateInstance(CLSID_DirectInput8,
  5.                                 NULL,
  6.                                 CLSCTX_ALL,
  7.                                 IID_IDirectInput8,
  8.                                 (void **)&pDirectInput);
  9. if (FAILED(hr)) {
  10.     // エラー処理
  11. }
  12.  
  13. hr = pDirectInput->Initialize(hInstance, DIRECTINPUT_VERSION);
  14. if (FAILED(hr)) {
  15.     // エラー処理
  16. }

DirectInput8Create 関数では内部で上記と同じ処理をしているのでしょうが、そのときレジストリに登録する処理を行っているのでしょう。
レジストリにキーが登録されて困っている人は、COMからインスタンス作成&初期化で試してみてください。

家の coLinux(ubuntu 8.10) にmysql と phpMyAdmin を入れました。

特に問題も起きなかったのでメモすることもないのですが。
こちらのwiki を参考にしました。

apache のコンフィグを多少いじりました。
phpMyAdmin を /var/www/phpmyadmin/ に置いたので、下記のように Alias を登録します。

Alias /phpmyadmin/ "/var/www/phpmyadmin/"

これでブラウザで http://ip-address/phpmyadmin/ でアクセスできます。ip-addres でなく
名前で解決してもいいですね。
phpMyAdmin があれば、DB 関係の操作はほとんど行えます。このツール最強だよ。

さて、このDBを何に使うかが問題だなw

Seasons 氏のブログで書かれていますが、Visual C++ 2003, 2005, 2008 で言語仕様がそれぞれ微妙に変化(進化?)してますよね。
# C99対応はまだですが。可変長配列使いたいな

2003 では、

C++:
  1. class Hoge{
  2.     static void f();
  3.     static int v;
  4.     static const int VALUE = 100;
  5.  
  6.     int array_[VALUE];
  7. };
  8.  
  9. int main(int argc, char** argv)
  10. {
  11.     return 0;
  12. }

が許されていませんでした。(定義ないでしょ?ってコンパイラに言われた気がします)
なので、プログラマは enum ハックを使って配列の添え字としたりしていたのです。
ちなみに上記のソースは 2005 と 2008 では普通にコンパイルが通ります。

要するに、言いたいのは

static const int VALUE = 100; のように書くことで定数定義もできる。(2003以前では enum { VALUE = 100 }; のようにしてました)
これは知ってた。

class 宣言で static な変数やら関数を書いたら、定義しなければならないと思っていたが、利用しない場合、定義は必要ない。
こっちは知らなかった。

# あー、2003で確認したいなぁ。会社のPCで試してみるかな。

表題の通りです。
Qt では基本的にメッセージ処理を気にせず実装できるようになっとります。(隠されてます)
ですが、メッセージ処理を行いたい場面は多々あります。(通信関係とかDirectShow を使ったりとか)

ってことで、軽くまとめておきます。
自分の環境は下記
OS : Windows Vista Ultimate SP1 32bit
Qt : 4.4RC (Open Source)
VS : 2008 Standard

ってことでさくっとやっちゃいます。
Qt で メッセージを取得するのは QWidget::winEvent です。
こいつを再実装することで実現します。

C++:
  1. bool Window::winEvent(MSG* message, long* result)
  2. {
  3.     using namespace std;
  4.  
  5.     switch (message->message) {
  6.     case WM_KEYDOWN:
  7.         cout <<"push!!" <<endl;
  8.         *result = 0;
  9.         return true;
  10.     };
  11.  
  12.     return false;
  13. }

とりあえず、キーボードのキーが押されたら push!! と表示します。
戻り値に関しては、true を返すと Qt のメッセージ処理を行いません。
false を返すと、Qt のメッセージ処理も行われます。

MSG構造体(WinUser.hにて定義)に wparam, lparam も入っているので普通にメッセージ処理ができると思います。

sudo do-release-upgrade --devel-release

これだけ。途中の質問には各自対応しましょう。

XP のときに使っていた coLinux を Vista に運んできたのですが動きませんでした。
最新版の coLinux0.72 では Vista対応していたのでそのへんのメモ。
単なる移行作業ですので、はじめからインストールしたい人向けの話じゃないです。
あと、coLinux0.7.2 でカーネルが更新されているのが良いですね。

ネットワークをブリッジで接続する。
Vista たんではどうやるかわからなかったので、google 先生に教わりました → ここ
これで TAP の準備完了。

次に設定ファイルですが、 XML 形式をやめている点が異なりますね。
以前のXML形式を見ながら、自分の記述した内容は以下。

HTML:
  1. kernel=vmlinux
  2.  
  3. cobd0="e:\Linux\img\ubuntu4gb.img"
  4. cobd1="e:\Linux\img\ubuntu-swap.img"
  5.  
  6. cofs0="c:\"
  7. cofs1="d:\"
  8. cofs2="e:\"
  9.  
  10. root=/dev/cobd0
  11. ro
  12. initrd=initrd.gz
  13. eth0=tuntap, "TAP"

XML のとほとんど変わってません。書き方が違うだけ。
この記述の方がすっきりしていて良いですな。

これを config.ini のような名前で保存し

colinux-daemon.exe "@config.ini"

で起動します。
これで Vista への移行完了であります。