2008年2月20日 星期三

[程式設計構想] 使用 EXCEL 巨集合併/比對/更新多種格式的通訊錄

在這個資訊時代, 我們將親友的連絡資料儲存在各種媒體

  • Outlook 等 郵件軟體 的 『連絡人』
  • EXCEL, WORD, 純文字, 或各種格式的檔案
  • SIM 卡 或 手機電話簿
  • PDA, 電子字典, 股票機 或 其他類似的電子產品

於是, 你可能有以下的困擾 :

  • 不確定每個地方的資料是否同步 ---- 雖然 PDA, 手機, 電子字典 ... 等, 大部份都有提供和電腦『同步連絡人』的方式, 但這些方式不見得都方便維護多種設備間的同步性, 除非這些資料全部都和 Outlook 的『連絡人』雙向同步。
  •  不確定如何合併/比對/更新資料 ---- 當你拿到更新的 EXCEL, WORD 等『連絡人』資料, (例如: 部門通訊錄, 或是同學會通訊錄), 該如何將這些資料合併/更新到 Outlook 或是 手機 呢? 還是真的只能逐筆『人工比對』呢?

.

一直沒有找到現成軟體可以解決這樣的問題, 所以找了一些資料, 準備開始將想了很久的構想, 寫成程式。

目前的準備資料 :

.

至於, 為何使用 EXCEL VB 巨集, 主要有以下原因

  • 不用另外安裝 VB, Visual C, 或 Delphi
  • 和 Outlook 的互動功能完整
  • 直接使用 EXCEL 表格, 不需要額外的資料庫
  • 如果, 真的寫出完整的功能, 則 EXCEL 表格將和 Outlook 連絡人同步, 就不定一要開 outlook 才能查資料, 另外, 也可以當成是備份。
  • 沒有使用 Outlook 時, 還是可以將通訊錄合併成 EXCEL 檔案,
    (如果使用 Outlook VB 巨集, 要回過頭來存取 EXCEL 表格, 反而不方便)

.


(...繼續閱讀.../...CONTINUE...)

[程式設計] RDTSC -- CPU 測速

因為工作上的需要, 在我的舊資料中找到 2004 年 寫的 RDTSC.EXE, 可以用來在 DOS 底下測量 CPU 時脈。

.

RDTSC 讀的是 CPU 內部的計數器 (counter), 這個計數器會隨著 CPU 的每一個時脈 (clock) 遞增, 所以將 RDTSC 與系統時間 (RTC, real time clock) 互相比對, 即可得知 CPU 時脈。此外, RDTSC 也可以拿來作高精度計時, 當年我就量過 印表機埠 (printer port) 在 SPP 模式底下的每次 I/O 動作大約要 2 us。

Pentium (含) 以後的 CPU 都支援 RDTSC, 而如果編譯器 (complier) 沒有支援時, 可用機械碼 0F31 代替, 再從 EAX, EDX (32 位元暫存器) 取回結果。此外, 純 DOS 底下的一般編譯器 (例如: Turbo C, Turbo Pascal ... 等) 不見得有支援 32 位元的暫存器, 可改用 Symantec C, Watcom C, Dev Pascal ... 等

.

此外, CpuSpeed.exe (CPU Speed - PHP, or Dos App, littleblackdog.com, 2003-03) 也可以測出 CPU 時脈, 但一時間找不到下載連結 ...

.

RDTSC.EXE 使用方式如下,

  • 將RDTSC.exe 與 CWSDPMI.exe 放在 DOS 開機底下的同一個子目錄
  • 執行 RDTSC.exe
    (不需要執行CWSDPMI.exe, 但如果缺少這個檔案, 則會出現 no DPMI 的錯誤)clip_image001

虛擬86模式 (中文 Wiki)

DPMI : DOS Protected Mode Interface - Wikipedia, the free encyclopedia

.

執行結果, (Virtual PC 底下 DOS 執行的擷圖)

  • 會先跑一次 20 cycle 然後再跑 2000 秒, 也可以按 ESC 結束
  • 右欄顯示『迴歸』計算出來的 CPU 頻率
    (在 Virtual PC 底下看到和 NB 實際一樣是 1.6G)
  • 當時用的似乎是 dev-Pascal (待查, http://www.bloodshed.net/devpascal.html ),
    如果確認之前如何compile, 則可以修改程式
    clip_image002
    clip_image003
    clip_image004

.

程式碼, (節錄)

....
type
    TTSC = comp;       { 8-byte (64-bit) long int }
    TCompHalf = record
        Lo, Hi: Longint;
    end;

Function GetTSC: TTSC; {$ifdef myUseInline} inline; {$endif} {assembler;}
var temp: TTSC;
Begin
    asm
            db $0F;
            db $31;
            mov TCompHalf(temp).Lo, EAX;
            mov TCompHalf(temp).Hi, EDX;
    end;
    GetTSC := temp;
end;

....

var
....

    Tsc0, Tsc1, Tsc2: TTSC;
    myT, myT0: TSystemTime;

begin

....
    Tsc0 := GetTsc;
    GetLocalTime(myT);
    t00 := TotalSec(myT); 
....

    while true do begin
....
        Tsc1 := GetTsc;
        GetLocalTime(myT);
        t1 := TotalSec(myT);
....
    end;
....
end.

.

其他範例程式 :

.

相關資料 :

00DE22B9   0FA2             CPUID

00DE22BB   0F31             RDTSC

00DE22BD   2B0424           SUB EAX,DWORD PTR SS:[ESP]

00DE22C0   83C4 04          ADD ESP,4

00DE22C3   3D 00000E00      CMP EAX,0E0000

00DE22C8   77 03            JA SHORT 0x90.00DE22CD

- 簡 - [ 轉為繁體網頁 ]

000012E7: 0F31 rdtsc 000012E9: 668BD8 mov ebx,eax ... This example assumes the system has booted DOS. ... mov ah, 09h ; Execute DOS print function ...
expert.csdn.net/Handler.ashx?id=3727239 - 63k - 頁庫存檔 - 類似網頁 - 加入筆記本

- 簡 - [ 轉為繁體網頁 ]

利用rdtsc 彙編指令可以得到CPU 內部定時器的值, 每經過一個CPU 週期, 這個定時器就加一。 如果在一段時間內數得CPU 的週期數, CPU工作頻率= 週期數/ 時間 ...
www.cppfans.com/articles/system/cpuspd_usdly.asp - 13k -

- 簡 - [ 轉為繁體網頁 ]

回覆於2005-10-30 21:17:46 得分0. inline unsigned __int64 GetCycleCount() { __asm _emit 0x0F __asm _emit 0x31 } 這個函數就是RDTSC,0f31是RDTSC的機器碼Top ...
topic.csdn.net/t/20051030/20/4360076.html - 26k - 頁庫存檔 - 類似網頁 - 加入筆記本

.


(...繼續閱讀.../...CONTINUE...)