搜尋此網誌

2011-12-30

轉換 PDF 文件的編碼

由於 windows 在不同的語系採取不同的文字編碼,導致跟 Linux 的 UTF8 不相容,最麻煩的是光簡體就採用 GB2312、GBK、GB18030 三種主要編碼,繁體主流則是 BIG5;不過 windows 7 已經開始採用 UTF8,所以在文件製作與保存,應該以目前最主流的 UTF8 為主。

首先以 root 權限安裝 poppler-data 解決編碼的 mapping。
apt-get install poppler-data
然後用 Chrome 將文件 print to PDF 以去除不同平台的指定字型,再參考修正 PDF 殘破的中文顯示問題將文件轉檔,就完成了。此時可以嘗試移除 poppler-data,再打開該 PDF,就會發現已經能正常顯示了。

如果要看 PDF 採用了哪些字型,輸入
pdffonts foo.pdf

2011-12-27

Wine 的輔助工具 - winetricks

雖然 Wine 幾乎重寫了所有的 libraries,不過某些 windows 程式需要特定的 MS library,這時我們可以使用一個非常方便的 script 來完成安裝。

下載
wget http://winetricks.org/winetricks
變更權限
chmod +x winetricks
以 root 權限移到 /usr/local/bin 方便日後使用
mv winetricks /usr/local/bin/
使用 winetricks GUI
winetricks
結束。

2011-12-24

在 Debian 安裝 Wine 與正體中文基本設定

Wine

Wine 的全名是 Wine is not an emulator,專門用來執行 windows 的程式,而不需要用模擬器來虛擬一個 windows,像是 VirtualBox 跟 VMware。

目前的穩定版是 1.2.3,不過在 Debian 的所有 packages 都是更舊的版本,所以需要手動安裝。以下皆需要 root 權限。

安裝方式
先安裝 Wine 會用到的 windows 字型 (需要 A multimedia source for Debian)。
apt-get install msttcorefonts
安裝編譯 Wine 所需的依賴套件。
apt-get build-dep wine
下載原始碼解壓縮後,進到資料夾,將缺漏的 libraries 儘量裝好。
./configure
編譯。
make
安裝。
make install

基本設定
以下使用一般權限即可。假設要用 Debian 系統中的預設字型 WenQuanYi Micro Hei 當作 Wine 的預設字型,先將 Wine 系統中的字型連結。
ln -s /usr/share/fonts/truetype/wqy/wqy-microhei.ttc ~/.wine/drive_c/windows/Fonts/
修改 ~/.wine/drive_c/windows/win.ini。
gedit ~/.wine/drive_c/windows/win.ini
在最後加上這幾行設定字型與字型大小。
[Desktop]
MenuFont=WenQuanYi Micro Hei
IconTitleFaceName=WenQuanYi Micro Hei
MenuFontSize=12
MessageFontSize=12
StatusFontSize=12
IconTitleSize=12
下載 fonts.reg (此為設定檔,文字編碼為 BIG5,段落編碼為 Unix/Linux),然後打開註冊檔,選擇 Import Registry File 將此文件輸入。(也可以用 Alt + F2 打開 Run Application,輸入 regedit 來開啟註冊檔)
wine regedit.exe
修改 Wine 的設定,將 Desktop Integration → Appearance → Item 中的 Active Title Text、Menu Text、Message Box Text、Tooltip Text 四個都換為 WenQuanYi Micro Hei,至於 Font Style 與 Size 就看個人偏好,我選 Regular 跟 12。
winecfg
完成。

使用方式
打開 notepad。
wine notepad.exe
如果有設定 Locales,可以用正體中文打開 notepad。
LANG=zh_TW.big5 wine notepad.exe

後記
目前已經有非常多的遊戲都可以用這種方式來進行,包括各種大型遊戲,可以參考 Wine Application Database

設定 Debian 的 Locales

Locales 含可以套用到 Debian 的所有語系,也負責單一程式的語言選擇。

查看目前所有的 Locales。
locale -a
第一種新增 Locales 的方式︰以 root 權限輸入,然後會看到文字型態的 GUI,依序選擇即可。按空白鍵 (space bar) 可以將要安裝的編碼打上 * 號。
dpkg-reconfigure locales
第二種新增 Locales 的方式︰以 root 權限編輯 /etc/locale.gen
gedit /etc/locale.gen
再以 root 權限套用變更。
/usr/sbin/locale-gen
結束。

2011-12-22

電影決戰 21 點中的課堂問題

貝氏定理(上) – Monty Hall 的三扇門

其實也可以寫個小程式來模擬看看。
from random import *
def guess(times):
    i = j = 0
    for r in range(times):
        # 初始時三個門都是空的
        doors = [0, 0, 0]
        # 隨機選一個門當獎品位置
        doors[randrange(3)] = 1
        # 猜獎者隨機選一個門當第一次的選擇
        doors[randrange(3)] = 2
        # 在非獎品與猜獎者選中的門中,隨機打開一個空的門
        empty = [i for i, x in enumerate(doors) if x == 0]
        lenth = len(empty)
        doors[empty[randrange(lenth)]] = -1
        # 第二次選擇,0 表示不改變,1 表示改變
        second = randrange(2)
        # 改變且猜中 => 表示第一次沒猜中
        if second == 1 and 1 in doors:
            i += 1
        # 改變且沒中 => 表示第一次就猜中
        if second == 1 and 1 not in doors:
            j += 1
    return [i, j]
跑 5000 次看結果
>>> guess(5000)
[1678, 819]
從程式的邏輯來看,可以從改變且猜中與改變且沒中看出,結果應該是 2︰1,也就是打開一扇門後,改變答案的正確機率是 1/3 2/3。

2011-12-21

荷蘭標 (單一利率標) (Dutch Auction)

一般來說,投標有兩種形式,複數標與單一標,後者一般稱為
荷蘭標或荷蘭式拍賣 (Dutch Auction),股票跟債券的下標方式皆一樣,都是價高者 (換算債券就是利率低者得標) 得標。

假設今天有一公司要發行 10 億的債券,總共有 A、B、C 三個客戶有意投標。
A︰利率 2.50%,金額 5 億。
B︰利率 2.45%,金額 3 億。
C︰利率 2.55%,金額 4 億。

採取複數利率標的情形
規則︰依價格順序取得額度,各得標者依得標利率或價格支付得標金額。
開標結果︰B 中標利率 2.45%,金額 3 億;A 中標利率 2.50%,金額 5 億,C 中標利率 2.55%,金額 2 億。

採取單一利率標的情形
規則︰依價格順序取得額度,得標利率為最後一個中標單位的利率或價格。
開標結果︰B 中標金額 3 億;A 中標金額 5 億,C 中標金額 2 億,中標利率皆為 2.55%。

目前在台灣,荷蘭標是主流,連中央政府公債也已經於 2004 年開始採取荷蘭標,詳見央行新聞稿

2011-12-17

python 批次下載圖片到指定的目錄

假設要抓一連串的檔案,每個檔案的檔名如同編號一樣,依次加一,可以直接用 python 寫的小迴圈來完成。

目標檔名︰http://example.com/pic001.jpg, http://example.com/pic002.jpg,......http://example.com/pic050.jpg
目標目錄︰/your/target/folder/
import urllib.request

base_url = 'http://example.com/'
base_name = 'pic001.jpg'
path_name = '/your/target/folder/'

for r in range(1, 51):
    file_name = base_name[:-7] + '{:03}'.format(int(base_name[-7:-4]) - 1 + r) + base_name[-4:]
    print(base_url + file_name)
    urllib.request.urlretrieve(base_url + file_name, path_name + file_name)

2011-12-13

REGEX in python

正常來說,處理 html 都是用專用的 xml 的 library,不過有很多網頁寫的很遭,不是 tag 沒有關就是 tag 不一致,整個結構鬆散,這時就得用 regex 抓出需要的資訊。

先載入需要的 module。
>>> import re
>>> import datetime
>>> import urllib.request
>>> from collections import *
抓所有的 url。
>>> page = 'http://blog.roodo.com/lakatos/archives/cat_243149.html&s=list&page=1'
>>> urls = []
>>> f = urllib.request.urlopen(page)
>>> txt = f.read().decode('utf8')
>>> f.close()
>>> mbooks = re.findall('(?<=<a class="aposted" href=")http://blog.roodo.com/lakatos/archives/\d+\.html(?=">)', txt)
>>> while (len(mbooks) != 0):
...    mbooks.reverse()
...    urls = mbooks + urls
...    page = page[:-1] + str(int(page[-1]) + 1)
...    f = urllib.request.urlopen(page)
...    txt = f.read().decode('utf8')
...    f.close()
...    mbooks = re.findall('(?<=<a class="aposted" href=")http://blog.roodo.com/lakatos/archives/\d+\.html(?=">)', txt)
打開所有的 url 並轉為 string。
>>> txts = []
>>> for r in urls:
...    f = urllib.request.urlopen(r)
...    txts.append(f.read().decode('utf8'))
...    f.close()
取得 id 跟 time。
>>> result = []
>>> for r in txts:
...    temp1 = re.findall('(?<=\d{7}\,\')(?P.*)(?=\'\)\"\>檢舉\).*\n.*\n.*\n.*\n\t\t\t\tat\t(?P.*)', r)
...    temp2 = []
...    for t in temp1:
...        temp2.append([t[0], datetime.datetime.strptime(t[1], '%B %d,%Y %H:%M')])
...    result = result + temp2
求出每個 id 出現的次數,結果會回傳一個 dict。找出某 id 的出現次數;找出出現次數前五多的 id。
>>> idscount = Counter([r[0] for r in result])
>>> idscount['angelo']
326
>>> idscount.most_common(5)
[('lakatos', 9011), ('白玫瑰', 2735), ('Richter', 2650), ('Fumio', 2187), ('Targus', 1804)]
對於少數不規則的 id,需要另外處理。
>>> def sameid(criteria, target):
...    temp = list(filter(re.compile(criteria).match, target))
...    i = 0
...    for r in temp:
...        i = i + target[r]
...    return [temp, i]
傳回一個 list,內含兩個成員,第一個是符合條件的結果,第二個是總個數。
>>> id1 = sameid('關.*魚', idscount)
>>> id1[1]
943

2011-11-28

主要的 open source 授權種類

五種開源授權規範的比較 (BSD, Apache, GPL, LGPL, MIT)

到底採取哪一種,其實是要看開發者的目的,如果是以向公眾發布並使公眾可以自行修改,而且修改後仍需向公眾公開 source code,那 GPL 無疑是最佳選擇,而且原作者也會因此而受益。在這個部落格中,所有的程式就是以 GPL V3 授權的,所以修改者也必需以 open source 的型式發佈,否則就觸犯了 GPL 的法律。在美國,GPL 的官司獲勝率幾近於 100%,私人公司最好不要以身試法,侵犯公眾權利,之前有公司被告到破產的,可以參考 BusyBox 與 GPL 授權再次贏得侵權訴訟從 BusyBox 案談起:台灣業者侵權利用自由軟體所面對的法律風險

什麼是 Copyleft?

copyleft 在 wikipedia 的項目

基本精神
Copyleft 是一由自由軟體運動所發展的概念,是一種利用現有著作權體制來挑戰該體制的授權方式,在自由軟體授權方式中增加 Copyleft 條款之後,該自由軟體除了允許使用者自由使用、散佈、改作之外,Copyleft 條款更要求使用者改作後的衍生作品必須要以同等的授權方式釋出以回饋社群。

授權方式
「版權」(Copyright)的概念是藉由賦予對著作的專有權利的方式提供作者從事創作之經濟動機,但相對的此種賦予作者專有權利的方式同時也限制了他人任意使用創作物的自由。Copyleft 則是自由軟體運動為了保護這種自由而發展的概念:它允許他人任意的修改散佈作品,惟其散佈及修改的行為和作法,亦限定以 Copyleft 的方式行之。

Copyleft 作品是有版權的,但它們加入了法律上的分發條款,保障任何人都擁有對該作品及其衍生品的使用、修改和重新發佈的權力,惟前提是這些發佈條款不能被改變。

Copyleft 不同於傳統的公有領域(public domain)。因為公共領域的作品,任何使用者雖然都可以使用,但可以不回饋變成已用並獲取利益;而 Copyleft 作品的使用者若是向外界發布衍生作品,不按 Copyleft 的授權條款要求保持同樣的授權條款,並將更改的版本公開,就是違反授權的侵權行為。

結語
Copyleft 並非讓作者放棄版權,而是讓後續創作者得到最大的授權,但由於原作品來自於公共性質,為免公共性遭到侵害,所以要求後續創作者也必須以 Copyleft 發佈,維持公共性質的完整。

延伸閱讀︰
淺談著作財產權讓與適用於 copyleft 開源軟體所產生的問題及因應之道

閱讀心得︰Adobe 放棄 Mobile Flash Player

Adobe放棄開發行動平台Flash Player之我見

台灣滿地都是腦殘媒體,願意花這麼大篇幅反駁,作者算是很有心;留言裡有提到被一些 Apple 的白目粉絲亂留言,所以已經將匿名留言功能關閉了。是媒體遮蓋了事實?還是暴民遮蓋了事實?

其實公司停掉一些沒前景的計畫是很正常的,google 也關掉了好幾個計畫,包括之前很熱門的 google wave;在關掉計畫之前,通常會試圖調整方向,看是不是還有機會,譬如 Apple TV 就是這一類;這類事情基本上就是要平常心看待,遇到死纏不放的人就只好見機行事了。

最後可以看一下求知個頭、虛懷個屁 (Stay Hungry, Stay Foolish),就知道該放棄台灣的媒體了。

2011-11-16

TeX 的前端工具 - LyX

官網

眾所周知,Tex 是一個高品質的排版軟體,但是因為不易使用,所以一直只在博士生之間流傳。演變到今日,出現了非常多的衍生作品,譬如台灣論文常用的 cwTex,科學界愛用的 LaTeX,支援系統原生字型的 XeTeX,都讓使用 TeX 的門檻降低不少。不過真正要推入一般使用者,WYSIWYG (所見即所得) 還是非常關鍵,所以 LyX 就出現了。

安裝方式︰以 root 權限執行。
apt-get install lyx
依賴的套件不少,所以會花一些時間在下載。如果要使用中文的話,要安裝專用的中文字型︰明體 (bsmi) 跟楷體 (bkai)
apt-get install latex-cjk-all

使用中文需要做一些設定,Document → Settings → Language,在 Language 選 Chinese (Traditional);Document → Settings → Fonts,CJK 輸入 bsmi (明體) 或 bkai (楷體),就完成了。

12 分鐘快速教學影片
裡面涵蓋如何編輯論文或書的標題、作者、分段、註腳、參考書目等等功能,看完後應該就能出版自己的作品了,其他進階的只要翻閱各 TeX 的手冊即可。

也可以參考由 TeX/LaTeX 製作中文 PDF 檔大家來學 LaTeX,裡面有完整的範例 TeX 檔跟完成的 pdf 檔,可以作為學習用。不過範例檔是 Big5 編碼,所以可以用 iconv 轉成 UTF8。
iconv -f big5 -t utf8 chpdf.tex -o chpdf.tex
也可以在 LyX 中輸出為 LaTeX (plain),然後照 LaTeX 的方式手動轉檔。先轉成 dvi
latex chpdf.tex
再把 dvi 轉 pdf
dvipdf chpdf.dvi
如果只想嵌入部份字型(檔案會比較小)
dvipdfmx chpdf.dvi
也可以直接從 tex 轉 pdf(檔案比較大)
pdflatex chpdf.tex
需注意的是,由於從 dvi 轉 pdf 時並不會參照 tex 檔,因此格式會預設為 US letter,假如要使用 A4,需要加入參數。
dvipdfmx -p a4 chpdf.dvi
如果要使用系統字型 (system fonts),則需要用 XeTeX,首先參考 XeTeX 快速上手修改文件,然後再生成 pdf
xelatex chpdf.tex
如果只想嵌入部份字型(檔案會比較小),就先生成 xdv
xelatex --no-pdf chpad.tex
再把 xdv 轉為 pdf
xdvipdfmx chpdf.xdv
結束。

PS
LyX 2.0 版之後,搭配 XeTeX,可以直接設定使用系統字型,參考這篇

2011-11-09

Compiling and installing gnuplot 4.5 on Debian

以 root 權限安裝依靠的程式︰
apt-get install cvs libgd-tools wx2.8-doc wx-common libgl1-mesa-dev xlibmesa-gl-dev libgl1-mesa-dev
apt-get install automake checkinstall libwxgtk2.8-dev libpango1.0-dev libx11-dev libxt-dev texinfo libgd2-xpm-dev libreadline6-dev
以一般使用者權限下載原始碼並編譯與測試︰(安裝位置為 /opt/gnuplot,避免跟 repositories 的其他版本衝突)
cvs -d:pserver:anonymous@gnuplot.cvs.sourceforge.net:/cvsroot/gnuplot login
cvs -z3 -d:pserver:anonymous@gnuplot.cvs.sourceforge.net:/cvsroot/gnuplot co -P gnuplot
./prepare
./configure --prefix=/opt/gnuplot
make
make check
以 root 權限安裝︰
make install
啟動
/opt/gnuplot/bin/gnuplot

2011-11-08

在 Debian 安裝 numpy 與 scipy 給 py3k 使用

numpy 版本為 1.6.1,scipy 版本為 0.9.0,py3k 版本為 3.1.3。

pre-requirement: python3-dev, gfortran, libatlas-dev, liblapack-dev
以 root 權限安裝︰
apt-get install python3-dev gfortran libatlas-dev liblapack-dev
然後再分別進入 numpy 跟 scipy 安裝︰
python3 setup.py install
完成。

2011-11-07

歐洲央行官方參考匯率︰官方 XML 的最佳示範

Euro foreign exchange reference rates

有提供每日與歷史的 XML 檔,所以可以拿來做網頁應用或資料庫。也有 php 的應用示範,可以說是提供了最大的支援,值得各國政府學習如何公開資訊與資料庫。

底下範例將使用到 XPATH,所以要用到 lxml,python 在 2.7 版與 3.2 版以後,其內建的 ElementTree 1.3+ 版本也提供支援。不過 Debian 內的 py3k 還是 3.1.3 版,所以先以 lxml 來示範。

程式碼
>>> from ecbxml import *
>>> fx('GBP')
0.86125
>>> fx('GBP', '20111103')
0.8593
>>> fx('GBP', '20111102', '20111104')
[['2011-11-04', 0.86125], ['2011-11-03', 0.8593], ['2011-11-02', 0.8619]]
>>> fx('GBPJPY', '20111102', '20111104')
[['2011-11-04', 124.87663280116111], ['2011-11-03', 124.90399162108693], ['2011-11-02', 125.04930966469428]]

2011-11-05

發行公司的反稀釋條款

在企業的籌資活動中,關於股權的部份總是引人注意,特別是長期的投資者,更是需要注意發行公司各類稀釋股東權益的手段,這裡將以可轉債 (Convertible Bond,CB) 與海外可轉債 (European Convertible Bond,ECB) 為例。

由於涉及公開募集有價證券,所以這類籌資行為一定會有公開說明書,可以在股市觀測站中找到,舊版公開資訊觀測站→常用報表→公開說明書,新版公開資訊觀測站→資訊項目→電子書→公開說明書。至於有哪些案子正在證期局審核或是已經結案的資訊,在這邊有 Excel 格式的整理,內含收文時間與生效時間。這類公開說明書通常有兩個版本,第一個版本是稿本,作為給主管機關審理用,第二個版本是正式版,會對於發行價格與條款做最後修改,主管機關有疑慮的部份也會在這個版本修正。

先以 CB 為例,在這邊,是一個稿本,不過不影響說明。可以看到封面說發行第二次與第三次無擔保轉換公司債,發行與轉換辦法看 74 頁與 82 頁。轉換價格會等到主管機關核定後才訂定,所以是●號。直接跳到 76 頁的 (二)發行後轉換價格之調整,會看到現金佔股價超過 1.5% 時,需要調整轉換價格。$$調降後轉換價格 = 調降前轉換價格 × (1 – 發放普通股現金股利占每股時價之比率)$$另一個更重要的是新股發行時的價格調整,包括︰現金增資、盈餘轉增資、資本公積轉增資、員工紅利轉增資、股票分割、受讓他公司股份增資、合併增資、及現金增資參與發行海外存託憑證等,不包括︰本公司所發行具有普通股轉換權或認股權之各種有價證券換發
普通股股份。$$調整後轉換價格 = \frac{調整前轉換價格 \times 已發行股數 + 每股繳款金額 \times 新股發行數}{已發行股數 + 新發行股數}$$調整時間為除息基準日或新股發行日。

至於 ECB,在這邊,是一個正式版。跳到 7 頁,找到 Conversion Price 是 US$3.77 / ADS,也就是說可以用 3.77 元轉換為美國存託憑證 (American Depositary Shares,或稱 American Depository Receipts),一樣有反稀釋條款,在 20 頁,由於 ECB 的投資者更加專業,各種 exotic 的條款非常多,所以 ECB 無法使用同一種模型定價。

至於這些反稀釋條款出現的原因主要是大股東的意見,台灣早期藉由內部成本外部化的方式濫發股票卻不用在台灣的會計上記入費用,但是在海外掛牌的 ADR / GDR 卻要記入費用,而且台灣美其名為除權的活動,實際上是分割 (split),但卻因為員工配股而使得大股東的持股比例下滑,所以發展出反稀釋條款來保護自己。

台灣上市公司的經營層是很奸詐的,散戶要坑,外資要坑,連政府也是照坑,誰叫台灣股民白痴,官員無能。

VOIP solution - Obihai

官網

設定方式

我買的是 OBi110,在 Amazon 牌告價 USD 49.99 元,只要連上網設定 Google Voice 的號碼當固定網路的號碼,再把家用電話接上即可使用,非常方便,從此不用再付固網基本電話費了。

也可以在 iPhone 或 Android 手機上找 OBiON 的 app,使用 wifi 或 3G / 4G 打電話 (號碼顯示為 Google Voice),真的是超強。

看來 VOIP 的時代真的來了,只要各國的電信業者抵制失敗,買個 VOIP device 打網路電話已經是垂手可得,賣 VOIP 號碼的也許會有一點商機吧。

Reference: OBiTalk's google voice setup manual

小型法人的墳墓 - 人工撮合的資訊不對稱

一般來說,over-the-counter 的交易都是同時間存在多個價格,譬如銀行報給一般企業客戶的匯率,便有這個特性,這不同的價格是由交易對手風險、交易的單位大小與是否有其他搭配商品組合而成的,所以越小的客戶需要得到的買賣價格會越差 (通常是報價的 bid / ask 越寬),而且由於金額相對小,所以固定成本 (手續費跟處理費等等,銀行的交易是很繁雜落後的) 會相對較高;如果是交易金額較大的,以台幣對美金來說,一百萬美元 (術語︰一支) 為一個交易單位,這時便可以要求銀行幫忙到市場上掛一個價位,譬如要以新台幣 30.232 元買一支美金,則銀行可能會以 30.235 元幫客戶掛單,0.003 元則是銀行的手續費,或者一樣用 30.232 元掛單,但是手續費另外計算。

至於在金融機構法人之間的交易也是類似,buy-side 的客戶 (基金、保險公司、信託、其他非交易商的金融機構) 需要委託 sell-side 的機構 (券商、銀行) 進行掛單,如果已經有電子交易平台的,就直接輸入,如果沒有的話,就要再透過專門從事法人間撮合交易的公司 (broker company) 進行詢價;原則上,這類公司就是一種小型的交易所,所以會有一個自己的 bid / ask 報價頁面 (通常是在 reuters或Bloomberg,有時會用自己的電子交易平台),裡面的價格則是來自所有的法人客戶。

真正有趣的地方從這理才開始。由於 broker company 是靠手續費維生,所以需要盡量衝大交易量,最簡單的方式就是把小客戶的資訊透漏給大客戶 (沒犯法),讓大客戶可以賺錢,如此就可以下更多的單。不過市場上通常存在多個 broker companies,所以通常交易員會同時在不同的 broker companies 下單,避免被掌握真正的部位;最常見的情形是,一個交易員會常在 3 個 broker companies 下單,比重可能是 80%、15%、5%,藉以獲得不同的資訊。話雖如此,但是公司比較大的法人或是客戶比較多的法人,還是佔據絕對的資訊優勢,所以久而久之便會有主要配合的 broker,當這個 broker 換公司,交易員便會跟著換到這個 broker 的新公司下單。原因是「默契」,包括個人回扣、請客吃飯、出國旅遊、夜店消費等等,這種恐怖平衡也是信賴的保證。

至於公司的管理階層為何不管?原因是通常管理階層也是分錢的一份子,只要公司有賺錢,利益輸送一些到自己口袋也是業界 (全世界都這樣,包括新加坡) 潛規則,只要公司的監察人沒意見就好。

這類型的交易可以說是法人間交易的主流,外匯、債券、衍生性商品都是,而這類 broker companies 進入門檻也不高,通常是淘汰下來的交易員轉任的,由於公司只有人事成本,所以只要賄絡得當,一下子就可以長成大公司,甚至上市。

雖然正常人都知道電子交易平台的好處,不過貪婪的力量就是這麼大,這些人交易技巧雖然不好,不過藉著公司的資源 (客戶數目、結算地位、進出口押匯),這種 A 錢的生意倒是很難被檢討,反正這是公司內控的問題,股東心裡有數就好;高層的管理水準這樣子,會計報表又有多少可信度呢?

PS1
通常政府推行電子交易平台,這些 broker companies 跟主要交易商就是最主要的反對者,而且通常這些人會獲勝,因為只要再去賄絡官員就好了。
PS2
這種賺錢方式與 A 錢方式被認為是一種專業,所以 head hunter 只會問該交易員賺多少錢,不會問交易員的報酬率或是其他專業能力 (撈偏門的人通常專業能力差,這是機會成本問題)。
PS3
台灣央行也是這種制度的愛用者,可以常常去問台北外匯公司或元太外匯公司目前的市況,不需要等到收盤後 (台灣的銀行自有部位外匯交易需要每日申報,除非用海外分行的部位做交易)。

2011-10-28

簡單財務工程化解希臘僵局

一般來說,政府債券多是本國銀行跟壽險公司持有,其他則是共同基金的形式持有,外國人持有的通常比較少;以歐元計價的公債來說,追求安全的外匯投資策略,多半會以德國或法國為主。

由於歐盟峰會決定學習史蒂芬周的投降輸一半策略 (減計面額一半),所以我們可以倒推希臘的銀行跟壽險公司都是將公債放在持有到期的會計科目,不然早就在之前的季報、半年報、年報減計 (write down) 了,可知這些銀行跟壽險公司的會計處理原則不太可靠。

目前消息是到期的公債可以拿回 15 元現金與 30 年的公債 (市價 35 元左右),如此可以避過 ISDA 規範的 credit event;不過有在觀察希臘問題的人會發現,目前 3 年以下的希臘公債都在 50 元附近,其實可以自行完成這個交易;困難點在於,這樣的交易只要做幾筆,銀行就已經在會計上破產了,雖然目前是以殭屍銀行的形式活動。

所以希臘政府可以免費送給所有的債券持有人一個歐式買權,交易內容是以即將到期的公債買 15 元現金與新的 30 年公債 (票面利率 6%,不過市價只有 35 元)。

這樣的好處是,反正歐洲峰會也沒有掏錢出來,政府也不需要強制壓迫債券持有人做出決定,而是給予債券持有人自行決定的機會。短期債券的持有人會傾向於不履約,因為可以拿回本金,不過政府若付不出本金就會發生 credit event,則剩下大批的庫存債券也需要立即減計,如此政府破產先,債券持有人破產後。不過在履約後,銀行壽險也是要立即減計 50 元的損失,只是這樣不需要再搞什麼特別的會計處理原則,庫存的債券也暫時不需要減計,直到也輪到這批債券履約。

這個交易會有一個地方讓 hedge fund 有機可趁,就是放空長期公債,買進短期公債,然後到期不履約,這樣可以賺大錢;不過實際上很難發生,因為只要短期公債不履約,銀行壽險就會破產,所以真正出現的情形會是銀行壽險跟 hedge fund 搶買短債,這樣就會使得短債收益率下跌,降低市場恐慌氣氛。

財務工程是為了解決市場的需求,這只能解決目前問題,長期還是要靠政府重整財務結構,再說也不是每次問題都可以想出辦法解決,政府一味的扼殺金融創新,卻沒想到簡單的金融創新就可以解決問題。

金融資產的會計處理原則

此處理方式僅適用於公司會計,基金不能用的原因容後再敘。

依照台灣 34 號會計公報,金融資產有下三種處理方式:

第一種:持有到期 (hold to maturity)
具有固定或可決定之收款金額及固定到期日;且企業有經濟意圖及能力持有至到期日之非衍生性金融資產。 非屬下列情況之一者:放款及應收款、指定為備供出售或指定為公平價值變動列入損益者。

第二種:備供出售 (available for sale)
持有至到期日之投資;以公平價值衡量且公平價值變動列為損益之金融資產;放款及應收帳款等類別之非衍生性金融資產。

第三種:交易部位 (trading)
其他的都放在這種,尤其是經常短線拋補的部位。

債券通常是三種都有可能,譬如壽險公司拿來對沖保單的預定利率,所以會把大部分都放第一類,一部分放第二類,極少的部分放第三類,以符合 buy and hold 的交易原則。銀行也是都有可能,不過一般放第二類比較多,第三類跟第一類其次。

另外,分類好之後,除非重大理由,否則是不能更改的;這相當大程度的解決了台灣之前非常嚴重的作價問題,詳細可以看 fraudfix income 分類。

至於在財報的影響上,第三類是每日需要計算損益的,第二類放在季報上,評價的損益只影響每股淨值,第一類則是完全不影響。

基金不能用的原因是,如果高估庫存的有價證券,則目前贖回的投資人占了其他投資人的便宜,如果低估庫存的有價證券,就變成目前贖回的人吃虧了;所以需要倚賴券商與銀行提供的參考報價 (參考報價或模型價皆可,重點是來源要夠分散) 來計算每日淨值。

reference: 投資.ppt

PS1
台灣很多黑心記者常常會報導壽險在債券投資的未實現利得很大,其實完全是錯的,因為那是對沖保單的負債;利率下滑時,債券與保單價格同時上升,壽險公司賺的利差不變;利率上升時,也是一樣。

PS2
台灣的債券參考報價由櫃檯買賣中心依照券商提供的不流動動公債與各信用評級的公司債後,依照模型每日計算;所以離開模型價太遠就是異常,很容易事後檢討。

2011-10-26

閱讀心得︰百年中國經濟史筆記 by 楊小凱

長期觀察中國經濟發展的人對於中國經濟發展的多種論述經常感到疑惑,除了資料不完整,還有對於中國體制的不了解,都使得我們難以深入去了解制度上的問題。金融時報 (Financial Times) 跟華爾街日報 (Wall Street Journal) 上的精闢論述,反覆在這筆記裡出現;閱讀之後,發現中國這一百年進步的實在不多。

這文章立場算中立,雖然多次引用他人著作,但是加上作者的筆記,不管是了解中國近代經濟發展或深入研究,都是不可多得的佳作,所以我沒有任何評論。

2011-10-10

Debian 上使用 PPPoE 軟體撥號

一般來說,使用者偏好硬體撥號,也就是利用數據機內建的撥號程式撥號,或是利用接在數據機後面的 IP 分享器裡的程式撥號;不過因為台灣的寬頻有提供多組浮動 IP,所以在某些情形下,採取軟體撥接 (硬體撥接未斷線) 是一個很彈性的作法。

以 root 權限安裝。
apt-get install pppoeconf
設定帳號密碼 (對話式選單)。
pppoeconf
啟動軟體撥號。
pon dsl-provider
掛斷軟體撥號。
poff
以上所設定的資料分別在 /etc/ppp/peers/dsl-provider 與 /etc/ppp/pap-secrets 。

Be anonymous - tor-project

tor-project

What is Tor?
Tor is free software and an open network that helps you defend against a form of network surveillance that threatens personal freedom and privacy, confidential business activities and relationships, and state security known as traffic analysis.

Why Anonymity Matters?
Tor protects you by bouncing your communications around a distributed network of relays run by volunteers all around the world: it prevents somebody watching your Internet connection from learning what sites you visit, and it prevents the sites you visit from learning your physical location. Tor works with many of your existing applications, including web browsers, instant messaging clients, remote login, and other applications based on the TCP protocol.

Using tor with the bundled browser aurora
It has integrated with browser aurora. Just download it, extract it and run the executable, that's all.

Excluding certain exit nodes
Vidalia Control Panel → Settings → Advanced → Edit current torrc,add
ExitNodes {US},{CA}
StrictExitNodes 1
to elude some nodes, like US and Canada.

2011-10-02

文字辨識 - tesseract-ocr

tesseract-ocr

雖然 repositories 中也有,但那是 2.0 版的,沒有中文辨識;而 3.0 版後,則新增了非常多的語言支援,正體中文跟簡體中文都有,所以當然要使用 3.0 版;以下為 3.01 版。

先安裝依賴的 libraries
apt-get install autoconf automake libtool libpng12-dev libjpeg62-dev  libtiff4-dev zlib1g-dev
由於 libleptonica 要 1.67 版以上,所以切換到 testing
apt-get -t testing install libleptonica-dev
接著,下載原始碼後︰
./autogen.sh
./configure
make
然後以 root 權限︰
make install
再以 root 權限將訓練好的資料放進去︰
mv *.traineddata /usr/local/share/tessdata
就完成 tesseract-ocr 安裝了。
至於將 PDF 轉為 tiff,需要 ImageMagick,以 root 權限輸入
apt-get install imagemagick

使用方式︰
辨識 source code 中的 eurotext.tif 並將結果存為 output1.txt
tesseract eurotext.tif output1
辨識 source code 中的 phototest.tif 並將結果存為 output2.txt
tesseract phototest.tif output2
需要注意的是,tesseract 的 bpp (bits per pixel) 只支援1、2、4、5、6、8,所以如果要將 pdf 轉為 tif,需要指定 bpp 為 8 (以下亦指定解析度為 300)︰
convert -density 300 memo.pdf -depth 8 memo.tif
如果要辨識某種文字,譬如正體中文,必需要將參數放在第三個︰
tesseract memo.tif memo -l chi_tra

Reference: Tesseract 3.0 + Ubuntu 10.04 Installation Guide

PS
現在可以直接從 testing channel 安裝,參考這篇,然後
apt-get -t testing install tesseract-ocr libtesseract3 tesseract-ocr-chi-sim tesseract-ocr-chi-tra

硬碟單位儲存成本跌破 DVD-R

自從巨磁阻效應 (Giant Magnetoresistance) 發表以來,硬碟的容量成長率為每年 20% ~ 30%,時至今日,硬碟的單位儲存成本已經低於 DVD-R 了。

以 3TB 容量來看,目前一顆 3.5 吋 5400 轉的硬碟約 125 美元,3.5 吋 7200 轉的硬碟約 165 美元,前者是 0.0416 USD/GB,後者是 0.0550 USD/GB;與此同時,100 片4.7GB 的 DVD-R 為 22.5 美元,單位成本是 0.0479 USD/GB,50 片 25GB 的 4X BD-R 為 44.5 美元,單位成本是 0.0356 USD/GB。也就是說︰
BD-R < 3.5"-5400rpm HDD < DVD-R < 3.5"-7200rpm HDD
而且以目前單位價格來看,3.5"-5400rpm HDD 只比 BD-R 高出約17%,很快 3.5"-5400rpm HDD 就可以稱王了。這會對於高畫質的影片保存觀念形成重大影響,因為成本快速下降下的 DVD-R 與 BD-R 塗料品質,都無法長期保存資料,將資料儲存在 HDD 才是安全的做法,而且 HDD 的存取速度遠超過 DVD-R 與 BD-R,更進一步拉大儲存的誘因。

反過來說,這也會推動線上電影租賃市場與買賣市場,尤其目前寬頻的普及率已高,720P 的 bitrate 平均約需要 6.5Mbps,1080P 的 bitrate 平均約需要 10Mbps,目前普及的寬頻看來都已經滿足初步的需求了,如果是看動畫片,則 bitrate 還可以更低一些。

2011-09-30

救回刪除的檔案 - TestDisk

TestDisk

支援格式有︰FAT16 / FAT32 / NTSF / ext2 / ext3 / ext4 ....
支援的平台︰Linux / Windows / Mac / Sun / BSD

基本上算是全方位的支持,被刪除的區塊如果被覆蓋了,大概還是找不回來。

使用方式 (root 權限)
testdisk
如果是 ext4 的格式,格式要選 [None ] Non partitioned media,如此才抓得到。操作方式蠻簡單的,可以參考這篇

2011-09-27

DVD9 轉為 DVD5 的 iso 檔

lxdvdrip

用 perl 寫的,主要是把幾個常用的寫成腳本,省去一大堆指令。

建立一個參數參考文件放在 ~/,可以參考這個
gedit ~/.lxdvdrip.conf
查看 DVD 的結構,包括 titles 跟 chapters。
dvdbackup -i /dev/dvd -I
取出 title 4,訊息顯示設為英文 (因為該程式的預設語言是德文),選取中文聲道,不要分 chapters,取消預設的燒錄程式並取消等待燒錄,然後輸出為 DVD 結構。
lxdvdrip -bp=0 -wb=0 -lang=en -a=4,zh -t=4 -chap=0 -fv=~/Videos
製作成 iso 檔,volume name = mydvd。
genisoimage -dvd-video -V mydvd -o ~/Videos/finish.iso ~/Videos/your_output_dvd_folder
完成。

PS
lxdvdrip 有很多 bug,像是 mkisofs 已經在 debian 報廢,現在用 genisoimage,用法都一樣;參數的輸入也有些問題,像是 -mp 就失效了,只能在 .lxdvdrip.conf 中修改;或是轉完 DVD 後,還出現 "The backup safety copy isn't completed !",其實不用理它。

2011-09-26

Linux 下更改 DVD 區碼 - 避開 PRC 保護

regionset

由於每台新的 DVD-ROM 只能改五次,所以一定要謹慎。先放入一片有區碼的 DVD,如果想修改成 3 區,該片 DVD 就要是3區的;然後以 root 權限。
regionset
接著照著回答就好了。

修改好之後,可以把 DVD-ROM 掛載到 VirtualBox 內︰VirtualBox → Settings → Storage → Host Drive,勾選 Passthrough。

然後就可以用 AnyDVD 與 CloneDVD,或者用其他 linux 工具,如 vobcopy。如此一來,只要解開 CSS 就可以處理 DVD,只是不太完美就是了。

2011-09-20

在 Linux 讀取 CSS 與 RPC 保護的 DVD

CSS︰Content Scramble System
RPC︰Regional Playback Control

由於 DVD 的保護有四層,分別是作業系統、播放軟體、DVD 機器、DVD 光碟,而 Linux 是沒有 RPC 的,播放軟體也沒有,所以只剩下解除 DVD 機器上的 RPC,以及 DVD 光碟的 CSS 就好了。

以 root 權限安裝。
apt-get install libdvdread4 libdvdcss2
以 root 權限重新設定。
dpkg-reconfigure libdvd-pkg
如此就可以用 Totem、SMplayer、VLC 來觀賞 DVD。

直接將 DVD 轉為 iso 檔。
dd if=/dev/dvd of=/your/target/folder/dvd.iso

在硬體的部份,由於 DVD-ROM 製造商有鎖 RPC,比如︰RICOH / Philips / Matshita / Panasonic,所以需要到 RPC1RPC1 database 去找 firmware 跟 flashing software,比較麻煩的是,這些 flashing software 通常都只有 windows 版,所以得製作一個多重開機 USB 來完成。

處理 VOB 方面,可以用 mencoder、vobcopyGUI

2011-09-16

excel parser for python - xlrd

xlrd
xlrd3

100% 由 python 寫的,因此可以使用在 GAE。

python 2.6 版之前的,使用 xlrd;py3k 之後的,使用 xlrd3。兩者的 API 100% 相容,只是維護者不同。

py3k 使用方式
>>> import xlrd3 as xlrd
其他就完全比照 python 2.6了。

2011-09-15

舊 DVD 影片轉 x264 格式壓縮的 mkv

事由︰一片舊的 DVD 光碟,左右聲道分別是不同的語言。
目標︰轉成容易保存的格式
思考︰採用高畫質的壓縮方式把容量盡量壓低,音質採取 AAC 即可。

首先把 DVD 光碟中的 VOB 合成一個。
mencoder -idx -ovc copy -oac copy *.VOB -o temp.VOB
或者只選擇特定 title 與 chapter,如 title 3 的 chapter 2 ~ 4。
mplayer dvd://3 -chapter 2-4 -dumpstream -dumpfile temp.vob
剪掉前面一分鐘的片頭跟廣告,聲音的 bitrate 維持 256k;切除黑邊,最好使用目測值;需切除的區域為 left:top:right:bottom=10:72:18:86,in_w 跟 in_h 是自動抓取影片來源的寬度與高度預設值。
ffmpeg -i temp.VOB -ss 00:01:00 -vf crop=in_w-10-18:in_h-72-86:10:72 -sameq -ab 256k origin.VOB
抽出 audio,DVD 的 audio 格式是 AC3,轉為 WAV 才能抽取聲道。
ffmpeg -i origin.VOB -vn -acodec pcm_s16le -ab 192k -ac 2 origin.wav
抽取左右聲道。
sox origin.wav x1.wav remix 1 && sox origin.wav x2.wav remix 2
由於抽出的聲道是 mono,可以轉為假的 stereo。不編碼 video 以增進效率,順便將 WAV 轉為 AAC,bitrate=192k。
ffmpeg -i x1.wav -vn -acodec libfaac -ab 192k -ac 2 z1.m4a && ffmpeg -i x2.wav -vn -acodec libfaac -ab 192k -ac 2 z2.m4a
audio 好了之後換 video,audio 設定不編碼,如果還沒切掉黑邊,也可以現在切;denoise 跟 decomb 都需要,前者可以去雜訊兼縮小檔案容量,後者可以去交錯。
HandBrakeCLI -i origin.VOB -a none -e x264 -q 20.0 -f mkv --strict-anamorphic --crop="72:86:10:18" -x ref=2:bframes=2:subme=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0 --decomb="default" --denoise="strong" -o temp.mkv
將之前的兩段 m4a 加到 mkv 檔。
mkvmerge temp.mkv z1.m4a z2.m4a -o final.mkv
完成。

股價越高本益比越低?

正常情形之下,當然不可能股價越高本益比越低,但是透過一些財務安排,卻可以達成這個效果,以下以兩種方式說明。

第一種是設立一個投資公司,然後大舉買進自家股票;假設母公司原來營利 = \(A\),設立一子公司資本額 = \(B\) 且全部買母公司的股票,母公司在 T0 時市值 = \(X\),T1 時股價變動率 = \(d\)

T0 時的本益比︰$$\frac{X}{A}$$
T1 時的本益比︰$$\frac{X(1+d)}{A+Bd}$$
T1 本益比 - T0 本益比︰$$\frac{X(1+d)}{A+Bd}-\frac{X}{A}=\frac{(A-B)Xd}{A(A+Bd)}$$
如果要達成股價越高本益比越低,就是 T1 本益比 < T0 本益比;由於 \(d>0\),當 \(A>0\),條件是\(A<B\),也就是母公司需要設立一個子公司買入市值大於營利的股票,如此便可達成;反之,若股票下跌時,則母公司的本益比也會越來越高。另一種情形,當 \(A<0\),只要 \(A+Bd=0\),母公司就從賠錢變成損益兩平了。

這個問題在會計制度修正後,基本上已經消失,所以後來衍生出下一種方式。

第二種就是 equity swap,達成的效果跟第一種一模一樣,而且因為 swap 交易是屬於 off-balance sheet 的,所以不需要揭露在財報上,甚至可以玩得槓桿更高,不過因為後來有一間上市公司把自己玩到破產,所以原則上已經被主管機關口頭禁止了,雖然還是可以在海外繼續玩。

以目前國內的狀況來說,主管機關、會計師、監察人的專業能力明顯不足,估計第二種方式應該還可以存活很長的一段時間,而且實際上的情形是,越短線的投資人對公司做帳越捧場,而大股東則可以以個人身份在海外買 tailor-made 的權証,優劣勢可說是一目了然。補救方式應該是對會計師或監察人求償,這點就要看政府的心態了;基本上台股依然是全球最好騙最好撈的地方。

PS
其實還有一個邪惡版的解,就是公司大股東管不了經理人,而經理人壓寶股價下跌,這時變成可以讓公司獲利增加,經理人拿到 bonus (長期的 option ),這種狀況可能在被棄守的公司發生,歐美的金融股看起來有點這個調調。

2011-09-14

最有效率的捐款 - distributed computing projects

傳統的捐款是捐款人將錢轉到受款人的戶頭,中間需要經過金融中介機構,而受款人也需要請人來管理帳務相關事宜,然後再決定如何分配到各個子項目。整個流程需要經過許多的人,而人也是最容易產生問題的根源,所以在某些領域有了新的運作方式。

我們可以去除中間人,但是無法去除中間人的工作

實踐辦法是拆解工作後進行數位化。譬如一些疾病研究機構需要大量的運算,首先將工作切細成可以分別計算的小包,然後將這些小包在網路上送給志願參加的電腦,這些志願參加的電腦在完成後再回傳給研究機構,最後將成果合併就完成了。至於這些志願參加的電腦,多數是安裝一個背景程式,在 CPU 或 GPU 閒置時,將切割好的資料進行運算,徹底讓電腦處於 100% 的工作狀態;這類程式都寫得很好,一般使用者在操作上並不會感覺到,主要是在電費的帳單上。

這套機制由於運作的太過於良好,在 List of distributed computing projects 上也有一些商業公司魚目混珠,變成營利公司利用一般人的善心進行內部成本外部化,雖然也多半是科學研究,不過這些成果是屬於公司的,並不是公共財,這是今天最需要注意的地方。

志願參加的電腦衍生的成本是電費,以 65W 的 CPU 全速運轉一個月,65W x 24 x 30 = 46800,相當於 46.8 度電,以一度電 3 元來計算,一個月「捐款」140.4 元,而且完全都用在刀口上,唯一的問題是不能抵稅。雖然在個人帳戶上可以看到貢獻度,不過據我所知,並不能印出來後當作單據來抵免個人所得稅,這部份可能未來有需要立法來推動。

這裡順便比較一下 CPU 與 GPU 的運算能力︰Intel Q9550S vs Nvidia Telsa C2050

前者運算能力 2.83GHz x 4 = 11.32GHz,耗電量 65W,能源效率 0.1741GHz/W;後者運算能力 1.15GHz x 448 = 515.2GHz,耗電量 238W,能源效率 2.1647GHz/W;也就是說後者的單位能源效率是前者的 12.4 倍!

GAE python 2.5 ssl problem

採用 python 2.5 上傳 GAE 時會遇到下面警示︰
2011-09-14 03:10:02,725 WARNING appengine_rpc.py:435 ssl module not found.
Without the ssl module, the identity of the remote host cannot be verified, and
connections may NOT be secure. To fix this, please install the ssl module from
http://pypi.python.org/pypi/ssl .
To learn more, see http://code.google.com/appengine/kb/general.html#rpcssl .

解決辦法︰以 root 權限安裝缺少的 libraries。
apt-get install libssl-dev python2.5-dev libbluetooth-dev
進入 ssl 檔案夾。
python2.5 setup.py build
以 root 權限安裝。
python2.5 setup.py install
完成。或者也可以用 python 2.6 以上的版本上傳,就沒這個問題了。

reference: Fixing appengine SSL error on Ubuntu 10.04

2011-09-11

Audio 的瑞士刀 - SoX

Sound eXchange - SoX

以 root 權限安裝。
apt-get install sox
查看檔案結構。
soxi target.wav
轉檔︰AC3 → WAV。
sox input.ac3 output.wav
影片的話就要用 ffmpeg,順便輸出成 wav 格式。
ffmpeg -i input.rmvb -c:a pcm_s16le output.wav
取出第一個聲道。
sox input.wav output.wav remix 1
單聲道轉為雙聲道方式一。
sox mono.wav -c 2 stereo.wav
單聲道轉為雙聲道方式二(自我複製)。
sox -M mono.wav mono.wave stereo.wav
取出雙聲道中的左聲道。
sox stereo.wav -c 1 mono.wav avg -l
合併檔案。
sox -m source1.wav source2.wav target.wav
sox source1.wav source2.wav target.wav
改變聲音大小,0.5 表示音量減半,3.0 表示音量變三倍。
sox -v 0.5 input.wav output.wav
sox -v 3.0 input.wav output.wav
轉成 AAC 格式,這個就比較麻煩了,有的 sox 版本不支援 AAC 等等格式,可以參考 SoX format 或輸入
sox -h
找 AUDIO FILE FORMATS。
如果該 sox 版本有支援的話,由於是採用外掛 ffmpeg,所以指令如下
sox input.wav -t ffmpeg output.m4a
其他轉 AAC 方法一︰ffmpeg
ffmpeg -i input.wav -c:a libfaac -b:a 192k output.m4a
其他轉 AAC 方法二︰faac
faac input.wav -o output.m4a -b 192

reference:
15 Awesome Examples to Manipulate Audio Files Using Sound eXchange (SoX)

2011-09-10

監測 CPU 溫度

Computer Temperature Monitor

有時我們會跑一些相當消耗 CPU 的工作,這時 CPU 的溫度會非常的高,所以我們需要一個程式可以在溫度到達臨界點時發出警訊。以 root 權限安裝。
apt-get install computertemp
在桌面上方的 Panel 空白處按右鍵選 Add to Panel → Computer Temperature Monitor 新增到 Panel;然後可以在該程式的 Preference 設定警示溫度等選項。

Gnome Sensors Applet 是另一個監測 CPU 的程式,跟 Gnome 關係較近一些。

如果只想知道目前的溫度,可以安裝 lm-sensors
apt-get install lm-sensors
看全部的溫度與電壓資訊
sensors
只看 CPU 的部份
sensors | grep 'CPU Temp'
結束。

2011-09-09

JDownloader 免費空間下載軟體

除了 tucan 外的另一個選擇,多平台 (Linux,Mac,Windows),支援更多目前主流的免費空間,不過介面沒那麼優。先安裝 unrar 的非自由軟體版讓檔案下載完後自動解壓縮。在 root 權限下︰
apt-get install unrar
安裝 JDownloader
./jd_unix_0_9.sh

目前看起來問題不少,只能當作候補。

2011-08-31

GAE Datastore Index Configuration

Python Datastore Index Configuration

線上資料庫畢竟是共享硬體資源的,為了效率,所以 GAE 要求某些的回傳排列方式要先設定 index。設定方式其實蠻簡單,就是在 index.yaml 做一些設定就好。

譬如讓 Dog 資料模型參考其關聯的 ancestor、age 按順序排列,weight 按照反順序排列。
indexes:
  - kind: Dog
  ancestor: yes
  properties:
  - name: age
    direction: asc
  - name: weight
    direction: desc
如果沒有設定 index.yaml,在回傳資料的過程中會自動跳出錯誤訊息,並建議如何設定 index.yaml,算是蠻貼心的設計。

2011-08-30

將某段影片轉為一連串圖片

有時我們需要仔細分析一小段影片,但是由於動作太快,所以看不清楚;這時我們可以將這一小段影片拆解為一連串的圖片,再來做靜態分析。

把影片從 15 分 08.735 秒開始的 2 秒,依每秒 30 張,目標圖檔畫質等級為 2 (從 1 到 31,數字低畫質越好),轉為 foo-001.jpeg、foo-002.jpeg 等等的一連串圖片。
ffmpeg -i source.rmvb -ss 00:15:08.735 -t 00:00:02 -r 30 -qscale 2 -f image2 foo-%03d.jpeg

2011-08-29

Access GAE Online Datastore with Remote_api

由於 GAE 可以免費存放 1G 的資料在 datastore,除了網站使用外,有時我們也需要把它當成線上資料庫來使用,在 GAE 1.1.9 版後的 remote_api 就是為此而生。

只要修改 app.yaml 就好了。
builtins:
- remote_api: on

使用方式︰設定 PYTHONPATH 後,連結 myapp.appspot.com 並進入 python 2.5
PYTHONPATH=/your/local/app_id/folder python2.5 remote_api_shell.py -s myapp.appspot.com
載入相關模組
myapp>>> import models
myapp>>> from google.appengine.ext import db
取得一個含有資料物件的 list
myapp>>> query = models.mymodel.all().order('-date').fetch(10)
回傳第一個物件的 date (可以從 dir(query[0]) 知道有哪些欄位可以回傳,或打開 models.py 看看模型有哪些欄位)
myapp>>> query[0].date
datetime.datetime(2011, 8, 26, 13, 45)

不過這畢竟是線上的資料庫,所以資料應該一次抓下來再處理,如果當作是在處理本地資料庫,將會變得非常沒有效率。

reference: Accessing the datastore remotely with remote_api

2011-08-24

Reverse a singly linked list

Source
#include <stdio.h>

typedef struct Node {
    char data;
    struct Node* next;
} Node;

void print_list(Node* root) {
    while (root) {
        printf("%c ", root->data);
        root = root->next;
    }
    printf("\n");
}

Node* reverse(Node* root) {
    Node* new_root = 0;
    while (root) {
        Node* next = root->next;
        root->next = new_root;
        new_root = root;
        root = next;
    }
    return new_root;
}

int main() {
    Node d = { 'd', 0 };
    Node c = { 'c', &d };
    Node b = { 'b', &c };
    Node a = { 'a', &b };

    Node* root = &a;
    print_list(root);
    root = reverse(root);
    print_list(root);

    return 0;
}

小小技巧,大大好用。

Javascript Linux Emulator

Website

這個可不是用 javascript 把 Linux 的開機程序 port 到網頁上,而是用 javascript 寫 Linux 的核心。由於目前大幅度優化的 browser 使得 javascript 變得超級快,已經凌駕於所有的 script 語言,執行速度逼近於 compiled language,所以各種新奇想法接連出現。

可惜的是,從三月現身後,一直還沒有釋出原始碼。

2011-08-19

VIX calculation

CBOE white paper

source code
Near-Term Options
Next-Term Options

Calculate the sample data of the white paper
>>> from vix import *
>>> import csv
>>> f1 = open('/tmp/Near-Term.csv', newline = '')
>>> r1 = csv.reader(f1, delimiter = ',', quoting = csv.QUOTE_NONE)
>>> spx1 = list(r1)
>>> f1.close()
>>> f2 = open('/tmp/Next-Term.csv', newline = '')
>>> r2 = csv.reader(f2, delimiter = ',', quoting = csv.QUOTE_NONE)
>>> spx2 = list(r2)
>>> f2.close()
>>> select_contracts(spx1, 9/365, 0.0038)
0.4727672252226143
>>> select_contracts(spx2, 37/365, 0.0038)
0.3668181547185998
>>> vix(spx1, spx2, 9/365, 37/365, 0.0038, 0.0038)
61.217998579372136

option chains quotes of September 2010
Daily Treasury Bill Rates Data

Calculate the VIX with the final quotes of Sep. 2, 2010
>>> def tolist(source, target, criteria, date):
...     for s in source[1:]:
...         if s[3][:10] == (criteria + 'C') and s[7] == date:
...             target.append([s[8], s[10], s[11]])
...     for s in source[1:]:
...         if s[3][:10] == (criteria + 'P') and s[7] == date:
...             n = [r[0] for r in target].index(s[8])
...             target[n].append(s[10])
...             target[n].append(s[11])
...
>>> f = open('/home/angelo/working/sample.csv', newline = '')
>>> r = csv.reader(f, delimiter = ',', quoting = csv.QUOTE_NONE)
>>> spx0 = list(r)
>>> f.close()
>>> spx3 = []
>>> spx4 = []
>>> tolist(spx0, spx3, 'SPX100918', '09/02/2010')
>>> tolist(spx0, spx4, 'SPX101016', '09/02/2010')
>>> vix(spx3, spx4, ((525 + 510) / 1440 + 14) / 365, ((525 + 510) / 1440 + 42) / 365, 0.0016, 0.0016)
23.17860007305071

The result seems not 100% match the official data. The almost-zero interest rate plays a tiny role. I guess CBOE may use the first sample set of the data stream at the closing time and the closing bid/ask are the final quotes.

2011-08-12

python 不同編碼的一般處理原則

Unicode In Python, Completely Demystified

實踐方式總共就一招三式。(以下為 python 2.5 的版本)
1. Decode early
def to_unicode_or_bust(obj, encoding='utf-8'):
    if isinstance(obj, basestring):
        if not isinstance(obj, unicode):
            obj = unicode(obj, encoding)
    return obj
2. Unicode everywhere
>>> s = to_unicode_or_bust('測試')
>>> s
u'\u6e2c\u8a66'
3. Encode late
>>> f = open('/tmp/output.txt','w')
>>> f.write(s.encode('utf8'))
>>> f.close()
python 2.5 也可以在開啟文件時就設定好編碼,確定文件編碼 (假設是 BIG5)
>>> import codecs
>>> f = codecs.open('/tmp/big5data.txt', 'r', encoding = 'big5')
>>> s = f.read()
>>> f.close()
>>> type(s)
<type 'unicode'>

在 py3k 中問題就小了,由於整個編碼都是 UTF8,所以常遇到的問題多是開啟的文件編碼問題,所以 Decode early 一式就夠了。確定文件編碼後 (假設是 BIG5) 開啟︰
>>> f = open('/tmp/big5data.txt', 'r', encoding = 'big5')
>>> s = f.read()
>>> f.close()
>>> type(s)
<class 'str'>

python 偵測文件編碼

chardet

Installation for py3k (root 權限)
python3 setup.py install
偵測網頁編碼
>>> import urllib.request
>>> urlread = lambda url: urllib.request.urlopen(url).read()
>>> import chardet
>>> chardet.detect(urlread("http://www.google.com.tw/"))
{'confidence': 0.99, 'encoding': 'Big5'}
偵測檔案編碼
>>> import chardet
>>> fileread = lambda filename: open(filename, "rb").read()
>>> chardet.detect(fileread('data.csv'))
{'confidence': 0.99, 'encoding': 'utf-8'}

Installation for python 2.5 (root 權限)
apt-get install python-chardet
偵測網頁編碼
>>> import urllib
>>> urlread = lambda url: urllib.urlopen(url).read()
>>> import chardet
>>> chardet.detect(urlread("http://www.google.com.tw/"))
{'confidence': 0.99, 'encoding': 'Big5'}
偵測檔案編碼
>>> import chardet
>>> fileread = lambda filename: open(filename, "r").read()
>>> chardet.detect(fileread('data.csv'))
{'confidence': 0.99, 'encoding': 'utf-8'}

2011-08-08

python 抓取網路中文檔名的處理

譬如要抓以下的檔案
http://www.taifex.com.tw/chinese/7/newdata/20110805每分鐘指數--新VIX距到期日5個日曆日換月
python 2.5 的處理方式
>>> import urllib
>>> urllib.quote(u'http://www.taifex.com.tw/chinese/7/newdata/20110805每分鐘指數--新VIX距到期日5個日曆日換月'.encode('utf8'), safe = '/:')
'http://www.taifex.com.tw/chinese/7/newdata/20110805%E6%AF%8F%E5%88%86%E9%90%98%E6%8C%87%E6%95%B8--%E6%96%B0VIX%E8%B7%9D%E5%88%B0%E6%9C%9F%E6%97%A55%E5%80%8B%E6%97%A5%E6%9B%86%E6%97%A5%E6%8F%9B%E6%9C%88'
py3k 的處理方式
>>> import urllib.parse
>>> urllib.parse.quote('http://www.taifex.com.tw/chinese/7/newdata/20110805每分鐘指數--新VIX距到期日5個日曆日換月'.encode('utf8'), safe = '/:')
'http://www.taifex.com.tw/chinese/7/newdata/20110805%E6%AF%8F%E5%88%86%E9%90%98%E6%8C%87%E6%95%B8--%E6%96%B0VIX%E8%B7%9D%E5%88%B0%E6%9C%9F%E6%97%A55%E5%80%8B%E6%97%A5%E6%9B%86%E6%97%A5%E6%8F%9B%E6%9C%88'

2011-08-07

Calculating Implied Volatility with Newton-Raphson method and Start Seed Value

Newton-Raphson Method$$x_{i+1}=x_{i}-\frac{f(x_{i})}{f'(x_{i})}$$
Apply to European Black-Scholes Model$$\sigma_{i+1}=\sigma_{i}-\frac{f(\sigma_{i})}{f'(\sigma{i})}=\sigma_{i}-\frac{BS(\sigma_{i})-m}{Vega(\sigma{i})}$$Start Seed Value by Manaster and Koehler$$\sigma_{0}=\sqrt{\left | ln(S/X)+rT \right |\frac{2}{T}}$$

\(m\)︰observed option price

2011-07-26

VCD 轉 mpeg 與合併轉檔 - vcdimager

vcdimager

安裝 vcdimager 與 mencoder
apt-get install vcdimager mencoder
主要是利用裡面的 libvcdinfo 來抓取 .dat 檔案,以下將把 VCD 整個抓到目前的目錄並把 .dat 轉為 .mpg
vcdxrip --cdrom-device=/dev/cdrom
合併 .mpg 檔案並生成新的影片 index
mencoder -idx -ovc copy -oac copy source1.mpg source2.mpg -o target.mpg
保存時可以考慮轉檔為新的格式,時間多一些的話,可以轉為 WebM,以下設定雙核心轉檔 (因為 WebM 編碼比較花時間),Audio 格式為 vorbis (.ogg),bitrate 為 224kbps
ffmpeg -i target.mpg -threads 2 -acodec libvorbis -ab 224k new.webm
完成。

PS1
假如只要轉其中的一個段落,譬如第二段,可以直接用 mencoder 就好。
mencoder vcd://2 -oac copy -ovc copy -o target.mpg
PS2
假如要直接從 .dat 轉為 .mpg
cdxa2mpeg source.dat target.mpg

2011-07-24

修正 SyntaxHighlighter 在 Blogger 的 C 語言標頭檔錯誤

錯誤如下
#include 

int main() {
    printf("Just a test.\n");

    return 0;
}

由於 SyntaxHighlighter 一年沒更新了,所以我決定自己想辦法修正這個小問題。

看起來將特殊符號用跳脫字元 (escape character) 處理即可,所以將標頭檔的 < 代換為 &lt> 代換為 &gt 就解決了。

動態使用 C 記憶體

網址

蠻有用的小技巧,不過正如留言所寫的,有一點小錯誤。以下為正確的版本︰
#include <stdio.h>
#include <stdlib.h>
define magic_size 15

struct{
    char* magic[magic_size];
    int count;
    int* number;
} member;
 
int main(){
    int t = 0;
    member.count = 10;
    member.number = (int*) malloc (sizeof(int) * member.count);
    for (t = 0; t<=member.count; t++){
        member.number[t]=0;
    }
    free(member.number);
}

2011-07-20

擷取整張音樂光碟到檔案

插入一張音樂 CD 到 Debian 後,會自動跳出 Audio CD Extrator (Sound Juicer),不過 CDDB (compact disc database) 有點問題,所以建議關閉軟體。這時我們可以檢視該 CD 內容,會發現 .wav 的檔案,對於堅持無損音質的人當然可以直接拷貝,但是一般像我這樣耳朵跟喇叭普通的人,這樣的大檔案是沒有必要的。

Asunder CD Ripper

安裝方式
apt-get install lame asunder
如果要轉成 ape 格式,需要安裝 Monkey's Audio。
apt-get install monkeys-audio

會自動比對 CDDB 取得專輯跟音樂資訊,採用的是 freedb.org 的資料,一般英文流行專輯都可以順利找到資訊,中文的則是越流行的越容易找到,但是容易有亂碼。支援的輸出格式 ogg, mp3, flac, wav,主流的都到齊了。如果是選擇非無損的,如 ogg 跟 mp3,可以在 Preference→Encode,將 ogg 的 Quality 選 9,或將 mp3 的 bitrate 選 320kbps,如此就會輸出 320kbps 的音質,檔案大小約為原始 wav 檔的 23%。堅持要無損音質的,可以選 flac格式輸出,檔案大小約為原始 wav 檔的 65%,算是很不錯的格式。

基本上,建議採用 ogg 跟 flac,ogg 在相同 bitrate 有比 mp3 更接近原始波形的表現,flac 跟 ape 則是在無損音質下更小的檔案,而且 ogg 跟 flac 是 open source 的,前者是 BSD-Like 的授權,後者是 GPL with BSD-libraries 授權;ape 的授權方式有點小爭論,所以可以選擇先避開,雖然檔案比 flac 更小一點(大約相差 5%)。

音樂格式轉檔

SoundConverter

安裝方式
apt-get install gstreamer0.10-plugins-ugly soundconverter

支援主流的 ogg, mp3, flac, wav 的格式互相轉換,可以重新取樣(resample),當然沒辦法從低的 bitrate 轉到高的 bitrate (因為資料早已流失)。

編輯各類音樂檔案的標籤 - EasyTag

當我們檢視某音樂檔 Properties 中的 Audio 時,會看到 title,artist,album 等等描述該檔案的敘述,但是不同的來源會使得資訊混亂不堪,甚至沒有資訊價值,所以我們需要將這些資訊好好處理。

EasyTAG

教學影片

這是一個 GUI 的程式,可以編輯 TAGS (包括 title,artist,album 等等)。可以在 Settings→Preferences→ID3 Tag Settings 將 Charset 全部指定為 UTF-8,省去日後編碼相容性的問題。支援的檔案類型有 MP3, MP2, MP4/AAC, FLAC, Ogg Vorbis, MusePack, Monkey's Audio and WavPack。

批次用法
假如我們有這些檔案
01 Andy Song1.mp3
02 Andy Song2.mp3
03 Andy Song3.mp3
而這些檔案沒有任何 TAG,所以我們可以從檔名取得資訊然後填入各個 TAG,選 Scanner→Fill Tag(s),在 Fill Tag 填入
%n %a %t
按下 Open scanner window / Scan selected files,就會依次填入 track, artist, title,至於各個字母的意義可以選 Show / Hide Legend 來查看。反過來,如果要用 TAGS 來為檔案命名,選 Scanner→Rename File and Directory,然後填入來源的 TAGS 就好了。

PS
由於 Windows 7 的 ID3v2 版本為 ID3v2.3,到Settings→Preferences→ID3 Tag Settings,將 ID3v2 tags 的 Version 改為 ID3v2.3,採用預設的 UTF16編碼;Windows XP 只支援 ID3v1,到 Settings→Preferences→ID3 Tag Settings,將 ID3v1 tags 的 Charset 改為 Big5。為了相容性考量,也許同時寫入 ID3v1.x 跟 ID3v2.3 或 ID3v2.4 (在 Windows 7 會有些小問題)是目前最好的做法了。

2011-07-11

webp - 新一代圖片壓縮格式

官網

在 Debian 下安裝相當簡單,先新增 sid,然後
apt-get install webp libwebp-dev
就完成整個安裝了

使用方式
轉 png 為 webp 並維持 80% 的解析度
cwebp -q 80 image.png -o image.webp
轉 webp 為 png
dwebp image.webp -o image.png
批次改變副檔名
rename 's/\.png/\.webp/' *.png

我的眼睛看起來 80% 的 webp 跟 jpg 沒什麼差別,不過容量至少縮小了約 40%,普通的圖片更可以縮小 60% ~ 70%,對節省頻寬或容量大有幫助。

安裝較新的 Debian 套件 - 使用 testing / unstable

只要加到 repository 即可,以台灣的 Debian 伺服器為例,加入 testing
deb http://ftp.tw.debian.org/debian testing main contrib non-free
或者加入 unstable
deb http://ftp.tw.debian.org/debian unstable main contrib non-free
接著執行更新
apt-get update
安裝 testing (目前版本代號是 squeeze,下一代版本代號是 wheezy) 的套件,如︰python2.7
apt-get -t testing install python2.7
安裝 unstable (俗稱 sid) 的套件,如︰python3.2
apt-get -t unstable install python3.2

如果不想更新全部的套件,可以在安裝完特定套件後,將 testing / unstable 選項 unmark,因為太新的套件往往較不穩定。

2011-07-06

Debian 調整時區

原則上不要動 UTC 時間,所以調整 local time 就好。以 root 權限︰
dpkg-reconfigure tzdata

2011-07-02

同步 Debian 主機時間

先安裝套件 (以下都需要 root 權限)
apt-get install ntpdate
執行與 time.nist.gov 主機時間同步
/usr/sbin/ntpdate time.nist.gov
順便調整一下 BIOS 中的時間
hwclock -w
看一下調整後的時間,有一點回傳後的落差
date || hwclock -r
放進 crontab 中,讓機器以後每天定時自動對時
gedit /etc/crontab
加入這一行讓 Debian 每天早上 06:10 進行自動對時
10 6 * * * root /usr/sbin/ntpdate -s time.nist.gov || hwclock -w
收工

GAE bulkupload 範例

官方範例

先修改 app.yaml 中的部份,用來打開 remote API
builtins:
- remote_api: on
上傳修改的部份
python2.5 appcfg.py update myGAE/
自動生成 bulkloader.yaml
python2.5 appcfg.py create_bulkloader_config --filename=bulkloader.yaml --url=http://myGAE.appspot.com/_ah/remote_api
把 datastore 轉成 CSV 格式下載
python2.5 appcfg.py download_data --config_file=bulkloader.yaml --filename=test.csv --kind=Mykind --url=http://myGAE.appspot.com/_ah/remote_api --rps_limit=500 --bandwidth_limit=2500000 --batch_size=100
上傳修改好的 CSV
python2.5 appcfg.py upload_data --config_file=bulkloader.yaml --filename=test.csv --kind=Mykind --url=http://myGAE.appspot.com/_ah/remote_api --rps_limit=500 --bandwidth_limit=2500000 --batch_size=100

PS1
GAE 1.3.4 版以後,將 bulkupload 變得簡單,原先的有點麻煩。
PS2
目前在 Master/Slave datastore 可以正常使用;不過 GAE 1.5.0 版後,High Replication datastore 變成預設,現階段還無法無痛使用 bulkupload。
PS3
上下傳的預設限制太小容易發生錯誤,可以改為︰
--rps_limit=500 --bandwidth_limit=2500000 --batch_size=100

2011-06-29

Market Share of Major Browsers

StatCounter - GlobalStats

FireFox 基本上持平,IE 的市占率則被 Chrome 快速佔領,Safari 跟 Opera 低檔徘徊;台灣的部份,IE 仍有超過七成的市占率,不過 Chrome 快要超過 FireFox,目前台灣各級政府的網站水準極差,不但只能用 IE 而且常常用一些很糟糕的 plugins,其中最糟的是證交所跟觀測站,不但只能用 IE (用別的 browsers 會導致很多功能沒回應),而且在網站的編排、穩定度、網址的代碼意義 (基本上完全沒意義,全是一堆數字加英文字母組合)、程式碼全屬於下下之選,這也反應出一般投資人對於資訊取得的不講究,難怪台灣是坑殺散戶的天堂。

The United States of Shame

website

這個基本上沒有什麼特別的巧思,甚至用google fusion tables就可以直接做到,不過對於各州的刻板印象倒是挺有趣的。

The Market Share of Major Programming Languages

TIOBE

評比是由各主要搜尋引擎的點擊數計算後,再經過加權而來,權值為
Google: 32%
Blogger: 32%
Wikipedia: 16%
YouTube: 10%
Yahoo!: 3%
Bing: 3%
Baidu: 3%
很明顯跟市占率有很大落差,不過還是有參考意義。

The Computer Language Benchmarks Game

website

測試 ubuntu 平台上基於 Intel Q6600 四核心 CPU 的效能,分為 x86、x64、單核心、四核心等四種不同組合;比較令人驚艷的是 javascript V8 速度位於所有 script 語言之上,算是在需要 compilation 的那一類。

2011-06-21

常見的邏輯謬誤

Non sequitur (logic)

Fallacy of the undistributed middle
1. All Zs are Bs.
2. Y is a B.
3. Therefore, Y is a Z.
Affirming the consequent
1. If A is true, then B is true.
2. B is true.
3. Therefore, A is true.
Denying the antecedent
1. If A is true, then B is true.
2. A is false.
3. Therefore, B is false.
Affirming a disjunct
1. A is true or B is true.
2. B is true.
3. Therefore, A is not true.
Denying a conjunct
1. It is not the case that both A is true and B is true.
2. B is not true.
3. Therefore, A is true.

完整的可以參考 List of fallaciesFallacies

2011-06-13

設定 Debian 開機過程與進入桌面的預設解析度

一般來說,當作 server 的電腦都很少使用螢幕,但是一接上後便發現 Debian Squeeze 的預設螢幕解析度不正確,所以需要作適當修正。

以我這台 Acer R3610 來說,預設的顯示晶片是 ION,而我已經裝了 nvidia-xconfig 與 nvidia-settings,但是在使用 NVIDIA X Server Setting 中發現無法將設定儲存到 /etc/X11/xorg.conf 中,所以以手動解決。
首先先備份 (as superuser)
nvidia-xconfig
接著到 NVIDIA X Server Setting → X Server Display Configuration 設定好需要的解析度後,選 Save to X Configuration File → Show preview 將內容 copy。
然後 (as superuser)
gedit /etc/X11/xorg.conf
將內容全部貼上後儲存。
再修改 console 的部份 (as superuser)
gedit /etc/default/grub
加上這兩行,將解析度設為 1024x768。
GRUB_GFXMODE=1024x768
GRUB_GFXPAYLOAD_LINUX=1024x768

在 Gnome 中,有時會發現只能選擇幾個較低的解析度,主要是設定問題,檢查 /etc/X11/xorg.conf 中的 HorizSync 與 VetiRefresh 的範圍,增加兩者的上限值應該有效,但詳細的範圍仍應以廠商的官方規格書為主,否則可能損害螢幕。

Debian 上看 1080P 影片

ubuntu上看 1080P 影片類似,只是有部份細節不同。

Acer L3600 部份,雖然 G31 無法硬體解壓縮 1080P 影片,但是 E6750 效能足夠負擔這個工作,所以 totem、vlc、mplayer 皆可以正常播放,只要設定字幕即可。

Acer R3610 部份,Nvidia ION 晶片可以硬體解壓縮,所以先加上 Debian 的 multimedia source,然後
apt-get install nvidia-vdpau-driver vdpau-va-driver
由於有更動到 kernel,所以需要重新開機。確認 Nvidia ION 是否已使用 Nvidia 的 driver (原先預設是 nouveau)
lspci -v
接著安裝 NVIDIA X Server Settings
apt-get install nvidia-xconfig nvidia-settings
再安裝目前 multimedia source 上唯一支援硬體解壓縮的 SMPlayer
apt-get install smplayer
然後執行 SMPlayer,選 Options → Preferences → General → Video → Output driver → vdpau 來啟用硬體解壓縮。由於 ATOM 330 有雙核心,所以也可以採用一些啟用雙核心的 libraries
apt-get install mplayer-mt mencoder-mt
然後執行 SMPlayer,選 Options → Preferences → General → Mplayer executable → mplayer-mt 來啟用多核心。

2011-06-09

製作多重開機 USB 碟 - Grub4Dos

主要是手邊有幾支少用的 2GB ~ 8GB 的隨身碟,而又需要製作一些可以開機進行救援的 USB,所以有了這篇。

需求︰進入 DOS、進入 Windows、進入 Linux 等。

步驟︰
1. 格式化 USB,FAT16、FAT32 皆可,NTSF 較不建議。
2. 在 Windows 執行 grubinst_gui.exe,用來安裝引導到 MBR(Master Boot Record)。
3. 將 grldr 拷貝到 USB 根目錄。
4. 在 USB 建立一子目錄 iso,放進需要的 iso 檔。
5. 建立一文件檔 menu.lst 在根目錄,其內容如下︰
timeout 10
default 0

title MS-DOS
find --set-root /iso/win98.ima
map /iso/win98.ima (fd0)
map --hook 
chainloader (fd0)+1 
rootnoverify (fd0) 
map --floppies=1

title UBUNTU 10.04 X64 Live CD
find --set-root /iso/ubuntu-10.04-desktop-amd64.iso
map /iso/ubuntu-10.04-desktop-amd64.iso (hd32)
map --hook
root (hd32)
kernel /casper/vmlinuz file=/cdrom/preseed/ubuntu.seed boot=casper iso-scan/filename=/iso/ubuntu-10.04-desktop-amd64.iso splash
initrd /casper/initrd.lz
boot

title NoName XPE Live CD Lite
find --set-root /iso/NoNXPE.ISO
map /iso/NoNXPE.ISO (hd32)
map --hook
root (hd32)
chainloader (hd32)
rootnoverify (hd32)
boot

title NoName XPE Live CD 20090909
find --set-root /iso/NoNXPE09.ISO
map --mem /iso/NoNXPE09.ISO (hd32)
map --hook
root (hd32)
chainloader (hd32)
rootnoverify (hd32)
boot

title Reboot
reboot

說明︰
1. win98.ima 為一軟碟映像檔,用來進入 DOS。
2. 進入 ubuntu Live CD 部份,可以用 chainloader (hd32) 取代 kernel 與 initrd 兩行。
3. NoName 有出一個很輕巧的 XP 刪減版 XPE.iso,只有 27.5MB。
4. NoName 還有出一個 XP 的 XPE.iso,裡面工具相當完整,最新版是 2009-09-09。由於檔案較大且有時拷貝進 USB 時檔案不連續,所以 menu.lst 的 map 指令,需要加上 --mem 把 iso 讀進 ram 裡面。或者可以用 WinContig 來把 USB 上的這個 iso 檔 defrag,如此就不用加上 --mem。
5. 由於 Debian 的 iso 較複雜,引導時容易出錯,所以不考慮從這個 USB 執行安裝,用另外一個 USB 單獨製作 Live USB 比較簡便,可以參考 bootable USB for different linux distributions
6. Windows XP 的情形也雷同,以另一個 USB 單獨製作比較簡便。

2011-06-05

烏輪案 - 香港烏龍渦輪事件

A $45m typo by The Economist
Goldman Sachs makes an expensive typo by Financial Times
How One Typo May Have Just Cost Goldman Sachs $45 Million by Business Insider

事件的始末是這樣的,高盛發行了四支連結到日經指數的權證,結算公式應該是
(收盤價 - 履約價) X 日經225指數貨幣金額 X 匯率
但招股書(在台灣稱公開說明書)卻寫
(收盤價 - 履約價) X 日經225指數貨幣金額 / 匯率

很明顯的,這是一個愚蠢的錯誤,不過這是經過內部層層審核與外部會技師跟律師簽證的正式文件,也就是一般所謂如有爭議,將作為最後依據的文件。

權証掛牌後,高盛以它自以為的方式避險,而市場上則以招股書的定價為依據來交易,忽然間,高盛發現怪怪的(因為偏離了他認為的合理價格),結果竟然是招股書上寫錯了,高盛馬上通知港交所暫停交易,之後表示願意以10% premium的價格從投資人手上買進權證。

想當然,投資人當然不願意,其中有一個投資人發現問題後,更是大手筆買進50萬港幣(約200萬台幣)。目前港交所的態度是傾向高盛的解決方案,但是這有極大的問題,就是法律的尊嚴性,目前雖然停止交易,但是經過適當地避險,權證持有者到期後所能拿到的利潤是遠遠高於10% premium的(詳細參考底下的計算說明),這顯示出高盛惡質的本性。

這個事件在五月底六月初在英美媒體逐漸放大,風向也逐漸轉變,也許最後港交所將會逼迫高盛以理論價全數收回,但這無疑使得投資人看清交易所與金融機構邪惡的一面。

欣賞一下已經被偷偷摸摸修正的10073跟10074招股文件
還有認售的10075跟10076招股文件

計算說明︰
如果用最簡單的方式,就是依照高盛的內部模型,當初發行時,每一單位合理價應該是0.25 X 10.684 X 10.684 = 28.54,相當於114倍的價格。(套句賭神的話,不買是棒槌!雖然莊家聯合另一賭客詐賭)

如果是按照Black-Scholes計算今天的公平價格,需要先用歷史資料估算波動率
>>> volaty(closing_prices('^N225', '20100218', '20110218'))
0.20207600809570575    #從02/18/2010 ~ 02/18/2011
volaty(closing_prices('^N225', '20110218', '20110603'))
0.33087839923233037    #從02/18/2011 ~ 06/03/2011
假設投資人是白痴,所以引申波幅(隱含波動率,implied volatility)用0.3309,日經目前為9492,所以用gnumeric可以算出,
opt_bs("c",9492,11000,("2011/9/9"-"2011/6/3")/365,0,0.3309,0) = 188.8337
而目前港幣兌日圓為10.3194,所以依照第一版的招股書目前每單位
188.8337/10.3194 X 400 = 4.8716
依照詐賭版的招股書目前每單位
188.8337/10.3194 X 400 = 0.0457

PS
媒體的不要臉又再次出現,硬凹是「烏龍」,比英美媒體還爛。

Callable Bull/Bear Contracts (CBBC)

$$C = doc + dic$$
$$P = uop + uip$$
\(C\)︰買權(call)(牛證)
\(P\)︰賣權(put)(熊證)
\(doc\)︰down-and-out Standard Barrier Call
\(dic\)︰down-and-in Standard Barrier Call
\(uop\)︰up-and-out Standard Barrier Put
\(uip\)︰up-and-in Standard Barrier Put

Reference
Turbo Warrants under Stochastic Volatility
Analytical Valuation of Turbo Warrants Under Double Exponential Jump Diffusion

2011-05-31

What blocks Ruby, Python to get Javascript V8 speed?

網址

基本上就是開發者的功力,V8 的開發者都非常資深,領導者一輩子都在開發 V8 (從被 google 合併前就在開發),而 google 付給這些人非常高的薪資,對比 Ruby 的開發者,有些不滿 25 歲,就會佔了一些經驗上的劣勢。

裡面有提到一個例子,Rubinius 的 Hash 用 100% 的 Ruby 寫的,YARV 的 Hash 用 100% 的 C 寫的,但是 Rubinius 卻比較快,這就是開發者的差別。

心得︰天龍八部中有一幕是,鳩摩智要用少林 72 項絕學換六脈神劍,就是在講類似的東西。
枯榮大師道:“你在一陽指上的修爲,已到了第幾品境界?”本因額頭出汗,答道:“弟子根鈍,又兼未能精進,只修得到第四品。”枯榮大師再問:“以你所見,大理段氏的一陽指與少林牛花指、多羅葉指、無相劫指三項指法相較,孰優孰劣?”本因道:“指法無優劣,功力有高下。”枯榮大師道:“不錯。咱們的一陽指若能練到第一品,那便如何?”本因道:“淵深難測,弟子不敢妄說。”枯榮道:“倘若你再活一百年,能練到第幾品?”本因額上汗水涔涔而下,顫聲道:“弟子不知。”枯榮道:“能修到第一品麽?”本因道:“決計不能。”枯榮大師就此不再說話。

bootable USB for different linux distributions

網址

除了 ubuntu 內建可以製作開機的 USB 程式,其他大多還是維持 CD/DVD、liveCD 等形式,導致為了裝作業系統就要燒一片光碟,十分的不環保。上面這個程式是一個可執行檔,可以製作多種 USB 安裝程式,支援平台有 Windows、Mac 跟 Linux,差不多主流的都到齊了。

A multimedia source for Debian

網址

由於 Debian 以詳盡的測試與穩定著稱,所以套件常常都會比較慢才更新,對於想使用新套件的人來說,只能自己編譯,造成些許不便。

依照版本選擇來源,然後 update
apt-get update
接著安裝 key
apt-get install deb-multimedia-keyring
完成。

2011-05-27

新一代動物機候選人︰Raspberry Pi

網址

預期價格為美金25元,暫定規格如下︰
700MHz ARM11
256MB of SDRAM
OpenGL ES 2.0
1080p30 H.264 high-profile decode
Composite and HDMI video output
USB 2.0
SD/MMC/SDIO memory card slot
General-purpose I/O
Open software (Ubuntu, Iceweasel, KOffice, Python)

由於全速運轉才消耗1W,開機一整年還花不到9度電,外加1080P硬解的能力,看起來相當令人期待啊。

2011-05-18

好用的借刀殺人工具 - 外籍主管

跨國公司的員工來自四面八方,各種文化交雜,形成管理上的困難,不過也由於員工國籍的多樣化,衍生出一個常見的現象,找A國的人來管理B國公司的事務。

其實找外人來管理最顯而易見的好處就是沒有情感上的包袱,尤其是董事會或總部要求的績效要求較高時,經常需要面臨組織的改革,也就是人力資源裁剪、改編、擴編或重組;因此在華人國家常會看到找個A國的華人來當B國的主管,相似背景的文化但卻沒有羈絆,貫徹目標時無須考量人的問題。另外還有一種是從母國派人來,通常會找來一個會當地語言或了解當地文化的人,充當貫徹母公司意志的人。

這類高階經理人通常有幾個特色,平時不管小事,一動手就是大事;任職時間短,平均兩年會陣亡;從中階主管升上來,但是外放到別的國家;業務導向多,技術導向少;喜歡跟獵人頭公司往來,除了找人,也替自己留後路。

總的看來,這種作法對股東好處頗大,對一般員工沒影響,真正有影響的是中高階主管,這也是不少中階主管不想升為高階主管的原因之一;當然,總公司不在這範圍,區域總部則要看公司文化。

PS
其實軍隊也是這樣搞,C部隊的人升官後,調去管理D部隊,免得管不動舊同僚。

2011-05-16

閱讀心得︰策略書之五:開放源碼的經濟學

網址

文章中關於個經與總經的描述,的確是很多人的感覺,不過總經違反人類直覺的部份,常常都是跨期的效果,一般日常的應用較少用到。裡面關於互補品的舉例很不錯,不過解釋的有點跳躍性思考;應該是某物品價格下降,帶動某物的需求上升,也間接帶動其互補品的需求上升。

關於Sun的策略描述也很有意思(其策略都是基於激憤而非自身利益),Sun是賣伺服器的公司,但是力推免費軟體讓個人電腦需求上升(自己沒任何好處),也力推JAVA讓硬體普及化(但是自己的市占率下降),最終被Oracle收購,而facebook也將搬一部分到Sun的舊辦公室,令人無限感嘆。

基本上Joel是個偉大的分析師,這篇文章可以駁斥Steve Jobs影射開放社群是共產主義,其實整篇文章的重點只有一句︰
開放源碼並不能免於重力或經濟法則
心得︰經濟學原理的例外沒有那麼多,人類的偏見倒是很多。

2011-05-15

REGEX for gEdit

網址

不知道為什麼 gEdit 沒有內建支援 REGEX,這個插件是用 python 寫的,可以暫時撐著用。

2011-05-14

Google Font API

完整的字型列表

很不錯的資源,減少尋找字型的時間,授權方式為SIL 1.1,可以在商業與非商業下使用。

使用方式也很簡單,可以直接下載到個人電腦安裝,也可以在網頁設計直接取用,如這邊

PS
很多人覺得好看的 Garamond 也有,差不多主流的都到齊了。

2011-05-09

Business is business

最近看到一些人批評政客言行不一,說一套做一套,把民眾當傻瓜。其實政客跟企業一樣,在商言商,既然接了某個位置,當然要以某個位置的立場來發言,至於如何檢視誠信,就看他花多少心力在實踐承諾。

這邊舉一個M$的例子,雖然該公司是僱用最多軟體工程師的公司之一,但是主力都放在Windows跟Office上,其他產品多半是支援性質,理所當然也有專為企業設計的solution,像是會計系統;不過妙就妙在這裡,它自己用的是SAP,一個德國的會計跟ERP廠商,這東西不只需要M$自己的系統配合,還需要M$往來廠商的配合,所以導入該系統是一個巨大工程。這裡M$能為自己辯解的不外就是,該系統是市占率最大的,所以溝通性比較好;該系統會計即時性好;該系統ERP比較完整;當初導入的時候我們還沒發展類似產品....聽來聽去都是推託,反正原因就是選一套自己適合的,但是自己卻沒辦法打造一套自己適合的,所以就買競爭對手的。

再舉一個,就是銀行券商賣的衍生性商品,不只自己不買(通常做相反方向,譬如權證、牛熊證就做賣方),營業員也不敢買,不像保險業務員,還會選擇性的買保險。

結論︰廣告是廣告,生意是生意。

2011-05-08

金融業如何利用網路抓內鬼

除了極少數投信公司完全不能使用即時通 (Instant Message),絕大部分的金融從業人員都用的很兇,而公司為了保障自己的利益與客戶權利,跟電話一樣,全部採取側錄,更有甚者,辦公室放阻斷器,wifi、3G、2G 統統都收不到訊號。

至於前台交易 (front desk) 人員,比較有 sense 的,會用 reuters messaging,封包是採用 SSL,不過 reuters 主機會將全部的內容儲存,公司可以跟 reuters 要求查詢內容,所以一樣可以抓得到。

所以金融業本身要抓監守自盜是很容易的,比較困難的是公司高層合謀,這部份就得舉報司法單位才有辦法調閱非關係人帳戶,而投資人能做的,就是告監察人瀆職。交易所擁有全部的交易紀錄,其實在資料庫裡配對,是可以很容易抓出疑似內部人交易的,可惜這些人佔著茅坑不拉屎。

善惡是什麼?正義又是什麼?

網址

用現代的故事來講就是,老闆A跟得力助手B打賭,賭注是一個得到老闆恩賜的平凡人C,A說除了C的生命,B可以採取任何方式考驗C對A的忠誠度;讀過書明事理的人都知道,有奶便是娘,C這種平凡人除了忠誠,別無他法可以獲得超過他應得的好處,所以十分堅定。過程中B殺了C的10個兒女,雖然是A跟B合謀,但帳卻算在B身上。奇妙的是,在這套人類史上最暢銷的書中,B是代表惡,A是代表善,雖然A殺的人至少在數百萬人以上,且B的作為也都是出於A的授意。

心得
宣傳攻勢對一般人頗有功效。不要相信老闆。對平凡人來說,有奶才是娘就是真理,起碼保住性命。

Voltaire︰If God did not exist, it would be necessary to invent him.
Morpheus︰What is the Matrix? Control.

2011-05-05

Floating-Strike Lookback Option


$$\begin{align}
\text {if } b\neq 0 \text {︰}\\
C = & Se^{(b-r)T}N(a_{1})-S_{min}e^{-rT}N(a_{2})+\\
& Se^{-rT}\frac{\sigma ^{2}}{2b}[(\frac{S}{S_{min}})^{-\frac{2b}{\sigma ^{2}}}N(-a_{1}+\frac{2b}{\sigma}\sqrt{T})-e^{bT}N(-a_{1})]\\
\text {if } b= 0 \text {︰}\\
C = & Se^{(b-r)T}N(a_{1})-S_{min}e^{-rT}N(a_{2})+\\
& Se^{-rT}\sigma \sqrt {T}[n(a_{1})+a_{1}(N(a_{1})-1)]
\end{align}$$
$$\begin{align}
a_{1}=\frac{ln(S/S_{min})+(b+\sigma^{2}/2)T}{\sigma \sqrt{T}} \qquad a_{2}=a_{1}-\sigma \sqrt{T}
\end{align}$$
$$\begin{align}
\text {if } b\neq 0 \text {︰}\\
P = & -Se^{(b-r)T}N(-b_{1})+S_{max}e^{-rT}N(-b_{2})+\\
& Se^{-rT}\frac{\sigma ^{2}}{2b}[-(\frac{S}{S_{max}})^{-\frac{2b}{\sigma ^{2}}}N(b_{1}-\frac{2b}{\sigma}\sqrt{T})+e^{bT}N(b_{1})]\\
\text {if } b= 0 \text {︰}\\
P = &-Se^{(b-r)T}N(-b_{1})+S_{max}e^{-rT}N(-b_{2})+\\
& Se^{-rT}\sigma \sqrt {T}[n(b_{1})+N(b_{1})b_{1}]
\end{align}$$
$$\begin{align}
b_{1}=\frac{ln(S/S_{max})+(b+\sigma^{2}/2)T}{\sigma \sqrt{T}} \qquad b_{2}=b_{1}-\sigma \sqrt{T}
\end{align}$$

\(C\)︰買權(call)
\(P\)︰賣權(put)
\(N\)︰累加常態分配函數(cumulative normal distribution function)
\(n\)︰標準常態密度函數(standardized normal density function)
\(S\)︰現貨價格(spot price)
\(S_{min}\)︰目前為止最低現貨價格
\(S_{max}\)︰目前為止最高現貨價格
\(r\)︰無風險利率(risk-free rate),通常會用相同天期的公債殖利率
\(b\)︰持有現貨產生的收益或倉儲成本(cost of carry)
\(T\)︰離到期日還有多久,單位是年
\(\sigma\)︰波動率(volatility),單位是%

Reset Strike Option

$$\begin{align}
C = & Se^{(b-r)T}M(a_{1},y_{1};\rho )-Xe^{-rT}M(a_{2},y_{2};\rho )-\\
& Se^{(b-r)T}N(-a_{1})N(z_{2})e^{-r(T-\tau )}+Se^{(b-r)T}N(-a_{1})N(z_{1})
\end{align}$$
$$\begin{align}
P = & -Se^{(b-r)T}M(-a_{1},-y_{1};\rho )+Xe^{-rT}M(-a_{2},-y_{2};\rho )+\\
& Se^{(b-r)\tau }N(a_{1})N(-z_{2})e^{-r(T-\tau )}-Se^{(b-r)T}N(a_{1})N(-z_{1})
\end{align}$$
$$\begin{alignat}{2}
& a_{1}=\frac{ln(S/X)+(b+\sigma ^{2}/2)\tau }{\sigma \sqrt{\tau }} \qquad &&
a_{2}=a_{1}-\sigma \sqrt {\tau }\\
& z_{1}=\frac{(b+\sigma^{2}/2)(T-\tau )}{\sigma \sqrt{T-\tau}} && z_{2}=z_{1}-\sigma \sqrt{T-\tau}\\
& y_{1}=\frac{ln(S/X)+(b+\sigma^{2}/2)T}{\sigma \sqrt{T}} && y_{2}=y_{1}-\sigma \sqrt{T}
\end{alignat}$$

\(C\)︰買權(call)
\(P\)︰賣權(put)
\(N\)︰單變量累加常態分配函數(univariate cumulative normal distribution function)
\(M\)︰雙變量累加常態分配函數(univariate cumulative normal distribution function)
\(S\)︰現貨價格(spot price)
\(X\)︰履約價格(strike price)(exercise price)
\(r\)︰無風險利率(risk-free rate),通常會用相同天期的公債殖利率
\(b\)︰持有現貨產生的收益或倉儲成本(cost of carry)
\(T\)︰離到期日還有多久,單位是年
\(\tau\)︰離重設(reset)日還有多久,單位是年
\(\sigma\)︰波動率(volatility),單位是%

2011-05-04

Tools for xslt and xsl-fo

xsltproc
用來將 xslt 轉為 xml,ubuntu 可以直接從 repositories 安裝。
用法
xsltproc source.xml source.xsl -o target.html
fop
用來將 xsl-fo 轉為其他格式,譬如 pdf,ubuntu 可以直接從 repositories 安裝。
用法
fop source.fo target.pdf

2011-04-28

Google App Engine Blog: 10 things you (probably) didn't know about App Engine

Google App Engine Blog: 10 things you (probably) didn't know about App Engine

1. App Versions are strings, not numbers
也就是說網址不只可以用 http://1.myapp.appspot.com 或 http://2.myapp.appspot.com,還可以用 http://alpha.myapp.appspot.com 或 http://beta.myapp.appspot.com

2. You can have multiple versions of your app running simultaneously
可以同時有許多版本同時上線測試,所有版本共享 datastore 與 memcache。另外,不同的 runtime 也可以同時上線,譬如 JAVA 與 python。

3. The Java runtime supports any language that compiles to Java bytecode
這就妙了,也就是說只要轉成 JVM bytecode 就可以了,譬如 C to bytecode compilers

4. The 'IN' and '!=' operators generate multiple datastore queries 'under the hood'
就是說 IN 會被拆開成數個 query 來執行,!= 則會被拆成兩個 ( >= 與 <= ) 來執行,如果有 4 個 IN 跟一個 !=,總共會有 8 個 query。

5. You can batch put, get and delete operations for efficiency
db.put()、db.get() 與 de.delete() 可以接受 list,當存取的欄位多時,採用 list 輸入可已巨幅的減少 request 跟 response 的次數。

6. Datastore performance doesn't depend on how many entities you have
就是說效能跟回傳的結果成相關,效能與 total entities 是獨立的。

7. The time it takes to build an index isn't entirely dependent on its size
建立 index 是按照中央系統來排隊的,與資料多寡無關。

8. The value for 'Stored Data' is updated once a day
統計數據一天更新一次。

9. The order that handlers in app.yaml, web.xml, and appengine-web.xml are specified in matters
app.yaml, web.xml, appengine-web.xml 中的 scripts 都是按照先後順序來執行的。

10. You don't need to construct GQL strings by hand
善用內建的 db.GqlQuery,不需要手動去寫 GQL。

2011-04-21

Python wrapper for Google AJAX Language API

Python wrapper for Google AJAX Language API

最大的好處是可以用在 GAE,其他還想不出來有什麼應用。中文的轉換方面,繁體轉簡體都沒問題,簡體轉繁體因為多個簡體字對應一個繁體字,所以只能緩慢的改進,算是先天的限制。

2011-04-20

Difference between Django template 0.96 and 1.2

根據官方文件建議,GAE 要指定 Django 版本,目前預設是 0.96,但是建議使用 1.2,以強化安全。所謂的安全,就是 escaping,防止 Cross Site Scripting (XSS) 攻擊。所以預設會採用全部 escaping,若有不需要 escaping 的,像是 javascript,就要加上 filter 才能正常使用。
譬如
{{insertion}}
變成
{{insertion|safe}}

2011-04-19

擴充 okular 支援格式

好用的寫筆記畫重點程式 okular,根據 okular 支援格式一覽表,發現裝好的 okular 的時候,有很多格式不是預設就裝好相關支援的 libraries,如 DjVu、EPub 與 chm,所以需要手動安裝。可惜的是,寫筆記畫重點的部份,目前只支援 PDF、DjVu 跟 ODT。

先解決額外格式支援的部份
sudo apt-get install okular-extra-backends
DjVu backend
sudo apt-get install djvulibre-desktop
EPub backend
sudo apt-get install libepub0
至於 chm,okular-extra-backends 4.4.5-1 目前尚未支援,可能要等改版。不過我看一下,前幾版有的有支援,Debian 中也有支援,看不見的黑手?

DjVu 我個人是很少用,網路上也可以直接嵌在瀏覽器中觀看,所以沒有一定要安裝,再說預設的 evince 就可以讀 DjVu 了,所以似乎沒啥用處。不過我看一下網路上,不少古老的書都掃描成 DjVu,因為跟 PDF 比起來,圖形檔案至少縮小 70%,所以高等學校中英文圖書數字化國際合作計畫中的古書,都掃成 DjVu。

2011-04-15

下載 youtube 影片 - youtube-dl

youtube-dl

這是一個 python 的 script,所以電腦要有 pyhon 2.5 以上的版本,除了 py3k。

以 root 權限安裝。
apt-get install youtube-dl
查詢可下載的格式,留意部份 video 與 audio 是分開的。
youtube-dl -F https://www.youtube.com/watch?v=-etTVVbo2gs
下載指定 1080P webm 格式的檔案。
youtube-dl -f 248 http://www.youtube.com/watch?v=xxxxxxxxxxx

用 mpmath 驗證精確度

主要是因為電腦對預設變數的儲存是固定大小,要計算超大數字或超精確數字,需要宣告一個很長的陣列來儲存每個單一的字元 (digit),對非 CS 背景的程式設計師來說,可以說是一道障礙;不過在現代,這問題可以簡單的解決,第一,使用 C 語言 library,如 GMP 。第二,使用 mpmath,這可以用在所有的 python,包括 sagemath。以下將採用第二種方式來驗證 gnumeric 中 Black-Scholes 選擇權定價的精確度。

show it on sage notebook

導入 mpmath 與定義函數
>>> import mpmath
>>> mpmath.mp.dps = 30
>>> def opt_bs(flag, spot, strike, time, rate, volatility, carry):
    d1 = (mpmath.log(spot/strike)+(carry+mpmath.power(volatility,2)/2)*time)/(volatility*mpmath.sqrt(time))
    d2 = d1-volatility*mpmath.sqrt(time)
    if flag == 'call':
        return (mpmath.exp((carry-rate)*time))*spot*mpmath.ncdf(d1)-(mpmath.exp(-rate*time))*strike*mpmath.ncdf(d2)
    elif flag == 'put':
        return (mpmath.exp(-rate*time))*strike*mpmath.ncdf(-d2)-(mpmath.exp((carry-rate)*time))*spot*mpmath.ncdf(-d1)
    else:
        return 0
計算
>>> opt_bs('call', 60, 70, 0.6, 0.005, 0.35, 0)
mpf('3.09337407943667360649281702694607')
比較後發現,可以精確到小數點後 14 位,這也是一般 C 語言常見的精確度。

2011-04-14

Download Personal GAE Source Code

官網

有時人就是手賤,開發中的檔案會出問題,這時可以找回在 GAE 上的舊版本,就好像 github 一樣。

語法
appcfg.py download_app -A <application-id> -V <application-version> <output-dir>
用法
python2.5 appcfg.py download_app -A myGAE -V 1 myGAE
將 myGAE 的第一版下載到 myGAE 目錄下。

2011-04-07

IEEE 754 floating number calculation

IEEE 754-2008
$$(-1)^{s}\times c\times b^{q}$$
程式碼
#include <stdio.h>

int main() {
    float y;
    unsigned int x;
    /* Set i to binary format 10000000000000000000000000000000.  */
    unsigned int i = 0x80000000;

    printf("Enter a floating number: ");
    (void) scanf("%f", &y);

    /* It's faster than memcpy.
    But using -O2 or -O3 to compile, it raises the warning of
    dereferencing type-punned pointer will break strict-aliasing rules  */
    x = *(unsigned int *) &y;

    /* display binary representation.  */
    for(; i > 0; i >>= 1 ){
        if((i & x) != 0)
            printf("1 ");
        else
            printf("0 ");
    }
    printf("\n");
    printf("* ^ ^ ^ ^ ^ ^ ^ ^ = = = = = = = = = = = = = = = = = = = = = = =\n");
    printf("* 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M\n");

    return 0;
}
編譯
gcc IEEE754float.c -Wall -Wextra -pedantic -Wconversion -Wundef -Wshadow -o z1
執行結果
Enter a floating number: 3.75
0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
* ^ ^ ^ ^ ^ ^ ^ ^ = = = = = = = = = = = = = = = = = = = = = = =
* 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M
Enter a floating number: 7.25
0 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
* ^ ^ ^ ^ ^ ^ ^ ^ = = = = = = = = = = = = = = = = = = = = = = =
* 7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M
以 C 的 float 來看,4 bytes = 32 bits,最左邊的一個 bit 是除存 +/- 號,也就是上式的 \(s\);接下來的 8 bits 儲存指數 (exponent),也就是上式的 \(q\);剩下的 23 bits 儲存小數點後的部份,加上 1 之後,成為底數 (significand),也就是上式的 \(c\)。至於 \(b\),在一般二進位的格式,則為 2。

在 exponent 部份,存取時需要經過計算,以 float 為例,由於共有 8 bits,分為正數與負數,所以從中切一半,存入時加 127,取出時減 127。

在 significand 部份,浮點數是由左向右讀取,並依次乘以 \(2^{n}\)
譬如十進位的 0.5 就存為 10000000000000000000000,
十進位的 0.25 就存為01000000000000000000000,
十進位的 0.75 就存為11000000000000000000000,以此類推。

所以,若有一浮點數 3.75,就要先處理為 \((-1)^{s}\times c\times b^{q}\) 格式,其 significand 部份,格式必定為 1.XXXX,所以要把 3.75 先處理為 \((-1)^{0}\times 1.875\times 2^{1}\),所以 exponent = 1+127 = 128 = 10000000,化為 10000000 存入,浮點部份則為 0.875 = \(2^{-1}+2^{-2}+2^{-3}\),化為 11100000000000000000000 存入。

再來一例,浮點數 -7.25 = \((-1)^{1}\times 1.8125\times 2^{2}\),所以 \(s\) = 1,\(c\) = 1.8125,\(q\) = 2,exponent = 2+127 = 129 = 10000001,0.8125 = \(2^{-1}+2^{-2}+2^{-4}\) = 11010000000000000000000。

附上網頁版計算機

2011-04-06

閱讀心得︰鞋匠、妓女與知識份子的公共性

鞋匠、妓女與知識份子的公共性
調查:公眾信任率超過 10% 的經濟學家僅兩人
Milton Friedman — Economist as Public Intellectual

仔細想一想,其實不應該說是知識分子的公共性,應該說是知識的外部性比較精確。

一般人會有這種直觀的想法,我認為是歷史環境造成的。早期的時候,只有少數人受過高等教育,也因此只有少數人擁有知識,這時候他的發言(不論是否為了特定目的)都能夠激起群眾的反應(不論贊成與否),從而演變出一連串的政策或討論,而這個過程被認為是一種該知識份子產生的公共性。

再來看那一份調查,58% 的人認為學者應站在學術立場發言,但 69% 的人認為學者站在利益集團立場發言,這其實是正常的。因為經濟學家通常都受雇於不同機構,除了少數待在學術圈,大部分待的都是有特定立場的機構,包括政府部門、投資銀行、顧問公司、媒體等等,所以會以該機構的立場來評論事情乃是職業道德,國外媒體刊出這些人的看法時,都會附上該經濟學家的任職單位,使讀者明白立場。這點從 FED Dallas 評論 Milton Friedman 的第一段就已經明白指出,隱含公共知識分子本來就是少見。

至於學術圈的經濟學者的發言如果脫離學術範疇,通常就是個人意見,跟媒體訪問路人甲一樣,這時掛上教授頭銜就有誤導民眾之嫌了,台灣不少談話性節目最喜歡這樣搞,其實 CNN 也是會請名嘴(很多也都是博士)上節目,不過這些名嘴都是為 CNN 工作,所以職銜都是 CNN 某某中心主任或研究員,觀眾心中自有一把尺。

結論︰知識有顯著的外部性,不同的專業有不同的知識,要求特定對象的知識有公共性是模糊不清的論點,想當大官的學者經常喜歡這樣投機。

2011-04-05

Splint︰龜毛的語法與邏輯靜態分析工具

用 gcc 編譯時,如果把 -Wall -Wextra -pedantic -Wconversion -Wundef -Wshadow 這些選項全部打開,一般的問題都可以找出來,這也符合 GNU coding standards 的建議。不過我無意間發現一個靜態分析工具 Splint,可以做更細膩的分析。

以 root 權限安裝
apt-get install splint
檢查 source.c 的語法
splint source.c

常見問題︰

realcompare
指的是將兩個 float、double、long double 等 real 相比較,由於浮點數的問題,所以這問題要解決必須要將兩數相減並指明小於某個誤差範圍。
錯誤
a != b;
修正為
fabs(a-b) < 1e-20;
基本上,double 大約會精確到小數點後 15 或 16 位,但是這個分析器會指出錯誤,我想除非做數值研究,不然應該不需要打開這個。

evalorder
這是講 Undefined Behavior,譬如一些 function 行為定義不清楚,常見的有 exp 跟 sqrt。
錯誤
c = a * exp(b);
修正為
f = exp(b);
c = a * f;

boolops
這個問題容易,主要是 C89 沒有 boolean,而部份 function 在判斷相等時會傳回 0,被我們拿來當 boolean 使用。
錯誤
!strcmp(str, "abc");
修正為
strcmp(str, "abc") == 0;

這個工具看來有悠久歷史,如果照它的建議去修正,程式看起來會變得難以閱讀,但是會安全很多,我用了幾個小時,覺得這像是做嚴格計算機科學的人才會使用到,玩一玩會發現自己很多沒注意到的地方,算是一種鍛鍊吧,呵呵。

2011-04-04

閱讀心得︰策略書之三:讓我換回去!

策略書之三:讓我換回去!

看完這篇連想到其他 excel-compatible 的軟體,當初 excel 幹掉 lotus-123 就是靠相容,尤其是可以在 excel 輸出 lotus-123 的檔案後;不過 excel 真正強大的地方是 vba,從進入 excel 2000 後,vba 6.0 就很穩定,直到 excel 2010 才換vba 6.5,還是很穩定。excel 真可以說是 M$ 做最多優化的程式,為啥 excel 會這麼強大,這就跟早期的專案經理 (project manager, PM) 有關,也就是約耳 (Joel),多年後比爾蓋茲都還說之後一直找不到好的 PM,可知其重要性。

我扯這麼遠的原因是,gnumeric 本來要採用 python 當 script language,結果根據以上原理,現在 vba 勝出;我還撥空看一下 open office calc 的 vba,慘不忍睹,語法結構根本就不一樣,看來會有一段很艱苦的開發道路。

excel 在插件上還有一個叫 xll 的東西,是一種以 C/C++ 寫成的 dll,可以大幅增進計算速度,到了 excel 2007 後,還支援平行運算,可以說是殺手級的應用,如果再考慮 COM,實在是不容樂觀。嗯嗯,我想 GNU 應該考慮請約耳當顧問,如果真的要把 open source 推向一般使用者,看起來 excel 真是很強大的對手。

2011-04-02

閱讀心得︰未成年就這麼優,是一切邪惡的根源

出處︰重新學C++
未成年就這麼優,是一切邪惡的根源
Premature optimization is the root of all evil.
這中文翻的頗搞笑,但是卻讓人印象深刻。英文出自Don Knuth,完整段落是
Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.
完全說出了程式開發的重點,小技巧或許小程式或程式競賽時很有用,但是在大型專案下,還是先能夠穩定正確執行後,最後再來花時間做效能調整;其實在Scott Meyers的Effective C++系列書中也有講到不需要做最佳化,因為那會讓程式難以閱讀與維護。嗯嗯,看來主要是要看誰在維護了,我想在open source中應該要儘量遵守這個原則。

至於為何 C++ 可以跑得比較快,我個人認為主要是 STL 與 Template 的功勞,ADT(Abstract Data Type)在 C 也可以做,只是寫起來不若 C++ 順手(主要是Inheritance 跟 Polymophism,間接跟 STL 與 Template 也有關);考慮到移植性的話,不但要用 C 寫,而且還要用 C89,因為VS2010 根本不支援 C99,也沒有計畫支援 C99

2011-04-01

C and Python Coding Style

大部分的書都會說要找出一種適合的方法,然後從一而終的遵循它,好讓日後維護的人易於修改。不過大量閱讀程式碼後,發現自己好像處於非主流,所以趕快研究一下,看有沒有必要做出修改。

首先,我的風格是比較接近 Standards and Style for Coding in ANSI C,而在台灣買的 C 語言的書也比較接近這種,所以難怪我是屬於這種。不過仔細看一下 GNU 跟 Linux,發現這兩者的風格比較接近,仔細看一下,這些都是用 emacs 當作 editor,所以這類風格是比較屬於用純文字 editor 的人。一般用 Linux 的人,越資深的越喜歡用 emacs 或 vim,而這些人貢獻的原始碼全都採取這種風格,後續要作修改的人也被要求要繼續遵守,所以 open source 的社群差不多都是這類的。

GNU coding standards,這裡提供多種文件格式,參與程式維護的人都被建議要印一份出來放在手邊。

Linux Kernel Coding Style,是網頁文字版,pdf 版在這邊,文件也建議要印一份 GNU coding standards

google-styleguide,提供多種語言的風格,包括 Objective-CC++PythonJavaScript,沒有提供 C 語言的風格,但是 Google's R Style Guide 可以觀察出,其實風格有點特別,也許應該自己獨立一類,哈。

Python Style Guide for C Code,這也是一個另類,日後影響力可能會漸增。

Style Guide for Python Code,不用說,這就是 Python 官方的指引手冊。

Google Python Style Guide,身為最重要的使用者,當然也有自己的風格。

Anyway,如果寫自己的專案,自己就是老大,可以要求別人遵守;但如果沒辦法將自己的風格寫的很清楚,採取以上的風格也是不錯的選擇。

2011-03-23

閱讀心得︰資訊系統開發的路徑選擇決策對話錄 -- 苦行僧學院版

資訊系統開發的路徑選擇決策對話錄 -- 苦行僧學院版

這篇寓言寫的實在相當諷刺,看完之後解答我的疑惑,為何科技大學的畢業生證照比較多,做事也比較土法煉鋼,但是卻缺乏效率與持續進步的機會,原來多是被「工具」害的。

我不認為學生要屏棄教授使用的工具,因為教授使用的通常是他自己用的最順手的工具,所以這是成本最低效益最高的學習機會,應該要優先把握;可以考慮的方式應該是「溝通」,譬如國外有的教授會用正在開發中而且有潛力的open source來教學,教授通常參與過早期開發,所以熟悉程度依然很好,而這套open source由於正在開發,所以學生們的使用意見成為重要的未來變化的參考,所以學生對於這套open source的掌握度也會較高,這其實是win-win strategy。以國內的狀況來說,研究所以上應該要多考慮後者,大學部則可以擔任課餘測試與使用,相信這對於校內的垂直交流與學習會很有幫助。

PS
其實寫部落格是很好的做筆記方式,尤其摸過的東西多了之後常常會忘記;而且會有機會認識其他的使用者,當自己弄錯時也有比較高的機會被指正,是一種很不錯的學習與共享模式。

閱讀心得︰我被 Microsoft 恐嚇了!

我被 Microsoft 恐嚇了!

基本上,智慧財產是一定要維護的,因為這關係到人類創造的原動力之一,既然選擇買商業軟體,遵守使用規範當然是必須的,只是這層界線的拿捏不是很簡單。

文中最令人震驚的是在回應中有提到︰
Microsoft Business and Service Agreement

第八條的"履約確認"條文
Microsoft 有權審閱客戶的紀錄,或透過獨立的稽核人員對客戶進行現場稽核。除非稽核顯示重大違規,否則 Microsoft 將支付稽核費用。

我們詢問過公司法務及法律顧問,微軟有權來公司進行稽核,我方無法拒絕對方稽查。

這實在是相當恐怖,好像跟警察國家一樣,除了可以授權打恐嚇電話,還可以突擊檢查,根本就把使用者當賊。還好我脫離M$已經很久了,不然實在是花錢買罪受。

用 mpmath 計算高精確度的無理數

使用 mpmath 的方式有二,一是從 python 使用,二是從 sagemath 使用,方法都一樣,只是 sagemath 可以直接在線上使用 sagenb。以下示範計算 error function\(\sqrt{2}\)
>>>import mpmath
>>>mpmath.mp.dps = 20    #精確到小數點後20位
>>>mpmath.erf(0.2)
mpf('0.2227025892104784541401')
>>>mpmath.sqrt(2)
mpf('1.4142135623730950488011')
延伸閱讀︰
小數點後多少位才夠

PS
台灣用 python 的人真少,sagemath 更少,實在是報袗天物啊。

2011-03-22

virtualbox︰guest OS 使用 host 的 USB

完成安裝 USB 在 host 後,要把使用者加入 vboxuser 群組。
sudo adduser username vboxusers
從 VirtualBox 4.0 版開始,在權限與設定有些變化,先安裝 VirtualBox Extension Pack,然後以 root 權限編輯 /etc/udev/rules.d/10-vboxdrv.rules
gedit /etc/udev/rules.d/10-vboxdrv.rules
增加 vboxusers 到第二行跟第三行,如下︰
KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600"
SUBSYSTEM=="usb_device", ACTION=="add", RUN+="/usr/share/virtualbox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass} vboxusers"
SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/usr/share/virtualbox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass} vboxusers"
SUBSYSTEM=="usb_device", ACTION=="remove", RUN+="/usr/share/virtualbox/VBoxCreateUSBNode.sh --remove $major $minor"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/usr/share/virtualbox/VBoxCreateUSBNode.sh --remove $major $minor"
接著登出使用者再登入,使變更生效。

然後到 Devices → USB Devices 選擇要啟用的 USB 裝置,如果需要的話,再安裝一次屬於 guest OS 的 driver 就好了。

一般來說,這樣應該就能使用了,如果還不行,參考 USB is greyed out

ubuntu 上安裝讀卡機

這裡以 EZ100PU 為例,步驟如下︰

1.到這邊找原始碼,下載後解壓縮。

2.確認安裝環境
./check_env

3.發現需要 PCSC-lite,到這邊 (這網站出現不安全警示,可以虛擬一個專門上這種網站) 找。

4.安裝 PCSC-lite
./configure
補齊缺少的 lib
make
sudo make install

5.回頭再確認一次安裝環境是否完成
./check_env

6.安裝
./install

7.完成

日本地震前後空照對比圖

Japan Earthquake: before and after

這個比較對於差異性有難以用言語表達的效果,色彩在這裡發揮了無比的作用。其實色彩也是處理資料的好幫手,不過這個直接拿來比較實在是個巧思,而且程式做起來也不難。

美國人口遷徙圖

Map: Where Americans Are Moving

這個圖做的真棒,我第一次看到這種呈現分式,看來可以應用在多對多的比較。

2011-03-18

已知最快的河內塔解法 (Hanoi)

來源
#include <stdio.h>

int main() {
    int n, x;

    printf( "How many disks? " );
    scanf( "%d", &n );
    puts( "\n\n" );

    for (x=1; x < (1 << n); x++)
        printf( "move from pole %i to pole %i.\n", (x&(x-1))%3, ((x|(x-1))+1)%3 );

    return 0;
}

這也是 bitwise,可是應該要有靈感才能憑空想出來這樣解,作者一直找不到人,所以也不知道當初怎麼想出來的,網路上果然是人才濟濟。

2011-03-17

媒體本來就是私器

這段話出自金庸,「媒體是老闆的私器,不是人民的公器」可以參考這邊。我想大部分的人會認為媒體是公器的主要原因有二,第一是威權時代的媒體是國家的傳聲筒,而國家屬於全體人民(理論上),第二是媒體自我美化,認為自己是第四權,具有監督政府跟社會的責任。後者看來大有問題,因為媒體也是一種營利事業,為啥會屬於公眾呢?

所謂屬於公眾,指的應該是媒體的掌控者是公眾或公眾的代理人,像是英國BBC,日本NHK,台灣的公視,有拿國家的補助,所以算是公眾媒體;至於其他的媒體,我看全世界大多都是上市公司在經營,像是News Corp,香港唯二兩間電視台,台灣其他的電視台,通通在是這類的,也就是一般上市公司。上市公司自有他該遵循的遊戲規則,譬如為股東賺錢或利益極大化,所以對這類公司本來就該以商業公司來看待,對於台灣這些媒體的種種行為也就不必太以有色眼光看待,不過就是上市公司常搞的那些花招而已。

另外還有一個誤解,就是信用評等公司,同上,其實也是一般的上市公司,譬如Standard & Poors,跟發行公司收費進行信用評等(半世紀前是跟投資人收錢,這種轉變有趣吧),依據付錢是老闆的邏輯,怎可完全信賴呢?只能說公眾又一次的被誤導了。

PS
信用評等公司對老闆進行信評前都會先問一下老闆心中預期的評等是如何,如果老闆說出一個高了兩三級的評等,信評公司就會說如果要達到這樣,需要如何如何,當然啦,收人錢財該做的事還是要做,最後如果評等結果真的跟老闆認知的落差太大,老闆可以選擇撤銷評等,貼心吧。

XOR swap algorithm

主要是看到這篇文章,講到 Joel on software 裡提到的一個面試問題,不能使用額外的記憶體空間來交換字串。回應裡有人用了一個 XOR swap algorithm,合併之後雖可以省了一個 int 宣告,但是常識告訴我們會有 trade-off,以下就是比較。

程式碼
#include <stdio.h>
#include <string.h>
#include <time.h>

int main() {
    char *f, *t, c;
    char arg1[20], arg2[200];
    struct timespec temp[8];

    memset(arg1, 'X', 20);
    f = t = arg1;
    while (*t) t++;
    t--;
    clock_gettime(CLOCK_MONOTONIC, &temp[0]);
    while (t > f) {
        *f ^= *t;
        *t ^= *f;
        *f++ ^= *t--;
    }
    clock_gettime(CLOCK_MONOTONIC, &temp[1]);

    f = t = arg1;
    clock_gettime(CLOCK_MONOTONIC, &temp[2]);
    while (t > f) {
        c = *f;
        *f++ = *t;
        *t-- = c;
    }
    clock_gettime(CLOCK_MONOTONIC, &temp[3]);

    memset(arg2, 'X', 200);
    f = t = arg2;
    while (*t) t++;
    t++;
    clock_gettime(CLOCK_MONOTONIC, &temp[4]);
    while (t > f) {
        *f ^= *t;
        *t ^= *f;
        *f++ ^= *t--;
    }
    clock_gettime(CLOCK_MONOTONIC, &temp[5]);

    f = t = arg2;
    clock_gettime(CLOCK_MONOTONIC, &temp[6]);
    while (t > f) {
        c = *f;
        *f++ = *t;
        *t-- = c;
    }
    clock_gettime(CLOCK_MONOTONIC, &temp[7]);

    printf("swap  20 chars by XOR:     %ld ns\n", (temp[1].tv_sec - temp[0].tv_sec)*1000000000 + temp[1].tv_nsec - temp[0].tv_nsec);
    printf("swap  20 chars bt pointer: %ld ns\n", (temp[3].tv_sec - temp[2].tv_sec)*1000000000 + temp[3].tv_nsec - temp[2].tv_nsec);
    printf("swap 200 chars by XOR:     %ld ns\n", (temp[5].tv_sec - temp[4].tv_sec)*1000000000 + temp[5].tv_nsec - temp[4].tv_nsec);
    printf("swap 200 chars bt pointer: %ld ns\n", (temp[7].tv_sec - temp[6].tv_sec)*1000000000 + temp[7].tv_nsec - temp[6].tv_nsec);

    return 0;
}

編譯
gcc XORnpointer.c -Wall -Wextra -pedantic -Wconversion -Wundef -Wshadow -static /usr/lib/librt.a -o z1
執行
./z1
swap  20 chars by XOR:     481 ns
swap  20 chars bt pointer: 232 ns
swap 200 chars by XOR:     1317 ns
swap 200 chars bt pointer: 223 ns
可以看出 XOR swap algorithm 隨著數目增加而時間增長,所以在這裡還是指標好用。

bitwise 其實是妙用無窮,bitwise tricks 提供簡單的用法,Bit Twiddling Hacks 裡有很完整的介紹,有不少好用的小技巧在裡面。

2011-03-11

R 學習筆記

網址

原則上我不用 R,頂多去撿一些程式碼來用。內容是國家高速網路與計算中心提供的,最神奇的是台灣官方如火如荼的宣傳雲端服務,而這網站竟然架在 Google sites,中華電信明明有 hicloud,卻沒有低價或無償讓這類網站或機構使用,看來台灣的雲端服務很明顯的誇大了。

我看台灣在硬體、水電費跟政治環境可能還有一點競爭力,看 google 或 amazon 要不要在台灣設一個中文的雲端中心,中華電信這種 business model 完全不是 google 跟 amazon 的對手。

Tail call (tail-recursive)

Wiki

使用遞迴時有一個小技巧,就是將遞迴過程中的小結果先計算出來,如此便可以減少 stack 的使用,進而增進計算效率。

下面有三個版本,分別傳統遞迴、跟兩種 tail call 的方式。

程式碼
#include <stdio.h>
#include <time.h>
#include <papi.h>

inline unsigned int sum(unsigned int n) {
    if (n == 0)
        return 0;

    return n + sum(n - 1);
}

inline unsigned int tail_sum(unsigned int n, unsigned int accumulator) {
    if (n == 0)
       return accumulator;

    return tail_sum(n - 1, n + accumulator);
}

inline unsigned int while_sum(unsigned int n, unsigned int accumulator) {
    while (n != 0)
        accumulator += n--;

    return accumulator;
}

int main() {
    struct timespec temp1, temp2, temp3, temp4;
    long long t1, t2, t3, t4;

    clock_gettime(CLOCK_MONOTONIC, &temp1);
    t1 = PAPI_get_real_cyc();
    (void) sum(50000);
    clock_gettime(CLOCK_MONOTONIC, &temp2);
    t2 = PAPI_get_real_cyc();
    (void) tail_sum(50000, 0);
    clock_gettime(CLOCK_MONOTONIC, &temp3);
    t3 = PAPI_get_real_cyc();
    (void) while_sum(50000, 0);
    clock_gettime(CLOCK_MONOTONIC, &temp4);
    t4 = PAPI_get_real_cyc();

    printf("elapsed time 1 = %ld ns\n", (temp2.tv_sec - temp1.tv_sec)*1000000000 + temp2.tv_nsec - temp1.tv_nsec);
    printf("elapsed time 2 = %ld ns\n", (temp3.tv_sec - temp2.tv_sec)*1000000000 + temp3.tv_nsec - temp2.tv_nsec);
    printf("elapsed time 3 = %ld ns\n", (temp4.tv_sec - temp3.tv_sec)*1000000000 + temp4.tv_nsec - temp3.tv_nsec);
    printf("elapsed cycles 1 = %lld\n", t2 - t1);
    printf("elapsed cycles 2 = %lld\n", t3 - t2);
    printf("elapsed cycles 3 = %lld\n", t4 - t3);

    return 0;
}
編譯
gcc tail_recursion.c -std=gnu99 -O3 -Wall -Wextra -pedantic -Wconversion -Wundef -Wshadow -static /usr/local/lib/libpapi.a /usr/lib/librt.a -o z1
執行
./z1
elapsed time 1 = 3643 ns
elapsed time 2 = 267 ns
elapsed time 3 = 262 ns
elapsed cycles 1 = 816
elapsed cycles 2 = 712
elapsed cycles 3 = 696
效能計算採用兩種方式,第一種是系統的時間,Linux 可以計算到 nanosecond;第二種是採用專門的效能工具 PAPI,計算 clock cycles,由於秒數是由 clock cycles 與 MHz 計算出來的,後者看起來會準一點,尤其是現代 CPU 常常會進入較低時脈的省電模式 (frequency scaling)。計算方式如下,2GHz 的 processor,1 clock = 1/2000000000 seconds = 0.5 nanoseconds。

2011.04.05 更新︰忘了考慮 stack,所以把 function 加上 inline,以便在complilation 時把程式在 main() 展開,如此才不會因為 stack 要先進後出 (First in Last out, FILO) 影響測量結果。

PS1
這裡 gcc 要加上 -std=gnu99 的原因是 PAPI_get_real_cyc 的回傳值是 long long,而預設的 -std=gnu89 是 ISO C90 + GNU extensions (including some C99 features),不支援 long long 型態 (等 GCC 完全支援 C99 後,預設就會改為 -std=gnu99,估計還有一兩年)。
PS2
這裡 gcc 要加上 -O3 的原因是要展開 inline,用 -O2 也可以。