区名投票

浜松の区名投票が実施されてますよ。アナタガータ。
http://www.city.hamamatsu.shizuoka.jp/dmc/kuwari/dai2/kumeitouhyou.htm

とりあえず e-mailで投票しといた。
A区 中央区
B区 遠州灘区
C区 東区
D区 浜北区
E区 浜名区
F区 湖北区
G区 秋葉区

C区が一番もめそうな予感。

Visual Studio 2005 移行時の注意

仕事で使ったほうがよいのかどうか判定するため、Hamanaの環境をVS2003からVS2005に移してみた。
コンパイルはほとんど一発で通ったが、ものすごい数の警告がでる。原因は strcpy() などのセキュアでない古い関数を使っているためで、親切に 「strcpy_s()使ったほうがいいじゃない?」と警告をだしてくれるからであった。
もちろん pragmaで表示しないようにもできるが、これには素直に従ったほうが良さそうなので、大部分はセキュアなバージョンに置き換えた。

で、VS2005移行時に一番危険だと思ったのは以下のコードがコンパイルはできるが、実行するとファイルのオープンに失敗してしまい、正しく動かなくなることだ。
int main() {
  std::ofstream ofs("日本語.txt", ios_base::out | ios_base::trunc);
  if (ofs.is_open()) {
    ofs << "OK";
  }
  return 0;
}
日本語のファイル名を ofstream::open()関数に渡すとアウトらしい。英語のファイル名だと問題ないのでかなり危険だ。
デバッガで追ってみると open()関数内部で マルチバイト文字列からワイド文字列への変換を行っているのだが、そこが正しく変換してくれないことが原因だった。
どうやら ofstream::open()関数の実装が変わり、VS2003ではマルチバイト文字列のまま扱っていたのが、VS2005ではワイド文字に変換してから扱うようになったため、変換がうまく動くようにロケールを設定してあげないといけないようだ。

てことで、open()を呼び出す前に setlocale(LC_ALL, "Japanese"); を呼び出してロケールを日本語に設定することでうまく動作するようになった。多言語対応のアプリケーションの場合は以下のようにシステム標準のロケールを設定するといいと思われる。
int main() {
  setlocale(LC_ALL, "");
  std::ofstream ofs("日本語.txt", ios_base::out | ios_base::trunc);
  if (ofs.is_open()) {
    ofs << "OK";
  }
  return 0;
}

もう1点動かしてみて初めて発覚した問題は time_t のサイズが32bit → 64bitに増えていることだ。 susieプラグインのインターフェースに time_t型の変数を含む構造体があるのだが、見事にここでコケていた。
time_t型をシリアライズしたり、他DLLに渡している場合は注意が必要だ。

忙しい

やっと、明日(というか今日)の出張用の資料の作成がオワタ\(^o^)/
これじゃ4時間ぐらいしか寝れんな。

それにしても、最近忙しい。仕事以外のことができん。月末までに所得税がらみで書類を税務署にださなきゃいけなかった気がするがぜんぜんやってないや。
忙しい理由は、メインの仕事の上に突発的な仕事がいくつか重なっているためなのだが、突発的&短期的な仕事(主にコーディング作業)をこなすのが結構楽しいのであまり苦ではなかったりする。
メインの仕事が規格の策定という慣れない作業で精神的にかなり疲れるので、コーディング作業の楽しいこと楽しいこと!

P.S.
そういや、今日Cマガジン休刊のお知らせの手紙がとどいていた。悲しいのう。

1/1