星期二, 3月 13, 2007

[talk] 加入Python星球的好朋友又增加了!

對岸愛好Python的朋友黄毅的博客白菜也於今日加入了我們Python星球, 從今天開始也可以看到他發表的Python文章了, 歡迎歡迎!

只要對Python有興趣的朋友, 我們都希望能夠有這緣份跟您結交,這裡的大家都對Python非常的熱情,只要您有寫blog,我們就想看到您的文章能在星球上出現,所以尤其千萬不要害怕自己的blog文章不夠多不夠精之類的問題,因為大家身處的環境不同,即使您覺得極簡單不值一提的事情,對於另外一位朋友卻可能就是非常新鮮的事.我們這些朋友也分別都從大家星球上的文章獲得了不少資訊跟進步,所以千萬不要吝於來信加入,Python星球不論新來後到,一直都歡迎對Python愛好的朋友加入.

而兩岸能有越來越多的朋友參與討論Python互相切磋進步實在是一件值得高興的事, 除了星球之外 http://wiki.python.org.tw/PotResources 的wiki上也有列出不少資源可以利用. 如果各位還有什麼建議也請不吝提出.

ps: 一併回覆前面有位廈門匿名的讀者在評論中提到是否兩岸有屏蔽的問題, 請不用疑慮, 實在是剛好星球放置的主機昨日有流量異常的狀況發生主機不大穩定, 今天已經修復並且由管理者yungyuc在密切調查中了, 應該不是什麼太大的問題, 請大家放心.

星期一, 3月 12, 2007

[talk] 有朋自遠方來,不亦樂乎

gasolin 的熱情邀約之下,
對岸也非常愛好Python的朋友 limodou 即日起加入了我們的Python星球,
很感謝網路無遠弗屆的力量,
讓無論身處世界各地所有愛好Python的華人朋友,
都能夠藉由Python星球來互相交流跟進步.

希望有更多的朋友不論是身處大江南北,
只要是喜愛Python,
都能不吝來信加入我們Python星球,
讓所有只要愛好Python的朋友,
只要訂閱一個Python星球的RSS/ATOM Feed,
就能同步接收到最新的Python中文消息跟知識.

如果您有認識愛好Python的朋友, 也請不吝邀請他來參與我們.


[tip] 使用Emacs透過gmail SMTP server 寄信.

網路上有不少使用emacs透過gmail收發信的文章,
不過這篇Bill Clementson發表的vm跟emacs的使用方法可以說解釋的最為清楚.
http://bc.tech.coop/blog/061023.html
如果你有完全使用emacs收發信的需求, 可以參考這篇.
如果你跟我一樣, 其實只需要使用emacs寄信, 你可以接下去繼續看.

話說我習慣了emacs的編輯方式之後,
自然會想利用emacs透過gmail來幫我作簡單的信件功能.
由於收信比較沒有打字的需求,
其實直接用firefox瀏覽就可以了.
(對了 最近發現這個conkeror http://conkeror.mozdev.org/ 真是個好東西,
這個相當於firefox+emacs的plugin裝在筆記型電腦上 會很快就讓你忘了為什麼操作瀏覽器還需要滑鼠.)

所以其實呢,
我也不必像上述的網頁中的說明特地去多裝一個vm來收信.
只要用emacs內建的mail功能就好了.

而這個設定其實是相當簡單的.
只要在你的.emacs上加入這段:


;; ***** setup email sending names*****
(setq user-full-name "username")
(setq user-mail-address "username@gmail.com")
;; Configure outbound mail (SMTP)
(setq smtpmail-starttls-credentials '(("smtp.gmail.com" 587 nil nil))
smtpmail-smtp-server "smtp.gmail.com"
smtpmail-default-smtp-server "smtp.gmail.com"
send-mail-function 'smtpmail-send-it
message-send-mail-function 'smtpmail-send-it
smtpmail-smtp-service 587
smtpmail-auth-credentials '(("smtp.gmail.com"
587
"username@gmail.com"
nil)))

只要把上面例子的3個username替換成你的gmail帳號名字就好了.

加了幾行設定之後,以後你只要M-x mail 就可以透過emacs舒舒服服的寫信,
C-c C-c 就送出囉.
也不必裝什麼postfix還是exim,sendmail的,
emacs會透過gmail的SMTP來替你送信.
所以寄出的信件也能自動備份在你的gmail帳號裡.
這所有的一切都讓emacs跟gmail幫你搞定. 真的是很方便喔. :)

其實關於emacs我還有很多可以說的,
看一下我的.emacs.d大小:

localhost tim # du -sh .emacs.d
21M .emacs.d

就知道我真的有很多東西想說啊,

不過這篇只能算是個備忘記事,
就等有機會再慢慢講好了,,,

星期日, 3月 11, 2007

可憐的Javascript妹妹啊... 我來聲援妳了~~

""" 不要相信任何失去熱情的人跟你說程式語言不重要,
程式語言只是工具... 不要為了程式語言而戰...
那些人都已經失去戰場跟舞台, 早已不在第一線上了...
遺棄舞台的人, 舞台也終將遺棄他."""

-- by 戰の使徒 使徒提姆


網路上的資訊經常錯誤百出,
老實說我已經見怪不怪了,
由於我很懶惰而且還有其他想作的事情要作,
所以通常我都是扮演跳過之後順便恭維兩句:
"您真內行..." 等等無恥獻媚的鄉愿之徒.

不過阿西摩這篇標題跟文章都讓我看起來就像是
""" Javascript鳥腳本語言 才不是 太陽微電子工業語言 aka. Java宇宙大無敵語言"""
可以說統合了一般非javascript工程師對Javascript天大的誤解之集精華大成.
由於這種百年難得一見的落井下石機會實在難得,
所以基於Python傳教士捨己為人路見不平拔刀相助的仁人理念,
不得不好好的落井下石一番.

雖然說我們Python星球跟Ruby Perl幫的仁人善士早已把這篇批鬥的體無完膚,
卻遲遲不見追Javascript妹幫的js仔出來踢館,
基於前人造出井就是要拿來落井下石的偉大抱負,
我發現我還是得站出來為javascript妹辯護兩句.

我們先來看看阿西摩同學怎麼說的, 阿西摩先引用了wikipedia,


JavaScript並非Java
JavaScript是由網景通訊公司(Netscape)最初在它的Navigator 2.0產品上設計並實現的
,原名LiveScript,除了句法上有一些相似之處以及都能夠提供網頁中的可執行內容以外,
JavaScript和Java是完全不相干的。

JavaScript並不簡單
實際上儘管JavaScript是作為一種給非程式設計師提供的腳本語言而不是給程式設計師提供
的程式語言來推廣和宣傳的,但是 JavaScript是一門具有非常豐富特性的程式語言,和其他所有
的語言一樣複雜或者更複雜,你需要對JavaScript有紮實的理解才能用 JavaScript執行比較複雜
的任務。

原文出處: Wikipedia - JavaScript


然後得到了一個精彩的結論: """所以阿西摩要大喊 JavaScript ≠ Java ,更重要的原因是 JavaScript "充其量""不過是"一種 Script language,中文翻譯為[腳本語言]"""

各位, Wikipedia寫了老大的字:

"但是 JavaScript是一門具有非常豐富特性的程式語言,和其他所有的語言一樣複雜或者更複雜,你需要對JavaScript有紮實的理解才能用 JavaScript執行比較複雜的任務。" ,

這麼清楚的解釋,
阿西摩同學卻得到了"充其量"跟"不過是"這種不能算結論的結論.
我不禁苦嘆: "教育",您怎麼了? Wikipedia是這樣引用的嗎?
那我下次引用漢摩拉比法典說Java充其量是巴比倫人不用的語言好了. :P

再來阿西摩同學又引用了Wikipedia,
得到了一個有趣的結論: Java屬於工業編程語言.
這點各大中文部落格一兩個月前都已經戰到出火了,
當然我也不得不順便在此宣布Python是帥哥正妹跟華夏無敵高手才會用的語言.

好了, 看了這麼一堆狗屁的東西,相信大家一定都頭暈了。好吧,使徒提姆現在就用自己的解釋來說 JavaScript ≠ Java ... 我讀起來阿西摩大概就是這麼說的.

好了, 基本的狗屁都過去了, 來看看太陽微電子學派的六大錯誤論點吧:

1. 阿西摩:"""JavaScript 只要有一個網頁跟有支援 JavaScript 的瀏覽器才可以執行."""

喔喔... 是這樣喔...沒看過SpiderMonkey也看過Rhino吧?
Rhino還是用太陽微電子語言寫的呢.

接下來阿西摩同學還說了(至少我讀起來是這樣)
"""只要程式內沒有使用什麼特殊平台的 library ... (跨平台) ... 都不會有太大的問題"""

這句話要好好練習練習, 升官發財就靠這句了.

2. 阿西摩:"""最原始的 JavaScript 能操作跟執行的範圍相當有限,比方說,你如果要讀取本機端的檔案,比就必須搭配 JavaScript extension 還有 ActiveX 之類的附註程式才有可能達稱。而 Java 可以輕鬆的使用 Java 原本的 package 去讀取檔案,更改檔案。"""

拿木瓜比菜瓜... 不如說Java還有咖啡可以喝好了... 照樣造句也可以來一句:
"Java要搭配Java程式庫跟瀏覽器的plugin才能XX OO YY,能操作跟執行的範圍相當有限"

看官, 了解了嗎, 欲加之罪何患無詞? :P

3. 阿西摩:"""而比起 JavaScript,Java語言,有自己的標準,架構,平台,而且複雜度高上太多太多了,所能應用的範圍更是會把 JavaScript 巴到連渣都不剩!"""

是是是... 阿西摩說的好... Javascript渣都不見了... Java還剩很多... (渣?...)

Javascript標準,架構,平台樣樣不缺, 至於語言的特性跟範圍,

Joel Spolsky去年發表了一篇"""Can Your Programming Language Do This?""",裡面的例子就是採用Javascript, 順便又替早就人人喊打的java又多踢了兩腳.

是的, 妳還可以仔細閱讀...

"JavaScript:
The World's Most Misunderstood Programming Language"


The JavaScript knowledge gap

稍微多瞭解一下知識.

不過說到要比複雜度, 不知道Levels of JavaScript Knowledge您是第幾層?

"""I would even go so far as to say that the fact that Java is not hard enough is a feature, not a bug, but it does have this one problem.""" Joel Spolsky這麼說.

但是隱藏在這後面, 最可怕的媚俗誤解並不是上面我提的這些, 
是居然用語言的複雜度來論斷一個語言.
也就是說一個語言只要搞得很複雜然後說自己很嚴謹就突然變的了不起了起來.
當年C++派人士這樣對待Java先鋒們(我是很敬佩這群先鋒的, 至少人家敢挑戰權威)
現在他們的徒子徒孫好的不學又學到這招打壓的威權思想,
不知道該作何感想. 只能說歷史一直重演.
不如所有人都去學機器語言算了. 反正一切都是0跟1嗎. :P

4. 阿西摩:"""JavaScript 是一種非常不嚴謹的腳本語言。在 JavaScript 裡面,變數全部都用 var 宣告,如果你這樣在 Java 裡面寫程式,我跟你保證,Java compiler 會不斷的,一直的給你[舉紅牌]!"""

非常明顯的錯誤加上完全莫名其妙的結論跟推理過程.
阿西摩說: "在 JavaScript 裡面,變數全部都用 var 宣告"...
這完全是錯誤的資訊,
var不是一種變數的宣告,
var是表示這個變數是local variable, 是一種scope的概念.
不論有沒有var都是個變數, var只是一個scope修飾子,
而javascript的variable scoping rule是implicit global scope,
講的這樣囉哩囉唆, 還看起來太專業了所以妳不知道嗎?
喔 那JavaScript 是一種非常不嚴謹的腳本語言到底是怎麼得來的結論?
要戰動態型別嗎? 那我看這篇文章可以自動加個八千行了, 別了吧...XD

阿西摩:"""如果你這樣在 Java 裡面寫程式,我跟你保證,Java compiler 會不斷的,一直的給你[舉紅牌]!"""

喔如果妳在javascript裡寫java樣子的程式, java script debugger也會不斷的給妳舉紅牌 還按到妳手酸為止耶...

嚴謹不是java能規定的. 嚴謹主要還是來自於Programmer的撰寫習慣跟對程式碼的尊重. Period.

5. 阿西摩:"""我可以用 Java 語言,在 Java Server Page (JSP)上動態產生 JavaScript 語言,並且執行,而你想要用 JavaScript 去寫 Java語言!? 嗯,還是不要沒事找自己麻煩的好!"""

降子啊... 我又想照樣造句了耶, Javascript還可以動態產生Javascript呢... 妳如果想用java語言去產生java語言,, 恩... 還是不要沒事找自己麻煩的好...

反正這種句子隨便怎麼造再給個論斷 聽起來都言之成理,

還不過就是市場機制驅使不少人有了一種java的優越感罷了.

錢跟價值突然就等價了起來.

javascript的原罪就在於太簡單就能學,

一堆人隨便剪剪貼貼就以為會了,

加上不長進的公司又沒啥高深的需求,

當然領的錢就少.

不過放心吧,

照ajax被一群工程師惡搞的趨勢來看,

搞不好以後會變的很難又亂七八糟的.

(當然啦 還是會有一股清流的... 不過清流一般來說都只能在山裡隱居 沒辦法成為主流的)

反正就暫時隨便阿西摩說吧, 搞不好哪天就會突然為了錢想學個什麼ajax起來,

到時搞不好javascript又什麼都好了... XD

6. 阿西摩:"""總之,JavaScript ≠ Java 你是要我說多少次才會聽懂啦!"""

我聽懂了... 可是我覺得錯誤百出ㄟ... XD

再來呢, 阿西摩同學又示範了Helloworld這個艱難的程式用兩個語言撰寫之後,

又發現自己的Java專業被人家當作"Javascript"這種"""垃圾"""看待...

各位... 到底是誰得了便宜還賣乖? 寫兩個helloworld就得出了後面這個結論,

"""因為 Java 背後的專業性,應用範圍,
絕對不是 JavaScript 那種 SCRIPT 語言可以比較的!"""

公理自在人心,
妳覺得, 被人以錯誤的理由跟藉口(其實只是不滿Javascript跟Java名字像而已,就像路上遇到一個跟你撞衫的傢伙不爽就砍他兩刀)打了一巴掌又踢了一腳, 是不是不值得生氣?

我充分能理解阿西摩這篇文章那幾十篇留言的心情,
不理解這種心情的人想必是還沒瞭解被他人輕視的感覺的,
想當年, 我也被論文口試的教授說:"為什麼用這種全天下只有妳會的語言(python)
為什麼不用Matlab?"
我也只是乖乖的摸著鼻子而已.
出了社會有時使用Python也常被冷嘲熱諷,
所以為了真正的程式之道忍辱負重還要被踢上兩腳. 其實我已經習慣了.

但是各位, 我為Javascript妹妹抱不平啊.......!!!
(我這個人, 看到正妹就是心地好+憐香惜玉...XD)

不過阿西摩妳也不用氣餒,
阿西摩的文章也沒有說自己的文章是什麼阿西摩十誡,
頂多只是宣導了錯誤的東西罷了,
所以雖然阿西摩的文章錯誤百出,
雖然我講的話向來很直,
但是文章是文章, 人是人,
文章即使再怎麼差勁, 人是會進步的,
俗話說的好, 不打不相識,
相信經過眾人的洗鍊之後, 還是會有所成長的!

希望阿西摩以後能發表值得嘉獎的文章,
這樣我也不用花一兩個小時來打一篇廢話這麼多,又不怎麼中肯
還把我整年戰文的Quota都用完的文章了.

ps: 各位居然能撐到這邊看到這裡的看官,
這篇主要還是屬於麻辣Humor類,
也就是消遣人當娛樂的類型,
看過吳X憲的節目吧?,
如果有人因為我的狗屁廢話生氣上火了那就不好了,
因為我還是會繼續消遣下去的 .

請仔細看我的右下方特別聲明喔, 我是自High派的. XD

ps2:

Javascript妹妹, 我這麼熱情的聲援妳, 請妳愛我吧!! (趁亂告白篇)

阿阿不行不行, 我已經有Python了, 雖然難過, 我們的相遇實在是個錯誤, 還是分手吧... XD

星期六, 3月 10, 2007

你今天FizzBuzz了嗎?

FizzBuzz的問題由來已久, 基本上"應該"很簡單,
而且你"應該"不需要知道這問題還有個名字叫FizzBuzz:

Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”.

不過這篇由tickletux發表的個人牢騷像野火一般燒遍了國外的programmer blog,讓FizzBuzz聲名大噪了一番,
那篇講的主要其實也只是在抱怨他找的Programmer人選連解決像FizzBuzz的簡單問題都沒辦法,
不過這抱怨也激盪了出不少網路上最不缺的戰火話題跟創意,
以至於目前不少blog將FizzBuzz議題發表視為一種時尚.
(比如本blog接下來要做的事 :P)

基於傳教士的天性, 及追隨時尚盲從潮流的一種特殊快感,
篤信寫Python得永生的我也不得不特地趕上風潮:


def fizzbuzz(n,x):
"""tim like buzz, you like tim, so you get my dear john letter"""
if n == 100: return x + "Buzz"
elif not n % 15 : x += "FizzBuzz"
elif not n % 5 : x += "Buzz"
elif not n % 3 : x += "Fizz"
else: x += str(n)
return fizzbuzz(n+1,x)

print fizzbuzz(1,"")


嗯嗯 我的版本有沒有一種"為賦新詞強遞迴"的感覺? XD

還沒有嗎? 那是因為我寫的爛的緣故, 那後面這篇

"Ruby interpreting Prolog' interpreting Lisp interpreting Lisp solving FizzBuzz"

你就不得不"欣賞欣賞"了 :P

好好一個FizzBuzz又被他老兄離題到這種程度...

這又再度證明了一件我長久以來悟出比"FizzBuzz實驗"更加有說服力的結論:

"Programmer永遠能在極端無用的事物上才華洋溢"

(只是隨口說說啦... 如果有對結論已經認真起來的同學請仔細閱讀本blog右下角特別聲明 XD
好了好了 我啥都沒說 沒事多喝水多喝水.....orz)

星期日, 3月 04, 2007

[公告] Official Python Planet@Taiwan 正式開始運作!

各位愛好python的朋友大家好,

目前http://planet.python.org.tw 經過一陣子的測試,
運作狀況良好, 已經正式上線了.

yungyuc的熱情感召之下,
目前由小弟tim我來維護planet.python.org.tw的大小事項,
往後有任何planet相關的問題或建議,
歡迎來信planet#at#python.org.tw或在freenode irc上的#python.tw詢問.

歡迎大家吸收更多愛好Python的朋友進入我們POT眾溫暖的小星球!

星期四, 3月 01, 2007

stupidity driven testing

"""I don’t do test driven development. I do stupidity driven testing... I wait until I do something stupid, and then write tests to avoid doing it again.

— Titus Brown"""


Python有很多testing的工具,
包括內建的unittest/doctest,
3rd party的py.test/nose,
web application也可用twill,Selenium等特殊工具.
django目前的svn也有內建testing工具.
所以其實工具並不是什麼大問題.反而真正的重點是:

何時要testing? 要testing到什麼程度?

我在kalug有一次介紹python模組的時候有講過py.test,
曾聽過snowwolf在kalug介紹GUI testing(JUnit and Swing testing)
我也用過很pythonic的doctest,nose, 也用過django的testing模組(with unittest),
但是儘管對於工具本身並不陌生,
卻對於所謂的test-driven development這個概念還是覺得過於理想化,
因為能做的testing永遠覺得不夠, 到底一個項目要testing多少個Case?
到底要testing到何種程度才算完整才算足夠?
如果什麼都測我要什麼時候才開始真的寫code跟除錯?

Titus Brown在pycon2007的一語驚醒我這個夢中人:

古語有云: 知錯能改 善莫大焉!

一旦你coding時犯了一次錯,就把他寫成一個testing case!

testing不是要讓你不犯錯, 而是要避免你一錯再錯!