ハングアップの日々

2005年 4月分

2005/04/30

IOCTL_IDE_PASS_THROUGH

 IOCTL_IDE_PASS_THROUGH でググってみたら、http://cvs.sourceforge.net/viewcvs.py/smartmontools/sm5/os_win32.c というものが見つかった。これで IOCTL_IDE_PASS_THROUGH を使ってみることができそうである。

JmEditor

 JmEditor というテキストエディタを試してみた。タブ形式という点と関数等の一覧表示ができる点が特徴的である。少し使ってみたが、ウィンドウを複数開くことができない点と、Ctrl+C でコピーしたときに範囲選択が解除されないのが不満である。ソースは公開されているが、Delphi 製なので自分で直すことができないのが残念である。

 JmEditor 以外にタブ表示ができるエディタとしては、秀丸やサクラエディタがあるが、どちらも、タブ機能の実装方法が場当たり的な印象がある。
 Mozilla や Firefox のような感じでタブ付きウィンドウを複数開けるエディタはないだろうか。

2005/04/29

TClock Light

 また、TClock Light を改造。今回は tcsntp.exe を改造。ダイアログボックスを表示する際に、ログ (SNTP.txt) の末尾 2KB を読み込んで表示するようにしてみた。これでログを確認するのが楽になる。ついでに、デフォルトの NTP サーバを ntp1.jst.mfeed.ad.jp から、ラウンドロビンを利用した ntp.jst.mfeed.ad.jp に変更しておいた。今回のパッチは、前回までの変更点は含んでいない。

本家の掲示板に書き込んでも反応が全くないのはおもしろくない。2ch のスレは荒れているし、もうだめぽ。

2005/04/28

OpenSSL

 OpenSSL 0.9.7g をコンパイルしてみた。コンパイル方法は、基本的に以前と同じだが、インクルードファイルの場所が微妙に違っている。(以前のメモが間違っていただけのような気もするが。)

> perl Configure VC-WIN32
> ms\do_masm
> nmake -f ms\nt.mak
> md c:\openssl
> md c:\openssl\include
> md c:\openssl\include\openssl
> copy inc32\openssl\*.h c:\openssl\include\openssl
> md c:\openssl\lib
> copy out32\*.lib c:\openssl\lib

Crypt::SSLeay

 OpenSSL 0.9.7g を使って、Crypt::SSLeay を再コンパイルしておいた。こちらもコンパイル方法は、以前と同じ。PPM パッケージも更新しておいたので、

> ppm install http://homepage3.nifty.com/k-takata/perl/Crypt-SSLeay-0.51-5.8.x.ppd

でインストールできる。

ntp 4.2.0

 OpenSSL 0.9.7g を使って ntp 4.2.0 を再コンパイルしてみた。OpenSSL は、コンパイルオプションとして /MD オプションが指定されていて MSVCRT.DLL を使う設定になっているのだが、ntp 4.2.0 は /MT オプションによって LIBCMT.LIB をリンクする設定になっており、一部のプログラムのリンク時にエラーや警告が発生してしまう。前回は、一部のプログラムは適当にごまかしてコンパイルし、ntpd.exe はコンパイルを諦めていたのだが、今回はそこもちゃんとやり直してみることにした。
 まずは、VC++ で ports\winnt\ntp.dsw を開き、メニュー → 「プロジェクト」→「設定」→「C/C++」タブ → カテゴリ「コード生成」→ 使用するランタイムライブラリ「マルチスレッド(DLL)」に変更する。(これを各プロジェクトについて行う。)
 次に、strerror 等でリンクエラーが発生するのでこれを修正する。まず、ports\winnt\include\config.h の # define HAVE_〜 が並んでいる行の下に

# define HAVE_STRERROR
# define HAVE_MKTIME    1

という行を追加、さらに、#include <windows.h> の下に、

#define strerror    strerror_
char *strerror_(int errnum);

を追加。次に、ports\winnt\libisc\isc_strerror.c の

strerror(int errnum) {

という行を

strerror_(int errnum) {

に変更。こんな感じで、ntp-keygen.exe, ntpd.exe, ntpdate.exe, ntpdc.exe, ntpq.exe, ntptrace.exe の全てがコンパイルできた。ただし、ntpd.exe の動作確認は行っていない。自分としては、とりあえず、ntpdc.exe, ntpq.exe, ntptrace.exe が Windows 上で使えればよい。

2005/04/26

TClock Light

 また、TClock Light を改造。今回はアラーム機能を強化して、レジューム時(サスペンド状態からの復帰時)にプログラムを実行できるようにしてみた。レジュームしてから、プログラムを起動するまでの秒数も指定できるようにしてみた。(スクリーンショット) 前回までの変更点を含めたパッチとバイナリを置いておく。

timeadjx の設定がサスペンドすると消えてしまう問題もこれで解決である。レジューム時に何かを実行する機能は他にもいろいろと使えそうである。

2005/04/25

玄箱/HG

 玄箱の RTC とシステムクロックのずれを調べるプログラムを書いてみた。(chkrtc.c)

2005/04/17

nkf

 nkf 2.0.5 が公開されていた。Win32 版のコンパイルの仕方が書かれていないが、Cygwin から以下のコマンドを実行することでコンパイルできた。一応 VC6 でもコンパイルできるようだが、Makefile を修正する必要があるようだ。

$ make CC='gcc -mno-cygwin'

Thunderbird, Mozilla Mailer

 「Thunderbird でメールヘッダ部の高さを指定する方法」というのを見つけた。詳しいやり方は、「Thunderbird のヘッダ表示領域をスクロール可能にする - えむもじら」に書かれている。Mozilla Mailer で試してみたところ、問題なく使えた。ヘッダ部の高さをいろいろいじった結果、以下の設定に落ち着いた。(userChrome.css)

#msgHeaderView {
  max-height: 7.6em !important;
}
#expandedHeaderView {
  overflow: auto !important;
}

しかし、NC 4.x のようにヘッダと本文を一緒に表示する方法があってもいいと思うのだが。

MSN Messenger

 MSN Messengerカスタマイズ ← 広告非表示など

PNG

 PNG ファイルの詳細な情報を表示するプログラムはないかと思い探してみたところ、「dW : Linux : コマンドラインからのグラフィックス操作」という記事を見つけた。ImageMagick のidentify コマンドで、identify -verbose sample.png とすれば詳細な情報が表示される。インターレースかどうかを表示するには、さらに -debug coder または -debug all オプションを指定する必要があるようだ。

HDD Health

 HDD Health のスクリーンショットを撮ってみた。

温度表示が改善されているのが確認できる。

2005/04/16

Mozilla

 Mozilla 1.7.7 をインストール。ついでに、Tabbrowser Extensions (TbE) Ver.1.14.2005041502 もインストール。
少し前のバージョンの TbE を Mozilla 1.7.6 に入れて、履歴を新しいタブで開く設定にして使っていると、履歴をワンクリックしただけで、ページが開いてしまうというバグがあったが、直っていた。
 Mozilla Suite は 1.7 系列で終了で、1.8 は出ないそうだが、Firefox の履歴はどうも気に入らない。Mozilla のように詳細な情報が見たいのだが。あとは、Ctrl+B の挙動も気に入らない。サイドバーにブックマークが開くのではなく、Mozilla と同じようにブックマークマネージャーが起動するようにしたい。この2点がどうにかならない限りは、Mozilla から Firefox に移行しようという気にはなれない。
 Mozilla Suite のブラウザとメーラーを同時に起動した場合と、Firefox と Thunderbird を同時に起動した場合にどちらがメモリ使用量が少ないかも気になるところである。Firefox + Thunderbird では GRE が別々に立ち上がる分メモリを余計に消費しそうな気がするのだが・・・。
 Firefox は zip 形式での配布は止めてしまったのだろうか。1.0.2 と 1.0.3 はインストーラ形式しか見あたらない。インストーラを使いたくないので、1.0.1 からバージョンアップしようという気にならない。

 よく考えたら、Firefox には、元々ブックマークマネージャーが付属しているわけだから、pageinfo と同様にちょっと xul ファイルを記述するだけで、サイドバーの代わりにブックマネージャーを開くようにすることができそうである。早速試してみたところ、あっさりできてしまった。

2005/04/12

HDD Health

 しばらく前から、S.M.A.R.T. 情報表示ソフトとして HDD Health (v2.1 Beta build 159) を使っているが、HDD の温度が正しく表示されないのがかなり気になっていた。一度解析してみようとしたのだが、プロテクトが掛けられていて断念した。プロテクトは ASProtect というもので、その解除ツールとして、stripper なるものがあるということを知り、試してみた。無事アンパックできたので、dispe で逆アセンブル。40bytes ほどパッチを当てたところ、とりあえず自分の環境では、温度が正しく表示できるようになった。
 ついでに文字コードの関係で文字化けしている記号を日本語 OS 用に変更。具体的には、「痴 (92 73)」を「's (27 73)」に、「ーC (B0 43)」を「゚C (DF 43)」に変更した。

URL memo

 sarge化 - Debianハックしちゃうぞ

2005/04/11

Win32 API memo

 SetForegroundWindow() 関連で調べていて、いくつかおもしろい情報を見つけた。

玄箱/HG の時計校正

 「LinkStation/玄箱カーネル掲示板」の No.170 によると、decrementer frequency の設計値は 32.522240MHz らしい。この前、decrementer frequency を測定したときには、32.521930MHz となったが、ntpd の実行結果を基に、より正確な値を算出してみることにした。
 今回の玄箱起動時の tick, freq 値は tick = 9976, freq = 5534843 だったので、起動時の tick の実数値は 9976 + (5534843 / 65536) / 100 = 9976.84455。現時点で ntpdc -c kerninfo を実行したときに表示される pll frequency の値は 89.425ppm なので、ntpd によって修正された現時点の tick の実数値は 9976 + 89.425 / 100 = 9976.89425。したがって、decrementer frequency のより正確な測定値は、32.521930 / 9976.84455 * 9976.89425 = 32.522092[MHz] と計算できる。設計値の 32.522240MHz にかなり近い値だ。
 adjtimex の frequency で指定する値と ntp.drift の値の関係が分かったので、玄箱の起動時に、ntp.drift にも値を設定するようにすれば、さらなる精度の向上ができそうだ。

 玄箱で、時計合わせを行うための設定をまとめておく。まずインストールすべきソフトは、ntpdate, ntp, adjtimex が必要。これらは、apt-get でインストールできる。
 ntpdate が使用する NTP サーバーは、/etc/default/ntp-servers に

NTPSERVERS="ntp.jst.mfeed.ad.jp"

のようにして書いておく。
 ntp の設定は、一般的な ntp.conf の記述のままでよい。ただし、ドリフトファイルを使用するために

driftfile /etc/ntp.drift

と書いておく。
 adjtimex は、起動スクリプトの /etc/init.d/adjtimex を書き換えて、decrementer frequency を基に tick 値、freq 値を計算・設定するようにする。同時に NTP のドリフト値も計算し、ntp.drift に書き込むようにする。(adjtimex) このスクリプトの計算の主要部分は以下のようになっている。

# accurate decrementer frequency
#  default:
#       KURO-BOX/HG: 32522240
#       KURO-BOX:    24391680 ?
precision_freq=32522092
 
# ntp drift file
driftfile=/etc/ntp.drift
 
dec_freq=`/bin/sed -n "s/^decrementer frequency = \([0-9][0-9.]*\).*/\1/p" < /var/log/dmesg`
 
TICK_FREQ_DRIFT=`/usr/bin/awk "BEGIN {\
        d = int($dec_freq * 1000000);\
        t = 10000 * d / $precision_freq;\
        ti = int(t);\
        dr = (t - ti) * 100;\
        f = dr * 65536;\
        OFMT = \"%.3f\";\
        print ti, int(f + 0.5), dr;\
}"`
 
TICK=${TICK_FREQ_DRIFT%% *}
FREQ_DRIFT=${TICK_FREQ_DRIFT#* }
FREQ=${FREQ_DRIFT% *}
DRIFT=${FREQ_DRIFT#* }
echo "TICK=$TICK, FREQ=$FREQ, DRIFT=$DRIFT"

precision_freq の値は前述の方法で算出した値を設定しておく。面倒ならば、32522240 にしておいても十分かもしれない。(玄箱/HG の場合) また、adjtimex が ntpdate より後に実行されるようにするため、/etc/rcS.d/S20adjtimex を /etc/rcS.d/S99adjtimex にリネームしておく。

 以上の設定をして再起動したところ、再起動から 50分で offset が 1ms 未満になった。今までに比べて格段に収束が早くなった。

$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp3.jst.mfeed. fs-monntp1.mfee  2 u   24  128  377   18.630   -0.173   0.328
+ntp2.jst.mfeed. ote-ntp1.jpnap.  2 u   35  128  377   18.646   -0.114   0.318
+ring.nict.go.jp sntp1.nict.go.j  2 u   28  128  377   20.097   -0.201   0.389

ローカルの NTP サーバとしては十分な精度かも。

玄箱 URL memo

 玄箱でポータブルサーバー(玄箱の信頼性対策)

URL memo

 Cybernetic Survival Network ← データ抹消・データ復元に関する情報

2005/04/10

ntp, adjtimex

 ntp のドリフトファイルに記録される値 (d) と、adjtimex の frequency で設定される値 (f) を比較してみた。どうやら、d = f / 65536 の関係が成り立っているようだ。以下実行例。

$ /sbin/adjtimex -p
         mode: 0
       offset: 0
    frequency: -882421
     maxerror: 2214830
     esterror: 76131
       status: 9
time_constant: 7
    precision: 1
    tolerance: 33554432
         tick: 10025
     raw time:  1113064342s 245743us = 1113064342.245743
 return value = 5
 
$ ntpdc -c loopinfo
offset:               -0.122955 s
frequency:            -13.465 ppm
poll adjust:          30
watchdog timer:       3811 s

-882421 / 65536 = -13.46467 である。また、tick の整数値 (ti) と d から tick の実数値を求めるには、ti + d /100 とすればよい。この場合は、10025 + (-13.465 / 100) = 10024.86535 となる。

玄箱/HG

 オリジナルの玄箱はどのようにあのずれのひどいシステムクロックを修正しているのか調べてみた。何か怪しいファイルはないかと調べてみると、/sbin/calib_time という実行ファイルがあった。cron によって、毎日 4:02 に、/sbin/calib_time -p 9 というコマンドを実行して、RTC (Real Time Clock) の値を /proc/driver/rtc 経由で読んでシステムクロックに設定しているようだ。逆にシステムクロックの値を RTC に書き込むにはどうするのだろう。ググっても分からない。

2005/04/09

TClock Light

 昨日の右クリックメニューに関する修正で、メニューに対するキー操作もできるようになったので、メニューにアクセスキーを追加してみることにした。これで、かなり使いやすくなった。
 GetMessagePos() の解説を見ると、LPARAM からカーソルの位置を表す x 座標と y 座標を取得する目的には、LOWORD と HIWORD のどちらのマクロも使ってはいけないと書かれている。代わりに GET_X_LPARAM と GET_Y_LPARAM の各マクロを使って、x 座標と y 座標を取得するようにと書かれている。知らなかった。TClock Light のソースにも、LOWORD, HIWORD を使っている部分があったので、GET_X_LPARAM, GET_Y_LPARAM を使うように書き換えておいた。今まで TClock Light に加えた変更を全てまとめたパッチとバイナリを置いておく。

玄箱/HG

 apt-get で smartsuite をインストールしてみた。

# smartctl -a /dev/hda

で S.M.A.R.T. 情報が表示される。

2005/04/08

w32time.dll

 Windows Time サービスの本体である w32time.dll をちょっとチェック。NtQuerySystemTime, NtSetSystemTime, NtQuerySystemInformation といった非公開 API をインポートしていた。また、W32TimeSyncNow() という関数をエクスポートしていることが判明。おそらく「日付と時刻のプロパティ」の「インターネット時刻」タブで「今すぐ更新」ボタンを押したらこれが呼び出されるのだろう。呼び出し方が分からないが。

TClock Light

 TClock Light の右クリックで表示されるポップアップメニューの挙動が気に入らないので修正してみることにした。一番の問題は、メニュー以外の領域をクリックしてもメニューが消えない点である。メニューを消すには、どれかメニューアイテムをクリックして実行するか、時計の部分をクリックするしかない。またこれと関連して、キーボードの上下キーで項目の移動ができないし、Esc キーでメニューを閉じることもできない。もう1つ非常に細かい点なのだが、Windows の標準の動作としては、右ボタンを離したときにメニューが表示されるのが正しい動作なのだが、TClock Light の右クリックメニューは、右ボタンを押したときにメニューが表示されるようになっている。
 メニューが消えない問題に関しては、MSDN Library の英語版の TrackPopupMenu() の Remarks の部分に、通知アイコンでコンテキストメニューを表示するには、

  SetForegroundWindow(hDlg);
  
  // Display the menu
  TrackPopupMenu(   hSubMenu,
                    TPM_RIGHTBUTTON,
                    pt.x,
                    pt.y,
                    0,
                    hDlg,
                    NULL);
  
  PostMessage(hDlg, WM_NULL, 0, 0);

というようにして呼び出す必要があると明記されていた。(日本語版の TrackPopupMenu() には書かれていない。) ただ、これをそのまま TClock Light のソースに書き加えても、うまく動かない場合があった。どうも SetForegroundWindow() が効いていない場合があるようである。Win32 Programming Tips :Windows98でSetForegroundWindow や、必ずウィンドウをフォアグラウンドまたはアクティブにするには? を参考に書き直したところ、うまくいくようになった。(ただし、SPI_SETFOREGROUNDLOCKTIMEOUT に関しては結局何もしていない。)

 右ボタンを押したときにメニューが出るのも、離したときに出るように変更。

timeadjx

 timeadjx に関してもう少し調査。マシンを再起動したら timeadjx で設定した値はリセットされることが確認できた。さらに再起動だけではなく、スタンバイでも値はリセットされてしまうようだ。スタンバイで値がリセットされないのならば、timeadjx をスタートアップにでも入れておくだけでシステムクロックの精度を上げることができるのだが、スタンバイで値がリセットされるというのはちょっと困ったことだ。

Fire File Copy

 touch のソースを元に Fire File Copy に、Win9x でのディレクトリのタイムスタンプ処理が追加されたそうな。(Fire File Copy Part2 より)

2005/04/07

timeadjx

 st6e で timeadjx を使ってみた。TClock Light の NTP クライアント (tcsntp.exe) のログより、システムクロックは 30分で 170ms ほど進むことが判明。timeadjx で値を 100144 から 100134 あるいは 100135 に変更したところ、30分でのずれが 10ms 程度まで小さくなった。

TClock Light

 TClock Light の省メモリ化パッチを作ってみた。やっていることは、この前の Dempa でのメモリ使用量削減方法と全く同じである。TClock Light でも 2〜3MB 程度のメモリが削減できた。(tclocklight-040702-3-small-mem.diff)

JST Clock

 JST Clock では、ブラウザ上で、日本標準時とシステムクロックのずれをチェックできるのがおもしろい。精度はあまり高くないようだが。

NTP クライアント

 Vector の時計・時間関係ツールにはかなりの数の NTP クライアントがある。

2005/04/06

uptime

 uptime なんてソフトを作ってから、同種のソフトがないかチェックしてみたら、Uptime Clock というものを見つけた。uptime では、64bit の System Up Time 値を取得するために、わざわざレジストリのパフォーマンスカウンタを読んでいるのだが(MSDN にもそうするように書かれていた)、Uptime Clock は QueryPerformanceCounter() を呼び出しているだけだった。orz orz orz
 パフォーマンスカウンタの読み方が分かったのでよしとするか。ところで、QueryPerformanceCounter() のオーバーフロー周期はどのくらいだろうか?
 (計算してみたところ、カウンタ周波数 3,579,545Hz の CF-R2C では 163412.5年、2,457,600Hz の Ls312 では 238013.6年と判明。なお、計算には Perl を使った。)

timeadjx

 timeadjx を CF-R2C で使ってみた。

> timeadjx get
GetSystemTimeAdjustment() 呼出し中...
割込み発生時の加算時刻: 100394 (100ns単位)
ハードウェア割込み間隔: 100144 (100ns単位)
定期的な時刻調整      : 有効
自動的な時刻補正      : 無効
  (自動的な時刻補正の詳細は、KB232488を参照してください)

などと表示された。RTC の 100394/100144 = 1.002496倍の速度でシステムクロックが進むということを示している。(1時間で 9秒のずれ) 最近 CF-R2C の時計の狂いが多いと思っていたのだが、これが原因だったようだ。いろいろと試してみたところ、こんな妙な値に設定している犯人は、WinXP 標準の SNTP クライアントである Windows Time サービス (W32TIME) のようだ。一体どんな計算をしてるのだか。TClock Light などを使っている方がはるかに良さそうだ。

Win32 API

 メッセージクラッカー・ビューアーというソフトを見つけた。windowsx.h を使ってソフトを書くには便利かも?

 Windows API Hooking Tutorial (KENJI'S HOMEPAGE) ← ちょっと UG っぽいプログラミング情報

2005/04/05

DempaCtl

 Dempa の設定ソフトである、DempaCtl の方もメモリ使用量を減らそうと思って、ImmDisableIME() を使ったら、メインダイアログは開くのに、設定ダイアログが開かないという現象に遭遇した。しばらく悩んだが、InitCommonControls() を呼んでいなかったためにスピンコントロールが使えなくなっていたことが原因だと判明した。ImmDisableIME() を使っていないときは、IME 関連の DLL のどれかが InitCommonControls() を内部的に呼び出していたために、自分のプログラムではわざわざ InitCommonControls() を呼ばなくても動いたということらしい。

2005/04/04

電源管理、ACPI

 サスペンド状態から復帰するときの Dempa の挙動を再確認しようと思い、Windows の電源管理関係について調査。「6 章 OnNow/ACPIのサポート」などにいろいろ書かれている。

 キーボードの自爆ボタン (Power, Sleep) を押したときの挙動についてもちょっと調べてみた。どちらのキーの場合も、WM_POWERBROADCAST/PBT_APMQUERYSUSPEND が送られてきて、そのメッセージに TRUE を返せば、WM_POWERBROADCAST/PBT_APMSUSPEND が送られてきて、電源が落ちる。WM_POWERBROADCAST/PBT_APMQUERYSUSPEND に対して FALSE を返せば電源は落ちない。つまりこれらのメッセージに FALSE を返すようなアプリを作って常駐させておけば自爆ボタンを無効化することができる。ただ、WM_POWERBROADCAST では、Power ボタンと、Sleep ボタン、あるいは Windows の終了でサスペンドを選んだのかの判別はできないようである。Power ボタンだけを無効にしたい場合にはどうしたらよいのだろう。

 Windows では、サスペンドを実行するための API として、SetSystemPowerState() という API が用意されている。この API では、Win98 ではハイバネーションへの移行はできないという問題がある。Win98 でもハイバネーションへ移行するための API はないのかと思っていたのだが、SetSuspendState() という API を見つけた。早速試してみたところ、エラーコード 183 (ERROR_ALREADY_EXISTS) が返ってきて、ハイバネーションはおろか、スタンバイすらも実行できなかった。Ls312 と FIVA 102 の2機種で試してみたがどちらも同じだった。ACPI をサポートしていないと使えないのだろうか。しかしよく似た API が2つもある理由がよく分からない。

SetSystemTimeAdjustment()

 WinNT 系には、SetSystemTimeAdjustment() という API がある。Linux の adjtimex のように、システム時計の進み具合調整できる API らしい。SetSystemTimeAdjustment() の動作の詳細を知りたいと思い調べていたら、timeadjx というソフトを見つけた。とりあえず DL してみたが、まだ試していない。

2005/04/03

Dempa のメモリ使用量削減

 最近、ntp など時計関連のソフトをいろいろいじったりしていたが、自分が作った時計関連ソフトがあったことを思い出して久しぶりにいじってみた。Dempa のメモリ使用量が意外と多いことに気付いて、メモリ使用量の削減方法を調べてみることにした。(WinXP のタスクマネージャ上では、メモリ使用量は 3,488KB と表示された。) デバッガ上で Dempa を動かしてみると、IME 関連の DLL がいくつも読み込まれていることに気付いた。CreateWindow() の前に、

ImmDisableIME(0);

を実行してみたところ、約 2MB のメモリ使用量の削減に成功した。(3,488KB → 1,188KB) なお、ImmDisableIME() は Win98 で新設された API なので、Win95 でも動くようにするには、例によって、LoadLibrary()GetProcAddress() を使う必要がある。
 WinXP のタスクマネージャを見ていると、メモリ使用量が 1MB を切っているようなプログラムもいくつかある。そこで、Dempa のメモリ使用量をさらに減らせないか試してみることにした。タスクマネージャで他のプログラムの挙動を確かめていたところ、ウィンドウを最小化するとメモリ使用量が急激に減ることが分かった。Dempa では、タイマーや、サスペンド状態からの復帰の検知など、一部の特別なウィンドウメッセージを受け取るためだけに、非表示のウィンドウを持っている。このウィンドウを単に非表示にするだけではなく、最小化してから非表示にするように変更してみた。

ShowWindow(hwnd, SW_MINIMIZE);
ShowWindow(hwnd, SW_HIDE);

この2行を書き加えてみたところ、WinXP のタスクマネージャの表示ではメモリ使用量が 144KB とさらに大きく削減された。
 ウィンドウを最小化すると WinXP/2k のタスクマネージャ上ではメモリ使用量が大幅に減ったように見えるが、正直なところ、これによって本当にメモリ使用量が減っているのか非常に怪しい気がする。
 Win98 では、タスクマネージャのように簡単にプログラムのメモリ使用量を確認するツールがないので、システムモニタの「アロケート済みメモリ」の変化で使用量を調べてみた。ImmDisableIME() を使う前は、数MB のメモリを使っていたが、ImmDisableIME() を使うと、メモリ使用量が 570KB 程度まで減ることが確認できた。WinXP/2k とは異なり、ウィンドウを最小化することによるメモリ使用量の削減は確認できなかった。

2005/04/02

ntp

 ntp のドリフトファイル (/etc/ntp.drift) に書き込まれる情報をどこかで参照できないかと思い調べてみた。以下のコマンドのいずれかで確認できるようだ。

$ ntpdc -c kerninfo
pll frequency:        x.xxx ppm
 
$ ntpdc -c loopinfo
frequency:            x.xxx ppm

adjtimex で使われる値と ntp.drift の値の関連も知りたいところ。

2005/04/01

spam

 先月の spam メールの集計結果。着信拒否になった spam が少なくとも 5155通。着信拒否にならなかった spam が 474通。そのうち Spam Mail Killer で削除できた spam は 464通(97.9%)。誤削除が 1通。

ntp

 自分でコンパイルした、ntp 4.2.0 Windows 版のバージョン表記(日付)がおかしい。Windows 版をコンパイルする際には、makever.bat というバッチファイルが date コマンドの実行結果を加工して、version.h にコンパイル時の日付を書き込むようになっているのだが、Windows の英語版と日本語版の date コマンドの表示形式の違いが原因で makever.bat が日付を正しく取得できていないのが原因だった。日本語版 Windows でもバージョン表記がおかしくならないようにしてみた。(ntp-4.2.0-winnt.diff)

玄箱/HG

 apt-get で hdparm というソフトを入れてみた。コマンドラインから、

# hdparm -S 36 /dev/hda

と入力すると HDD に 5*36=180秒間アクセスがないとスタンバイモードになるようになる。また、コマンドラインから、

# hdparm -t /dev/hda

と入力すれば、HDD の転送速度が表示される。実行結果は 44.4MB/s と出た。他にもいろいろと IDE HDD のパラメータを表示、設定できるソフトのようである。

start コマンド

 コマンドラインから関連付け起動が行える start コマンドを模して、startw などというものを作ってみた。Win9x では、start コマンドは CUI プログラムとなっており、WinNT 系では cmd.exe の内部コマンドになっているので、いろいろと不便な点もあり、ずいぶん前から作ろうと思っていたのだが、ようやく作った。startw ができあがってから、同種のソフトにどのようなものがあるか探してみた。はじめは Vector で探したのだが、この種のソフトはいくつものカテゴリに分散しており、効率的に探すことはできなかった。とりあえず見つかったソフトをいくつか示す。

execute は、サイズがわずか 2KB で非常に好感が持てる。startw も同じサイズに納めたかったが、機能が多く、ちょっと無理だった。探し方が甘かったのか、プログラムの優先度を指定できるものは startw 以外には見あたらなかった。
 (後日、ck に一時期付属していた ckstart というものがあったことを思い出した。しかし、ckstart は現在公開されていないし、cygwin1.dll がないと動かないという点は Cygwin 以外の環境で使うには不便である。)


Copyright (C) 2005 K.Takata