ysflight.com

2013/11/10 ディスククラッシュ!

我が2008年後期MacBook Proのハードディスクを交換しようと思ったら、GCCが使えなくなったでござる。

 と、言っても、YSFLIGHTその他のコードはすべて多重にバックアップしてあって、しかも、過去数ヶ月分は月ごとにコピーがあるから、何か失くして困ったということはない。壊れ始めたのは、うちで主力で使ってる2008年後期モデルのMacBook Proの内蔵ドライブだ。

壊れ始めた、というのも実は正しくない。このドライブは、買った直後から調子が悪かった。もともとは、作業用ドライブとして使う予定だった。重要なファイルを入れておくドライブは、毎年更新している。ところが、このドライブ、使い始めて数日で、ファイルが壊れる問題が発生し始めた。し始めたというより、最初からこの現象が起きていたんだと思う。あるとき、何かのプログラムをコンパイルしようと思ったら、妙ちくりんなエラーが出て、何事かと思ってファイルを開いてみたら、元のソースファイルは跡形も無く、へんてこな文字の羅列になっていた。

このドライブが困ったのは、エラーも出さずに内容が書き換わってしまうという点だった。エラーが出てくれれば、何か起きたとわかるから、バックアップから復元なりすればいい。ところが、エラーが出ないもんだから、そのファイルを使わない限り、ファイルが壊れたということに気づかない。このまま使い続けると、しばらくすると、壊れたファイルでバックアップも上書きしてしまって、復元が難しくなる。

僕は、作業用ドライブは外付けにしているので(火事になったら引っこ抜いて逃げればいいように)、ひょっとすると、ハードディスクケースとの相性かと思った。試しに、違う外付けケースもいくつか使ってみたものの、やっぱり数日に一度ファイルが壊れる。しかも、エラーを出さない。

つまり、状況はこうだった。このハードディスク内のファイルは、開いてみるまで、正常であるか、壊れているかがわからない。あたかも、ハードディスク内のファイルは、正常であり、同時に壊れている。まさに、シュレディンガーの猫。量子論で言うところの、不確定性原理である。(違うけど)。物理学勉強するのは趣味だけど、ハードディスク内で猫が発生されるのは困る。

返品交換ということも考えたけど、エラーが出ないんだから、わかってくれるだろうか。サポートエンジニアが検査したとして、数日使わなければファイルは壊れないわけだから、調べている間に内容は壊れないかもしれない。しかも、エラーも出ない。交換拒否されるか、同じドライブをそのまま送り返されるという可能性もある。そういう押し問答に使う時間がもったいない。

ひょっとして、外付けにすること自体が悪いのか、と、思って、試しにMacBook Proの内蔵ドライブとして使ってみることにした。このときは、システムをゼロから入れなおしたんだけど、そうしてみたら、案外安定して動き出した。数ギガバイトのファイル、例えばXCodeとかダウンロードすると数バイトが壊れているという問題はあったけど、概ね安定して動作して、約一年が経過した。

 ところが、数日前、今度はバーチャルボックスのバーチャルマシンが壊れた。多分、ハードディスクイメージファイルのどこかが例の現象で破損したんだと思う。もちろん、バーチャルマシン自体は別の場所にバックアップがあって無事なんだけど、もう無理、限界、と、思って、ドライブを更新することにした。

もうすぐ感謝祭後の特価セールがあるはずだから、更新用ディスクを買うのはそのときを待つとして、またシステムをゼロから再インストールするのが面倒だから、バックアップを取ることにした。Mac OSXのバックアップはTime Machineを使えば済む。問題は、BootcampのWindows 7パーティションのバックアップだった。検索するとわかるんだけど、みんな困っている。普通のWindows用のバックアップツールを使うと、バックアップを取ったつもりが、復元ができないという悲劇が起こるらしい。

この問題をなんとかするには、WinCloneなるバックアップソフトを使うといいらしい。これを使うと、Mac OSXを起動して、そこから、バックアップイメージが作れるらしい。そこで、試しにダウンロードして、インストールしようと思ったら、なぜかできない。よくよく読んだら最新バージョンWinClone 4は、Mac OSX 10.7 Lion以降のみ対応だった。僕が使ってたのは、Mac OSX 10.6.8 Snow Leopard。アップグレードする必要性が無かったのと、Appleに付き合って毎回OSをバージョンアップしてたら、新しい環境に移行する労力が無駄だったから、アップグレードしてなかった。

しかし、どうしてMicrosoftもAppleも学習しないのか理解に苦しむんだけど、正直OSのバージョン上げて欲しく無いんだよね。今のままでいいから、バグとかセキュリティとか直してくれればそれでいい。世界中の人がそう思ってる。バグとかセキュリティを直したやつを、名前だけ別の製品名にして出すなら、それでもいい。だけど、変える必要も無いところを変えて、古いハードウェアを使えなくする意味が無い。しかも、Windows 8は珍しい例外としても、大概要求ハードウェアがどんどん高くなっていく。一昔前なら128MBのメモリを使い切ることなんてありえないと思っていた。それが、今は8GBは欲しいって?いいソフトウェアってのは、メモリ効率が良くて、実行速度も速いソフトウェアだ。だから、OSはバージョンが上がるたびに悪くなっている。ユーザーが嫌がることをした上に、どんどんソフトウェアの品質を悪化させれば、業績は落ちる。いい加減気がついて欲しいもんだ。

ただ、今度は、タイミングが最高に良くて、AppleがOSX 10.9 Mavericksを無料で公開したばかりだった。しかも、我が2008年後期モデルのMacBook Proはサポート対象に入っている。それなら、アップグレードするか、と、思って、OSをMavericksにアップグレードすることにした。

アップグレードは順調に行って、仕掛けて買い物に行って帰ってきたら終わってた。そして、WinClone 4をインストールして、Bootcampパーティションのバックアップを取った。ここまで順調。

新しいバージョンのOSだと開発環境のXCodeのバージョン3.xは使えないことは知っていたので、XCode 4.8をダウンロードする。Appleは、新しいバージョンのXCodeで、GCCを使うのをやめてclangなるコンパイラに移行しようとしている。GCCは4.xになってからずいぶんいいコンパイラになったと思ったけど、それでも、C++の仕様をあまりにも厳格に解釈してるところとかあって、GCCをやめたくなる気持ちはわかる。それに、いつ手のひら返してGCCでコンパイルしたソースは全部オープンにしろ、とか言い出されるか、心配というのもわかる。XCode 4.xは、AppleがGCCをサポートする最後のXCodeのバージョンということだった。僕としては、いきなりclangコンパイラに移行するんじゃなくて、XCode 4.xで徐々にGCCからclangに移行するつもりだった。

ダウンロードが終わって、インストールしてみようかと思ったら、入んない。なんで?と、思ってApple Developerをよくよく読んだら、MavericksではXCode 4.xもサポート対象外で、XCode 5を使えとのこと。こういう嫌がらせ、やめてほしいんだけどね。

選択肢は三通り。

  1.  Time MachineでSnow Leopardまで戻す。WinClone使うときだけMavericksに上げる。
  2. Time MachineでいったんSnow Leopardまで戻して、あきらめてOSX Mountain Lionを買う。
  3.  観念してMac上の開発を一気にclangコンパイラに移行する。

まあ、ある意味、まずclangコンパイラへの移行を試してみて、だめそうだったら、いったん戻るのはいつでもできる。だから、とりあえずclangを試してみることにした。

GCCからclangへの移行は、検索してみると、阿鼻叫喚の地獄絵図となっている。ただ、YSFLIGHTのコードは、既にVisual C++とGCCで通るように書いてある。コンパイラに依存するような書き方をしている箇所は既にほとんどなくなっているはずだ。だから、clangでもそれほど苦労無く移行できるはずだ。

いきなりYSFLIGHTみたいな大きなプロジェクトをコンパイルしようとしたってうまくいくわけないから、小さなテストプログラムとか例題プログラムで試してみたところ、makefile内のCC=g++をCC=clangに書き換えるだけであっさりコンパイルできて実行もできてしまった。これは幸先がいいと思って、この週末、YSFLIGHTもclangに移行してみた。二点ほどひっかかった。ひとつは、clangがOpenMPをサポートしてなかったってこと。サポートしてないくせに、リンク時に-fopenmpオプションをつけっぱなしだと、libgompをリンクしに行って落ちる。だから、Mac OSX用にコンパイルするときだけ-fopenmpオプションを解除する必要があった。OpenMP結構好きなんだけど。残念。もうひとつは、なぜか標準C++ライブラリを自動的にリンクしに行かないことがあった。これは、リンク時に-lstdc++オプションで明示的に標準C++ライブラリをリンクさせることでなんとかなった。ちょっとどういうときに標準C++ライブラリをリンクしないのか、ちょっと気持ち悪いんだけどね。ああ、あと一点、privateに継承したクラス内で、ベースクラスのポインタをパラメータとして渡せないって問題があったけど。あれは、ちょっと言語仕様の解釈が間違ってるんじゃないかと思ったんだけど。とりあえず、privateをやめてprotectedにしたら通ったけど、これもちょっと気持ち悪かったな。

というわけで、YSFLIGHTはXCode 5付属のclangコンパイラでコンパイルできるようになり、OSX Mavericksでちょっと起動して飛んでみたけど、普通に動作した。ジョイスティックとサウンドが心配だったんだけど、それも問題無し。

またこれで、数年は、YSFLIGHT for Mac OSXも大丈夫だな。 それから、我が2008年後期MacBook Proも、これであと二年ぐらいは戦えそうな気がする。

Comments are welcome.  Send E-Mail to:

RETURN TO TOP PAGE

このページはリンクフリーですが、リンク先は、http://www.ysflight.com にお願いします。よかったら以下のバナーのうちのひとつをお使いください。