2010年12月18日 星期六

以身作則,做好自我管理

自我管理方法1:檢視行程,撥時間與部屬相處


成為主管之後,肯定會比過去忙碌得多,因為不只要完成自己的工作,更要管理部屬。

此時不妨利用記事本或手機、電腦的行程管理功能,確實地管理自己的行程表。

畢竟身為主管的首要工作便是:估算執行工作所需要的時間並排定預備時間,掌握部屬的預定行程,以及學會有效利用時間的技巧。


自我管理方法2:讓部屬看到自己有效率的工作執行方式

身為主管更不允許發生:「因為來不及處理而造成的失敗」,所以身為主管的你,比起部屬更應該要學會依照緊急性與重要性,判斷各項工作之間的輕重緩急。

要有效率地執行工作,就必須養成隨時判斷工作輕重緩急的習慣,隨時判斷處理順序,同時也要求部屬徹底執行判斷工作。

要有效率地執行工作,不妨利用以下技巧:




◎善用To Do清單

表列各項應完成的預定工作,不只能讓自己集中精神工作,還有助於思考工作的執行順序。

◎挪出時間擬定預定表

不妨在每天、每週或月初時,挪出一些時間擬定預定行程表。

◎盡量分派工作

將工作交由部屬處理,自己只負責事後確認,不但能讓部屬從中學習,更能幫助自己有效利用時間。

◎掌握容易執行的工作順序

身為主管必須瞭解自己,是習慣先處理討厭的工作,還是先完成擅長的工作,唯有掌握執行工作的順序,才能有效率地完成所有工作。

2010年9月25日 星期六

轉貼笑話

===========================================


請問樓主:我把我家的狗給揍了! 地震它也不告訴我,平時叫得那麼兇,

地震時竟像沒事似的在窩裏睡覺!

論壇回覆:唉!畢竟不是親生的……
===========================================

請問樓主:請用一句話形容中國國家地震台。

論壇回覆:事後諸葛亮,事前豬一樣!

===========================================

請問樓主:今天見男網友,對方一直暗示想上床,

「難道現在網友見面就是為了上床?」

論壇回覆:網友見面不上床?你開什麼玩笑,大家都這麼忙。

===========================================

請問樓主:一來自權貴家庭的學生,成績年年倒數第一,常與人打架,老師被要求要給學生好一點的期末評語,怎麼寫好啊?

論壇回覆:該生成績穩定,動手能力強。

===========================================

請問樓主:養條狗和養一個男人哪個合算?

論壇回覆:即使你能把男人當狗使,但你敢把狗當男人使嗎?

===========================================

請問樓主:他今天山盟海誓說我是他生命中的一部分,我是他身體中的一部分,

如果 沒了我,他就活不下去啦∼

論壇回覆:我的前男友也是這麼說的,後來我才知道,

我是他盲腸、闌尾、這類可有可無的玩意兒!

===========================================

請問樓主:我得了健忘症怎麼辦?

論壇回覆:那豈不是很爽?每天早晨醒來,發現睡在自己身旁的,都是不同的女人∼

===========================================

請問樓主:為什麼police抓壞人時都要鳴警笛?難道不怕壞人老大遠就聽到跑了?

論壇回覆:上級單位來檢查之前,一般都會事先通知下級單位的∼

===========================================

請問樓主:為什麼生下的孩子,要跟父親一個姓?

論壇回覆:因為取款機裏吐出的錢,要歸插卡人所有。

===========================================

請問樓主:帥有個屁用——到頭來還不是被卒吃掉!

論壇回覆:帥有士陪,有炮打,有馬騎,有車坐,有相暗戀……帥怎麼不好?!!

===========================================

請問樓主:妳們女人大夏天的戴胸罩不熱嗎?

論壇回覆:我們不帶你們會更熱……

===========================================

請問樓主:我新買了一處莊園,有多大說出來嚇死你——

我開車繞一圈足足用了兩個半 小時!!!

論壇回覆:嗯,以前我也有這麼一輛破車



============================================

請問樓主:我喜歡上了一個比我小6歲的女孩,還在上初中,真是造孽啊!

論壇回覆:把「喜歡」兩字去掉才真是造孽!

2010年5月8日 星期六

轉貼:四十以後要明白的事

四十以後一定要明白:好朋友是應該相互欣賞,而不是相互利用。


    好朋友只能在同一階層中產生,而窮人和富人,百姓與達官,草根與明星,白丁與學者則永遠也成不了真正意義上的朋友。因為不在同一階層,便永遠也不會有對方對本階層的深刻體會與感悟。


四十以後一定要明白:飯應該一口一口的吃,事要一點一點的做。

    沒有一蹴而就的事情,所以就不應該疲於奔命。中年,應該活得從容自在。


四十以後一定要明白:任何事物都是有雙重性質的,有時候甚至沒有對錯。

    你以為錯的,在別人看來或許是對的。而你竭盡全力為之奮鬥的目標,卻很有可正是別人想擺脫和拋棄的贅物。

四十以後一定要明白:生活品質的優劣,完全取決於自己的慾望。

    修饈美味,觥籌交錯間如果掩飾的是爾虞我詐,則遠不如“三五知己坐,淡茶話家常”來得心。如果高官厚褥卻窮于心智,惶于任途,就遠不如“采菊東籬下,悠然見南山”活的逍遙。



四十以後一定要明白:我們的伴侶看似平淡無奇,有些時候甚至難以忍受,其實歲月的年輪早已將彼此交融在一起了。

    即使惡習劣性,也已成為自己生命的部分。如果有一天你真的撕毀這不堪的婚姻,就會發現每撕一片都會連著自己的皮肉和筋骨。


四十以後一定要明白:我們對孩子溺愛就像高脂高糖一樣危害著他們的健康。

    我們害怕他們走歪路。我們擔心他們吃苦受罪,我們憂慮他們經風雨。我們全家人為他們搭起了大廈,然後癡傻呆呆地望著他們柔弱的發育。


四十以後一定要明白:對待父母再不可做薄養厚葬的傻事了。

    他們那一輩子受的磨礪太多了,善待他們就是善待我們的良心。說起善待父母都很心疼錢的,但要動動腦筋事情就會圓滿的完成;比如,可以去酒店訂一份極品燕窩湯,端回家告訴父母說是在小攤上買的30元一碗的銀耳湯,然後看著他們幸福的享用其實大多的時間他們根本就不需要你的榮華,每週問他們一個年輕時候的故事,然後聽著他們講完就很知足了。


四十以後一定要明白:職位只不過是一個杯子,而你的修養和品性才是杯中的尤物。

    夜光杯中盛的未必就是葡萄美酒,也可能是一杯濁水,粗瓷盞裏不見得就是白開水,很可能是泡的一盞極品龍井。個中的品質全在自己的心境造化。

---- Aquarius 心得 ----
不用到40歲, 也該明白這些道理. 不過的確是年紀越大, 越會經常反省自己的生活型式與追求目標.

2010年4月9日 星期五

有效的會議進行方式

開會對組織來說, 是必要之惡. 不開會, 有許多事就不易溝通協調, 但是開會真的是很花費時間及人力成本的執行方式. 所以要如何有效的縮短開會時間及提升會議效率, 就是一門學問.

會議的型式有些區分, 基本上可以分成 2 大類. 第一種是 資訊型會議, 以訊息傳達為主, 例如定期的專案會議要檢視成員進度及佈達專案重點事項. 第二種是 決策型會議 , 目的是為了針對特定事件, 決定處理的方式. 要有效的加速會議的進行, 可以參考以下的方式

會議可以分成 4 個階段
  1. 規劃會議
  2. 會前準備
  3. 進行會議
  4. 會後跟催與執行

資訊型會議要考量的訊息的傳達
    在規劃會議的階段就應確認參與的人員. 越多人參與的會, 時間就越不容易控制, 且溝通訊息的效率就會變低, 所以在規劃階段就要避免將不必要的人員也邀請參加會議.
    會前可要求與會的人員, 先將要報告的事項提交會議記錄人員, 一則可以避免臨時遺漏報告事項, 再者也可以減輕記錄人員的負擔及誤解的可能. 那種在會議中的結論, 變成會議記錄缺東漏西, 甚至張冠李戴的問題, 就曾是令我頭痛的問題, 後來要求先提交報告事項, 這一點就改善非常多.
    進行會議時最忌跑題, 有些人講話講著, 就會說到會議無關的主題去, 這時會議主持人應適時出面將話題拉回到主軸, 避免會議時間被無端拉長.
    會後的跟催及執行, 最好是要有 工作追蹤列表, 尤其是對定期會議, 可以透過追蹤列表檢視各工作項的執行狀況, 可避免工作指派後卻被遺漏的問題.

決策型會議的目標通常就是要下決定
    在規劃階段就要先確定, 解決問題的資源是否分散在幾個人手中, 會議結果的貫徹是否需要幾個人的承諾, 是否有需要調停的衝突觀點. 這些與要如何進行會議的形式有關, 要用腦力激盪法進行討論, 還是要用簡報法後進行投票, 或是用分類法進行分析. 要先規劃一個有效的會議模式及與會者, 這樣才能形成有效的決策.
    會議準備最主要是讓與會者能明白會議主題, 並準備好相關的討論事項, 那種臨時拉人來開會要決定什麼事的會議, 通常都是說了半天什麼決定也做不了.
    進行會議就看會議的型式, 不過一個好的會議主持人及記錄是不可或缺的.
    會後執行一樣需要有指派人員進行跟催, 不然很容易發生大家討論了半天, 最後做出的決定確沒人去做, 這樣等於浪費了開會的時間和成本.


2010年4月6日 星期二

軟體專案的生命週期

一個軟體專案的生命週期, 大致如下

需求發展 --> 系統分析 --> 規格設計 --> 程式開發 --> 整合測試 --> 版本發行 --> 需求發展 --> 系統分析 --> 規格設計 --> 程式開發--> .... (如此循環, 直到產品不再銷售)

每一個階段, 都能用 一筆帶過 的方式處理, 也能用 吹毛求疪 的態度追求完美. 但是做事的方法, 通常就會影響到最後產出的品質. 但太過追求完美, 也有可能需要秏費大量的時間和人力, 甚至導致專案的失敗. 這時就要考驗專案經理人的拿捏.

大多數的軟體專案經理對 程式開發 和 整合測試 會比較注意, 因為這裏的工作產出, 程式碼 和測試結果 比較容看得到效益. 需求發展到規格設計這一段, 通常都是比較弱的地方. 但輕頭重尾的結果, 很容易讓一個軟體 "短命", 容易產生 "不符合客戶需要"  和 "後續維護不易" 的問題.

CMMI 的階段式模型, 則提供了一個可執行的規範, 對軟體公司而言, 沒有導入 CMMI 還是可以開發出好的軟體, 例如 Microsoft, Oracle 等巨型的軟體公司, 並無導入 CMMI, 因為當他們成功的開發出符合大多數人需求的軟體時, 根本就還沒有 CMMI 這種東西.

那 CMMI 有什麼用呢? 基本上可以將 CMMI 想像成是一套流程規範, 讓你生產出來的東西具有一定的品質. CMMI 不能告訴你怎麼做出 MS Office 或 Linux Kernel 這樣成功的產品, 但可以幫助你在軟體專案的進行中, 維持一定的水準. 透過制度避免開發中的風險. 這對一個已經有利基產品, 但苦於品質不穩定, 時程延遲等問題的研發團隊, 是一劑有效的藥方.

在軟體專案中, 透過 CMMI 各階段的要求, 就可以比較容易確保在各軟體專案生命週期的各個階段都有投入足夠的關心, 開發出一個品質與維護性都在水準以上的專案.


2010年4月3日 星期六

清道夫程式 - CCleaner

CCleaner 是一套免費, 而且功能實用的軟體. 可以將 Windows 系統中, 殘留下來的許多無用檔案/登錄值(Registry key/value) 刪除得一乾二淨. 像我自己不喜歡將個人資料和操作習慣, 留在電腦系統中, 只是現在的系統太自動, 會自行記錄像是去過的網站, 最近用過的程式, 開啟過的文件檔... 等。

雖然有個別的方法可以不要設定不要記錄, 但避得了檔案也不容易避免記錄在 Registry 中, 而有些程式在移除後也還是會留下部份的檔案下來, 這時就需要像 CCleaner 這一類的程式來處理。而 CCleaner 算是我在試用了幾套後, 最穩定而且容易使用的程式, 所以推薦給我的朋友.

可以自 CCleaner 的網站下載最新版的程式, 安裝很簡單, 基本上就是按下一步就可以了. 不過 CCleaner安裝預設會安裝 YAHOO工具列程式, 不喜歡的人記得要變更成不勾選再按下一步.

CCleaner啟動後的畫面是顯示可清除檔案的部份, 像我幾乎是大數的選項都勾選了.

也可以清除登錄檔, 畫面如下

在工具畫面, 還可設定清除一些進階的選項, 像是執行已安裝軟體的反安裝, 或是移除已經不能正常執行的選項. 也可以取消在 Windows 啟動時自動執行的程式, 少啟動一些程式可以加快進入 Windows 系統的速度. 現在的 Windows 預設會開啟系統還原的選項, 但記錄了一堆還原設定可能永遠也用不到, 也可以用 CCleaner 清除這些還原記錄.

選項畫面包含了一些進階的設定值, 大部份的時間都不需要修改預設值,截圖給大家參考一下畫面就好



官方網站
http://www.ccleaner.com/


2010年4月1日 星期四

欣欣魚翅坊

今天和一位大學的老同學碰面, 他現在已經是成功人士, 自己當老闆, 資產應該有上億了. 不過這不是要講的重點. 中午讓他請, 地點是 長春路上的欣欣魚翅坊.

這個店面有個訴求是招待日本客人, 像今天不是假日, 在那邊也遇到一個來訂位 6 人的日本客. 走的是 平價的高檔食材, 在店面裝潢尔算特別的高檔, 不過食材倒是真的不錯.



我沒來吃過, 都是老同學幫忙點的, 內容包含 一盤大排翅 + 半隻法式白醬焗龍蝦 + 一盤白菜滷 + 一小碗炒飯 + 甜點 + 咖啡. 份量是十分足夠了. 除了主菜外其他的都可以 吃到飽. 不過在排翅和龍蝦吃下去後, 其實就已經差不多飽了. 所以其他的副餐也都沒有多點.

套餐的價格都不算便宜, 1500元到3500元之間, 還要加10%服務費. 但食材是真的不錯, 今天除了 白菜滷的胡椒放多了點外, 其他的口味都很合適. 住台北的人有想到吃大餐打牙祭的, 可以考慮.

官方網站 http://www.singsing.com.tw/index.html



2010年3月29日 星期一

管理與領導

當主管從來不是一件容易的事. 說不容易最主要是不像 工程 , 可以有很明確的規則和評量方法, 知道是否有把事情做好. 擔任主管並不一定是技術能力最好的人, 但通常需要溝通能力較好的人. 因為主管, 最主要的工作應是管理, 讓人把事情做好, 擔任 分配資源, 指派工作, 溝通協調, 監督查核, 評估績效 等工作.

只要是和 人 有直接相關的事, 就會面臨不同人反應不同的問題. 在前一個團隊可行的方法, 換到另一團隊可能就會變得滯礙難行. 想用同一套方法就不出問題, 除非是管理的團隊成員一直不變才有可能. 不過在現在人員流動的狀況下, 這種假設太過理想化.

要如何做管理與領導呢? 摘要幾個重點

1. 分享願景(Vision). 雖然有些人覺得這種東西都是在打高空, 沒什麼實際價值. 不過在工作這麼多年後, 覺得有一個願景還是很重要的, 心有多大, 天地就有多大. 有時與員工聊聊對未來的期許, 一定比只看到眼前工作更能激發熱情.

2. 明確目標. 在指派工作時要給一個明確的預期結果, 包含時程和執行狀況. 這樣對負責那一項工作的人來說, 可以避免走很多彎路, 減少不必要的猜測, 可以降低額外的成本.

3. 溝通與查核. 把工作交派下去後, 最忌從此不聞不問, 就預期事情一定會做好. 除非是那種很制式化的日常工作, 大多的工作都會有一些需要合作、溝通、排程、做決定. 擔任主管除了交派工作外, 還應定期(或不定期)和相關人員溝通一下執行的方式及狀況. 雖然目標已經決定, 但達成的方式後少只有一種, 如何確保用好的方法完成, 需要團體的努力和必要的支持. 另外為了避免私人的因素影響整體, 所以主管與員工的溝溝也不限定是在工作方面, 有時聊聊工作以外的事, 有助於團體的磨合.

4. 適時回應成果. 一件工作完成後, 需要給相關的人員一些回饋, 可能是一句謝謝, 可能是一頓晚餐. 要儘量避免不聞不問. 以前也遇到過被交辦十萬火急的事, 拼命加班弄出來後交給老闆, 給果老闆就只是放著也沒其他的動作. 這種狀況就會令人為自己的努力不值. 對員工的努力成果要給予肯定, 這樣才能讓人覺得自己的工作, 自己的努力是有價值的.


2010年3月24日 星期三

需求發展與時程預估的方法 - Delphi Method

這裏的 Delphi 和寫程式用的 Delphi 是同一個字, 要講的卻不相同. Delphi Method 是指一種特殊的會議進行方式. 一般會議的進行, 講究的是充份的溝通與討論, 進而凝聚共識. 而 Delphi Method 用的是一種不尋常的溝通技巧.

Delphi Method 要求參與會議的人員, 應該都是 專家 . 針對會議主題, 所以參與的專家都使用匿名的方式發表意見, 彼此之間不互相討論。主席(或公正第三方)在收集到專家們的意見後進行統計及歸納, 再將結果回饋給與會的專家們, 請他們再次進行分析, 透過 2~4 次後的循環, 應可匯集出專家們大體一致的看法, 即為會議的結論.

這個方法很適合用在軟體開發中的需求發展時程預估.

對軟體產品的設計, 很重要的一個環節是需求來源, 最終會設計出什麼樣的產品, 會和一開始的需求有很大的關係. 對需求很明確的項目, 沒什麼可以爭議的, 但對在提出需求時, 有時會太過模糊, 提出需求的人員, 可能自己也講不清楚要做成什麼樣子, 甚至會說 "等你做出來我再告訴你和我想的一不一樣.", 在這種狀況下就可以用 Delphi Method 進行分析.

另一個是時程的預估. 傳統的方式是使用 WBS 進行切割後, 再加總需要的時間. 可是有些工作不容易細分, 尤其是研發新技術這一類的項目. 這時就可以使用 Delphi Method, 借助專家的經驗與分析, 比較準確的得到預估值.

這個方法的好處是簡單, 只要有好的專案人選, 透過簡單的幾個回合就可以得到答案. 但麻煩也在這裏, 何找尋找專家? 這個方法若是讓不熟悉會議主題的人來參與, 只會天馬行空的回答, 或是單純附和別人的說法, 這樣就不容易得到一個好的答案了.


2010年3月21日 星期日

格式工廠 - 影片格式轉換的免費工具程式

在電腦中存放許多的影片檔, 有些是自己 DV 拍回來的, 有些是別人提供的的影片檔, 之前又因為老婆堅持用大電視, 不願意在電腦前的小螢幕前看. 所以我特別去買一個 RMVB 的播放器, 可以播 RMVB/AVI/MPG/MOV/WAV/MP3... 等多種影音格式. 只是那個播放器的晶片還是有點問題, 對影像檔只有 RMVB 和 MPG 播放較順, 播其他格式有時會時間軸異常或跳格. 所以就去尋找了一個可以快速轉換格式, 而且品質可以接受的轉檔程式.

最後我使用的是這一套免費授權的 格式工廠(FormatFactory), 到現在已經出到 v2.20 (2009-11-26), 支援多國語文介面

主畫面如下, 這套軟體會自動測目前使用的語言

可從 DVD 轉換成指定的影片格式

也可以合併影片檔案

官方網站

Format Factory is a multifunctional media converter.
Provides functions below:
All to MP4/3GP/MPG/AVI/WMV/FLV/SWF.
All to MP3/WMA/AMR/OGG/AAC/WAV.
All to JPG/BMP/PNG/TIF/ICO/GIF/TGA.
Rip DVD to video file , Rip Music CD to audio file.
MP4 files support iPod/iPhone/PSP/BlackBerry format.
Supports RMVB,Watermark, AV Mux.

Format Factory's Feature:
1 support converting all popular video,audio,picture formats to others.
2 Repair damaged video and audio file.
3 Reducing Multimedia file size.
4 Support iphone,ipod multimedia file formats.
5 Picture converting supports Zoom,Rotate/Flip,tags.
6 DVD Ripper.
7 Supports 50 languages

OS requirements: All 32 windows OS


2010年3月19日 星期五

CMMI - 軟體能力成熟度整合模型

CMMI 是美國國防部, 委託卡內基美隆大學 (Carnegie Mellon University) 的軟體工程學院 (Software Engineering Institute, SEI) 所進行的一項研究成果再衍生出來的一套標準. CMMI 本身並沒有訂義出明確的軟體開發流程, 而是依軟體工程的角度, 訂定出各種要求. 只符合要求, 並通過 主任評鑑員的認定, 就可以宣稱符合 CMMI.

SEI 在制定這套標準時, 目標是提供一個具有共通性, 可以支援整合不同專業領域的通用架構, 評鑑是否通過的方法也有性, 可用連續式自行選定目標, 針對不同流程領域進行評鑑, 也可按照階段式的各階段規定進行評鑑. 另外也區分 開發方(develop)採購方(Acquisition) 訂定執行標準.

在台灣好像沒看到有那個單位是使用 連續式 進行評鑑, 幾乎都是以 階段式 為主. 階段式共分成 5 個等級, 其中第一級不用評鑑, 或者說沒做過評鑑的通通都是第一級. 第二級到第五級都需要依規定進行評鑑, 而且每次的評鑑有效期只有 3 年, 時間到了必需重新評鑑才有效. 目前台灣通過的單位數也不多, 從 CMMI taiwan ( http://www.cmmi-taiwan.org.tw/ ) 公告來看, 到 2010-03-19通過的單位數如下

CMMI Level2 (78)
CMMI Level3 (46)
CMMI Level4 (3)
CMMI Level5 (3)

因為那個網站的算法是有拿到證書就算, 所以第二級、第三級都有進行評鑑, 就會被重覆計算到.

簡單列一下階段式各流程領域的要求, 想知到更進一步訊息可參考 CMMI taiwan 網站.

CMMI Maturity Level 2


- 建構管理(CM, Configuration Management)建立並維護藉由建構識別、建構管制、建構狀態記錄及建構稽核,使工作產品具完整性。

- 度量與分析(MA, Measurement and Analysis)發展並維護支援管理資訊所需的度量能力。

- 專案監控(PMC, Project Monitoring and Control)提供對專案進度的瞭解,使得當專案績效明顯偏離原先計劃時,能採取適當的矯正措施。

- 專案規劃(PP, Project Planning)建立並維護定義專案活動的計畫。

- 流程與產品品質保證(PPQA, Process and Product Quality Assurance)提供員工和管理階層,對於流程與相關工作產品客觀的觀察

- 需求管理(REQM, Requirements Management)管理專案產品與產品組件之需求,並且界定專案計畫、工作產品與需求這兩者之間,是否有不一致的情形。

- 供應商協議管理(SAM, Supplier Agreement Management)管理和專案有正式協議的供應商之產品與服務的採購。



CMMI Maturity Level 3

- 決策分析與解決方案(DAR, Decision Analysis and Resolut)於作決策時,使用結構化的方法,依照已建立的準則,評估各備選方案。

- 整合的專案管理(IPM, Integrated Project Management),根據調適組織標準流程得的整合的已調適流程,建立並管理專案和其關鍵人員。它也涵蓋建立專案共同願景及整合團隊結構,以完成專案目標。

- 組織流程定義(OPD, Organizational Process Definition)建立並維護可使用的組織流程資產。

- 組織流程專注(OPF, Organizational Process Focus)建立並維護組織流程與流程資產的瞭解,並且界定、規劃及執行組織流程改善活動。

- 組織訓練(OT, Organizational Training)發展人員的技巧與知識,使他們能有效地執行其角色。

- 產品整合(PI, Product Integration)將產品組件組合成產品,確保產品已經整合、運作正常,並交付客戶。

- 需求發展(RD, Requirements Development produces)提供客戶、產品與產品組件的需求與分析,這些是發展與瞭解所需的。

- 風險管理(RSKM, Risk Management)界定風險發生前的潛在問題,使在達成目標之前的生命週期期間,在有需要時,能規劃風險處理活動,以降低不利的衝擊。

- 技術解決方案(TS, Technical Solution)用以發展、設計與實作對於需求的解決方案。解決方案、設計與實作,適當地涵蓋產品、產品組件以及產品相關單一或組合的流程。

- 驗證(VER, Verification)確保工作產品符合特定的需求。

- 確認(VAL, Validation)證明產品或產品組件,於特定的環境下,確實能發揮特定的功能。



CMMI Maturity Level 4

- 組織流程績效(OPP, Organizational Process Performance)建立並維護組織標準流程績效的量化了解,並提供流程績效的資料、基準與模式,以數量化管理組織的專案。

- 數量化專案管理(QPM, Quantitative Project Management)數量化管理專案的已調適流程,以達成該專案所建立的品質與流程的績效目標。



CMMI Maturity Level 5

- 原因分析與解決方案(CAR, Causal Analysis and Resolution)界定缺失的原因與其他的問題,並採取預防措施,避免這些缺失在未來再發生。

- 組織創新與推展(OID, Organizational Innovation and Deployment)選擇與推展漸進的與創新的改善活動,可度量地改善組織的流程與技術。這種改善,支援由組織經營目標所衍引的組織品質與流程績效目標。


2010年3月16日 星期二

團隊合作

對使用者越來越簡單操作的電腦, 對設計的人來說就是越來越多的用心. 在軟體設計這個業待了10多年, 真的是時代不一樣的. 在10年前還有可能透過一個人的單打獨鬥模式做出一個能賣錢, 能合符合使用者需求的系統. 而現在取而代之的, 是透過團隊合作來開發系統.

在團隊中要如何協調個人能力的發揮和整體的協同運作, 真的是一門學問. 並不是將一堆人集合在一起工作, 就叫團隊. 已經看過很多運作不良的團隊, 或許個別人員的能力很強, 但因為協調問題搞得大家不愉快, 最後反而是將時間和資源都虛耗掉, 沒辦法達到專案的預期成果.

條列幾個自己認為重要的項目備忘, 也要提醒自己別犯相同的錯誤

- 流程的建立. 在專案中應該要建立那些表單, 執行那些事項, 什麼時候要出報告, 需求的判定和分析, 交付成果的驗證方式... 等, 這些在專案中必定會遇到的事情和作法, 都要在事先就建立好依循的流程, 讓專案成員在執行前, 就有概念要做那些事, 可以避免在指派工作時讓專案成員有措手不及, 或不知道下一步要做什麼的困擾.

- 人際溝通. 除了專案會議外, 專案經理也需要不定期的和成員溝通, 了解他們的狀況, 聽聽他們的意見, 並適時的給予鼓勵和回饋. 同時也要讓成員間有交流的機會, 儘量避免各做各的事. 非正式的交流, 像在茶水間碰到面時詢問一下個人的狀況, 或辦個團體聚餐, 都更能讓彼此更熟悉.

- 授權與分派. 在將工作指派出去的同時, 也要給予對應的權力, 不要事事橫插一手. 適時的關心進度與執行狀況是有必要的, 但也要能容忍犯錯. 以及容忍別人用不同的方法來完成事情. 另外要注意別老是將工作分派給看起來能力最好的人. 一來會造成資源排擠, 二來也是造成強者越強, 其他人缺乏鍛練的機會.

- 自省. 獨裁式的領導不適合我. 所以要自我檢視是否有聽取別人的意見, 言語是否會傷害到別人. 專案經理足夠的謙虛有助於團隊的認可. 不過也不是當 yesman, 分際要拿揘好.

2010年3月13日 星期六

部門主管與專案經理的差異

部門主管和專案經理, 都需要對所屬的人員、資源和工作進行指派與追蹤. 不過二者的型態還是有些差異.

部門主管所擁有的資源, 大致上不會有太大的變化, 人員隸屬於那一個部門, 雖然說也會有變動, 但很少單位會經常性的變更部門成員(當然那種離職率特高的例外也是有的), 算是公司的主要組成單位. 通常擔任部門主管, 也就是要每年幫員工打考績的那個人.

專案經理則是為了專案執行成存在, 專案會有一個明確的目標, 需要在指定的時程內完成某件事(所以才叫專案呀), 一般都是用任務小組的方式組成, 會從一個或多個部門內, 遴選出相關的成員並指派工作. 專案完成後一般就是解散, 或是視需要再重新組成小組.

在軟體開發這個領域, 基本上都是用專案的型式在工作. 每一套軟體就是一個專案, 設計出成品後進行後續維護也是一個專案, 產品銷售給客戶, 要幫客戶進行建置、佈署、教育訓練, 這又是一種不同的專案型態.

我待在資訊業已經10多年了, 在軟體開發專案的這部份, 每種角色都曾經擔任過, 當然現在比較多的比重是在擔任 部門主管 和 專案經理.

在部門主管的角色上, 比較多是日常工作, 像是工作指派, 文件表單的簽核. 對整體流程方面, 在提流程改善, 提升績效等預期執行方式往往會牽動到其他人員, 導致調整不易. 尤其是在部門人員已經被分派到多個專案中時, 更增加協調的困難.

專案經理在一開始就已經是從多個部門協調人員出來. 一旦最開始的人員和資源能確認後, 後續就比較不會受到干擾, 當然多個專案中共用資源也是會遇到關鍵資源發生排擠的狀況, 不過做資源撫平那又是另一門學問. 因為專案的生命週期較短, 也可實驗一些新的改善方法. 所以我個人是覺得專案經理的角色在執行面會容易些. 這個我個人的感覺, 在不同的單位或許會有不同的狀況.

前一陣子去上一門專案管理的課程, 微軟的專案管理講師主講, 當然內容有一部份是在介紹 MS 的 Project 系統在專案管理中的運用, 另外一部份則是在講專案管理的概念. 聽了之後讓我有衝動想去考 PMP , 買了一本 PMP專案管理認證指南在看, 有時間再把一些心得寫下來與大家分享.



--

2010年3月11日 星期四

加速執行效能的 Gavotte RAM Disk

雖然早在 DOS 時代, 就已經有 RAM Disk 存在, 但在進入 Windows 時代後, 就比較少人使用到這項技術, 大部份的記憶體都被 Windows 系統本身, 和日趨肥大的應用程式給佔用了, 那裏還有多少空間可以把 RAM 當做 磁碟機 來用.

現在記憶體越來越便宜, 很容易就可以在主機上加上 4G, 8G 的RAM. 不過大多數的使用者(包括我自己), 其實一般在使用時, 並不會直的用到這麼大量的記憶體, 看到 RAM 的空間使用量經常不到一半, 你會不會想要拿來好好的運用呢?

提供 RAM Disk 這個功能的軟體有好幾家, 分享一下我使用的方式. 現在使用在 NB 的Vista 環境, 安裝 Gavotte ramdisk (Freeware), 主要是將 TEMP 資料夾, Internet 暫存檔 等設定到 RAM Disk 中, 以加速上網 Cache 的讀寫速度.

Gavotte ramdisk 的官方網站我沒辦法確認是那一個, 不過我這從這個位置取得

說明網頁
http://www.mydigitallife.info/2007/05/27/free-ramdisk-for-windows-vista-xp-2000-and-2003-server/

下載位置
http://depositfiles.com/files/916161

我的 NB配備如下圖

我沒在 x64 的環境執行, 若是使用 64位元的Windows 環境, 需要另外下載, 我這邊就不介紹了.
執行畫面如下, 我是分割出 128MB 的記憶體當成磁碟機 (R:)使用.

在 IE 中可以從 工具 / 網際網路選項 / 一般 / 瀏覽記錄歷程 設定 / 移動資料夾 去設定存放的CACHE的位置, 我是設定 60MB 存放到 R:\TEMP\ 目錄下.

在 控制台 / 系統 / 進階 / 環境變數 中可以將 TEMP 和 TMP 也都指定到 R:\TEMP




2010年3月8日 星期一

電腦非超頻不可?

先說一下電腦的配備

CPU: Intel Q9400
RAM: ADATA XPG DDR3 1600G (2GB *4)
HDD: WD 640GB HDD
主機板: ASUS P5E3 Pro

CPU 資訊如下

主機板資訊如下


之前提到懷疑是 RAM 的問題, 但現在的 RAM 廠商都敢宣稱是終身保固, 運氣那麼不好買到暇疵品的機率其實滿低的. 所以從設定著手.

ASUS P5E3 Pro 是採用 Intel X48 的晶片組, 其設計可支援雙通道 DDR3 1333/1066/800 架構 8GB 記憶體、1333/1066/800/FSB (前端匯流排)、Dual PCI Express 2.0 x16 顯示卡及多核心 CPU. 另外特別採用 Intel® Fast Memory Access 技術, 使可用記憶體頻寬的使用達到最佳化, 並降低記憶體存取延遲的情形.

我預設都是讓 BIOS 自動設定, 並未超頻. 所以 DDR3 是使用 1333 的速度在執行. 既然懷疑 RAM 有問題, 所以就從 RAM 的速度調整開始.

在 BIOS 中不使用自動設定, 改為依照 ADATA 提供的數據, 設定 CAS Latency 為 9-9-9-24 , 另外這記憶體號稱支援到 1600 (OC), 那我就按他宣稱的, 設定為1600. 設定完重開機後, 記憶體的設定如下圖


從昨天早上11點多到現在, 已經超過 20 小時了. 這還是這台電腦第一次我放一整晚, 隔天起床後沒有當機. 好感動.

 看來問題應該是已經排除了. 這告訴我們一件事. 既然買了超頻專用的 RAM, 那就是要超頻使用, 按原定規格不超頻反而會當機. 哇哈哈~~



2010年3月6日 星期六

電腦問題 -- 無故當機

這幾天頗為悲情的. 新買的 Q9400 這台電腦, 上一次電腦電源供應器壞了, 換了個新的電源供應器後, 現在又有無故當機的問題。

問都都是發生在一段時間沒有去動電腦後, 當再回到電腦前, 就發現鍵盤滑鼠都沒回應了, 只能強制斷電重開機。

一開始是懷疑電源管理有問題, 所以把所有的省電設定全部關掉. 螢幕保護也不設定了. Windows Update 也都更新到最新的版本. 正當我以為可以排除問題後, 沒想到只是可以用得比較久幾個小時, 隔天一看還是當機。

接下來懷疑是作業系統 Windows 7 的問題, 所以切換到一個 Windows XP 環境下燒機測試, 沒想到更慘, 我還在電腦前呢, 用不到一個小時就沒回應了.

現在開始懷疑是 RAM 的問題. 因為發生當機的時候, 一般 driver或是其他硬體造成的問題, 會留下 Memory Dump 檔可以分析, 但是這台電腦的當機都找不到 memory dump 檔。

問題持續追蹤當中....

2010年3月4日 星期四

免費的相片編輯/管理軟體 -- PhotoCap

推薦一個非常實用而且又免費的相片管理軟體 PhotoCap. 目前最新的版本是 PhotoCap v5.01(2010-02-10).

官方網站的簡介就已經寫得不錯, 所以我就直接轉貼過來
======================
PhotoCap 5.0 簡介:


PhotoCap是數位照片的最佳幫手,也是100%免費的軟體,PhotoCap的使命是帶給每個家庭美好的回憶,所有功能都非常實用,尤其是有小孩的爸爸媽媽,更是不可錯過喔。

主要應用:

可以製作寫真書、撲克牌、名片、賀卡、桌曆、月曆、沖洗照片、大頭照、縮圖頁,與 添加文字 、小圖案 、外框 、對話框等等常見有趣的應用。

修片的應用:

凡舉去除紅眼 、 黑斑 、 疤痕 、油光、 美化肌膚 、 曝光亮度調整、色偏問題、消除紫邊...等等常見的修片功能。

繪圖的應用:

PhotoCap相當於初級程度的PhotoShop,因此PhotoShop大部分的基本功能都有,包刮專業影像軟體的必備的選取 、 影像功能 、 濾鏡 、 圖層 ,還有獨特的物件功能 ,可以說是功能完善又簡單好用的軟體。 PhotoCap還提供了簡單強大的去背功能,可以輕易的將背景去除,讓你影像合成更完美。
======================
 
不過除了他簡介提到的這些功能外, 還有一個我常用, 覺得不錯的功能, 就是批次處理功能.

你有沒有這樣的經驗, 當大家一起出去玩, 人手一台相機, 拍照回來後要共同分享的時候, 因為每台相機的檔案命名方式不同, 所以在看相片時, 就會覺得相片的時間點跳來跳去的. 或是有時相機的系統時間錯誤, 照出來的相片全部變成從 2006年1月1日開始計算... 像這一類的問題, 用 PhotoCap 來處理都很方便.

先講相機的系統時間錯誤, 這個問題最主要是計算時間的起始值錯誤, 大部份都可以透過加上適合的時間偏差值, 就得到正確(或接近正確的時間點), 這時可以用 PhotoCap 的批次修改日期來處理

將日期調整模式設為 "加減調整" , 調整的年月日時分秒就依實際值調, 例如真正拍照的時間是 2010-03-04 08:15 , 因相機時間錯誤所以第一張的時間變成 2006-01-01 00:00 , 這時就將年月日時分等欄位, 分別設定成 4, 2, 4, 8, 15 即可. 而且設定後可以預覽修改後的時間, 避免不小心改錯. 使用加減調整就可以將檔案時間, EXIF 時間, 都設定成合理值.

調完不正確的日期後, 接下來就是合併多台相機的檔案. 可以用批次修改檔名的功能來達成

我一般的做法都是在確定 EXIF 資訊正確後, 將檔名模式設定 "按EXIF日期", 日期格式選 yyyy_mmdd_hhmmss , 檔名重覆時自動附加流水號. 然後開始進行檔名的變更, 這樣所有的檔案就可以依照日期進行排列, 在看相片, 或是將相片轉成 DVD 時, 就可以按發生時間的順序來看, 而不會時間點亂跳.

其他還有許多特效、編輯、轉換 的功能, 也有熱心人士做了模板可以套用, 有興趣可以上官方網站去看看, 介紹還蠻詳細的. 我在這邊就不一一說明了.

官方網站
http://www.photocap.com.tw/


2010年3月2日 星期二

好用的免費壓縮/解壓縮軟體 -- 7-Zip

雖然在 Windows XP 之後的版本, 都已經內建讀寫 ZIP 的內建程式, 但還是覺得用不順手. 最近幾年我都是推薦別人使用 7-Zip 做為壓縮/解壓縮的工具程式.

支援不少檔案格式, 其中 7z 這一個由 7-Zip 自行發展出來的壓縮檔格式, 不論在執行效率或是壓縮後檔案大小, 表現都比 Zip 格式更好, 所以我自己不需給別人的檔案, 大多是選用這種格式壓縮. 一般給人檔案還是用 ZIP 的相容性最高, 至少可以用 Windows 內建功能去解... :)

還是列出援的檔案格式, 其中標紅色是我覺得比較有用到的


Packing / unpacking: 7z, ZIP, GZIP, BZIP2 and TAR
Unpacking only: ARJ, CAB, CHM, CPIO, DEB, DMG, HFS, ISO, LZH, LZMA, MSI, NSIS, RAR, RPM, UDF, WIM, XAR and Z.

同時可以整合在 檔案總管 的系統選單中, 使用者介面支援 74 種語言, 不過我也只用到繁中和英文就是了.

支援命令列模式及自解檔, 而且自解檔還能設定 script , 有時要打包檔案, 解開後自動執行特定檔案就很方便, 可以拿來當做一個解易的安裝包.

屬於 Open Source 軟體, LGPL 授權.
官方下載位置
http://www.7-zip.org/download.html

還有人做成 Portable 版本, 可以帶在 隨身碟 中執行不用安裝在 Windows 系統中. 當然在這種模式下就沒有系統選單可以用了. 不過 7-ZIP 本身的檔案管理介面也設計的不錯, 推薦使用.

Portable 版下載位置
http://portableapps.com/apps/utilities/7-zip_portable


2010年3月1日 星期一

窮人用的 Delphi - FreePascal & Lazarus

我使用 Delphi 已經有10多年的時間, 從 Delphi 1 (16位元), 一直到 Delphi 2006 的每一版都用過, 但是不得不說, Borland 實在是有點令人失望, Delphi 7 之後的版本, 穩定性及使用介面, 可以說大幅下滑, 至少我個人是很不滿意, 所以後來的 Delphi 2009, 2010 就沒什麼在用. 而且有一個很重要的選項, Delphi 一直沒能支援, 那就是 x64 的編譯器, 在這幾年 x64 大行其道, 尤是是 RAM 便宜後, 很容易就可以將 RAM 加到超過 4G , 這時就要 x64 的 OS 才能完全發揮硬體的效能, 而 Delphi 卻只能編出 32位元的執行檔, 唉...

在找了一下後, 發現有個不錯用的東西, GPL 授權模式的 Free Pascal, 可大部份相容於 Delphi 的語法及物件, 而 Lazarus 則是 IDE 環境, 和 Free Pascal 整合在一起, 號稱免費版的 Delphi.

而且可以支援在 Windows 以外的平台開發, 包含 Linux, FreeBSD, Mac OS X, 還能編譯出在 x86, x64, ARM 等環境下執行的執行檔, 且版本開發到目前的 2.4.0 算是有相當的穩定性. 編出的執行檔效能也不錯. 自己在家裏要裝起來寫寫小程式, 或學生要練習用, 應該算是個很好的編譯環境.


2010年2月28日 星期日

程式設計(Windows API) - 磁碟I/O的效能測試

今天花了不少時間, 把 Q9400 那台機器的 Host 及 Guest 建立起來, 也留下了部份安裝過程式的圖片, 等有空的時候再整理成安裝教學.

在這邊要談的是, 效能測試 的部份. 現在已經有不少應用軟體, 會用種種方式幫系統效能評分, 可是我們身為資訊人, 當然也要多了解一點實作的方法, 不能只看軟體跑出來的數字.

對磁碟效能, 最直覺的想法, 就是實際產生一個檔案, 然後讀取內容, 計算花費的時間就可以得到寫入的效能, 讀出的效能. 不過在 Windows 系統中, 為了加強效能, 所以大量的運用 Cache 和 Prefetch 的技巧, 所以在寫檔時, 可能檔案還在記憶體的 Cache 中, Windows 就已經回傳寫入完成給程式了, 讀取時更有可能因為剛才寫入的東西還留在 Cache 中, 跟本就沒有到檔案系統中讀取檔案, 而是直接從 Cache中傳回檔案內容. 這樣會造成檔案系統效能很好的錯覺, 或是運氣不好, 讀寫的過程中正好碰到 Cache 要將大量的資料寫回檔案系統, 造成系統效能降低的錯覺.

那麼要如何避免 Cache 的干擾, 而確實測試檔案系統的讀寫效能呢? 查了一下資料, 發現在 Windows API 中, 就有提供這樣的參數可用. 但要注意必需要能直接調用 Windows API 才能使用這些參數, 若使用程式語言內, 包裝過的 函數 去開啟檔案, 那就會用 Windows 的預設方式, 即透過 Cache 進行讀寫.

使用上其實很簡單, 只在要 Windows API 的 CreateFile 中, 設定參數值即可, CreateFile 的語法格式如下

Syntax (C++)

HANDLE WINAPI CreateFile(
  __in LPCTSTR lpFileName,
  __in DWORD dwDesiredAccess,
  __in DWORD dwShareMode,
  __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  __in DWORD dwCreationDisposition,
  __in DWORD dwFlagsAndAttributes,
  __in_opt HANDLE hTemplateFile
  );


詳細的參數請參考 MSDN 中的說明, 我要說重點是在參數 dwFlagsAndAttributes.

dwFlagsAndAttributes是 DWORD 類型參數, 每一個 Bit 代表不同的旗標(選項). 這邊主要針對 CACHE 相關的 2 個參數介紹

FILE_FLAG_WRITE_THROUGH (0x80000000) 此旗標會使任何對該控制代碼所做直接寫入檔案而不被緩衝的寫入,  但仍會寫入 Cache 中. 在設計上一般是運用在網路或外接裝置的寫出, 例如隨身碟的檔案寫入, 若未加入此參數, 在寫一個檔案到隨身碟, 不要退出硬體就直接拔出隨身碟, 你會發現剛才寫入的檔案居然不見了. 因為系統在傳回寫入成功後, 只是寫到 Cache 中, 還沒真的寫到外接裝置上.


FILE_FLAG_NO_BUFFERING (0x20000000) 此旗標是代表系統會排除所有緩衝先期讀取檔案和磁碟快取, 同時也使所有讀取都保證從 "檔案" 中取得, 不能從任何系統緩衝區或磁碟快取之中讀取. 不過有些特例, 像透過網路芳鄰讀取遠端的檔案, 系統會忽略此參數, 會先試著從 Cache 中讀取檔案內容.

這 2 個 Flag 可以分開設定, 也可以合併使用, 在設計檔案系統的讀寫效能測試時, 就可以下這 2個Flag, 先將檔案寫入到檔案系統中後, 再讀取該檔案的內容即可. 很簡單, 不是嗎?

2010年2月26日 星期五

在 VirtualBox 中的網路卡模式設定

名詞定義
vbox --> VirtualBox 的簡稱
Host --> 執行 vbox 的電腦, 一般來說是一台真實的電腦, 除非你是在虛擬電腦上再安裝一次 vbox 並產生虛擬電腦中的虛擬電腦. (很饒舌吧!)
Guest --> 透過 vbox 產生出來的虛擬電腦.


虛擬機器的運用上, 有很大的部份都會運用到網路功能, 在網路的設定上, vbox 提供了 5 種不同的模式, 分別說明如下(以 vbox 3.x 為例):

1. 未掛附 (Not Attached)
會在 Guest 環境中出現一張網卡, 但是就像沒有插網路線一樣. 這和未勾選 "啟用網路卡" 不同, 沒有啟用網路卡時, 就好像在電腦上沒有安裝網卡, 而 未掛附是指未接網路線, 在測試程式時, 各軟體的執行行為些差異.

2. NAT(Network Address Translation) --> vbox的預設值
就像在 Guest 和 Host 之間有一道防火牆, Guest 可以透過這道防火牆連線到外部, 但外部不能連進來. 這個設定對 Guest 來說基本上不需什麼額外的設定, IP 的取得也都由 vbox 內建的 dhcpserver 提供. 當然相對也有一些限制, 像外部電腦廣播的 UDP封包就會收不到, 所以不能瀏覽網芳的電腦列表, 外部不能直接連線所以不能建立像 Web Server, FTP server 等服務. 還有一些細節, 可參考 vbox 的說明檔.

3. 橋接網路(Bridged Adapter)
vbox 會在 host 虛擬一張網卡, 過濾並綁定在 Host 上的其中一張網卡上的封包, 這樣可以讓 Guest 就好像一台實體的機器一樣, 取得一個實體的IP, 不管從 Host 或是 Guest 來看, 就好像各自擁有一張獨立的網卡, 並可任意連線到任一台機器(只要原本實體網卡可連線). 對 Host 以外的機器, 也可以認得 Guest的IP 並進行存取.

4. 內部網路(Internal Adapter)
和 橋接網路 很像, Guest 可以直接和外部的電腦進行溝通, 不過有一個限制就是 "外部的電腦" 僅限定由 vbox 產生的 Guest 虛擬電腦. 在 內部網路 可以達成的功能, 實際上皆可用 橋接網路取得, 但內部網路有 2 個額外的好處. 第一是速度, 因為只在 Guest 中溝通, 實際上並不一定需要透過實體的網路卡處理封包, 而是由 vbox 的虛擬網卡直接傳送資料, 效能較佳. 第二是安全性, 非 Guest 環境不能存取, 可減少被外部攻擊的機率.

5. 主機網路(Host-Only Adapter)
和 內部網路 很像, 但可連線的範圍更小, 只限定在同一台主機的 Guest 才能連線. 一般可以用在內部測試時使用, 不需和外部進行連線, 例如測試 Client/Server 程式, 即可在 Host 上建立2個 Guest 設定成 Host-Only 即可開始測試.

在上述的5種模式中, NAT 預設一定會啟動 DHCP 分配IP, Bridge 則和你的實體網卡一樣, 依實際環境決定是否需手動設定 IP. 而在 內部網路 和 主機網路 , 因為不能存取外部的 DHCP server, 所以想自動取得 IP, 就需啟動虛擬網卡的 DHCP 功能, 在 vbox 的 檔案 / 偏好設定 / 網路 / Host-Only networks 中可以選取虛擬網卡並啟動 DHCP server, 這樣你的電腦上各個 Guest 就都可以自動取得 IP 了.

 附上一張以 Windows XP 為 Host, Ubuntu (Linux) 為 Guest , 設定 橋接網路 開啟網芳目錄的畫面.

2010年2月24日 星期三

電腦復活了

在更換了新的電源供應器後, 我的電腦終於復活了... 一個星期不見的 Windows 7 畫面, 終於又出現在我的眼前.

只是現在假期已經結束, 天天上班還沒空來好好的整頓這台新電腦. 在週末或許可以弄些新的東西出來.

2010年2月23日 星期二

程式設計(Delphi) - 移除超過日期的舊檔案

因為之前家裏車停放在門口時, 曾經被小偷敲破玻璃偷走音響/行車電腦. 在家門口裝了台攝影機, 接到電腦上錄影. 因為每天這樣錄下的容量還挺大的, 系統本身又沒有定期刪除舊資料的功能, 所以只好自己寫一個, 免得因為 硬碟空間不足, 而停止錄影.

這個程式適合中放在 Windows 排程中, 可設定每週執行一次, 只保留最近3天的檔案, 這樣就可避免硬碟容量被佔用問題. (會有人需要編好的執行檔嗎? 有需要的留個言吧!)




program rmFolder;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  windows,
  DateUtils,
  shellapi,
  classes;

procedure ShowSyntax() ;
begin
  writeln('移除超過指定天數前建立的目錄及子目錄') ;
  writeln('Syntax:') ;
  writeln(extractFilename(paramstr(0)),' [/D:天數] 路徑') ;
end ;

(*========================================
  取得超過指定期限的目錄(只找第一層), 存放在 slFolder 傳回.

  傳回值:
    符合條件的個數
*)
function GetFolderPath(sPath:string;iOld:integer;slFolder:TStringList):integer ;
var
  h : THandle ;
  dtSpecDate : TDateTime ;
  wfd : TWIN32FindData ;
  LocalFileTime : TFiletime ;
  systime : TSystemTime ;
  dt : TDateTime ;
begin
  result:=0 ;
  slFolder.Clear ;

  dtSpecDate:=today-iOld ;
  h:=findFirstFile(pchar(sPath+'*'),wfd) ;
  if h=INVALID_HANDLE_value then
    exit ;

  repeat
    if ((wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)<>0) and
      (wfd.cFileName[0]<>'.') then
      begin
      FileTimeToLocalFileTime(wfd.ftCreationTime, LocalFileTime);
      if not FileTimeTosystemtime(localfiletime,systime) then
        exit ;
      dt:=systemtimetodatetime(systime) ;
      if dt<dtSpecDate then
        slFolder.Add(sPath+strpas(wfd.cFileName)) ;
      end ;
    until not FindNextFile(h,wfd) ;

  findClose(h) ;
  result:=slFolder.Count ;
end ;

Function DelTree(DirName : string): Boolean;
var
 SHFileOpStruct : TSHFileOpStruct;
 DirBuf : array [0..MAX_PATH] of char;
begin
 try
   Fillchar(SHFileOpStruct,Sizeof(SHFileOpStruct),0);
   FillChar(DirBuf, Sizeof(DirBuf), 0 );
   StrPCopy(DirBuf, DirName);
   with SHFileOpStruct do
     begin
     Wnd    := 0;
     pFrom  := @DirBuf;
     wFunc  := FO_DELETE;
     fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
     end;
  Result := (SHFileOperation(SHFileOpStruct) = 0);
  except
    Result := False;
 end;
end;

var
  i, iCode : integer ;
  sPath : string ;
  slFolder : TStringList ;
  iDayOld : integer ;
begin

  if paramcount=0 then
    begin
    ShowSyntax() ;
    exit ;
    end ;

  sPath:='' ;
  iDayOld:=0 ;
  for i:=1 to paramcount do
    begin
    if copy(ParamStr(i),1,3)='/D:' then
      begin
      val(Copy(ParamStr(i),4,6),iDayOld,iCode) ;
      if iCode<>0 then
        begin
        Showsyntax() ;
        exit ;
        end ;
      end ;

    if DirectoryExists(ParamStr(i)) then
      begin
      sPath:=ParamStr(i) ;
      end ;
    end ;

  if AnsiLastChar(sPath)^<>'\' then
    sPath:=sPath+'\' ;

  slFolder:=TStringList.Create ;
  iCode:=GetFolderPath(sPath,iDayOld,slFolder) ;
  for i:=0 to iCode-1 do
    begin
    DelTree(slFolder[i]) ;
    end ;
end.

2010年2月22日 星期一

更換電源供應器

終於在年假結束後, 和電腦公司聯絡上. 說好明天他會寄一個新的 Power 過來, 希望明天收到新的 X-PRO 500瓦電源供應器後, 就可以順利的讓我的新電腦復活過來.

買了電腦, 就是要用的, 沒想到這次運氣這麼不好, 買到不耐操的. 希望下一個 Power supply會更好.

2010年2月20日 星期六

頭份- 貝拉米餐廳

今天全家到頭份的 貝拉米餐廳 吃中餐。

這裏的主題是歐風料理, 場地也很有特色, 門口有一個風車隨風轉動.



進去之後, 右邊是一排停車的位置, 左手邊則是餐廳本體和一個廣場.

這個地方佔地不小, 一大塊草皮.

 草皮都沒灑農藥, 證據就是很多小昆蟲, 上一次是秋天的時候去, 有很多蟀蟀、蚱蜢之類的昆蟲, 小朋友在草地上玩得很高興。有戶外兒童區擺放一座兒童遊樂設施(大型溜滑梯), 還有一個小小的碼頭和池塘. 造景十分不錯. 而且水很乾淨, 這陣子下雨, 池塘裏的黑殼蝦都流到旁邊水溝, 結果幾個小朋友和大人, 就圍那裏抓蝦子, 玩得不亦樂乎. 再過去還有一個藍球架, 可以打半場, 只是我們家的小朋友都太小, 球還丟不進籃筐中. 這次還自備脚踏車一台, 可以在裏頭騎。


水池邊還有一個古早的手動式抽水幫浦, 這時的天氣太冷沒讓小朋友玩水.

吃得東西有幾大項, 我們點了 地中海比薩、海鮮焗意大利麵、雞腿燉飯、牛排... 等, 因為忙著吃, 所以都沒拍相片, (其實相片都是吃完才想到要拍的).

價位大約從 250 ~ 400 之間,住新竹、頭份地區的朋友, 有時間可以去吃吃看. 值得推薦.



程式設計(Delphi) - 英文單字重新排列 (Mix-up Vocabulary)

因為兒子的寒假作業, 有一大題是英文單字的重組, 範圍是他上一學期的英文課本內的單字, 有點簡單的單字很容易就猜出來, 但是一些比較少用到的單字, 真的是想破頭也不知道, 課本又有上百頁的內容, 翻到呆掉. 所以寫了一個小程式, 可以重新列單字的字母順序, 這樣看到眼熟的拼法就可以比較快的找的答案. 未來要改善的話, 應再搭配英文字期進行查表, 可以更有效率. 不過這是應急用的程式, 先將就一下吧.

程式碼如下:





unit UMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    MemoResult: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  sl : TStringList ;  // 存放可能的排列方式
  iTotal : integer ;  // 排列方式的計數器

// 使用 rescursive 進行排列, 不要輸入長度超過 8 的字串, 8!=40320種排列已經看呆了
// 傳入值: p: 尚未使用的字串, q:準備輸出的已排列字串
procedure remap(p, q : string) ;
var
  i, iLen : integer ;
begin
  if p='' then
    begin
    sl.Add(q) ;
    inc(iTotal) ;
    end ;

  iLen:=length(p) ;
  for i:= 1 to iLen do
    remap(copy(p,1,i-1)+copy(p,i+1,iLen-i), q+copy(p,i,1)) ;
end ;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // 初始化
  sl:=TStringList.Create ;
  iTotal:=0 ;
  memoResult.Lines.Clear ;
  
  // 要重組的字串放在 edit1.text 中傳入
  remap(Edit1.Text,'') ;
  
  // 顯示可能的排列方式個數
  caption:=inttostr(iTotal) ;
  
  // 列出所有的排列方式
  memoResult.Lines.AddStrings(sl);
  
  // free memory
  sl.free ;
end;

end.





VirtualBox 虛擬機器(虛擬化應用軟體)

虛擬機器, 指的是在一台電腦上, 運用特定的軟體, 虛擬出多台電腦環境, 例如在 Windows XP 為基礎的作業環境( 稱為HOST), 可以再虛擬出多台電腦, 安裝 Linux, Windows 98, Windows 7 等不同的作業系統(稱為GUEST). 這樣做的好處有不少, 對企業來說, 可以在一台機器上設置多種服務, 並動態調配資源, 現在很熱門的雲端運算, 其實也是一種虛擬化的運用. 對個人來說, 像我這樣會測試各樣軟體的人, 以前需要頻繁的重灌系統, 現在只要在一個基礎環境下切換不同的虛擬機器即可, 甚至以前要試 Client/Server 的環境時, 需要多台電腦. , 現在只要在同一台電腦上, 開啟多個虛擬機器, 就可以模擬網路的使用, 非常方便.

目前較常見, 而且是免費讓個人使用的虛擬化應用軟體, 有下列三種 VMWare Server , Virtual PC, VirtualBox. 這三個軟體我都有用過, 目前使用上以 VirtualBox 最順手, 感覺使用上的效能也是最好的.  原本想要寫一篇三個軟體的比較, 可是不幸的, 我的新電腦電源供應器壞了, 而這幾天年假電腦公司也休息, 聯絡不到人可以維修, 得等到電腦修好了, 才能進行實測囉.


2010年2月18日 星期四

程式技巧(Delphi) - 包含子目錄的檔案複製 ( 有 檔案個數 及 檔案大小 2個進度列)

這個程式是拿來當範例用的, 還有許多地方可以加強, 例如對目的檔案的日期、屬性等訊息並未複製, 只有檔案內容的複製. 未處理 unicode 檔案, 未檢查空間是否足夠, 未用多執行緒加速...等. 不過已可達到 複製包含子目錄下的檔案, 並顯示進度列這 2 個基本需求





unit Utest;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

const
  _i32MB=32*1024*1024 ;

type
  TForm1 = class(TForm)
    LabelSrc: TLabel;
    EditSrc: TEdit;
    LabelTar: TLabel;
    EditTar: TEdit;
    btnCopy: TButton;
    ProgressBarByNum: TProgressBar;
    ProgressBarBySize: TProgressBar;
    procedure btnCopyClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    iNumofFiles : integer ;   // 記錄目錄下檔案總數
    i64SizeofFiles : int64 ;  // 記錄目錄下檔案大小總和
    pBuf : pointer ;
    function DoCopyFile(sSrcFile,sTarFile:string;iLeftNum:integer;var i64LeftSize:int64):boolean ;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
  slSrcFiles : TStringList ;

// 輸入: 要查詢的路徑(要含 *.*) , 要存放檔案大小總和的變數(用 int64避免4GB問題)
// 傳回值: 檔案總數
//         檔案列表會存放到 slSrcFiles 中, 此物件需在外部宣告
function TravelTree(sRoot:string; var i64TotalSize:int64):integer ;
var
  fd : WIN32_FIND_DATA ;
  h : Thandle ;
  sPath, sName : string ;
begin
  result:=0 ;
  h:=findfirstfile(pchar(sRoot),FD) ;
  if h=INVALID_HANDLE_VALUE then
    exit ;

  sPath:=ExtractFilePath(sRoot) ;
  repeat
    sName:=strpas(fd.cFilename) ;
    if (fd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY then
      begin
      // 若是目錄則用 recursive
      if (sName<>'.') and (sName<>'..') then
        result:=result+TravelTree(sPath+sName+'\*.*',i64totalSize) ;
      end
    else
      begin
      result:=result+1 ;
      slSrcFiles.Add(sPath+sName) ;

      if fd.nFileSizeHigh=0 then
        i64TotalSize:=i64TotalSize+fd.nFileSizeLow
      else
        i64TotalSize:=i64TotalSize+(int64(fd.nFileSizeHigh)shl 32)+fd.nFileSizeLow ;
      end ;
    until FindNextFile(h,fd)=false ;
  windows.FindClose(h) ;
end ;

function TForm1.DoCopyFile(sSrcFile,sTarFile:string;iLeftNum:integer;var i64LeftSize:int64):boolean ;
var
  fsSrc, fsTar : TFileStream ;
  sPath : string ;
  iReadSize : integer ;
begin
  sPath:=extractFilePath(sTarFile) ;
  if not directoryExists(sPath) then
    forceDirectories(sPath) ;

  result:=true ;
  try
    fsSrc:=TFileStream.Create(sSrcFile,fmOpenRead);
    fsTar:=TFileStream.Create(sTarFile,fmCreate);
    try
      repeat
        iReadSize:=fsSrc.Read(pBuf^,_i32MB) ;
        fsTar.Write(pBuf^,iReadSize) ;
        i64LeftSize:=i64LeftSize-iReadSize ;

        // 更新 大小 的進度列
        progressBarBySize.Position:=round((i64SizeOfFiles-i64LeftSize)/i64SizeOfFiles*100) ;
        // 處理訊息, 例如中斷執行
        application.ProcessMessages ;
        until iReadSize<_i32MB ;
    finally
      fsSrc.Free ;
      fsTar.Free ;
      end ;
    // 更新 個數 的進度列
    progressBarByNum.Position:=round((iNumOfFiles-iLeftNum)/iNumOfFiles*100) ;
  except
    result:=false ;
    end ;
end ;

procedure TForm1.btnCopyClick(Sender: TObject);
var
  i64Size: int64 ;
  sTarPath, sTarFile, sSrcFile : string ;
  iSrcLen : integer ;
  i : integer ;
begin
  i64Size:=0 ;
  slSrcFiles:=TStringList.Create ;
  try
    // 計算目錄下的檔案總數及檔案大小總和
    iNumofFiles:=TravelTree(EditSrc.Text+'\*.*',i64Size) ;
    i64SizeOfFiles:=i64Size ;

    // 進度列用 百分比 計算
    progressbarByNum.Max:=100 ;
    progressbarBySize.Max:=100 ;
    progressbarByNum.Position:=0 ;
    progressbarBySize.Position:=0 ;

    i:=slSrcFiles.Count-1 ;
    iSrcLen:=length(editSrc.text)+1 ;
    sTarPath:=editTar.text ;
    if not directoryExists(sTarPath) then
      forceDirectories(sTarPath) ;
    while i>=0 do
      begin
      // 來源檔名
      sSrcFile:=slSrcFiles[i] ;
      // 目的檔名
      sTarFile:=sTarPath+copy(sSrcFile,iSrcLen,maxint) ;
      // 複製每一個檔案
      DoCopyFile(sSrcFile,sTarFile, i, i64Size) ;

      dec(i) ;
      end ;

  finally
    slSrcFiles.Free ;
    end ;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  getmem(pBuf,_i32MB) ;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  freemem(pBuf,_i32MB) ;
end;

end.




2010年2月17日 星期三

慘劇-- 新電腦不能開機了

今天是悲慘的一天...

新買的那台 Q9400 , 居然不能開機了, 電腦鍵按下去, 一點反應也沒有, 看來應是 Power 故障, 這可是新品呀!! 就是敗在這一顆  X-PRO 500瓦的電源供應器 上

怨恨呀!! 又是過年期間, 打電話到電腦公司去, 都沒人接, 看來還要再過幾天才會有人上班, 為什麼我會遇到這麼悲情的事... 嗚嗚嗚...

新電腦不能用, 所以只好還是用我的 NB 上網, 原本想在新電腦上跑跑東西的, 就沒辦法了....

時不予我呀!!


2010年2月15日 星期一

複製檔案的好幫手

買了新電腦後, 一件麻煩的工作就是要把舊資料搬到新的電腦上. 資料又有區分, 有些是放在原本的備份硬碟上, 有些是在舊的電腦中的舊硬碟. 原本想在花些時間重新整理, 不過因為偷懶, 不想反覆的拆裝硬碟, 所以除了將一顆 250GB 的 碟硬加到新的機器上外, 其他的都用 USB外接硬碟的方式複製資料。




因為嫌 Windows 本身的檔案複製效能不好, 所以特別又到網路上搜尋一番, 看有什麼比較好用的工具可以加速檔案的搬移, 我預計要複製到新電腦上的資料, 大約有 300GB, 一堆自己拍的相片、DV影片檔, 若是讓 Windows 慢慢跑, 實在是沒什麼耐心.



Google 之後, 找到幾套較知名的檔案複製工具, 因為現在只是要找個比檔案總管快的系統, 所以也沒有仔細的比較, 只用了 2 套 , TeraCopy 和 FastCopy. 其中 FastCopy 在他的網頁上, 宣稱是Windows 系統上最快的複製檔案工具.(FastCopy is the Fastest Copy/Delete Software on Windows.) 這套是日本人寫的程式, 有分享 Source Code. 另一套TeraCopy則是 Code Sector 這家公司的產品, 家庭用戶可以免費使用, 另外有出 TeraCopy Pro 的版本, 不過反正我們也不會去用, 還是以 TeraCopy 為使用的對像.



FastCopy 號稱最快, 當然要先試用看看. 只是安裝後有些小小的失望, 因為UI給人的第一印象實在不怎麼樣. (見下圖)





相較之下, TeraCopy 就有質感多了.(見下圖)



這兩者都有提供整合到檔案總管的右鍵選單中, 也可以取代原本在檔案總管中 複製/貼上 以及 拖曳/放下 的功能. 但我個人覺得 TeraCopy 的整合寫得比較好, 基本上就很好的取代原本檔案總管中的複製檔案功能. FastCopy 雖然就功能上都能達到, 但總覺得操作畫面做得不精緻.



接下來是對檔案操作的效能問題, 這兩者都強調使用 多執行緒及其他加速方法, 可大幅改善 Windows 檔案複製的效能, 首先是使用TeraCopy 從 USB硬碟上複製 DVD 映像檔的目錄, 大約 30GB大小, 直接在檔案總管中拖放後, 就開始顯示 TeraCopy 的複製進度畫面, 速度一開始顯示 40MB/秒 , 後來速度很快就掉下來, 一直維持在 26~28 MB/秒 之間. TeraCopy平均大約 27MB, 效能幾乎就是那個USB外接碟宣稱的讀取速度.



用FastCopy 複製相片檔目錄, 大小約 20 GB , FastCopy 平均速度約 23~24 MB/秒 , 不過這個目錄下檔案數較多, 有幾百KB 的檔案也有幾 MB 的檔案, 和DVD目錄夾下的幾乎都是幾百 MB~幾GB 大小的檔案有差異, 不過看來起效能並看不出 "最快" 的感覺.



後來因為 TeraCopy 快了一點點, 而且使用較方便, 所以其他的檔案都是用 TeraCopy 進行備份. 在本機兩顆不同的硬碟之間互相 複製檔案 的速度也很不錯, 可以達到 42 MB/秒 左右的效能



關於 TeraCopy / FastCopy 以及其他像 KillCopy 、ExtremeCopy 等軟體, 就等有空再來寫一篇使用測試報告.

2010年2月14日 星期日

正月初一新年好

正月初一新年好, 二月十四情人節, 雙喜臨門剛剛好!

新竹這兩天都是陰雨綿綿, 雖然不冷, 可是卻是叫人不想出門, 現在是老婆和小孩都睡覺去, 才能有點時間上來更新.

新買的 Q9400 果然效能比之前用的電腦好太多了, 至少關機進系統的速度都是有秒當單位即可, 用不了一分鐘. 昨天試著安裝 Windows 7 Pro, 安裝過程也都十分順利, 12:35 ~ 13:04 安裝完整個 Windows 7 到可以使用,雖然比預期的慢了一點, 但還是可以接受.

目前正試著設定 WOL 及 遠端桌面 ,  WOL 還好, 試了一下就已經可以遠端開機. 可是現在卡在遠端電腦無法正確的建立連線. 防火牆設定有檢查過了, 可是還連不到 Q9400, 但是從 Q9400 可以 ping 到另一台 ASUS 的 筆記型電腦, 為什會一直不行呢? 晚一點再繼續研究...

2010年2月12日 星期五

小年夜

 今天是2月12日, 也是春節前的最後一個上班日. 公司裏頭今天也是冷清了許多, 有三分之一的人不在, 出差的出差, 請假的請假, 顯得份外冷清.

今年的假比往年慢了一天才放, 年味就覺得淡了好多, 還在上班, 沒什麼要過年的感覺. 記得多年前, 每逄春節的前幾天, 就開始準備過年, 採買禮盒、大掃除、整理環境... 到賣場、商店這些地方, 都會聽到有年味的音樂歌曲... 今年好像到現在都還沒聽到.

不過在小年夜(除夕前一天)拜天公還是要的. 這回訂在 丑時 , 也就是半夜一點開始拜, 所以現在先把今天的事記下, 免得晚一點準備拜拜的東西後就沒空了.

而且這種節日, 都是陪家人的時間, 反而不如平常能待在電腦前的時間多.

2010年2月11日 星期四

新電腦 2 台到貨

今天下午 2 台新電腦都到貨了

老婆用的 ASUS CS5111 (E5400 + 4GB DDR2 + 500GB HDD)



我測試用的組裝機 (Q9400 + 8GB DDR3 + 640GB HDD)

我用的這台雖然醜了點(尤其是和老婆的那台 CS5111 放在一起時), 但是效能不錯的. 可惜明天還要上班, 沒什麼時間好好擺弄這 2 台電腦. 不過已經準備把下星期的春節假期, 至少貢獻三分之一給這 2 台電腦了!!

測試用的電腦得先準備好幾個常用的作業系統,和相關的應用軟體. 講到這個得要再說一下, 微軟的 Technet Plus 還是很好用的. 為了要更方便的這些有的沒的環境, 我還特別訂閱了 
TechNet Plus Direct . , 可以完全線上存取 伺服器和作業系統 , 而且是沒有時間限制的完整版評估軟體. 對我這種想要試試新玩意兒的人很方便.

程式技巧(Delphi) - Windows 內建的旋轉圖片函數 PlgBlt

Windows 系統有內建的旋轉圖片函數 PlgBlt , 但大多數寫 Windows 程式的人都不知道, 提供個範例

// 計算旋轉後的座標
function RotateXY(dbTheda:double;p1:TPoint):TPoint ;

const
  _dbLastT:double=-99999.999 ;
  _cosA:double=0.0 ;
  _sinA:double=0.0 ;
var
  dbA : double ;
begin
  if dbTheda<>_dbLastT then
    begin
    dbA:=dbTheda*Pi/180 ;
    _sinA:=sin(dbA) ;
    _cosA:=cos(dbA) ;
    _dbLastT:=dbTheda ;
    end ;

  Result.x:=round(p1.x*_cosA+p1.y*_sinA) ;
  Result.y:=round(-p1.x*_sinA+p1.y*_cosA) ;
end ;
 
// 將 image1 中的影像旋轉指定的角度
procedure TForm1.Button1Click(Sender: TObject);

var
  ptOrgCenter, ptTarCenter, ptc : TPoint ;
  pta : array[0..3] of TPoint ;
  ba : array[0..3] of integer ;
  i : integer ;
  bmp : TBitmap ;
  dbTheta : Double ;
begin
  ptOrgCenter.x:=Image1.Picture.Width div 2 ;
  ptOrgCenter.y:=Image1.Picture.Height div 2 ;

  dbTheta:=StrToFloat(Edit1.Text) ;
  pta[0]:=RotateXY(dbTheta,Point(0,0)) ;

  pta[1]:=RotateXY(dbTheta,Point(Image1.Picture.Width-1,0)) ;
  pta[2]:=RotateXY(dbTheta,Point(0,Image1.Picture.Height-1)) ;
  pta[3]:=RotateXY(dbTheta,Point(Image1.Picture.Width-1,Image1.Picture.Height-1)) ;

  bmp:=TBitmap.Create ;
  bmp.PixelFormat:=pf24bit ;
  bmp.Canvas.Brush.Color:=clBtnFace ;

  for i:=0 to 3 do
    ba[i]:=pta[i].x ;

  bmp.width:=MaxIntValue(ba)-MinIntValue(ba) ;

  for i:=0 to 3 do
    ba[i]:=pta[i].y ;

  bmp.Height:=MaxIntValue(ba)-MinIntValue(ba) ;

  ptc:=RotateXY(dbTheta,Point(Image1.Picture.Width div 2,Image1.Picture.Height div 2)) ;

  ptTarCenter.x:=bmp.Width div 2 ;
  ptTarCenter.y:=bmp.Height div 2 ;

  pta[0].x:=pta[0].x+ptTarCenter.x-ptc.x ;
  pta[0].y:=pta[0].y+ptTarCenter.y-ptc.y ;
  pta[1].x:=pta[1].x+ptTarCenter.x-ptc.x ;
  pta[1].y:=pta[1].y+ptTarCenter.y-ptc.y ;
  pta[2].x:=pta[2].x+ptTarCenter.x-ptc.x ;
  pta[2].y:=pta[2].y+ptTarCenter.y-ptc.y ;

  PlgBlt(bmp.Canvas.Handle,pta,Image1.Canvas.Handle,0,0,image1.Picture.Width-1,image1.Picture.Height-1,0,0,0) ;

  Canvas.Draw(0,0,bmp) ;

  bmp.SaveToFile(ExtractFilePath(Application.Name)+'111.bmp') ;  // 將結果存成 BMP 檔案
  bmp.free ;
end;