20060304p01の続き。
ファイルのリカバリのために再起動を繰り返してたら突然問題の HDDが BIOSから認識されなくなったので、てっきり HDDがスクラップになったんだと思ってたがそうではなかった。なんか SATAコネクタに問題があったみたい。
問題の HDDと Windowsの入った正常な HDDを入れ替えたら今度は Windowsの入った HDDが BIOSで認識されなくなった。SATAケーブルを何度か抜き差ししてたら両方の HDDが認識されるようになった。
ファイルシステムが壊れてることに変わりはないのでファイルのサルベージは必要だけどデータが 100%失われることに比べたら 20や 30や 40のファイルが失われることがなんだってんだ。
こうなるとファイルが壊れたりファイルシステムが壊れたりしたのも SATAコネクタが断続的に繋がったり切れたりして書き込みが正常に完了しなかったせいかもしれない。Maxtorを疑って悪かったよ。
昨晩注文して明日到着予定の HDT722525DLA380(日立IBM SATA2 250GB)と ST3250824AS(Seagate SATA2 250GB)を接続する場所がなくなってしまったのはどないしょ。250GBの HDD 3つで RAID5*でもする?
* 250GBの HDDが 3つで 750GB。その内、250GB*(3-1)=500GBを記憶域として利用でき、3つの内のどの一つのディスクが壊れてもデータが失われない。RAID1(ミラーリング)より容量の面で有利。
この前、ファイルが無くなって Windowsが起動できなくなったのとは別の HDD。
最初はトレイアイコンから、ファイルが壊れてて読み取れないってメッセージが表示された。空き領域が 30GBと表示されている。最近は空き領域の確保に苦労していたので 30GBは多すぎる。
CHKDSKを試したがどういうわけか開始しない。とりあえず再起動。
問題の HDDに張っていたマウントポイントが解除されて E:\として見えている。ボリュームラベルもデフォルトに戻っている、どころか空き領域が 233GB。未フォーマットって何じゃ。どうやら、ファイルシステムが NTFS5.1だということが分からなくなった様子。
PC Inspector File Recoveryというソフトをダウンロードして試す。エクスプローラでは既に表示できなくなった、E:\ 直下に存在するはずのフォルダが表示されて何とかなりそうな雰囲気。
でも、このソフトを操作してると PCが突然再起動したりする。
さっき 4回目の再起動に遭遇した。E:\ はもう無い。
ファイルシステムがどうのという以前に HDDが HDDとして認識されなくなってしまった。
こうなるとファイルのサルベージとか考える必要もなくって、いっそ清々しいね (´Д⊂グスン
タコが熱い。軍儀のエピソードにはホロリ。
ONE PIECEは面白いんだけど「さあ泣け。さあ感動しろ」って強要されてる気がして好きになれない。ルフィの能天気さもわざとらしく感じられて嫌い。
HUNTER×HUNTERのタコとキルアの友情には素直に感動できるのにね。
第3レース終盤、ジョニィが唐突に語りだしてからジャイロとジョニィの精神的優位が入れ替わった。(着順もジョニィ > ディオ > ジャイロだし)。
最初はジャイロにくっついてレースに参加したジョニィもいつまでもジャイロの後を追うだけではないということ。
そしてジャイロも今巻で聖人の右目を手に入れたことで、最初から使えた鉄球という "特技" (技術) が強化されて (スタンド) "能力" を手に入れたけど、決して完璧超人ではないということ。
そうでないと面白くないから。
トラブル続発。
そのせいで Windows XPが起動しない。
最終的には XPのインストール CDから回復コンソールを起動して
COPY G:\I386\PCI.SY_ C:\WINDOWS\SYSTEM32\DRIVERS\pci.sys
で、起動するようになった。本当に pci.sysが見つからんかっただけなのな。
CHKDSK /R で 70くらいエラーが見つかったから HDDが原因?
DVDドライブは Q:\ に設定してたのだけどそういうのは XPが起動してから有効になるみたいで、DVDドライブが G:だと分かるまでに下のような地道な努力。
dir A: dir B: ... dir G:
結局、ダイアルアップで接続する設定になってたのが原因っぽい。
症状は 25日の夜から。
C:\Accessories\System Tools\Internet Explorer (No Add-ons).lnk のタイムスタンプが 2006/02/25/19:20。(←IE7beta2のインストール日時と思われる)
疑わしい。
Apacheサービスを HTTPDアカウント(Usersグループ)で走らせるようになってから、sqlite3.dllを使う、Rubyで書かれた CGIスクリプトが「logic error or missiing database」を出すようになった。
エラーを直接投げてるのは Rubyのライブラリの sqlite3-rubyだけど、エラーメッセージは SQLiteのライブラリ(sqlite3.dll)に由来している。
エラーを出す原因となった SQLは以下。
SELECT * FROM sqlite_master WHERE type='table' OR type='view' ORDER BY name;
データベース内のテーブルとビューの一覧を取り出すためのありふれた SQL文。
問題をややこしくしたのは
SELECT * FROM sqlite_master WHERE type='table' ORDER BY name;
だとか
SELECT * FROM sqlite_master WHERE type='view';
でも同じエラーが出るのに
SELECT * FROM sqlite_master WHERE type='table';
だとエラーが出なかったこと。
結論から言うと SQL文は悪くない。
Apacheを SYSTEMアカウントで動かすとエラーが出なくなったので、Apache(と Apacheが CGIとして起動する Ruby)が HTTPDアカウント(Usersグループ)で動いてることに原因があると考えた。それなら書き込み権限がないせいでエラーになってるのかもしれない。
データベースファイルやデータベースファイルを入れるディレクトリには当然 HTTPDに対して書き込み権限を付けてある。
SysInternalsの FileMonを使って確認したところ、ruby.exeが C:\WINDOWS\sqlite_XXXXXX(文字化け) を CREATEしようとして Denyされている。
sqlite-3.3.4の os_win.cに
char *sqlite3WinFullPathname(const char *zRelative)
という関数があり、Cygwinや WINCE以外の WINDOWSプラットフォームではそこから
GetFullPathNameW/A
という APIが呼ばれている。おそらくこの APIが "C:\WINDOWS\sqlite_XXXXXXX" というパスの出所だろう。
ここをいじって
"%TEMP%\sqlite_XXXXXXX" => "%USERPROFILE%\Local Settings\Temp\sqlite_XXXXXXX => "C:\Documents and Settings\HTTPD\Local Settings\Temp\sqlite_XXXXXXX"
上のような Tempディレクトリにファイルを作成するようにするのもアリだろうが、そういう変更をすると SQLiteのバージョンアップに追従するのが面倒になるので Rubyスクリプトの方で対処する。
sqlite3-rubyでは
db = SQLite3::Database.new('hoge.db'); db.temp_store = 2; # 2=memory, 1=file
SQLでなら
PRAGMA temp_store = MEMORY;
(参照) Pragma statements supported by SQLite
SQLの方は試してないけど、sqlite3-rubyの方で対処したところエラーが出なくなった。
エラーメッセージが的外れなのでここまで来るのに苦労した。
PRAGMA temp_store_directory;
PRAGMA temp_store_directory = 'directory-name';
Query or change the setting of the "temp_store_directory" - the directory where files used for storing temporary tables and indices are kept. This setting lasts for the duration of the current connection only and resets to its default value for each new connection opened.
When the temp_store_directory setting is changed, all existing temporary tables, indices, triggers, and viewers are immediately deleted. In practice, temp_store_directory should be set immediately after the database is opened.
The value directory-name should be enclosed in single quotes. To revert the directory to the default, set the directory-name to an empty string, e.g., PRAGMA temp_store_directory = ''. An error is raised if directory-name is not found or is not writable.
The default directory for temporary files depends on the OS. For Unix/Linux/OSX, the default is the is the first writable directory found in the list of: /var/tmp, /usr/tmp, /tmp, and current-directory. For Windows NT, the default directory is determined by Windows, generally C:\Documents and Settings\user-name\Local Settings\Temp\. Temporary files created by SQLite are unlinked immediately after opening, so that the operating system can automatically delete the files when the SQLite process exits. Thus, temporary files are not normally visible through ls or dir commands.
%TEMP%フォルダでなく %WINDIR%にテンポラリファイルを作ろうとするのは Windowsのせい?俺のせいでした。
httpd.confに次の行を加えるべし。
PassEnv TEMP
確かに、確かに萌えが存在している。ギャップだとか弱点に萌えが宿るのは真実。何かのインタビューで桜庭さんが仰っていた通りです。
http://www5a.biglobe.ne.jp/~dai_/diary/diary0602.htm#05 (DAIさん帝国)