2008年12月20日

時間管理

筆記 Randy Pausch 生前關於時間管理的演講

這場演講包含的內容頗廣泛,從各式輔助工具到如何分派作業給別人,並分享一些教授自身的經驗。將近 90 分鐘的影片,值得一看。

「30 天後重新檢視時間日誌,並問問自己:『我改變了什麼?』如果我沒有改變任何事物,那至少我們共同渡過愉快的一小時。如果你改變了事物,你會有更多時間陪伴心愛的人。」

  • Remember that time is money. --Ben Franklin
  • 許多人都善於管理金錢,但卻忽略了如何管理時間。僅記金錢可以再賺,但時間一去便不復返。把時間當成錢來管理,並問問自己:我的一小時值多少錢?
  • 人生苦短,做自己覺得有樂趣的事。
  • Being successful doesn't make you manage your time well. Managing your time well makes you successful.
  • 時間規劃應該做長遠、系統的改變。
  • Do the right thing > Doing things right
  • 問問自己:為啥我要做這個?目標是啥?如果我不去做呢?
  • 將事情依照重要與否、急迫與否做出四個組合,則重要的事總是優先於不重要的事,即便期限未至也是。挪出時間提早將「重要但不急迫的事」做好,可以避免它晉級成「重要且急迫」。
  • Doing it at the last minute is very expansive.
  • 訂出 fake deadline
  • Scheduling: You don't find time for important things, you make it!
  • Make time by electing not to do something else. ( Opportunity cost )
  • 捨棄沒有價值的事。值得就是值得,不值得就是不值得。要懂得說「」!
  • 列出「100 things to do in my life!」。然後當我在做清單上沒列出的事時,我會覺得......
  • Failing to plan is planning to fail.
  • 無論計劃會如何改變,總是得先有一個計劃
  • 訂出短 / 中 / 長期目標。
  • 列出 To do list,並依優先順序排列。將事項細分成更小的事並逐項完成。總是先做最困難的事。
  • If you can dream it, you can do it. --Walt Disney
  • 善用狀態最好、最有創造力的時段做重要的事,並用低潮做瑣事。
  • 迴避、限制干擾的頻率和長度。( 這點在 Peopleware 講了不少 )
  • 做事應注重效益:也許不是最高效率,但有最好的結果。Work fewer hours, get more done.
  • 迴避 Parkinson's Law ( Work expands so as to fill the time available for its completion. )
  • 做好 Time Journal,並時常更新它。用它來紀錄時間到底花到哪裡去了,並且改善。
  • 經驗是無價的。錯誤的決策讓我們得到經驗,因而在未來做出正確的決策。
  • 用 fake class 填補空堂,在圖書館與書獨處。
  • Kill your TV.
  • 會議開始前必先給出 agenda。結束後花個一分鐘紀錄所得到的結論與結果。
  • 單身會浪費時間,因為行為無需對其他人負責。如果揮霍會影響其他人的生活,就會更加注意克制自身。
  • 可能的話,把金錢換成時間,因為時間永遠不夠。
  • 最重要的事:睡、吃、運動。尤其是:如果沒睡好,啥事都做不好。You always have time to sleep.
  • 如果沒時間把事情做好,也沒時間把事情做壞。
  • 尋求 Work-Life Balance
  • Time is all we have.

單身會浪費時間,嗯。

題外話,教授在投影片中放了一張南瓜燈的照片,圖案很是眼熟。後來終於想到這頗類似 amaroK 的 icon......

有空再修「人生的最後一堂課」......

2008年12月3日

[讀書筆記] Python 核心編程 (Ch13~14)

第 13 章物件導向程式設計 / 第 14 章執行環境 ( 講如何調用 & 終止程序 )

本書的 Part I: Core Python 就到此為止了;接下來的 Chapter 15 ~ 23 被歸為 Part II: Advanced Topics,不一定會繼續寫筆記 =3=

Chapter 13: Object-Oriented Programming

  • types 和 classes 被統一了。
  • object 是 mother of all classes。宣告時至少繼承自 object 的為 new-style class,否則為 classic class。
  • class 的宣告與定義沒有區別。
  • 對 instance 做 assignment 會增加 reference count
  • class method 定義時需要的 self 參數,同 C++ 的 this,是為了識別呼叫的 instance。
  • __init__() 為 constructor,應回傳 None。__del__() 為通常無需去碰它的 destructor
  • 子類重寫 __init__() 後就不會自動調用父類的了。需顯式調用 parent.__init__(self,...) 並顯式傳遞 self 參數 ( 因為不是透過 instance 調用,interpreter 無法自動給出 method 所需的 self )。__del__() 亦同。
  • 基本上,class attribute 都是 public
  • class 定義中出現的 variable assignment 產生 class attribute (static variable)
  • 可為個別 instance 添加 attribute,尤以 __init__() 中設定 self.attribute 最為常見。
  • 同名時會優先存取 instance attribute,然後才是 class attribute
  • dir(obj) 傳回 list,列出 obj 的所有 attribute 及 method。help(obj) 也可列出這些資料。
  • 特殊的 class attribute:__name__ class name string、__doc__ documentation string、__bases__ 列出 tuple of direct parents、__dict__ 屬性的 {name:value}、__module__ 定義所在處。instance attribute:__class__ type,避免顯式給出名稱。
  • documentation string 不會被繼承。
  • 繼承時以 DFS 搜尋 indirect base classes 的集合。
  • 管理 instance count 的好方法是用 static member
  • binding:bound method 需有 class instance 才能被呼叫。想呼叫 unbound method 必需言明 class name 並手動傳入 self
  • class 中定義的 function 若不帶 self 參數,即為 static method 或 class method。用 @staticmethod 修飾為 static method;用 @classmethod 並傳入標示 class 的變數 ( 通常為 cls ),為 class method。
  • 可由多個 parent classes 繼承 attribute 和 method
  • 若 C 繼承 P,super(C, self).foo() 等同於 P.foo(self),可避免顯式給出 parent name
  • 繼承後,__init__() 若沒被覆寫就會自動調用 parent class 的;覆寫後則不會。
  • 想從 built-in immutable type 繼承時,constructor 用 class method __new__(cls,...)
  • Table 13.4 列出一大票可供自訂的 special methods
  • 多重繼承時的 method resolution order:由左至右 BFS。class attribute __mro__ 給出這個次序。
  • BIFs:issubclass(sub, sup)、isinstance(inst, cls)、has/get/set/delattr(inst, string)、dir()、super()、vars()
  • 可在定義時用 __repr__ = __str__ 這樣設定 reference alias
  • 相較於 addition operation 傳回新的物件,像 += 這樣的 in-place operation 需傳回 self。
  • attribute 加前綴 _ 可防止 from module import * 這樣導入屬性。前綴 __ 可防止繼承階層中的名稱衝突。
  • Delegation:增刪修改原有物件的功能。藉由覆寫 __getattr()__ 實現。
  • Section 13.16: Advanced Features of New-Style Classes。嗯,真的很 advanced。
  • class attribute __slots__ 限制了 instances 能存取的屬性,主要目的是節約記憶體。
  • Descriptors 有 3 個 special method 做為 descriptor protocol:__get__()、__set__()、__delete__()。激晦澀,讀不通...... =3=
  • 還有啥 metaclass 的,一樣難懂......

Chapter 14: Execution Environment

  • BIFUDFBIM 都有許多內建的 attribute。
  • 定義 class 時若實作了 __call__(),就可以對 instance 做 () 呼叫。
  • compile(str, file, type) 將 str 以 type 類型編譯。編譯後的 object 可用 exec 或 eval() 跑。先 compile 可避免重覆解讀字串。
  • exec obj、eval(obj) 以 Python interpreter 的角度對待 obj。另有 execfile(filename)
  • input(str) 等價於 eval(raw_input(str))
  • Section 14.5 講述 os module 中一大票用來跑程序的函式。
  • sys.exit(status=0) 丟出 SystemExit 這個 ( 唯一不被當成錯誤的 ) 異常,表明退出 python 的意願。

2008年11月29日

[讀書筆記] Python 核心編程 (Ch11~12)

第 11 章的 functional programming 算是比較特別的。下面以 functor 代稱 function object。

Chapter 11: Functions and Functional Programming

  • 函式無需宣告,定義時即宣告。開始執行函式時需已有定義。
  • 可用 default arguments、可做 recursion、可 nesting
  • functor 可以:供調用、做為函式參數、存入容器、被 assign ( by reference )。
  • documentation string:定義的開端的 unassigned string
  • function 若沒有給定 return value,就會隱式回傳 None
  • return 多個值時,就是把值塞在 tuple 裡回傳。
  • 可用 type() 來模擬靜態型別語言的 function overload
  • 用 keyword arguments 就可不按參數順序出牌。但還是需排在 positional arguments 後面。
  • 有 default argument 的 parameter 必須列在參數列尾端。
  • 在函式定義完成、有了 functor 之後,可以用 . 增加 function attribute
  • function / method decorators:以 functor 為參數及回傳值的 function。可用來修改被修飾的函式。用法:
    @deco1(args)
    @deco2
    def func(): pass

    等同於 func = deco1(args)(deco2(func))
  • Grouped variable-length arguments 的定義及呼叫語法:
    func(positional_args, keyword_args, *tuple_grp_args, **dict_grp_args)
    其中 informal nonkeyword argument 全被塞進 tuple,informal keyword argument 全被塞進 dictionary。
  • anonymous function:lambda [arg1[,arg2...]]: expr。回傳一個 functor。缺點係它是個 one-liner......。想完成更多事,可用它跑 tuple of functions。
  • functional programming BIFs:
    map(func, seq) 傳回 list of func(seq[N])
    map(func, seq1[,seq2...]) 傳回 list of tuples(func(seq1[N]), func(seq2[N]),...)
    reduce(func, seq[,init]) 以雙參數的 func 求出 ...func(func(func(init, seq[0]), seq[1]), seq[2])... 的結果值。
  • currying 泛化而來的 partial function application,可由 functools module 的 partial 創建。partial(func, args) 傳回 func(args, ...) 這樣已固定某些參數的偏特化 functor。
  • variable scope 的規則:對 identifier name 的搜尋由 local scope 到 global scope。
  • 以 global 修飾變數,可引用已命名的 global variable。在 Python 3.0 的 nonlocal 出現前,對於 outer scope variable 只能取值而沒辦法賦值 ( assignment 會產生出新的 local variable )。
  • closures:「只使用到自身及 outer functions 的變數們、而未用 global variable」的 inner function。據說用途強大廣泛......
  • 關於 generator:PEP 255 & PEP 342。含有 yield 的 function 便是 generator function。呼叫它可返回 generator object 。
  • 可對 generator object 調用 next() 傳回 yield、send() 塞給 yield、close()。next() 失敗時丟出 StopIteration 異常。

Chapter 12: Modules

  • import module [as alias] 之後使用 alias.name 會指涉到 module 內的本尊。
  • from module import name 讓之後使用 name 時不必再加前綴 module. 修飾。name 進入本區 namespace,只會被修改到副本而不會影響原 module 內的。
  • module 僅在第一次被導入時,被加載並執行
  • import 時會依 sys.path 給的 path list 尋找並導入第一個找到的。導入的 module 的作用域同 import 所在處。
  • sys.modules 傳回已導入的 {ModuleName:path} dictionary
  • 3 個 namespaces:built-ins、global 以及隨著函式調用而不斷變化的 local
  • BIFS:globals() / locals() 回傳該域內所有名稱及其值的字典。reload(module) 可重新載入並執行 module。

2008年11月28日

[讀書筆記] Python 核心編程 (Ch8~10)

第 8 章分支與迴圈 / 第 9 章檔案與 I/O / 第 10 章錯誤與異常。

一路看下來,Python 確實是個進化中的語言;新的特性不斷導入,舊的特性與過時語法慢慢淡出,一代後浪推前浪......

Chapter 8: Conditionals and Loops

  • if、while、break、continue 都沒啥特別的 =3=
  • 用 dictionary 查詢會比一狗票 elif 的效率還好。
  • C/C++ 的三元運算子 C? T: F 的 Python 寫法是 T if C else F
  • 強大的 for 可以捅 iterable object 並自動調用 next()、處理 StopIteration 異常。搭配 range(start, end, step) 服用也不錯。對於巨大的迭代範圍,xrange() 可以迴避 range() 產生完整 list 的開銷。
  • pass 用來表示 No OPeration。
  • else 還可用來搭配 for、while 做 post-processing:如果迴圈正常完成而非被 break 掉,就跑進 else。
  • 對於許多型別,Python 都會自動迭代它。例如 for eachLine in File、for eachKey in Dict 等。底下運作的 iterator,factory function 為 iter()。
  • 迭代過程中,別改變迭代對象的內容。
  • List comprehensions,來自 Haskell 的激強大工具。結合了 map()、lambda 與 filter(),省心至極。
  • Generator expression 與 list comps 類似,返回 generator 供每次計算後將條目 yield 出來。Lazy evaluation 讓它迴避了 list comps 需產生所有物件的記憶體消耗。
  • 所以,當只需迭代一次時用 generator expr;需迭代多次或是想使用 result list 的話就用 list comp。對於小型、中型的資料量,兩者的效率差異不大。

Chapter 9: Files and Input/Output

  • 抽象的 file-like object:用通用接口完成資料結構的 I/O。例如讀寫檔案、打開 URL 並讀取頁面等。
  • 用 open(path, mode) 或 file(path, mode) 都可開啟文件。開啟模式同 C 的 fopen:r 讀、w 寫、+ 讀寫、a 追加寫入、b 二進位、U 讀取時用 UNS。預設值 r。
  • readline() 讀取單行及 \n,readlines() 讀取剩餘所有行。writelines() 不會自動加入 \n
  • os module 中的有用屬性:linesep 換行符、sep 路徑分隔符、pathsep 路徑們的分隔符、curdir 目前目錄、pardir 父目錄。當然還有很多很好很強大的功能......
  • print 不加逗號的話,就會自動附加換行符。
  • 程式一執行就可以動用的三個文件:stdin、stdout、stderr。可從 sys module 取用之。
  • 同 C,sys.argv[0] 為程式名稱,len(sys.argv) 即 argc。協助處理參數列的 module 有 getopt 和 optparse。
  • 協助永久儲存數據 ( 字串、Python 物件 )的 module:marshal、pickle、shelve 等。

Chapter 10: Errors and Exceptions

  • try-except:try 區塊出錯時直接跳下來從 except 找對應的異常類別並執行;之後接續 except 後面的語句執行。tuple of exceptions 可對應多個異常。額外參數為 exception class 的 instance,可能提供更詳細的錯誤報告。
  • 所有異常皆繼承自 BaseException,可對應所有類型的異常。除去 KeyboardInterrupt 及 SystemExit 的異常類別為 Exception。
  • try-except-else:同迴圈,try 沒有發生異常則進入 else。
  • finally:無論 try 是否發生 / 捕捉到異常,皆會執行 ( 在 try 裡 return 掉也是 )。try-finally 在 try 出異常時直接跳進 finally,執行完再丟出異常。若由 finally 本身發出異常或 return、break、continue 則原先的異常會蒸發。
  • try-(try-except-else-finally)-except......
  • with 只能與支援 context management protocol 的 object 協同工作。with open('file', 'r') as f: 開啟檔案為 f 並在區塊中產生異常時依然能自動關閉檔案。
  • Section 10.4.2 講 Context Management Protocol。有需要時再回頭翻 =3=
  • raise ExClass, args:觸發一個異常,為 ExClass 的 instance,以及塞進去的參數。
  • assert expr[,args] 可假想為 raise-if-not,丟出 AssertionError 異常。
  • 內建的 standard exceptions 在程式開始前就被載入了。
  • Section 10.9 講述如何繼承並創建自訂的異常,有個百餘行的範例碼 =.=
  • sys.exc_info() 回傳 (exc_type, exc_value, exc_traceback)
  • Exception handling 使程式更正確、成熟、穩固。
  • 提供異常處理機制,是為了讓程式員易於追蹤潛在錯誤,並做出相應處理。盡量克制 except,不要 try 一大塊程式碼並 except Exception 然後直接忽略掉。

2008年11月26日

[讀書筆記] Python 核心編程 (Ch6~7)

繼續洗版。

這兩章講 sequences 和容器,可以體會到 dynamic typing 的靈活之處。最複雜的部份是深淺拷貝的差異...... 可能得食個幾次虧才能記住吧 =.=

Chapter 6: Sequences

  • sequences ( 序列型別 string、list、tuple ) 的一大特色是 iterable。
  • 對 sequence 取元素 s[-i] 會得到 s[len(s)-i]
  • slice 是常用的操作,如 s[start:end:-1] 可得 [start, end) 範圍逆序後的結果。slice 時不會受到 index 的上下限限制。
  • 一些可對 iterable object 操作的 Built-in functions:
    enumerate(iter) 傳回迭代對象的 (index, item) tuple。
    zip([item1, item2..., itemN]) 傳回 list of tuples,其中第 n 個 tuple 為 itemX[n] 的集合。
    其它還有像 len(iter)、cmp(iter1, iter2)、max(iter)、min(iter)、sum(iter)、sorted(iter)、reversed(iter) 等。
  • 對於 container type 可用 in / not in 測試元素是否存在。字串也可用這種方式檢測子字串存在性。

Strings

  • immutable
  • Python 沒有單一字元型別,只有字串。字串不是容器。
  • 標示字串的雙引號和單引號沒有區別,成對出現就好。
  • str.join() 的效率較 + 好 ( 由於 immutable,對於 + 產生的新字串,需要另外分配新的記憶體容納 )。
  • 格式化輸出,支援 C 的 printf 的各式參數 ( %0d %3.2f %x %e %E 等 )。可用 value tuple 或 dict{ID:value} 兩種型式。更精細的控制,見書中 Section 6.4。
  • print(r'\n') 得 '\\n'。這特性拿來配 regex 可有效降低抓狂機率。
  • regex 引擎支援 ur'unicode\n' 這樣的字串。( 一起使用時,u 必須出現在 r 前面。)
  • 三引號表示的字串可以包含換行、tab 等字元。
  • 字串不會自動包含 C 風格的 NULL,而且 Python 也不依靠 NULL 判定結尾。計算字串長度時可省心一些。
  • input = raw_input(s) 印出 s 並將用戶輸入結果存入 input。丟一個在腳本結尾可避免執行完直接蒸發。
  • chr(65) 和 ord('a') 分別傳回 'A' 和 97。還有 unichr() 可返回 UCS2/4 的結果。
  • Section 6.6 是一大票 String built-in methods,有需要再回去翻吧 =3=。這些 BIMs 可和 unicode 合作愉快。要注意字串是 immutable 的就是。
  • 由於 immutable,字串做 assignment 時,lvalue 只能是整個 str object 而不能是 str 的一部份。rvalue 則無此限制。
  • 確保字串能正確處理 Unicode 所需做的事:字串以 u 為前綴、以 unicode() 代替 str()、在即將寫出 / 剛讀入時才 encode / decode。

Lists

  • mutable container
  • += 和 list.extend() 有同樣功效。
  • + 的兩個運算元必需有一樣的型別。list.append() 和 list.extend() 可以避開限制。
  • list.sort() 排序並返回 None。sorted(List) 返回排完序的列表並且不會改變 List。
  • Section 6.15 給了以 list 實作 stack 和 queue 的例子,其中用到 dictionary 搞 function pointer...... 激方便呢 (||。3。)

Tuples

  • immutable container。好處?當成參數丟進 function 時可以保證不被改變。
  • 大多數操作和 list 一樣。
  • 創建單元素的 tuple 時,要加個逗號,以避免小括號被當成語意邏輯分割用。
  • tuple 包含的元素保有自己的 immutability。例如 tuple 中包含的 list 元素還是可以被修改。

Shallow & Deep Copies

  • shallow copy:創建新的 object,但是其內容還是原物件的 reference。
  • deep copy 就真的會摳一份新的、獨立的 reference 過去。
  • 對於 mutable type ( list、dictionary... ),assignment operation 會做 shallow copy ( 以 rvalue 的 reference 賦予 lvalue )。
  • 這表示當我在盒子上亂塗鴉的話,你也衰洨......
  • immutable type 就沒有這種困擾了。我會去撿個畫好的新盒子回來,你的還是亮白如新。
  • copy module 的 copy.copy() 做 shallow copy;copy.deepcopy() 做 deep copy。
  • 由某方面來說,mutable type 可以當做共享的 C++ static variable
  • 這特性實在令人激困惑......

Chapter 7: Mapping and Set Types

Dictionaries

  • mutable container。實現 key → value 的映射。
  • key 的排列是無序的,且 key 需為 hashable value ( hash(obj) 返回整數而非 TypeError )。Python 由這個 hash value 決定映射的目標位址。
  • 數值、字串等 immutable type 皆 hashable。tuple 若只含 immutable 元素則也為 hashable。
  • 重複賦值給 key 會把先前映射的 value 刷新。
  • BIMs:keys()、values()、傳回 list of tuple(key, value) 的 items(),搭配 for 頗好使。還有 update(dict2)、pop(key)、copy() 等。copy() 傳回 shallow copy,比用 factory function 複製的效率高。sorted(dict) 傳回對 key 排過序的字典。

Sets

  • set elements 為無序的 hashable value。
  • 有 mutable 的 set 與 immutable 的 frozenset 兩種。
  • set 只能由 factory function set()frozenset() 產生。
  • 運算子:< 子集、> 超集、| 聯集、& 交集、-- 差集、^ 互斥。產生的集合類型與運算子左邊的集合相同。
  • BIMs 與 dictionary 類似。另外有 discard(obj)、add(obj) 等。

2008年11月24日

[讀書筆記] Python 核心編程 (Ch1~5)

洗版文,第二版「Core Python Programming」及其簡中版「Python 核心編程」的讀書筆記流水帳。總算定下心開始啃蛇文本瞭......

本書主要是針對 Python 2.5 所寫;至於 Python 3.0 的新特性,可以看 Python 官方的 What’s New In Python 3.0

以下不保證筆記內容的正確性。

前四章算是 Introduction,快速掃過一些 Python 的特色與特性。第五章來插花的,數值類型,沒啥難度。

那麼,開始洗版吧 (>ω<)♪♪

Chapter 1 ~ 4

  • Case sensitive
  • Python Enhancement Proposal 8 是重要的 Python code 風格指南。
  • import this 可印出 The Zen of Python
  • Everything in Python is an object.
  • variable 在第一次被 assign 時自動宣告,且為 dynamic typing。
  • 基本運算元和 C 類似,支援 bitwise operator 和 +=、*= 等,但不支援 ++、- - ( 會以 unary operator 處理 )。
  • 可以使用 2 < 3 < 4 != 5 這樣的述句,由多個隱式 and 連接。
  • andor 有 short-circuit evaluation。
  • 連續程式碼換行的方法:backslash \、連續字串之間 ( 自動串接 )、三引號的跨行字串、小中大括號之間 () [] {}。
  • 基本的分支:if elif else。想用其它語言 switch 那樣的功能,可以把測試值們塞進 list 並用 for 跑它。
  • 基本的迴圈:for while
  • 基本的資料結構:immutable 的 str 和 tuple,以及 mutable 的 list 和 dict。slice 所產生副本其 mutability 也與原先的相同。
  • immutable 是為了效率考量。數字型別也是 immutable 的,i = i + 1 會令 i 指向另一個 object。
  • Python 3.0 的 string 將會全部 unicode 化。
  • 函式定義時可給 default arguments。沒有給定 return value 的函式,會自動返回 None。
  • assignment statement 不會傳回值,但可以 chain。
  • variable 的 reference count 降到 0 或發生無意義的循環引用時,會被 garbage collector 清掉。
  • 增加變數引用計數的方式如:賦值、做為函式參數、容器元素等。trace / debug 時也會增加 object 的引用數。
  • 減少引用計數:離開 scope、原變量名被賦予其它 reference、del statement、從容器 remove 等。
  • 在 Python 的 object 模型中,每個 object 都像一個盒子,引用計數如上面貼的標籤。標籤被撕光的無主物,就會被丟進拉雞車。
  • module 被 import 時,__name__ 的值為 module name。若 module 被直接執行,__name__ 為 "__main__"。
  • 對於 mutable 型別,function argument 以 pass by reference 方式傳遞。immutable type 則是 pass by value。
  • 用 local variable 取代 module variable 除了方便性考量以外,還可以提升性能。
  • print 會自動換行。加個逗號可以扼止這項悲劇。一次丟一堆參數給 print 會在之間自動加入空格。更精細的排版可以用 "%s%d%f" % (str, 10, 3.0) 這樣的方式控制。
  • Python 3.0 中的 print 會全面改為 function 型式以提供更多功能。
  • None、值為 0 的數字、empty container 的 boolean value 都是 False (0)。
  • type 是 Python 所有 class 的 metaclass。
  • == 測試 value equality,而 is 則測試 memorywise equality。
    a is b 等同於 id(a) == id(b)
    例如:print(True is 1) 得到 False
    print(True == 1) 得到 True
    可能的話使用 is 可迴避求值過程的開銷。
  • repr(obj) 取得 obj 的代表字串,適合給 python 看。
    str(obj) 取得 obj 的可讀性較佳的字串,適合給人看 ( print 對物件調用這個函式 )。
    通常 obj == eval(repr(obj)) 是成立的。
  • 有事沒事可以 help(obj) 一下。

Chapter 5: Numbers

  • 數值型別包括整數 int、無限位長整數 long、雙精度 float、複數 complex。摻在一起運算時會自動晉級。
  • int 和 long 未來將合併,不必再煩惱其區別和整數溢位瞭。
  • decimal module 中的 Decimal 可用來表示精確的十進制小數,以免被 IEEE 754 痛整。
  • 目前以運算符 / 對 int 做除法會執行 floor division;未來將改為 real quotient。
  • 運算符 // 總是做 floor division ( 包括對 float 型別也是 )。

2008年10月25日

Python 的 self

初學 Python,有個令我很頭大的地方是 self 對 class variable 的修飾。要加不加 self,傻傻分不清楚......。原先習慣了 C++ 中的 variable scope,換個語言就躺平瞭。所幸有股溝的協助,把股來的結果整理一下;依我目前為止的理解,下面是 C++ 和 Python 2.5 等價的程式碼:

C++

int globalVar = 5;

class Class
{
public:
    Class() { attribute = 30; }
    void func() {
        int localVar = 20;
        localVar = attribute;
    }

    int attribute;
    static int staticVar;
};

int Class::staticVar = 10;

Python

globalVar = 5

class Class:
    staticVar = 10

    def __init__(self):
        self.attribute = 30
    
    def func(self):
        localVar = 20
        localVar = self.attribute

Class.staticVar = 10

總之,變數若加了 self,就成了 instance 的 attribute,可以在同一個 instance 內跨 method 存取。如果沒加的話,就被限制在定義時的 scope 裡。

至於 member function 的 self argument,和 C++ 的 this 一樣,是用來區別呼叫的 instatnce 的。

寫了一天的 Python,有股衝動想從 C/C++ 跳槽,永世不再返......

2008年10月9日

ArchLinux + LXDE 安裝筆記

( 更新:這篇文章已經有點久遠了...... 新文在這裡。)

如題,以 FTP 方式安裝 ArchLinux 2008.06 的筆記。選擇之桌面環境為 LXDE

前言

主要參照的文章為 LinuxToy 的 打造完美的 Linux 桌面 — Arch Linux 2007.08-2 及回應們。該篇文章在對岸引領了一陣 ArchLinux 風潮,我也在閱讀後從 Ubuntu 叛逃了。2008.06 和 2007.08-2 相比,較大的區別在於 LiveCD 及以 UUID 識別硬體;不過安裝過程還是沒啥兩樣。

Desktop environment 方面,原本係嚴重期待 kdemod 4.1 的,可惜灌上後...... 終究係隆重地失望瞭。一些小小的 glitch 實在頗煩人,而且手感莫名其妙地不太順。最重要的是 KDE 貌似抗當能力差,一不小心讓 X Window freeze 掉的話,重開後很可能整個 KDE 設定就都蒸發瞭......。我在某次 X 躺掉後則是 KDM 抓無鍵盤,進都不給進。沒有能力和興致解決,盛怒之下便轉換跑道,改用 LXDE。

那麼,就開始正題吧!


正題

硬體:AthlonXP 2500+ / 512MB / GF4 Ti4200 / 固定 IP 連網
硬碟分區:/    XFS 10~15GB
/swap swap 和主記憶體同樣大
/boot ReiserFS 128MB, bootable
/home XFS 吃掉剩下的空間

開始安裝基本系統

LiveCD 開機後,以 root 登入並輸入 /arch/setup 開始安裝。core 方式是直接用光碟內的檔案安裝;但如果網路順暢的話,沒理由不選擇 FTP 方式:可直接用上最新的套件,並預先設定好網路。
固定 IP 連網的話需要 IP address、netmask、broadcast、gateway、DNS 這些資訊。( 用 core 的話,反而會在最後設定網路時少問 DNS,得自己編輯 /etc/resolv.conf 加入。)


硬碟分區與掛載

可參考上面給的主系統分區方式。( Ext3、XFS、JFS、ReiserFS ( MurderFS ) 等檔案系統有啥優劣之處,食飽撐著的話可以去股溝看看。) 其餘多的分區可掛在 /media/sda1 等掛載點。

如果從 Windows 陣營轉來,可一併在這裡掛載 FAT32 分區 ( vfat 格式 )。NTFS 磁區則別急著掛,不然 /etc/fstab 會掛掉。


安裝 base 套件

就裝預設的那些,直接下一步吧。Pacman mirror server 可以多試一些,挑個速度夠快的,不然下載會等到吐血 ( 安裝中絕大多數時間都係耗在等待下載...... )。套件下載時提示過程在 tty5,可按 Alt + F5 切過去看進度,結束後 Alt + F1 切回,開始安裝......


系統設定

作業系統安裝完成後,編輯各項系統設定。首先 /etc/rc.conf

LOCALE 的 en_US.utf8 改成 en_US.UTF-8。這個區域設定會影響 terminal 的語系,個人是覺得終端若用 zh_TW 看起來違和感極重,所以繼續用英文。
TIMEZONE="Asia/Taipei"
MODULES 那段加入 loop
HOSTNAME="localhost"
DAEMONS=(syslog-ng network netfs crond @hal @alsa)

/etc/locale.gen 部份,主要是開 zh_TW.UTF-8 UTF-8zh_TW BIG5 吧,我還開了 zh_CN 和 ja_JP,不過不曉得會有啥差別。

最後,別忘了設定 root 密碼。


安裝系統導引

將 GRUB 裝在 /dev/sda。瀏覽 /boot/grub/menu.lst 時可以把 timeout 調低一點。

基本系統完工,reboot 後以 root 登入繼續。

前置作業

# pacman -Syu
# pacman-optimize
# sync
# pacman -S dbus hal vim


新增用戶

新增一般用戶,以 amulet 為例:
# useradd -s /bin/bash -G audio,disk,log,network,storage,power,wheel,optical,dbus,hal -m amulet
# passwd amulet

建立用戶並加入一堆有的沒有的 group。有啥要另外添加的 group 可以下 # gpasswd -a amulet audio 這樣的指令。


開始堆積木

# pacman -S xorg nvidia-96xx
# xorgconfig
# nvidia-xconfig

安裝 X Window 和 nVIDIA 骨灰卡的驅動程式,並設定 X。需要有螢幕的水平同步率等資訊。

滑鼠有額外按鍵的話,參考這篇。簡單講,以上一頁 & 下一頁按鍵來說,/etc/X11/xorg.conf 的滑鼠那區大概長這樣:

    Identifier    "Mouse1"
    Driver        "mouse"
    Option        "Protocol" "ExplorerPS/2"
    Option        "Device" "/dev/input/mice"
    Option        "ZAxisMapping" "6 7"
    Option        "Buttons" "7"

並設定開機後自動執行這個腳本:
#!/bin/bash
xmodmap -e "pointer = 1 2 3 6 7 4 5"

顯卡那段,我的配置長這樣:

Section "Device"
    Identifier    "Ti4200"
    Driver        "nvidia"
    Option        "AddARGBGLXVisuals" "true"
    Option        "RenderAccel" "true"
    Option        "AllowGLXWithComposite" "true"
    Option        "AccelMethod" "exa"
    Option        "MigrationHeuristic" "greedy"
    Option        "AGPMode" "4"
    Option        "AGPFastWrite" "true"
    Option        "EnablePageFlip" "true"
    Option        "TexturedVideo" "on"
EndSection

Section "Extensions"
    Option        "Composite" "Enable"
EndSection

一些基本的系統套件......
# pacman -S alsa-utils alsa-oss acpid sudo gksu libstdc++5 ntfs-3g
# alsaconf
# alsamixer
# alsactl store

後 3 行設定 ALSA 音效驅動。Enabling sudo for Users 讓普通用戶比較方便做 root 權限的事。

ntfs-3g 則視有沒有掛載 NTFS 磁區的需求吧!輸入:
$ /bin/ls -lf /dev/disk/by-uuid
列出各個磁區的 UUID。其中 vfat 和 ntfs 格式的 UUID 長度較短。記下 UUID,編輯 /etc/fstab,依樣畫葫蘆掛上 NTFS 磁區:
UUID=XXXXXXXXXXXXXXXX /media/mountpoint ntfs-3g locale=zh_TW.UTF-8 0 0


安裝桌面環境 LXDE

# pacman -S lxde gamin numlockx
加上相依的 gtk2 等 package,共約需 115MB 的空間。
設定開機後自動以某用戶登入桌面環境,按照 Starting X as preferred user without logging in 所寫的來修改 /etc/inittab。然後編輯用戶目錄下的 ~/.xinitrc
/usr/bin/numlockx on
exec startlxde

可自動開啟 NumLock 並進入 LXDE。缺點係 X 若自動躺掉的話好似就完瞭。
進入桌面後查看耗用的記憶體,約 55 MB ( 雖然資源買來就是該被壓榨乾淨的...... )。

如果電腦有多個用戶,不希望自動登入而想使用 Desktop Manager 的話,可以安裝 slim 並加入 DAEMONS 中。


安裝輸入法

$ sudo pacman -S gcin
框架為 gcin。嘸蝦米用戶可以參考官方嘸蝦米完美安裝。設定自動執行,編輯 ~/.xprofile
export XMODIFIERS=@im=gcin
export LC_CTYPE=zh_TW.UTF-8
export QT_IM_MODULE=xim
gcin &

gcin 的 systray icon 不幸爆表的話,可以換用更小的圖示


安裝一般應用程式

到這邊,系統算是已經設定完成了。不過還得灌一堆應用程式,才足以應付日常應用。挑喜歡的安裝:
$ sudo pacman -S gvim wqy-zenhei wqy-bitmapfont ttf-inconsolata codecs xvidcore mplayer mplayer-plugin smplayer unrar zip unzip p7zip cabextract dvd+rw-tools brasero jre wine firefox flashplugin opera filezilla amsn pidgin emesene file-roller comix audacious audacious-plugins exaile quodlibet scrot gcalctool xchm

進入桌面後發現,顯示的中文字看起來相當令人髮指。沒關係,安裝文泉驛正黑體便是;再到 LXDE 調校 Appearance 的地方將 Font 改為 WenQuanYi Zen Hei。經過這些日子的發展,個人覺得文泉驛看起來已經沒有違和感了,繁簡字體都相當和諧。另一個個人偏好的是 Inconsolata,為等寬字體。基本上我的電腦就用這兩種字體了,感覺不輸其它正黑 / 雅黑之類。

MSN IM 方面,屁精升上 2.5.0 時突飛猛進,形成三巨頭 Pidgin / aMSN / emesene 鼎立的情勢。這 3 款的實作都算相當完整,status msg / offline msg / send file 應有盡有,自己挑個順手的用吧!GUI 壓縮工具,感覺最完善的只有 Gnome 的 file-roller。KDE 的 arK 用起來不是一根髮指就能帶過的......

影音方面,smplayer 搞影片算是毫無懸念瞭。至於音樂播放器的選擇相當多,像是 Audacious、amaroK、Exaile、Quod Libet、Sonata...... 族繁不及備載,自己挑吧。cue sheet,基本絕望了,直接乖乖 wine + foobar2000。

另一個方便的工具,yaourt,整合 pacman 並且可以直接從 AUR 下載腳本編譯安裝未進源的軟體。編輯 /etc/pacman.conf,加入:
[archlinuxfr]
Server = http://repo.archlinux.fr/i686

然後
$ sudo pacman -Syu
$ sudo pacman -S yaourt
$ yaourt -S pcmanx-gtk2 acroread acroread8-fonts madedit gtk-kde4-oxygen-theme q7z

安裝 PCManX、Adobe Reader、MadEdit、Oxygen theme 及 p7zip GUI frontend。

yaourt 的 frontend - tupac,新的 PKGBUILD 在這裡

比較龐大的軟體:
$ sudo pacman -S gimp openoffice-base openoffice-zh_tw
如果只需要瀏覽 doc / ppt / xls 的話,M$ 官方有 Word Viewer / Powerpoint Viewer / Excel Viewer 等工具,可以 wine 來用。

編輯 /etc/xdg/lxsession/LXDE/autostart,加入一行 @xset -b,關閉吵耳至極影響情緒十惡不赦早該做古的 speaker 機乖嗶嗶聲。如果有啥想開機後自動運行的腳本路徑 ( 例如滑鼠那個 ) 或程式,也可以加進來。另一個方法是將 .desktop 檔放到 ~/.config/autostart

最後,清空 /var/cache/pacman/pkg 下的 pacman 暫存,釋出硬碟空間:
$ sudo pacman -Scc


收工!


這樣,一個很好很強大的桌面系統就完成啦!真係可喜可賀,可口可樂!


補註

幾個連結:
解决Linux下Mplayer播放Flv不同步问题
Fonts with LCD filter enabled
Tweak Your Font Rendering for Better Appearance
Pm-utils ( 休眠 )
VirtualBox
建立一个“关闭屏幕”的启动器
winetricks
Firefox 3 擴充套件
手把手教你把Vim改装成一个IDE编程环境(图文)


KDEMOD

如果比較偏好大而全的 desktop environment,我還是推薦 kdemod,可以按照官網給的步驟安裝,並在 DAEMONS 加入 kdm。KDE3 是發展較久且相當完善、流暢的版本;KDE4 則是觀念革新的明日之星。雖然現在用起來還有些許瑕疵,不過等到更加進步之後我還是會回去試它吧。順帶一提,4 的體積相當不容小覷:kdemod4 裝起來突破 750MB,而 kdemod4-complete 更超越了 1.3GB......。至於這樣算不算太超過,見仁見智吧!

LXDE 的話,乍看之下其美工係相當令人髮指的;當初也為止裹足不前 ( 何況 kdemod3 不當掉的話確實相當好用 )。後來想想,其實目光焦點在絕大多數時間裡,都係停留在網頁或應用程式的內容,美工其實就沒那麼重要了,習慣便是。而且 LXDE 是可以套用 gtk2 佈景的,用心一下也是可以拉抬到個水平;和 Compiz Fusion 也搭配得相當好。畢竟走向不同,就其輕巧程度來說,是相當不錯的桌面環境。