聚會時間公告: 11月份聚會為11月15號星期六下午兩點在MocaMona / 講者:shawn Topic: Hello BIOS: EFI, an opensource firmware framework

六月 8, 2008

Kevinwatt’s blog
Kevinwatt
Kevinwatt's Blog is about »
» Haskell in 5 steps

最近在看象棋的對戰系統, 所以就稍微看了一下functional programming.
然後找到haskell, 查了一下才發現原來就是tim之前介紹過的. 真是有趣的東西.

我練習程式時會有順手翻譯入門文件的習慣… 所以下面是翻的.

翻一翻也順便送一份到Haskell的wiki上.

—-
Haskell入門的5個步驟

Haskell 是一個純粹的函式編程语言。本頁將幫助你快速的入門。

1. 安裝Haskell

跟多數語言一樣, Haskell有兩種執行方法: 編譯跟直譯.
直譯式系統可以給你一行命令列(Command line), 讓你直接的進行實驗或評估.

GHC Compiler and interpreter (GHCi)
最多人用, 也是最有未來性的系統
Hugs Interpreter only
移植性嘉, 而且比GHC小的多.

GHC跟Hugs都可以在{ 某大廠作業系統 }上作業, Hugs有最佳的平台整合.
除此之外, GHC是最多實際用來開發與維護的. 這兩套軟體無異是適合
新手或老手的選擇.

2. 開始使用Haskell

開啟一個終端機. 如果你已經安裝了GHC, 直接在命令列上輸入ghci
(GHC直譯器的名子)
如果你安裝的是Hugs, 輸入 hugs

kevin@lls:~$ ghci
GHCi, version 6.8.2: http://www.haskell.org/ghc/ :? for help
Loading package base … linking … done.
Prelude>

當你出現提示符號, 那表示Haskell系統已經在準備你的輸入了.

3. 撰寫你的第一個Haskell程式

如果你已經學過其他程式了. 你的第一個程式大概是”Hello, world!”.
讓我們也這樣搞吧.

Prelude> “Hello, World!”
“Hello, World!”

Haskell系統評估為一個字串(string), 接著列出(printed)結果.
或著我們可以用另一種方法將它直接列印到標準輸出上.

Prelude> putStrLn “Hello World”
Hello World

使用Haskell的編譯器, 像GHC. 你可以編譯程式碼讓程式獨立執行.
建立一個hello.hs, 內容為:

main = putStrLn “Hello, World!”
然後用下列命令編譯他:

$ ghc -o hello hello.hs

接著你就得到一個可執行的執行檔了.
( Unix系統為./hello, hello.exe 則為{ 某大廠作業系統 } )

kevin@lls:~/Haskell$ ./hello
Hello, World!

4 Haskell的計算

來搞些有趣的吧. 在Haskell, 你的第一個真正的程式是乘階的function.
所以現在讓我們回到直譯器, 接著輸入:

Prelude> let fac n = if n == 0 then 1 else n * fac (n-1)

這一行定義了一個新的function, 名子叫fac. 將接收一個整數以供乘階運算.
我們可以輸入參數執行fac:

Prelude> fac 42
1405006117752879898543142606244511569936384000000000

需要注意的是如果你使用的是Hugs, 你將需要從檔案中載入定義的fac, fac.hs.
內容為:

fac n = if n == 0 then 1 else n * fac (n-1)

然後用Hugs執行他, 如下(在GHCi也能這樣做)

Hugs:

Hugs.Base> :load fac.hs
Main> fac 42
1405006117752879898543142606244511569936384000000000

GHCi:

Prelude> :load fac.hs
[1 of 1] Compiling Main ( fac.hs, interpreted )
Ok, modules loaded: Main.
*Main> fac 42
1405006117752879898543142606244511569936384000000000

我們也可以編譯這個程式, 產生一個獨立的執行檔. 在fac.hs裡可以這樣寫.
(這裡換了一個比較優雅的寫法, 只是為了好玩.)

fac 0 = 1
fac n = n * fac (n-1)

main = print (fac 42)

現在可以編譯並執行它

kevin@lls:~/Haskell$ ghc -o fac fac.hs
kevin@lls:~/Haskell$ ./fac
1405006117752879898543142606244511569936384000000000

幹的好!

5. 接著該往哪走

有很多很好的Haskell教學資料跟書本. 這裡有一些我們推薦的.

教學:

Haskell in 10 minutes
Yet Another Haskell Tutorial (English)
A Gentle Introduction to Haskell (English, French PDF)

完整的列表, 參考跟教學:

Books and tutorials

加入社群:
跟別的Haskell社群連絡:

Haskell-Cafe mailing list
IRC channel

十月 14, 2007

Kevinwatt’s blog
Kevinwatt
Kevinwatt's Blog is about »
» PyZenity

看到了Yuren介紹的zenity 就想起第一次用Python 寫 PyGTK 時的麻煩…
其實跟其他的圖形介面程式一樣, 得宣告的東西真是不少…

記得當時是寫一個MP3 Player…

anyway. 當Yuren在kalug上demo從Python裡呼叫zenity時, 我就在想如果有個command module應該會好很多.
果然這種好事輪不到我們自己動手做, Python上早就有現成的module可以用了…

PyZenity

操作如下:

kevin@lls:~/python/PyZenity-0.1.2$ python
Python 2.4.4 (#2, Aug 16 2007, 02:03:40)
[GCC 4.1.3 20070812 (prerelease) (Debian 4.1.2-15)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import PyZenity
>>> PyZenity.GetDate()
datetime.date(7, 10, 16)
>>> PyZenity.GetDate(’a')
>>> PyZenity.GetDate(’選取一個日期’)
datetime.date(7, 10, 17)

九月 1, 2007

Kevinwatt’s blog
Kevinwatt
Kevinwatt's Blog is about »
» Python 3k

kevin@lls:~/python3k/bin$ ./python3.0
Python 3.0a1 (py3k, Sep 2 2007, 01:25:30)
[GCC 4.1.3 20070812 (prerelease) (Debian 4.1.2-15)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> def 中文(x):
… print(x)

>>> 中文(’中文輸出’)
中文輸出
>>> def 中文合併(甲,乙):
… print (甲+乙)

>>> 中文合併(’有沒有’,'這麼炫啊’)
有沒有這麼炫啊
>>> 甲=’有沒有這麼炫啊’
>>> 列印=print
>>> 列印(甲)
有沒有這麼炫啊


玩一玩就囧了………….覺得程式這樣不會比較好寫吧.

py3k還帶來幾個比較討厭的問題.
1/2->0.5
1//2 -> 0
這個改變意義何在實在是……… 是叫我把所有的code來”溫故知新”嗎?

另外 .has_key取消了, 只能用”in”.
xrange() 由於效能好, 之前是從頭用到尾. 現在也要被廢掉了.

五月 31, 2007

Kevinwatt’s blog
Kevinwatt
Kevinwatt's Blog is about »
» Python的cPickle.

最近在做系統的效能調整, 發現. Python的cPickle真是慢. (但比Pickle快一千倍)
問了一下Google找到了有protocol可以設.

a=一千萬筆的dict value.

cPickle.dumps(a,protocol=0) 耗時 9.1160299778
cPickle.dumps(a,protocol=1) 耗時 4.43732500076
cPickle.dumps(a,protocol=2) 耗時 3.21005797386

loads的耗時跟dumps差不多.
測了兩三次.
可以得出 “protocol=1的話loads比較快, protocol=2的話dumps比較快.” 這樣的結果…

cPickle.loads by protocol 0 耗時 8.96681404114
cPickle.loads by protocol 1 耗時 4.52117705345
cPickle.loads by protocol 2 耗時 4.61613297462