NALT Ver1.20
時刻取得に関し大きなミスに気がついたので修正版です。
修正しているうちに色々直したいところもあれこれ出てきたので一緒に修正。
NTPサーバから取得される時間が一定でないのはネットワークの遅延のせいだと思ってましたが、調べてみた結果ミリ秒の取得方法は取得したデータ×200ピコ秒ではなく32bitの小数点で計算方法が違ってました。
RFCには「約200ピコ秒の精度」って書いてあるのを勘違い。参考にしたサンプルも200ピコ秒で計算してましたし。
答えは(取得したデータ×1000)>>32が正解ですね。
RFCは間違ってない、確かに"約"だし。
それから他にも精度の悪いGetTickCountを使うのやめてQueryPerformanceCounterで計算したりして精度を高めテストした環境では1ms以下の誤差で修正できるようになりました。
ただし、OSがME(多分9x系は)だとSetLocalTimeの際に時刻がずれてしまう様なのでどうしても少し誤差が発生してしまいますね。
これら機能修正のためにファイルサイズが大きくなってしまったので一旦はソースをほぼアセンブラ化。
ただ、リリースバージョンを後で逆アセンブラとかして調べてみるとアセンブラ化した事で逆にサイズが増えてた部分も多々あり結局大分元に戻しましたが。VC++の最適化は凄いと噂には聞いてはいましたが実際に調べてみると凄いですね。
それでもなんだかんだで機能を増やしたにも係わらず100バイト程度の削減に成功。とは言え512バイト減らさないとファイルサイズは変わらないので見た目変化ありませんが。
実はこのバージョンは一月以上前には完成していて何時でも公開できる状態でしたが色んなPCで動作テスト(環境の違いでどの程度誤差が出るか)してみたくて暫く放置。
ネットカフェとかのPCでテストしてみようかなと思ってましたが、実際に行ってテストしようとすると動作せず。WindowsのTimeサービスもエラーで止まってるのでどうもルータ辺りでNTPのポートが塞がれてる様子。
試したのは2店だけですが結構セキュリティーしっかりしてるもんですね。PC自体はadmin権限で動作してるから甘いと思ってましたが。
結局テストは手元の環境の2台だけしかしてませんが、せっかく作ったのにこれ以上放置するのもなんなので公開することにします。
一通り修正してみる企画はひとまずこれで休止。結局3つだけしか直してないですね。まぁ後は殆ど需要ないですから直す気になれません。
今は個人用にソフトを作ってますので暫く他のソフトのバージョンアップは何かしら無ければしないでしょう。
この頃と言っても大分前からですが愛用していた某FTPソフトの改悪が酷くまともに動かなくなってるので自分に必要な機能だけを絞ったクローンでも作ろうかなと設計中。
旧バージョンを使えれば良いのですが起動時にバージョンチェックしてて古いバージョンは起動できない設計になってるのでどうしようもありません。
まともなのが完成したら公開するかも知れませんが、結構面倒なソフトだし途中で投げ出す可能性も大なので期待しないでください。
・・・最初から期待などしてない?これまた失礼しました(汗
以下、修正点の詳細です。
修正しているうちに色々直したいところもあれこれ出てきたので一緒に修正。
NTPサーバから取得される時間が一定でないのはネットワークの遅延のせいだと思ってましたが、調べてみた結果ミリ秒の取得方法は取得したデータ×200ピコ秒ではなく32bitの小数点で計算方法が違ってました。
RFCには「約200ピコ秒の精度」って書いてあるのを勘違い。参考にしたサンプルも200ピコ秒で計算してましたし。
答えは(取得したデータ×1000)>>32が正解ですね。
RFCは間違ってない、確かに"約"だし。
それから他にも精度の悪いGetTickCountを使うのやめてQueryPerformanceCounterで計算したりして精度を高めテストした環境では1ms以下の誤差で修正できるようになりました。
ただし、OSがME(多分9x系は)だとSetLocalTimeの際に時刻がずれてしまう様なのでどうしても少し誤差が発生してしまいますね。
これら機能修正のためにファイルサイズが大きくなってしまったので一旦はソースをほぼアセンブラ化。
ただ、リリースバージョンを後で逆アセンブラとかして調べてみるとアセンブラ化した事で逆にサイズが増えてた部分も多々あり結局大分元に戻しましたが。VC++の最適化は凄いと噂には聞いてはいましたが実際に調べてみると凄いですね。
それでもなんだかんだで機能を増やしたにも係わらず100バイト程度の削減に成功。とは言え512バイト減らさないとファイルサイズは変わらないので見た目変化ありませんが。
実はこのバージョンは一月以上前には完成していて何時でも公開できる状態でしたが色んなPCで動作テスト(環境の違いでどの程度誤差が出るか)してみたくて暫く放置。
ネットカフェとかのPCでテストしてみようかなと思ってましたが、実際に行ってテストしようとすると動作せず。WindowsのTimeサービスもエラーで止まってるのでどうもルータ辺りでNTPのポートが塞がれてる様子。
試したのは2店だけですが結構セキュリティーしっかりしてるもんですね。PC自体はadmin権限で動作してるから甘いと思ってましたが。
結局テストは手元の環境の2台だけしかしてませんが、せっかく作ったのにこれ以上放置するのもなんなので公開することにします。
一通り修正してみる企画はひとまずこれで休止。結局3つだけしか直してないですね。まぁ後は殆ど需要ないですから直す気になれません。
今は個人用にソフトを作ってますので暫く他のソフトのバージョンアップは何かしら無ければしないでしょう。
この頃と言っても大分前からですが愛用していた某FTPソフトの改悪が酷くまともに動かなくなってるので自分に必要な機能だけを絞ったクローンでも作ろうかなと設計中。
旧バージョンを使えれば良いのですが起動時にバージョンチェックしてて古いバージョンは起動できない設計になってるのでどうしようもありません。
まともなのが完成したら公開するかも知れませんが、結構面倒なソフトだし途中で投げ出す可能性も大なので期待しないでください。
・・・最初から期待などしてない?これまた失礼しました(汗
以下、修正点の詳細です。
・誤差の修正範囲を9999まで設定できるよう変更。
・誤差の表示を時分秒で表示するよう変更。
・GetTickCountから精度の高い高分解能パフォーマンスカウンタを使うよう変更。
・時刻修正の計算処理時間を考慮するよう変更。
・NTPサーバ時刻異常を検出するよう変更。
・server.lstが開けなくてもきちんと起動するよう変更。
・NTPサーバリストの区切りにスペースやタブ(空白文字)も使えるよう変更。
・2036年問題に対応。但し代わりに2104年問題が発生。
・NTPサーバの時刻取得でミリ秒の計算の仕方が間違ってたのを修正。
・プラス誤差だと誤差が1ms少なく表示されていたのを修正。
・ダイアログのボタンのズレを修正
・一部アセンブラで最適化。
・誤差の表示を時分秒で表示するよう変更。
・GetTickCountから精度の高い高分解能パフォーマンスカウンタを使うよう変更。
・時刻修正の計算処理時間を考慮するよう変更。
・NTPサーバ時刻異常を検出するよう変更。
・server.lstが開けなくてもきちんと起動するよう変更。
・NTPサーバリストの区切りにスペースやタブ(空白文字)も使えるよう変更。
・2036年問題に対応。但し代わりに2104年問題が発生。
・NTPサーバの時刻取得でミリ秒の計算の仕方が間違ってたのを修正。
・プラス誤差だと誤差が1ms少なく表示されていたのを修正。
・ダイアログのボタンのズレを修正
・一部アセンブラで最適化。