2013年6月24日 星期一

2013年5月28日 星期二

NTP / SNTP tutor (#02, Epoch time)



事實上, NTP / SNTP time-server 回應送出的"主體", 是一個 32-bits / time-stamp value (起始於 1970年 一月 1日 零時零分零秒, 當作這個 32-bits time-stamp value == 0 值)。
1970 年 一月 1日, 星期四 (Thursday).

這個值(32-bits / time-stamp value), 也稱作 Unix timestamp, Unix time, POSIX time 或 Unix epoch.

這個值(32-bits / time-stamp value), Unix epoch, 因為 data-type 長度(32-bits) 限制, 進入 2038年之後則會失效!!

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

Time unit V.S Unix epoch
Time Second(s)
1 minute 60
1 hour 3600
1 day 86400
1 week 604800
1 month (30.44 days) 2629743
1 year (365.24 days) 31556926


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

使用的日期系統,是以西曆為基礎,這是在 1582 年首先由教宗 Gregory XIII 所建立的。這個日曆是為求更正較不精確的儒略曆產生之誤差而設計的。

在西曆中,一年正常為 365 天。因為恒星年的實際長度 (地球繞行太陽一次所需要的時間) 實際上為 365.25635 天,所以每四年會有一個 366 天的「閏年」,以消除由其他三個正常 (但較短) 年份所產生的誤差。可以被 4 整除的年份為閏年:例如,1988、1992 及 1996 均為閏年。

然而,仍有一個小誤差必須列入考量。為了消除這個誤差,西曆規定,可以被 100 整除的年份 (例如 1900) 必須同時被 400 整除才是閏年。

因此,下列年份「不是」閏年,
1700, 1800, 1900, 2100, 2200, 2300, 2500, 2600
因為它們可以被 100 整除,但「無法」被 400 整除。 下列年份「均為」閏年 :
1600, 2000, 2400
因為它們可以同時被 100 和 400 整除。

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

綜合整理, 閏年計算規則:「被4整除,且不被100整除,但又能被400整除者」

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

找到這篇分享文, NTP Server in WinXP, NTP Server 設定 ...

這套軟體來自於德國一家公司 (Meinberg)的 Free-Ware, "NTP Download"。

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

2013年5月5日 星期日

2012年9月4日 星期二

NTP / SNTP tutor (#01, introduction)



[ Windows XP Professional, Time Service ]

1.閣下這樣的情形,應該是由各工作站直接逕連外部時間伺服器做時間同步就可以了(例如國內的 tick.stdtime.gov.tw; 國外的話M$也有),它是免費的、而且不需要經過驗證。反之,若是有主機系統的,則只需將 Server指向外部時間伺服器,其餘的各 Clients則以 DHCP一併納入做時間校準即可。

2.以下的文件是 M$發布的,請自行參考:
標題:如何在 Windows XP 中設定授權時間伺服器

[設定 Windows Time 服務使用外部時間來源]
如果要將 Windows Time 服務設定為與外部時間來源同步化,請依照下列步驟執行:
1. 將伺服器類型變更為 NTP。如果要執行這項操作,請依照下列步驟執行:
a. 按一下 [開始],再按一下 [執行],輸入 regedit,然後按一下 [確定]。
b. 找出並按一下下列登錄子機碼:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\
c. 在右窗格中,用滑鼠右鍵按一下 [Type],然後按一下 [修改]。
d. 在 [編輯數值] 對話方塊的 [數值資料] 下方,輸入 NTP,然後按一下 [確定]。
2. 將 AnnounceFlags 設定為 5。如果要執行這項操作,請依照下列步驟執行:
a. 找出並按一下下列登錄子機碼:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\
b. 在右窗格中,用滑鼠右鍵按一下 [AnnounceFlags],然後按一下 [修改]。
c. 在 [編輯 DWORD 值] 對話方塊的 [數值資料] 下方,輸入 5,再按一下 [確定]。
3. 選取輪詢間隔。如果要執行這項操作,請依照下列步驟執行:
a. 找出並按一下下列登錄子機碼:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient\
b. 在右窗格中,用滑鼠右鍵按一下 [SpecialPollInterval],然後按一下 [修改]。
c. 在 [編輯 DWORD 值] 對話方塊的 [數值資料] 下方,輸入 TimeInSeconds,然後按一下 [確定]。

注意 TimeInSeconds 是每個輪詢之間您所指定的秒數的預留位置。建議值為 900 十進位。這個值會將時間伺服器設定為每隔 15 分鐘輪詢一次。
4. 啟用 NTPServer。如果要執行這項操作,請依照下列步驟執行:
a. 找出並按一下下列登錄子機碼:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer\
b. 在右窗格中,用滑鼠右鍵按一下 [Enabled],然後按一下 [修改]。
c. 在 [編輯 DWORD 值] 對話方塊的 [數值資料] 下方,輸入 1,再按一下 [確定]。
5. 指定時間來源。如果要執行這項操作,請依照下列步驟執行:
a. 找出並按一下下列登錄子機碼:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\NtpServer
b. 在右邊窗格中,用滑鼠右鍵按一下 [NtpServer],然後按一下 [修改]。
c. 在 [編輯數值] 的 [數值資料] 方塊中,輸入 Peers,然後按一下 [確定]。
6. 設定時間修正設定值。如果要執行這項操作,請依照下列步驟執行:
a. 找出並按一下下列登錄子機碼:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\
b. 在右窗格中,用滑鼠右鍵按一下 [MaxPosPhaseCorrection],然後按一下 [修改]。
c. 在 [編輯 DWORD 值] 對話方塊的 [底數] 下方,按一下 [十進位]。
d. 在 [編輯 DWORD 值] 對話方塊的 [數值資料] 下方,輸入 TimeInSeconds,然後按一下 [確定]。

注意 TimeInSeconds 是合理數值的預留位置,例如 1 小時 (3600) 或 30 分鐘 (1800)。您所選取的數值將根據輪詢間隔、網路情況及外部時間來源而定。
e. 找出並按一下下列登錄子機碼:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\
f. 在右窗格中,用滑鼠右鍵按一下 [MaxNegPhaseCorrection],然後按一下 [修改]。
g. 在 [編輯 DWORD 值] 對話方塊的 [底數] 下方,按一下 [十進位]。
h. 在 [編輯 DWORD 值] 對話方塊的 [數值資料] 下方,輸入 TimeInSeconds,然後按一下 [確定]。

注意 TimeInSeconds 是合理數值的預留位置,例如 1 小時 (3600) 或 30 分鐘 (1800)。您所選取的數值將根據輪詢間隔、網路情況及外部時間來源而定。
7. 結束 [登錄編輯程式]。
8. 在命令提示字元處輸入下面的命令,以重新啟動 Windows Time 服務,然後按 ENTER:
net stop w32time && net start w32time
9. 請在網域控制站以外的電腦上執行下面的命令,以便依據時間伺服器重設各電腦的時間:
w32tm /resync /rediscover
如需有關 w32tm 命令的詳細資訊,請在命令提示字元中輸入下列命令:
w32tm /?


注意 SNTP 使用「使用者資料包通訊協定」(User Datagram Protocol,UDP) 連接埠 123。如果這個連接埠未對網際網路開放,您便無法將自己的伺服器與網際網路 SNTP 伺服器取得同步。



[ 點擊小圖, 細觀大圖 ]

(續上篇)
伺服器的 NTP時間服務設定:(於命令字串模式下操作)

1.net time /SetSntp:

設定與外部的時間伺服器(Time Server),做時間同步時動作。
例:net time /setsntp:tick.stdtime.gov.tw
(指定 tick.stdtime.gov.tw做為外部時時間伺服器)

2.net time /querysntp
查詢 NTP設定是否成功。

3.net stop w32time net start w32time
停止時間服務。 啟動時間服務。

4.開啟:其中 PeerList可指定多部 NTP,但必須以 ","(逗號)隔開
w32tm /config /SyncFromFlags:Manual /ManualPeerList: 
(若設定多部 NTP除了應以 ","隔開外,不可以有空格)

5.更新:設定 NTP服務後,必須要予以更新才會生效
w32tm /config /update

6.重新偵測網路設定,並搜尋可用的 NTP服務:
w32tm /resync /rediscover
(ReSync:重新做時間同步化、ReDiscover:重新偵測及搜尋)


這篇文章中的資訊適用於:
Microsoft Windows XP Professional Edition (商用版)

關鍵字:
kbsecurity kbhowto kbenv kbfsmo kbinfo KB314054


<================================================>

[moonvilla 網友分享如下 ], "   , 已在 Windows XP Professional 驗證過 by 2012/09/05th.   "

一台有連 Internet 的 XP 可以自動與網際網路的時間伺服器對時,我今天碰到的情況是公司的 NAS 時間不正確,但是進入到它的管理介面發現它的 NTP Server 只能用 IP 方式對時,一般的網際網路時間伺服器都是直接的域名,如”time.stdtime.gov.tw”,另外,更重要的一點是,公司的防火牆是設定 NAS 既不能連外,也不能由外面連入。所以決定讓 NAS 可以直接透過我的電腦來校時。

作法:

1. 開始>執行,輸入”regedit”

2. 找到 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]

3. 修改或新增一個DWORD,名為”LocalNTP”,值為”1”(0 = disabled, 1 = enabled)

4. XP 的防火牆開啟 UDP 123 port

大功告成!



<================================================>


[ljs95510 網友分享如下..]

以下是敝宅小型區網 Server(Windows 2003)有關 W32Time登錄檔的實際設定,負責連外、再以 DHCP供應家中 7部 PC及 NB校時,多年以來運作良好、沒有任何問題。

記得主要只在[Parameters]做了下列的設定:
"NtpServer"="time.stdtime.gov.tw,0x1 tick.stdtime.gov.tw,0x1"


(以下全文照錄,請參考;若仍無法解決問題....有請其他專業的高手大大鼎力協助啦)...
=================================================
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time]
"Description"="維護在網路上所有用戶端及伺服器的資料及時間同步處理。如果這個服務停止,將無法進行日期和時間同步處理。如果這個服務被停用,所有依存的服務都會停止。

"
"DisplayName"="Windows Time"
"ErrorControl"=dword:00000001
"FailureActions"=hex:05,00,00,00,00,00,00,00,00,00,00,00,02,00,00,00,64,00,20,\
00,01,00,00,00,60,ea,00,00,01,00,00,00,60,ea,00,00
"Group"=""
"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,\
00,76,00,63,00,68,00,6f,00,73,00,74,00,2e,00,65,00,78,00,65,00,20,00,2d,00,\
6b,00,20,00,4c,00,6f,00,63,00,61,00,6c,00,53,00,65,00,72,00,76,00,69,00,63,\
00,65,00,00,00
"Objectname"="NT AUTHORITY\\LocalService"
"Start"=dword:00000002
"Type"=dword:00000020

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config]
"LastClockRate"=dword:0002625a
"MinClockRate"=dword:000260d4
"MaxClockRate"=dword:000263e0
"FrequencyCorrectRate"=dword:00000004
"PollAdjustFactor"=dword:00000005
"LargePhaseOffset"=dword:02faf080
"SpikeWatchPeriod"=dword:00000384
"HoldPeriod"=dword:00000005
"LocalClockDispersion"=dword:0000000a
"EventLogFlags"=dword:00000002
"PhaseCorrectRate"=dword:00000007
"MinPollInterval"=dword:00000006
"MaxPollInterval"=dword:0000000a
"UpdateInterval"=dword:00000064
"MaxNegPhaseCorrection"=dword:ffffffff
"MaxPosPhaseCorrection"=dword:ffffffff
"AnnounceFlags"=dword:0000000a
"MaxAllowedPhaseOffset"=dword:0000012c

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]
"ServiceMain"="SvchostEntry_W32Time"
"ServiceDll"=hex(2):43,00,3a,00,5c,00,57,00,49,00,4e,00,4e,00,54,00,5c,00,73,\
00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,77,00,33,00,32,00,74,00,\
69,00,6d,00,65,00,2e,00,64,00,6c,00,6c,00,00,00
"NtpServer"="time.stdtime.gov.tw,0x1 tick.stdtime.gov.tw,0x1"
"Type"="NTP"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Security]
"Security"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,02,\
00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\
00,00,02,00,60,00,04,00,00,00,00,00,14,00,8d,00,02,00,01,01,00,00,00,00,00,\
05,0b,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\
20,02,00,00,00,00,14,00,9d,00,00,00,01,01,00,00,00,00,00,05,04,00,00,00,00,\
00,18,00,9d,00,00,00,01,02,00,00,00,00,00,05,20,00,00,00,21,02,00,00,01,01,\
00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient]
"Enabled"=dword:00000001
"InputProvider"=dword:00000001
"AllowNonstandardModeCombinations"=dword:00000001
"CrossSiteSyncFlags"=dword:00000002
"ResolvePeerBackoffMinutes"=dword:0000000f
"ResolvePeerBackoffMaxTimes"=dword:00000007
"CompatibilityFlags"=dword:80000000
"EventLogFlags"=dword:00000001
"LargeSampleSkew"=dword:00000003
"DllName"="C:\\WINNT\\system32\\w32time.dll"
"SpecialPollTimeRemaining"=hex(7):74,00,69,00,63,00,6b,00,2e,00,73,00,74,00,64,\
00,74,00,69,00,6d,00,65,00,2e,00,67,00,6f,00,76,00,2e,00,74,00,77,00,2c,00,\
37,00,62,00,31,00,31,00,37,00,62,00,37,00,00,00,74,00,69,00,6d,00,65,00,2e,\
00,73,00,74,00,64,00,74,00,69,00,6d,00,65,00,2e,00,67,00,6f,00,76,00,2e,00,\
74,00,77,00,2c,00,37,00,62,00,31,00,31,00,37,00,62,00,37,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00
"SpecialPollInterval"=dword:00000e10

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer]
"InputProvider"=dword:00000000
"AllowNonstandardModeCombinations"=dword:00000001
"DllName"="C:\\WINNT\\system32\\w32time.dll"
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Enum]
"0"="Root\\LEGACY_W32TIME\\0000"
"Count"=dword:00000001
"NextInstance"=dword:00000001




<================================================>




來源連結:
http://www.synnex.com.tw/asp/fae_qaDetail.asp?from_prg=&topic=FAE&group=&parent=&classifyid=01464&seqno=17045 ]

NTP(Network Time Protocol;網路時間協定)概述與常見問題


06 / 23 / 2008
一、前言

電腦常常在使用一段時間後系統時間變快或變慢,除了維持 BIOS 設定值的電池電力快消耗殆盡外,另外亦有可能為主機板上負責計算時間的石英震盪器,因為製作過程中的些許誤差,導致產生的震盪頻率不完全準確,或是震盪器故障所引起。

以目前而言,電腦已成為人們生活中不可或缺的一部份,而準確的電腦系統時間在某些部分也相形地顯得越來越重要。例如:公司主機的資料備份、差勤系統的管理、網路技術的開發以及電子商務的運用。為了讓電腦時間能夠藉由網路達到校準的功能,因此 NTP 也因應而生。

NTP(Network Time Protocol)網路時間協定,是由美國德拉瓦大學 David L. Mills 教授於 1985 年提出,並於該年 9 月由 IETF(Internet Engineering Task Force)組織制訂為 RFC(Request for Comment) 958。目前已成標準的版本為 NTP Version 3,於 1992 年 3 月訂定為 RFC 1305。而 NTP Version 4 相較於先前版本有顯著的變革且目前正在發展中,也因此還未制訂成 RFC 標準。現今微軟作業系統使用的是 SNTP(Simple Network Time Protocol)。SNTP 是架構在 NTP Version 3,但卻簡化用戶端與伺服端之間的存取,並可透過網際網路來完成時間校準功能。


二、運作原理

NTP 的功能是基於 Client-Server 架構。由電腦連接到網路上某一台 NTP 伺服器來完成高精準電腦校時。而 NTP 伺服器是以階層式的架構來形成時間追溯體系。如下圖所示,位於階層最頂層(Stratum 1)的伺服器直接追溯國家標準時間,而第二層(Stratum 2)伺服器則透過最頂層伺服器間接追溯國家標準時間。每台伺服器均以本身的時鐘來維持某精準度的時間,並自動在固定的週期向上一層伺服器發出校時需求。

也因此,Stratum 1 伺服器的用途,主要是作為 Stratum 2 伺服器的來源時間伺服器。Stratum 1 伺服器也可能可以提供任務關鍵性的時間服務。有些 Stratum 1 伺服器,可能會有限制存取原則。

Stratum 2 伺服器的用途,主要是用來滿足一般的 SNTP 時間服務需要。Stratum 2 伺服器通常允許公開存取。一般建議使用 Stratum 2 伺服器來提供 SNTP 時間伺服器設定,因為它們通常位於近端的網路,因此能夠更快執行更新。

NTP 用戶端向 NTP 伺服器發出請求執行時間校準的過程如下圖所示:
T1-T0:為用戶端向 NTP 伺服器要求提供對時服務的時間,包括網路傳輸的時間。
T2-T1:NTP 伺服器處理對時服務的作業時間。
T3-T2:為 NTP 伺服器回覆用戶端對時服務的時間資料,包括網路傳輸時間。
T3-T0:總共花費的時間。

所以用戶端從伺服器上取得的時間與 NTP server 時間約延遲 (delay)T3-T2 至 T3-T1 之間。






2012年4月17日 星期二

[轉載]學程式設計的人不能不看的好文章

轉載自: http://www.vcroad.net/ (棗子原創 wutao8@263.net)

看了下面的這篇文章,深有感觸,棗子碰到的問題也是我們大多數程式設計師的通病,也許我們大多數人都只是在做一些比較小型的軟件,對軟件運行的效率不在乎,就算對速度和效率在乎的也可能是一些在資料庫操作方面的。大家看完了,也許會有很多感想,但這只是我同意棗子的個人觀點。

做為一名大四的學生,我面試過不少的單位,有成功的也有失敗的,但是對我來說所有的失敗在某種意義上都是一種成功,特別是我下面寫的這些,寫這篇文章的時候,我已經簽了南京的一家軟件公司,但是想起今年 2 月 21 日我面試蘇州台灣的IT公司的經歷聯想到我們現在學習程式設計的一些情況我真的深有感觸,這次面試使我深深的體會到了失敗但也收穫了很多。

我要說的將分成三部分:

1.是我面試的具體經過
2.是由面試想到的
3.現今我應該做的

當然這些話很大程度上是我個人的意見,不可能完全得到大家的贊同,所以在某些觀點上如果哪位朋友覺得跟我的有很大出入,請不要介意,也不要對我攻擊,就當我沒有說過,歡迎和我聯繫共同探討這些問題!

1.面試經過

大約在年前我接到了台灣瑞昱 (Realtek) 蘇州公司的面試通知,通知我 2 月 21 日到蘇州工業園區面試,接到面試後的幾天我把一些專業課溫習了一遍,特別是 C++ 和數據結構,由於大學幾年裡,我一直專研這些方面,加上通過了高級程式設計師的考試,對於一些常用的算法我差不多也達到了爛熟於胸的地步,當時的感覺是如果問了我這些方面的問題我應該是沒有問題的!

21 日那天我被安排在 4:30 面試,由一位技術人員單獨給我面試,在問了一些簡單的問題之後他給我出了一道程式設計題目,題目是這樣的(由於具體面試的題目比較煩瑣,我將其核心思想提取出來分解成了兩個獨立的簡單的問題,有可能問題分解的不當,請大家見諒,實際面試了一個的問題但比其複雜很多,而且涉及一些高等數學變換):

1) 寫一個函數計算當參數為 n(n很大) 時的值 1-2+3-4+5-6+7……+n

哼,我的心裡冷笑一聲!沒想到這麼簡單,我有點緊張的心情頓時放鬆起來!於是很快我給出我的解法:

long fn(long n) {
long temp=0;
int i,flag=1;
if(n<=0) {
printf("error: n must > 0);
exit(1);
}
for(i=1;i<=n;i++) {
temp=temp+flag*i;
flag=(-1)*flag;
}
return temp;
}
搞定!當我用期待的目光看著面試官的時候,他微笑著跟我說,執行結果肯定是沒有問題!但當 n 很大的時候我這個程式執行效率很低,在嵌入式系統的開發中,程式的運行效率很重要,能讓CPU少執行一條指令都是好的,他讓我看看這個程式還有什麼可以修改的地方,把程式優化一下!

聽了這些話,我的心情當時變的有點沉重,沒想到他的要求很嚴格,之後我對程式進行了嚴格的分析,給出了改進了的方案!

long fn(long n) {
long temp=0;
int j=1,i=1,flag=1;
if(n<=0) {
printf("error: n must > 0);
exit(1);
}
while(j<=n) {
temp=temp+i;
i=-i;
i>0?i++:i--;
j++;
}
return temp;
}
雖然我不敢保證我這個算法是最優的,但是比起上一個程式,我將所有涉及到乘法指令的語句改為執行加法指令,既達到要題目的要求而且運算時間上縮短了很多!而代價僅僅是增加了一個整型變數!

但是我現在的信心已經受了一點打擊,我將信將疑的看者面試官,他還是微笑著跟我說:「不錯,這個程式確實在效率上有的很大的提高!」我心裡一陣暗喜!

但他接著說這個程式仍然不能達到他的要求,要我給出更優的方案!天啊!還有優化!我當時真的有點崩潰了,想了一會後,我請求他給出他的方案!然後他很爽快的給出了他的程式!

long fn(long n) {
if(n<=0) {
printf("error: n must > 0);
exit(1);
}
if(0==n%2)
return (n/2)*(-1);
else
return (n/2)*(-1)+n;
}
搞笑,當時我目瞪口呆,沒想到他是這個意思,這麼簡單的代碼我真的不會寫嗎,但是我為什麼沒有往那方面上想呢!

他說的沒有錯,在 n 很大很大的時候這三個程式運行時間的差別簡直是天壤之別!

當我剛想開口說點什麼的時候,他卻先開口了:「不要認為 CPU 運算速度快就把所有的問題都推給它去做,程式設計師應該將代碼優化再優化,我們自己能做的決不要讓 CPU 做,因為 CPU 是為用戶服務的,不是為我們程式設計師服務的!」

多麼精闢的語言,我已經不想再說什麼了!

接著是第二個問題:

2) 他要求我用一種技巧性的程式設計方法來用一個函數實現兩個函數的功能 n 為如:fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6!

fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9! 現在用一個函數 fn(int n,int flag) 實現,當 flag 為 0 時,實現 fn1 功能,如果flag 為 1 時實現 fn2 功能!他的要求還是效率,效率,效率!

說實在話,如果我心情好的話我應該能給出一種比較好的算法,但我那時真的沒有什麼心思再想了,我在紙上胡亂畫了一些諸如 6!=6*5! 的公式後直截了當的跟他說要他給出他的答案!

面試官也沒有說什麼,給出了他的思路:

定義一個二維數組 float t[2][5] 存入 [2!,3!,4!,5!,6!],[5!,6!,7!,8!,9!] 然後給出一個循環:

for(i=0;i<6;i++) {
temp=temp+n/t[flag];
}
最後得到計算值!

呵呵,典型的空間換時間的算法!

這些總共花了 50 分鐘的時間,還有十分鐘我就跟他很隨意的聊聊天,聊了一些程式設計以及生活的問題,那時的我已經很放鬆了,因為我知道這次面試結果只有一個:失敗。

5:30 的時候面試官要我等通知,於是我離開了他們公司。這就是面試的整個經過!

2.由面試想到的

真的是很失敗啊!我記得那天下好大的雨,氣溫也很低,我邊走邊想,從 5:30 一直走到 7:30,全身都濕透了,又冷又餓,但是我只是一直走,腦子裡面充滿了疑惑,我也想讓雨把自己淋醒!看到這裡有些朋友可能覺得那些面試題目不算什麼如果讓自己做的話肯定能全部答對,我肯定相信你,因為我從未懷疑過中國程式設計師的能力,我認為中國有世界上最好的程式設計師,我也從未認為自己是高手,所以我做不出來不代表中國程式設計師比台灣或者別的地方的程式設計師差,所以我就從我的角度,我的所見所想來談一些感想:

不錯全世界都有優秀的程式設計師,中國也不例外,但是我疑惑的是:到底中國和台灣或者國外的優秀的程式設計師的比例到底是多少?台灣我不知道,中國 100 個程式設計師裡有幾個是優秀的呢?

我根本算不上,從上面的表現就足以說明一切了!是 1 個?5 個?10 個?50 個?這個數字我不敢亂猜,恐遭網友一頓痛罵,那麼我們國內有多少人學習計算機呢?拿我們學校來說,計算機 97 級 4 個班,98 級 5 個班,99 級 10 個班,2000 級 17 個班,人多了,老師怎麼辦?我們學校的做法是讓研究生上課,然後呢?補考一抓一大把,大把大把的補考費落入了學校的口袋,還說現在的學生素質低!

真是好笑,我都不知道學校這麼做是為了什麼,為國內培養大量的程式設計師嗎?學生們能真正學到計算機知識嗎?好了,我敢講,在我們學校學習程式設計學生和優秀程式設計師(注意我指的是優秀,只會編幾個糟爛程式的人算不上)的比例應該是 100:0.1。

在這種比例下雖然我們中國學習程式設計的人鋪天蓋地,但是想想有多少個人能真正為中國軟件業發展作出貢獻,有多少人能真正寫出優秀的程式名揚海外!

我從學習程式設計以來,不管是自學還是老師指導,從來都是解決問題就好,編出程式來就行,我的疑惑是:我們有真正的強調過程式的效率,程式的質量嗎?我們有仔細分析過我們寫的東西,看看有沒有可以改進的地方,看看有沒有簡單的方法來達到同樣的目的呢?

我捫心自問,我發現,我從來沒有對我寫出來的程式進行過優化,最多就是進行詳細的測試,然後 Debug,但是這就足夠了嗎?

這些天我偶爾發現我曾經寫過的一個遊戲,那是一年前我剛加入 www.vcroad.net 做為其中一員時候,感覺應該拿點東西出來,然後花了一個星期的時間寫出來的!

程式不算複雜,但是用到了不少數據結構的東西,也用到了一些精彩的算法,加上 windows 的界面和遊戲的可玩性,寫完後受到了不少好評,我當時真的很佩服自己!

但是現在看呢:沒有一句註釋,好多醜陋的函數名,比如:void chushihua(),好多沒有必要的變數,可以用簡單語句完成工作的我使用華麗的算法,大量使用全局變數…

說不好聽的話,六百多行的程式除了能運行之外就是一陀屎!

如果一年前我能聽到一些反面意見的話,大概我能早一點覺悟,但是自從原代碼在網站發佈以來聽到的都是讚美之詞,沒有一個人向我提出程式改進的意見,這又說明了一個什麼問題呢?很值得思考啊!

還有一個疑惑是:我們說的和做的真的一樣嗎?

我在學校的時候曾經受學院指派承辦過一個計算機大賽,請了一個老師出決賽的題目,主要是一些算法題目,這個老師可能是我上大學以來唯一敬佩的老師了,從程式調試到打分,對於每個程式都仔細分析其時間效率和空間效率,然後綜合打分,四十個人的卷子,老師從下午三點一直調試到晚上十點,在有些寫的精彩的語句後還加上批注。

我真是高興很遇到這樣的老師並且和他做深入的交流,但在事後,卻發生了一件不愉快的事,在比賽中獲得第二名的學生找到我,說他程式全部調試成功應該給他滿分,並且應該得第一,我說不過他,最後調出了他的原程式和第一名的原程式對比,不錯,兩個程式都運行的很好,這時,那個同學開口了:「我的程式寫的十分簡捷明瞭,僅僅數行就完成了題目要求,而他的卻寫了一大堆,為什麼給他的分多過給我的分。」

我當時很是氣憤,如果不是老師負責的話,那麼現在第一名和第二名的位置真的要互調了,拜託,不是程式的行數越少程式的質量就越高,我記得我跟他大談這方面的道理,最後說服他了!

哈哈,但是我,只能說說而已,我不知道還有多少人一樣,說起來頭頭是道,但心裡卻壓根就從未重視過它!

3.我打算做的

其實那天我想到的遠不止上面那麼多,但是我不想再說了,因為我猜想看這篇文章的網友大概都有一肚子的感想,一肚子的抱怨,借用這篇文章發洩可不是我想達到的目的,在上面我把自己罵的一文不值也不是妄自菲薄,但是在某些方面我真的做錯了,或者說是偏離了正確方向,現在是矯正方向和重整旗鼓的時候了,就像我前面說過的,我相信中國有世界上最好的程式設計師,我也相信我的水準不會一直保持現狀,我現在就收拾起牢騷真正的實幹起來!

真的很巧,就寫到這裡的時候我在網上偶爾發現了這篇手冊,我不知道這暗示著什麼,但是我想如果我照下面這個基本原則一直踏實做下去,我一定會實現我的理想 – 一名優秀的軟件設計師!

(下面這些文字不是我的原創,是我偶爾在網上發現的,我真的很幸運能看到這些,這篇文章也隨著下面的文字而結束,我真心的希望您能從這篇文章中得到啟發,這篇文章歡迎大家隨意轉載,您可以不寫作者是誰,但是請您寫上 ww.vcroad.net 原創,謝謝您的支持)

作者:金蝶中間件公司 CTO 袁紅崗
不知不覺做軟件已經做了十年,有成功的喜悅,也有失敗的痛苦,但總不敢稱自己是高手,因為和我心目中真正的高手們比起來,還差的太遠。世界上並沒有成為高手的捷徑,但一些基本原則是可以遵循的。

1.紮實的基礎

數據結構、離散數學、編譯原理,這些是所有計算機科學的基礎,如果不掌握他們,很難寫出高水準的程式。據我的觀察,學計算機專業的人比學其他專業的人更能寫出高質量的軟件。程式人人都會寫,但當你發現寫到一定程度很難再提高的時候,就應該想想是不是要回過頭來學學這些最基本的理論。不要一開始就去學 OOP,即使你再精通 OOP,遇到一些基本算法的時候可能也會束手無策。

2.豐富的想像力

不要拘泥於固定的思維方式,遇到問題的時候要多想幾種解決問題的方案,試試別人從沒想過的方法。豐富的想像力是建立在豐富的知識的基礎上,除計算機以外,多涉獵其他的學科,比如天文、物理、數學等等。另外,多看科幻電影也是一個很好的途徑。

3.最簡單的是最好的

這也許是所有科學都遵循的一條準則,如此複雜的質能互換原理在愛因斯坦眼裡不過是一個簡單得不能再簡單的公式:E=mc2。簡單的方法更容易被人理解,更容易實現,也更容易維護。遇到問題時要優先考慮最簡單的方案,只有簡單方案不能滿足要求時再考慮複雜的方案。

4.不鑽牛角尖

當你遇到障礙的時候,不妨暫時遠離電腦,看看窗外的風景,聽聽輕音樂,和朋友聊聊天。當我遇到難題的時候會去玩遊戲,而且是那種極暴力的打鬥類遊戲,當負責遊戲的那部分大腦細胞極度亢奮的時候,負責程式設計的那部分大腦細胞就得到了充分的休息。當重新開始工作的時候,我會發現那些難題現在竟然可以迎刃而解。

5.對答案的渴求

人類自然科學的發展史就是一個渴求得到答案的過程,即使只能知道答案的一小部分也值得我們去付出。只要你堅定信念,一定要找到問題的答案,你才會付出精力去探索,即使最後沒有得到答案,在過程中你也會學到很多東西。

6.多與別人交流

三人行必有我師,也許在一次和別人不經意的談話中,就可以迸出靈感的火花。多上上網,看看別人對同一問題的看法,會給你很大的啟發。

7.良好的程式設計風格

注意養成良好的習慣,代碼的縮進編排,變數的命名規則要始終保持一致。大家都知道如何排除代碼中錯誤,卻往往忽視了對註釋的排錯。註釋是程式的一個重要組成部分,它可以使你的代碼更容易理解,而如果代碼已經清楚地表達了你的思想,就不必再加註釋了,如果註釋和代碼不一致,那就更加糟糕。

8.韌性和毅力

這也許是「高手」和一般程式設計師最大的區別。A good programming is 99 weat and 1 ffee。高手們並不是天才,他們是在無數個日日夜夜中磨練出來的。成功能給我們帶來無比的喜悅,但過程卻是無比的枯燥乏味。你不妨做個測試,找個10000以內的素數表,把它們全都抄下來,然後再檢查三遍,如果能夠不間斷地完成這一工作,你就可以滿足這一條。

2012年3月22日 星期四

[Android] Intro

#01, Android 4.0v could support Screen-Captured?!

2012年3月16日 星期五

[Linux] USB Microscope

Target: Visuallizer device/accessory

Chinese keywords#01: "USB 顯微鏡"

Keywords#01, "USB Microscope Linux"

Keywords#02, "USB Web cam Linux"

Keywords#03, "USB PC cam Linux"


#01,
Linux Drivers for the Veho VMS-001 USB Microscope..


#02,
Sonix Technology Co., Ltd.

http://www.sonix.com.tw/


#03,

Genesys Inc.


#0x,

(To be updated then..)