徹底移除新倉頡輸入法

十月 3rd, 2007
29,509 views 3 comments

新倉頡移除不掉這個問題其實以前就有囉!只是最近 Office 2003 釋出 SP3 更新,不少用戶自動更新後新倉頡又跑出來了。(新注音移除不掉也是同樣的解決方法)

↑明明已經沒有新倉頡了


↑切換輸入法的時候卻又跑出來

解決方法:
1. 先將新倉頡(或新注音)新增回去。
2. 將下列文字存成 .reg 登錄檔,點兩下匯入。
;-------------------------------------------------------------------------------------------------------
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"CJIMETIPSYNC"=-
;-------------------------------------------------------------------------------------------------------
3. 再將新倉頡(或新注音)移除。
4. 重新開機就不會再出現了。

Windows, 系統筆記 , ,

用 PHP 寫 RS232 串列通訊程式

十月 2nd, 2007
18,880 views 19 comments

相信經常在翻 PHP 手冊的人應該都有察覺,PHP 不只是可以用來開發網頁程式而已,很多其他語言能完成的工作 PHP 也都做的到,例如透過 PHP 的 Direct IO Functions 就可以對 Serial port 溝通,而且可以在 Windows 下執行,一般在 Windows 要實做 com port 通訊程式,大多是透過像 VB/VC++/C++ Builder 這類程式所提供的元件來撰寫,不過用 PHP 就可以很快實做出一般的功能囉!

在開始之前要先讓 PHP 支援 dio 才行,5.1.0 版之後已經將 dio 移至 PECL 了,可以到 PHP 官網下載編譯好的 PECL,解壓縮後將裡面的 php_dio.dll 放到 PHP 目錄的 ext 底下,接著修改 php.ini 加入 extension=php_dio.dll 即可。

在 Windows 底下讀取 COM1 的例子:


<?php
exec('mode COM1: baud=19200 data=8 stop=1 parity=n');
$fd = dio_open('COM1:', O_RDWR);
while (1) {
    $data = dio_read($fd, 1);
    if ($data) {
        echo $data;
    }
}
dio_close($fd);
?>

寫法跟在 Linux 用 C 寫 serial 通訊程式差不多,其中 mode 是 Windows 命令列一個設定 serial port 組態的工具(類似 Linux 的 stty),可以打 mode /? 看詳細說明,設定好傳輸率等,接著用 dio_open 開啟裝置,然後就可以做存取的動作囉!

※ 2009/04/10 補充:
有不少人看了這篇之後,問我要怎麼用 PHP 讀取 GPS 資料。
在這邊要跟各位補充的是,如果您想要用瀏覽器在網頁執行 PHP,然後去讀取 GPS,這的確可以抓到資料,但其實是存在很多問題的,因為 Web 架構並不適合應用在這類有「持續連接」行為的地方,所以有可能發生 timeout、資源佔用、搶奪,嚴重的話會導致伺服器 crash。

但是如果一定要用 PHP 實作,建議應該是利用 command line 的方式執行,在背景專門負責抓 GPS 資料 ,並且將座標資料存入檔案或資料庫,然後網頁再去存取座標資料,如此一來便不會影響到 Web 運作。

PHP, 程式筆記 ,

C 語言中 printf 的問題(續)

九月 30th, 2007
4,795 views 3 comments

前一篇當中提到了 printf 結果異常的問題,在睡前翻了一下手邊借來的「C Primer Plus」,沒想到就有提到這個問題,印象中其他書籍似乎都沒有講到,C Primer 系列果然是好書!

簡單來說就是 C 語言中,compiler 可以選擇先計算函數中的哪個參數,以增加編譯程式的效率,所以前一篇的例子:


printf("%d, %d", age, age++);

compiler 很可能會先算第二個參數,先改變了 num 數值,這樣就造成結果不如預期了。

在「C Primer Plus 5/e 中文精華版」第五章有寫道,遵循以下原則可以避免這些問題:

  1. 請勿在函數當中,對使用不止一次的參數使用遞增或遞減運算子。
  2. 請勿在運算式當中,對使用不止一次的變數使用遞增或遞減運算子。

第一點就是上面所說的例子,第二點的例子如下:


n = 3;
y = n++ + n++;

在 C 標準中並沒有定義這行程式會如何執行,是哪一個先加 1 再運算,還是都先不加,造成了含糊不清的結果,應當避免這種寫法。

C/C++, 程式筆記 ,

C 語言中 printf 的問題

九月 30th, 2007
5,311 views 3 comments

今天有個學妹問我一個 C 程式的問題:下面程式的結果為何?


#include <stdio.h>
int main(void)
{
    int age = 20;
    printf("You are now %d, and will be %d in one year", age, age++);
    return 0 ;
}

自認觀念還不錯的我直接就回答「20, 20」。但沒想到實際跑的答案竟然是「21, 20」,這真是出乎意料的結果啊!

馬上另外測試了其他有 printf 函式的語言,如 Java、PHP,結果也都是正確的「20, 20」,所以不知道是 C printf 的 bug 還是什麼原因,希望有人能解答。

請看:C 語言中 printf 的問題(續)

C/C++, 程式筆記 , ,

DiscWizard:免費版的 Acronis True Image

九月 27th, 2007
8,643 views No comments

磁碟備份軟體除了有歷史悠久的 Ghost,近幾年也出現了頗受好評的另一套軟體 - Acronis True Image。之前試用過的感想是速度很快,完整備份整個分區只要幾分鐘就搞定了,只可惜它也是要錢的。

不過現在硬碟廠商 Seagate 和 Acronis 公司合作,推出一個 OEM 產品叫做「Seagate DiscWizard」,採用 True Image 的核心,擁有 True Image 的基本功能,備份、還原、救援都可以輕鬆搞定。想當然爾,這只能用在自家硬碟(Seagate、Maxtor)上,其他廠牌則無法使用。

(在網站上可以看到另一套 Maxtor MaxBlast,其實是同樣的東西,只是名稱不同而已)

來看看介面吧,有沒有跟 True Image 很像?
discwizard.jpg

Windows, 軟體筆記 , ,