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/

何岳峰 敬上

2010年5月28日 星期五

如何解決 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 i386 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
  4. python-ssl
# 利用 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-library=/usr/lib --with-zlib-include=/usr/include --with-tk --with-tcl-library=/usr/lib --with-tcl-include=/usr/include --with-tk-library=/usr/lib --with-tk-include=/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

# 安裝 GAE 相依模組 python-ssl
$ tar -zxf python-ssl-1.15.tgz
$ cd python-ssl-1.15/
$ 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
 PIL 1.1.7 TEST SUMMARY
 --------------------------------------------------------------------
 Python modules loaded from ./PIL
 Binary modules loaded from ./PIL
 --------------------------------------------------------------------
 --- PIL CORE support ok
 --- TKINTER support ok
 *** JPEG support not installed
 *** ZLIB (PNG/ZIP) support not installed
 --- FREETYPE2 support ok
 --- LITTLECMS support ok
 --------------------------------------------------------------------

雖然有過 build_ext ,但到了 selftest.py 時,我總是會得到 JPEG 及 ZLIB 兩種函式庫不支援的情形,但因為我的網頁程式不太用到影像處理的功能,所以我直接強制安裝 pil 。

$ sudo /usr/local/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 10.04+ 中開發 GAE 程式了。

2010年5月25日 星期二

指數化投資第五階段檢視

今天是 2010/5/25 ,大盤大跌了 236 點,跌幅約 3.18% ,而我的台股報酬率也只剩下 5% 多了。與第四階段相比,我的持股成本提昇到了 6750 左右。我在 7、8000 點都有繼續投入。理由是 Vanguard 基金不賣給外國投資人了,所以我只好把這筆錢又轉回台股。

其實,現在跌到 7000 點了,我也沒什麼好擔心的(*1),只是在這一段時間,我又作錯了幾件事。實在克制不了買賣的慾望,所以頻頻將其他的類股換成金融保險類股,結果以事後來看,我多賠了 13% 的換股金額。多賠這 13% ,以目前來看,雖然是錯,但未來可不一定,畢竟這是交易損失,在一個具有市場風險的環境,有交易損失,就可能有交易收益。

但重點是,它再次提醒我,自以為了解市場走向,可未必呀!

就像現在很多人講說,我們 DRAM 技術打不贏南韓,到了明年南韓產能開出來後,這些 DRAM 廠鐵倒的。沒錯,以科技規格來看,我們的確打不贏,但又有人料得到北韓會無聊到去挑釁南韓,如果兩國打了起來,南韓能賣 DRAM 嗎? 當然,我不是在幫台灣 DRAM 廠講話,如果可以的話,倒一倒對台灣來說,或許也是件好事,我只想強調:「世事難料」。

今天寫這篇文章,只是想給自己一個警剔,既然用了指數化投資,就別再去猜測那些股票股價是高點,那些是低點了。買了就長期持有,等退休再賣。

相關閱讀:

簡單指數化投資
指數化投資第一階段檢視
指數化投資第二階段檢視
指數化投資第三階段檢視
指數化投資第四階段檢視

註1:以前我一次融資買進 10 張巨大(9921)的時候,差價賠 2 萬塊,我睡不著覺,賺 2 萬元,我一樣還是睡不著覺。用指數化投資,生活品質明顯改善了。

用隨身碟安裝 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 TrackPoint ,從該文中,得知還有別種設定方法,所以我在 /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

然後重開機,就搞定了。

2010年5月22日 星期六

Mercurial 在開發「模組或函式庫」的應用策略

前幾天,學弟問了我一個問題,讓我發現原來我們對 branch 的概念還不是很熟悉。事實上,這是件好事,從問問題中,才能發現原來事情不是我們所想像的,早發現早好。最痛苦的是在弄亂運作中的程式碼後才驚醒。

在說明學弟的問題前,要先來前情提要。我們研究室到目前為止至少開發了 4 套系統,用「至少」是因為這 4 套比較大型,除 django 程式碼外,自己所寫的 .py 及 .js 近 4 萬行,且不含樣版。而這 4 套系統當然有部份的程式碼是一樣的,我想程式碼寫得多的設計師一定也是這麼想,常用的 bug 紀錄器、郵政地址選擇、政府機關資料等東西,一定會弄個模組另外放,到時候開發新系統時,整個模組(資料夾)拿進來就行了。

但是一個模組該如何與主系統共存開發呢? 尤其是模組與主系統程式碼都還在變動階段。
使用 Mercurial 讓這件事,變得非常輕鬆,假設我們有 A, B, C, D 等 4 個系統,而有一個 common 模組,這時,我們應該在 common 模組開 4 個 branches ,分別是
  • 'release for A
  • ''releasr for B
  • ''release for C'
  • 'release for D'
假設這 4 個 branches 都是在 changeset:300 時 branch 出去的。然後,過了一段時間,因為 C 系統的需求,我們修改了 common 模組,它的 changeset 來到了 340 ,且我們也將這 300:340 的修改 merge 到 'release for C' 了,這樣對其他 3 個系統有沒有影響? 當然沒有。

因為在伺服器運作的儲存庫上,以 A 系統為例,一定是把 common 模組切到 'release for A' 了(用 hg update -C 'release for A' 這個指令),就算某天將 A 系統上的 common 更新至 changeset:340 ,但這也只有在 common/.hg 的資料是 340 的, common/* 的資料一定還是停在 'release for A' 這個 branch 上,而 'release for A' 的最新版仍舊是 300 。

所以那天如果負責 A 系統的程設師有空了,它想使用 common 模組的最新功能時,他只要在 'release for A' 的 branch 中, merge tip 版本,並處理 A 系統這邊應對新 common 模組的修改,就可無痛昇級。

利用 branch 觀念,我們可以輕鬆整合多種函式庫、模組之間的版本整合問題,那麼學弟的問題是什麼呢?
如下圖:



學弟很貼心地在 branch 後,再為 " default 分枝" 作一個 manual commit ,以維持兩個 heads ,這樣會讓其他人在使用時,不致於出現 +1 head 的訊息(但這也只是在某些情況下)。

結果我後來又把 " default 分枝" 的成果 merge 到 'Release for XXX' ,這讓儲存庫上只剩下 1 個 head ,這個結果讓學弟有點困惑,他以為剩下一個 head ,那其他人在寫程式時,會不小心 commit 錯 branch 。
我說不會,因為他們原本手頭上的儲存庫就指定好是用那一種 branch ,所以在 hg pull -u 後,程式碼會變成該 branch 的最新版,在改完程式後,他們 commit 的成果也寫入相同的 branch ,而不會在 " default 分枝" 上, commit 到 'Release for XXX' 。

這惟一的小問題是其他學弟要把 commit 後的成果 push 到 HG Server 時,會出現提醒 +1 head 的訊息,但這是沒辦法避免的,用 hg push -f 就解決,因為既然 branch 了,就一定會有 multi heads 的情形。

2010年5月20日 星期四

使用 eCryptfs ,記得一定要備份下「加密錀匙」

使用 eCryptfs 加密目錄時,通常會隨機生成一把 32 字元的加密錀匙,來作目錄作加密,然後再使用使用者密碼來對「加密錀匙」作加密。所以如果因故弄丟了「加密錀匙」,但還記得「使用者密碼」,也是沒有用的。

所以記得,在使用此加密功能前,一定一定一定要先備份「加密錀匙」。

備份方式如下:

# cd /home/.ecryptfs/YOUR_ACCOUNT/.ecryptfs
or
# cd ~/.ecryptfs

# ls
auto-mount auto-umount Private.mnt Private.sig wrapped-passphrase

這個 wrapped-passphrase 就是「加密錀匙」被「使用者密碼」加密後的檔案。

# ecryptfs-unwrap-passphrase wrapped-passphrase
Passphrase: '''輸入使用者密碼'''
b19becdz81z8ba06aa4z35e6z1c0227f

這個 b19becdz81z8ba06aa4z35e6z1c0227f 就是「加密錀匙」,趕快把它記錄到其他檔案去。

使用公私錀登入 Linux 後,如何掛載被加密的目錄?

登入後,因為還沒有輸入過系統密碼,所以無法掛載加密目錄,這時候只會在家目錄看到

Access-Your-Private-Data.desktop README.txt

兩個檔案,其中 README.txt 的內容如下:

# cat README.txt
THIS DIRECTORY HAS BEEN UNMOUNTED TO PROTECT YOUR DATA.

From the graphical desktop, click on:
"Access Your Private Data"

or

From the command line, run:
ecryptfs-mount-private

也就是要你執行 ecryptfs-mount-private ,執行後,它會問你系統密碼,鍵入後,加密目錄就被掛載進來,只是你要重新再進入一次家目錄,才會看到還原的內容。

快速進入家目錄指令:

# cd

升級到 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 天,才發現不一樣。這就是人生呀!

2010年5月15日 星期六

令我驚訝的 2010 日月潭鐵人三項比賽

根本就沒有這個比賽。

年初生了一場病,最近才比較好,本來想想報個日月潭半鐵就成了,結果今天上網查閱相關資料時,才發現今年根本沒辦。所以目標移轉到「台東之美」,也因為還有 5 個月,所以報個 51.5 km 應該是沒問題。

2010年5月14日 星期五

「政治文」: 富士康的工作環境真的容易讓人跳樓嗎?

[利益揭露]: 我有鴻海 100 股。

今年以來,鴻海子公司富士康陸續已有 8 名員工自殺,其中 6 死 2 傷,一般人多半認為富士康苛該對待員工,致使員工輕生。然事實如此嗎?

我認為苛待對待員工或許是有的,但以每天工作 12 個小時來看,台灣也是一堆公司都是這麼對待員工的,怎麼就不見台灣媒體反省自己人呢? 前陣子的觸控面板廠勞資問題就是一例。工時長也不見得就導致自殺率高。

基本上,以自殺率來看,富士康還算是個不錯的工作環境,以深圳地區來說,富士康有 40 萬名員工,到目前為止有 8 個人自殺,以這種速度下去,今年底,可能會到 20 位,也就是平均 10 萬人可能只有 5 位。這跟世界其他國家(包含中國)的自殺率比較起來,算是非常好的紀錄了。

在討論問題前,一定要分清楚總體問題與個體問題。

所以,當中國媒體廣泛討論此事件時,我總覺得這是政治不正確所造成的,因為富士康是鴻海的,而鴻海是台灣的指標公司。

== 後記 ==
我不是中國人,所以找到的中國自殺率數據或許是錯的,但我是台灣人,我相信我們的衛生署公佈的台灣自殺率數據。另外從與南韓、日本的比較數據中,我們寶島台灣可算是比較幸福的,每 10 萬人只有 19.3 人。反觀今年的富士康每 10 萬人自殺人數只有 5 個,我覺得他們公司算是優秀了。中國政府管理下,每 10 萬人的自殺人數是 20 個以上呀!!!!!!!!

== 再後記 ==
我又發了一篇,說明本文論點可再改善的文章:「政治文」:關於富士康自殺事件,我是錯的

2010年5月11日 星期二

創世十六年來,六億六千多萬張發票,才有一張兩百萬!!

以下這個「對到第一特獎 創世中200萬」新聞又讓我不敢相信了。

6億多張的發票至少應該中了 6 張 200 萬才對呀! 怎麼只有一張。我很想知道創世的發票兌獎稽核程序。這會是那裡出了問題?



[修: 以扣稅後實得重算] 再比較 97 年創世基金會發票中獎金額,一樣偏低



期望值落在 1.1285 1.08962(應以扣稅後實得計算) 元。但實際兌獎金額如下:


只有 0.9336 元,還是低了 17%((1.1285-0.93)/1.1285)14.3%((1.08962-0.9336)/1.08962) 。我個人還是覺得直接捐錢比較沒問題,發票留給自己兌吧!

以下是整個 97 年的中獎號碼:

2010年5月10日 星期一

[修: 以扣稅後實得重算] 創世基金會的發票中獎金額似乎有點少

依財政部公告的 98 年中獎號碼(*1)來看, 6 次中獎號碼有兩種情況,就是陸獎有 4 個號碼的有 2 組,其餘 4 組只有 3 個。像 9 、 10 月的只有 3 個,所以它的期望值只有 1.0218 。


而 11 、 12 月的有 4 個陸獎號碼,所以它的期望值比較高,有 1.2218 元。但以財政部規定: 2000 元以上獎稅應扣除 20% 的稅金以及 1000 元以上要補貼 0.4% 的印花稅,所以實得的期望值分別下降為 0.9775 、 1.1775 元。



因為我不知道各月份出現發票數有多少張,所以我假定它們都是一樣的數目,那麼整個 98 年發票的平均期望值應該是 (1.2218 * 2 + 1.0218*4)/6 = 1.0885(1.1775*2+0.9775*4)/6 = 1.0442 元。


但是創世基金會 98 年所兌獎的 99,238,439 張發票總金額 92,694,400 元來看,它只有 92694400./99238439 = 0.9341 元。這 14% ((1.0885-0.9341) / 1.0885) 10.5%((1.0442-0.9341) / 1.0442) 的差距是怎麼來的?

我的推斷有五種:
  1. 部份人士把沒中的發票才寄給創世基金會,所以增加了發票總數
  2. 內部兌獎人員錯把中獎發票當成未中獎發票,所以降低了得獎金額,這問題還算小
  3. 內部兌獎人員私吞中獎發票,所以降低了得獎金額,這問題比較大
  4. 財政部所公告的中獎號碼是在發票銷售之後,所以它調整過中獎發票的數量
  5. 純粹是命運造成的
是那一種原因或是多種原因造成的,我無法下定論。但可知道的是,如果這九千多萬張的發票,是用信封寄給創世的話,那麼實際上,善心人多花了 9,923,843 元在郵資上,也就是浪費了約 10% 的金額。而且我還沒算,當創世收到發票後再回郵寄信給善心人的費用喔!

寄發票真的很傷呀!!

註1 :以下是 98 年財政部公告中獎號碼





Related Posts Plugin for WordPress, Blogger...