2014年12月28日 星期日

炒飯X鮮魚湯X芋頭甜湯

好簡單的料理,但是最讓人念念不忘

牛肉X蔬菜麵

牛肉是老媽寄來的,冷凍包中還有鮮嫩的肉汁,拌著蔬菜麵,也是相當可口的一道牛肉乾麵。

家傳炸醬麵

算了一下好像有八種料在裡頭。
來點兵:
  1. 四季豆
  2. 小黃瓜
  3. 豆干
  4. 木耳
  5. 紅蘿蔔
  6. 肉片
  7. 筍子
  8. 搾菜

2014年8月3日 星期日

虱目魚飯湯

飯湯一直是家裡常常出現的主餐之一,尤其是中午。煮好的湯倒入乘好的飯,食用的時候非常順口的吸入湯汁以及白飯。而虱目魚飯湯常見的搭配是筍子、肉絲、蛤仔、排骨高湯、芹菜等,並以胡椒調味。



2013年1月14日 星期一

金瓜米粉

金瓜米粉也是媽媽的拿手菜之一。


2011年10月12日 星期三

[筆記]變數的宣告造成實作linked-list的問題: 使用C

在實作linked-list時遇到了很大的麻煩,一直無法正確的建立資料node,以下為原始碼。

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;
}

觀察得到以下:
  1. 在main主程式中新增node時,可以正確地建立。
  2. 將insert 功能包成一個function時,則無法正確地建立正確的資料。
    1. 但是只有structure 中的字串無法正確建立,int 變數型態則是正確的。
  3. 以gdb觀察變數的位址與值,觀察到在insert function內,可以成功地建立node,但是回到main function 時,讀取該node的值時卻是錯的。
基於以上幾點的觀察,以及搜尋到關於"pointer", "variable in stack/heap"相關的資訊文章後終於找到問題的所在:
  1. 變數在記憶體中的分配
  2. 變數的宣告方式
原實作方式為在function中宣告node,但沒注意到該node是被存放在stack中,一但回到main function,該變數的內容無法被保証不被更改。因此應該改以存放於heap的變數宣告方式,才能夠確保資料的正確建立。

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文件則是要重覆的輸入

#include "[header].h"
main(){

}



這個過程還滿煩人的,vim中有個功能可以自動的根據文件的副檔名載入文件樣板,過程參考此網址,筆記如下

  1. cd ~
  2. mkdir skel
  3. cd skel
  4. vim template.c
    • 輸入.c程式的樣板
      #include(略)
  5. sudo vim /etc/vim/vimrc
    • 加入此行
      autocmd! BufNewFile * silent! 0r ~/.vim/skel/template.%e
註:template在vim 中可能也會代表不同副檔名對應的syntax之板型。

2011年4月13日 星期三

筆記:Ubuntu下Apache下為特定的資料夾設定觀看權限

看了鳥哥中關於apache的設定方式,另參考網路上另人很詳細的筆記,在筆者ubuntu10.10的環境下設定的順序。
  1. /etc/apache2/sites-available/下的default對應到架設的一個網站,舉例若筆者想要架 "blog"與"album"兩個網站,則會在/var/www/下分別有blog/與album/兩個資料夾,而此時若要進階的分別設定此兩站的瀏覽權限,則在/etc/apache2/sites-available/下要建立blog與album兩個檔案(可copy default檔再行修改)。

    現在筆者想要讓/var/www/test 這個資料夾經由使用者帳號、密碼認證後方可瀏灠,則 default檔修改如下

    Options FollowSymLinks
    AllowOverride AuthConfig
    Order deny,allow
    allow from all
    AuthConfig參數讓 瀏覽者讀到/test/這個目的後會先檢查此目錄下有沒有.htaccess檔,若有則依此.htaccess檔設定執行。

  2. 將第一步設定好的檔案 link 到/etc/apache2/sites-enable/
    cd /etc/apache2/sites-enable/
    sudo ln -s /etc/apache2/sites-available/default

  3. 在/var/www/test/下新增.htaccess檔

    AuthName "Protect test by .htaccess"
    Authtype Basic
    AuthUserFile /var/www/apache.passwd
    require user [userid]
  4. 新增密碼檔
    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。

#取得big5編碼之文字資料
Content = TelnetObject.read_until('abc',2)
#解碼為Unicode
Content_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的表現,用圖清楚的表現出來,很方便:)

圖一:namebench的使用畫面。可以在Nameservers 欄位中手動輸入DNS。
圖二:輸出之結果。程式自動的比較了許多的DNS,並給使用者在DNS設定上的建議。此結果顯示平均而言Google public DNS較台大宿舍設定之 DNS所需的時間較少,但台大宿舍設定的DNS對於地理位置較近的網路位置找尋到的時間則反而少。所以軟體也給了設定二組以上的建議。

2011年1月26日 星期三

20110126 粽子香

雖然是快過農曆新年,離傳統上吃粽子的節日還有數個月,但是家裡沒有照節日吃應景食物的習慣,這次回家趁論文口試結束回高雄休息幾天,除了一些令人懷念的家常菜以外,老媽都會特別煮一些特殊的餐,像米粉湯、米糕,還有粽子等。老媽包粽子時在旁邊幫忙順便學點,趁記憶還清楚做個筆記:

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]

建立過程亦可參考此網頁

2010年12月19日 星期日

筆記:使用php 顯示jpg 檔的exif資訊

  1. 將一個測試jpg檔(test.jpg)放在php 原始碼的同一個資料夾
  2. 建立一測試用的.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
    #  
    #

2010年11月28日 星期日

20101128 Bell Bottom Blues

很喜歡的一首歌。Live version from youtube

關於Eric Clapton
自從大四下開始學吉他後開始聽Eric Clapton 的歌,我覺得他的歌對自己存在著一種不容易說清楚的魔力,開始瘋狂的找他的作品。他的歌詞很白很簡單,與旋律總是搭配地很完美。歌曲中藏著一種淡淡的憂愁(藍調魂!!),常常覺得不可思議,因為他的詞曲與詮釋把傳遞情感這件事做得好像很容易,自己三兩下就變成他的忠實粉絲了(茶)

2010年11月19日 星期五

對人生的態度

今天一位研究上的夥伴跟自己討論本身的問題,讓我好好的反省一下自己。內心真的是很感謝她,因為我們往往很難看到自己的問題。

最大的問題是自己往往不夠聰明、積極的處理手邊的事。過去自己的確比較信奉埋頭苦幹,心中念著有努力就會有收獲,並安心接受得到的結果;其實自己很常駝鳥心態的不敢看自己是往哪跑,身在何處,只顧一直衝。借著這個機會靜下來好好的想了一下,自己近來的確因此而吃了許多虧 -- 容易花上不必要的時間、資源;人的一生時間其實不多,有效率懂得規劃才能避免目標沒達成的遺憾。

自勉之:)

2010年9月8日 星期三

軟體版本號

安裝軟體常常看到版本是一連串的數字,其中是否有存在著什麼樣的規則一直很好奇。

歸納一下,給自己當個筆記。
實際上各個軟體的規定都不太一樣。
1). 通常為major. minor. build
2). 1.0通常是正是發行的版本。以下都是測試版。
3) a,b,rc= alpha, beta, release candidate(見軟體版本週期)
簡單而言,alpha是內部測試用的版本號;beta 則是第一次"公開"的版本。
release candidate通常就是修改到最後階段的候選發行版。
參考
4) RTM: release to manufacturing
給製造商提早準備整合用的。

2010年7月25日 星期日

Hello World GTK!

在linux 環境(Ubuntu 10.04LTS)下使用gtk來實作看看視窗程式。
第一步就遇到了麻煩,一個簡單的程式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)這一組關鍵字去查,就直接寫了


while 1:
   if len(b)>0:a.append(b.pop())
   else:break


在寫完的一瞬間就想到應該用什麼關鍵字(reverse)了,查了一下馬上就有答案:[list].reverse()。

有的時候不是如何避免重新製作的問題,而是面對的是自己的無知與經驗不足。如何使用精準、正確的關鍵字來解決眼前的問題,其實是考驗本身的`眼光'嗎XD