HTTP Headers for Dummies
http://net.tutsplus.com/tutorials/other/http-headers-for-dummies/
當你輸入一個網址的時後, 實際會發生什麼?
http://article.yeeyan.org/view/54517/91367
2010年11月11日 星期四
2010年6月25日 星期五
Certification Resource.
CareerCert
http://www.careercert.info/
這裡有很多Cisco的官方教材文件
標籤: certification, cisco, IT挨踢
2010年5月19日 星期三
2010年3月13日 星期六
去除 Vista ipconfig 訊息中的通道介面卡
建立兩個登錄檔:
停用IPV6_Vista.reg
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters]
"DisabledComponents"=dword:000000ff
啟用IPV6_Vista .reg
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters]
"DisabledComponents"=dword:00000000
執行完「停用IPv6_Vista.reg」再重開機,就不會再出現這些煩人的東西。
2010年3月5日 星期五
讓我們看雲去
昨天下午聽了中華電信研究所的介紹,
才對這近大家很瘋的 Cloud Computing(雲端運算)有一點點概念,
看來它不是如李家同北杯,和公司一些自以很IT(挨踢)的主管所理解的那種簡單且粗淺。
談到 cloud computing 一定不脫三個核心技術:
1.GFS(Google File System),
參考文件 Google File System Paper
2.MapReduce
3.BigTable
以及上述技術實作出來的 open source project Hadoop,
其實雲端只是個應用結果,少了這三項核心技術便什麼都不是,
只能回到Client-Server 或Terminal 的年代,
今年也該花些時間了研究一下這個主題。
2010年3月4日 星期四
2010年3月2日 星期二
1000BASE-LX、1000BASE-SX、1000BASE-CX、1000BASE-T
1000BASE有四种传输介质标准:1000BASE-LX、1000BASE-SX、1000BASE-CX、1000BASE-T。 1000BASE-LX对应于802.11z标准,既可以使用单模光纤也可以使用多模光纤。1000BASE-LX所使用的光纤主要有:62.5μm多模光纤、50μm多模光纤和9μm单模光纤。其中使用多模光纤的最大传输距离为550m,使用单模光纤的最大传输距离为3千米。1000BASE-LX采用8B/10B编码方式。1000BASE-LX使用长波激光信号源,波长为1270nm-1355nm。 1000Base-LX,是定义在 IEEE 802.3z 中的针对光纤布线吉比特以太网的一个物理层规范。LX 代表长波长,与 1000Base-SX 相反,1000Base-LX 使用长波长激光(1310nm)越过多模式和单模式光纤,1000Base-SX 使用短波长激光越过多模式光纤。多模式光纤的最大距离是 550m,单模式是 5km。 1000BASE-T使用非屏蔽双绞线作为传输介质传输的最长距离是100米。1000BASE-T不支持8B/10B编码方式,而是采用更加复杂的编码方式。1000BASE-T的优点是用户可以在原来100BASE-T的基础上进行平滑升级到1000BASE-T。 |
2010年2月6日 星期六
Python: OptionParser的使用
Python 很好用的 Option module....
轉自:http://www.javaworld.com.tw
簡介:
optparse 是一個能夠讓程式設計人員輕鬆設計出簡單明瞭、易於使用、符合標準的 Unix 命令列程式的 Python 套件。開始學習 Python 之後,我常常會寫一些小程式來處理日常的工作;漸漸地,我發現無法處理參數的程式的彈性有限,於是就開始為我的程式加上解讀命令列參數的功能。在發現這個 套件之前,我總是覺得解讀命令列不難,但是要做到像標準 Unix 命令那樣完善的使用者互動和錯誤處置,可就不是一件簡單的事了!某天在 Python Library Reference 中發現這個套件,真是如獲至寶!從此不用再為解讀參數煩惱,可以更專注在解決問題上了!
如果對於 optparse 套件有興趣,想快速入門的話,可以直接看"基本使用流程"小節,然後再看後面的一些介紹與說明;當然啦!想獲得最詳細的資訊,就只有自己去看 Python Library Reference 囉~
就以下列命令來解釋一些術語,myprog 是命令的名字, $ 是命令列提示符號:
$myprog -f thefile.txt -s xyz a1 a2 a3
●argument:
使 用者在命令後面所輸入的字串。以本例來說,"-f", "thefile.txt", "-s", "xyz", "a1", "a2", "a3" 都是 argument。在 Python 中,可以使用 sys.argv[1:] 來得到命令列傳進來的 argument。為什麼是 sys.argv[1:] ,而不是 sys.argv 呢?因為命令列收到完整的參數還要加上一個命令本身的檔名,以本例來說, sys.argv 應該是:
["myprog", "-f", "thefile.txt", "-s", "xyz", "a1", "a2", "a3"]
所以如果要得到去除命令本身的檔名以後的參數列,就要靠 sys.argv[1:] 了。
●option:
一些傳遞給命令的額外 argument,以改變程式的行為。以本例來說, "-f", "-s" 就是 option。
有 幾種 option 的寫法,在 Unix 系統上的傳統寫法是 "-" 後跟著一個字母,例如 "-f", "-s";以及 "-f -s", 和 "-fs", 在 Unix 系統上都可以被接受。 GNU project 使用另一種方式,以 "--" 後面跟著一串由 "-" 分開的字串,例如 "--file-for-log"。Python 的 optparse 套件只接受以上所提的兩種 option 格式。
顧名思義, option 應該是可有可無的,即使命令中沒有任何的 option,程式也應該能夠正確地執行。如果程式需要使用者輸入某些資料才能運作,那麼也應該是使用 positional argument 才對。
●option argument:
緊 跟隨在 option 後的 argument,就是 option argument。以本例來說, "thefile.txt", "xyz" 都是 option argument。指定 option argument 有兩種寫法, "-f thefile" 和 "-fthefile", optparse 套件都接受。
option 亦可以沒有 option argument,意即 option 單獨存在。這樣的 option 通常做為旗標 (flag) 用,代表某個功能的開啟或是關閉。
●positional argument:
當一個 argument list 被解讀完後,剩下的就是 positional argument 了!以本例來說, "a1", "a2", "a3" 就是 positional argument。通常被用在"使用者必須輸入"的資訊上。
●required option:
一 個有點讓人覺得矛盾的名詞:既然是 "option" (選擇),又怎麼會是 "required" (必須)的呢? optparse 套件不對這種 option 做出任何的限制或是協助。詳情可以參閱 Python Library Reference 6.20.5 的範例程式。
基本使用流程:
》1.產生一個 optparse.OptionParser 的物件。可以在產生時將"程式的命令列說明" (usage) 做為參數,交給 OptionParser 的建構子:
from optparse import OptionParser
MSG_USAGE = "myprog[ -f
optParser = OptionParser(MSG_USAGE)
》2.呼叫 OptionParser.add_option() 加入接受的 option:
optParser.add_option("-f","--file",action = "store",type = "string",dest = "fileName")
參數 action 有許多種類,預設是 "store",所以即使省略也無妨,其它的 action 種類在下面會繼續說明。
若有一個以上的 option,重覆上述的方式加入(注意:以下省略了 action 參數):
optParser.add_option("-s","--someopt",type = "string",dest = "someopt")
》3. 呼叫 OptionParser.parse_args() 進行解讀。如果沒有傳入參數, OptionParser 預設會以 sys.argv[1:] 為對象進行解讀。OptionParser.parse_args() 會傳回一個 tuple,由 optparse.Values 和 一個 list 所組成。下例傳入一個假造的參數列:
fakeArgs = ['-f', 'thefile.txt', '-s', 'xyz', 'arg1', 'arg2', 'arge']
options, args = optParser.parse_args(fakeArgs)
print options.fileName
print options.someopt
print args
最後會得到的輸出結果:
thefile.txt
xyz
['arg1', 'arg2', 'arge']
這 是一個簡單的範例,說明了 OptionParser 的一般使用方式。透過這個例子,可以看到如果為程式加入 option, 並且在程式中取得 option argument 和 positional argument。OptionParser.parse_args() 還有許多用法,下面會說明一部份。
為程式加入 flag option:
許多的 Unix 命令擁有 "-v", "-q" 的 option,代表"提供詳細訊息"或是"不顯示訊息"。要做到這一點,只要在程式中加入下列的 option :
parser.add_option("-v", action="store_true", dest="verbose")
parser.add_option("-q", action="store_false", dest="verbose")
opts, args = parser.parse_args()
第 一個 add_option() 加入了一個 "-v" 的 option;如果命令列參數中出現了 "-v",則 opts.verbose 將會是 True;相反的,第二個 add_option() 加入了一個 "-q" option;如果命令列參數中出現了 "-q",則 opts.verbose 將會是 False,這兩者並不相悖,程式可以設計成:當收到 "-v" 時,顯示詳細訊息;當收到 "-q" 時,顯示概略訊息,或完全不顯示;當兩者都沒有收到,則顯示一般的訊息。
設定 option 的預設值:
上述的例 子都假設命令例會收到預期中的 option,那麼如果沒有 option 時,接收到的 option 值會是什麼呢?答案是 None!如果想為 option 提供預設值,只要在 OptionParser.parse_args()中指定參數 default 就行了:
parser.add_option("-v", action="store_true", dest="verbose", default = True)
parser.add_option("-q", action="store_false", dest="verbose")
opts, args = parser.parse_args()
上述的程式碼為程式加入了兩個 option,當 "-v" 沒有出現時, opts.verbose 預設值為 True;當 "-q" 被指定時, opts.verbose 被設定為 False,和上一個例子有點不同。再看下一個例子:
parser.add_option("-v", action="store_true", dest="verbose", default=False)
parser.add_option("-q", action="store_false", dest="verbose", default=True)
opts.verbose 的預設值會是什麼?答案是 True,最後一個指定到同一個目標的 option 預設值會被採用。
一般的 option 亦可加入預設值:
parser.add_option("-f", action="store", dest="fileName", default = "defaultConfig.txt")
為程式加入說明:
標準的 Unix 命令大多有著 "-h", "--help" 的 option,會將使用說明印出來。在 OptionParser.parse_args() 中指定 "help" 參數,並指定說明的字串,就可以為這個 option 加入說明了:
parser.add_option("-v",action="store_true",dest="verbose",default=False,help="make lots of noise [default]")
當程式收到 "-h" 或 "--help",交給 OptionParser 解讀時,會自動印出說明內容,而忽略其它的 argument:
usage:
options:
-h, --help show this help message and exit
-v, --verbose make lots of noise [default]
-q, --quiet be vewwy quiet (I'm hunting wabbits)
-fFILE, --file=FILE write output to FILE
-mMODE, --mode=MODE interaction mode: one of 'novice', 'intermediate'
[default], 'expert'
還 記得一開始提到交給 OptionParser 建構子的參數 MSG_USAGE 嗎? optparse 套件對 usage 訊息也提供了一些支援。在 usage 中使用 "%prog" 關鍵字, OptionParser 會自動將其代換為程式名,即 sys.args[0]:
usage = "usage: %prog [options] arg1 arg2"
如果程式名為 "myprog",則出現在 help 訊息中的 usage 就會是:
usage = "usage: myprog [options] arg1 arg2"
如果OptionParser 建構子沒有收到任何參數,則會自動產生一個 usage 訊息:
"usage: %prog [options]"
前提是程式沒有 positional argument。甭擔心 option 在 help 訊息中排列的方式, OptionParser 會搞定一切,如同前面程式所示。
替 option 分門別類:
如果能夠在 help 訊息中,將性質相近的 option 放在一起,與其它 option 明顯區別開來,相信使用者在閱讀時,就能夠很快地查到所要的資訊了。 optparse 套件提供了將 option 以 group 分開的機制:
group = OptionGroup(parser, "Dangerous Options",
"Caution: use these options at your own risk. "
"It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)
首 先產生一個 OptionGroup 物件,將 OptionParser 和 help 訊息當做參數交給建構子,然後呼叫 OptionGroup.add_option() 加入 option,最後再呼叫 OptionParser.add_option_group() 加入此 group。如此 help 訊息中的 option 就會按 group 顯示了!
usage: [options] arg1 arg2
options:
-h, --help show this help message and exit
-v, --verbose make lots of noise [default]
-q, --quiet be vewwy quiet (I'm hunting wabbits)
-fFILE, --file=FILE write output to FILE
-mMODE, --mode=MODE interaction mode: one of 'novice', 'intermediate'
[default], 'expert'
Dangerous Options:
Caution: use of these options is at your own risk. It is believed that
some of them bite.
-g Group option.
顯示程式版本:
無論是 GUI 或是 CUI 程式,使用者都會關心目前的程式版本資訊。 optparse 套件也提供了版本資訊的支援:
parser = OptionParser(usage="%prog [-f] [-q]", version="%prog 1.0")
在 OptionParser 建構時指定 version 參數,並將提供版本訊息(先前提到的 "%prot" 關鍵字亦可用在此處)。當使用者下達的命令中帶有參數 "---version" (只有 "-v" 不行)時,程式會顯示版本資訊:
$/usr/bin/foo --version
foo 1.0
指定讀入 option argument 的個數:
add_option() 有一個參數 nargs,用以指定該 option 會從命令列上讀入幾個 option argument。舉例來說,如果 add_option(..., narg = 3, ...):
$myprog --file w x y z
則 opts.file 將會是一個 tuple,內容為 ('w', 'z', 'y')。如果 option argument 個數不足,程式會回應錯誤訊息。
type of an option:
在 加入 option 時,參數 type 代表該 option 儲存 dest 的型態。支援的型態有 string, int, long, choice, float 和 complex。若要加入其它型態,請參考 Python Library Reference 6.20.5 小節,"Extending optparse"。
對於 string 型態的 option, option argument 會被直接將結果存入 dest。
對於 int, long, float 和 complex 型態, option argument 會被轉換成相對應的型別;如果轉換的過程失敗,例如原本預期收到一個 int,卻收到一個字串,程式會結束並列印錯誤訊息。
對 於 choice 型態, 在呼叫 OptionParser.add_option() 要指定一個由字串所組成的 tuple 或 list 給 choice 參數,接著 OptionParser.check_choice() 會比對傳入的 option argument 是否和 choice tuple 或 choice list 相同,若不相同則會丟出 OptionValueError。
action of an option:
在加入 option 時,參數 action 代表對 option argument 所要進行的動作。參數 action 有下列幾種:
- store : 預設的 action,將 option argument 存到指定的 dest。
- store_const : 將 dest 的值設為一個給定的常數。 make_option("-q", "--quiet", action="store_const", const=0, dest="verbose"), make_option("-v", "--verbose", action="store_const", const=1, dest="verbose"), make_option("--noisy", action="store_const", const=2, dest="verbose"), 當 "--noisy" 出現時, opts.verbose 的值將會被設定成 2。
- store_true : 將 dest 的值設定為 True。
- store_false : 將 dest 的值設定為 False。
- append : 將 option argument 增加到 dest 中,而 dest 的型態將會是 list。使用 append action 時,命令列中可以重覆出現 option 和 option argument:
$myprog -f 1 -f 2 -f 3
則 opts.optargs 將會是 ['1', '2', '3']。如果是 store action,那麼 opts.optargs 將只會是 3,因為每指定一次 option, dest 的值就一直被更新。
若呼叫 add_option() 時參數 nargs 被設定,而 action = append 時,程式可以接受下列命令列參數:
parser.add_option(dest = "optargs",action = "append",nargs = 3)
...
print opts.optargs
-----------------------------
$myprog -f 1 2 3 -f 4 5 6 -f 7 8 9
[('1', '2', '3'), ('4', '5', '6'), ('7', '8', '9')]
看出其中差異了嗎? nargs 會將 option argument 包裝成 tuple,而 append 參數會將包裝好的 tuple 再"附加"到原有的 list 中。 - count : 將 dest 的值加 1。 dest 的值會被初始會 0,該 option 每出現一次, dest 的值就增加 1。
- callback : 請參考 Python Library Reference 6.20.4。
- help : 列印 help 訊息。
- version : 列印程式版本。
錯誤處置:
如果 option 預期會收到一個 int,而使用者傳入的是 string 參數時,會發生什麼事?
optParser.add_option("-n",dest = "theNumber",type = "int")
若使用者輸入的命令是:
$ /usr/bin/foo -n abc
程式會發出錯誤訊息,並告知使用者輸入的參數有誤,並且以非零的回傳值結束:
usage: foo[ -n
foo: error: option -n: invalid integer value: 'abc'
OptionParser 的一些操作方法:
在加入 option 或解讀完參數之後,可以透過 OptionParser 的一些方法來得到一些資訊(以下的 opt_str 就是 "-f", "--file" 這些在增加 option 時所用到的參數):
- has_option(opt_str) : 檢查 OptionParser 中是否有某個 option。
- get_option(opt_str) : 取得 OptionParser 中的某個 option。
- remove_option(opt_str) : 刪除 OptionParser 中的某個 option。
當 option 發生碰撞(重覆)時:
option 以下列的方式加入時:
parser.add_option("-n", "--dry-run", ...)
...
parser.add_option("-n", "--noisy", ...)
就稱為"碰撞"。當 option 碰撞時, optparse 會丟出 OptionConflictError。程式設計師應該在設計期就解決掉這個問題,也就是說,不應該使用 try - except 來捕捉這個錯誤 - 畢竟這在設計期就可以被處理掉的。
當 OptionParser 的被繼承時,一些標準的 option 就很有可能被子類別覆蓋掉。這種情況下,可以設定 OptionParse 處置碰撞的方式:
parser.set_conflict_handler("resolve")
or
parser = OptionParser(..., conflict_handler="resolve")
都 可以讓後來加入的 option 覆蓋掉原有的 option。預設的 conflict_handler 值為 "error",也就是直接丟出 OptionConflictError。所謂覆蓋,也不是直接移除掉原有的 option,而是避開後來加入的 option:
parser = OptionParser(conflict_handler="resolve")
parser.add_option("-n", "--dry-run", ..., help="original dry-run option")
...
parser.add_option("-n", "--noisy", ..., help="be noisy")
在 help 訊息中,就會看到:
options:
--dry-run original dry-run option
...
-n, --noisy be noisy
第一個 option 的 "-n" 被刪去了。如果這時又加入一個 option,使用了 "--dry-run"做為名稱呢?那麼第一個 option 就會直接被移除,因為它已經完全被覆蓋掉了,程式將不認得它, help 訊息中也不會有它的蹤跡。
在這裡我省略了 Callback option 和 Extending optparse 兩個小節,如果有興趣,可以親閱 Python Library Reference;對於這篇文章若有疑問的,也可以先找找 Reference,也許我漏掉了也說不定。
程 式寫得愈多,愈覺得自己的渺小。這些設計精良的套件,若不是當初由許多無私的前輩們開發出來,我們又怎麼夠享受到它的便利性?以上是我參考 Python Library Reference, 6.19 optparse 介紹的內容,所寫的心得筆記。希望對這裡的 Python 同好有幫助,如果有錯誤也請多指正!
| void optparse::OptionParser::add_option | ( | std::string | shrt_flag, | |
| std::string | lng_flag, | |||
| std::string | destination, | |||
| std::string | help = "", | |||
| action_t | act = STORE, | |||
| type_t | type = STRING, | |||
| std::string | dfault = "", | |||
| std::string | allowed_values= "" | |||
| ) |
Add an option to the parser.
Parameters:
| shrt_flag | Short option name, like e.g. "-q". | |
| lng_flag | Long option name, like e.g. "--quiet" | |
| destination | Key under which the option argument is stored in the dictionary. | |
| help | Help string for generating the usage info. | |
| act | Action, one of STORE, STORE_TRUE, STORE_FALSE. | |
| type | Type info of the expected option argument. One of INT, DOUBLE, STRING, BOOL. | |
| dfault | Default value. Value stored in the dictionary if the option is not given. | |
| allowed_values | List of possible option values. A string of comma-separated allowed values. An empty string means that any value is allowed. |
2009年9月5日 星期六
Ping 好物
2009年2月24日 星期二
新玩具 - Notepad++
常常寫 code的人,大概沒有沒聽過 Ultraedit的,
這個相對於 .net studio, eclipse這些功能強大的大型IDE而言,顯得瘦小很多,
畢竟對很多人而言,寫的往往只是一些單純的且檔案不多的 program,
用那些大傢伙還真的顯得殺雞焉牛刀,
因此 Ultraedit, Ultrastudio就自然的出現在我的開發工具之列。
只是這二者雖然佔據我的硬碟空間很久,
也誕生了數以千百計的徒子徒孫,
但是它卻始終沒有正式的名份,
隨著版權要求的執行日趨嚴格,哪天硬要我給個名份還真的蠻麻煩,
今天不小心發現一個新玩具,功能、屬性及定性幾乎跟 Ultra*家族完全重曡,
而且重點是它是 freeware,而且還有一堆 plugin,
可以用 plugin的方式持續補強它的功能,這樣的設計架構相當有彈性,
它就是 --- Notepad++。
相信它有足夠的理由讓我跟 Ultra*提出分手了~
2009年1月24日 星期六
AJAX programming reference
Dynamic web programming 中,
所有 client-side的 input postback到 server-side時,都得整個web page refresh,
以往為了避免這種 postback反覆發生,
都得預先在後端用 active web language產生 javascript的 data array,
然而代價是 page initial時,預先產生的 data array會增加傳輸量與傳輸時間,
而且當中有很多資料在操作過程中根本沒有用到。
然而依 http設計的行為模式來說,它本質上就存在著以下二個問題,
- postback造成很多資料的重複傳輸,畢竟很多時候要的只是擷取後端的一部份資料,
卻無端的造成很多後端資料與 html tag的重覆傳輸
- portback後造成 page refresh,在操作行為上來說並不那麼 friendly,這一點在比較
任何 application就有很明顯的感受。
以下 study ajax 時的 reference.
- Practice AJAX slide
http://docs.google.com/Present?docid=ajj7kcj4d635_208hpgj4622
Python programming reference
用PHP寫了好長一段時間的script,
始終覺得以它做為command line環境下的script有些不適妥,
畢竟它的設計重點是 http的 active script language,
然而,一來已經有了現有的code,二來又沒有太充足的理由移植到別的語言,
但是,慢慢的開始有 threading功能的需求,且在Object Orient的model上,
PHP也不算是 native的設計,在上述二個條件的思索之下,
想起了多年前同事極力推薦的 script language - Python,
甚至是主張捨棄他熟悉的 perl,何以大師級的前輩會有這樣的想法呢?
這是個大哉問,現在還沒有能力答出個所以然來。
- Python threads - a first example
http://www.wellho.net/solutions/python-python-threads-a-first-example.html
- 撰寫 Linux 使用的 Python script
http://blog.seety.org/everydaywork/2008/4/9/1012/
- 用 Eclipse + PyDev 開發 Google App Engine 的程式
http://blog.ericsk.org/archives/889
2009年1月20日 星期二
透視BT
bt的應用在網路已經廣為流傳了好幾年,有人用它來下載mp3、影片,
我則用它來下載電子書,我推薦 http://www.mininova.org/,
當然它不僅是提供電子書的seed,也有軟體或影片可以下載,
只是看了一下多數的bt seed下載點不是英文,就是祖國同胞所提供,
繁體的似乎少之又少,難道台灣同胞這麼乖嗎?
另外讀原文書是很累人又花時間的事,下載可能花你一個小時時間,
但是讀它可能要花你一週的時間,所以在下想出一個方法,
就是到Amazon去查一下哪本書在它的領域是星等比較高的,
我就只下載這範圍內的書,自然是因為它是讀者投票選出來的,相對它的可讀性自然就比較高,
也減少選到爛書的機會,節省寶貴的休息時間。
------------------------------ (分隔線) ------------------------------
離題有點遠了。
我的重點是,bt即然通行這麼久了,只知道它是p2p的資料交換機制,
其它的就都莫宰美了,這豈是為學之道呢?
所以一定留篇google到的好文才行。
透視BT(一)─ BT的基本運作原理
透視BT(二)─網路的頻寬分享與BT的隨機過程模型
透視BT(三)─數字會說話, BT有什麼問題?
透視BT(四)─為什麼BT沒有內建搜尋功能?
2009年1月12日 星期一
Silverlight reference
- Step by step 教學
http://www.miketaulty.com/SLVideos.html
標籤: IT挨踢, programming, silverlight, study
