2007年11月30日 星期五

比較gFortran在Mac上與在Linux上

目前我在我的MacBook上安裝了兩套gfortran, 安裝細節分別是以Mac OS X 10.5.1 Leopard + gfortran (詳閱)以及透過VMware Fusion 1.1所安裝的Fedora Core 6 Linux + gfortran兩種形式, 今天要來比較差異


程式碼: 採用最近寫的「水文地質參數產生器」, 實質意義不重要, 程式碼就是開個很大的矩陣, 接著寫幾個轉換公式, 將矩陣內每個位置填上數值, 接著寫出到檔案內, 程式碼行數不多(179行), 也沒有呼叫什麼函數~~~

實驗組: 純粹Mac OS上的gfortran
檔案大小: 105MB(是的, 你沒看錯, 的確是105MB)
執行時間: 11 sec

對照組: VMware Fusion內的虛擬Linux
檔案大小: 22KB
執行時間: 6 sec

分析: 這是一個詭異的現象, 我完全沒辦法理解, 為甚麼同樣的程式碼大小居然可以差這麼多, 我是猜測gfortran for Mac版本根本沒有寫好(或是調整好), 搞不好很多東西都搞成inline的形式, 居然跑起來的效能差這麼多


[+/-] Read More...

2007年11月26日 星期一

升級後的BBS軟體

自從升級成Leopard之後, 過去用慣了的AlienBBS似乎沒辦法順利移植到Leopard, 總是稍微用一用就自動關起來, 所以打算換別的軟體...

Mac上常見的三大BBS軟體就是AlienBBS. PCMan跟iTerm, AlienBBS已經宣告不行了, PCMan在試用之後, 發現效能真的有夠差的, 好慢哦!!! 而且對於文章中的url沒有辦法直接開啟瀏覽器閱讀, 所以也宣告失敗, 因此今天嘗試了iTerm...

1. 軟體下載: iTerm官方首頁, 目前已經更新到0.9.5, 今天比較了一下過去使用的0.8+中文化, 效能變好了, 速度變很快(備註: 我不懂, 只是單純的telnet或ssh, 為甚麼可以搞得這麼慢啊!!!)
2. 安裝後, 需要稍微設定一下, 不然進BBS後, 畫面會跳來跳去

  • 2.a iTerm->Preferences...: 
切換到這裡之後, 「General」請勾選「Enable Growl notifications」, 這樣當BBS有訊息時就可以透過Growl來通知...

另外, 「Mouse」這邊記得勾選「Cmd-click to launch URL」, 這樣當有URL出現在文章中時, 只要一邊按住Cmd鍵(即蘋果鍵), 一邊用滑鼠點選即可開啟瀏覽器瀏覽

  • 2.b Bookmarks->Manage Profiles...
Profile設定項目中以「Terminal Profiles」與「Display Profiles」兩項最重要...在「Terminal Profiles」中, Type請選擇xterm-256color, Encode我是選擇Traditional Chinese (Big5), Scrollback Lines則選擇48, Treat Non-ASCII characters as double width要勾選, When idle, sends ASCII code則不勾選, 勾選的話好像會怪怪的 
「Display Profiles」我用Duplicate按鈕來複製classic iTerm Large(因為怕搞壞了), Transparancy功能則設定為0, 設定有透明色時, 眼睛看得很難過...字型則採用Monaco - 14蘋果儷中黑 - 14兩種...


  • 2.c Bookmarks->Manage Bookmarks...
接著新增一個Bookmark, Name欄位可自行建立一個看得懂得名字, Command欄位則自己填入執行的指令, BBS站台連線指令為: telnet -8 [hostname], ssh的連線方式為: ssh -l [username] [hostname], Terminal. Keyboard與Display則依據下列圖形選取
3. 完成設定之後, 也把我周遭的主要站台Bookmark下來, 這樣就可以用點選的方式, 自動開好進去, 若是要更順暢的話, 可以透過ssh-keygen -d產生id_dsa.pub, 將這個檔案附加在對應主機之上, 這樣連密碼都不用輸入

參考筆記: http://chitsaou.wordpress.com/2007/07/02/macosx-terminal-3/

[+/-] Read More...

2007年11月24日 星期六

程式撰寫工作環境(Fortran)從Fedora Core Linux搬移至Mac OS X

若單就我寫程式的平台已經完全脫離Windows系列, 以Fortran編譯器而言, 我拋棄Compaq Visual Fortran, 改用Linux系統上的ifort或是gfortran, 採用ifort是因為系上租用的IMSL只有提供給ifort, 而沒有gfortran版本; 然而多數我使用的電腦還是我的Mac Book, 若要進入寫程式狀態, 則必須要透過VMware Fusion來開啟虛擬的Linux系統, 雖然可以使用虛擬系統來達到我要的功能, 但是這樣在校能上, 總是有點虛耗...另外, 仔細想想, Mac OS X也算是Unix-based的作業系統, 最近更得到Unix的認證, 因此我想搞不好可以把寫程式的作業環境改到Mac OS X下~~~



作業系統: Mac OS X 10.5.1 (Leopard)
編輯器: 在Linux我都用gedit或是vi, 到Mac OS X上我可以透過iTerm以vi來編輯程式碼

Xcode: Mac OS X提供的Xcode, 原本僅支援C, C++與Java等程式語言, 並不支援Fortran, 但是透過MacReasearch提供的Xcode/gFortran plugin, 則會自動安裝gfortran編譯器, 另外還會使Xcode認得Fortran語法, 對於變數或是指令則會以不同顏色顯示...
(補充: 由於我許多程式碼都會在Windows XP與Linux之間同步, 在過去時就發現因為XP的中文編碼是Big5, 所以變成我在安裝好Linux系統的第一件事情, 就是把整個系統變成Big5, 然而Mac OS X我卻不敢這樣作, 太冒險了, 所以那些程式碼到了Mac OS X時, 用Xcode開啟時中文部份就會變成亂碼, 所以可能還是得用vi吧)

編譯器: 如前述所說得用gfortran, 安裝方式詳見Xcode/gFortran plugin

svn: 版本控制系統, Mac OS X似乎直接內建這個指令, 所以只需要透過svn checkout去取出我要的副本

gnuplot: 由於寫完的程式, 跑完的數據總是需要工具來分析, 雖然iWork 08"新增了Numbers軟體, 可以作類似Excel的事情, 但是第一他要賣錢, 第二我不喜歡簡體中文版, 第三我現在喜歡用gnuplot來畫圖, 若設定好整個環境, 可以一個Enter下去, 從跑程式. 輸出數據, 接著畫出分析圖形, 所以這個功能也是我轉移環境的必備條件

a. 先得安裝「AquaTerm」, 這是一套Mac OS X底下的X-Window, 不用去安裝X11, 只要下載解開執行, 就安裝好了
b. 接著去gnuplot網站下載程式碼, 回家自己編譯(所以作這個步驟前一定要先安裝好Xcode, 不然會沒有編譯器去編譯程式碼), 下載回來後, 點兩下就會自動解開.tar格式
c. 接著到文字模式, 切換到目錄下, 執行下列的指令
  • ./configure --with-readline=builtin
  • make
  • sudo make install
d. 輸入gnuplot, 進入gnuplot模式


e. 輸入plot sin(x), 測試是否成功



[+/-] Read More...

2007年11月23日 星期五

版本控制系統(svn) - client版本

subversion(svn)是我近年來使用得最密集的功能之一, 透過這個系統可以讓我跟研究室的成員進行多人開發,因此跟其他人之間不再需要去注意文件版本與同步的問題,因此特別寫下這個筆記...

checkout
說明:這是使用svn系統的第一步驟, 透過這個步驟可以從檔案庫取回檔案副本。
svn checkout svn+ssh://[username]@[host id]/[repos path]/
svn checkout file:///[repos path]/


update
說明:當每次開始要修改前,先透過這個指令取回最新版本的檔案。下面的兩個用法,第一種用法會把所在位置的目錄,以及其下的子目錄所有檔案,一併更新。第二種用法只是單純把某個特定檔案,或是某個特定目錄更新。
svn update
svn update [filename]

commit
說明:當這一次完成修改之後,使用這個指令來將修改送回檔案庫記錄,成為一個新的版本。
svn commit -m "[commit command]"

status
說明:查詢檔案狀態。可以在副本的任何一個目錄內執行這個指令,以下兩種用法也如同svn update一樣,所以我不再敘述一遍。
svn status
svn status [filename]

M filename1 (已修改檔案)
? filename2 (尚未加入svn系統管理)
A filename3 (已經透過svn add加入svn系統,但是尚未以svn commit送至檔案庫)
D filename4 (
將已納入管理的檔案,以svn delete刪除,但是尚未以svn commit送至檔案庫)

add
說明: 將尚未納入管理的檔案,透過svn add將檔案納入管理,從此檔案庫就會多出這個檔案
svn add [filename]

delete
說明: 將已納入管理的檔案,透過這個指令來刪除這個檔案(備註:若直接用rm的方式來刪除檔案,他會被認為檔案遺失,所以下一次update時,會再次取回),從此檔案庫就不再有這個檔案的存在。當然,透過svn update [先前版本],還是可以把這個檔案取回。另外,若這個檔案有修改過,系統不會允許直接刪除,必須加上--force的強制指令,才能刪除掉這個檔案。
svn delete [filename]
svn delete [filename] --force

[+/-] Read More...

2007年11月20日 星期二

動態繫結(dynamic binding)寫法

C++程式是個物件導向的程式, 而繼承則是物件導向中的重要角色, 以下是最近採用的新寫法, 若以基礎類別宣告的指標, 指向衍生類別的物件, 若基礎類別與衍生類別有相同名稱的函式, 也就是說衍生類別複寫了該函式, 配合虛擬函式宣告, 它可以形成動態繫結(binding), 因此會依據函式本身去選用對應的函式, 而非直接採用指標型別所屬函式

範例程式碼1

#include <iostream>

using namespace std;


class mammal {

public:

    mammal () { cout << "Class mammal constructor\n"; }

    virtual ~mammal () { cout << "Class mammal destructor\n"; }

    void virtual speak() const { cout << "This is mammal's speaking\n"; }

};

class dog: public mammal {

public:

    dog () { cout << "Class dog constructor\n"; }

    virtual ~dog () { cout << "Class dog destructor\n"; }

    void virtual speak() const { cout << "This is dog's speaking\n"; }

};


int main() {

    mammal *pm[2];

    // mammal

    pm[0] = new mammal;

    pm[0]->speak();

    delete pm[0];

    

    // dog

    pm[1] = new dog;

    pm[1]->speak();

    delete pm[1];

    return 0;

};

說明1: 宣告一個哺乳類(mammal)類別, 它除了建構子與解構子外, 只有提供speak函式
說明2: 宣告一個狗類(dog)類別, 它公開繼承mammal, 另外它還複寫了speak函式
說明3: 宣告mammal類別的解構子與speak函式為虛擬函式(virtual)
說明4: 主程式中, 以mammal宣告指標, 當指標指往mammal物件時, 並呼叫speak, 它會啟動mammal版本的speak; 若指向dog物件時, 並呼叫speak, 它會自動切換至dog版本的speak
說明5: 若取消mammal版本speak函式的虛擬宣告, 則同樣的程式碼, 即使指向dog物件, 仍舊啟動mammal版本的speak
說明6: 若取消mammal版本解構子的虛擬宣告, 則在delete pm[1]時, 會發現只有啟用mammal版本的解構子, 而依照順序由dog->mammal依次解構
說明7: 解構時會依據繼承的順序, 從衍生類別解構子開始呼叫起, 逐步往基本類別解構子移動; 而相反地, 建構時則與解構相反

這樣的寫法, 可以讓程式碼變成用同樣的名字來呼叫不同功能的函式, 使得較大規模程式開發, 可以更加模組化, 更有架構...

這樣的寫法裡面, 用基本類別的指標去呼叫基本類別的專屬函式, 並沒有問題...只是今天的問題是, 若是衍生類別有不同的函式(非複寫),  則會變成基礎類別的指標無法使用衍生類別的擴充函式, 以下列出兩種修改方式

修改1

#include <iostream>

using namespace std;


class mammal {

public:

    mammal () { cout << "Class mammal constructor\n"; }

    virtual ~mammal () { cout << "Class mammal destructor\n"; }

    void virtual speak() const { cout << "This is mammal's speaking\n"; }

    void method01() const { cout << "This is method01\n"; }

    void virtual method02() const { cout << "This is method02\n"; }

};

class dog: public mammal {

public:

    dog () { cout << "Class dog constructor\n"; }

    virtual ~dog () { cout << "Class dog destructor\n"; }

    void virtual speak() const { cout << "This is dog's speaking\n"; }

    void method02() const { cout << "This is method02\n"; }

};


int main() {

    mammal *pm[2];

    // mammal

    pm[0] = new mammal;

    pm[0]->speak();

    pm[0]->method01();

    delete pm[0];

    

    // dog

    pm[1] = new dog;

    pm[1]->speak();

    pm[1]->method01();

    pm[1]->method02();

    delete pm[1];

    return 0;

};


修改2

#include <iostream>

using namespace std;


class mammal {

public:

    mammal () { cout << "Class mammal constructor\n"; }

    virtual ~mammal () { cout << "Class mammal destructor\n"; }

    void virtual speak() const { cout << "This is mammal's speaking\n"; }

    void method01() const { cout << "This is method01\n"; }

};

class dog: public mammal {

public:

    dog () { cout << "Class dog constructor\n"; }

    virtual ~dog () { cout << "Class dog destructor\n"; }

    void virtual speak() const { cout << "This is dog's speaking\n"; }

    void method02() const { cout << "This is method02\n"; }

};


int main() {

    mammal *pm[2];

    // mammal

    pm[0] = new mammal;

    pm[0]->speak();

    pm[0]->method01();

    delete pm[0];

    

    // dog

    pm[1] = new dog;

    pm[1]->speak();

    pm[1]->method01();

    static_cast(pm[1])->method02();

    delete pm[1];

    return 0;

};


修改一則是直接在基本類別內加上一個虛擬函式, 使得整個狀況直接變成動態繫結的問題, 這樣的缺點是那基本類別的函式會多如牛毛; 修改二則是在呼叫時, 直接將基本類別的指標強制轉型為衍生類別的指標, 感覺上這個邏輯上比較正確...

[+/-] Read More...

2007年11月19日 星期一

Xcode 的 Automatic code completion功能

其實寫C++程式到處都可以寫, 用什麼編輯器也都可以寫, 但是用某些特定編輯器或是GUI IDE, 可以加速開發過程...

各類IDE提供的功能中, 最讓我欣賞的就是變數自動補齊功能, 只要打幾個字母, 他會自動搜尋可能的清單, 我只需要選取就夠了, 這樣的功能是我認為最重要的一點...

一直以來常用的Kdevelop也有這樣的功能, 但是今天發現了Xcode 3.0也提供相同的功能, 他的開啟方式如下:

從上方的工具列: 「Xcode」->「Preference」


Preference裡面: 「Code Sense」 -> 「Automatically Suggest」 -> 「Immediate」

[+/-] Read More...

2007年11月13日 星期二

日正當中的星空

這是一部王力宏跟鈴木京香主演的日本電影, 從一開始王力宏的獨白開始, 發現他的聲音真的很不適合演戲, 就像是張震一樣, 聲音的感覺就很奇怪...

接著他跟鈴木京香之間, 鈴木京香沒有打扮的樣子真的很歐巴桑, 兩個人的互動根本像是姐弟戀一般, 也許找王力宏來演, 真的太娃娃臉了~~~

看完結論是, 這是一個不值得租的電影~~~

[+/-] Read More...

2007年11月12日 星期一

Leopard安裝實地經驗

昨天下午三四點Leopard到貨, 訂貨時間是7號星期三, 而到貨時間則是12號星期一, 扣掉週六週日的休息時間, 實際到貨工作天數3天, 從香港寄來還算是不錯!


寄到系上後, 由學弟拿來給我, 馬上衝出學校, 去NOVA進了一顆Toshiba 160G SATA硬碟, 加上外接盒總價$3,300 NT, 把新硬碟放在MB內, 把舊硬碟放進外接盒, 非蘋果店的老闆不會拆裝硬碟, 幸好之前看過別人裝, 總算是成功裝好, 大約七點回到研究室...

Leopard安裝
Leopard的安裝, 首先把寄來的作業系統光碟放進光碟機內, 開機時按Alt, 以便切換成光碟開機(不按好像也會自己偵測, 但是會比較久, 不是很確定, 因為我沒選這個作法), 接著他直接會進到安裝畫面, 就該選的就選, 幾乎都是下一步下一步 (備註: 選擇安裝硬碟時, 因為我是全新硬碟放進去的, 還沒切割與格式化, 因此沒有硬碟讓你選, 所以得要從上方的下拉式選單找出磁碟工具, 來切割並格式化硬碟, 因為是完全新的硬碟, 所以亂搞也不用怕)

安裝模式有1. 安裝Mac OS X, 2. 封存並安裝, 3. 清除並安裝, 對現在的我而言, 硬碟是空的, 要封也沒東西可以封, 所以選1.或是3.應該都是一樣的...

因為我之後打算安裝Macport之類的軟體, 所以安裝前先選擇自己要安裝或不安裝的項目, 確定X11有安裝到, 另外把一些不要的語系移除, 除了英文. 繁體中文外, 我只有加裝了日語與簡體中文...

接著會先檢查DVD是否可以完全讀取, 接著我就丟給他自己跑~~~不需要理他~~~

失誤: 前兩次安裝失敗是因為片子有地方讀不到, 拿出片子檢查一下, 片子上面有點污垢, 找鄰近實驗室想問問有沒有光碟片清潔劑, 答案是沒有, 所以我只好用衛生紙沾水與肥皂來清潔, 幸好這樣一切OK

資料回復
安裝完全新的系統後, 他會問說有沒有舊系統要同步, 只要把舊硬碟透過USB插上, 接著就全部都過來了, iPhoto內的照片, iTunes內的音樂, 無線網路的金鑰, 連軟體都同步過來~~~

Bootcamp
Bootcamp安裝整個冏啊! 切割完把XP放進去, 第一次直接用他切割好的磁區, 裝好一遍後, 重新開機找不到開機磁區, 後來上網看看文件後, 清掉磁區用XP安裝片來重新切割, 安裝成FAT32, 依舊是不行, 搞到12點決定放棄

VMware Fusion
後來仔細想想...我現在也很少在MB上打魔獸了, 要也會到四樓去打, 當初是因為這個原因才這麼做的(突然想到...我還沒處理研究室的無線Projector~~~看來要跟別人借NB了~~~), 所以直接用VMware直接安裝一個, 目前進度Office安裝好, 其他的等有空閒再來處理~~~

安裝後感覺:
1. 的確工作列的透明感有點玩過頭了, 可以採用阿西摩的解決方案, 等明天有空再來處理(備註:阿西摩的解決方案在這裡沒有效!!!)
2. Spaces是個好東西, 雖然以前在Linux就用過, 但是配合一些熱鍵, 的確有他人性化改善的地方...
3. Time Machine感覺也不錯, 但是目前不太敢用~~~先暫緩...

軟體更新紀錄
1. 香草輸入法更新到0.8.0.3, 好像解決了在一些軟體上不能執行的問題
2. 把之前沒在用, 但是安裝的Xcode升級, 最新版是Xcode 3.0, 但是依舊不會用, 看來還是得用VMware Fusion的Linux
3. 升級舊版的Currency Convert成v0.7, 之前版本似乎在豹子上會水土不服, 重新安裝新版即可~~~

[+/-] Read More...

2007年11月10日 星期六

峇里島-第四天

這一晚是住在Hilton飯店的, 我個人是覺得很漂亮了啦, 不過聽說還不是當地最棒的, 因為他已經蓋好七八年了...早上醒來先來去吃一頓飯店提供的早餐...味道如何已經不復記憶了~~~反正就是歐式自助餐囉...吃到飽吃到爽吃到吐~~~適合量大的人~~~




這個行程有送個Hilton Lulu SPA, 所以吃飽後散步走去Lulu SPA的場所, 享受免費的SPA, 沿著飯店外圍走著走著, 飯店的景緻很有南國風味, 大片蕉葉遍佈, 微風吹來, 到處都有以花瓣為裝飾的水盆等等...另外, 看來因為日本遊客眾多的關係, 所以也有部份地方是以日式風格為主...



Lulu SPA, 名字我不曉得是因何而起的, 進去後有兩張躺椅, 當地人的按摩師父, 要我們換上他們準備的衣物, 趴在按摩床上, 接著會在身上塗抹一些磨砂膏之類的東西, 先幫你去角質, 接著按摩之類的, 等完成按摩之後有個沖澡的地方讓你沖掉身上塗抹的東西, 接著旁邊這個佈滿花瓣的浴池還可以讓你泡一下澡, 享受一下貴妃泡澡的感覺...至於泡起來的感覺...ㄟ...就像在家泡澡一樣...



房間內裝飾的懶人亭


後續撰寫中~~~

[+/-] Read More...

2007年11月6日 星期二

Leopard升級規劃

要從老虎(Tiger, 10.4)升級成豹子(Leopard, 10.5), 沒有多想想總是不成的, 看看微軟的Vista, 有多少人升級後又重新灌回XP...要耍熱血也要看看場合, 這台可是我的工作機, 還是來多弄顆硬碟備份保險一點~~~

採購清單:
1. Leopard OS學生價 $3,990
2. 160G 2.5" SATA + 外接盒 我猜應該可以壓在$3,500吧


更新步驟:
1. 添購硬碟, 請店家將新硬碟放在MB內, 把目前硬碟放在外接盒(還沒搬移完成前, 可以先用外接硬碟開機)
2. 將Leopard裝在新硬碟內
3. Bootcamp切割安裝XP
4. 把個人資料從外接硬碟搬回MB內~~~

備註:
1. 安裝Leopard時, 記得安裝X11, 到時候應該可以加裝MacPort, 搞不好可以不用VMware + Linux
2. 安裝XCode

[+/-] Read More...