PageRank



轉移公告

計劃把 http://blog.hoamon.info/ 文章全部轉移至 http://www.hoamon.info/blog/ 這裡,而本 Blogger 站台的文章近 500 篇,我預計在 2014-12-31 前移轉完畢,完成後 http://blog.hoamon.info/ 將只作代轉服務,一律把舊連結如 http://blog.hoamon.info/index.html 轉成 http://www.hoamon.info/blog/index.html ,敬請舊雨新知互相走告。

新文章只發佈在 http://www.hoamon.info/blog/

何岳峰 敬上

2007年12月29日 星期六

讓 google 幫你作圖表

過去作研究時,為了要看清楚數據的結果是不是與我們所想的一樣,我們會把數值轉成圖表的方式展示,這比起看到 1,2,4.0,8,... 的數字能更快速了解答案的正確與否。

因為以前都是用 matlab 作研究,所以生圖表時,是在單機上生成一個圖檔來看,若不用 matlab 也可以,把生成的數據倒給 gnuplot 一樣可行,或者是直接用 GNU Octave 也成。

我們現在都是用 python 了,而在 python 上也有十分優秀的圖表函式庫 matplot 可以用。

只不過,現在不只是要求數學程式化,我們也要作模式商業化,一個可行的解題方式,我們要讓使用者方便使用,最簡單的方法是讓它變成網站。這時候使用 matplot 就有點麻煩了。

如果可以使用 google chart api ,就會比較輕鬆,而且流量還可以丟過 google 處理。只不過,機密的數據還是不要透過 GET 方法讓 Proxy 儲存到,這時候,還是用 matplot 吧!

打個廣告,歡迎有程式設計能力且數學(離散、管理數學、統計)底子好的人才來我們 lab 唸碩博士,我們 lab 的目標主要是用資訊技術讓工程的品質、生產力提高。考試科目有營建管理概論、工程經濟/工程統計,基本上,我在土木系的大學部也只學過營建管理概論(三學分),工程經濟/工程統計是得自己另外唸的。

2007年12月23日 星期日

美國土木工程師證照考試

美國是聯邦制,所以很多東西依州不同而有所不同。像是德州車牌是跟著車走,而俄亥俄州則是跟著人走。在土木技師牌照這邊,也是各州有所差異,但它們的考照方式卻令我十分欣賞,它避免了國內考照方式總讓錄取人流於紙上功夫的缺點。

美國的考照方式,可參考此網頁



備份網頁
最大的不同是:
  1. 要有實務經驗
  2. open book
  3. 依專長負責
1. 這點就不說了,在台灣,技師的能力不在於考取執照時所唸的書,而是事後接工程案所累積的經驗。
2. 這點相當重要,工程知識涵蓋範圍廣大,如果把時間都花在背公式及係數,那有多少時間來想這些公式的延伸應用及實務問題的解決。反正技師執業時,一定會看自己的參考書,那為什麼考試時,不等同處理呢?
3. 美國的土木技師執照多半只有一種(依州別),考試時也是營建、結構、水利…各種題目都考,所以你可能只會大地,那麼把大地題目全部答對,其他的只有小部份答對,你也是拿得到專業工程師執照,而執業時,你要為大樓建築結構圖簽章審核,也沒有人反對,只是簽章就代表負責,建築圖有問題,就是你的問題。

他山之石,可以為錯。那為什麼不作呢! 這就不是一個小土木人知道的了。

2007年12月22日 星期六

2008政黨票該怎麼投呢?

2008年的立委選舉有一點與過去不一樣,不是一階段取代二階段,而是不分區立委的席次將由另一張「政黨票」來決定,不同以往是從各政黨的區域立委得票率得之。

所以就算你所在地點的區域立委都很爛,基本上,只要你覺得台灣還有政黨是可以相信的話,一定要出來投個政黨票。

而不分區的政黨名單有 中國國民黨、民主進步黨、無黨團結聯盟、新黨、台灣團結聯盟、公民黨、紅黨、綠黨、台灣農民黨、第三社會黨、客家黨、制憲聯盟。

其中,中國國民黨、民主進步黨、無黨團結聯盟、新黨、台灣團結聯盟,這些都是比較熟為人知的政黨,我就不談了。

就剩下的 7 個,簡介如下:

公民黨:
網路上只找到這篇文章

紅黨
應該是上次反扁(貪腐)勢力的延續。

綠黨
主要訴求是環保、和平及社會正義。

台灣農民黨
爭取台灣農、林、漁、牧等四大農民階級在國會發聲,以爭取農漁民利益、促進農業發展與茁壯農漁民組織為目的而成立之階級政黨。

第三社會黨
沒看到黨綱,看網頁介紹,好像主打第三選擇,也就是不想投國/民黨的,就投他們吧!

客家黨
望文生意,一看就討厭,我不是討厭客家人,如果有個黨叫「河洛黨」、「閩南黨」,我一樣開罵,這又是在台灣族群撕裂的傷口上繼續灑鹽而已。

為弱勢族群發聲是正確的,像是以「農民」、「身心障礙者」、「窮人」為主要目標來組黨,這非常合理,因為每個人都有機會當「農民」、「身心障礙者」、「窮人」。而如果以「血統」來組黨,那我永遠沒機會了,因為我不是「客家人」(我只是「客家人」的孫女婿)。

所以,我能接受有原委會、客委會的組織來幫助弱勢族群,但我不能接受以血統來結黨這件事。

制憲聯盟
以憲法為主要目標。

就個人觀點,對「綠黨」及「台灣農民黨」比較具有認同感。還需要再認真研究一下,才能選擇。

2008總統大選及立委選舉該怎麼決定 ?

我的好朋友 change po 了一篇「受不了的 2008 總統大選」,我對這篇文章的兩個結論非常有意見,所以也提供一下我對總統及立委投票的想法。

在這次總統大選及立委選舉中,我不會再投給民進黨了(是的,2000、2004我投的都是它), 2000 年時,我想投的是連戰,但因為害怕讓宋先生異軍突起,所以,我投了第二選擇,而 2004 年,則是沒有選擇了,因為連戰和宋先生是一組的,所以,我只好再投陳水扁。

而這一次,我不會再投民進黨的原因是希望讓他們知道這 8 年,其實作的並不好。

過去 8 年,因為總統是民進黨的,立院的最大黨卻不是,所以導致行政立法效率不彰及台灣走向不明,這一點我不怪民進黨,就算他們想作事,也不一定作的好,但是「貪汙」及「枉法」就不可取了。

如果再讓謝長廷當選,我想更會「長」貪汙枉法之「昌」盛了,投「馬英九」是我給民進黨的懲罰。

那麼在立院這邊,因為考量了總統是給國民黨,也應該讓國民黨繼續掌握多數,來趕一下「行政立法效率」及「一貫台灣未來走向」,所以我也會在區域立委這邊,投給國民黨。

好了,上面講的都是不得已的選擇。而有什麼是我可以好好決定的呢? 有,在全國不分區這邊。以往的不分區,是看你所投的區域立委是那一黨的,就當作你對那一個政黨投同意票,但這一次選擇,則是明明白白的切割開來了。

攤開不分區的政黨名單: 中國國民黨、民主進步黨、無黨團結聯盟、新黨、台灣團結聯盟、公民黨、紅黨、綠黨、台灣農民黨、第三社會黨、客家黨、制憲聯盟,共有 12 個選擇,這裡是可以好好評估的地方,不用比爛了。

誠懇的呼籲大家,就算總統、區域立委選不下手,但這次可以多給新政黨一個機會,站出來投票吧!

2007年12月20日 星期四

原來這就是背包問題呀!

日前(好久前了)提了一個讀研究所時所解決的問題,那時還滿自傲的,畢竟在讀土木的同學中,還沒看到有人會解。

那是一個解決鋼筋裁切的廢料量最佳化所衍生的難題。也就是要列出一根原料鋼筋要切成工地用尺寸的組合問題,如:18公尺的鋼筋若要切成 10, 7, 5, 4, 3 公尺長的鋼筋,則有那幾種切法。

Thinker 提了一個很好的方法來計算它的組合數有多少。不過,因為我要的是有那幾種組合,所以不曉得他的方法能否套用(當然可以)。

之前,我是用 Perl 來解這個問題的,不過,程式已經找不到了,不是我沒作版本控制,那時候用的是 CVS,然而在歷經多次系統安裝, CVS 的儲存庫已經不知在那了。

所以,我用 Python 重寫這個方法。有兩種解法,第一種是用我之前的觀念來解的。第二種是昨天想的,不過,第二種卻比較沒效率。
 1 #!/usr/bin/env python
 2 # -*- coding: utf8 -*-
 3 def cut(length, k, tmp):
 4     if k == sizeslen:
 5         if length >= sizes[-1]:
 6             return
 7         else:
 8             tmps.append(tmp[:])
 9             return
10
11     comp = int(length/sizes[k])
12     for i in xrange(comp+1):
13         j = comp - i
14         tmp[k] = j
15         cut(length-sizes[k]*j, k+1, tmp[:])
16
17 from time import time
18 import sys
19 if __name__ == '__main__':
20     bar = float(sys.argv[1])
21     sizes = [float(s) for s in sys.argv[2:]]
22     sizes.sort()
23     sizes.reverse()
24     sizeslen = len(sizes)
25     tmps = []
26     tmp = [0,]*sizeslen
27     time0 = time()
28     cut(bar, 0, tmp[:])
29     print time() - time0
30     print len(tmps)

第二種:
 1 #!/usr/bin/env python
 2 # -*- coding: utf8 -*-
 3 def cut(L, x, k, tmp, num):
 4     num[0] += 1
 5     diff = L-x[0]
 6     if diff > mat[0][0]:
 7         if tmp[x[1][0]] != 0: return
 8         else: tmp[x[1][0]] = x[1][1]
 9     elif diff < mat[0][0] and diff >= 0:
10         if tmp[x[1][0]] != 0: return
11         else: tmp[x[1][0]] = x[1][1]
12         tmps.append(tmp[:])
13         return 
14     else:
15         return
16     for (i, s) in enumerate(mat[k+1:]):
17         cut(L-x[0], s, i+k+1, tmp[:], num)
18         
19 def sort_by_value(k):
20     return (k, k[0])
21
22 from time import time
23 import sys
24 if __name__ == '__main__':
25     time0 = time()
26     bar = float(sys.argv[1])
27     sizes = [float(s) for s in sys.argv[2:]]
28     lensizes = len(sizes)
29     tmps = []
30     mat = []
31     for (i, s) in enumerate(sizes):
32         comp = int(bar/s)
33         for j in xrange(1, comp+1):
34             mat.append((s*j, (i, j)))
35     mat.sort(key=sort_by_value)
36     tmp = [0, ]*lensizes
37     num = [0]
38     for (i, m) in enumerate(mat):
39         cut(bar, m, i, tmp[:], num)
40
41     print time() - time0
42     print len(tmps)
43     print num[0]

新的觀念是把需求尺寸的倍數尺寸拿來當切割尺寸。如:10公尺要給7, 5, 3, 2 來切的話,我先把需求尺寸變成 7, 10, 5, 9, 6, 3, 10, 8, 6, 4, 2 等尺寸來切,如果在切的過程,剛好又遇到擁有相同因數的尺寸則跳過,像是10公尺已經被 8 切掉了,後來又遇到 2 的話,就停止處理。

在人工演練的過程中,覺得第二種方法所跑的迴圈數比較少,然而寫成程式後,效率卻比較差,且實際的迴圈數也比較多。

== 後記 ==

這裡有最新且更有效率的解法。

2007年12月13日 星期四

各位天才們好!


經專家證實,來我 Blog 的讀者個個都是天才,口說無憑,有圖為證。

太陽底下沒啥新鮮事

昨天還很高興能想到把兩種數學模式併在一起計算,應該可以有更高的效率及最佳的解答。

結果,今天試了一天,發現了一些難點,在心灰意冷下,找了一下舊期刊,竟然發現我的想法根本不值一晒,那篇期刊還是 1997 年的,模式也定得比我好,只差在我的電腦比較棒。

本以為沒人知的絕佳妙計,沒想到,早被淘汰了。心傷呀! 這世界的人實在太多了。

2007年12月10日 星期一

「交易明日」運作模式

= 緣起 =

看到 http://nccu.swarchy.org/ 這個網站的運作方式,覺得實在是太有趣了。也興起作類似網站的作法,但目標與該網站不同。

= 新網站的目標:'''好玩'''、'''建立可賺錢模式'''、'''預測''' =

把期貨觀念應用在時事上是相當有趣的,這個應用下,可以建立一個三方(網站經營者、期貨合約建立者、使用者)都賺錢的長久運作模式,而「預測」只是網站運作的的附加產品。

= 為什麼要再建立一個與 http://nccu.swarchy.org/ 相類似的網站? =

沒有「失去」,又如何讓「得到的」是珍貴的。在「未來事件交易所」中,使用者再這麼交易,所失去的最多是時間而已,如此「不痛不癢」的懲罰,是讓使用者的決策沒有品質,所以在這樣交易環境下,得到的成交資料及預測結果其真實性有待提昇。要讓數據真實反映市場,就得讓使用者當一個理性的投資者/投機客。

而且,「未來事件交易所」的期交模式為了套用行為預測的框框所以與正常期貨交易觀念有些許不同,所以我要修正「未來事件交易所」的期交模式。

主要的修改方式是將現行的買賣權交易制度引進來,再作一點點的改變,並在商品部份更換為「政治未來事件」、「體育未來事件」、「影劇未來事件」及「其他未來事件」。

= 未來事件的新期交制度 =

新期交制度乃簡化真實社會中的期交制度,最大的差別在期貨商只從事「期貨合約的建立及結算」,並從中獲取一半的手續費,而原本為使用者下單的工作轉由期交所負責。

= 交易時段 =

即時撮合時段為台北股市有交易當天的 18:00~23:45 ,讓交易者不要太晚睡,也不要影響白天工作。其餘時段,仍可下委託單,但不進行撮合,也不提供「最佳 5 檔」資訊。
....
....
....

本文不開放回應,若要進一步閱讀或回應,請到 http://ptrac.hoamon.info/wiki/TradeTomorrow
修改帳號為 www.hoamon.info
密碼為 demo

2007年12月4日 星期二

對手滿壘,卻不能掉分的戰術


2007亞錦賽中日之戰在前六局十分精采,陽建福可媲美達比修,然而到了第七局就結束了,不過,算了,輸了,我也不會怪任何人的。

不過,我倒有一個策略,是在對手滿壘非二人出局,且己方又不能掉分的佈陣戰術想說說。

那就是讓一、三壘手趨前,大約站在一壘與本壘中間及三壘跑壘員前三步,而右外野手往前到一、二壘之間防守,二、游略往左邊防守,中左外野手略往右前方補位。如此一來,可大幅降低對方強迫取分的威脅。

當然,這種戰術是用在完全不能失分的狀態,如9局下雙方平手時,或是這次中日之戰不能再丟分的情況下。

2007年12月3日 星期一

投資不只是「錢滾錢」而已

在研究所時,想要鑽研的是財經方面的研究。不過,你知道的,結果並不是。

一直對數字很有感覺/興趣,所以當初在接觸股票時,對除息、除權、本益比、營收、融券比…等一大堆數字可是樂在其中的。不過愛鑽研不等於會賺錢,要不,唸台大電機/法律/醫科的,可是最會作股票的人。

在我賠了不少錢後,我體會到一件事:「投資不應該只是用錢滾錢的。」

從一本談期貨的書中,看到一個例子,一位大學財經教授,出了一題填空題給同學作答:

當市場趨勢(  )時,你(  )股票將可以獲利。

結果呢!大部份的學生都填了上昇/買進,只有少部份的人會填下降/賣出。這反應了大家都是習慣作多,而作多者必須買進股票,所以在投資的策略上,已經輸了一半。

而事實上,一般投資者多半也只有買進的方式才能作投資,因為他手頭是沒有股票可以放空的,於是,想要投資的人就必須在市場上挑個個股或是基金作「買進」的動作,然後給它時間,期待它上漲。因為投資者只能「買進」正確的股票,也就比較不容易獲利。

實際上,一般投資者所能作的投資,也的確只能「買進」個什麼東西,而不能靠「賣出」來賺錢。像我常常接到一些銷售儲蓄壽險、期滿領回意外險的電話,這些保險公司也把保單作得像股票一樣地賣,只是它風險低、獲利低(甚至沒獲利)。

在一個市場趨勢不明朗或是走空頭時,你應該讓自己放個假,把錢好好地存在銀行中,然後不再看股票,至少銀行利率是正值而不是負值,空手也是一種投資。

但如果我繳的學費只買了「空手也是一種投資」的觀念,那這也太貴了。
*

另外買回來的觀念是:「投資自己」 以及「除了出錢,你還得出時間」。

如果你可以一個月花三千元繳錢買基金,那當然可以花三千塊去學美語、寫程式、體操…,那為什麼不這麼作呢?因為基金會漲價,但美語不會、因為錢才有複利效應,程式沒有、因為就是要賺錢,又不是要賺體操。

所以有些人對自己不好,但每個月總可以省點錢來作「投資」別人的事,既然把「資源」放在別人身上,所以自己的工作、身體也就不期待突出表現,反正等退休,基金經理人會給你「公道」的。

但是你認為一個月存 3000 元,以年利率 6% 來算,存了 30 年後你可以拿到多少,答案是 284 萬,以 10% 來算,可以得到 592 萬,這還是理想狀態喔!如果你挑錯基金的話,那就難說了。

如果是投資自己,則未來無窮,別再省那點小錢,捨棄了讓自己成長的機會,又或者投資自己後,你的未來還是那個樣,那也別氣餒,畢竟這是毀在自己手裡呀!

註1 斜字粗體刪除文字是我在股市慘賠後的心得,但是在看過效率市場理論及綠角的文章後,這一段文字已經是不對的了。

apache2 + ssl on ubuntu 7.04

和 Fedora 的設定方式稍有不同。

1. 產生認證檔案
sudo mkdir /etc/apache2/ssl
sudo make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem

2. 修改設定檔案 /etc/apache2/sites-available/ssl
NameVirtualHost *:443
<virtualhost *:443>
  ServerAdmin webmaster@localhost
  ...
  ...
  SSLEngine On
  SSLCertificateFile /etc/apache2/ssl/apache.pem
</virtualhost>

3. 重新啟動 Apache 伺服器
sudo /etc/init.d/apache2 restart

2007年12月2日 星期日

我可以接受 2008 奧運棒球賽沒有「中華台北」隊! 你呢 ?

看中日之戰(2007世界盃)有點失落~ 中,我還是認為業餘就歸業餘,職業歸職業。

change 給了我更好的理由:「不要讓我們的國球到北京去給人家糟踏!」

所以這次中韓之戰( 2007 亞錦賽)輸了,我覺得沒關係!

另外附上一則新聞「馮勝賢一句話 洋基多了勝投王」來說說台灣之光到底是誰「擦」的。

2007年11月27日 星期二

funny stuff~

i heared about the web site( http://www.odiogo.com/ ) from my friend's blog( http://chung-kai.blogspot.com/ ). he use it to convert article to human voice and audiences can read the words and hear the english pronunciation of words at the same time.

nice tool~ i wish have one.

2007年11月23日 星期五

用 VirtualBox 讓 Windows Server 偷偷(背景執行)跑在 Linux Server 上

自從接觸到 VirtualBox 後,一直想要把它的 Guest OS 當成 Host OS 中的服務來使用,因為這樣子,我就可以在 Linux Server 中再跑一個 Windows Server 。會這麼作的原因是要使用 MS Office API 來出 .doc 檔。

那麼該如何在 Linux Server 中,令它在一啟動時,即啟動 Windows Server Service 呢?其實很簡單,在你的 /etc/rc.local 中加入一行

VBoxVRDP -startvm WinXP &
#如果你的 WinXP 並不是建立在 root 帳號中,而是其他使用者的話,請使用下列命令
su - UserName -c "VBoxManage startvm 'WinXP' -type vrdp"

這樣就夠了, WinXP 是 Guest OS 的名稱。這種啟動方式,讓你不須要跑一個 X window 環境來秀出 Windows Server 的視窗,它會啟動在背景中,如果你有設定 Guest OS(WinXP) 可以遠端顯示的話,你可以在別台電腦以 rdp 連線來控制 Guest OS(WinXP) 。

設定好了以背景方式啟動 Guest OS 後,再設定外部連線可以轉到 Guest OS port 。設定指令如下:

# VBoxManage setextradata "WinXP" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/Protocol" TCP

# VBoxManage setextradata "WinXP" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/GuestPort" 80

# VBoxManage setextradata "WinXP" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/HostPort" 8080

上述指令只須設定一次即可,設定後,請重新開啟 VirtualBox 軟體。這樣別人就可以從 http://x.x.x.x:8080/ 來瀏覽你的 Windows Server 的網頁伺服器了。

2007年11月18日 星期日

以email/skype/gtalk/msn作網頁認證

忘了是在那個網站上看到的,那個站長說他設計的網站在註冊帳號/密碼的部份儘量朝簡單流程考量,因為他十分討厭現在的網站要填一堆有的沒有的資料,還要 email 驗證,沒用多少服務,先得浪費一堆時間。

這激發了我對「單一簽入」系統的進一步想法。過去,我從信用卡刷卡機制方式中類推了一個身份認證的流程(其實完全抄自於銀行信用卡刷卡流程)。像是天瓏書局就是與國泰世華銀行結合,當使用者把訂單確定後,就會轉到國泰世華銀行的信用卡刷卡頁面,待信用卡認證後,國泰世華銀行網頁就會再轉回天瓏書局的頁面,天瓏網站從其中可得知使用者刷卡結果並決定訂單是否該出貨。

而「單一簽入」的流程也是使用者先來到服務網站,當他點下需要「登入」才能使用的網頁時,會先轉到認證網站去,而此時瀏覽器會帶著一個 SESSIONID ,接下來,使用者在認證網站上填入帳號/密碼,經認證網站確認後,將使用者的瀏覽頁面轉向回服務網站,而服務網站能針對 SESSIONID 繼續提供使用者服務。

這麼作有幾點好處:
  1. 當所有的服務網站都採用相同的認證網站時,那麼使用者就不用記住非常多組的帳號/密碼了。
  2. 服務網站永遠不知道使用者的密碼,這提昇使用者的隱私保全。
  3. 除了帳號/密碼只有一組外,使用者的個人身份資料也只會有一組,這樣到了新的服務網站就可以少打很多資料了。
而惟一的缺點是把雞蛋放在同一個籃子中。不過,有些人是不把這個當缺點的,他們的想法是把資源集中後,就可以用比較少的精力來用心看好它、照顧它。

上述的舊想法只簡化了認證的動作,但經過那個懶站長的抱怨後,我到有另一個想法可以結合「單一簽入」的概念,讓使用者根本不需要打密碼。

話說以前的 bbs 站台有提供 pop3 認證的功能,只要你相信站長不會偷用你的信箱,你可以直接把 pop3 帳號/密碼設在 bbs 站上,讓站主確認你就是那個 email 的擁有者。但這樣作,真的需要信心。所以直接把 email 帳號/密碼告訴站長在現今的社會是不可行的。不過,這方向滿正確的。現代人那個沒有 email ,我想大概就是那位靠著沿街賣馬鈴薯,賣到賺一間公司的老伯吧!所以說,如果你不是賣馬鈴薯賺大錢,還是要申請一個 email 。

上述的 email 認證方法,我們拿來結合進「單一簽入」系統,當使用者來到認證網站時,只需要輸入 email 帳號,按下確定後,認證網站發出一封認證信到使用者的信箱,只要使用者點選了那封信的認證連結,那麼就回到原來的認證網站,而認證網站也就確認了使用者確確實實擁有那個註冊 email 。如此一來,每次使用者都是透過點選認證信的方式來到認證網站,這樣他也不需要在認證網站上設定密碼了。

我們如果再把 email 的想法延伸到 Gtalk 、 Skype 、 MSN 等傳訊軟體,使用者只要點選認證訊息一樣可以回到認證網站,那麼使用者要作驗證的動作也就更容易。

ps. 事實上,我還在看有關 OpenID 以及 Identify 2.0 的文件,或許它們還有更好的方法。

2007年11月14日 星期三

還不賴的 Google Adsense

Google 真是一個不錯的企業,雖然它的股價最近從 741 跌到 637 ,但我還是很看好它的市價會超過 MSFT 。

各位應該知道我的站放了滿多 Google Adsense 產品的,而今天最令人開心的不是這些產品幫我賺了多少收益,而是有人透過我的 Google Adsense 賺了 5 塊美金。為什麼我知道呢?請看下面這張圖。



其中在「推薦」的 Google Adsense 一列中,顯示我的收益有 5 塊美金。這代表有人是透過我的網頁中的推薦去申請 Google Adsense 的,而他/她的 Google Adsense 帳戶在每賺了 5 塊錢時,也會相同地給我 5 塊錢分紅(由 Google Adsense 官方給予的)。

不曉得是那位過客。讓我請你喝杯奶茶吧!

2007年11月9日 星期五

看中日之戰(2007世界盃)有點失落~

今天的先發陣容:陽建福先發主投,打擊排出林智勝、鄭兆行、彭政閔、陳金鋒、張泰山、謝佳賢、羅國輝、葉君璋、廖英傑。後援投手有增菘瑋、倪福德。

以上有幾個不是職棒球員,廖英傑不是,羅國輝勉強不要算(1A球隊而已,不太職業)。所以我和老婆說,今年惟一現場看的球賽其實也算是職業球賽,而且還一次看5隊呢!除了統一獅在日本沒得看。

當我到了球場,看到一堆熟面孔後,我忽然覺得台灣的職業球員很可憐,為了台灣人的民族自信心,得捨棄休息養傷的時間,為國爭光。

尤其是在回家的路上,聽到中廣主播提到倪福德今年在中信也有點使用過度的情形,他個人也說手的確是有些受傷。

唉~拿有些受傷的手來投 144 公里的球,不知道什麼時候會真的不能用。

我希望我們國人能把這業餘的比賽成績看輕點,就讓我們的業餘球員和別人的業餘打吧!要比職業的,可以在每年初的經典賽來比,這時國內的職棒球員休息也夠了,該為季初熱身了,也較符合職業球員的身體慣性。

業餘的比賽該讓業餘的出頭,要不然永遠期待陽建福、潘威倫、林英傑…,這樣只會讓他們在季前、季中、季後頻繁出賽,我們的板凳深度永遠不夠,球員的棒球生涯也容易結束。

我為了球員的長期棒球生命,我可以接受台灣在業餘比賽表現不出色,你呢?

2007年11月5日 星期一

面對高油價,政府該這麼作!

當大家在吵油價該如何調整的方案時,我聽到了鄭村棋老師的一點意見,他說:「政府為什麼不趁這個機會,強迫大家作環保。」這個另類思維,我認為真是金玉良言呀!

政府是一直在強調這次的物價上漲是無法避免的,作什麼政策都無益抑制物價,且物價調漲對我們的經濟成長率也影響有限。

那如果在物價上漲中兼作環保政策,那應該對以綠色執政的民連黨來說,也是一項助力呀!

怎麼作呢?完全反應原油成本,甚至在浮動油價機制中,一律往高標調漲,然後把多拿的錢拿去補貼大眾運輸業(市區客運/長途客運)、腳踏車產業/關稅等,汔車改依每公升油耗來徵燃料稅,油耗愈高稅金愈高。

如果可以的話,應以區域來區分大眾運輸業的不同補助手段,例如:在台北市,補助金是用來作車價折扣,而在大眾運輸不發達的縣市,是以免費接駁公車代替。

2007年11月1日 星期四

GNU/Linux +Bash + Gnome 的易用性!

喜歡用 Ubuntu 工作,我想跟我熟一點的朋友是知道的。

但還是常常有人對我說, Linux *註1 不好用,他在 Windows 中,只要點點滑鼠兩下就夠了。

我想說的是:「他們想永遠當個小朋友。」

小朋友一開始使用電腦時,鍵盤對他們的門檻很高,又要記鍵位,十指又要有效運作,這是不容易辦到的。反觀滑鼠,只要移動它,及按下它 *註2 。

但等到長大一點,電腦使用者通常會開始記憶鍵盤快捷鍵,如: <ctrl>+C, <ctrl>+V …等,或是在 Command 中,打 ipconfig /all, arp -a, netstat -at …等指令,那使用者為什麼在這時候開始使用不直覺的鍵盤指令來工作呢。因為他不再是初學者了,他長大了,懂了比較多東西了,所以他會/能善用鍵盤。

人不是一輩子都是個初學者的 *註3 ,長大了就應該多用點鍵盤,多打些指令,節省你在這世界上痛苦的時間 *註4 。

那好吧!為了證明自己長大了,我就一直用鍵盤,不用滑鼠了,是個硬漢了吧!那倒也太辛苦了,有時候我們也會想要回到童真時期,作些大人不能作的事 註5 。偶爾用點滑鼠,沒人會責怪你的。

以上淺談了滑鼠及鍵盤的易用性,現在我們來談談 Ubuntu 給我們什麼,一個 Bash 及一個 Gnome 。

一個良好設定過的 Bash ,在上面打指令是很舒服的(命令列比較好!),而 Linux 許多的設定又可以簡單透過 vim 來作到。

但如果你懶得打字, Gnome 就排上用場了,它提供很多 GUI 管理工具,像我現在還不會在 Ubuntu 中用 vim 改網路設定,我都是到右上角的網路圖示中點右鍵設定。

所以 Ubuntu 讓我們在滑鼠及鍵盤中,都有「有效的方法」來執行你的工作。

反觀 Windows , GUI 介面很好用 * 註6,但內鍵的 Command * 註7 就很難用了,兩個加乘的效率就不如 GNU/Linux + Bash + Gnome * 註8 了。

所以我一直認為用 GNU/Linux + Bash + Gnome 是比較有效率且容易使用的,而且也應該是這樣子。

你不會永遠當一個初學者,你會長大的 *註9 。

----
註1 用這個名詞,是表示朋友多半不知道什麼是 GNU, Gnome, KDE 這些東西,他們只知道 Linux 。
註2 事實上,有人也認為 Windows 的兩鍵滑鼠是錯誤的設計,對初學者而言,應該是用 Mac 的單鍵滑鼠才對,初學者在按按鍵時,才不會按錯。
註3 其實只要你停了學習的欲念,你就可以當一輩子的初學者。
註4 人生苦短,我用 Python 。
註5 穿高中制服去喝酒、到公園沙坑去堆城堡…。
註6 或許對很多人來說,它比 Linux 好用。
註7 或許是要設定吧!是我不懂 Windows 該如何對 Command 作設定。但系統裝完的預設值真的很難用。
註8 拷!要三個自由軟體才能勝過 Windows ,表示 Windows 也很厲害呀!(如果你是這麼想地,千萬不要跟別人說,把它放在自己心上吧!如果說出去,會對你有重大後果的,因為你發現了一件大家都沒發現的事實。)
註9 我會這麼說,是源自Perl 的爸爸 Larry Wall 對「易用」的看法:「當有機會讓程式員感到方便,但是讓學 Perl 的人覺得不便時,他幾乎一定站在程式員這邊。這是因為你只需要學一次 Perl ,但卻會一直使用它。」

2007年10月29日 星期一

自由軟體比較安全?

引自 - 人間研究所: 自由軟體比較安全?

上一篇的作者拿 Windows 隨身碟病毒作引子,提到了 OpenOffice.org 的軟體最近也被找出一個漏洞,而這個漏洞目前只在 Linux 上被實現出來(白話說,目前只有 Linux 上跑的是 OpenOffice.org 2.0.4 以前版本的,就有機會被怪/駭,如果是 Windows 則目前沒事)。

該作者說:「當 Mac OS 和 Linux 越來越多人使用的時候,相關的惡意程式的增加也是自然的事。」所以自由軟體並沒有比較安全,現在會安全是使用者少的原因。

我:「多麼不倫不類的比較。」

請先看看 wikipedia 對病毒的解釋

所有的程式設計師一定會承認,沒有軟體是十全十美的,一定會有漏洞,我是程式設計師,當然也認同這句話。

但漏洞不等同病毒呀!在 Windows 中,如果你定時/即時地把所有相關的應用軟體及 OS 的漏洞補齊,那你會不會在「不安裝防毒軟體」的情況下,把電腦交由一般使用者使用,會嗎?

又,你在 Ubuntu/RedHat/SuSE/... Linux 中,如果你定時/即時地把所有相關的應用軟體及 OS 的漏洞補齊,那你會不會在「不安裝防毒軟體」的情況下,把電腦交由一般使用者使用,會嗎?一定會吧!

簡單地說,隨身碟病毒不會因你更新了軟體漏洞,而有了防禦能力,它是需要更新防毒軟體的病毒碼,才能解決的。而 OpenOffice.org 卻是更新軟體版本就行了。

自由軟體/商業軟體一樣都會有漏洞,但評定安全的標準是須考慮漏洞、病毒、蠕蟲、木馬…的,在病毒、蠕蟲、木馬上,自由軟體的 Linux 比 商業軟體的 Windows 還安全,這跟人多人少沒關係,這是系統架構設計的問題(不懂,請再回到 wikipedia 對電腦病毒的解釋)。

所以,安不安全跟自由不自由也沒有關係, Mac OSX 、 AIX 、 HP-UX 、 Solaris 就都不是自由軟體呀!但它們的系統架構設計都勝過 Windows 。

當然使用者不一定愛「比較安全」的作業系統,男人也是。

2007年10月15日 星期一

Google的市值是全球科技股第二大了。

Google 的市值有多少呢!目前是 1980 億美金。那全球第一名是誰呢!應該沒人會講錯吧! MSFT ,是的,就是這家公司,從它 1986 年上市至今約二十年頭,它的市值也只比 2004 年上市的 Google 多了 3 成。
keep going google! i believe you!

2007年10月12日 星期五

破紀錄:有史以來,第一次中毒

之前從來沒有中過毒,要不就是我沒發現過。

還好我已經用了 VirtualBox 了。中毒的解決之道,就是 cp -rf /backup/XXX.vdi ~/.VirtualBox/XXX.vdi , 8 分鐘就復原了。

這陣子,我老婆的學校一直飽受病毒肆虐之苦。沒想到,現在也延燒到家裡了。

2007年10月9日 星期二

Lp_solve 安裝

lp_solve 是以 C 語言寫成的 Mixed Integer Linear Programming (MILP) solver ,所以基本上,你是用 C 語言的人是可以直接把它的函式庫包在所寫的程式中的。

但我們是用 Python 的人,那要如何能在 python 語言把 lp_solve 載入呢!要作到這個,你首先要知道 lpsolve55.dll (windows)/liblpsolve55.so(unix) 就是 lp_solve 的函式庫,你只要有這個檔案,你就可以使用 C 語言來寫 MILP 應用了。

而用 Python 的人,則是要多安裝一個 lpsolve55.pyd(windows)/lpsolve55.so(unix) ,這個檔是 Python 與 lp_solve 函式庫的溝通者/包裝者,你的 Python 程式都是先載入 lpsolve55.pyd(windows)/lpsolve55.so(unix) ,然後它會幫你處理與 lpsolve55.dll (windows)/liblpsolve55.so(unix) 的資料傳輸。

Ubuntu 7.04 版: 請到 sourceforge.net 下載 5.5.0.10 的檔案。

  1. lp_solve_5.5.0.10_dev.tar.gz - 裡面放的是 liblpsolve55.so
  2. lp_solve_5.5.0.10_Python_source.tar.gz - 裡面放的是 lpsolve55.so 的程式碼

把 liblpsolve55.so 放到你的 /usr/lib 下(而其他解出來的檔案則拿到 lp_solve_5.5.0.10_Python_source 的資料夾中,與 extra 同一層)。接下來確定你有安裝 python-dev 套件,如果沒有,你應該知道如何安裝它吧!(# sudo apt-get install python-dev),接下來解開 lp_solve_5.5.0.10_Python_source.tar.gz ,進入到 extra/Python 中,執行 # sudo python setup.py install 。

如果沒有意外出現的話,你可以在 python 直譯器中見到如下訊息:

Python 2.5.1 (r251:54863, May  2 2007, 16:56:35) 
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from lpsolve55 import lpsolve
>>> lpsolve()
lpsolve Python Interface version 5.5.0.5
using lpsolve version 5.5.0.10

Usage: [ret1, ret2, ...] = lpsolve('functionname', arg1, arg2, ...)

2007年9月28日 星期五

陣列特殊排序需求

Example: 排序 '140.120.109.1', '140.1.109.2', '14.120.109.1', '120.140.109.2'…等 ip 格式的文字串。這種排序的結果應是將 ip 切成 4 個部份後再來排序的。

>>> a = [4,5,6,1,2,3]
>>> a.sort()
>>> print a
[1,2,3,4,5,6]

上面的例子告訴我們,每個 list 都會有 sort 方法,而它的功能就是把陣列中元素作排序。如果陣列中元素有字串、另一個陣列、其他物件等, sort 方法一樣都可以排序,只是你對一個混合型態的陣列作排序,不容易有實質意義。

而如果陣列中的元素是單型態的,但它們的資料格式長得有點複雜,像是 ip 位置,那麼該如何排序呢!

>>> def sort_by_ip(X, Y):
... x_list = X.split('.')
... y_list = Y.split('.')
... for (i, x) in enumerate(x_list):
... if int(x) > int(y_list[i]):
... return 1
... else:
... return -1
... return 0
...
>>> ip = ['1.1.1.1', '140.120.109.1', '140.1.109.2', '14.120.109.1', '120.140.109.2']
>>> ip.sort(sort_by_ip)
>>> print ip
['1.1.1.1', '14.120.109.1', '120.140.109.2', '140.1.109.2', '140.120.109.1']

我 們利用一個自定的 sort_by_ip 方法來客製化我們的排序需求。陣列的 sort 方法,在執行時,會依序將陣列中的元素以兩個兩個為單位丟給 sort_by_ip 方法來處理,由 sort_by_ip 方法回傳出這兩個元素的大小,如果是前者為大,回傳值為 1 ,如果是後者為大,就回傳 -1 ,相等則回傳 0 。

所以你也就不須煩惱 sort 方法是不是用 quicksort/bubble 演算法,只須考量兩個元素的大小是如何判定的。

當問題只縮小到判定兩者大小時,就十分簡單了,在 sort_by_ip 方法中,我們首先拿到兩個元素的值,然後以 split 方法將其斷成 4 個子元素,再來依序比較這 4 個子元素的大小即可。

再來談一個例子:[{'cost': 10, 'id': 3}, {'cost': 1, 'id': 13}, {'cost': 100, 'id': 33}, {'cost': 84, 'id': 4}]該如何排序,解答如下:

def sort_by_cost(X, Y):
if X['cost'] > Y['cost']: return 1
elif X['cost'] <>
else: return 0

2007年9月23日 星期日

基隆市立信二停車場

用心就是不一樣。

這次到北部遊玩,有幸來到信二停車場,發現到令人感動的管理方式:
  1. 入場以人工方式輸入車號後領卡進場
  2. 每樓層以不同顏色標記
  3. 出場以人工輸入車號判讀停放時間,並檢查是否符合車卡上車號
這麼作有如下幾個優點:
  1. 以顏色區別後,使用者多了一種方式來記住停放車子的樓層。
  2. 出場得符合車卡上的車號,這樣車子被竊的機率降低了。
  3. 出場以人工輸入車號來判讀停放時間,這樣出場時間可以少個幾秒鐘。
缺點有一個:得多花一個人力。

2007年9月21日 星期五

小(大)學生一定要有電腦及網路才可以畢業!

這陣子燦坤、家樂福、全國電子推了幾個廣告,訴求就是「威脅」、「利誘」、「柔性呼喚」要開學的學生或是學生家長,在學涯生活中一定得買台電腦,要不然學習會輸別人的。

這是商人的詭計,與情人節買花、普渡要旺旺的道理是一樣的。但在聽我說下去前,請你們先去看看一個高級知識份子的文章「不要學電腦,不要學英文」,以下三個網址的內容都一樣的:
http://home.pchome.com.tw/internet/intro33/new_page_8.htm
http://blog.yam.com/eyesfun/article/8155310
http://www.pczone.com.tw/vbb3/thread/21/71021/

看完了嗎?還沒,請記住,我的文章沒他好,如果你不看他的,卻繼續看我的,那代表你沒眼光。再給你 3 分鐘。

曾在南投縣北山國中上過一個學期的資訊課。學期開始,我就為同學們介紹什麼是資訊、什麼是電腦,電腦不等同資訊;資訊也不等同電腦,所以我們上課其實不是一直在用電腦的,我會上點數學、講些社會上應用電腦資訊的例子,像是快遞如何透過資訊系統協助送貨、 7-11 如何管理庫存…之類的。

而最重要的一點是,我出的作業,一定要在課堂上作完。

因為我知道不是每個小朋友家裡都有電腦及網路的。台灣雖然是開發中國家,雖然是資訊產品的最大出口國之一,但還是有人家裡不能買或不願買一台電腦,辦條網路線的。

家裡沒有電腦,我是一點都不覺得有什麼關係的,尤其對小朋友來說,電腦對他們一點都不重要。何必為了 1 個月花 3 小時作一個文書處理作業買台電腦回家呢!況且如果老師真的出了電腦作業,也真的要求小朋友帶回家作出來,那也沒有關係,至少對市區學生來說,我們多半都有圖書館,圖書館裡有電腦、網路可以使用,像是欣榮紀念圖書館中還有 Ubuntu 可以用呢!又或者學校的電腦教室也可以使用呀!要不然學費中的電腦使用費是繳心酸的嗎(但大部份的家長其實不知道電腦使用費有一部份是花在教師電腦及全校網路連線費)?

但以上所說,不代表現在學校老師了解這個現象

我的姪子、姪女目前就讀南光國小,就常遇到老師要他們回家打報告、找資料,打報告是沒問題啦!因為家裡有電腦,但找資料的話,卻因沒有網路,所以他們就會跟家裡大人說:「要到姑丈家,或是舅舅家用網路。」於是 3 分鐘找資料,剩下的時間玩網路遊戲。

所以當我聽到老師又出網路作業回家作的時候,心裡就不高興。對小朋友來說,在網路上找資料一點都不重要。重要的應該是教他們「如何利用資訊」。甚至我還覺得根本不要教所謂的文書處理軟體、影像處理軟體、網頁製作軟體等,這些東西對他們未來的益處不若「如何利用資訊」來得重要。

資訊有很多形式,紙本的、口述的、數位的、網路的…,資訊的儲存位置也有很多地方,其中對小朋友(其實對大朋友也是)最有幫助的是圖書館。但學校老師常常不教(或許是他們也不會運用圖書館),只(會)用 Google 找資料的人是愚蠢又懶惰的。

而事實上,許多國中小電腦老師也只會教小朋友文書處理軟體,於是國小教一遍,國中又教一遍,搞得小朋友認為電腦就是這樣子,除了網路遊戲外,其他都是一整個無聊。

如果可以,我希望電腦可以晚一點教。

拿我親身的實例來說:高四(1995)時,我爸就買了一台 Win95 的電腦,要拿來幹什麼,我不知道,但當我上大學時,它成了我寫作業的工具,利用它來打報告及玩 NHL 97 ,一直到研究所,我才踏入重灌電腦/程式設計的行列,我還記得高中工藝課看不懂老師寫的 basic 程式,只好看同學打三國志 3 的情景,但比起這些國高中就有在玩電腦的同學,現在與他們相比,在電腦科學/應用上並不輸他們呀。

如果可以,我真的希望電腦可以晚一點教,因為有太多更重要的東西要學了。

django's models 中殺了父物件時,預設也會殺了子物件

如果你宣告了兩個 model:

class Journal(models.Model):
publishdate = models.DateField()
price = models.IntegerField()

class Article(models.Model):
journal = models.ForeignKeyField(Journal)
content = models.TextField()

那麼當你使用

>>> j = Journal.objects.get(publishdate=datetime.date(2007, 10, 1))
>>> j.delete()

時,會一併把 2007/10/1 出版的期刊內所有的文章紀錄一併刪除。

OpenSolaris 嚐鮮!

一直耳聞 Solaris 的效能不錯,現下 Sun 也把 Solaris Open 出來了,趁著這次 R51 的 OS 常 Hang up ,所以就拿 OpenSolaris 11 來重灌。大概花了三個小時。安裝約一個半,使用約一個小時。最後我的結論是 NB 不應該灌 OpenSolaris ,因為開機花了四分鐘,關機花了二分半,當然這不表示它的效能不好,而是它著眼的不是個人應用。

總結它的優點有:
  1. 嘸蝦米內建
  2. JDS 介面比 Gnome 好看
  3. 安裝不難(或許是我灌過太多 Linux 套件了)
  4. Java 相關應用完整
缺點就只有一個,它是伺服器導向的,不太適合個人應用,舉個例子來說:它不能安裝 Skype ,或許再等等吧! OpenSolaris 應該會朝著個人應用發展的。

注意!!如果你的硬碟已有 Linux 啟動磁區的話,那麼 Sun OS 的磁區是不能與它共存的。建議另外拿顆硬碟來玩吧!

下面是幾張桌面截圖:







2007年9月18日 星期二

動態規劃問題

一個大問題本身是由許多小問題所組成,且求解小問題的概念,也就是求解大問題的概念,像這種大問題就可以使用動態規劃來求解,而事實上,我倒覺得動態規劃求解觀念就是遞迴觀念。

假設有一發電廠欲規劃三年內符合總需求機組數的每年購買機組數以使購買總成本最低,如下圖:


我們可以依序購買 3,1,3 ,其成本為6+1+10=17,也可以任序購買 3,2,2 ,其成本為3+4+5=12,如此我們可知 3,2,2 的購買方式比較好。而最佳解該如何求得?以最簡單想法來看,就是把每年的選擇窮舉出來即可,以上題計,只要找出 4^3 種方式,比較那些方式符合總需求機組數且成本最低即可。

但窮舉法總有一天跑不完,如果你的問題是有二十種選擇,且要規劃二十年的話,電腦就沒這能耐跑出來了。

所以此題的作法是把大問題切成小問題,我們不用管三年後該怎麼買,而是永遠只考慮下一年要怎麼買。

從第一年開始,因為至少購買一組,所以我們留下三種購買方式 {1, 2, 3} ,到第二年時,我們把第一年的 1 組,去加上第二年的可購買組數 [0, 1, 2, 3] ,可得到 {1, 2, 3, 4} ;把第一年的 2 組,去加上 [0, 1, 2, 3] 可得到 {2, 3, 4, 5};
依此觀念可得
{1, 2, 3, 4}
{2, 3, 4, 5}
{3, 4, 5, 6}
等方式,這也就是下一年(也就是第二年)的可能購買方式組合。接下來,我們把下一年(也就是第二年)的總數量為 X 的組合找出來,然後留下成本最低的那一種,結果我們可知下一年(也就是第二年)會留下 3, 4, 5, 6 等四種總數量的購買方式:

在第二年的總購買量為 3 時: 1, 2(成本為2+4); 2, 1(成本為3+1); 3, 0(成本為6+0) => 應選 2,1 這一組。
在第二年的總購買量為 4 時: 1, 3(2+5); 2, 2(3+4); 3, 1(6+1) => 剛好都一樣,隨便選 1, 3 吧!
在第二年的總購買量為 5 時: 2, 3(3+5); 3, 2(6+4) => 2, 3
在第二年的總購買量為 6 時: 3, 3(6+5) => 3, 3

所以我們得到在第二年總購買量可為 {3, 4, 5, 6} 而它們的購買方式為 (2, 1), (1, 3), (2, 3), (3, 3) 等四種。

再接下一年,我們把 {3, 4, 5, 6} 再分別與第三年的 [0, 1, 2, 3] 來作組合得到:

在第三年的總購買量為 7 時: (1, 3), 3(成本為7+10); (2, 3), 2(成本為8+5); (3, 3), 1(成本為11+2) => 所以選擇 2, 3, 2,其總成本為 13 。
在第三年的總購買量為 8 時: (2, 3), 3(8+10); (3, 3), 2(11+5) => 3, 3, 2(16)
在第三年的總購買量為 9 時: (3, 3), 3(11+10) => 3, 3, 3(21)

由此,我們選擇 2, 3, 2 為我們的三年購買方式,其總成本為最低,只有 13 。

以上是例題的簡單說明。

我們會把發電廠的完整問題,以 Python 程式解出。程式說明如下:

解答的資料結構:

Res = {
27: {
'cost': 40 , 'list': [5, 1, 3, 10, 2, 0, 0, 6, 0, 0],
'costlist': [10, 1, 4, 15, 2, 0, 0, 8, 0, 0]
},
....
}

27 代表當年度的總機組數量, cost 值代表在每年購買量為 [5, 1, 3, 10, 2, 0, 0, 6, 0, 0] 時的總成本,
costlist 陣列則是每年購買成本。

成本矩陣:

Cost = [
[0 , 2 , 5 , 7 , 9 , 10 , 12 , 16 , 18 , 19 , 20], # 第一年在各種購買量下的成本。
[0 , 1 , 5 , 7 , 9 , 12 , 15 , 18 , 21 , 25 , 27], # 第二年在各種購買量下的成本。
[0 , 2 , 3 , 4 , 7 , 9 , 10 , 13 , 15 , 19 , 22],
[0 , 1 , 2 , 6 , 7 , 8 , 10 , 11 , 12 , 14 , 15],
[0 , 1 , 2 , 4 , 5 , 7 , 11 , 12 , 14 , 16 , 18],
[0 , 2 , 3 , 6 , 9 , 11 , 12 , 13 , 16 , 17 , 21],
[0 , 2 , 6 , 7 , 8 , 9 , 11 , 14 , 16 , 20 , 22],
[0 , 2 , 4 , 5 , 6 , 7 , 8 , 12 , 14 , 17 , 19],
[0 , 1 , 3 , 5 , 8 , 9 , 10 , 12 , 13 , 17 , 18],
[0 , 3 , 7 , 10 , 12 , 15 , 18 , 21 , 24 , 25 , 27],
]

需求矩陣:

Limit = [3 , 4 , 9 , 11 , 14 , 18 , 18 , 21 , 24 , 27]

運算流程:

主要概念是把前一年度的購買組合與本年度的購買組作交叉組合配對,
會得到本年度的購買組合,每一購買組合的形式如下:

27: {
'cost': 40 , 'list': [5, 1, 3, 10, 2, 0, 0, 6, 0, 0],
'costlist': [10, 1, 4, 15, 2, 0, 0, 8, 0, 0]
},

27 代表當年度的總機組數量, cost 值代表在每年購買量為
[5, 1, 3, 10, 2, 0, 0, 6, 0, 0] 時的總成本,
costlist 陣列則是每年購買成本。

跑完當年度的購買組合後,就把不滿足需求量機組數的購買組合刪除。

等 10 個年度跑完後,再利用 sort_by_cost
函式作排序,把最便宜的購買組合放到最前面。

延伸閱讀:

sort_by_cost 函式的原理:請參考
http://wiki.python.org/moin/HowTo/Sorting#head-10e70070894a1bdb7580127b5cf764a44a2d6d29

for k_i in [k for k in Res.keys() if k < Limit[i]]: del Res[k_i] 的語法等價於:

toDel_k = []
for k in Res.keys():
if k < Limit[i]: toDel_k.append(k)

for k in toDel_k:
del Res[k]


完整程式下載: http://www.hoamon.info/_d/dynamic_programming.py

讓 Trac 支援 Email on Change

當 Trac 系統上有人增加/修改了一篇 wiki 、 ticket ,它能直接以 email 的方式讓其他人知道。

方法是:只要在 trac.ini 中編輯以下選項即可。

smtp_enabled = true
smtp_server = localhost
smtp_from = dontreply@mailserver
smtp_replyto = dontreply@mailserver
smtp_always_cc = XXX@gmail.com, YYY@gmail.com
always_notify_owner = true # 任何改變也會寄給「被指派的人」
always_notify_reporter = true # 任何改變也會寄給「創ticket的人」
always_notify_updater = true # 寄給改變這個 ticket 狀態的人

smtp_server 是寄信伺服器,如果你是在 hinet 的網路之下,可使用 msa.hinet.net ,它不會擋你。smtp_from, smtp_replyto 不重要,因為你不期待有人針對通知信回信。而 smtp_always_cc 則是每封通知信一定要寄的對象。

修改後,再重啟 apache 即可。

另外當你使用 ticket 時,要讓多人知道這個 ticket ,請使用 Cc: 欄位,其值為收信地址,若多值請用逗號隔開。

2007年9月7日 星期五

VirtualBox 1.5 讓我太感動了


如何感動!還是看圖容易。請看!

IE 及 MSN 是活在 Ubuntu 當中的。

這樣我又都多了個好理由來鼓勵大家轉到 Linux 陣營了。

呀~~我都快哭了。

快上 http://www.virtualbox.org/了解實情。

python2.5真的與2.4有差

在 Ubuntu 上開發程式的環境是 2.5 ,但網頁伺服器是用 Fedora Core 5 ,所以它的版本還在 2.4 ,已經跑過無數個程式了,一直都是相容的,直到今天。

在 2.5 中,抓日期物件如下:

dateobj = datetime.datetime.strptime('2007-1-1', '%Y-%m-%d').date()

但在 2.4 中,卻不能這樣用,因為 datetime.datetime 並沒有 strptime 函式。那麼 strptime 函式在那裡呢!在 time 下。所以要改成如下的寫法:

dateobj = datetime.date(*time.strptime('2007-1-1', '%Y-%m-%d')[:3])

這樣在 2.4 及 2.5 下才能同時正確執行。

不過,我認為 2.5 改得好,因為我一直認為 time 物件是用來抓時間用的,而 datetime 是用作時間日期格式轉換用的, strptime 放在 datetime.datetime 下比較適合。

2007年9月5日 星期三

取消回復光碟的申請

以下是我寫給 Lenovo 客服的信。
>>>>>>>>>>>>>>>>>>>>>>>
客服人員:
您好,我於 8/24 申請回復光碟,但至今尚未收到。以下是我的資料。如果貴公司尚未寄出回復光碟,請取消我的申請,因為我已經放棄在 R51 上安裝 Windows XP 了,專心投入 Ubuntu 7.04 的懷抱。謝謝。

姓名:何X峰
身分證號碼或護照號碼:B1********
IBM機器序號(S/N):99CMDZ7
IBM機器型號(M/T):1829J6V
隨機版作業系統版本:Home Edition
客戶地址:545 投縣埔里鎮******
行動電話/室內電話:0911776XXX
電子郵件地址: hoamon@hoamon.info
回復光碟-最遲歸還日:2007-09-06

是否願意收到IBM相關訊息:no

---------- Forwarded message ----------
From: Mail Service <psginfo@tw.lenovo.com >
Date: Aug 24, 2007 8:05 PM
Subject: Lenovo Notice : 回復光碟申請成功 (本信件由系統寄送請勿直接回覆)
To: hoamon@hoamon.info

Lenovo 個人電腦服務部

----------------------------------------------------------

親愛的 Lenovo 用戶您好,

非常感謝您對 Lenovo 的支持

我們已經收到您的回復光碟申請表,並會盡快將光碟寄出.

如您仍然有任何疑問,請來信至pchelp@tw. ibm.com或是撥打0800000700免費專線,我們會盡力為您解答

非常感謝您的配合.

謝謝

2007年8月31日 星期五

不重灌 R51 上的 Windows 了!

重灌 IBM R51,好累!所以想用另一個方法來解決。

最近有一項 Open Source 軟體很紅: VirtualBox 虛擬軟體,它的目的就是讓你在一個作業系統上再安裝多個作業系統,這類型軟體的領導者曾經是 VMWare ,但漸漸地有其他商業的、自由的軟體追上來了。

大家都說 VirtualBox 的效率十分高,幾乎快等於直接執行 Guest OS(就是多灌的那個 OS) 了。

況且如果是用 Levono Recover CD 重灌的話,無助於我桌上型電腦的 Windows ,我的 CoreDuo2 也是要重灌的。然而如果我使用的是 VirtualBox 的安裝方式,那麼只要在 CoreDuo2 上安裝一次,就可以把那個安裝完成的 .vdi 檔複製到 R51 來,這樣可以省下一次 OS 、 Application 安裝時間,同時也是另一型式的 Ghost/Clone 。

於是爬了爬文,看看如何安裝使用,結果相當簡單, Ubuntu 的方法如下:

# sudo vim /etc/apt/source.list

加入 deb http://www.virtualbox.org/debian feisty non-free

# sudo apt-get update
# sudo apt-get install virtualbox

會出現選單讓你選擇,挑預設值即可。

# sudo groupadd --gid 1111 usbfs
# sudo vim /etc/group

在 group 中的 vboxusers, usbfs 群組後面加入可以使用 virtualbox 的帳號,如:

usbfs:x:1111:hoamon

最後在 /etc/fstab 中加入 none /proc/bus/usb usbfs devgid=1111,devmode=664 0 0

這樣才可以在 Guest OS 中使用 usb 裝置。如果你還是有 usb 裝置的權限使用問題,請編輯 /etc/udev/rules.d/40-permissions.rules 檔案,把

SUBSYSTEM=="usb_device", MODE="0664"
改成
SUBSYSTEM=="usb_device", MODE="0666"

接著重開機一次。開機後請點選選單的「應用程式」->「系統工具」->「Innotek VirtualBox」,這樣就可以開始 Guest OS 的安裝。

所以我在 CoreDuo2 上安裝了一個 Windows Guest OS ,更新它的 Patch ,並設定好 WebATM 的各項要求,就把這個設定好的 WinXP.vdi copy 到 R51 上,什麼額外的動作都不需要,我的 R51 直接就可以開 IE 看我寫的網頁、線上報稅、使用 WebATM 了。而且速度真的與直接在 R51 上跑一個 Windows 差不多(甚至比較快,不過有可能是 Levono 的 XP 裝了一堆有得沒有得,造成的開機速慢,更何況這個 Win Guest OS 也才剛灌,這樣比不厚道)。

VirtualBox 真棒。

2007年8月29日 星期三

你是電腦重度使用者嗎?該用 Workrave 了!

跨平台軟體,Linux/Windows 都可裝,惟一的缺點是中文翻的讓我看不懂。

請上 http://www.workrave.org/ 。

這個軟體可以統計你使用滑鼠/鍵盤多少時間,按了多少下鍵盤,並強制你休息,還會提供體操讓你作作。

2007年8月26日 星期日

大學不是職業訓練所,而是要追求宇宙的精神

大學不是職業訓練所,而是要追求宇宙的精神」 From Career總編輯臧聲遠:六、七年級生,你為何不生氣?這句話我有很深的體會。曾經在暨大擔任畢輔組助理,發現很多的大學生真的很害怕畢業後找不到工作,所以我們辦了很多產業分析及職場先備能力的講座,以及帶同學們去企業參訪。

而體會到他們的就業恐懼及對自身學科的無奈後,我認為台灣的大學實在是太多了。可是如果想要畢業後快速投入職場的話,應該是去唸高職/科大等技職體系才對呀!怎麼都跑來唸大學呢?這不是國中選填志願時就該知道的事呀!或許那個時候專心課業沒想清楚未來的事吧!

現今企業訴求重點之一是「即戰力」,不想花成本訓練新人,覺得訓練夠了,人也跑了,所以希望學生能在大學/研究所時,最好就學會職場技術,以資訊業來說,如果你已經會了 Linux/Unix/Windows 系統管理(是系統管理,不是點滑鼠二下開 P2P 程式、 Office 軟體的)、 C/C++/PHP/Perl/Python/ASP/C#... 程式語言、Mysql/PostgreSQL/Oracle/MSSql...資料庫管理系統的話,你的錄取機率是遠大於其他不會的人。這樣看來好像沒有什麼不對,但那一個資訊相關學系的學生會說:「是!是!是!我上了四年的課,就是上這些東西!」攤開資訊領域課程(以交大資工為例)有「計算機概論」、「密碼學」、「資料庫概論」、「線性代數」、「離散數學」…,那個是上面所談到的軟體,但上面課程重要不重要,如果你在從業的時間內沒感覺到這些學科的價值,那你是白唸書了。

但還是有老師聽到了企業的心聲,所以他在研究所開了一門課:「網頁程式設計」。嗯~看樣子對學生很有幫助,然而跟學生聊了一下後,發現他們授課是使用 VS .Net 工具開發,程式教學是用 C# ,而且如果學生交出 JSP 作業,會明顯感到老師的不認同感。再深入了解後,老師有沒有談 Http 協定、 html 標籤,嗯~沒有。

不懂基本概念一樣可以寫出網頁程式,這我不反對,尤其是現今工具愈來愈高階,也讓使用者可以簡單開發更強大的程式。然而不從基本概念學起的,等出了問題,要 Debug 時就知道差別在那了。

教育的未來(Did you know?) 告訴我們未來很難預測,如果老師在意的是學生畢業後要用什麼軟體討生活,那註定會失敗,就像作業系統一樣,15年前教 dos, 12 年前教 win95,10年教 win98…,現在教 Ubuntu ,一直在變,但 15 年前學 dos 的學生,現在失業了嗎?可能有的有,有的還活得好好的,為什麼!因為 15 年前的學生會自己學新東西呀!

可是你看,「離散數學」、「線代」、「計算機概論」…內容有差多少。大學為什麼要捨棄不變的真理,去追求萬變的枝微技術。這個留個好學的學生自己來就行了,學校只要提供資源,學生要學 Windows Vista,學校機器有裝,要學 Solaris ,學校有裝,要用 VS.NET ,嗯,學校買了幾套版權,要學 Linux ,嗯~用 Ubuntu 行不行,這個學校也有。學校作到這樣就很好了。

另外,企業一味要求即戰力,遲早會享用自己的惡果,想想看,為什麼 Skype 不是台灣公司作的、 YouTube 不是台灣作的、 Yahoo! 、 Google 這些都不是台灣公司。即戰力即沒有創意。只能複製別人的成功模式或是一直代工下去。

唸大學就要看破,你是要追求宇宙的精神,職業訓練是你在家自己該作的事。

但追求宇宙的精神有什麼好處,我認為這是短空長多的價值,拿個歷史來說,如果一直堅持古典力學,那麼八年抗戰中,我們只能計較子彈如何精準穿過敵人身體、大刀如何有效地砍下敵人的頭顱,而不是用 E=MC^2 來作兩個炸彈來結束戰爭。

或許愛因斯坦後悔發明這些東西,但我認為這是值得的,如果沒有這兩個原子彈,那麼八年抗戰可能會變成十八年抗戰,反正戰爭都會死人,都會有人勝、有人敗,早點結束,大家可以早點生孩子、作正事。這就是「追求宇宙的精神」的長期價值。

2007年8月25日 星期六

重灌 IBM R51,好累!

嘿!總是對 Windows 有種不安全感,剛剛在用郵局 WebATM 時,覺得系統怪怪的,也就不敢轉帳,想要重灌 Windows 系統了。

說實在話,這樣作對我真不符合成本效益,因為我不常用 Windows ,大概也只有 WebATM 、網路報稅及用 IE 瀏覽我寫的網頁程式而已,算算使用時間,可能加起來用不到一個月。

剛剛已在 Levono 網站註冊要求寄回復光碟了。接下來,就是等了。

2007年8月12日 星期日

高級 Subversion GUI: Eclipse

對滑鼠重度使用者來說,編寫 python 程式是需要一個稱手的 IDE 工具的,在這方面,我強烈建議使用 Eclipse ,原因是跨平台、開源及外掛多,所以你可以用它來寫 java, PHP, perl, python, ruby...,缺點只有一個,要學會 java 才能幫它加特殊功能,還好你想得到的,多半有人作了。

但對不在乎滑鼠的使用者來說, Eclipse 是有點麻煩的,在編寫文字上,方便性就不如 VIM 了,快速移動、大區塊剪貼、尋找 re 字串、自動補齊(需 VIM 外掛)等,用 VIM 是十分容易作到的,像是你要打個 SuperviseCase.objects.all() ,你只要 Sup.obj.all() 這樣就夠了。

所以我並不常用 Eclipse 來開發程式,大部份是用它來 Demo 程式碼給學弟妹看,因為他們都是用這一套的。

但是 GUI 工具有一個好處,比較程式碼差異及看 svn log 時很方便,只要是使用 svn 時,會用到 less 指令的,都適合用 Eclipse + subclipse 來作。雖然 subversion 也有其他 GUI 工具配合,但 Eclipse 牌子比較大,用戶也比較多。建議各位試試。

= 後記 =
現在我改用 NetBeans 了。

2007年8月11日 星期六

叫警察一點也不麻煩 後記

叫警察一點也不麻煩,因為事後與追撞者一直談不出令我們滿意的處理方式,所以我們自行牽到 Toyota 原廠處理,也不要他們賠償了。

沒想到,到了原廠,他們拆了後面的車殼後,才發現裡面的保險稈完全變形(本來我以為後面的車殼是保險稈,其實它只是塑鋼車殼而已)了,鎖螺絲的地方也斷了,問題一點也不簡單。難怪我會覺得後車廂會有點變形。

實際上,車子被撞的很嚴重。整個修理費花了我們 1 萬元。

是的,我們花了 1 萬元上了一堂課:那就是稅我們繳了,保險我們付了,出事了,該麻煩他們,別麻煩自己。

損失的不過是4~50行程式碼

話說今天早上,用我的 IBM R51 寫著督導報表的程式,主要是建立了一個表單,大部份是設定有那些欄位及其屬性而已。

突然接了一通電話要改報名網站,聽完了需求後,就到另一台桌上型電腦 Core Duo 2 (桌上型是組裝的,我都習慣以 cpu 版本來當作它的名字)去寫,因為報名網站我已經在 Core Duo 2 上設定過了,改這一兩個功能就懶得在 R51 上再設一個網站出來。而修完後也剛好中午吃飯,所以就和內人出門了。

回來後,繼續用我的 R51 ,因為我的習慣相當不好,跟這位老兄一樣,喜歡邊開火邊移動,不過我的頻率比較短,通常只發作於與電腦見面的一開始,或許這也是我成就比較低的原因,所以著實在 youtube 上看了不少棒球、羽球的影片後,才進入我的工作。

因為與上午開發督導表單的時間有一陣子(3~4小時)了,我根本忘了還沒有 check in 的動作,又因為臨時想到放督導程式的資料夾位置不好,想用 Eclipse 作 svn co ,將來也用 Eclipse 作版本管理的動作。所以在 Eclipse 中作 svn co 後,我的 R51 同時有兩個督導程式資料夾。

系統中有兩個相同的檔案,對一個硬碟有 60 G 的 NB 來說,一點問題也沒有,有問題的是我覺得這樣的放法會讓我亂掉,於是我刪除了之前一直開發的那一個。所以結果就如本文題目一樣了。

因為我還沒有 check in ,所以那個表單設定的程式就沒有了。剛發現這個事實時,我很生氣,我居然可以用 subversion ,用到這種地步,想把自己打死。

接著,我開始尋求正面想法,以前在用 copy 的年代,我還丟過整個 lib.pl 呢!而丟了之後,還讓我想出比較有效率的 lib.pl ,難怪我覺得我的程式能力好像沒有之前好,因為現在不容易丟掉程式碼了。嗯~程式技術與版本管理能力似乎呈反比。

不過,我可不想回到過去手動整理麵條的時代,在用了 subversion 後,通常一天至少 check in 一次,丟掉程式的機率相當低,也就今天這麼一次,於是寫這篇文章來作個紀念。

2007年8月8日 星期三

叫警察一點也不麻煩

內人與我昨晚經歷了一場小車禍,是在十字路口被後方車子追撞。事情說小不小,說大不大,不大的是,我們沒事,只去收了個驚,不小的是,車子後面的保險桿有點變形。

覺得人車沒什麼問題,所以當追撞者提出先移車不叫警察採私下解決,我們並沒有反對,因為覺得事情真的不大。所以我簡單地錄下出事後的車子位置,受損外觀後,就將車子移到旁邊去,讓擁擠的車流快點暢通。

移了車後,與對方協商時,才覺得開始麻煩了。其實我們是有保車踫車險的,像這種小問題,只要有警方紀錄,那麼車牽進 Toyota 原廠後,就會恢復原形還給我們了。然而我們選擇私下解決,於是就要開始協調車子復原的定義是什麼,是把保險桿調整合原來的樣子,還是因為其中幾個卡榫斷了,所以得換整支。

所以當初叫警察來,是一點也不麻煩的,又何況,拍照的是警察,記錄車子位置的是警察,我只要在旁邊跟內人看風景而已。

2007年8月1日 星期三

呼~終於追上了

難道這就是金鏞筆下的「後發先至」。兩個人的登板時間也調整成一樣了,現下,就等雙方同場競技了。

2007年7月30日 星期一

考研究所時我還不會寫遞迴

中興營管的研究特色:用程式+管理數學來解決營建問題。

所以入學考試時,通常會考一題程式設計。而我那一年的考題是:「請把 1、2、3、4、5 的所有排列情形列出」。還好我大一計概被當,大四才重修,沒忘了什麼是 Fortran 及 PE2,於是寫這個程式對我來說好像不會太難。

但主要的問題是那時的我認為程式設計只有 for loop + if..else.. 而已,所以一個該用遞迴寫的問題,我該如何實作。還好數學幫了我,因為在相同個數的自然數子集合中,其子集合的積及和必屬惟一值的特性,讓我用 5 個迴圈把問題解決,程式如下(因為我已忘了 Fortran ,所以用 Python 作範例):
1 for i1 in xrange(1,6):
2 for i2 in xrange(1,6):
3 for i3 in xrange(1,6):
4 for i4 in xrange(1,6):
5 for i5 in xrange(1,6):
6 if i1*i2*i3*i4*i5 == 120 and (i1+i2+i3+i4+i5) == 15:
7 print '%d,%d,%d,%d,%d' % (i1, i2, i3, i4, i5)
這個程式或許談不上美感,但它讓我滿意未來的發展。能如願進入中興營管學習 VB + Matlab + Linux + PHP + Open Source + 管理數學。

而使用遞迴的方法如下:
 1 def Line(ori, level, res):
2 if level == 0:
3 print ', '.join(res)
4 return
5
6 for i in xrange(len(ori)):
7 res.insert(0, ori[i])
8 tmp = ori[:]
9 null = tmp.pop(i)
10 Line(tmp, level-1, res)
11 res.pop(0)
12
13 ori = ['1','2','3', '4', '5']
14
15 Line(ori, len(ori), [])

網站登入不用密碼

不要跟我說那就是用 html 寫的網站。

要如何設計一個網站具有使用者辦認的需求但又不要求使用者打密碼呢?

你覺得這網站該如何設計?歡迎你與我討論。

請看我的想法

2007年7月22日 星期日

這才是人生

7.1 局失 3 分,共投 89 球, 60 球好球, 好壞球比 2: 1 ,最後吞敗;反觀前一場,6 局一樣失 3 分,投 95 球, 62 球好球的表現卻拿了勝投。

幹的好,不一定拿勝投,幹不好,也不一定拿敗投,這才是球賽,是人生呀!

python trick: 可變物件應用在簡寫的賦值表示式上

我在Python: 可變物件(list、hash)在 def 函式的引數傳遞部份有著特別的行為已經談過可變物件在函式傳址時的特別行為。

再來談談在簡寫的賦值表示式時,會遇到的陷阱。我們利用 a = b = [] 表示式來作到 a = []; b = []; 應用如下:
1 if __name__ == '__main__':
2 a = b = []
3 for i in range(1,3):
4 a.append(i)
5 b.append(2 * i)
6 print 'a: %s' % a
7 print 'b: %s' % b
上式結果為:
a: [1, 2, 2, 4]
b: [1, 2, 2, 4]

是不是和你想的:
a: [1, 2]
b: [2, 4]
不一樣。

原因在於使用 a = b = [] 時,它也表示 a = b ,而又因為你賦給它們的值是一個可變物件 [] ,所以 a 實際上得到的是 b 的記憶體位址。於是你改變 a ,同時也改變了 b ,改變了 b ,也改變了 a 。

2007年7月21日 星期六

KDE in 絕地奶霸2

居然在電影中可以看到 KDE 桌面。

這一幕發生在男主角在偷取目標資料時,那是一台 HP 主機,而桌面竟是 KDE 的。

2007年7月20日 星期五

數學證明:S 為一有 k 個元素的自然數組合,其元素們的和、積依序為 a、b。若 T 亦為一有 k 個元素的自然數組合,其元素們的和、積亦依序為 a、b,則 S=T。

例如在 { 1, 2, 3, 4, 5, 6, 1, 1 } 自然數組合中,其積為 720,和為 23 ,是 { 1, 2, 3, 4, 5, 6, 1, 1 } 所獨有的,找不到其他同為 8 個數的組合,其積與和也等於 720 與 23 。

如果個數不同的話則有可能擁有相同的積與和,如: {3, 12} 與 {1, 1, 4, 9} 的積同為 36,和同為 15 。

證明方式如下:

首先證明在兩個個數的自然數組合中,其擁有獨特的積與和

在 X * Y = A ; X + Y = B 兩條方程式下,必定只有 1 或 2 個解或是沒有解。

本階段以函式圖說明。如下圖


兩線的交合點只有一個。而下圖


則有兩個交點,其解為 X=2, Y=3 或是 X=3, Y=2 ,但以組合的角度來看,這兩個解屬於相同的涵義。

基本上, X * Y = A 是一個凹向上的曲線,其於直線的交點只有 0, 1, 2 三種情形。又因為 X, Y 是我們任意選取的自然數,所以不會出現 0 個解的情形。所以我們可知在 2 個數的自然數組合中,必定擁有獨特的積與和。

接下來,證明在 3 個數的自然數組合中也具有相同的特性:

方程式改寫如下:
( X * Y ) * Z = A'
( X + Y ) + Z = B'
=>
A * Z = A'
B + Z = B'
=>
A * Z = A'
A + Z = B' + C
而 C = A - B

A 為自然數的積,所以它也會是自然數,於是我們得到 { A, Z } 的積 A' 與和 B' + C 是獨特的,除了 A 與 Z 之外,無法產生相同的積與和。

=> { X, Y, Z } 的積與和也會是獨特的。

最後 N+ 1 個數的自然數組合皆可由 N 個數的自然數組合推得。所以我們得知「相同個數的自然數組合,其和與積是惟一的」。

2007年7月14日 星期六

4天1200公里的旅行

2007.7.10~13墾丁、長濱、池上

我們住了三個地方:墾丁星辰民宿、長濱巴歌浪船屋、池上換鵝山房。

旅行中,我想到了一個 idea 。一份旅行日誌中可切為食、住、行及心情四個部份,我們可以分門別類地把餐廳、旅舍、路徑等相關資料變成地點、價格、使用後感受等資訊,然後用 mashup 把它們在包裝起來,應該可以比時下的旅遊網站還好使用。

目前時下的旅遊網站主要分為兩類:討論區及廣告區,一是由使用者自行提出那些地點、路線好玩再相互討論,一是由民宿業者或是觀光產業業者聯合架設以宣傳那邊值得遊玩。

而我的想法是以 Blog + Forum 為內容儲存的底層,並配合 Google Maps 作地點及路線的定義,以 AJAX 技術作 Mashup 的動作,有效分類旅遊資訊。

這次旅行的最大收獲是「曬傷」,我的皮膚不容易黑,所以這次去台東很想給它曬一曬,只是一下子過量了,有點痛、有點癢。

ps 墾丁、池上都有 3G 網路,但長濱沒有。

驚險的車禍!?

從台中回埔里的路上,在埔霧高的埔里交流道附近,發生了一場驚險的閃車畫面。

話說我剛剛還在想在這段黑暗的路上,為什麼有兩個年輕人身著黑衣,身旁停了兩台摩托車,無所事事地站著。結果在下一秒鐘就被一台斜放在車道上的黑色轎車嚇到,這轎車斜放的令人不解,此時左眼還瞥見左後方車道有一台聯結車試圖超我車,而這台黑色轎車又佔著右邊車道快一半的位置,所以我只能以相當近的距離貼著黑色轎車車頭過去。當下,我只是在想:「聯結車不要輾過我,車子可是有四條人命呀!」

我想聯結車也看到這一幕了,他也嘗試減速,不過也沒什麼幫助,因為我如果沒有貼著黑色轎車車頭閃過的話,他還是會撞上我的。

驚險過後,一直在想還好大家都有沈著應付,要不,那個人亂轉方向盤的話。這篇文章就不會出現了。

後來,一直在想,那兩個年輕人與那台不尋常停放的轎車會不會是一伙的,目的是想要製造車禍。曾聽過舅舅說過在霧峰的小路上,就有幾名不良少年在路中擺放機車,強迫路過民眾下車,再進行搶劫。

使用 Trac 的錯誤示範: Section 2

非常高興,在本文中,我們又邀請兩位知名「演員」為我們示範 Trac 的錯誤使用方法,就有請第一男主角:小強、第二男主角:阿蒙,出場!

小峰一開始在 wiki 的研討會準備事項中寫著:
  1. 要有紅茶
  2. 要買喝紅茶的吸管
  3. 記得買停車券
  4. 18日會有大頭來視察
小強後來把研討會準備事項內容改成:
  1. 要有檸檬紅茶
  2. 19日會有大頭來視察
  3. 20日記得買停車券
但小強的修改是有問題的。

小強在原本的 1、3、4 點作部份加強,這部份沒問題。然而他把原本的第 2 點完全刪除了。這是不對的,除非他明知這一點是要刪除的,但事實上不是,因為吸管是有必要存在的。

因為小強是後修改的人,所以他有責任及權利把別人之前的成果整合到自已的內容當中。要不然你刪我加,我刪你加,搞到最後,內容到底要什麼都亂了。

根本不應該要求小朋友「自動自發」

這是句吊詭的話。當你希望他「自動自發」去作某些事時,你不應該對他說:「你要自動自發呀!為什麼總是要我說呢!」你只能放在心裡期待,由他「自動自發」作到。

甚至當你說多了,慢慢地,他就愈需要你提醒他了,因為你把他制約了。

這樣他還會自動自發嗎?

「難找的全聯福利中心」只是失敗策略?我想是不會的。

看了 「難找的全聯福利中心」只是失敗策略? | 毓毓的窩 後,覺得作者分析方向不妥。沒錯,全聯福利中心的確不好找,但它的定位是給附近的人消費的,就如我是埔里人,我只要去過一次全聯福利中心,下次一定還記得它是如何去的,所以第一次的資訊成本或許很高,但去過一次之後,就為 0 元了,而這時全聯的特色就彰顯出來了,「便宜」是吸引我一去再去的惟一理由,這也是「難找的全聯福利中心」廣告的重點。

但 7-11 的定位就不是這樣了,像我這次到東部玩,要買飲料、零食時,絕不會去找全聯、大買家之類的量販店,而是有 7-11 就買 7-11 ,有全家就買全家,畢竟我不是在地人,不想花掉太多的資訊成本。

它們兩者客群不太相同,拿來比較是不恰當的。

2007年7月11日 星期三

現在在屏東海生館

用登山背包背著我的 IBM R51 , 真的滿省力的。只是不應該坐著時還背著它。因為當我坐著看著飼育人員喂食鯨鯊時,沒坐幾分鐘,我的背就開始酸了。嗯~登山背包還是應該在走路的時候用。

From 2007.7.10~13墾...


P.S. 這裡是有 3G 訊號的,也有 Hinet 無線上網。

2007年7月9日 星期一

Google Desktop for Linux


Google Desktop for Linux 終於出來了。

說到這個 Google Desktop 軟體,可是讓我們老師囋不絕口呀!我個人也是相當愛用。它最大最大的功能是可以搜尋 PDF 文件,並且建立文字索引檔。這樣每次在找文件時, Google Desktop 可以馬上把答案交給你。不像「 Windows 尋找」,每次找每次等。

這個 PDF 文件索引搜索對我們研究生來說是相當重要的。因為我們常常看人家的論文。像我下載了一堆 PDF 論文,當我想要拿某一篇來作研究或是引用時,總不能叫我每篇打開來看,然後按 Ctrl + F 來找那一篇才是我想要的!那這樣就不用畢業了。

如果你是 Windows 的用戶,請到 Google 軟體集( Google Pack )下載。

安裝實在太簡單了,我就不說了。主要的困難(也沒多難啦)是在設定你的電腦中,那些該找,那些不該找。安裝好後,請到右下角工具列上的「Google 桌面」按右鍵打開偏好設定,你就會看到如下圖:


黃色是設定你要搜尋那些檔案;紅色是你要搜尋那些資料夾,可以是整個 C 槽、 D 槽;綠色則是你強制某些資料夾或是網站不得作搜尋。

設定完後,可能要等一陣子,因為 Google Desktop 是在你電腦閒置的情況下,幫你作索引檔的。

2007年7月4日 星期三

CMClass: 蒙地卡羅應用

因 Google Adsense 政策,我不能在此 blog 上撰寫有關賭博的文章。所以如果你對於「蒙地卡羅電腦模擬」應用在小馬莉上有興趣的話且你已年滿18歲者,請移至

2007年7月2日 星期一

到底誰會寫程式?

看到 Jserv 提到 傑出的女性自由軟體程序員 。讓我想到除了女性會寫程式之外,非資訊科系的學生也可以作到,只是我目前還沒看到非資訊科系的傑出程式設計師(但這是因為我看的人還不夠多)。

程式原意是規劃,規劃出問題的解決之道。只要你能思考,又懂一點數學(至少要加減乘除),那麼你就可以作規劃了。程式設計絕非「資訊相關」科系的獨門。

事實上,我就見過一些 「資訊科系」畢業的工程師程式設計能力不足,但這不是他們的錯,因為資科、資工、資管的學生本來就不一定學得會程式設計的,想想看,如果在高中的時候誤會了自己的興趣及專長,數學不好但卻靠國文、英文考上資訊相關科系,那麼在程式設計這部份是會多吃點虧的。另一方面,資科、資 工、資管的學生也不一定會組電腦、設網路的,不要再強扣帽子在他們身上了,這好比大家也都認為土木系畢業的就一定會蓋房子一樣!

那麼對數學好的理工科學生來說,多半你己擁有程式設計的基本能力,只是待發揮而已。

那麼對理工科學生來說,為什麼一定要學會程式設計!理由我們可以從果蠅開始談起,如果你研究基因改變的原因,是在人身上著手,那麼窮其一生,你能作幾代 呢!大不了3代吧!如果是從果蠅下手呢!3天就1代,半年你就可以把數據整理好,拿來寫論文了。一樣地,作營建專案排程,如果不靠電腦,你就得靠手算,甚至得找一個工地真實模擬,那你得花多少時間呢;又或者一個機殼結構能承受多少真實外力?如果是要你先把機殼射出成型後再來測試,你又有多少時間寫論文。

現代電腦發展快速(這就是電機、電子、資訊相關科系學生的功榮了),很多現實問題的研究,我們可以利用電腦來完成。

程式的範圍太廣了,從低階的組合語言到高階的動態網頁,甚至還有應用在地震模擬、洋流模擬的程式,如果不懂背後的數學,又如果作規劃。

那麼理工科學生該學那種程式語言比較好呢!我的建議是至少學會 Python ,它什麼地方都可以用,寫系統管理、 GUI 程式、網頁程式還有它的數學函式庫支援豐富不下 Matlab ,它的資料結構簡單強大,不用學會如何配置記憶體就能上手。最重要的是它的難度適中,理工科常用的部份可以簡單學會。

2007年7月1日 星期日

讓我們為他(楊導演德昌)祝福吧!

今天的大事:楊德昌在美病逝 新聞局近日表揚

他是我最喜歡的台灣導演,他的「獨立時代」,我看不下幾十遍,快超過金庸的「笑傲江湖」了。

在幼稚的時代,他提醒我人性的虛假,讓我了解自己的辛福是自己的事。

讓我們為他祝福,遠離人世的痛苦。

2007年6月23日 星期六

挪威新研究:家中長子 IQ比較高

請看看這則有趣的新聞: http://tw.news.yahoo.com/article/url/d/a/070622/8/g7wk.html

看完之後,如果你的結論是:「呀哈!我是長子,所以我比較聰明,真是辛運。」那就遜了。

長子比較聰明不過是外顯現象,重點是長子通常要 自己學習組織思考,並教導弟妹,因此智商普遍比較高。所以如果你不是長子,你也可以透過思考及教學來讓自己更聰明。

但說到底「比較聰明」到底有什麼好,我常看到的是比較聰明的人活得不比笨蛋快樂,因為聰明人作的事得比別人多,但收穫卻比較少。

使用 Trac 的錯誤示範: Section 1

非常高興,在本文中,我們邀請兩位知名「演員」為我們示範 Trac 的錯誤使用方法,就有請第一男主角:小強、第二男主角:阿蒙,出場!

小強:學長你丟給我的 ticket ,我不太懂是什麼意思耶~
阿蒙:應該是我前天還是昨天 assign 給你的那一個吧!是不是跟寄信有關。
小強:是的,好像是叫我找 python 寄 html 的模組,我不太懂「寄 html 」的意義是什麼。
阿蒙:你記不記得你有收到一封信,內容中的連結是原始網址,像是: http://xxx.yyy.zzz/id/modeule/?pk=32ufjdaddadf 之類的東西。
小強:有大致看過,好像是這樣的。
阿蒙:那是因為我寄出信的格式是 plain 純文字檔,所以無法把網址變成真正的超連結。所以我希望你幫我找到給 python 用的模組,而讓能它寄出 html 格式的信件。
小強:那我知道了。

看倌們!看出問題了嗎?

問題1:小強在 trac 上看到一個不了解涵義的 ticket ,他想要問阿蒙,他選擇的方式不是當下打電話或是在此 ticket 上作 comment 再指派回阿蒙身上,而是選擇記在腦海中,要在某一天遇到阿蒙時「記得」問他。如果還得把「專案開發」時衍生的「溝通工作」記在腦海中,那麼 Trac 就沒有存在的意義,而且用人腦記住也絕比不上用電腦記住來的正確。

問題2:明知道小強應該會不懂你的要求,為什麼不一開始就在 ticket 上寫清楚,還要浪費一次溝通呢!

2007年6月16日 星期六

Ubuntu佔有率低 !?

有人說 Linux 佔有率不高,似乎不是事實,以我們家來說,兩台桌上型電腦、四台 NB 中,灌了四套 windows 、三套 Ubuntu 、一套 Mac OS X 及一套 Fedora 。

但除了內人外,其他人都是不太開 Windows 的。

連我的小姪女也是要用 PhotoImpact 才會進 Windows 。而為什麼她要用 PhotoImpact 呢?因為電腦老師教小學四年級學生影像處理軟體 PhotoImpact ,是的,現在小學四年級要上影像處理軟體,所以你可以知道我們是多早就起跑了吧!我想等她大學畢業後,一定可以利用「影像處理軟體」拯救全世界的,只不過要拯救全世界前,是先要繳錢給友力資訊的。

其實小姪女對 Ubuntu 還是 Windows 是什麼東西,她其實完全沒有概念,所以當我把預設 OS 是調成 Ubuntu 時,她也不會來跟我抱怨為什麼它沒有A,沒有B,反正她能用這台電腦作事、玩樂就行了。而且,我觀察她很多次,當我看到她用 Windows 時,都是在用 PhotoImpact 。為什麼小學老師會教影像處理軟體,而且還是要花錢買的??

今天,我的小姪子(小學三年級)來我家玩電腦,因為我騰不出 Windows 電腦,所以叫他玩 Fedora (其實是我不想給他用 Windows ),他也是玩的很高興,就上史萊姆的家找一些 flash game ,以及和他姐姐講 Skype ,跟到 Gmail 收信,這幾件事就能滿足用電腦的樂趣。

為什麼小學老師不把重點放在網路資訊素養上,光這個內容,小學就教不完了,還要教這種幾年後會被淘汱的東西,而且還要家長出錢。

gnome桌面的「啟動」

有時候,我們想要登入桌面系統後,能自動執行 skype, stardice 或是秀出某個網頁,也就是類似 window$ 「開始」中的「啟動」。那麼在 ubuntu linux 中,我們要到那裡設定呢!

如果你用的是 Gnome(如果你不知道這是什麼的話,那你一定是它了) ,請到「系統」=>「偏好設定」=>「作業階段」中,去新增一個「初始啟動程式」,將「啟動程式」的新徑及引數填入即可。如:
skype 是 /usr/bin/skype
stardict 是 /usr/bin/stardict
某個網頁是 /usr/bin/firefox http://www.google.com/

2007年6月8日 星期五

YouTube真的是很酷的網站

最近在 www.youtube.com 上看了不少影片,都很有趣,這收穫跟網路文章不同。真可謂
To see is to believe(百聞不如一見)。

一顆變速球的投法,用文字再這麼描述,要學會還是很難,但看著人家的慢動作示範,就容易多了;Linux的神奇,講再多,聽也不見得聽得進去,但用看的,就很難不相信了。

而這個 www.youtube.com 幾乎都是用 Python 寫的,這又讓人更感到興奮了。

再次為你獻上 Linux 的特效,這一次會結合觸控式面板。 觀看影片

2007年6月6日 星期三

誰說Vista慢的!

安裝 Vista 也可以很快,只是我們不曉得而已。這點跟作研究很像,人外有人,天外有天,千萬不要說:「這一定作不到…」。

請看看這位老兄的教學片:

Vista install in 2 minutes(兩分鐘內安裝 Windows Vista)

CMClass: GA 演算法

老師出了一題求函數最小化的問題,要我們用 Partical Swarm 求解,它與螞蟻王國演算法很類似,但尚未認真研究。先用 GA 求解。再來用 Partical Swarm 求解。

題目是:

f(x)= (x1/x2)* (sin(x2))^2 + (x2-x1)* cos(x1+10)
where
10<= x1 <= 30
30<= x2 <= 50
考題:
x1, x2 = any real value
try to find the minimum f(x)

我自已寫了一個 GA 物件(請到 https://ssvn.hoamon.info/OpenRelease/GA-0.1.py 下載,帳/密: guest/guest)

而解題的 ConvVar, FUNC 函式如下:


1 def ConvVar(chromosom): #轉換基因組到決策變數
2 variables = []
3 variables.append((int(chromosom[0]*3) + 1)*10)
4 variables[0] += int(chromosom[1]*10)
5 variables[0] += int(chromosom[2]*10)*0.1
6 variables[0] += int(chromosom[3]*10)*0.01
7 variables[0] += int(chromosom[4]*10)*0.001
8
9 variables.append((int(chromosom[5]*3) + 3)*10)
10 variables[1] += int(chromosom[6]*10)
11 variables[1] += int(chromosom[7]*10)*0.1
12 variables[1] += int(chromosom[8]*10)*0.01
13 variables[1] += int(chromosom[9]*10)*0.001
14
15 return variables
16
17 from math import sin, cos
18 def FUNC(variables): #定義目標函數
19 (x1, x2) = variables
20 if x1 > 30 or x1 < 10: return float('infinity')
21 if x2 > 50 or x2 < 30: return float('infinity')
22 sum = (x1/x2) * (sin(x2)) * (sin(x2)) + (x2-x1) * cos(x1+10)
23 return sum

我不太愛收到 .doc / .odt / .xls / .ods 的檔案

看到標題,我想熟識我的人會說,這傢伙又在踢 M$ 的 LP 了。錯!錯!錯!請看清楚標題,我也不愛 opendocument 格式的檔案喔!

通常寄這些類型的檔案有兩種原因:
  1. 內容有趣
  2. 工作上需要,需要撰寫一份圖文並茂的文章。
如果是 1 的理由,那麼「有趣」就是一個滿複雜的課題,轉寄者怎麼知道這內容是對我有趣的,如果他猜錯了,我是不是得浪費幾百KB~幾十MB的空間來放這封郵件,尤其是對某些習慣把信收到本機的人來說,收了3mb的信件後才發現這個東西看過了, X 的,浪費大家的頻寬、時間以及網路閘道器的CPU處理時間,當然這也間接提高了熱能的產生,天呀!還有人不知道「全球暖化」嗎?

如果是 2 的理由,那麼會令人困惱的是「工作流程」。我寫完這文件,先回寄給同事甲,同事甲改好了,再寄給不作事的B同事,然後等了全球平均溫度上昇了 0.000003 度時,才又回寄給我,效率全跑掉了,難怪大家都要喝 Le Power 。

還好, Google 大神知道了我們為難的地方:又想要與朋友分享快樂,又不想被人嫌,又想要圖文並茂的文章,又不想降低工作效率(員工會這麼想,老闆聽到,一定很高興)。

首先你要有 Gmail 帳號,沒有的話去申請一個吧!不用錢,又少圾垃信,空間很大,而且你要申請兩個也沒問題,不問你身份證號,不問你三圍,當然也不問你愛的政客是男是女。

再來,請到 http://docs.google.com/ ,登入你的 Gmail 帳號/密碼,接下來就看圖說話了。

點選「上載」。奇怪的翻譯,通常我們都是說「上傳/下載」的。


點選「瀏覽」。


跳出一個檔案管理員的視窗,讓你選擇本機上的檔案。眼尖的人可能會覺得這個「檔案管理員」的視窗怎麼跟一般人不一樣,沒錯,你的確眼尖,我用的 Ubuntu7.04 ,不是 Window$ XP 。


按下「上傳檔案」後,請稍待片刻,這個時間端看你的檔案及頻寬的比例。


上傳成功後,你就可以在網頁上看到你的文件了,接下來我們發佈給別人看。請按下「發佈」。


勾選「有變更自動重新發佈」。再按下「確定」。


你就可以把這個連結,附在你的信件中了,或許你該在信件內文/標題中大致說明一下這個文件是幹什麼的。如:「健康素食的吃法」、「台中夜市整理」…等。總不會,你還是要朋友點了連結後,才喊 X 吧!


如果你的朋友想看,自然可以點選這個連結觀看,不想看,也不浪費大家的空間及頻寬。

而另外,如果你希望某些人可以對這文件作修改,那麼請點選「共用」,如下兩個圖:


再填入你欲合作的作者 Email 。再按下「邀請合作者」,這樣 Google 就會寄一封信給合作作者了。


任何人在這份文件上的修改,其他人也會同步看到的,別太驚訝!(我老婆就很驚訝)它真的可以,而且這沒什麼了不起,在 Open source 界,大家都知道這不過版本控制器的一個變形。

好啦,如果你想體驗一下,但又很懶的自已作那麼多事,那就點下面的連結吧!裡面有一則好文,是幾百年前的人所寫的,到現在都適用,題目是「稼說送張琥」,我也有劃重點喔。

http://docs.google.com/Doc?id=dgkwg8bx_121cs3rng

2007年6月4日 星期一

Vista為什麼不喝Le Power

日前經朋友的要求,幫他挑了一台 HP Notebook ,在挑選時,明顯地感受到銷售廠商希望把大家趕到 Vista 環境的策略,因為能買到 XP 的 NB 已經不容易了,而且機型比較舊、價錢沒差多少,所以我忍痛推薦他買一台內建 Vista Basic 的 NB 。

到貨後,是我幫他驗貨的,而且在幫他 SetUP 的過程中,我昏了,好像看到綿羊在跳,一隻羊、二隻羊、三隻羊…,似乎數不完。「慢」是我對它的總結。

一台 AMDTurion64( 2.0G), 1G Ram 的機器 + Vista Basic 居然可以跑得比我2年前買的 NB + XP 還慢(我的 XP 也比 Ubuntu 慢),天呀!!我朋友說:「軟體本來就是愈作愈肥的呀!!」可是我用 Linux 的時候,從 Red Hat 7, 8, Mandriva 8, 9, 10, Fedora 3, 4, 5, Ubuntu 6.06.01, 7.04 一路玩過來,只覺得它是愈來愈快、愈來愈穩定、愈來愈漂亮呀!!「軟體愈作愈肥」,似乎不是趨勢,是謬論,是種行銷策略,是種推卸責任的說法。

查了一下網路上大家對這個 Vista OS 的看法,覺得大家都滿有耐心的,會找文件,會打電話問客服,會給它機會試試看,這是好事,透過一個不太好用的東西,增加你對電腦系統的了解,雖然我看到的文章多半是在搔表面的癢,不過是「去那裡抓真正的 driver 」、「先安裝 a,再安裝 b」…之類的解決方案,但畢竟是種進步吧!,把這種態度留在玩 Linux 也是很有幫助的。

這態度我在使用 Ubuntu 前也都是這樣的,有問題找文件,看 Linux 基本觀念、網路基本觀念、動手自已編譯 driver…,但現在不需要了,一方面是觀念我還沒忘,一方面是沒機會,我的 R51 裝了 Ubuntu 後,我只搬幾個設定檔,給 vim 、 screen 、 bash …等用的,其他硬體的部份,如:音效卡、顯示卡、無線網路、3G網卡、快捷鍵…我根本不需花力氣設定及安裝。

2007年6月3日 星期日

手動建立django的password

因為在 django 架構中已經包含了使用者認證,所以要照它的規矩處理使用者的密碼。

如果你想要從資料庫中手動加入一個使用者帳號呢?密碼會是你比較麻煩的地方,但其實說麻煩也不麻煩,你只要遵守 hashtype$salt$hash 這個規則就好了。目前可使用的 hashtype 有兩種: md5 及 sha1 ,而 salt 則是讓 hash 字串更亂的種子。製作密碼的程式如下:

from sha import sha
hash = sha('xxx000000').hexdigest() # xxx 就是 salt ,而 000000 則是使用者設定的密碼
print '$'.join(['sha1', 'xxx', hash]) # 結果是 sha1$xxx$7ff010c44c5ed59a6e1171020f9762313234a1cd

就把 sha1$xxx$7ff010c44c5ed59a6e1171020f9762313234a1cd 貼到資料庫的 password 欄位中就行了。

2007年5月29日 星期二

新的相片簿

我把原本放在 Gallary2 的相片全搬到 Picasa Web 了。過程還滿容易的。只可惜 Picasa Linux 版不能直接上傳本地相片到 Web 。

新的相簿在

2007年5月12日 星期六

封網二周

剩下兩週就要博班筆試及口試了。這兩周不寫 Blog 了,也少上點網。要認真唸書了。

在 re 中使用 utf8 字串

如果你在 utf8 的環境中使用下面這個語句,你會發現這是 True 的。

re.compile('[年度]').search('要旨')

原因在於中文字在 utf8 中,是2~3個碼的,如:
年:\xe5\xb9\xb4
度:\xe5\xba\xa6
要:\xe8\xa6\x81
旨:\xe6\x97\xa8

所以在 re 比對時,[\xe5\xb9\xb4\xe5\xba\xa6] 的確可以比對出 '\xe8 \xa6\x81\xe6\x97\xa8' 。

解決之道就是使用 unicode 字串,如下:

re.compile(u'[年度]').search(u'要旨')

我也申請了「Google 應用服務」

看了Google 應用服務教育版後,發現它不只限定教育機構,其他像個人、公司…皆可申請。

過去(大約1年半前),因為我十分欣賞 GMail 的功能,所以把我的 *@hoamon.info(or *@amon.idv.tw) 信箱利用 Postfix Relay 轉到 hoam0n@ gmail.c0m 。這樣我就可以利用 Gmail 介面來處理 *@hoamon.info 的信件。這麼作是因為我不知道 Google app 的原因,如果使用 Google app 的話,我就可以省下2台 Postfix 伺服器了(是的,我還有作備援喔)

申請方式很簡單,只要你完全擁有1個 domain name ,可以設定 MX 及 CNAME 記錄的就行了。申請時,我還非常客氣地只寫下20個帳戶,沒想到 Google app 直接幫我升到50個。

現在,我可以停掉兩台 Postfix 了,而且我相信郵件接收的妥善率絕對比以前更高。

2007年5月11日 星期五

django處理靜態資料的方法

感謝 yungyuc 提醒,我看過 stitac_files 文件後,重新整理如下:

方法目前有3種:
1、使用 mod_python
利用高效率的 Apache 幫你處理,設定檔範例如下:
 1 <VirtualHost *:80>
2 ServerName somedomain
3 <Location "/">
4 SetHandler python-program
5 PythonHandler django.core.handlers.modpython
6 PythonPath "['/path/to/djangoproject_parentpath'] + sys.path"
7 SetEnv PYTHON_EGG_CACHE /tmp
8 SetEnv DJANGO_SETTINGS_MODULE djangoprojectname.settings
9 PythonDebug Off
10 </Location>
11 Alias /media /path/to/djangoproject_parentpath/djangoprojectname/media
12 <Location "/media">
13 Options None
14 SetHandler None
15 </Location>
16 ErrorLog /var/log/apache2/somedomain_error.log
17 LogLevel warn
18 CustomLog /var/log/apache2/somedomain_access.log combined
19 </VirtualHost>

這種方式應該只用在 product (上線模式) 中,在程式開發時,是不應使用這種方法的(除非你不厭其煩地下 sudo service httpd restart)。而這種方式的輸出效率是最快的,不須透過其他程式,直接從 Apache 輸出,但缺點是沒有彈性,如果你的專案中,有分多個 apps 的話,你得手動把 apps/media 放到 media 中。但這點麻煩還算可以忍受的,如果你的網站是成千上萬人用的話。

2、使用 django.views.static.serve 函式
在你的 urls.py 中設定如下:

(r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/path/to/media', 'show_indexes': True}),

show_indexes 選項的意思是「要秀出這個資料夾下的所有檔案嗎」,預設是 False ,也建議你用 False 。 '/path/to/media' 可以是相對路徑也可以是絕對路徑。而 site_media 不要與你的 settings.py 中的 ADMIN_MEDIA_PREFIX 設定相同。相同的話,會造成上線模式及開發模式的行為有所不同,增加困惱。

使用這種方法的優點是你的 media 資料夾可以跟著 apps 跑,而且上線及開發模式所使用的資料夾架構是一樣的。缺點是少了效率及多了安全隱
憂。

3、使用 limodou 開發的 staticview.py
staticview.py 是延伸了
django.views.static 的程式,多了一項功能,可以比對整個專案下 apps 的 media 資料夾,讓你的靜態文件,只需要放在某一個 app/media 下即可。設定方式略有不同:

(r'^site_media/(?P<path>.*)$', ' myprj.utils.staticview.serve', {'document_root': '/path/to/media', 'app_media_folder':'media', 'show_indexes': True}),

多一個 app_media_folder 設定值。

本文已修改,若要看舊版錯誤,請看本文的原始碼。

Related Posts Plugin for WordPress, Blogger...