何で使用するのか不明だが、最近購入したグラフィックカード(玄人志向のRH2400PRO-LE256H、ATI RadeonHD2400PRO)にAudioデバイスがあり、こいつのインストールではまったのでメモします。
で、このHD2400PROのドライバページには何故かAudioデバイスドライバが無い。
結局、現時点(2008/08/01)では、
このページのXP Professional/Homeから ATI All-in-Wonder™ HD Drivers for Windows XP Professional/Home Editionのリンクをたどりドライバを入手した。
(ちなみに2003 Server 64Bit Editionもこのドライバでいけた)
何時もは技術的な話題を中心にしていますが、最近あまり技術ネタがないので違ったネタを
こんな記事を見つけました。
意識調査:“モンスター”は身近に存在、2人に1人が遭遇。5人に1人は身内にも?<意識調査>モンスターに関する意識調査 ブロガー向け情報サイト「ブロッチ」などネットマーケティングを展開する株式会社アイシェアは同社が提供するサービス会員をパネ・・・
≫続き[
ブロッチ.jp]
最近流行りのモンスター○○ですが、私の身近であったモンスターを紹介します。
私の勤めている会社は小さな旅行会社です。
インターネットの旅行会社と言えばオンラインで航空券を買ったりホテルを予約したりというイメージがあるかと思いますが、
弊社の場合、コーディネーターが「飛行機は何で、ホテルは何で、列車は何で・・・」と1つ1つ旅程を組みながら旅の手配を行います。詳しくは
こちらを見ていただくとしてまぁ要するに、お客さんが「ベルリンとパリとミラノを回りたい!」なんていいますと「ではこのような旅程でどうですか?」と提案をするのが他社との大きな違いになります。
で、このようなお客がいました。
はじめまして。
海外旅行初心者の新婚夫婦の新婚旅行です。
御社のHPの「お客様からのメール」を読み、
とても真剣に考えていただけそうだったので、
見積もりを依頼させていただきました。
上記の挨拶と共に、色々旅程の案を送信したのですが、そこはまぁ素人が考えることですので、実現性がありません。そこで、コーディネーターが4案程プランを作成し送信したところ下記の返信がありました。
提案して下さったプランCが目から鱗でした!
プランCを元に本日いろいろ調べ、考えた事を
報告させていただきます。
その後、航空機会社を何処にするかとかやり取りをしていたのですが、航空機会社から料金表が出ない為、何処にするか色々やりとりがありましたがその後に、
妻が不整脈の為、キャンセルします。
と連絡がありました。
本件ですが、メールでのやり取りの為、まだ正式な予約に至っていなかったので、(弊社の場合、航空券を仮押さえした後に正式な予約に入ります。)コーディネーターは「奥様が元気になられたらまたお声がけ下さい」と気を利かせてキャンセル料を頂きませんでした。
ところがこのお客さん他の旅行会社で予約をしていたんです。しかもコーディネーターが作成したアイデア(旅程)はそのままで
どういうつもりで他の旅行会社に申し込んだのか定かでないし(不整脈とウソをついているので)、コーディネーターが一生懸命考えた旅程を盗むのはマナー違反です。
今ひとつ、モンスターぶりが解らないかもしれませんが、弊社の場合、コーディネーターが旅程を考えて手配しているので、非常に手間がかかります。その旅程案だけが欲しいのならそのように言って頂ければ手数料を頂戴していました。ただ、今回は不慮の事故ということで、手数料を頂戴しませんでしたが、それはウソによるものです。このようなことを詐欺であると私は認識していますが、いやはや、インターネットの恐ろしさというかモンスターの恐ろしさを痛感しました。
ちなみに、なぜ他の旅行会社で予約したのか解るのか?というのは内緒です。
C++/STLで、ついついやってしまうミスに、コンテナの要素への参照を保存するがある。
最近、このミスをやってしまったので覚書にしておく。
要するに、コンテナに値を追加・削除するとイテレーターが無効になる、と同じことなのだが、参照だとついついやってしまいます。
ちなみに、このバグはコンテナの領域が再配置されない限り発生しないので、reserveメソッドを使用して適当な領域を確保するとデバッグが困難になるので、マジで注意が必要です。
以下、バグの再現コードです。
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
vector<int> array1;
array1.reserve(10);
for ( int i = 0; i < array1.capacity(); i++ ) {
array1.push_back(i);
}
int &last_value = array1.back(); // コンテナの要素の参照を得る
cout << "last_value: " << last_value << endl;
array1.push_back(10); // ここでlast_valueは無効になる
cout << "last_value: " << last_value << endl;
return 0;
}
実行結果
VC++ .NET 2003 / WINDOWS XP Professional 64 bit edition(32ビット環境で作成・実行)
last_value: 9
last_value: -572662307
C++の例外も、やはり避けて通っていたのだが、ちょっと調べて見ることにした。
以下、Visual C++ .NET 2003の調査結果の覚書。
例外をcatchしないとどうなるか?
例外をcatchしないとVC++.NET2003(おそらくそれ以降でも)
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
と出る。デバッグ版のライブラリをリンクしていると上記メッセージの前にダイアログが出てそのままデバッグできる。
C++の例外ってどういったものがあるか?
bad_alloc new演算子等でメモリを確保できないときに発生。vector等のコンテナでもメモリ確保に失敗すると発生する。
bad_cast dynamic_castキャストに失敗したときに発生、参照型で発生する。ポインタ型では発生しない。ポインタ型のキャストに失敗すると0(ヌルポインタ)が返る。
bad_typeid typeid演算子で無効なオブジェクトを渡すと発生する。
bad_exception 例外仕様に反した例外が発生した場合、プログラムは強制終了(terminateの呼び出し)されるが、bad_exceptionに変換する作法(?)がある。VC++ .NET 2003では正常に変換できなかった。
logic_error プログラムの論理エラー(回避可能なエラー)、以下のエラーの親(スーパークラス)になっている。
- domain_error 領域エラー、VC++.NET 2003のSTLでこのエラーがスローされることはない模様。
- invalid_argument 不正な引数、bitsetの初期化エラーでスローされる。
- length_error 長さエラー、コンテナ(vector,deque,list,string等)でmax_size以上の領域を確保(reserve,insert)しようとしたら発生。max_sizeメソッドは各コンテナで扱うことの出来る要素の最大数を指す、実際に確保できるサイズはこの値未満になる。
- out_of_range 範囲外、コンテナ(vector,deque等)のatメソッドの範囲チェックに引っかかった。
runtime_error 実行時エラーの総称、localeクラスのcombineテンプレートメソッドでスローされる。以下のエラーの親になっている。
- underflow_error アンダーフロー、VC++.NET 2003のSTLでこのエラーがスローされることはない模様。
- overflow_error オーバーフロー、bitsetのto_ulongメソッドでスローされる。
- range_error 範囲エラー、VC++.NET 2003のSTLでこのエラーがスローされることはない模様。
- ios_base::failure iostream関連の例外、basic_ios::exceptionsメソッドにより例外の発生をコントロールできる。
例外のサンプルコード
以下、各例外を検証するコードです。
#include <iostream>
#include <string>
#include <new>
#include <eh.h>
using namespace std;
/**********************************************************************
bad_alloc
**********************************************************************/
int test_bad_alloc()
{
int ret = 0;
try {
int *ptr = new int[511*1024*1024UL];
if ( ptr == 0 ) {
ret = 1;
}
} catch ( bad_alloc e) {
ret = 2;
} catch ( ... ) {
ret = 3;
}
return ret;
}
/**********************************************************************
bad_cast
VC 2003 ランタイム型情報を有効にしないとコンパイルできない
**********************************************************************/
class base_class {
public:
virtual void vfunc() const {}
};
class child_class: public base_class {
public:
virtual void virtualfunc() const {}
};
int test_bad_cast_ref()
{
int ret = 0;
base_class base;
base_class &ref_base = base;
try {
child_class& ref_child = dynamic_cast<child_class&>(ref_base);
ret = 1;
} catch (bad_cast) {
ret = 2;
} catch ( ... ) {
ret = 3;
}
return ret;
}
int test_bad_cast_ptr()
{
int ret = 0;
base_class base;
base_class *ref_base = &base;
try {
child_class *ref_child = dynamic_cast<child_class*>(ref_base);
ret = 1;
} catch (bad_cast) {
ret = 2;
} catch ( ... ) {
ret = 3;
}
return ret;
}
int test_bad_typeid()
{
int ret = 0;
base_class *b = 0;
try {
const type_info &t = typeid(*b);
cout << t.name();
ret = 1;
} catch ( bad_typeid ) {
ret = 2;
}
return ret;
}
/**********************************************************************
bad_exception
**********************************************************************/
void func() throw()
{
// warning C4297が出る(わざと例外仕様に反した例外を出す)。
throw "bad_exception!";
}
void convert_unexpected()
{
throw ;
}
int test_bad_exception()
{
int ret = 0;
// VC++ .NET 2003 SP1 で最適化を掛けるとconvert_unexpected関数が呼ばれない
// VC++ .NET 2008 Express Edition でも同様
unexpected_function back = set_unexpected(convert_unexpected);
try {
func();
ret = 1;
} catch ( char * ) {
ret = 2;
} catch ( bad_exception ) {
ret = 3;
} catch ( ... ) {
ret = 4;
}
set_unexpected(back);
return ret;
}
/**********************************************************************
null pointer assigment
**********************************************************************/
int test_null_pointer_assigment()
{
int ret = 0;
// VC++ .NET 2003 SP1 で最適化を掛けるとcatch(...)に行かない。
// _set_se_translatorを使って構造化例外処理からC++例外処理へ
// 例外をコンバートできる
try {
char *ptr = 0;
*ptr = '\a';
ret = 1;
} catch ( ... ) {
ret = 3;
}
return ret;
}
int main(int argc, char* argv[])
{
cout << "test_bad_alloc:" << test_bad_alloc() << endl;
cout << "test_bad_cast_ref:" << test_bad_cast_ref() << endl;
cout << "test_bad_cast_ptr:" << test_bad_cast_ptr() << endl;
cout << "test_bad_typeid:" << test_bad_typeid() << endl;
cout << "test_bad_exception:" << test_bad_exception() << endl;
cout << "test_null_pointer_assigment:" << test_null_pointer_assigment() << endl;
return 0;
}
コンパイル、実行結果
C:\>cl /GR /GX cpp_exception.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.6030 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
cpp_exception.cpp
cpp_exception.cpp(98) : warning C4297: 'func' : 例外をスローしないはずだがそれを
する関数。
__declspec(nothrow) または throw() が関数で指定されました。
Microsoft (R) Incremental Linker Version 7.10.6030
Copyright (C) Microsoft Corporation. All rights reserved.
/out:cpp_exception.exe
cpp_exception.obj
C:\>cpp_exception
test_bad_alloc:2
test_bad_cast_ref:2
test_bad_cast_ptr:1
test_bad_typeid:2
test_bad_exception:2
test_null_pointer_assigment:3
手前味噌で恐縮ですが、書籍「はじめてのVine Linuxサーバ」が工学社さんから出版されました。
書籍紹介ページ
私にとってもはじめての書籍ということで大分気合が入りまして、執筆活動は1年と2ヶ月程、続きました。
何はともあれ無事に出版できて感無量です。
4/22追記
サポートページを作成しました。