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/

何岳峰 敬上

2008年1月6日 星期日

The problem of moinmoin for adding MathML support

Environment
MoinMoin version: 1.5.8
ASCIIMathML.js version: 2.0.1

I can use $ Z_if $ to show math expression. But when i run to edit page in text mode,the expression was replaced to

<p align="center">\displaystyle$ Z_if }$</p>

by ASCIIMathML.js

Because i don't know the structure of moinmoin, so i hard code the raw source. Around the 1271 line of MoinMoin/wikiutil.py.

Replace the line

user_head = [request.cfg.html_head]

With

----if request.query_string.count('action=edit'):
--------user_head = ['']
----elif request.form and ( request.form.has_key('button_spellcheck') or
----request.form.has_key('button_switch') or request.form.has_key('button_preview') ):
--------user_head = ['']
----else:
--------user_head = [request.cfg.html_head]

Maybe someone else has better solution.

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 的讀者個個都是天才,口說無憑,有圖為證。
Related Posts Plugin for WordPress, Blogger...