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月23日 星期三

add empty directory in the Mercurial

I lost a lot time to add directory in the Mercurial, because Mercurial can't add empty directory to the working base. I search some many web pages to find out how, and the answer is so simple: put a file in the empty directory, and hg add xxxDir.

i lost one hour for that.

2008年1月22日 星期二

Trac0.11b1 + Mercurial + Postgresql

基於對 Python 的喜愛,所以想要把 subversion 換成 Mercurial ,但目前還只是測試階段,真正上線使用的還是 subversion 。另外一直都想要找個機會把 Mysql 換掉,到不是說 Mysql 不好用,而是我對於 PostgreSQL 本來就有一分感情,那是在 Mysql3,4 還不支援 UTF-8 時,我用 Perl 寫了一個 unicode 字的查詢系統。

而今天所要介紹的,不過是我在工餘之際把玩的小小玩意,既然成功了,那就作個紀錄。

在 Ubuntu 安裝軟體是一點都不難的(只要有 .deb 檔),所以要裝 Trac + PostgreSQL + Mercurial ,請執行下面指令:

# sudo apt-get install postgresql-client-8.2 postgresql-8.2 python-psycopg2 \
> python-setuptools python-genshi \
> python-psycopg2 python-pygments python-docutils mercurial

接下來,安裝 Trac 0.11b1 主程式
# sudo easy_install http://ftp.edgewall.com/pub/trac/Trac-0.11b1.tar.gz

最後安裝 Trac 控制 Mercurial 的外掛
# svn co http://svn.edgewall.com/repos/trac/sandbox/mercurial-plugin-0.11
# cd mercurial-plugin-0.11/
# sudo python setup.py install

再來是設定,首先我們建立一個 dbuser ,這方面, PostgreSQL 有點奇怪,或許是我 Mysql 用久了,
# sudo -u postgres createuser trac -P
Enter password for new role:
再輸入一次:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
CREATE ROLE
# sudo createdb -O trac trac
並將 pg_hba.conf 中的
local all all ident sameuser
改成
local all all password

這樣你的 trac 程式就可以透過帳號: trac 密碼: trac host: localhost 的方式與 PostgreSQL 連接了。

接下來,初始化 trac 設定目錄及 hg 儲存庫:
# trac-admin /path/to/myproject initenv
# hg init /path/to/myproject/hg

另外在 trac.ini 中加入
[components]
tracext.hg.* = enabled

[hg]
show_rev = yes
node_format = short

用 tracd --port 8000 /path/to/myproject 測試一下有沒有問題,沒有問題就讓 mod_python 來跑吧!

下面則是 mod_python 的設定檔

NameVirtualHost *:443

ServerAdmin admin@xxx.com
ServerName trac.xxx.com
DocumentRoot /www/trac

SetHandler mod_python
PythonHandler trac.web.modpython_frontend
#PythonPath "sys.path+['/usr/local/Trac/lib/python2.5/site-packages/']"
PythonOption TracEnv /www/trac
PythonOption TracUriRoot /
PythonDebug Off
SetEnv PYTHON_EGG_CACHE /www/trac/tmp
SetEnv LANG UTF-8
SetEnv HTTPS 1
AuthType Basic
AuthName "Trac Server"
AuthUserFile /www/htpasswd_users
Require valid-user

ErrorLog /var/log/apache2/trac_error.log
LogLevel warn
CustomLog /var/log/apache2/trac_access.log combined
ServerSignature Off
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem

世界是平的

這本書出了好一陣子囉~兩年前曾在台北某家誠品看到,翻了幾頁,印象最深刻的是作者有談到 Open Source 。前幾天看了朱學恆的 你說《世界是平的》,我知道了,然後呢? 的文章,就想好好地把這本書看完。

花了幾個小時把它看完,似乎沒得到新解,當然不是它沒料,是我太晚看了。很多的觀點,我在其他的趨勢文章、 Discovery 、教育的未來都見過了。或許他們也參考了 Thomas 的書。

現在是資訊爆炸的時代,也因為科技讓我們大部份的人都站在平等線上,這的確是令人煩惱的一件事,因為我們不是起飛中的印度人、中國人。不過看看歷史,就知道這根本不是新煩惱,過去,我的老師解工程問題時,拿的是計算尺、計算機,而我唸大學時是拿計算機,但是現在,我們都用電腦跑程式了。

N年前,蘇軾就告訴我們:「厚積薄發、博觀約取」了,只會用死蠻力耕田,那就種到死吧! 任何一項工作都應該是要拿一部份的精力去學習新的事物,來把你的耕田面積擴大,而不是讀到 18 歲,用蠻力作事到 65 歲退休。只要懂得終身學習,那就可以應用在無窮的未來,是的,只要懂得「終身學習」,不過這對很多人來說是個大問題呢!

雖然說是「資訊爆炸」的時代,但 1000 筆資料中,只有 10 項資訊及 1 種知識,何必怕那日益增加的資料,學會知識就夠了。就拿讀「世界是平的」這書來作例子,我從很多趨勢文章、 Discovery 影片、新聞中也看到了全球化、新科技對未來的改變,但這本書都幫我整理好了,而我只花了 6 個小時多就看完,而且看完後,我只須要記得 10 輛推土機、三大匯流、勞斯萊斯不賣車子、科學教育重要性、開放比壁壘好、人民生活水準提高會不想戰爭及美國政客也很爛就夠了,我不須要記得 400 頁的文字。

「資訊爆炸」及「全球化」不可怕,可怕的是你不會學習。

2008年1月13日 星期日

中央民意代表的多樣性

單一選區制讓立委名額愈少對大黨愈有利,約化的效益愈高,也致使立委多樣性降低。

但就立委工作性質而言,如果名額增加則選區的畫分會愈小,如此必使立委專心地方事務的經營,而忽略中央事務。

那麼如何讓立委選區畫分大、總名額少、保持多樣性且不致使小黨泡沫化。

除了區域名額轉移到不分區名額的方法外,我提出另一種想法,這是從 bayesian classifier 中得到的靈感。要建立貝氏分類器,其依據的歷史事件至少要出現一次,否則無法預測。

舉例來說:我們手上有一份歷史資料,是談「年齡幾歲」、…、「是不是學生」與「是否買電腦」的數據,然而在這份資料中,怡好沒發生過「年齡為60~65歲」的人買或不買電腦的紀錄,那麼利用這份資料所建立的貝氏分類就無法預測「年齡為60~65歲」的人會不會買電腦。但不能預測不代表這事件不會發生,所以我們可以透過 Laplacian correction 的技巧,讓我們的分類器可以拿來預測「年齡為60~65歲」的人會不會買電腦。

Laplacian correction 的方法是將所有的「年齡幾歲」事件發生次數都加一。也就是把
「年齡為20~25歲」的出現次數加一
「年齡為25~30歲」的出現次數加一
...
...
「年齡為60~65歲」的出現次數加一

這樣對整體事件出現的機率影響不大,卻變成可以預測「年齡為60~65歲」會不會「買電腦」。

利用 Laplacian correction 的概念,我們把它應用在不分區立委上,設定一最低門檻(一定要比不分區計席門檻還低),假設是 0.5 % 或是 3 萬張選票,只要過此門檻的政黨一律可分得一席觀察員立委,它的職務權利是否等同一般立委可再討論,但如此作來對立院的政黨比例來說影響十分小,以本次政黨得票數來看,用 5 萬張選票作門檻,其新的立委名額分配如下:

由上可知,對大政黨來說,比例影響不大,如國民黨依舊在 2/3 以上,但對小黨而言,卻是無及有的區別,同時,也讓國會的立委來源多樣性,一般選民也可增加對其他政黨的認識機會;讓小政黨提早進入國會實習也有助未來長大之後的立法品質及效率。

2008年1月10日 星期四

AM02:00~AM06:00斷網,這很好呀!

我是興大的學生,只不過沒住在宿舍。日前聽說學校為了讓學生「專心唸書」,所以在AM02:00~AM06:00斷網,這個措施備受爭議,後來是延到下學期才開始。

我個人覺得十分可惜,就一個愛唸書、愛上網找資料的學生來說,這項決定太晚執行了,也執行的太晚了。

撇開那些用學網下載非法軟體、音樂、著作的學生來說,就算是在 AM06:00~AM02:00 之間,也不能作這種事情,所以我只談對「愛唸書、愛上網找資料」的學生,其權益受了什麼影響。

我個人認為:根本沒有影響。試想 AM02:00~AM06:00 這四個小時,拿來睡覺都不夠用了,一個「愛唸書、愛上網找資料」的學生,他應該是在 AM06:00~AM02:00 之間好好地唸書、找資料,在學生時代就應該培養一個規律的生活習慣:不熬夜、常運動、多讀書,而最好的睡眠時間應該是 PM10:00~AM02:00 之間的,所以我還認為學校斷網的時間太晚了,應該早一點,移至 PM10:00~AM02:00 。

很多人跟我說,在你寫一個程式或是調一個系統作不出來時就是不干心呀! 是的,我也是這樣,但我們應該要學習放手,你的人生不是這個程式或是系統搞定,就一定成功的,你的未來還有無數的程式及系統要搞。

也有人說:「AM02:00~AM04:00的期間正是文思泉湧的時候,這時候不工作對不起自己的效率」。然而,請仔細想想,是什麼原因讓你在 AM02:00~AM04:00 的期間才文思泉湧的,不就是過去不好的習慣所造成的,同樣地,也可以用好習慣把它調回來。

說到底,為什麼不讓人在 AM02:00~AM04:00 作事呢! 因為我們不是蝙蝠,是日行性動物,我們應該要熱愛陽光的,這是天性,不要逆天而為。

穩健而長遠的學習/工作習慣比較重要。這點請看我之前的文章:0.02秒的差距

而事實上,對那些家長而已,健康應該是比讀書及上網還重要的一件事,而對學校來說,付學費的是家長,也不是學生,所以我認為學校及家長的決定非常好。

如果不想挑爛蘋果! 怎麼作?

把自己的政見寫成白皮書放到網路上供他人指教,再把工作項目放到 Trac Ticket 中,讓他人追蹤。

最後湊 20 萬(也可從網友中募款)參選吧! 選舉過程中,不插旗幟、不買廣告、不發傳單(也就是不花錢)。然後抱持著「選上是人民的福氣,選不上是自己福氣」的態度等待選舉結果。

如果選上了,好好地把 Ticket 中的工作完成。我想這種人多了點,會是台灣的福氣。

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.
Related Posts Plugin for WordPress, Blogger...