顯示具有 程式筆記 標籤的文章。 顯示所有文章
顯示具有 程式筆記 標籤的文章。 顯示所有文章

2010年8月29日 星期日

[分享] Levono X201安裝雙系統(Win7 + Ubuntu 10.04)

前一陣子砸錢買了新的notebook
由於個人的偏好, 最後還是選擇效能跟體積重量兼具的x201
雖然很想買I7 620 or i5 540的版本, 但是最後還是敵不過小氣的個性買了i5 520
不過從測試報告上來看
i7的版本並沒有帶來大量的效能提升, 反倒是會多耗一點電, 想買的人可以參考一下這個測試報告, 可以當作選購的參考

Anyway, 買了新電腦就是要給他裝Ubuntu, 方便出差使用, 不過這次灌Ubuntu倒是遇到的許多麻煩的問題, 讓我反反覆覆灌了五六次才達到我的需求

買Thinkpad的人都知道, 小黑有一個功能就是可以單鍵還原作業系統, 靠的就是預設的隱藏磁區, 但是若修改到了開機的MBR區, 則這個開機還原功能則會因此而失效, 偏偏如果安裝了Ubuntu, 預設的開機程式 Grub就是會去做這樣的事情, 所以第一個重點就是想辦法用windows的開機管理程式來負責開機的管理, 這樣我們就可以保留單鍵還原的功能以及雙系統的能力, 而ubuntu 10.04安裝在x201會遭遇到畫面花掉的問題, google了一下以後, 整理出這樣的安裝方式, 在這邊做一個備份, 免得下次要重灌時忘記了

關於這點的做法就是
1.切割安裝ubuntu的磁區
買回來的新電腦一開始只有預設兩個磁區, 一個就是預設安裝Windows 7的C槽, 另一個就是系統保留的隱藏磁區, 所以這時候就要利用類似partition magic的tool來切割新的磁區讓ubuntu使用, 網路上有一套免費的Easeus Partition Master可以使用

2.製作SD card安裝磁片
ubuntu的官網下載好安裝image後, 由於X201沒有光碟機, 所以要安裝的方式除了使用外接光碟機外, 就是可以利用usb or sd開機的功能, 製作開機usb碟來安裝, 這個時候可以使用的是UNetbootin來製作, 只要選擇sd卡或是隨身碟的磁區位置, 這個工具就可以幫你把安裝及開機程式裝好, 接下來只要重開機後進入bios選擇usb開機即可開始安裝Ubuntu
PS:若是安裝ubuntu 9.10以上版本, 則還需要再開機usb裡面作一些修改, 這在第五點再談

3.重點
安裝ubuntu到最後一步, 有一個選項要特別注意, 就是不要選擇grub寫入mbr, 在下面進階的選項裡, 選擇將grub安裝至ubuntu的安裝磁區, 用這種狀況結束ubuntu的安裝

4.修改windows開機選單
重開機以後, 進入Windows 7, 這時安裝EasyBCD, 這是一個可以在windows下面修改windows 開機選單的tool, 只要在Add New Entry中, 選擇Linux/BCD, 並且將type改成Grub 2, Name改成你所想要顯示在開機選單上的任何名字, 然後按Add Entry即可, 這樣在重開機後, 就可以由windows的開機選單選擇開啟進入ubuntu並且保留單鍵回復功能

5.修改Ubuntu安裝光碟for 10.04 with levono x201
由於X201使用了新的intel 顯示晶片, 而10.04在這方面的安裝有一點問題, 所以會造成開始安裝ubuntu, 一進入圖形化畫面, 畫面就會黑或是花掉, 這個時候就需要在安裝時做一些手腳, 才可以正確的驅動螢幕, 這邊的修改可以參考HOWTO: Install 10.04 on Thinkpad x201, 這樣才可以正確的安裝ubuntu 10.04, 或許這個bug會在10.10上面解決

為了安裝ubuntu花了很多力氣在google, 感謝網路上的眾人分享, 如果有人也需要這樣的安裝, 希望這個可以有點幫助, 如果有錯誤, 歡迎指教, 謝謝

2008年3月25日 星期二

字串反轉遇到的問題--已解決

這幾天開始去面試
多多少少免不了要考些專業科目
考題看得出來都是一些基本的C
不過有些時候我們在機上作業久了,依賴compiler久了
就真的會對程式的觀念開始模糊,其實這樣不見的是一個好事就是了

anyway,今天考了一題關於字串反轉的問題
簡單的說就是當輸入為一個"abcde"的字串
我們要如何將其轉換成"edcba"
考的就是字串的處理以及指標與陣列之間的關係

其解答為
void reverse(char *s)
{
    int i, j;
    char c;

    for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
    {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

我的寫法並不像是上述的寫法,因為一時之間有些慌亂,
就用硬幹的方式把他湊出來
所以才在網路上尋找到了這個寫法
結果在實機作業的時候
一直遇到compile錯誤的情形
trace後發現問題出在s[i] = s[j]; 這行程式上

原因是因為我們在main function上call reverse時
其輸入若是"字串指標"時(char *s = "abc";)
在某些compiler會將此字串放在一個不可更改的記憶體上
因此在reverse function要做資料互換時
就會無法更改而一直出錯

因此,在這邊的處理方式為將輸入改為"字串陣列"(char s[]={'a','b','c','\0'})
用此種宣告即可以避免上述問題的發生

2007年10月18日 星期四

fopen所遇到的問題--已解決

最近開始進入論文階段了
伴隨著就是開始寫code看code

要做的第一件事就是開檔讀檔寫檔
開檔,不就是下一個fopen有什麼難的
當然這件事你知道我知道獨眼龍也知道
偏偏就是遇上了一個大問題

奇怪,我用fopen開的檔,為啥寫資料進檔案的時候
在資料是0x0a的前面怎麼都多了個0x0d

這個問題不過就是讓我搞了一兩個小時
也不過是出來的圖檔就是錯的咩

總之透過google大神我終於得到了解答

一般我們開啟要寫入的檔案,
要輸入的程式為
fopen("xxx.txt", "w");

問題就出在這個w了
如果只是單純的w,我們可愛的compiler會認為你是要輸入carriage-return的資料
所以很自動的幫你加入0x0d
但是我要處理的資料都是串列式的,什麼位置是什麼資料就是一定的
所以這個時候要改寫成
fopen("xxx.txt", "wb");
這樣程式才不會自動幫你加入0x0d,而是很忠實的一個個寫入你所希望的二進位資料

這樣我的問題就解決了,留個筆記以免自己以後忘記