2010年12月3日 星期五

合併 Git 的 Commit

Git 是一個很強大的分散式版本管理系統,因為有了 git,我習慣寫二三十行 code 就 commit 到 local repository。然而如此一來,repository 會充滿一大堆不能正常 compile 的 commit,而且會有一大堆 Fix Typo 之類很沒有用的 commit。有時候會想要把一些 commits 合併之後再上傳給別人,這時候就可以使用 rebase 來合併修改計錄。

(不過以下的流程只適合在 local repository 做,一旦上傳到 public repository,就不適合再 rebase 了!)

首先我們要知道過去的 commit 記錄:

$ git log  # 先看每一個 commit 的 log 與 sha1 編號

假設我們要把 branch1 的  commitA..commitB 的 commits 合併起來,我們就這樣做(以下的 commitA 與 commitB 皆是指這二個 commit 的 sha1 編號):

$ git checkout commitB  # 先回到過去某個 commit

$ git reset --soft commitA  # 修改 working directory 的 commit index

$ git commit --amend  # 更新 commit 訊息與時間 (合併 commitA..commitB)

$ git tag tmp  # 記錄合併後的 commit 的 sha1 編號(你直接記 sha1 編號也是可以)

$ git checkout branch1  # 回到原本 branch 的 HEAD

$ git rebase --onto tmp commitB
# 把 commitB 之前的 commit history 換成合併之後的 commit。

$ git tag -d tmp  # 刪除暫時的 tag
--
資料來源:
How do I combine the first two commits of a Git repository?

2010年7月22日 星期四

範文?駢體文?八股文?

前日,學測公佈了一篇得滿分的作文,評語是「感情抒發非常有張力,組織結構、起承轉合也很好...」

可是我自己看這一篇文章的時候覺得這一篇文篇華而不實,空有華麗的修辭,然而打動人心的部分甚至比朱自清的背影還少的很多。當然,這位同學的寫作水平很高應該是事實(但有一種補習班教出來的感覺),拿滿分應受之無愧,但是我不太能接受這樣的文章被選為範文。

我記得我的高中老師曾經印了全國寫作比賽第一名的文章給我們看,我和一些同學都認為這篇文章雖然寫得很美,但應該也算不上什麼好文章。不過事實上老師別有用心,在第一名作文的背面,老師印了另一篇社論:為什麼第一名的文章雖有優美的修辭、嚴謹的結構,然而卻有「為賦新辭強說愁」的感覺,明明才十七八歲,就有歲月不待人之類的感嘆...?

我的國文一向不好,不過高中課文中,我還蠻喜歡劉勰的《文心雕龍》〈情采〉。這一篇提到:「是以衣錦褧衣,惡文太章;賁象窮白,貴乎反本。」我自己讀到這一段是深表認同的!我讀的文學類書籍雖然不多,然而所有讓我感動過的文章,都沒有這種誇張到不行的修辭。不過我們閱卷老師似乎很吃這一套,還選出來當範文,這不是另一種駢體文嗎?我們的韓愈什麼時候才能出現呢?

唉... ,除了大環境我沒啥好說。

2010年7月14日 星期三

FLOLAC 2010 感想

我最早是從柯學長那裡聽說 FLOLAC 暑期學分班的,根據柯學長的說法 FLOLAC 給他很大的啟發,所以今年我也去報名,想要想想「程式言語」道底是長什麼樣子?經過了二個星期,我覺得確實大開眼界看到了很多不一樣的東西!以下我就分別介紹這二個星期的課程:
  • Logic 邏輯 - 在這個課程之內,我學到了 Propositional Logic 與 Calculational Logic,還有 Functional Complete 的概念,與 Functional Complete 的證明(事實上,Sum of Product 應該只可以當結果,我們要證 Functional Completeness 要先確認 Propositional Letter 再做 Structural Induction)。除此之外,我還學到了 First Order Logic、Sequent Calculus、Peano Axioms 與 First-order Logic 能力的極限等等很有趣而且過去沒有聽過的東西。
  • Functional Programming 函數編程 - 這應該是眾課程當中,我比較熟悉的一個。不過這一門課是教 OCaml (而不是我比較熟悉的 Haskell)。老師就從 Binding 的概念開始,一路介紹到怎麼寫一個函數(遞迴的),還有 High-order Function。另外,還有介紹到 OCaml 之中比較特別的 Parameterized Modules。所謂的 Parameterized Modules 是一個比較特別的 Module,只要你代入幾個參數,Parameterized Modules 會生產出一個新的 Module。我在上這一段的時候,心底想的是 C++ Template 與 Meta-programming。其實感覺起來還蠻像的!XD 不過這一門課的比重偏低,是比較可惜的地方!Folding/Unfolding 的部分就只有快速帶過而己,有一點可惜。
  • Operational Semantics 操作語意 - 這個課程是從「操作」的角度來向我們介紹語議。這樣講有一點抽象,簡單地說就是告訴我們要怎麼做才可以達到某個語意。例如:If、While、Assign 等等。這個課程主要又分成二個部分:Natural Semantics 與 Structural Operational Semantics。前者專注於大的概念,所以在 Composited Statement 當中,我們不會考慮比較小的 Statement 的情況,然而在 Structural Operational Semantics 我們會考慮不少細微的變化,包括平行程式執行起來可能會產生的差異等等。
  • Program Construction and Reasoning 程式建構與推理 - 這一門課是在教我們怎麼寫一個正確的程式,並且在建構一個程式的同時證明其正確性。在這一堂課當中,我們會用到 Hoare Logic。透過 Precondition、Postcondition、Loop Invariant 還有一些 Rules 讓我們可以知道程式是不是正確的。另外,穆老師還提到了 Goto Considered Harmful 的大論戰等等很有趣的東西!
  • Frama-C - Frama-C 是一套可以幫助我們驗證 C 程式寫得對不對的軟體。不過 Frama-C 本身沒有那麼厲害,有時候我們還是必須要加入一些參數,讓參數引導證明!在 Frama-C 這一堂課就會用到 Hoare Logic 與 Loop Invariant 的概念。不同之處在於我們會親自驗證別人寫得程式!所有我們用來練習的程式碼都是取材自開放原始碼的程式,而且真槍實彈地去找 bug。不過我自己覺得要驗證別人的程式好麻煩,尤其是不知道作者的意圖的時候。不過話說回來,或許我會用 Frama-C 驗證我自己的程式。
  • Denotation Semantics 指稱語意 - 這堂課和 Operational Semantics 一樣,是在探討程式的語意。然而不同的是 Denotational Semantics 比較在乎函數的 Composition,所有的 Statement 都被理解成更簡單的 Statement 的 Composition。在這個課程當中,我學到了所謂 Recursion 其實是尋找更高一層函式的 Fix Point,這對我來說是一個很特別的想法!過去我想到 Recursion 只會想到 Stack 與 Calling convention 之類的東西。
總體來說,FLOLAC 2010 非常精彩,而且學到了很多不同的東西!雖然有人開玩笑地說 FLOLAC 2010 是夏日裡的煉獄,不過我個人的感覺是:在考試之前,都只是適量,不過考試嗎... 別再提了。

但是總結來說,FLOLAC 2010 兩個星期的課程值回票價,我很喜歡!

2010年1月4日 星期一

Ubuntu 9.10、Network Manager、與 ADSL

因為 Ubuntu 9.10 光碟片附的 Network manager 好像有問題。所以我在灌他的時後就必需要使用 pppoeconf 來連接 ADSL。更麻煩的是因為 pppoeconf 好像會和 Network manager 衝突,所以 Network manager 就不會動了(只剩下無線網路的功能)。

之前有在網路上看到有人說 Network manager 的問題已經修復了!只要先到「軟體來源」把 ppa:network-manager/trunk 加上去,重新載入,然後 Network manager 更新的 trunk 即可正常地使用 Network manager。不過經過我的實測,我發現還是不行。Network manager 會顯示「無法管理資源」之類的問題。

再經過一番研究,發現原有的 pppoeconf 的設定檔會雖著安裝的過程複製到硬碟上,所以衝突的問題還是存在。要解決這個問題,我們要先修改 /etc/NetworkManager/nm-system-settings.conf。我們要把 managed=false 改成 managed=true。接著再修改 /etc/network/interfaces,把所有的東西刪到只剩下:
auto lo
iface lo inet loopback
之後重新開機即可。


參考資料:
http://blog.yam.com/lijohnson/article/25953686
http://forum.ubuntu.org.cn/viewtopic.php?p=1569643#p1569643