昨天一位資優班同學來找我,希望能夠寫程式畫出某一組方程式的區域圖形,當下因為要上課,只跟他說可能可以去找會maple的數學老師可能會快一點,寫C程式輸出,要再轉成圖形,恐怕要花一些時間。
下午有些時間,找到一些支援數學畫圖的軟體,希望未來能給這些同學一些幫助。
Graphmatica 小又好用的數學繪圖軟體
Graph4.3 2007年Open source 一套x-y平面的數學繪圖 http://www.padowan.dk/graph/
2011年5月25日 星期三
2011年5月24日 星期二
台中美食
- 肉蛋土司(中西早餐)
- 電話:(04)2327-1066
- 住址:台中市健行路1005號
- 營業時間:04:30~12:00(每月1號公休)
- 海盜飯團
- 創始店電話:
- (04)2227-6638住址:台中市三民路三段136-6號營業時間:06:31~12:30
- 一中店電話:
- (04)2223-7689住址:台中市一中街111號營業時間:00:00~20:30
- 香港 金寶茶餐廳
- TEL:(04)2328-3606
- 台中市南屯區大業路201號
- 脆皮雞腿, 檸檬紅茶NT.75(冰), 腊味蘿白糕NT.55, 鹹魚雞粒飯NT.130, 廣東炒麵NT.110
資料參考: meiko美食 http://meiko1101.pixnet.net/blog
2011年5月19日 星期四
FaceBook的由來去從
能在台面上發光發熱的人,必定是不簡單的人,而不簡單的人,也必定有不簡單的方法、方式來成就,所謂一將功臣萬骨枯。我想Facebook也是一樣,剛開始使用Facebook,發現上面有很多的資料欄位需要填寫,但每每想到以前大學學用BBS的情境,馬上有「先用假資料來註冊吧!」這樣的想法出來,因為以前在BBS上有人常會嘴砲,甚至有人一看到是男生名字帳號,往往就會直接跳過不理等情況,造成許多同學會爭相告知要以代名來註冊的行為習慣。
而這種現象,前陣子台大歷史學系博士生跟救護車比中指事件,也是用網路上資料作「人肉搜索」,比對出當事人,更可見FB上資料自行登載越詳細者,未來萬一變成媒體焦點時,其下場恐怕也越慘。這會讓我們再使用這類科技或軟體時,是需要注意在上面的資料,也別以為使用代名或代號,就無法查出對象喔!
但是,我想,一個軟體或系統平台的開始,甚至變成潮流,某程度和人性或使用習慣有關連,這點,不難從FB的由來,與發展過程,可以看出端倪。
參考資料:
Mark Zuckerberg與Facebook的醜陋陳年往事
而這種現象,前陣子台大歷史學系博士生跟救護車比中指事件,也是用網路上資料作「人肉搜索」,比對出當事人,更可見FB上資料自行登載越詳細者,未來萬一變成媒體焦點時,其下場恐怕也越慘。這會讓我們再使用這類科技或軟體時,是需要注意在上面的資料,也別以為使用代名或代號,就無法查出對象喔!
但是,我想,一個軟體或系統平台的開始,甚至變成潮流,某程度和人性或使用習慣有關連,這點,不難從FB的由來,與發展過程,可以看出端倪。
參考資料:
Mark Zuckerberg與Facebook的醜陋陳年往事
2011年5月18日 星期三
2011年4月18日 星期一
Antivir XP下關閉廣告的方法
http://www.avira.com/小紅傘關閉廣告方法:
For XP professional version:
- 在【控製台】->【效能與維護】->【系統管理工具】->【本機安全性原則】。
- 選擇「軟體限製原則」,並按右鍵,選擇「建立新原則」。
- 選擇「其它原則」,並按右鍵,選擇「新增路徑規則」。
- 在路徑選擇「C:\Program Files\Avira\AntiVir Desktop」底下的「avnotify.exe」,並將安全性等級設為「不允許」,再按「確定」即可。
- 開機切到安全模式(開機按F8)
- 開啟「我的電腦」並打開下面的資料夾 C:\Program Files\Avira\AntiVir PersonalEdition Classic
- 在avnotify.exe上點右鍵->內容
- 切至"安全性"並點"進階"
- 在"權限"下對清單內的所有使用者做下面設定:在"周遊資料夾/執行檔案"的拒絕處打勾(每做一次清單內會多一個)
- 全部做完後按下方的確定,並在跳出的對話框選擇"是",並在檔案內容按下確定
- 重開機至正常的 xp home即可
2011年3月15日 星期二
[Linux] gcc自製library
引用: PTT看板: LinuxDev (作者: cole945)
Library可分成三種,static、shared與dynamically loaded, 下面會介紹如何利用 gcc 製作 這三種 library 與引用.
Static libraries :Static 程式庫用於靜態連結,簡單講是把一堆object檔用ar(archiver)包裝集合起來,檔名以 `.a' 結尾。優點是執行效能通常會比後兩者快,而且因為是靜態連結,所以不易發生執行時找不到library或版本錯置而無法執行的問題。缺點則是檔案較大,維護度較低;例如library如果發現bug需要更新,那麼就必須重新連結執行檔.
* 編譯編譯方式很簡單,先例用 `-c' 編出 object 檔,再用 ar 包起來即可. 考慮代碼如下 :
____ hello.c ____
#include
void hello(){ printf("Hello "); }
____ world.c ____
#include
void world(){ printf("world."); }
____ mylib.h ____
void hello();
void world();
進行編譯 :
# gcc -c hello.c world.c
# ar rcs libmylib.a hello.o world.o <產出 libmylib.a>
這樣就可以建出一個檔名為 libmylib.a 的檔。輸出的檔名其實沒有硬性規定,但如果想要配合 gcc 的 '-l' 參數來連結,一定要以 `lib' 開頭,中間是你要的library名稱,然後緊接著 `.a' 結尾。
* 使用 :
考慮代碼 main_mylib.c :
使用上就像與一般的 object 檔連結沒有差別 :
# gcc main_mylib.c libmylib.a <預設會產出 a.out>
也可以配合gcc 的 `-l' 參數使用 :
client:/home/max/src # gcc main_mylib.c -L. -lmylib <預設會產出 a.out>
`-Ldir' 參數用來指定要搜尋程式庫的目錄,`.' 表示搜尋現在所在的目錄。通常預設會搜 /usr/lib 或 /lib 等目錄。`-llibrary' 參數用來指定要連結的程式庫 ,'mylib' 表示要與mylib進行連結,他會搜尋library名稱前加`lib'後接`.a'的檔案來連結 :
client:/home/max/src # ./a.out
Hello world <成功執行>
Shared libraries :
Shared library 會在程式執行起始時才被自動載入。因為程式庫與執行檔是分離的,所以維護彈性較好。有兩點要注意,shared library是在程式起始時就要被載入,而不是執行中用到才載入,而且在連結階段需要有該程式庫才能進行連結。
Library可分成三種,static、shared與dynamically loaded, 下面會介紹如何利用 gcc 製作 這三種 library 與引用.
Static libraries :Static 程式庫用於靜態連結,簡單講是把一堆object檔用ar(archiver)包裝集合起來,檔名以 `.a' 結尾。優點是執行效能通常會比後兩者快,而且因為是靜態連結,所以不易發生執行時找不到library或版本錯置而無法執行的問題。缺點則是檔案較大,維護度較低;例如library如果發現bug需要更新,那麼就必須重新連結執行檔.
* 編譯編譯方式很簡單,先例用 `-c' 編出 object 檔,再用 ar 包起來即可. 考慮代碼如下 :
____ hello.c ____
#include
void hello(){ printf("Hello "); }
____ world.c ____
#include
void world(){ printf("world."); }
____ mylib.h ____
void hello();
void world();
進行編譯 :
# gcc -c hello.c world.c
# ar rcs libmylib.a hello.o world.o <產出 libmylib.a>
這樣就可以建出一個檔名為 libmylib.a 的檔。輸出的檔名其實沒有硬性規定,但如果想要配合 gcc 的 '-l' 參數來連結,一定要以 `lib' 開頭,中間是你要的library名稱,然後緊接著 `.a' 結尾。
* 使用 :
考慮代碼 main_mylib.c :
#include "mylib.h"
int main() {
hello();
world();
}
使用上就像與一般的 object 檔連結沒有差別 :
# gcc main_mylib.c libmylib.a <預設會產出 a.out>
也可以配合gcc 的 `-l' 參數使用 :
client:/home/max/src # gcc main_mylib.c -L. -lmylib <預設會產出 a.out>
`-Ldir' 參數用來指定要搜尋程式庫的目錄,`.' 表示搜尋現在所在的目錄。通常預設會搜 /usr/lib 或 /lib 等目錄。`-llibrary' 參數用來指定要連結的程式庫 ,'mylib' 表示要與mylib進行連結,他會搜尋library名稱前加`lib'後接`.a'的檔案來連結 :
client:/home/max/src # ./a.out
Hello world <成功執行>
Shared libraries :
首先有一些名詞要弄懂,soname、real name與linker name。
soname 用來表示是一個特定 library 的名稱,像是 libmylib.so.1 。前面以 `lib' 開頭,接著是該 library 的名稱,然後是 `.so' ,接著是版號,用來表名他的介面;如果介面改變時,就會增加版號來維護相容度。
real name 是實際放有library程式的檔案名稱,後面會再加上 minor 版號與release 版號,像是 libmylib.so.1.0.0 。一般來說,版號的改變規則是(印象中在 APress-Difinitive Guide to GCC中有提到,但目前手邊沒這本書),最尾碼的release版號用於程式內容的修正,介面完全沒有改變。中間的minor用於有新增加介面,但相舊介面沒改變,所以與舊版本相容。最前面的version版號用於原介面有移除或改變,與舊版不相容時。
linker name是用於連結時的名稱,是不含版號的 soname ,如: libmylib.so。通常 linker name與 real name是用 ln 指到對應的 real name ,用來提供彈性與維護性。
* 編譯 :
shared library的製作過程較複雜 :
# gcc -c -fPIC hello.c world.c
編譯時要加上 -fPIC 用來產生 position-independent code。也可以用 -fpic參數。 (不太清楚差異,只知道 -fPIC 較通用於不同平台,但產生的code較大,而且編譯速度較慢)。
# gcc -shared -WI,-soname,libmylib.so.1 -o libmylib.so1.0.0 hello.o world.o
-shared 表示要編譯成 shared library
-soname用來指名 soname 為 limylib.so.1
library會被輸出成libmylib.so.1.0.0 (也就是real name)若不指定 soname 的話,在編譯結連後的執行檔會以連時的library檔名為soname,並載入他。否則是載入soname指定的library檔案。
在編譯後再用 ln 來建立 soname 與 linker name 兩個檔案 :
# ln -s libmylib.so1.0.0 libmylib.so
在編譯後再用 ln 來建立 soname 與 linker name 兩個檔案 :
# ln -s libmylib.so1.0.0 libmylib.so.1
* 使用 :
與使用 static library 同 :
# gcc main_mylib.c libmylib.so
或用
# gcc main_mylib.c -L. -lmylib
與使用 static library 同 :
# gcc main_mylib.c libmylib.so
或用
# gcc main_mylib.c -L. -lmylib
如果目錄下同時有static與shared library的話,會以shared為主, 可以使用 -static 參數可以避免使用shared連結 :
# gcc main_mylib.c -static -L. -lmylib <會花比用 shared library 久的時間>
此時可以用 ldd 看編譯出的執行檔與shared程式庫的相依性 :
# ldd ./a.out
linux-gate.so.1 => (0xffffe000)
libmylib.so => not found
libc.so.6 => /lib/libc.so.6 (0xb7dda000)
/lib/ld-linux.so.2 (0xb7f0a000)
輸出結果顯示出該執行檔需要 libmylib.so 這個shared library。會顯示 not found 因為沒指定該library所在的目錄,所找不到該library. 執行時會要求載入libmylib.so:
# ./a.out.
/a.out: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
# gcc main_mylib.c -static -L. -lmylib <會花比用 shared library 久的時間>
此時可以用 ldd 看編譯出的執行檔與shared程式庫的相依性 :
# ldd ./a.out
linux-gate.so.1 => (0xffffe000)
libmylib.so => not found
libc.so.6 => /lib/libc.so.6 (0xb7dda000)
/lib/ld-linux.so.2 (0xb7f0a000)
輸出結果顯示出該執行檔需要 libmylib.so 這個shared library。會顯示 not found 因為沒指定該library所在的目錄,所找不到該library. 執行時會要求載入libmylib.so:
# ./a.out.
/a.out: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
因為找不到 libmylib.so.1 所以無法執行程式. 有幾個方式可以處理 :
a. 把 libmylib.so 安裝到系統的library目錄,如/usr/lib下
b. 設定 /etc/ld.so.conf ,加入一個新的library搜尋目錄,並執行ldconfig 更新快取
c. 設定 LD_LIBRARY_PATH 環境變數來搜尋library, 這裡是以加入目前的目錄來搜尋要載作的library
client:/home/max/src # export LD_LIBRARY_PATH=.
client:/home/max/src # ./a.out
Hello world <成功執行>
Dynamically loaded libraries :
Dynamicaaly loaded libraries 才是像 windows 所用的 DLL ,在使用到時才載入,編譯連結時不需要相關的library。動態載入庫常被用於像plug-ins的應用.
* 使用 :
動態載入是透過一套 dl function來處理, 請參考如下 API :
- #include
- void *dlopen(const char *filename, int flag);
- //開啟載入 filename 指定的 library。
- void *dlsym(void *handle, const char *symbol);
- //取得 symbol 指定的symbol name在library被載入的記憶體位址。
- int dlclose(void *handle);
- //關閉dlopen開啟的handle。
- char *dlerror(void);
- //傳回最近所發生的錯誤訊息。
____ dltest.c ____
- #include
- #include
- #include
- int main() {
- void *handle;
- void (*f)();
- char *error;
- /* 開啟之前所撰寫的 libmylib.so 程式庫 */
- handle = dlopen("./libmylib.so", RTLD_LAZY);
- if( !handle ) {
- fputs( dlerror(), stderr);
- exit(1);
- }
- /* 取得 hello function 的 address */
- f = dlsym(handle, "hello");
- if(( error=dlerror())!=NULL) {
- fputs(error, stderr);
- exit(1);
- }
- /* 呼叫該 function */
- f();
- dlclose(handle);
- }
編譯時要加上 -ldl 參數來與 dl library 連結 :
# gcc dltest.c -ldl
# ./a.out
Hello <成功執行>
訂閱:
文章 (Atom)

