東村山にある社員寮に引っ越し。1ヶ月の研修期間中は余計なものは持ってこないようにと言われているので、パソコンは、Ls312 と Let's note の2台だけを持って行くことにした。寮に着いてから、パソコンを起動してみようとしたところ、また Let's note が起動しない。これはもうダメかもしれない。まだ一部バックアップの忘れていたデータもあったようなのだが・・・。
少なくとも4月中はインターネットがまともに使えないことになりそうだ。
Let's note が起動している今のうちにデータ整理。
Let's note が死にかけ状態になってしまった。WinXP の起動中にブルースクリーンになってしまい、十数回に1回しか起動しないのである。今まで、Let's note を分解したことはなかったが、思い切って分解してみた。HDD を取り出して、この前買った USB-IDE 変換ケーブルにつないでみた。ケーブルを USB コネクタに挿して電源が入ったかと思うと次の瞬間に電源が落ちてしまう。USB から供給される電流では足りないのだろうか。それとも、Let's note の HDD が 3.3V 電源を必要としているからだろうか? デスクトップの IDE ケーブルに直接つなぐのは面倒でやっていない。
Let's note が辛うじて起動したので、必要なデータを Ls312 にコピー。
HDD health を見てみると、次のようになっていた。
データが飛んだのか、画面が真っ青になっている。Load/Unload Cycle Count が残りわずか 5 になってしまっている。やはりもう寿命か。
smmp は Let's note 上で開発を行っていたのだが、死にかけなので Ls312 でコンパイルできるように環境を整えることにした。Ls312 に DirectX SDK をインストールするのは面倒だったので、ヘッダーファイルとライブラリファイルだけを適当なディレクトリにコピーして使うことにした。後は、Boost をインストール。早速、Ls312 で smmp コンパイルしてみたが・・・遅い。
DirectX のヘッダーファイルとライブラリファイルは、VC6 のディレクトリよりも先に指定する必要があるようだ。初め、DXSDK のディレクトリを後に指定していたところ、コンパイルエラーが発生して、なかなか原因が分からず苦労した。
smmp を VS2003 で UNICODE プログラムとしてコンパイルしてみた。その際、unicows.lib をリンクするようにしてみた。できたプログラムを Win98 で実行してみたところ、全く問題なく動いてしまった。ちょっと拍子抜けだった。
久しぶりに秋葉原に行ってみた。SANYO の eneloop が売られていた。ちょうど MP3 プレイヤーの電池が切れた上に、予備の電池を持ってくるのを忘れていたので、試しに 単4 (800mAh) の4本セットを買ってみた。\1,279 だった。買ってすぐ使えるのはなかなか嬉しい。普通の NiMH を使っていて不満なのは自己放電が激しいことであるが、それが解消されているのは非常に良い。
IMediaSeeking::SetRate()で再生速度を変更した上で、IMediaSeeking::GetCurrentPosition()で再生位置を取得すると、実際に再生している位置と、取得された位置が一致しないという問題が起きて困っていた。SampleGrabber フィルタを使えば正しい再生位置が取得できるらしいという情報を得ていたのだが、やり方が分からずしばらくほったらかしにしていた。DirectShow のサンプルの StillCap に SampleGrabber の使い方が示されていたのでそれを元にプログラムを書いてみた。無事に正しい位置が取得できるようになった。代わりにメモリの使用量が 100KB 近く増えてしまった。
ID3v2 を使っていると DirectShow での MP3 の再生が不安定な気がしたので、少し調べてみた。DirectX9 を入れた WinXP で試したところ、とりあえず ID3 v2.2 は問題なさそうである。v2.3 は一応再生できるのだが、デバッガ上で実行すると例外が発生してしまう。また、再生・停止・ロードを短時間に繰り返し行うと、たまにプログラムが落ちてしまう。v2.4 は全く再生できなかった。
mpg123 and MAD DirectShow Filter を試してみたところ、v2.3 でも v2.4 でも全く問題なく再生できた。ただ、このフィルタはメモリ使用量が多いのがかなり気になる。MP3 パーサの部分だけこれを使って、デコーダ部分は標準の l3codecx.ax をそのまま使うことはできないか試してみたが、残念ながらできなかった。
SHBrowseForFolder() の使い方がよく分からなかったので調べてみた。「フォルダ選択ダイアログでデフォルトフォルダを指定するには?」などが参考になった。
正直、フォルダ選択ダイアログは使いにくいと思っている。マウスで選択するだけでなく、Edit Box にディレクトリ名を直接入力して選択できると良いのだが。ということで、次のような方法を試してみた。
BROWSEINFO の ulFlags に BIF_EDITBOX | BIF_VALIDATE を設定し、コールバック関数に、BFFM_VALIDATEFAILED が来たら、
TCHAR buf[MAX_PATH]; GetFullPathName((LPCTSTR) lParam, MAX_PATH, buf, NULL); SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM) buf); return 1;
という処理をする。入力がフルパスではないときの処理が手抜きだが、そこそこ使える。特に Win2k 以降では、ディレクトリ名の補完機能が効くので便利である。浅い階層にあるディレクトリならば、マウスで選択するよりもキーボードから直接入力した方がはるかに速い。
S.E.E.R.A Works - nave player。音程を変えずに再生速度が変えられるプレイヤー。
ahiru's homepage - DirectShow, DMO の解説サイト。
現在、DirectShow プログラムの開発には、Microsoft DirectX 9.0 SDK Update (October 2004) を使っているのだが、どうもこのバージョンの DXSDK は Visual C++ 6.0 はサポート外だったようだ。
DirectShow のサンプルに VC6 用のプロジェクトファイルが含まれていなかった。VC++7 to VC++6 project converter を使って、VC6 用のプロジェクトファイルを生成してみた。試しに BaseClasses をコンパイルしてみたが、Platform SDK をインストールしていないせいで、コンパイルエラーが発生した。わざわざ PSDK をインストールするのが面倒だったので、VS2003 に含まれている PSDK のインクルードディレクトリを指定してみたところ、あっさりコンパイルが通ってしまった。
Free-Codecs.com :: Download Ogg DirectShow Filters 0.9.9.6 を使ってみた。illiminable Ogg Directshow Filters 0.71.0946 よりも良い。前者は、IAMMediaContent を使っての曲名の取得もでき、再生速度の変更も可能。メモリの使用量も少ないようだ。illiminable の方は、再生中のメモリ使用量はかなり多いのだが、Vorbis 以外にも対応しているのが特徴だろうか。前者にはアンインストーラが見あたらないのが気になる。regsvr32 /u で手動でアンインストールしろということか?
現在主流っぽいMP3タグ情報フォーマットまとめ
ちよクロシステム - listexp。DLL を乗っ取りたいときに。
ウィンドウの位置が画面の外に行ってしまわないように制御しようと思い、せっかくなのでマルチモニタにも対応させる方法を調べてみた。MonitorFromRect(), GetMonitorInfo() あたりの API を使えば、各モニタの座標を調べることができるようだ。
ちなみに Win95 では、SystemParametersInfo() に SPI_GETWORKAREA を指定すればデスクトップ領域の座標が得られる。
illiminable Ogg Directshow Filters for Speex, Vorbis, Theora and FLAC - 各種 Ogg シリーズに対応した、DirectShow フィルタ。
ヘボプログラマのヘボ日記:IAMMediaContent インターフェイス - IAMMediaContent の使い方。
mpg123 and MAD DirectShow Filter - ID3v2, Riff MP3 などにも対応している DirectShow フィルタ。
プログラムの行数を簡単に調べるにはどうすればいいのだろう。調べてみたところ、Cygwin が入れてあれば、wc -l を使うのが簡単そうだ。
今まで作ったソフトの行数をちょっと調べてみた。
Waveedit | 6760 |
---|---|
JF | 3575 |
icc | 3425 |
WvePrn | 3330 |
RWFD | 2258 |
dempa | 2209 |
IPL98 | 2077 |
lfnlib | 2069 |
touch | 1466 |
-- | -- |
smmp | 2655 |
全部大したことない。今までに作った一番大きいプログラムが、未だに高校の頃のものだというのがかなりあれだ。もっとも、常日頃、必要な機能をいかに簡潔に実現するかということに苦心しているので小さくなるのはある意味当然ではあるのだが。GUI なソフトはやはり大きくなる傾向にある。今作っている smmp (Simple Multi Media Player) もそこそこ大きくなりそうだ。
Zの部屋 - 統合アーカイバ DLL を呼び出すというソフト (DllCmd)。cab32.exe, undll.exe を参考に作られたらしい。
[00015383](SET)] CDドライブの開閉状態の取得方法
CDのトレイの状態を知る
MCIで複数ドライブあるCD−ROMを指定する
Let's Note の Windows ディレクトリのサイズがやたら大きくなっていたので少し整理。Windows Update のバックアップファイルを削除しておいた。(参考: WinXP消してもいいファイルまとめ)
おぷくろ2 - メディアのイジェクト等を行うソフト。
Unplug.exe - ハードウェアの取り外しをコマンドラインから実行するソフト。
SetupDi を使用してハードウェア機器を列挙する方法
Under the Hood, MSJ February 1997 - 極小サイズの CRT (TINYCRT) がある。
cori95.net :: Firefox高速化 - user.js あるいは、about:config を使った Firefox の高速化設定。
7年ぶりに、unzip32.dll がバージョンアップした。タイムスタンプが狂うのが直ったのはいいことだ。しかし、7-zip32.dll のおかげで unzip32.dll の必要性はすっかり薄れてしまった。速度は若干 unzip32.dll の方が速いらしいが、対応メソッドの多さや圧縮もできる点で 7-zip32.dll の方が便利だ。
C/C++いっさいなし、Javaだけで開発されたOS - JNode - 少量のアセンブラコードと Java で作られた OS らしい。ISO イメージは 100MB ほど、ソースコードは 50MB ほどだった。
xargs の使い方をすぐ忘れてしまうのでメモ。
grep -l foo * | xargs -p -i cp {} bar/
カレントディレクトリから、foo という文字列を含むファイルを探し出し、そのファイルを確認しながら bar/ にコピーする。-p の代わりに -t とすると、実行の確認を求める代わりに、実行したコマンドを表示するだけになる。-i を指定することで、{} が grep の結果で置き換わるようになる。
別のドライブにあるディレクトリへのジャンクションを作ったときに、ディスクの容量を取得するとどうなるか調べてみた。
D:\tmp\ が C:\tmp\ へのジャンクションだとする。カレントディレクトリを D:\tmp\ にして、GetDiskFreeSpaceEx() の第1引数を NULL にして呼び出すと、D: の空き容量が取得された。次に、GetDiskFreeSpaceEx() の第1引数を "." にして呼び出したところ、C: の空き容量が取得された。
Windows のディスク情報取得 API の挙動を少し詳しく調べてみた。一応、目的は、正しいクラスタサイズを取得することである。
どうやらこれで、Win9x でリモートドライブを参照する場合と、NT 系から Win9x の FAT32 のリモートドライブを参照する場合を除いて、正しいクラスタサイズを取得できそうだ。(Win9x で FAT32 のクラスタサイズを取得するには、vwin32 経由で BPB や DPB を読むことになる。)
Win9x と NT 系では CD-ROM, DVD のクラスタサイズが異なっているのが気になったので、少し調べてみた。「ISO 9660 CD-ROMファイルシステムの概要」を見たところ、ファイルはエクステントとして記録され、そして、エクステントは連続する論理ブロックの集まりであり、論理ブロックは通常 2048bytes とある。どうやら CD-ROM では、ファイルは 2KiB 単位で記録されるということなので、FAT におけるクラスタサイズに相当する物は、ISO 9660 では 2KiB ということになりそうだ。UDF の場合はどうなのか、まだ調査中。
HAL(通称雌猫)とArcdllの騒動まとめサイト - 最近問題になっている、Yz2.dll などのライセンス問題などについて。
Japan.internet.com デベロッパー - 別のプロセスにコードを割り込ませる3つの方法
Win32 - KOBUN - WinNT 系では、デフラグを行うための API が用意されているようだ。
ディスク容量の算出 - J2SE 6.0 では、ディスク容量を取得できるようになる。Java How To Programming には、そのほかにも興味深い情報あり。
昨日調べた情報を元にメディアをイジェクトするツールを作ってみた。Win9x でのメディアのロック・アンロックの動作が怪しい。Interrupt 21h Function 440Dh Minor Code 48h を使って、ロックを掛けると、失敗したというエラーコードが返ってきたのだが、手動ではイジェクトできなくなってしまった。ここでアンロック命令を出すと、やはりエラーになり、手動ではイジェクトできない。しかし、Interrupt 21h Function 440Dh Minor Code 49h を使えば問題なくイジェクトできた。
Win2k では、問題なく動いている。Win9x とは違い、イジェクトだけではなく、ロードもできるのは便利だ。Win9x でも ASPI を使えば、ロードや、ロック・アンロックもうまく使えるのかもしれないが、そこまでするのは面倒だ。
先月の spam メールの集計結果。着信拒否にならなかった spam が 1921通。そのうち、@nifty の迷惑メールフォルダーでも Spam Mail Killer でも spam として認識できなかったものが 6通(0.31%)。
XN Resource Editor というソフトを知った。フリーな高機能リソースエディタだそうだ。1つ前の日本語バージョンは、日本語化工房-KUP のファイル置き場から入手できる。
めも日記 - 2005-12-04 に rwfd へのリンクあり。その他興味深い記事多数。
64-bit Windows Programming - 64bit Windows 向けのプログラミング方法
Win9x の場合、メディアをイジェクトするには、Interrupt 21h Function 440Dh Minor Code 49h などを使えばよい。しかし、WinNT 系でのメディアのイジェクト方法が分からなかったので調べてみた。IOCTL_STORAGE_EJECT_MEDIA, IOCTL_STORAGE_MEDIA_REMOVAL などを使えばよいようだ。また、NT 系では IOCTL_STORAGE_LOAD_MEDIA を使えば、メディアを挿入できるようだ。