20 September, 2010

用 Python 處理 doc 檔

到今天已經退伍一個禮拜了, 如果還在當兵的話, 現在應該穿著全副武裝還有不能防水的雨衣在救災吧 XD

不久前我用 Python 寫了一個小程式幫女友處理她的 doc 檔,底下是心得記錄。 基本上 doc 檔比純文字檔難處理,因為要用到 windows API, 不過這也還好,大多數的人都用 windows, 所以 Python 一定會有可用的函式庫,而網路上還可以找到幾個用 Python 處理 doc 檔的 範例。 另一個棘手的地方是,doc 檔的段落具有格式,比如字型大小、顏色、粗細、框線、上下標, 段落還可能有縮排,在處理段落時這些都要保留下來。 如果是純文字就不會有這個問題, 通常只需 string 的內建函式即可搞定,甚至不用動到 regex。 之前沒接觸過 windows API,(平常我都用 LaTeX 或是純文字檔) 要如何解決這個問題,一開始一點頭緒都沒有, 後來才想到,如果要保留格式的話,用類似滑鼠選取之後的複製、貼上就可以了, 查了一下 MSDN,果然有這兩個函式。

12 June, 2010

修車有感

最近機車 yamaha GTR 出現了一個奇怪的症頭, 雙載會熄火,奇怪的是一個人騎的時候,卻又正常。 於是就到之前一家印象還不錯的機車行修車, 老闆聽完我的描述之後,也沒有檢查機車, 就直接說應該是化油器壞掉了, 換新的要 4, 5 千,如果是二手的大概只要 2千到 1千5, 要我考慮看看,二手的價錢還可以接受,便付了定金, 老闆說過幾天找到二手化油器之後,我再過去換。

回家的路程中愈想愈不對,化油器又不是消秏品,那有那麼容易損壞, 頂多是跟化油器有關的某個零件壞了,並不需要換整個化油器, 上網一查, 果不其然,是一個連接化油器的管子( 負壓管 )壞了, 更換只要 250 元,當下立刻查了離家最近的 yamaha 修車行, 修車師傅檢查之後,發現果然是負壓管破了, 此外髒空氣有可能跑進化油器裡面,清理需要 450。 師傅還調整了機車的狀態,原本不好發動的小毛病也解決了。

結論是做功課可以省錢,此外還可增加自己的知識,不會被別人牽著鼻子走。

06 June, 2010

How Research is Carried Out? by Michael Atiyah

好一陣子沒發文了,因為在當兵,幾乎沒時間發文, 之前在若水堂買了大連理工大學出版的 「 數學家思想文庫 04:數學的統一性」,這本書選編並翻譯了 Michael Atiyah 的文章,通過本書可以了解他的數學和哲學思想。 書中「如何進行研究」這一篇, 特別另人驚豔,文中 Atiyah 談到一些數學研究者可能遇到的問題, 並提供自己的看法,非常值得一讀, 可惜網路上找不到原文, 不過 Google 圖書到是有幾頁可以預覽「 Michael Atiyah: Collected Works 」, 本文中的原文就是從 Google 圖書節錄下來的。 原文是發表在

M. Atiyah, How research is carried out. Bulletin of the Institute of Mathematics and its Applications, 1974, 10, p.232–234.

我的筆記如下:

20 September, 2009

落葉歸根

在公視看到林志炫演唱王力宏的落葉歸根, 覺得很不錯,歌詞如下

14 September, 2009

論語 · 為政第二

偶然在 網路 上看到論語某段的翻譯, 覺得有趣,就順手放上來了。

子曰:吾,十有五,而志于學,三十而立,四十而不惑, 五十而知天命,六十而耳順,七十而從心所欲,不踰矩。

下面的翻譯來自 James Legge

The Master said:``
At fifteen, I had my mind bent on learning.
At thirty, I stood firm.
At forty, I had no doubts.
At fifty, I know the decrees of Heaven.
At sixty, my ear was an obedient organ for the reception of truth.
At seventy, I could follow what my heart desired, without transgressing what was right."

22 July, 2009

黎曼猜想 - Riemann Hypothesis

費馬最後定理 [1] (Fermat's Last Theorem) 及 龐加萊猜想[2] (Poincare Conjecture) 相繼被攻克之後, 黎曼猜想 (Riemann Hypothesis) 是一個數學家久攻不下的數學難題,底下簡介此猜想的內容及重要性。 Bernhard Riemann 在 32 歲 (1859 年) 時被柏林科學院 (Berlin Academy) 選為通信院士, 為了回報此一崇高榮譽,於是 Riemann 向柏林科學院提交一篇論文[3], 只有 6 頁,題目是「論小於給定數值的質數個數」 (On the number of primes less than a given quantity)

11 July, 2009

Python Idiom: Decorator II

之前的部落格 介紹了 decorator 的基本概念及用法,本篇介紹 decorator 的兩個應用。 第一個例子是 幫函式加上快取
def fibonacci(n):
   if n in (0, 1):
      return n
   return fibonacci(n-1) + fibonacci(n-2)

30 June, 2009

Proofs from THE BOOK

Paul Erdos 認為上帝把每一個數學定理最精妙的證明都寫在天書 The Book 中, 同時他還說你不必相信上帝,但身為一個數學家,你應該相信天書, 當然天書並不存在於世界上, 於是數學家 Martin Aigner 和 Günter M. Ziegler 就想要寫一本近似於天書的書, 在 Erdos 熱心地幫助之下, 他們將一些具有高超思想、聰明的觀察和出色的洞察力的證明 加以整理,收錄於 Proofs from THE BOOK 一書中, 此書於 1998 年 3 月出版,可惜 Erdos 在 1996年就去世了, 沒能看到此書問世。 網路上有此書的目錄還有第一章的內容「 質數有無限多的六個證明 」可以試讀。

23 June, 2009

澄清湖接力賽

繼上次 阿公店盃接力賽 之後,又再次接受吳先生的邀請參加 6 月 20 日舉辦的 澄清湖接力, 這項比賽號稱馬拉松接力,也就是說參加接力的 7 個人要跑完 42 公里, 平均每個人跑 6 公里。 接力賽是 8 點開始,所以我 6:40 就起床了, 7:10 出發, 這是第一次自己騎車到澄清湖,有點擔心會迷路, 不過澄清湖是個知名景點,其實很容易找,一路上都有路標, 從九如路一直騎接澄清湖路左轉到底就是了, 一路上天空有厚厚的烏雲,還不時飄雨, 昨天剛發布蓮花的颱風的海上警報,我還在想說今天會不會不能跑。 即使如此,還是決定先騎到澄清湖,到時再見機行事。

11 June, 2009

Python Idiom: Decorator I

本文將介紹 Python Decorators 的用法,主要內容是根據我的理解部分改寫 Bruce Eckel 的好文 Decorators I: Introduction to Python Decorators 。假設我們有下面兩個函式
def func1():
    print "inside func1()"

def func2():
    print "inside func2()"

我們希望在呼叫 func1() 前顯示 Entering func1, 而在離開 func1() 後顯示 Exited func1, 對 func2() 的要求也是相同,只是把函式名字換成 func2, 最直接的方法是修改 func1 及 func2 的實作內容, 可是這樣做實在太累贅了, 有沒有辦法把 func1 跟 func2 當作物件, 自己寫一個額外的函式來「裝飾」這些物件? Python 語言中所提供的 decorator 語法可以幫我們達到這個目的 (decorator 就是裝飾者的意思)。 decorator 的使用語法如下

07 June, 2009

使用快取加速遞迴函式

大家都知道 Fibonacci 序列 吧, 公式很簡單
f(n) = f(n-1)+f(n-2),  f(0) = 0,  f(1) = 1
Fibonacci 的公式是遞迴的, 因為要計算 f(n) 需要上次及上上次計算的結果。 直接套定義就有下面的函式 (in Python)
def fib(n):
   if n in (0, 1):
      return n
   return fib(n-1) + fib(n-2)
實際測試,會發現上面函式的執行效率非常差, 比方說我們要計算 f(5),套定義,要先計算 f(3) 跟 f(4), 可是要計算 f(4) 又要先知道 f(3) 跟 f(2), 也就是說實際上 f(3) 算了兩次,依此類推 f(2) 計算了三次, 如果 n 很大的話,計算 f(n) 就會重覆很多不必要的計算, 要解決這個問題不難,在函式中加入一個快取來記錄之前算過的值就可以了

31 May, 2009

第一次考托福

今天是我第一次考托福,地點在台南市忠義路跟民權路的交叉口, 全名是「中華民國國際生活美語發展協會」, 它是台南 iDEA 的 其中一個考場 ,沒有招牌,可是考試當天會貼一張考試公告在外面, 所以還蠻好找的,一走進去就會看到電梯,電梯有點老舊,上升的時候有點不穩, 4 樓就是考場了,考場有點擠,空調不是很強,考試人員還蠻親切的, 考試是先到先考。

09 April, 2009

命令列使用:ls、cmd 及 start

平常我都是用 MinGW 所提供的 MSYS 套件當作命令列系統, 可是遇到一個問題,每當我打 ls -t 總是要等好幾秒才會看到結果, 由於這個指令太常用了, 必須想一個替代方案才行, 我的解法是利用 windows 內建的 shell, ls -t 對應的指令如下
cmd //c dir //b //O-d

cmd 就是 windows 內建的 shell, 選項 //c 表示執行完後面的指令就結束, 而 dir //b //O-d 就是我們想要 cmd 執行的指令, dir 會列出目錄中的檔案及子目錄, 選項 //b 表示去掉標頭資訊, //O-d 表示依最新日期排序, 如果不清楚 dir 的使用方法, 可以試試選項 //?。 下面是兩者的所需的時間:

ls -t 2.812 secs
cmd //c 0.157 secs

差了 10 倍以上,ls -t 實在太慢了。 接下來介紹一個我自創的指令, 假設想要執行目前目錄下的最新檔案, 比方剛剛下載了一個 pdf 文件或是一個 jpg 檔, 那這一個檔案就是目前目錄的最新檔案, 利用前面介紹的指令再加上 start 就可完成這個動作:

     start `cmd //c dir //b //O-d | sed -n 1p`

start 1.jpg 會以預設開啟副檔名為 jpg 的程式來開啟 1.jpg, 而 start 1.pdf 會以預設開啟副檔名為 pdf 的程式來開啟 1.pdf。 問題來了,要怎麼產生目錄下最新檔案的名稱呢? 前面介紹的指令會將目錄下所有檔案由新到舊排列, 但我們只想要第一個,怎麼做呢? 簡單,利用 sed -n 1p 即可。 眼尖的人還會發現 start 後面的字串被反引號 ` 括起來, 這麼做的目的是先執行反引號中的指令以取得我們想要的檔名。 出個練習題,寫一個 bash function 假設名稱是 t, 使得 t i 會執行目前目錄下第 i 新的檔案。 答案如下:

function t()
{   arg=${1:-"1"}
    start "`cmd //c dir //b //O-d | sed -n \"${arg}p\"`"
}

上面用到 ${1:-"1"}$ 是 bash 特有的 Shell Parameter Expansion, 非常好用,之前我有舉過一個 例子

04 April, 2009

托福考試用書

Ptt 托福考試板 調查了一些評價不錯的托福考試用書:

書的價格如下:

繁體 簡體
閱讀 702 230
聽力 702 230
口說 432 190
寫作 540 240
OG 1223 390
字彙 432

繁體價錢是以博客來為準,知英跟字彙都打 9 折(之前有打 8 折), OG 沒打折,簡體價錢是以奇摩拍賣 留學家族 為準。 繁體書的價格我覺得太貴,後來發現有簡體書可以買,內容好像一樣, 字彙不算在內,繁體與簡體的價差是 3599 - 1280 = 2319 元, 差距有點大,所以除了字彙我打算買簡體的,雖然簡體書的質感會比較差。

此外,我想提一下這一本書「 旋元佑文法 」, 在舊托福時代,文法是考試的其中一科, 所以那時文法書應該很暢銷,我妹剛好有買這一本。 我在念博班,常常需要寫文章,英文文法當然是要強化的一環, 網路上對這本書的評價很高,於是就拿來 K 了。 這本書實在令人驚豔,它改變了我對英文文法的認識, 一直以來,我認為文法都是靠死背或是死記, 可是這本書卻是教人以邏輯判斷來理解文法, 實在是了不起的想法。 不過,這本書已經絕版了,奇摩拍賣上還有得買, 只是 價錢 是出人意外的高,至少是原價 360 元的兩倍以上, 如果真的對這本書有興趣,又找不到人借,可以試試搜尋引擎,會有相當多的相關結果。

31 March, 2009

分析遞迴結構

假設我們想將下面的資料
(A ((B (C D)) (E F)))
根據括號的順序以產生下面的結果
(C D)
(B (C D))
(E F)
((B (C D)) (E F))
(A ((B (C D)) (E F)))
該怎麼做呢?

27 March, 2009

台南市的大陸書店

Ptt 托福考試板 看到台南市大陸書店的介紹,想說就記錄一下,之後可能會想去逛逛。

26 March, 2009

校慶 3000 公尺

3月25日是學校校慶,我參加了 3000 公尺的比賽, 今年比賽日期是到3月初才公布, 害我只有3個禮拜的時間可以準備, 平常都是練 8-10 km 順順的跑,沒有特意加強速度, 為了參加比賽,我還練了間歇跑提升速度。 根據練習的數據來看,我最快可以跑到 11 分 30 秒。 去年一直在受傷的陰影中,沒辦法參加比賽,直到今年初才完全復原, 再加上又老了一歲,我想應該沒法在這一次比賽中突破之前的記錄。

07 March, 2009

用 bash 及 mv 換檔名

JeffHung 寫了一篇文章介紹 用 find、sed、xargs 及 mv 換檔名,其實我還蠻常遇到這個問題的, 底下介紹我的做法。假設現在想要把下面第一欄的檔名換成第二欄的檔名
a.vcproj -> a.vc9.vcproj
b.vcproj -> b.vc9.vcproj
a.vcproj -> c.vc9.vcproj
其實只要用 bash 寫一個 for 迴圈就解決了

26 February, 2009