2014年12月28日 星期日
2014年8月3日 星期日
2011年10月12日 星期三
[筆記]變數的宣告造成實作linked-list的問題: 使用C
在實作linked-list時遇到了很大的麻煩,一直無法正確的建立資料node,以下為原始碼。
讀到self-referenced structure/linked list的時候將重點放在insert/delete node的行為描述,而忽略了變數的宣告方式會影響實作的結果。理清了宣告malloc的用意,原以為兩種等效的方法本值上的差異。
struct Node{
int index;
char *name;
struct Node *nextNode;
};
void insertNode(struct Node *list, char *new_name, int new_index){
struct Node *curr;
struct Node newNode;
curr = list;
//find last node
while(1){
if(curr->nextNode!=NULL){
curr = curr->nextNode;
}else break;
}
curr->nextNode = &newNode;
newNode.name = new_name;
newNode.index = new_index;
newNode.nextNode = NULL;
}
觀察得到以下:- 在main主程式中新增node時,可以正確地建立。
- 將insert 功能包成一個function時,則無法正確地建立正確的資料。
- 但是只有structure 中的字串無法正確建立,int 變數型態則是正確的。
- 以gdb觀察變數的位址與值,觀察到在insert function內,可以成功地建立node,但是回到main function 時,讀取該node的值時卻是錯的。
- 變數在記憶體中的分配
- 變數的宣告方式
void insertNode(struct Node *list, char *new_name, int new_index){
struct Node *curr;
struct Node *newNode;
newNode = malloc(sizeof(struct Node));
curr = list;
//find last node
while(1){
if(curr->nextNode!=NULL){
curr = curr->nextNode;
}else break;
}
curr->nextNode = newNode;
newNode->name = new_name;
newNode->index = new_index;
newNode->nextNode = NULL;
}
讀到self-referenced structure/linked list的時候將重點放在insert/delete node的行為描述,而忽略了變數的宣告方式會影響實作的結果。理清了宣告malloc的用意,原以為兩種等效的方法本值上的差異。
2011年9月28日 星期三
『在Linux系統中,每個裝置都被當成一個檔案來對待』
在鳥哥上看過這句話但是一直都不知道背後的意義,直到最近看到了Linux 程式設計教學手冊 terminal章節內的一個例子後才有了些許的明白。
最直接的例子是若想要輸出字串在螢幕上,除了最基本的
最直接的例子是若想要輸出字串在螢幕上,除了最基本的
#include<stdio.h>
void main(void){
printf("Forfun\n");
}
外,還有下列#include<stdio.h>
void main(void){
FILE *output;
output = fopen("/dev/tty","w");
fprintf(output,"Forfun\n");
}
/dev/tty即是指目前的terminal,此裝置被當成了一個檔案,而以fprintf function寫入檔案即等效於輸出字串至螢幕。
2011年4月17日 星期日
筆記:在vim中使用文件樣板(document template/skeleton)
每次要編輯一個.html 時不免需要重覆的輸入
html, head, body等的標籤,而.c文件則是要重覆的輸入
這個過程還滿煩人的,vim中有個功能可以自動的根據文件的副檔名載入文件樣板,過程參考此網址,筆記如下
html, head, body等的標籤,而.c文件則是要重覆的輸入
#include "[header].h"
main(){
}
這個過程還滿煩人的,vim中有個功能可以自動的根據文件的副檔名載入文件樣板,過程參考此網址,筆記如下
- cd ~
- mkdir skel
- cd skel
- vim template.c
- 輸入.c程式的樣板
#include(略) - sudo vim /etc/vim/vimrc
- 加入此行
autocmd! BufNewFile * silent! 0r ~/.vim/skel/template.%e
2011年4月13日 星期三
筆記:Ubuntu下Apache下為特定的資料夾設定觀看權限
看了鳥哥中關於apache的設定方式,另參考網路上另人很詳細的筆記,在筆者ubuntu10.10的環境下設定的順序。
- /etc/apache2/sites-available/下的default對應到架設的一個網站,舉例若筆者想要架 "blog"與"album"兩個網站,則會在/var/www/下分別有blog/與album/兩個資料夾,而此時若要進階的分別設定此兩站的瀏覽權限,則在/etc/apache2/sites-available/下要建立blog與album兩個檔案(可copy default檔再行修改)。
現在筆者想要讓/var/www/test 這個資料夾經由使用者帳號、密碼認證後方可瀏灠,則 default檔修改如下
Options FollowSymLinksAuthConfig參數讓 瀏覽者讀到/test/這個目的後會先檢查此目錄下有沒有.htaccess檔,若有則依此.htaccess檔設定執行。
AllowOverride AuthConfig
Order deny,allow
allow from all
- 將第一步設定好的檔案 link 到/etc/apache2/sites-enable/
cd /etc/apache2/sites-enable/
sudo ln -s /etc/apache2/sites-available/default
- 在/var/www/test/下新增.htaccess檔
AuthName "Protect test by .htaccess"
Authtype Basic
AuthUserFile /var/www/apache.passwd
require user [userid]
- 新增密碼檔
htpasswd -c /var/www/apache.passwd [userid]
2011年2月20日 星期日
筆記:以python 為工具透過telnet 取得文字資訊遇到的編碼問題
目前的工作模式為使用pietty ssh到linux的工作站上工作,當使用telnetlib這個module取得bbs的文字時遇到了中文會出現亂碼的問題,當更改pietty字元編碼為big5時則能夠正常顯示,才發現成大電機風之谷與ptt的中文字資料均以big5編碼,若是要在pietty字元編碼設定為utf-8時能夠正常顯示,需要將中文文字資料解碼(decode)為Unicode。
#觀察編碼
type(Content_Unicode)
#顯示
print Content_Unicode
註:windows 底下的cmd 預設使用big5編碼中文,所以不需經過decode也能夠正常的顯示;應用程式要特別小心使用者端的平台問題。
#取得big5編碼之文字資料Content = TelnetObject.read_until('abc',2)#解碼為UnicodeContent_Unicode = Content.decode('big5')#觀察編碼
type(Content_Unicode)
#顯示
print Content_Unicode
註:windows 底下的cmd 預設使用big5編碼中文,所以不需經過decode也能夠正常的顯示;應用程式要特別小心使用者端的平台問題。
2011年2月18日 星期五
筆記:Google public DNS 與namebench
Google 推出的google public DNS,摘錄其中的描述,基於Google search對網際網路資源的涉獵,Google 宣告了一個能夠提供更有效、更快速服務的DNS。
為了提供更多的佐證,Google 也提供了一個工具:namebench。能夠自動的檢測各個DNS的表現,這個軟體很直觀的提供使用者不同DNS的表現,用圖清楚的表現出來,很方便:)
為了提供更多的佐證,Google 也提供了一個工具:namebench。能夠自動的檢測各個DNS的表現,這個軟體很直觀的提供使用者不同DNS的表現,用圖清楚的表現出來,很方便:)
圖二:輸出之結果。程式自動的比較了許多的DNS,並給使用者在DNS設定上的建議。此結果顯示平均而言Google public DNS較台大宿舍設定之 DNS所需的時間較少,但台大宿舍設定的DNS對於地理位置較近的網路位置找尋到的時間則反而少。所以軟體也給了設定二組以上的建議。
2011年1月26日 星期三
20110126 粽子香
雖然是快過農曆新年,離傳統上吃粽子的節日還有數個月,但是家裡沒有照節日吃應景食物的習慣,這次回家趁論文口試結束回高雄休息幾天,除了一些令人懷念的家常菜以外,老媽都會特別煮一些特殊的餐,像米粉湯、米糕,還有粽子等。老媽包粽子時在旁邊幫忙順便學點,趁記憶還清楚做個筆記:
1、備料。
香菇:泡一晚水
粟子:泡一晚水
肉:過程類似滷肉。不放油先炒把油逼出來,如入醬油、五香粉、炸過的蔥頭、冰糖、紹興酒、胡椒粉,然後小火滷一下。
鹹鴨蛋:留蛋黃,用線切半。
粽葉:泡一晚水,煮過。
花生:泡一晚水
糯米:泡一下,炒一下:先放花生,再加糯米拌勻,加入一點油、炸過的蔥頭,滷肉的汁,一點鹽
蔥頭+透抽+蝦米:蝦米用酒泡去腥;三個混在一起炒
2。包粽子
二片葉重疊 約一長一短對折交替成斗型,填充入糯米、配料,再蓋住,用線綁起來。
3。煮,用快鍋裝水肉粽放進去,有點像煮水餃。
最費工夫的還是在備料跟採買的過程。這次是跟備料的部分流程,包粽子的手法也是第一次學,還有許多經驗有待累積啊
1、備料。
香菇:泡一晚水
粟子:泡一晚水
肉:過程類似滷肉。不放油先炒把油逼出來,如入醬油、五香粉、炸過的蔥頭、冰糖、紹興酒、胡椒粉,然後小火滷一下。
鹹鴨蛋:留蛋黃,用線切半。
粽葉:泡一晚水,煮過。
花生:泡一晚水
糯米:泡一下,炒一下:先放花生,再加糯米拌勻,加入一點油、炸過的蔥頭,滷肉的汁,一點鹽
蔥頭+透抽+蝦米:蝦米用酒泡去腥;三個混在一起炒
2。包粽子
二片葉重疊 約一長一短對折交替成斗型,填充入糯米、配料,再蓋住,用線綁起來。
3。煮,用快鍋裝水肉粽放進去,有點像煮水餃。
最費工夫的還是在備料跟採買的過程。這次是跟備料的部分流程,包粽子的手法也是第一次學,還有許多經驗有待累積啊
2010年12月25日 星期六
筆記:VirtualBox內的Ubuntu使用共享資料夾(Shared Folders)的設定順序
Background:
因為練習實作作業系統的過程中,會需要用一個作業系統產生程式碼給實作中的作業系統使用,而都建立在虛擬機器(Virtual Machine, VM)上,而有了VM間,VM與host OS間資料共享以流通的需求,建立此環境的過程以本文作記錄環境建立的過程。
Environment: Win7 as host and Ubunt10.10 as guest OS running on VirtualBox(VB)
host OS: 用來掛載的作業系統
guest OS:建立於虛擬機器上(本例使用VB)的作業系統。
Step1: guest端(Ubuntu)安裝好之後,需在此guest OS上安裝Guest Additions(GA)(參考網址),從這個網址可以下載到在不同版本VB上不同作業系統使用的Guest Additions。下載完掛載於VB上,於Ubuntu terminal中掛載
sudo mount /dev/scd0 /cdrom
p.s. sudo mount [GA.iso掛載的位置] [欲掛載處]
安裝GA
cd /cdrom
sudo sh ./VBoxLinuxAdditions.run
Step2: 建立共享資料夾(參考網址),過程中除了選擇要用來分享的資料夾外,也會設定此資料夾的名字,本例將folder name 命名為os,於Step3會使用。註:此參考網址中的guest端也是使用Windows;guest OS使用共享資料夾的方式Window使用網路硬碟,而自己的guest OS為Linux,將共享資料夾掛載後使用。
Step3: 掛載shared folders於~/host
mkdir ~/host
sudo mount -t vboxsf os ~/host
ps: mount -t vboxsf [folder name] [mount path]
建立過程亦可參考此網頁
因為練習實作作業系統的過程中,會需要用一個作業系統產生程式碼給實作中的作業系統使用,而都建立在虛擬機器(Virtual Machine, VM)上,而有了VM間,VM與host OS間資料共享以流通的需求,建立此環境的過程以本文作記錄環境建立的過程。
Environment: Win7 as host and Ubunt10.10 as guest OS running on VirtualBox(VB)
host OS: 用來掛載的作業系統
guest OS:建立於虛擬機器上(本例使用VB)的作業系統。
Step1: guest端(Ubuntu)安裝好之後,需在此guest OS上安裝Guest Additions(GA)(參考網址),從這個網址可以下載到在不同版本VB上不同作業系統使用的Guest Additions。下載完掛載於VB上,於Ubuntu terminal中掛載
sudo mount /dev/scd0 /cdrom
p.s. sudo mount [GA.iso掛載的位置] [欲掛載處]
安裝GA
cd /cdrom
sudo sh ./VBoxLinuxAdditions.run
Step2: 建立共享資料夾(參考網址),過程中除了選擇要用來分享的資料夾外,也會設定此資料夾的名字,本例將folder name 命名為os,於Step3會使用。註:此參考網址中的guest端也是使用Windows;guest OS使用共享資料夾的方式Window使用網路硬碟,而自己的guest OS為Linux,將共享資料夾掛載後使用。
Step3: 掛載shared folders於~/host
mkdir ~/host
sudo mount -t vboxsf os ~/host
ps: mount -t vboxsf [folder name] [mount path]
建立過程亦可參考此網頁
2010年12月19日 星期日
筆記:使用php 顯示jpg 檔的exif資訊
- 將一個測試jpg檔(test.jpg)放在php 原始碼的同一個資料夾
- 建立一測試用的.php檔。
$exif = exif_read_data("test.jpg",0,true);
print_r($exif);#可以列出所有有資訊
echo $exif.[IFD0][DateTime];#顯示這張照片被初始建立的時間。
?>
參考連結:
php.array.doc
php.exif.doc
exif reader
2010年12月18日 星期六
筆記:Ubuntu環境下的php初學可能會遇到的問題
在玩php 的第一步就是要把能夠執行php 的環境建立起來。手邊有一個可以順利執行php環境的實驗室主機,今天試了一下在自己的主機(Ubuntu 10.04.1 LTS)上設定Server端,有二個初學者可能會踩到的雷給自己留個筆記。
第一個滿蠢的,檔名要用*.php (用*.html試了半天也跑不出來,觀察原始碼卻又有出現,網路上也沒有頭緒用哪個關鍵字來找問題,卻在困擾不已時在某一個瞬間熊熊想到是檔名的問題= = );
第二個問題是就算用了.php 在實驗室的主機可以正常顯示,但自己的主機上還是無法正常顯示(會另存成一個*.php檔,而不是在browser上顯示),apache2也重新啟動好幾次,後來與實驗室確定可以執行php的server比對 /etc/apache2/mods-enabled/php5.conf,觀察到有幾行被註解掉了,原來在Ubuntu 下安裝的apache、php對使用者資料夾下的public_html預設不啟動php,這時我們如下將這幾行註解掉再重新啟動Apache2(sudo /etc/init.d/apache2 restart) 就可以順利看到測試的畫面了。
參考網頁
# To re-enable php in user directories comment the following lines
# (from to .) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
#
#
# php_admin_value engine Off
#
#
第一個滿蠢的,檔名要用*.php (用*.html試了半天也跑不出來,觀察原始碼卻又有出現,網路上也沒有頭緒用哪個關鍵字來找問題,卻在困擾不已時在某一個瞬間熊熊想到是檔名的問題= = );
第二個問題是就算用了.php 在實驗室的主機可以正常顯示,但自己的主機上還是無法正常顯示(會另存成一個*.php檔,而不是在browser上顯示),apache2也重新啟動好幾次,後來與實驗室確定可以執行php的server比對 /etc/apache2/mods-enabled/php5.conf,觀察到有幾行被註解掉了,原來在Ubuntu 下安裝的apache、php對使用者資料夾下的public_html預設不啟動php,這時我們如下將這幾行註解掉再重新啟動Apache2(sudo /etc/init.d/apache2 restart) 就可以順利看到測試的畫面了。
參考網頁
# To re-enable php in user directories comment the following lines
# (from
# prevents .htaccess files from disabling it.
#
#
# php_admin_value engine Off
#
#
2010年11月28日 星期日
20101128 Bell Bottom Blues
很喜歡的一首歌。Live version from youtube
關於Eric Clapton
自從大四下開始學吉他後開始聽Eric Clapton 的歌,我覺得他的歌對自己存在著一種不容易說清楚的魔力,開始瘋狂的找他的作品。他的歌詞很白很簡單,與旋律總是搭配地很完美。歌曲中藏著一種淡淡的憂愁(藍調魂!!),常常覺得不可思議,因為他的詞曲與詮釋把傳遞情感這件事做得好像很容易,自己三兩下就變成他的忠實粉絲了(茶)
關於Eric Clapton
自從大四下開始學吉他後開始聽Eric Clapton 的歌,我覺得他的歌對自己存在著一種不容易說清楚的魔力,開始瘋狂的找他的作品。他的歌詞很白很簡單,與旋律總是搭配地很完美。歌曲中藏著一種淡淡的憂愁(藍調魂!!),常常覺得不可思議,因為他的詞曲與詮釋把傳遞情感這件事做得好像很容易,自己三兩下就變成他的忠實粉絲了(茶)
2010年11月19日 星期五
2010年9月8日 星期三
2010年7月25日 星期日
Hello World GTK!
在linux 環境(Ubuntu 10.04LTS)下使用gtk來實作看看視窗程式。
第一步就遇到了麻煩,一個簡單的程式gtk0.c測試是否可以使用gtk library
出現以下error:
gtk/gtk.h: No such file or directory
因為已經有安裝好gtk,所以應該是gcc compile 的時候沒有加入gtk所在的路徑。搜尋了網路上的資源之後,用以下的方式編譯就行得通了。(pkg-config的用法)
第一步就遇到了麻煩,一個簡單的程式gtk0.c測試是否可以使用gtk library
#include
main()
{
return 0;
}
出現以下error:
gtk/gtk.h: No such file or directory
因為已經有安裝好gtk,所以應該是gcc compile 的時候沒有加入gtk所在的路徑。搜尋了網路上的資源之後,用以下的方式編譯就行得通了。(pkg-config的用法)
gcc $(pkg-config --cflags --libs gtk+-2.0) gtk0.c
2010年6月30日 星期三
python:list reverse()
今天一不小心就重做了一個小輪子orz
要將數列(list)重反置(ex:[1,2,3,4]->[4,3,2,1])一開始沒有想到用(reverse,python)這一組關鍵字去查,就直接寫了
在寫完的一瞬間就想到應該用什麼關鍵字(reverse)了,查了一下馬上就有答案:[list].reverse()。
有的時候不是如何避免重新製作的問題,而是面對的是自己的無知與經驗不足。如何使用精準、正確的關鍵字來解決眼前的問題,其實是考驗本身的`眼光'嗎XD
要將數列(list)重反置(ex:[1,2,3,4]->[4,3,2,1])一開始沒有想到用(reverse,python)這一組關鍵字去查,就直接寫了
while 1:
if len(b)>0:a.append(b.pop())
else:break
在寫完的一瞬間就想到應該用什麼關鍵字(reverse)了,查了一下馬上就有答案:[list].reverse()。
有的時候不是如何避免重新製作的問題,而是面對的是自己的無知與經驗不足。如何使用精準、正確的關鍵字來解決眼前的問題,其實是考驗本身的`眼光'嗎XD
訂閱:
文章 (Atom)



