一月 14, 2012

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 「作弊的文化」讀後感

---- 聲明開始 ----


要檢討別人前,先自我檢討。

過去我曾在工作上,利用公司列表機印了幾本 PDF 書籍(大概幾千頁吧!),想當然耳,那些 PDF 檔還是違反著作權抓來的。印了近 10 本後就不這麼作了,因為浪費我的時間,印出來後還得整理裝訂,有時候列表機卡紙,也得自己處理,這根本就是打自己巴掌。於是,我直接花錢請印刷店處理,雖然書錢是自己出的,但一樣不脫「違反著作權」這條法令。等到會上 amazon 買書後,就不印了。買原版的書又精美,又對得起作者,何必跟自己良心過不去。當時自己印得不精美的書,後來也是全丟了,真對不起那些樹木。


另外在軟體使用(N 年前)上,也盜了不少的軟體: Matlab, MS Office, Windows 2000, Windows XP, 嘸蝦米輸入法, Dreamweaver, VisualBasic 6...。後來接觸 Open Source 後,一個一個戒掉了,因為要花錢的軟體,沒有比較好用。現在我用 Ubuntu Linux, Python, Netbeans 來工作,偶爾要用 MS office 時,就把裝在 VirtualBox 裡的學校授權 windows xp 打開,然後使用學校授權的 MS office 來看文件。是的,沒錯,中興大學花了一筆微軟授權費讓我可以在受到他人強迫時,不致於違法。


現在算來,我只有「嘸蝦米輸入法」是自己花錢買一套的,至今未買過其他軟體,當然這不含強迫中獎的微軟隨機版 OS ,還好後來的廠商自己也知道這不合理,所以我才買得到無 OS 的 Notebook 。


最後是音樂、電影,過去會用 emule, bittorrent 等作違法下載,但自從有了中華電信 MOD, 網樂通, Youtube 後,就不這麼作了。以前抓電影,還得自己找字幕、種子。用 mod, 網樂通方便多了,不過花個幾十塊而已。而音樂多半就聽我以前 CD 轉來的 OGG ,要不然就是在 youtube 上找 MV 來聽。


用 mod, 網樂通看電影很不錯,但還是有個缺點,電影類型不夠豐富,違法下載已有一堆網址了,但至今我還看不到「全境擴散(Contagion)」有在上映。只能繼續等,要不就是去買它的 DVD ,不過,現在好像也沒得買合法的。別叫我買 amazon 的 DVD ,我自認英聽還不夠好,沒字幕我是看不懂地。


我大學時是很少考試作弊或是抄別人報告的,要不然就不會被當了三十幾個必修學分,像我的結構學考試向來都是拿 6 分的,因為抄一題題目,老師會給 1 分,我乖乖地抄了 6 題。印象中,只有一堂經濟學考試是幫同學作弊,給他看答案,其他應該沒了吧! 如果還有,那就是我記性不好想不起來了。而研究所以後,我開始認真讀書了,不但成績比大學好很多,也不蹺課了。


以上,大概就是我過去作弊的事。


---- 聲明結束 ----


某日幫老婆在中教大圖書館找書時,不小心看到的一本 2006 年出版的書:「作弊的文化」。

以前很喜歡逛書局、圖書館,有興趣的題材當然會翻,但更有趣的是因為工作人員排列習慣不同,常常會發現一些原本我沒機會瞄到,但事後卻發現很令人驚喜的書。雜食是件好事,這在我接觸「指數投資|被動投資」後體會更深。也在塑化劑事件後,對入口食品改採混亂原則。以前我中餐吃飯時可以連吃同一家的陽春麵半年,也不會受不了,當時的想法很簡單,這世界就那麼多家店讓我吃,如果累計起來,這碗陽春麵總共吃了 180 次,那我就連續吃完 180 次後再去煩惱要改吃什麼,省得我每天花心思在思考吃什麼。但現在不這麼作了,我怕連吃某樣食物半年,體內單一毒素太高,一次就畢業了。混著吃,不同毒物的累計量會平均一點。

這本書題材很特別,主要介紹美國氾濫的作弊文化: 學生考試作弊、購買或抄襲他人報告、入學及畢業資格花錢買來、假造學經歷、律師浮報鐘點、會計師協助作假帳、逃漏稅、侵佔公司資產(包含小物件,像是筆、紙)、使用禁藥、以商逼官或是商人去當官人…等現象。

作者提了一些改正措施,不過,我不相信他講得是對的。因為就算他講得對,也無法施行改正來證明措施正確。那當然他也歸納了一些想法來論述為什麼美國人會作弊,這作弊現象是由來已久,還是最近才興起的。同樣地,我也不相信他的歸納,因為我看過「黑天鵝效應」,歸納不見得是有意義的。

那這本書到底對我有沒有價值? 有! 當然有,看這本書,能夠讓我了解美國人作弊的手段有那些,只要作者是誠實以對,是科學訪談來的資料,就能讓我對美國生活有進一步的體會,這就是對我的價值。

學生考試作弊、購買或抄襲他人報告、入學及畢業資格花錢買來、假造學經歷這幾樣也可在臺灣社會體會到,這應該不難想像吧! 而且美國是更氾濫的。因為美國有很多"""高級"""私立學校是可以被「錢」操控的,建議各位可以去看看「女人香」這部電影。

而律師浮報鐘點,可以去看看「黑色豪門企業」這部電影來一窺全貌。

會計師協助作假帳,可以去看看「世界通訊」、「安隆」的倒閉新聞。

在逃漏稅部份幾乎是全民運動。在「蘋果橘子經濟學」中,也提到某一年全美國少了幾百萬個小孩,因為國稅局全面電腦化,可以比對大家的扶養子女是否有重複。

侵佔公司資產(包含小物件,像是筆、紙),我印象中好像有部電影提到職員拿到公司的信用卡後,結果大刷特刷的,忘了是那一部了。

使用禁藥部份請看艾拉馬奎爾麥可強森的故事。

以上作弊的事就請各位自行搜尋資料或是去看本書來深入了解。我想要討論的是「以商逼官或是商人去當官人」這種事。而且想從美國的現象來討論臺灣在這一部份的問題。

商人當官人,在臺灣政壇上,好像只有發生在「縣市首長」及「立委、議員」上,內閣部份就我印象以來,大概都是國營的金融相關事業董事長後來會當到財經首長,像是彭淮南先當中國商銀董事長後轉任中央銀行總裁,陳裕章從第一金董事長作到金管會主委,好像只有陳沖有當過合庫銀、中信證(民營)、永豐金(民營)董事長後再來作金管會主委及行政院副院長,其他的首長多半是先當官人,後才去當商人的,像是顏慶章、邱正雄、林全。就商人來當官人這件事,我覺得中華民國的防火牆作得還不錯。不像美國,一堆財政部長都是從華爾街跑去的,這一點可去看「高盛陰謀」來略知一二。

商人當官人有什麼不對? 如果是靠選舉選上的,那我沒話說,民主時代,選民接受商人當首長,也了解他會有利益衝突但還是讓他選上,這我沒話說,選後是大家一起承擔的。

但如果是指派的,那就大有問題了。因為無法直接監督,卻又得面臨他瓜田李下,所以可以看到 2008 美國次貸後,高盛活得比貝爾斯登、雷曼兄弟、美林、摩根史坦利還好。要不然,你們也可以想像一下,公共工程委員會主委曾任職於某家營造廠,那他監督的了舊公司所承攬的公共工程嗎? 搞不好,有些還是他經手的呢! 所以幸運的是這種事在中華民國不常發生。這值得慶祝。

而「以商逼官」這件事,我覺得臺灣就很嚴重了。當然,還沒有比美國嚴重啦。


上面這部影片,提到「公司」撥出大量的行銷支出去為候選人宣傳,這無非是希望將「有利於公司」的候選人送進政府體制中,在行政、立法方面協助公司經營。

除了送「合宜候選人」進政府體制,另外還有「形塑輿論」以迫使公務員執行政策轉向,因為公務員『買廣告』去宣傳政策是件不容易的事。要『買廣告』去宣傳,通常只能用在『拍馬屁』上。

有幾件類似『形塑輿論』的事,我分享給各位,但也有可能是我錯了,畢竟『形不形塑』都應該是檯面下的事:
  1. 別讓彭淮南總裁變成下一個袁崇煥!
  2. 證券交易所得稅會讓政府抽很多錢,導致沒有利潤。
  3. 立委名額太多是導致國會亂象的主因,所以我們要刪減立委名額。
第一項,中央銀行的作為是不容外界質疑的,它也不受其他首長的管理,那新聞、報紙講新台幣該不該升值、貶值,幹麼? 削總裁威信,看能不能讓高層換個人,如果不能,或許也能逼總裁心死離職。總之,一個獨立性機關建立了,也找了個正確人選進去,那再指三道四都是不對的。

第二項,很多股民在郭宛容事件後,堅信課徵證所稅是件可怕的事,他們不管租稅正義,只在乎股票表面價值。於是,永遠都是在分皮毛,然後讓大戶吃香喝辣。

第三項,刪減立委名額後,可以看見國會的政黨種類急速減少,從2004年2008年的結果看來,2004年泛藍 128 名,泛綠 147 名,其他有 148 名,小黨比例佔有 35 %,而 2008 年泛藍有 114 名,泛綠有 101 名,其他有 16 名,小黨比例佔有 7 %。小黨比例急速萎縮下,失去了政策多樣性。企業要買通立委,也可以花比較少的人力、金錢。這對弱勢團體來說,只有更失去支持聲音,看不來有什麼其他好處。

另外,還有一種是我覺得「大有問題」的「輿論」:「公務員領得錢比人多,事作得比人少」。

醜化公務員後,要幹麼呢? 首先大家都認為他們爛,所以就不介意立委們削他們預算,甚至讓機關合併但員額減少。事變多了,人卻少了,那他們就不能管那麼多事了。他們不能管那麼多事後,則「黑心企業」就爽啦! 沒人力來稽查業務,甚至要打通關節時,需賄賂的人沒那麼多,這對「黑心企業」都是成本下降的好機會。如果我開的是「黑心企業」,「醜化公務員」絕對是一條好策略。

在「作弊的文化」中,它也提到 IRS 被削弱資源,使得他們無法向逃漏稅的有錢人提出訴訟,因為有錢人有能力與 IRS 乾耗。使得他們只好把目標對向一般平凡百姓,這一類人往往無法找到高級稅務律師反辯。諷刺的是 IRS 資源正是被廣大的美國百姓要求刪減的,因為他們極度討厭稅務員。

簡單講,老鼠去說貓的壞話,結果主人相信了,還把貓趕走,那接下來是誰的天下?

但是話說回來,我們如何能分辯什麼是正確的「輿論」。

首先,別相信「廣告」:


這個廣告聽說效果很好。讓很多人下定決心投給那個團隊,不過,仔細想想,這「準備好了」四個字,講也只花了 5 秒鐘。但一個政策執行要花多少時間,像蘇花高從環島路網決策成形、選址、測量、工法決定…也花了幾十年了。你聽到「準備好了」也是花 5 秒鐘,但你該相信嗎? 另一個有「魔力的廣告詞」是「馬上好」,很多人聽到這句話後,就莫明奇妙地把票奉上了。我覺得很可笑。

第二個,要分得清那個是「廣告」:

看雜誌時,出版商常常把廣告作成報導本文,如果你沒能力分得出來,那如何知道那個是忠實報導,那個是自吹自擂。不過,像這類會把「廣告」及「本文」混合的出版商,最好把它們的讀物當作資源回收物,看過即忘。

第三個,少看新聞及雜誌,多看點書(也就是第一手資料,像是候選人政策白皮書):

了解政治或是選擇正確人選,從新聞、雜誌上獲得的幫助不大。多看點書來了解你想要的理想世界是什麼,這樣你才有學識去要求候選人作到。然後要看候選人政策白皮書,這樣你才知道,這個候選人到底想要作什麼,你也才有得選擇,別去聽新聞記者的轉述,二手資料常常是錯的。

最後我的結論是「了解作弊的手段是有助不作弊的人贏得比賽的法門」,所以不管你想不想、愛不愛,都得了解「作弊的方法」。

八月 4, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» Connect MS SQL Server with python-pymssql

Two years ago, i writed a blog: "How to connect MS SQL Server with Python in the Linux OS?". I used freetds + python-sybase in this Howto. Now i have to upgrade the linux server to x86_64 architecture(original in i386), then the old python-sybase package have always been failured. The newest version released at 2010 DEC, but i tried all the 39, 38, 36 versions that no one can compile accurately.

Fortunately, my underclassman talked to me about python-pymssql. And it has been packaged in the Ubuntu, so i just use the magic command:

$ sudo apt-get install python-pymssql

My Linux server takes the power back!!!

The usage likes python-sybase, below is the example:


1 #!/usr/bin/env python
2 import sys, datetime, pymssql
3 from types import IntType
4
5 DB = {
6 'ip': '127.0.0.1',
7 'port': '1433',
8 'user': 'user',
9 'password': 'password',
10 'database': 'database',
11 }
12
13 try:
14 Database = pymssql.connect(host=':'.join([DB['ip'], DB['port']]), user=DB['user'], password=DB['password'], database=DB['database'], as_dict=True)
15 except pymssql.OperationalError, msg:
16 print "Could not Connection SQL Server"
17 sys.exit()
18 else:
19 DBCursor = Database.cursor()
20
21 sql = "select * from data_table"
22 print('sql: %s' % sql)
23 DBCursor.execute(sql)
24
25 while 1:
26 row = DBCursor.fetchone()
27 if not row: break
28
29 for k, v in row.items():
30 if type(k) == IntType: continue
31
32 if k.lower() in ('some_date_field', ):
33 # change field type
34 if type(v) == datetime.date:
35 value = v
36 else:
37 try:
38 value = datetime.date(*time.strptime(v, '%Y/%m/%d')[:3])
39 except:
40 value = None
41 else:
42 value = unicode(str(v), 'cp950')
43
44 print('%s => %s'%(k, v))

六月 11, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» Install Python2.5 on Ubuntu 11.04 x86_64 for Google App Engine

之前所提的「Install Python2.5 on Ubuntu 10.04 i386 for Google App Engine」,主要是在 i386 Ubuntu 的安裝方式。我這一次換了電腦,也裝了 Ubuntu 11.04 amd64 的版本,所以安裝方式有些許不同:

1. 系統內建的 sqlite 函式庫無法連結。
2. 某些 .so 檔不再放在 /usr/lib ,而是在 /usr/lib32, /usr/lib64, /usr/lib/x86_64-linux-gnu 等地。

另外在安裝 python2.5 時,也想順便套上 readline 及 ipython 。以下是安裝過程:

先裝上 Ubuntu 內建的函式庫:

$ apt-get install liblcms1-dev zlib1g-dev libfreetype6-dev libjpeg62-dev libsqlite3-dev libssl-dev tk-dev libreadline-dev

安裝 sqlite3:

$ cd sqlite-autoconf-3070603/
$ ./configure --prefix=/usr/local/sqlite3 --enable-readline --enable-threadsafe --enable-dynamic-extensions
$ make && sudo make install

安裝 Python2.5.6:

$ cd Python2.5.6/
$ ./configure --prefix=/usr/local/python25 --with-zlib -with-zlib-library=/usr/lib/x86_64-linux-gnu --with-zlib-include=/usr/include --with-tk --with-tk-library=/usr/lib32 --with-tk-include=/usr/include --with-tcl --with-tcl-library=/usr/lib32 --with-tcl-include=/usr/include --libdir=/usr/local/sqlite3/lib --includedir=/usr/local/sqlite3/include --with-freetype2 --with-jpeg --with-readline
$ make && sudo make install

安裝 ipython

$ cd ipython/
$ sudo /usr/local/python25/bin/python2.5 setup.py install

安裝 GAE 相依模組 ipaddr:

$ cd ipaddr-2.1.1/
$ sudo /usr/local/python25/bin/python2.5 setup.py install

安裝 GAE 相依模組 python-ssl:

$ cd python-ssl-1.15/
$ cp -rf ../Python2.5.6/Include/* /usr/local/python25/include/ # 需要 Python 源碼
$ sudo /usr/local/python25/bin/python2.5 setup.py install

安裝 PIL:

修改 Imaging-1.1.7/setup.py 中的參數如下:

TCL_ROOT = '/usr/lib32'
JPEG_ROOT = '/usr/lib32'
ZLIB_ROOT = '/usr/lib/x86_64-linux-gnu/'
TIFF_ROOT = '/usr/lib32'
FREETYPE_ROOT = '/usr/lib32'
LCMS_ROOT = '/usr/lib32'

檢查模組是否可使用

$ /usr/local/bin/python2.5 setup.py build_ext -i

測試模組

$ /usr/local/bin/python2.5 selftest.py

看到如下訊息,就代表模組皆有支援

 --- PIL CORE support ok
 --- TKINTER support ok
 --- JPEG support not installed
 --- ZLIB (PNG/ZIP) support not installed
 --- FREETYPE2 support ok
 --- LITTLECMS support ok

再執行

$ sudo /usr/local/python25/bin/python2.5 setup.py install

最後,再把 dev_appserver.py, appcfg.py 中的 #!/usr/bin/env python 改成 #!/usr/bin/env python2.5 即可(也不是必須的,只要你知道執行 GAE server 時是用 python2.5 就夠了)。

完成後就可以在 Ubuntu 11.04+ x86_64 中開發 GAE 程式了。

四月 27, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» CMClass: 簡述 libsvm(Support Vector Machine library) 使用方法

libsvm乃台大林智仁老師開發的 Open source 工具,其目的為實作 Support Vector Machine 分類器,使用語言主要是 C++ ,目前也有 JAVA 版本,也提供其他語言的 wrapper ,像是 Perl, Python, Ruby, Matlab, Hashkell, Lisp 等。

詳細數學就不介紹了,怕大家睡著(但其實是因為還沒看懂),各位可以看一下下面那段這個影片,大略了解 SVM 分類器如何區別不同資料。



本文章主要介紹的是用 Python 語言去操作 libsvm 函式庫。

先解壓縮 libsvm.tgz 檔,可以看到 python 及 windows 資料夾,如果要在 Linux 中使用的話,請在主目錄中作

$ make lib

這樣會得到 libsvm.so.2 檔,這是 libsvm 的主函式庫,而在 windows 中使用的話,它則是先幫你編譯好這個檔了,可在 windows/ 找到這個 libsvm.dll 檔。

在 Linux 中,請把 python/*py 放到 /usr/local/lib/python2.6/site-packages 中,而 libsvm.so.2 放到 /usr/local/lib/python2.6/ 。

在 windows 中,請把 python/*py 放到 C:\Python26\Lib\site-packages 中,而 libsvm.dll 請放到 C:\Python26\Lib\windows 資料夾中(因為 svmutil.py 寫死了它的相對路徑,所以務必依它的相對位置置放)。

請在 Python shell 中,鍵入下列指令,測試是否安裝成功。

>>> from svmutil import *
>>>

沒錯誤訊息,那就是安裝對了。

使用 svm ,主要就是兩個動作: 訓練及預測。

訓練:

svmutil.svm_train 函式的引數有「類別標籤」、「觀察值」、「參數」。

你的原始資料若是如下:

1. 3, 4, 5, 6 => 第二類
2. 3, 4, 5, 5 => 第一類
3. ....

前面的 #. 表第幾個觀察值,後面逗號分隔的數據為各維度的值,行末則是放置該觀察值為第幾類的說明。請把它轉成

>>> Y = [2, 1, ...]
>>> x = [(3, 4, 5, 6), (3, 4, 5, 5), ...]

類別標籤請獨立放置到一個 list 中,而觀察值維度則依序放置到另一個 list 中。接下來,就能使用 svm_train:

>>> from svmutil import *
>>> model = svm_train(Y, x, '-c 4')

所得到的 model 就是一個經過訓練的分類器。

預測

接下來,我們要拿訓練好的分類器去預測新的觀察值:

>>> p_label, p_acc, p_val = svm_predict([0]*len(new_x), new_x, model)

而 p_label 就是依 new_x 順序所對應的類別標籤 list 。

下圖是我隨機生成的 300 點,圓點為原始的觀察值,而以線相連的連續點則是預測點。



詳細程式碼請參照如下:

 1 #! /usr/bin/python
2 # -*- coding: utf8 -*-
3
4 __author__="hoamon"
5 __date__ =u"$2011/4/12 下午 05:52:31$"
6
7 from math import pi, sin, cos
8 from random import random
9 from matplotlib import pyplot as plt
10 from svmutil import *
11
12 def circleData(centre, radius, down_limit_percent=0, lens=100, range=[0, 100]):
13 points = []
14 while len(points) < lens:
15 _angle = 2 * pi * random()
16 radius_percent = random()
17 if radius_percent < down_limit_percent: continue
18 _radius = radius * radius_percent
19 x = centre[0] + cos(_angle) * _radius
20 y = centre[1] + sin(_angle) * _radius
21 if range[0] <= x <= range[1] and range[0] <= y <= range[1]:
22 points.append((x, y))
23 return points
24
25
26 def test():
27 u""" 製作三群的隨機資料,每群皆 100 個點,點位置的 x, y 限制在 0 ~ 100 之間
28
29 最後利用 matplotlib 繪製出來的圖,"單點"表原始資料,而連續點畫線的部份,
30 該點位的類別則是利用 svm_predict 計算出來的。
31
32 Y = [1, 1, 1, ..., 2, 2, 2, ..., 3, 3, 3, ...]
33 x = [(x1, y1), (x2, y2), ...]
34 """
35 Y = [1] * 100 + [2] * 100 + [3] * 100
36 x1, x2, x3 = (circleData((35, 40), 12),
37 circleData((35, 40), 48, down_limit_percent=0.25),
38 circleData((80, 80), 20)
39 )
40 x = x1 + x2 + x3
41
42 m = svm_train(Y, x, '-c 4')
43
44 #INFO 在 100x100 的畫布上,打出 40000 個點,拿這 4 萬個點去給 m 作預測,算出這 4 萬個點的類別
45 points = [(i*0.5, j*0.5) for j in xrange(0, 200) for i in xrange(0, 200)]
46 p_label, p_acc, p_val = svm_predict([0]*40000, points, m)
47
48 line_1, line_2, line_3, pre_label = [], [], [], p_label[0]
49 for i in xrange(0, 200):
50 for j in xrange(0, 200):
51 index = i * 200 + j
52 now_label = p_label[index]
53 if now_label == 1 :
54 line_1.append(points[index])
55 elif now_label == 2 :
56 line_2.append(points[index])
57 elif now_label == 3 :
58 line_3.append(points[index])
59
60 fig = plt.figure()
61 ax = fig.add_subplot(111)
62 ax.plot([p[0] for p in x1], [p[1] for p in x1], 'ro')
63 ax.plot([p[0] for p in x2], [p[1] for p in x2], 'go')
64 ax.plot([p[0] for p in x3], [p[1] for p in x3], 'bo')
65 ax.plot([p[0] for p in line_1], [p[1] for p in line_1], 'r-', alpha=0.5)
66 ax.plot([p[0] for p in line_3], [p[1] for p in line_3], 'b-', alpha=0.5)
67 ax.set_title('Points of three classes')
68 ax.set_xlabel('x')
69 ax.set_ylabel('y')
70 ax.set_xlim(0, 100)
71 ax.set_ylim(0, 100)
72 plt.show()
73 return m, p_label, p_acc, p_val
74
75
76 if __name__ == "__main__":
77 test()

四月 25, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 使用「公認機構簽核公錀」所發生的不知名問題

How to get a free HTTPS web certification authority by StartSSL.com 一文中,我申請了 A.hoamon.info 的公錀簽核,也正確地跑在 https 上,在使用瀏覽器觀看時,完全沒有問題。然而在 hg 軟體上,卻會發生 SSL: Server certificate verify failed. 的錯誤訊息,從 Mercurial on Windows vs Linux, spot the problem 一文中,作者解釋是 Windows 的 ssl 版本太舊的原因,但照他的解決方案處理,我的 hg 軟體卻是報 URLError. 錯誤。

後來在檢查 apache.conf 時發現,這台機器有三個 https 站台,一個是用 A.hoamn.info 的公錀,另外兩個 B, C 站台卻都是用 whatever.hoamon.info 的公錀。而 B, C 站台的設定檔寫得比 A.hoamon.info 站台還前面。所以試著調動 A.hoamon.info 到 B, C 站台設定的前面,結果 hg 軟體就正常了。

問題是解決了,但我反而混亂了。印象中, https 協定中,公錀是在 IP 層(或表現層,我不確定)就發送至使用者的瀏覽器,既然沒到應用層,則網頁伺服器就不知道該拿那一個虛擬站台的公錀給使用者,於是它總是拿第一個看到的公錀(也就是寫在最前面的),所以這篇教學文章,才會寫到:「…一個 Apache ,也只能架一個 SSL 站,用一個站名。除非妳跑很多份 Apache ,各自跑在不 同的 IP 或不同的 TCP 埠上,才能在同一臺伺服 器上,跑好幾個 SSL 站。」

實際上,在 Windows XP 的 IE, Safari 上觀看 A, B, C 三個站台,也的確都是拿到 A.hoamon.info 的公錀。但在 Chrome, Firefox 上,卻是看到 A 用 A.hoamon.info ,但 B, C 用的是 whatever.hoamon.info 的公錀。


這我頭大了,為什麼跟基本原理不一樣??? 還是因為某些瀏覽器有「重拿公錀的機制」存在???

四月 17, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» How to get a free HTTPS web certification authority by StartSSL.com

一般在上網時,所用的 Http 協定是明碼的,使用者與網站伺服器之間的任何網路結點(閘道器)都有方法可以看到網路連線所傳遞的訊息,所以如果網站所提供的服務關係到機密(隱私)資料時,我都會讓網站用 Https 加密協定服務。

使用 Https 服務時,有一個重要觀念: 如何拒絕「中間人攻擊」。

假想一個以 Https 加密協定服務的 A 網站,在它與使用者傳遞公錀(加密憑證)時,是被一個中間人接走,而中間人再把它自己的公錀傳遞給使用者,結果使用者傻傻地使用中間人的公錀加密,再把加密資訊傳到中間人,而中間人用自己的私錀解密後,再用 A 網站公錀加密傳回 A 網站,在這個模式,雖然使用的是 Https 協定,但資料還是被中間人看光光了。

所以要防止此類攻擊,就必須讓使用者能「確認」公錀真的是 A 網站的。方法是使用者自己手頭上要有一些公認機構所發行的公錀憑證(一般的瀏覽器都已經包入),然後在拿到 A 網站的公錀憑證時,用手頭上已有的公認機構公錀憑證去驗證這個 A 網站的公錀憑證是否被這些公認機構簽核過,如果有,則表示公錀的確就是 A 網站的,當使用者用這把公錀加密時,就只能被 A 網站解密。

本篇文章的目的是站在 A 網站的立場上,如何將 A 網站的公錀交給公認機構作簽核,這樣使用者在瀏覽 A 網站時,才不會跳出一個警示視窗告知使用者:「 A 網站有安全疑慮」。

一般將公錀交給公認機構去作簽核是要花錢的,像是國內最大的簽證公司(我猜的)網際威信最便宜的簽核年費是 18000 元。這筆費用不是每個人願意負擔的,像是我的 https 網站,主要是提供我們團隊作專案管理之用,也就不到 10 位的使用者,要我花 18000 元,去買一個「讓使用者在一年之內不會看到該網站有安全疑慮」的警告訊息,這我可花不下手。

所幸,有公認機構了解這種需求,它以「一年免費」作廣告宣傳,如果有更高級的簽核需求,它才額外收費。那麼以我上述所要的,其實就拿那個「一年免費」用用即可。

首先請使用 Firefox (它們目前不支援 Chrome)去瀏覽 http://www.startssl.com/ ,並點選右上角的錀匙圖示,如下圖:


就能看到 Sign-up 按鈕,如下圖:


按下 Sign-up 按鈕就開始註冊帳戶的流程,整個公錀簽核的程序分成三個階段:
  1. 註冊帳戶
  2. 驗證網址
  3. 公錀簽核
1. 註冊帳戶時, startssl 會給你的瀏覽器一個全新的公私錀檔,這個公私錀檔是專供你的帳戶使用的,這個公私錀檔要好好保管,搞丟了,你就不能再用這個帳戶申請簽核的動作,因為它的登入不是用帳號密碼作登入機制,而是用公私錀作登入機制。

2. 驗證網址,你必須證明要作簽核的網址是你所管理的。而這個驗證動作完成後,你也只有 30 天的期限去作簽核它的公錀,過期後,就必須再次驗證網址。

3. 針對已驗證過的網址,你可以申請簽核公錀的動作,主要分兩種作法,一是 startssl 完全生出一把全新的公私錀憑證; 二是我們自己生出私錀及公錀請求檔,再把公錀請求檔交給 startssl 去作出已簽核的公錀。本文是介紹第二種方法,因為私錀應該是自己處理會比較妥當,不要懶惰到連解密錀匙也委託他人製造,我個人認為這種人不只懶還不負責任。

原則上,公錀不過是一個文字檔,所以它在 Linux, Window$, Mac 作業系統下,都能處理,但我個人還是喜歡用 Linux 來作這件事

1. 註冊帳戶:


請填寫你的詳細資料,原則上,他們只採 web 審核,所以只要你的資料不要「太假」,他們都會通過。


請到註冊信箱接受具驗證碼的信。並注意「目前的這個視窗」是不允許關閉的,如果你關閉當下這個網頁,再用相同連結回來,這樣你填寫的驗證碼就算是對的,它也不會通過你的申請。


產生「帳戶」專用的公私錀檔,可選擇 Hign Grade 。


將公私錀檔安裝至瀏覽器上,這裡的公私錀檔是指你的帳戶與 startssl 網站溝通時,所用的公私錀檔,而不是你的網站要用的公錀。


建議你備份這份公私錀檔。


完成後,可見到帳戶頁面。

2. 驗證網址:


我是選擇 Domain Name Validation 方式。


填入網址。


startssl 會從 whois 資料中抓出管理員信箱,所以你必須確認該網址的 whois 內容是正確的。


請到信箱收取驗證碼。並填入上面的 Verification Code 中。


成功後,你只有 30 天的時間,去簽核該網站的公錀檔。

3. 簽核公錀:


公錀可以有很多種用途( Email/XMPP/Object Code ),但目前我只需要 Web 的,所以選擇 Web Server SSL/TLS certificate 。


要使用自己獨立生成的私錀來作簽核公錀的動作,請選擇 Skip 。

欲生成長度為 4096 bits 的私錀檔並使用 des3 格式作私錀加密(密碼長度要大於 4 個字元),請使用如下指令:

# openssl genrsa -des3 -out exmple.com.key 4096
Generating RSA private key, 4096 bit long modulus
................................................................................................................................................................++
...............................................++
e is 65537 (0x10001)
Enter pass phrase for exmple.com.key:
Verifying - Enter pass phrase for exmple.com.key:

從新增的私錀中,產生一個憑證請求檔,並在請求檔中,寫入「目標網址」(也就是你剛驗證過的那個網址)的所屬資料,如:所在地、單位名稱、負責人信箱等:

# openssl req -new -key exmple.com.key -out exmple.com.csr
Enter pass phrase for exmple.com.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:{{TW}}
State or Province Name (full name) [Some-State]:{{Taichung}}
Locality Name (eg, city) []:{{Taichung}}
Organization Name (eg, company) [Internet Widgits Pty Ltd]:{{EXAMPLE-Company}}
Organizational Unit Name (eg, section) []:{{EXAMPLE-Company}}
Common Name (eg, YOUR name) []:{{EXAMPLE Company}}
Email Address []:{{master@exmple.com}}

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


兩個 {{ }} 所包住的部份,請自己修改成正確資料。


在 Linux 完成 CSR 檔的製作後,你會得到 example.com.csr 檔案,請將檔案內容貼入上圖的文字框中。


CSR檔如無誤,它會出現上圖的訊息。


它要你選擇要生成簽核公錀的頂層網域。


請填入你所提供 https 服務的網址名稱。


確認要簽核公錀的網址。 startssl 簽核的公錀,預設會給你的目標網域及它的頂層網址兩個。如果你要簽核公錀的網址希望是 *.example.com ,也就是除頂層網域外,把它的下層網域一網打盡,也是可以,只要二年付 USD 49.9 即可,大約 1500 元的新台幣,而且這是 wild cards 網址,網際威信可沒這麼好康,一個就要 18000 元、二個就是要 36000 元。這時,我又感到「全球化」的愉悅。


接下來,請把文字框中的文字貼到 example.com.crt 中,這個內容即已被簽核過的公錀檔。另外,請順便下載上圖中的 intermediate 及 root 兩個 CA 檔案。


整個工作完成了。

然後在 Apache 設定檔中設定如下:
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
SSLCertificateFile /etc/apache2/example.com.crt
SSLCertificateKeyFile /etc/apache2/example.com.key
SSLCertificateChainFile /etc/apache2/sub.class1.server.ca.pem
SSLCACertificateFile /etc/apache2/ca.pem
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

重新啟動 Apache 時,它會問你私錀密碼為何? 這個動作在管理員面前發生是沒有問題的,但在系統自動重開機時,會造成困惱,所以我們可移除私錀的加密,指令如下:

# openssl rsa -in exmple.com.key -out exmple.com.key.no_password

exmple.com.key.no_password 這個私錀檔就是沒加密的,將它寫入 apache 設定檔即可。

四月 16, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» SSH 的公私錀生成說明

Linux/Mac:

請在命令列鍵入如下指令:

$ ssh-keygen -t rsa -b 4096


Generating public/private rsa key pair.
Enter file in which to save the key (/home/tmp/.ssh/id_rsa): <<按 Enter ,使用預設值>>
Enter passphrase (empty for no passphrase): <<設個私錀密碼,請大於 5 個字元>>
Enter same passphrase again: <<確認剛剛的私錀密碼>>

Your identification has been saved in /home/tmp/.ssh/id_rsa.
Your public key has been saved in /home/tmp/.ssh/id_rsa.pub.
The key fingerprint is:
72:fb:40:ba:8a:40:be:48:03:bd:20:13:6d:83:cb:d0 tmp@core2duo
The key's randomart image is:
+--[ RSA 4096]----+
| |
| + |
|+ A |
|o= . |
|*o. T . S |
|=o . = . |
|.-. . o |
|o.o. . o |
|... ... . |
+-----------------+


這樣,你的公錀就是 ~/.ssh/id_rsa.pub 而私錀就是 ~/.ssh/id_rsa 。

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAz22m/azvKC7uk05/D6qvl5c+QR95jkiqEpnn3/co/zOGc4Gf7v1sc5H7Lf5CUOTxgfgAOZSmdr1OPaUYU1cvJTLTjKeVznifyTl3KabMH1Yy8wpSS1TjCTbS8896uXXYtrdIL5KEHnVADYdS4fHWtY7uAR+JWlbh9OjN3deU77656knwW0PO5ELMYKUicSZZZFoUFyDCflM61cNNP1i/rwa1pp8nFqyjzNOq5hKaEsssiJK4tPcm+5K8rwRXm3k7fprvoxYswebo9U85kvyWPqY0iMFE0P019Pbq5VWCaqfv9nzD7rZaKe+aLk/7n+E4HSSSLYNlhnQkZUVm40zGnhGEZvT0e+kmpJpXJKjAe3ZJkowc3o8xrBjD0ULP+jN1fHMUxllWOuxgNkqdD/UjXf5E777Zw+Fpoy2B1c/wRPpRfsFisfLg9xxj3MF+E3wkHROOtrSv+M2wLKVtDODF4zwO8dr5g9s5xBTlSJFsBCJGmX2+zQ6y2033amRnr/Xl0+KAqCOdO+BmQ+iw7X0DFCfxZtjx4RQXcGYw3HqSKP3I4Tft0IHD0g1HXuQhMezG6yVIVABgbo47+Xbdxx7vFb82Anv7DnmhbOovk3LDrzPzyNe7fS2Jla5T5Etb5jyEHE1qNfJNzKVgxjBMGKGk7L5GIx7pXUk= tmp@core2duo

把上面的公錀內容放到你想登入的 Linux/Mac 機器中的 ~/.ssh/authorized_keys2 (這個檔,其實是看系統管理員是怎麼設定的,只不過一般的 Linux 套件都是用這個作預設值)中,這樣你就能使用這一對公私錀登入遠端機器了。

Windows:

就比較麻煩了,請去下載 puttygen.exe 程式,執行它後如下圖:



選擇 SSH-2 RSA 及輸入 4096 的 Number of bits in a generated key 後,再按下 Generate 按鈕,讓滑鼠停留在綠色生成桿的下方空白處,並胡亂移動滑鼠遊標,讓 puttygen.exe 得到亂數種子,待進度達百分百後,可得到下圖:



選取的藍色文字即公錀內容,請貼到你欲登入的 Linux/Mac 機器中的 ~/.ssh/authorized_keys2 中,而私錀部份,請在設定密碼「Key passphrase」及確認密碼「Confirm passphrase」後,按下 Save private key 按鈕以存檔至系統硬碟。

最後,請保護好你的私錀檔(最好不要離開生成它的機器硬碟),遺失它或是被別人盜取後的代價相當大。 Good Luck!

四月 13, 2011

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» CMClass: 簡述 libsvm(Support Vector Machine library) 使用方法

libsvm乃台大林智仁老師開發的 Open source 工具,其目的為實作 Support Vector Machine 分類器,使用語言主要是 C++ ,目前也有 JAVA 版本,也提供其他語言的 wrapper ,像是 Perl, Python, Ruby, Matlab, Hashkell, Lisp 等。

詳細數學就不介紹了,怕大家睡著(但其實是因為還沒看懂),各位可以看一下下面那段這個影片,大略了解 SVM 分類器如何區別不同資料。



本文章主要介紹的是用 Python 語言去操作 libsvm 函式庫。

先解壓縮 libsvm.tgz 檔,可以看到 python 及 windows 資料夾,如果要在 Linux 中使用的話,請在主目錄中作

$ make lib

這樣會得到 libsvm.so.2 檔,這是 libsvm 的主函式庫,而在 windows 中使用的話,它則是先幫你編譯好這個檔了,可在 windows/ 找到這個 libsvm.dll 檔。

在 Linux 中,請把 python/*py 放到 /usr/local/lib/python2.6/site-packages 中,而 libsvm.so.2 放到 /usr/local/lib/python2.6/ 。

在 windows 中,請把 python/*py 放到 C:\Python26\Lib\site-packages 中,而 libsvm.dll 請放到 C:\Python26\Lib\windows 資料夾中(因為 svmutil.py 寫死了它的相對路徑,所以務必依它的相對位置置放)。

請在 Python shell 中,鍵入下列指令,測試是否安裝成功。

>>> from svmutil import *
>>>

沒錯誤訊息,那就是安裝對了。

使用 svm ,主要就是兩個動作: 訓練及預測。

訓練:

svmutil.svm_train 函式的引數有「類別標籤」、「觀察值」、「參數」。

你的原始資料若是如下:

1. 3, 4, 5, 6 => 第二類
2. 3, 4, 5, 5 => 第一類
3. ....

前面的 #. 表第幾個觀察值,後面逗號分隔的數據為各維度的值,行末則是放置該觀察值為第幾類的說明。請把它轉成

>>> Y = [2, 1, ...]
>>> x = [(3, 4, 5, 6), (3, 4, 5, 5), ...]

類別標籤請獨立放置到一個 list 中,而觀察值維度則依序放置到另一個 list 中。接下來,就能使用 svm_train:

>>> from svmutil import *
>>> model = svm_train(Y, x, '-c 4')

所得到的 model 就是一個經過訓練的分類器。

預測

接下來,我們要拿訓練好的分類器去預測新的觀察值:

>>> p_label, p_acc, p_val = svm_predict([0]*len(new_x), new_x, model)

而 p_label 就是依 new_x 順序所對應的類別標籤 list 。

下圖是我隨機生成的 300 點,圓點為原始的觀察值,而以線相連的連續點則是預測點。



詳細程式碼請參照如下:


 1 #! /usr/bin/python
 2 # -*- coding: utf8 -*-
 3
 4 __author__="hoamon"
 5 __date__ =u"$2011/4/12 下午 05:52:31$"
 6
 7 from math import pi, sin, cos
 8 from random import random
 9 from matplotlib import pyplot as plt
10 from svmutil import *
11
12 def circleData(centre, radius, down_limit_percent=0, lens=100, range=[0, 100]):
13     points = []
14     while len(points) < lens:
15         _angle = 2 * pi * random()
16         radius_percent = random()
17         if radius_percent < down_limit_percent: continue
18         _radius = radius * radius_percent
19         x = centre[0] + cos(_angle) * _radius
20         y = centre[1] + sin(_angle) * _radius
21         if range[0] <= x <= range[1] and range[0] <= y <= range[1]:
22             points.append((x, y))
23     return points
24
25
26 def test():
27     u""" 製作三群的隨機資料,每群皆 100 個點,點位置的 x, y 限制在 0 ~ 100 之間
28
29         最後利用 matplotlib 繪製出來的圖,"單點"表原始資料,而連續點畫線的部份,
30         該點位的類別則是利用 svm_predict 計算出來的。
31
32         Y = [1, 1, 1, ..., 2, 2, 2, ..., 3, 3, 3, ...]
33         x = [(x1, y1), (x2, y2), ...]
34     """
35     Y = [1] * 100 + [2] * 100 + [3] * 100
36     x1, x2, x3 = (circleData((35, 40), 12),
37         circleData((35, 40), 48, down_limit_percent=0.25),
38         circleData((80, 80), 20)
39         )
40     x = x1 + x2 + x3
41
42     m = svm_train(Y, x, '-c 4')
43
44     #INFO 在 100x100 的畫布上,打出 40000 個點,拿這 4 萬個點去給 m 作預測,算出這 4 萬個點的類別
45     points = [(i*0.5, j*0.5) for j in xrange(0, 200) for i in xrange(0, 200)]
46     p_label, p_acc, p_val = svm_predict([0]*40000, points, m)
47
48     line_1, line_2, line_3, pre_label = [], [], [], p_label[0]
49     for i in xrange(0, 200):
50         for j in xrange(0, 200):
51             index = i * 200 + j
52             now_label = p_label[index]
53             if now_label == 1 :
54                 line_1.append(points[index])
55             elif now_label == 2 :
56                 line_2.append(points[index])
57             elif now_label == 3 :
58                 line_3.append(points[index])
59
60     fig = plt.figure()
61     ax = fig.add_subplot(111)
62     ax.plot([p[0] for p in x1], [p[1] for p in x1], 'ro')
63     ax.plot([p[0] for p in x2], [p[1] for p in x2], 'go')
64     ax.plot([p[0] for p in x3], [p[1] for p in x3], 'bo')
65     ax.plot([p[0] for p in line_1], [p[1] for p in line_1], 'r-', alpha=0.5)
66     ax.plot([p[0] for p in line_3], [p[1] for p in line_3], 'b-', alpha=0.5)
67     ax.set_title('Points of three classes')
68     ax.set_xlabel('x')
69     ax.set_ylabel('y')
70     ax.set_xlim(0, 100)
71     ax.set_ylim(0, 100)
72     plt.show()
73     return m, p_label, p_acc, p_val
74
75
76 if __name__ == "__main__":
77     test()

八月 22, 2010

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» IBM R60e 上的 Ubuntu 10.04 透過 HTC wildfire 上網

我的 R60e 在裝了 Ubuntu 8.04 或是 Ubuntu 9.04 之後,無線網路的運作一直很奇怪,在開啟無線網卡後,訊號十分不穩定,用 ping 來測試,往往時間都會超過 500ms 。一直到現在的 Ubuntu 10.04 都是一樣的,無線網路能連但是不能用。嘗試了很多方法,都沒效果,再加上我家有一段時間是沒有 AP 的,要到學校研究室才會遇到這個問題,而往往我都是用"有線網路"來解決這個無線網路的效能問題,所以也就沒有認真地想把這個問題解決。

一直到我買了一支 HTC wildfire 後,因為對 3G 無線上網的需求實在不高,我大部份時間都待在家,所以就弄了台 AP 擺在家裡。 wildfire 使用無線網路當然是非常順暢地,要不然宏達電不會躍升為全球第八大的手機商。既然 wildfire 上網很順,我想不如就把它的網路分享給 R60e 用吧!

為此,我找了個周日,打算好好地研究一番。想說這種分享方法,原則上應該會在 Ubuntu 上生成一種 usb 裝置,然後我再找出它設定方式就解決了。

結果,我只是用 usb 線把 wildfire 跟 R60e 接起來後,在 wildfire 上選擇「網際網路分享」,它就能用。

它就能用了耶!

六月 4, 2010

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 升級到 Ubuntu 10.04 後,發生無法使用公私錀登入問題

Ubuntu 10.04 對我而言,最大的優點是內建了家目錄加密的功能。然而在實際使用上,才發現這與我預期的有一段落差,只是這個落差是當初我沒想清楚所造成的。


原本,我以為用了家目錄加密後,一般使用者可以不怕檔案被 root 看光光,但
這是錯的,創建帳號的管理員一開始就可以備份「加密錀匙」,所以就算一般使用者登入後更換密碼,也不會重新製作一把「加密錀匙」,所以更換密碼的動作,只把「加密錀匙」用另一組密碼保存起來,帳號管理員一樣可用之前所保存的「加密錀匙」還原檔案。除非,使用者更換「加密錀匙」(但很麻煩,也需要系統權限),或是一開始,就不要帳號管理員設定「家目錄加密」功能,而是使用者自己作「目錄加密」的動作

原本,我以為不打「登入密碼」,就看不到家目錄,但
這是錯的,只要該使用者登入後有掛載該目錄,其他人就可以透過權限驗證方式來觀看,因為該使用者已將目錄解密了。

原本,我以為一般人可以在自己的家目錄執行網頁程式而不被其他人知道他搞了什麼網站,只要 apache 設定檔有設定 Include /home/xxx/self.conf 之類的語法即可,但
這是錯的。家目錄既然已加密,那 apache daemon 就沒辦法進到網頁程式的目錄,又如何執行它們。

嚴格的說,這個家目錄加密功能,只能用在其他人無法使用光碟開機或是重灌系統來獲取硬碟資料,就只是這樣而已,而這功能,我的 IBM Thinkpad 用硬碟密碼就作到了,我白玩了。但這一切都是我自己先想錯了呀!

而且在使用此功能還發生一件非常烏龍的鳥事,就是無法使用公私錀登入,因為公錀資料夾是放在家目錄的,既然它被加密了,那 ssh daemon 又如何拿到公錀來驗證呢! 解法很簡單,在 /etc/ssh/sshd_config 中,設定

AuthorizedKeysFile /home/ssh-keys/%u/authorized_keys2

即可,也就是將使用者公錀放到沒被加密的資料夾。解法很簡單,但我卻搞了兩天,因為我在 sshd_config 中寫的是

AuthorizedKeysFile /home/ssh-keys/%u/authorized_keys

,但在資料夾中放的是
authorized_keys2 。一個 2 ,我看了 2 天,才發現不一樣。這就是人生呀!

五月 28, 2010

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 如何解決 TortoiseHG on Windows 上中文檔名的問題

因為 Windows 在紀錄檔案名稱時,是用 UTF-16 ,而不是 UTF-8 作紀錄,所以如果在 Windows 中,加入一個「中文檔名(嚴格來說,是非 ascii 編碼的名稱)」的檔案,那麼這個檔案到了 Mac OS X, Linux 平台時,就無法使用了。


要解決這個問題,只要 Windows 使用者用 fixutf8 extension 先處理檔名即可。下載程式碼後,只要到 hgrc.d/Mercurial.rc 檔中,加入

[extensions]
fixutf8 = C:/fix-utf8/fixutf8.py

但使用這個外掛(16 (baf283ab9f92)版)會導致 TortoiseHG 無法作 commit 的動作,這 commit 問題,我找了很久,但實在沒辦法解決,只知道 TortoiseHG 將 commit message 以 cp950 送出,但 fixutf8 卻要求 message 要以 utf8 進入,但那裡的程式要修改,我就 de 不到了。

目前我只能回到 cmd.exe 底下,用 hg ci 來作提交動作。

而且,在使用 fixutf8 下,有可能會導致 merge 功能錯亂,這時候,就只得用 Linux/Mac OS X 來解決 merge 問題。

» Install Python2.5 on Ubuntu 10.04 for Google App Engine

Ubuntu 10.04 已經預設不包 Python2.5 了,對寫 GAE 的人來說,這有點麻煩,到目前為止 GAE 並未正式地支援 2.6 ,所以最好認命地在 Ubuntu 10.04 中創建一個 Python2.5 的環境。


裝 2.5 的目的是為了開發 GAE 程式,所以我們需要額外下載這些程式碼:
  1. Python2.5
  2. PIL
  3. python-ipaddr
# 利用 apt-get 安裝相關函式庫,除 libssl-dev 外,其他的套件是給 PIL 用的
$ sudo apt-get install liblcms1-dev zlib1g-dev libfreetype6-dev libjpeg62-dev libsqlite3-dev libssl-dev

# 安裝 Python2.5.5 至 /usr/local
$ tar -jxf Python-2.5.5.tar.bz2
$ cd Python-2.5.5
$ ./configure -with-zlib=/usr/include
$ make
$ sudo make install

# 安裝 GAE 相依模組 ipaddr
$ tar -zxf ipaddr-2.1.1.tar.gz
$ cd ipaddr-2.1.1/
$ sudo /usr/local/bin/python2.5 setup.py install

#安裝 PIL
$ tar -zxf Imaging-1.1.7.tar.gz
$ cd Imaging-1.1.7
# 修改 setup.py 中的使用函式庫位置
# LCMS_ROOT = '/usr/lib'
# TCL_ROOT = '/usr/lib'
# JPEG_ROOT = "/usr/lib"
# ZLIB_ROOT = "/lib"
# TIFF_ROOT = '/usr/lib'
# FREETYPE_ROOT = "/lib"

#檢查模組是否可使用
$ /usr/local/bin/python2.5 setup.py build_ext -i
#測試模組
$ /usr/local/bin/python2.5 selftest.py
$ sudo /usr/local/bin/python2.5 setup.py install

最後,再把 dev_appserver.py, appcft.py 中的 #!/usr/bin/env python 改成 #!/usr/bin/env python2.5 即可。這樣就可以在 Ubuntu 10.04 中開發 GAE 程式了。

五月 25, 2010

hoamon's sandbox
hoamon
hoamon's sandbox is about »

tag cloud

» 用隨身碟安裝 Linux

我的電腦有些是沒有光碟機的,事實上,光碟機的使用機率是愈來愈低,我曾有一台 Thinkpad 大半年沒開過光碟機,結果要用時,它卻發生讀片錯誤。

所以這次重新安裝 Ubuntu 10.04 時,我是採用隨身碟安裝的方式,而也因為 Open Source 工具愈來愈多、愈來愈方便下,我只使用了 usb-creator 程式,就將 ubuntu-10.04-alternate-amd64.iso 燒到 4G 隨身碟了,方法很簡單,先安裝 usb-creator(# apt-get install usb-creator) ,然後在命令列裡執行 usb-creator-gtk 。選擇要安裝的 iso 檔,並抹除隨身碟內的資料,就可以「製作開機磁碟」了。



接下來,就是重新安裝機器了,首先要切換 BIOS 的開機選項,在技嘉的 BIOS 上,我只選了 usb-hdd 就可從隨身碟開機,然而華碩的 BIOS ,除了要將 boot 選項切到 remoted-device 外,還要調整 usb storage 的 Forced FDD 類型。調整後,就如往常一樣重灌 Ubuntu 了。



» "ThinkPad USB Keyboard with TrackPoint" 在 Ubuntu 10.04 的中鍵滾動設定方式

參考了我與小黑(ThinkPad X200s)之小紅點文章後,可輕鬆地設定了我的 R60e 中鍵滾動功能,然而一直無法在我的桌上型電腦上以 gpointing-device-settings 方法或是用 xinput 指令設定成功。因為設備名稱不同所以 "TPPS/2 IBM TrackPoint" 要改成 "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" ,但它就是不成功,指令如下:

# 啟用中鍵模擬功能
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Middle Button Emulation" 8 1
# 啟用滾輪模擬功能
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Wheel Emulation" 8 1
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Wheel Emulation Axes" 8 6 7 4 5
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Emulation Button" 8 2

# 靈敏度
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Middle Button Timeout" 8 50
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Wheel Emulation Inertia" 8 10
xinput set-int-prop "Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint" "Evdev Wheel Emulation Timeout" 8 200


還好該文章有詳細參考文件 How to configure the TrackPoing ,從該文中,得知還有別種設定方法,所以我在 /usr/lib/X11/xorg.conf.d/20-thinkpad.conf 中,置入文句如下:


Section "InputClass"
Identifier "Trackpoint Wheel Emulation"
MatchProduct "TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|USB Trackpoint pointing device"
MatchDevicePath "/dev/input/event*"
Option "EmulateWheel" "true"
Option "EmulateWheelButton" "2"
Option "Emulate3Buttons" "false"
Option "XAxisMapping" "6 7"
Option "YAxisMapping" "4 5"
EndSection

然後重開機,就搞定了。

五月 20, 2010