以前と同じように VS2003 にセキュリティーアップデートを統合することにした。
まずは、.msp を抽出。以前のアップデートファイルとは、コマンドラインオプションが異なっていた。
> VS7.1sp1-KB971089-X86.exe /extract c:\tmp
これで、VS7.1sp1-KB971089-X86.msp が抽出された。続いてこれを VS2003 SP1 のインストールファイルに統合。
> msiexec /p VS7.1sp1-KB971089-X86.msp /a c:\vs2003\vs_setup.MSI
次に、以前の統合時から変更のあったファイルのみを、ディレクトリ構造を保ったまま別の作業ディレクトリにコピー。
> robocopy c:\vs2003 k:\vs2003 /maxage:20070501 /s /fft
コピーしたファイルを、以前作った VS2003 の統合済み DVD-R に上書きしてできあがり。(新規に作り直すのは時間が掛かるため、やめた。)
VS2003 の場合、ATL 関連で更新されるソースファイルは、atlcom.h と atlcomcli.h のようだ。
PowerDVD 7.3 BD のアップスケーリング機能 (TrueTheater HD, TTHD) を使おうとしたのだが、なぜか有効にできない。調べてみると、アップデートで TTHD が使えなくなる場合があるようだ。
「アップデートで削除されたTTHDを有効化する: ブログコバナシ」を見て、現在インストールされている 7.3 build 5105 と、ドライブに付属していた 7.3 build 4407 のファイルを比較してみた。
TTHD を使うには、CLTzan.ax, CLTzan.tsm, CV.DLL の 3ファイルが必要なようだが、CLTzan.ax と CLTzan.tsm は同一の物がインストールされている。しかし、CV.DLL がインストールされていなかった。CV.DLL をコピーしてから、regsvr32 を実行したところ、TTHD が使えるようになった。なお、上記のサイトには CLDShowX.ini の書き換えが必要と書かれているが、7.3 build 4407 のファイルを使う場合は CLTzan のバージョンに変更はないため、書き換える必要はない。
レジストリに関しては、TTHD 関連の物はほとんど有効になっていた。DX_TTHD_Resolution は値がなかったため、作成して有効化しておいた。UI_EnableTTHDFileMode は 1 にしても変化がないようだ。PowerDVD 8 の CLTzan でなければ有効ではないのかもしれない。
後で Buffalo のサイトを見たところ、PowerDVD のアップデートファイルがあったが、Ver.7.03.4617a.0 と書かれており、古い。
CPU 負荷を調べてみた。Core i7 920 で DVD 再生時は、DxVA を使わずともわずか 1% 程度。TrueTheater 関連を有効にしても 7〜8% 程度。やはり Core i7 は強力だ。
TClock Light 改造版では、CPU 使用率の測定に、NtQuerySystemInformation() を利用している。しかし、SYSTEM_BASIC_INFORMATION 構造体の定義が間違っており、x64 では動かなかったという話があり、調べてみた。
MSDN の NtQuerySystemInformation() のページには、一応 SYSTEM_BASIC_INFORMATION 構造体の定義は載っているが、メンバがほとんど非公開になっている。CPU 使用率の測定にはこれでも十分なのだが、残りのメンバがどうなっているのか調べてみた。Why doesn't the publicly available kernrate work on Windows x64? (and how to fix it) « Nynaeve に情報があった。(ちなみに、kernrate というのは WDK に含まれているツールの名称らしい。)
ATL に脆弱性が見つかったということで、Visual C++ を使って作ったソフトが問題ないか確認の必要がある。
VC++ 6.0 はサポートが終了したため、アップデートファイルはないが、影響はある。また、WDK などに付属の ATL も影響を受ける。
PowerDVD は、8 や最新版の 9 より、Buffalo バンドル版の 7.3 BD の方が安定しており、機能も大して変わらないという話もあるようだが・・・。PowerDVD 9 を買おうかとも思ったが、もう少し様子を見るか。
Blu-ray と DVD では、再生機能にいくつか違いがあるようだ。DVD だと、音声付き 2.0倍速再生ができるが、Blu-ray だと、音声付き高速再生はできないようだ。また、Blu-ray 再生中は、Vista の Aero が無効化されてしまう。PowerDVD 9 ではどうなっているかが気になるところ。
TClock Light 改造版の Aero 有効判別に問題があったことが判明。手抜きで、レジストリを見て Aero の有効・無効を判別していたのだが、Aero 非互換のソフトを動かすことで一時的に Aero が無効化されている状態を正しく判別できていなかった。DwmIsCompositionEnabled() を呼び出すように修正し、ついでに実行時間を計ってみた。レジストリの値を読む場合は、100us 程度掛かっていたのに対し、DwmIsCompositionEnabled() は 2us 程度だった。手抜きはよくない。
昨日買った BR-H816FBS-BK を取り付けた。付属の PowerDVD が 7.3 でかなり古い気がする。対応 OS に Vista x64 が含まれていないが、特に問題なさそう。昨年末に、秋葉で無料配布していた Blu-ray のプロモーションディスクで試してみたところ、無事に再生できた。
今更ながら、Windows 7 RC をダウンロードしてみた。Firefox でダウンロードしたところ、Java アプレットを使ってダウンロードするようになっていた。ダウンロード開始前に、予めディスク領域を確保するようだが、その処理中は数秒おきに Java アプレットのウィンドウが最前面に表示されて非常に鬱陶しかった。
Blu-ray ドライブを購入。BR-H816FBS-BK \18,980。中身は、日立 LG の BH08NS20。日立製かと思って買ったが、LG 製だった。
sethttptime の代替品を試作してみた。(httptime.7z) NICT に直接アクセスした場合は、パケット往復時間は 30〜60ms 程度だった。これならばそれなりの精度で時刻合わせができる。しかし、ファイヤーウォール内からのアクセスだと、「JSONP形式を用いたHTTPによる時刻供給に関する検討」にも書いてあった通り 1回目の遅延が大きいようで、その遅延がそのまま時刻のずれになってしまう。HTTP/1.1 の Keep-Alive を使って 2回アクセスしてみようかとも思ったが、どうもプロキシサーバが対応していない。
なお、NICT の時刻取得 CGI は、より正確な時間を返すためか、HTTP のヘッダと本体を分けて応答を返すようで、1回目の recv() ではヘッダしか取得できない。
ファイヤーウォール内に NTP サーバが稼働していることに気付いた。そこそこの精度はあるようで、少なくともプロキシサーバ経由で HTTP で時刻を取得するよりは精度が高そう。sethttptime の代替品はお蔵入り。
ファイヤーウォール内で時刻合わせをするために、sethttptime を使おうとしたが、エラーで落ちてしまって使えなかった。自分で代替品を作ってみるか。
TClock Light の時刻合わせ機能の精度を向上させるべく実験中。現状、精度に関しては以下のような状態。
GetSystemTimeAsFileTime() の返す値を調べてみたところ、XP 以前では、たいていの場合 15ms 程度の分解能しかないようだ。(この値は、XP 以前では、timeadjx で確認できる値と一致するようだ。) tcsntp で時刻合わせを行った直後に再度時刻合わせしても十数ms のずれが出る場合があったのは、これが原因のようだ。なお、timeBeginPeriod(1) でタイマー精度を向上させても、分解能に変化はなかった。一方、Vista では分解能は 1ms に向上している模様。GetSystemTimeAsFileTime() が返す値が変化した瞬間を基準に計算を行えば、精度が向上するはず。
早速試してみたところ、時刻合わせを行った直後に再度時刻合わせした場合のずれが、0〜3ms 程度に収まるようになった。timeadjx で時計の進み具合を調整したところ、30分経った場合でもずれが数ms に収まっている。時刻合わせの瞬間に CPU 負荷が高くなる懸念があるが、最近のマシンならば問題なさそう。
NICT 関連。
loader.o を使って、カーネルを 2.6.25 にしたことにより、decrementer frequency がふらつくことはなくなった。それにより、以前のスクリプトは不要になり、ntp.drift を起動時に生成するような小細工も不要になった。なお、以前は HDD アクセスを減らすために ntp.drift を RAM ドライブ上に置いていたが、今度はどこに置くべきか・・・。
玄箱/HG の AVR 制御用デバイスファイルはカーネルのバージョン(?)によって違っているらしい。
バージョン | デバイスファイル | 備考 |
---|---|---|
2.4.17 | /dev/ttyS1 | 素の玄箱 |
2.4.17 | /dev/AVR00 | 玄箱うぉううぉう♪ |
2.6.25 | /dev/ttyS1 | 玄箱/Debian/インストール - Revulo's Laboratory |
2.6.28 | /dev/ttyS0 | LinkStation/玄箱/kernel - PukiWiki の情報 |
kurofand.pl も修正しなければならない。
玄箱に入れてある Vim でシンタックスハイライトを有効にしようと思い、.vimrc に syntax on と書いたら、このバージョンでは使えないといわれてエラーになってしまった。ヘルプを見たところ、syntax on ではなく syntax enable が正しいようなので、そのように修正してみたがそれでもエラーになってしまった。よく確認してみると、インストール済みだったのは vim-tiny というパッケージだった。aptitude で vim をインストールしたところ、syntax enable が使えるようになった。
aptitude install でインストールしたパッケージのまとめ。今までインストールしたのは次のようなところ。
aptitude install samba swat aptitude install sudo aptitude install fdclone aptitude install ntp ntpdate aptitude install adjtimex aptitude install perl aptitude install hddtemp aptitude install vim aptitude install less lv aptitude install locales util-linux-locales
locales に関しては、aptitude でインストールした後に再設定が必要なようだ。インストールしただけでは、日本語メッセージが有効にならず少々手間取った。
dpkg-reconfigure locales
後は、perl-suid や ssh 辺りをインストールすればインストール作業はほぼ終わりか。murasaki 等を使った USB 機器のオートマウント環境の構築は時間が掛かりそうなので後回しにしよう。
以前とは異なり、ntpdate をインストールしても、起動時に ntpdate が実行されなくなったようだ。
玄箱/HG 起動時に HDD スピンアップ時間不足で DIAG 6回になるのを、フラッシュ ROM を書き換えて対処することにした。
まずは参考サイト。
loader.o を使って、カーネル 2.6 を使っている場合、フラッシュのブート領域は /dev/fl2 ではなく、/dev/mtd1 (Read) または /dev/mtdblock1 (Write) となる点に注意。
Linux で使えるバイナリエディタを調べてみた。Vim のマニュアルによると、バイナリファイルも編集できるらしい。vim -b でファイルを読み込み、:%!xxd でダンプ表示に変換し、編集後、:%!xxd -r でバイナリに逆変換すればよいようだ。
Windows の fc /b 相当のバイナリ差分表示は、cmp -l でできるらしい。試したところ、アドレスが 1 から始まる 10進表記で、データが 8進表記となっており、非常に読みにくい。
フラッシュ書き換え手順は以下の通り。
元のブートコードをファイルに保存。
# cat /dev/mtd1 > bootcode.bin # cp bootcode.bin bootcode.org.bin
ブートコードを編集。(アドレス 2B96 からの 2バイト 03 E7 (=999) を、07 CF (=1999) に変更。)
# vim -b bootcode.bin
正しく編集されていることを確認。
# cmp -l bootcode.org.bin bootcode.bin 11159 3 7 11160 347 317
ファイルの MD5 ハッシュを確認。
# md5sum bootcode* dedd9d6932a4515f2535cbf7e40bd4e5 bootcode.bin 35d6ffc9f8191181750a8bacba369e3c bootcode.org.bin
改変後のブートコードを書き込み。(読み込みに比べて時間が掛かる。)
# cat bootcode.bin > /dev/mtdblock1
書き込み後の MD5 ハッシュを確認。
# md5sum /dev/mtd1 dedd9d6932a4515f2535cbf7e40bd4e5 /dev/mtd1
以上でブートコード書き換え完了。再起動したところ、無事に起動し、電源 2度押しが不要になった。
HDD Regenerator で 6B200P0 の全セクタを再チェックしていたが、ようやく完了した。HDD の先頭部分の数GB のスキャンが遅いのが気になった。結局 8セクタ修復された。コピーに失敗した 3ファイルは、2つが復活したが、1つは途中 1セクタ分が破損していた。
S.M.A.R.T. 情報を確認したところ、代替処理済みセクタ数が 0 に戻っていた。謎だ。
玄箱の HDD を PC から直接読めるようにしようと思い、Ext2Fsd をインストールした。
6B200P0 の購入時の記録を調べたところ、5年保証を付けてなかった。必要な物に保証を付けてなかったり、必要ない物に保証を付けたり、なんだかいろいろと無駄なことをやっている。今のところまだ一度も 5年保証を有効活用できていないorz
aptitude update を実行したら、GPG error: 〜 the public key is not available: NO_PUBKEY 〜 などというエラーが出た。「AptGet - Debian GNU/Linux スレッドテンプレ」を見て対処。
昨日に続き、古い HDD から、新しい HDD にデータコピー中。起きて状態を確認したところ、まだデータパーティションのコピーが終わっていなかった。しかもシステム全体の動作が妙に遅い。tar を使ったコピーは中断し、最後にコピーしていたファイルを削除してから、cp -auv で残りのファイルをコピーした。cp を使った場合にはシステム全体が遅くなることはなかった。
一部コピーに失敗したファイルがあるが、とりあえずコピーは終わったので、HDD をつなぎ替えて起動しようとしたら、DIAG ランプが 6回点滅して起動しない。HDD の異常または HDD 上のファームウェアの異常らしい。
せっかくコピーしたが、パーティションを全て削除して、つなぎなおしてみた。しかし改善されなかった。相性問題だろうか。そうならば別の HDD にするしかないか?
Seagate ST31500541AS (1.5TB, 5,900rpm) を 5年保証付きで \13,330 で購入。帰宅して早速玄箱に取り付けたが、これも DIAG ランプが 6回点滅して起動しないorz。しかも WD10EADS-M2B よりうるさい。さらに、RMA などというものがあったことを知った。5年保証を付ける必要がなかったかもしれないorz
DIAG 6回に関する情報を再度調べてみた。「ハードディスクを認識できない」によると、「DIAGが点滅し始めたところで,一回電源をOFFし,即ONする」とよいらしい。試してみたところ、問題なく起動した。これで、1.5TB が余ることになってしまった。Core i7 マシンに増設するか。
せっかくコピーしたデータを消してしまったので、OS のインストールからやり直すことにした。「玄箱/Debian/インストール - Revulo's Laboratory」で Debian 4.0 (etch) のイメージファイルが公開されているので、それを使うことにした。loader.o を使って、カーネル 2.6 を組み込んである点も特徴である。
「玄箱/Debian/時計合わせ - Revulo's Laboratory」には、自分のサイトへのリンクがあった。
6B200P0 の状態を確認するため、HDD Regenerator を使ってみることにした。以前試したときのバージョンは 1.51 だったが、1.71 が出ていたのでそれを試してみることにした。最初に Win2k にインストールしてみたところ、初期化エラーが発生し、起動できなかった。WinXP にインストールしてみたところ、問題なく立ち上がった。1.71 では、1.51 とは異なり XP/Vista 上から直接 regenerate できるようになっていた。USB 接続の HDD も認識されるようで、早速 6B200P0 をスキャンしてみたところ、不良セクタがいくつか見つかったが、HDD の状態が悪いのか、全然修復されない。妙に遅いので一旦中断。
HDD Regenerator の実行ファイルを ijexp32 で見てみると、セクション構造がかなりすごいことになっていた。かなり念入りにクラック対策されているような雰囲気。
CrystalDiskInfo 2.7.4 を使って、6B200P0 の S.M.A.R.T. 情報を確認してみることにした。USB-IDE 変換ケーブルは 2つ持っているが、新しい方を使ったところ、S.M.A.R.T. 情報が読めた。代替処理済みセクタ数が 6 となっており、やはりこの HDD には問題がある。
Vista で K2Editor の GREP 機能を使うと、ファイル名が後ろの方しか表示されない。以前から気になっていたのだが、調べてみることにした。Delphi の TAnimate が Windows の内部実装に依存していたせいで、OS の仕様変更により正しく動作しなくなったようだ。とりあえず、サイズの自動調整をやめて、固定してしまうことで、ファイル名が TAnimate に隠れることはなくなった。そのままでは Vista では検索中のアニメーションが出ないが、対応は面倒そうなので放置。ついでにウィンドウの幅も広げて、長いファイル名も見やすいようにしてみた。
玄箱の HDD を換装しようと思い、調査。今まで Maxtor 6B200P0 (200GB) を載せていたが、1TB 以上の HDD に換装しようと考えている。玄箱で常時動作させることから、速度よりも静粛性を重視したい。
WD 1.5TB 5,400rpm にしようかと思ったら、どこも売り切れ。安さでは HGST の 1TB だが、7,200rpm しかないので却下。しかし、HGST はいつになったら 2TB を出すのだろうか。Samsung は、工人舎 SC に搭載されている HDD が時々奇声を発することから、信用していない。Seagate 1.5TB 5,900rpm と WD 1TB 5,400rpm あたりが候補か。
結局 WD10EADS-M2B を 5年保証付きで \7,805 で購入。PATA-SATA 変換基板も必要なので、KURO-SATA を \2,480 で購入。
以下のサイトを参考に、データコピーを開始。いくつかコピー方法があるようだが、tar を使う方法でやってみた。システムパーティションのコピー中に、エラーが発生したファイルが 3つあった。詳細は後で確認予定。データパーティションのコピーには時間が掛かりそう。
音量関連機能を Vista に対応させた。IAudioEndpointVolume を使うと、浮動小数点演算が必須になるので、実行ファイルのサイズを小さくする方法がそのままでは使えない。VC++ の場合、浮動小数点演算を使うと、_fltused というシンボルが参照され、デフォルトライブラリへのリンクが必須となる。ダミーの _fltused を定義すれば回避できなくもないが、浮動小数点数から整数への変換は、_ftol という関数が使われるため、結局デフォルトライブラリへのリンクが必要となる。(整数から浮動小数点数への変換は FPU 命令が使われる。) Makefile などを少し変更して、デフォルトライブラリにリンクしつつ、ファイルサイズが小さくなるようにしてみた。
昨日初めて知ったのだが、VC++ には、指定されたクラス等の GUID (UUID) を取得する __uuidof という演算子がある。比較的新しい拡張かと思ったが、VC++ 6.0 でも使用できた。他のコンパイラについても調べてみたところ、Borland C++ 5.5.1 は対応していたが、gcc 3.4.4 は対応していなかった。
一部の XP 環境で、時計の文字の色の初期値が白となるべきところが黒となる現象が発生。レジストリに書き込まれている文字列の大文字小文字が一致していなかった。大文字小文字を区別しないように変更して解決。
TClock Light を改造中。いくつかある改造版をソースコードレベルでマージした上で、簡単に機能を付けたり外したりできるようにしてみようと思っている。
今まで TClock Light は、時計に月日・時分秒を表示するためと、時刻合わせのためだけに使ってきたが、録画用 HDD の空き容量を表示しておくと便利そうだ。TClock Super Light 相当に HDD 関連の書式だけを追加したバージョンを作ってみるか。
音量関連機能を取り込んで、Vista でテストしてみたところ、うまくうごかない。Vista では Audio Mixer API は、アプリごとの音量調節を行うように変更され、マスターボリュームをいじるには IAudioEndpointVolume を使わなければならないらしい。IAudioEndpointVolume の使い方を調査中。
先月の spam メールの集計結果。着信拒否にならなかった spam が少なくとも 1461通。そのうち、@nifty の迷惑メールフォルダーでも Spam Mail Killer でも spam として認識できなかったものが 6通(0.4%)。なぜか spam が半減。