雑談所

ブログのような掲示板。コメントなんか有ったら書き込みどうぞ。

スクリーンセーバー【ぐるぐる】 Ver1.10

作ったソフトを一通り修正して回ってみるか企画休止と思いきや第四弾。
バグ報告を受けかなりひどいバグ持ちだったので修正をしました。
例によって大昔に作ったソフトはソースが余りに酷くメインの部分は完全に作り直しとなってます。
変数名が日本語だったり、まだそれは内部の事なので良いのですがiniファイルに保存する名前のスペルが間違ってたり(speadって何だろう?)駄目だコイツ・・・早く何とかしないと・・・状態。

スペックの良いマシンを使っても回転速度がWin9xでどうしても上がらなかったのですが原因はタイマーの精度が9xの場合悪く速く呼ばれなくてそれがネックになってました。
それを自前のタイマーを作ることで解決。速度は速くしようとすればもっと速く出来ましたがまともに見えなくなるので制限を掛けました。
それから渦巻きを動的に作成する事で色を付けることが出来るようになってます。でも色を変えると気持ち悪さ倍増です。
さらにこれでファイルサイズを減らすことは出来ましたが画面の作成をするのに時間が掛ってしまうので苦肉の策で静止画を表示する機能を追加しました。
デフォルトの画像はNASAのオーロラの画像を使っています。Vistaに付属している画像にオーロラの画像が有るのですが、歪んでるときの揺らめきが良い感じだったので自由に使えるオーロラの画像を探してたらウィキペディアに発見、で使わせてもらってます。トリミングをして解像度を落としてるので元画像はウィキペディアのオーロラの項目を見てください。NASAのサイトにも有るはずですが何処に有るのかはちょっと不明です。
他にも入道雲とか宇宙の画像もかなり神秘的になるのでお勧め。宇宙の画像はNASAのサイトに山ほど転がってます。どれも秀逸です。
-修正追記-
確認したらNASAじゃなくてアメリカ空軍でした。何でNASAだと勘違いしたんだろう?
Readme.txtの説明も間違ってるので急きょ修正差し替えしてます。

のんびりやってたら修正に3ヶ月も掛ってしまいましたね。怠け過ぎかな?
今後はFTPソフトの開発に戻ります。愛用ソフトはフリーじゃなくなってしまったし。でも完成まで5年ぐらいかかりそうなペースだなぁ。まだガワしか作ってないし。


以下、更新点の詳細です。
【“スクリーンセーバー【ぐるぐる】 Ver1.10”の続きを読む】

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ソフトの改悪が酷くまともに動かなくなってるので自分に必要な機能だけを絞ったクローンでも作ろうかなと設計中。
旧バージョンを使えれば良いのですが起動時にバージョンチェックしてて古いバージョンは起動できない設計になってるのでどうしようもありません。
まともなのが完成したら公開するかも知れませんが、結構面倒なソフトだし途中で投げ出す可能性も大なので期待しないでください。
・・・最初から期待などしてない?これまた失礼しました(汗


以下、修正点の詳細です。
【“NALT Ver1.20”の続きを読む】

Speeeeed Ver1.51

置換えリストエディタにバグがあったので修正です。
長い文字列を登録しても保存時に256バイト以降が勝手に削除されてました。
あと、ちょっとしたGUIのバグ修正も。

どうやらリストコントロールに問題がある感じ。
リストコントロールにLVM_GETITEMTEXTを投げ戻る値は通常ならLVITEM構造体のcchTextMaxで指定したサイズより文字列が大きい場合は、cchTextMax-1だけコピーし最後に\0を付加し戻り値としてcchTextMax-1が返りますが、2バイト文字が含まれる場合cchTextMaxコピーしcchTextMaxを返します。
そのため、MFCの実装でもし戻り値が用意したバッファ-1のサイズならサイズを確保しなおし再取得する訳ですが、一つ大きい値が返ってくるのでそこで処理が終わってしまい後ろが切れてしまいます。
# ただしUnicode版(W版)では発生しないと思われます。

この問題結構影響大きいですね。
Clipyも同様に後ろが切れるバグ抱えてます。
とは言えClipyにおいてNT系はW版のAPI使ってるので9x系でしか起きない問題ですが。

他に最近アセンブラで色々遊んでるので文字列検索のルーチンをアセンブラ化して更に高速化させようかと思ったけどVC++の最適化ってかなり凄いので下手に弄ったら余計遅くなるような気もしたのでこれはヤメ。
サイズの最適化なら上手くできてるか簡単に把握できますが速度の最適化は環境によっても変わるから確かめにくいですし。


では以下更新点の詳細です。
【“Speeeeed Ver1.51”の続きを読む】

lltoa(インラインアセンブラ版)

64ビット符号付き整数(LONGLONG)を文字列に変換する関数。
無駄にアセンブラで実装。
必要に駆られて作ったけど要らなくなってしまい消すのも勿体無いのでメモ。
速度よりサイズ重視。まだ改良の余地はありげ。
# バッファに反転コピー辺りはストリング命令使えばもっと良くなるはず

肝は負数は反転して正数にしてしまうのと64bit整数の割り算で商が32bitを超える場合の対処法で、最初に上位32bitを割っておいてその商を別に保存し、余りを上位32bitに設定しなおして再度割ってやるとオーバーフローせずに32bitに収まり、別に保存した上位32bitと計算結果の商の下位32bitで64bitの商が弾き出せます。

というわけで以下コード。

void lltoa(LONGLONG value, char *string)
{
char tmp[20];
_asm {
; edi データ保存
; esi 割る数(10)
; ecx:ebx value
// 絶対値取得
lea edi, tmp
mov esi, 10
mov ecx, dword ptr[value+4]
mov ebx, dword ptr[value]
or ecx, ecx
jge LTA1
mov eax, ecx
mov edx, ebx
neg eax
neg edx
sbb eax, 0
mov ecx, eax
mov ebx, edx
mov eax, string
mov [eax], '-'
inc string
// 商余Get
LTA1: mov eax, ecx
xor edx, edx
div esi
mov ecx, eax ; 商上位32bit
mov eax, ebx
div esi
mov ebx, eax ; 商下位32bit
add edx, '0' ; 余
mov [edi], dl
inc edi
test ecx,ecx
jne LTA1
test ebx,ebx
jne LTA1
// バッファに反転コピー
lea ebx, tmp
mov esi, string
LTA2: dec edi
mov al, [edi]
mov [esi], al
inc esi
cmp edi, ebx
jne LTA2
mov [esi], 0
}
}

NALT Ver1.10

作ったソフトを一通り修正して回ってみるか企画第三弾。
デフォルトのNTPサーバの変更とちょっとバグ修正と言うか使い勝手の向上するだけのつもりでしたが結局内部的には半分以上修正しています。
まずNTPサーバに優しい設計に大幅に修正しました。それに併せて使い勝手も少々変更されました。
これを作った当時、ぶっちゃけネットワークに関してTCPとUDPの違いも碌に分ってない程度の知識でしたので、常駐するようなソフトではないと言え結構サーバーに負担かけてました。
あと軽量化の為、相当な最適化を行っています。ただ、この最適化はファイルサイズ重視の最適化なので 速度的には数ナノセコンド程度遅くなってるでしょうが。
グローバル変数使いまくったりでソースの可読性すこぶる悪くなりましたが極々小さなプロジェクトなのでその辺は気にしない。
お陰で機能を増やしながらも9キロバイトから8.5キロバイトへ512バイトのダイエットに成功です。本当はクラスタサイズ区切りの8キロまで落としたかったけど、もうこれ以上はリソース削らない限り絞れません。

さて、第四弾は何を修正しましょうか。
ポストペットチェンジがベータバージョン出したまま放ってあるので、それを修正すべき所ですがもはや需要ははっきり言って無いので修正しても意味無いんですよね。
ダウンロード数的に言えば需要が多いのはこんばいんかな。でも修正するところ無いしなぁ。

-追記-
NALTをVistaで動かす際はUACが有効だと時刻は修正されません。
Vistaで使うならUACは切ってください。


以下はNALTの修正点の詳細です。
【“NALT Ver1.10”の続きを読む】
次のページ

新規記事の投稿


ホームページ アフィリエイト レンタルサーバー FC2ブログ