2009年9月22日 星期二

ldd

ldd可以用來顯示每個程式所使用到的shared library。ldd其實是一個shell script而不是執行檔。

在linux,我們可以將程式編譯成靜態連結或是動態連結,在這以hello.c來解釋。

#include <stdio.h>
int main(void) {
printf("Hello world!\n");
return 0;
}

用gcc編譯
# gcc hello.c -o hello
則會產生hello的執行檔,而其預設是使用動態連結的方式:

用file指令來檢視其屬性
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

用ldd來檢視共用了哪些shared library
# ldd hello
linux-gate.so.1 => (0xb7f6a000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dfd000)
/lib/ld-linux.so.2 (0xb7f6b000)

此外,此檔案的大小為
# ls -l hello
-rwxr-xr-x 1 howard howard 6256 2008-09-30 00:00 hello

上述為程式使用動態連結,我們也可以將程式編譯成靜態連結:
# gcc -static hello.c -o hello

用file來檢視,可以看到顯示為靜態連結
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.8, not stripped

用ldd來檢視,自然沒使用到任何shared library
# ldd hello
not a dynamic executable

再來檢視檔案的大小
# ls -l hello
-rwxr-xr-x 1 howard howard 564881 2008-09-30 00:07 hello

我們可以看到檔案大小為564881 Bytes,相對於之前用動態連結只用了6256 Bytes,足足大上快一百倍。可見使用動態連結能大大節省空間。

2009年9月18日 星期五

解決JAVA中文顯示方塊

在Linux下執行Java程式時,常發現中文字體無法顯示,全部變成方塊,解決方法如下:

# cd /usr/lib/jvm/java-6-sun/jre/lib/fonts/
# mkdir fallback
# cd fallback
# ln -s /usr/share/fonts/truetype/arphic/uming.ttc .

新增一個fallback資料夾,再將中文字體連結到資料夾內即可。

2009年9月16日 星期三

飛虎803T 登出

十一個月又八天的軍旅生涯,在早上拿著退伍令走出營門的那一刻終於結束,恢復成老百姓的感覺真好!

既然都退伍了,就不再提軍中生活了。當兵只是人生的一個小階段,緊接面對的才是重要的挑戰,相信自己一定可以的,加油!

2009年9月2日 星期三

再見了!C-130

還記得第一次搭飛機的經驗就是坐上C-130運輸機,對於它的印象就是很吵,但由於免錢的因素所以每次休假返台幾乎都是搭軍機回家。昨天是軍旅生涯最後一次的休假了,應該也是最後一次能搭乘C-130。不知道為什麼最後一次的C-130特別舒適,起飛時就睡著了,醒來時已經在台北的天空翱翔。



再見了!C-130

2009年8月13日 星期四

插座產生火花

剛在筆電快沒電時,將筆電的插頭插進插座時冒出火花,於是就查了一下是什麼原因會造成火花的出現。

引用自 http://enews.nfa.gov.tw/issue/940421/images/radio.htm


插頭在插入插座時,為何會有小小火花產生呢?

插頭在插入插座時,經常會發現有小小火花,主要是因為電器用品在尚未通電之前已將開關打開或上次不使用後,只是將插頭把掉,但沒有把開關關掉,以致再使用時,直接插入插座時,便立即處於通電狀態,以致瞬間電流較高,又加上插頭長期未清理,插頭的兩隻腳(正負兩極)間會逐漸堆積一些灰塵、毛髮,而這些灰塵、毛髮,如果碰到水氣,產生銅鏽,就有可能成為導體,造成插座兩極間出現一個迴路,而產生火花。所以只要平時經常保持插頭銅片乾淨,且養成插頭插上插座後,再打開電器開關,既可以延長電器的壽命又可以避免因火花而引起的不必要災害。

2009年7月25日 星期六

空軍軍歌

上次收假回部隊後,突然來了一個大驚喜,那就是單位新來了兩位新兵,這代表我終於擺脫菜島的身份。人多好辦事,相信應該可以快快樂樂的退伍才是。

但也因這兩位新兵的加入,副主任要這兩位新兵學唱空軍軍歌,然後總班長叫我去教他們,所以我也不會唱的事也跟著露餡。不過,身為空軍卻不會唱空軍軍歌實在是說不過去,所以就趁這個時候學一下好了。



空軍軍歌
簡樸詞 劉雪庵曲

凌雲御風去,報國把志伸,遨遊崑崙上空,俯瞰太平洋濱,
看五嶽三江雄關要塞,美麗的錦繡河山,輝映著無敵機群。
緬懷先烈莫辜負創業艱辛,發揚光大尤賴我空軍軍人,
同志們努力努力,
矢勇矢勤,國祚皇皇萬世榮。

盡瘁為空軍,報國把志伸, 那怕風霜雨露,只信雙手萬能,
看鐵翼蔽空馬達齊鳴,美麗的錦繡河山,輝映著無敵機群。
我們要使技術發明日日新,我們要用血汗永固中華魂。
同志們努力努力,
同德同心,國祚皇皇萬世榮。

2009年7月6日 星期一

排列演算法

數學一向不是很好的我,一看到要列出某字串所有的排列(Permutation),就讓我非常的頭大。記得當初要準備考研究所時就曾經看著資料結構書上的解法想了老半天,似懂非懂,但最近又看到類似的題目,證明了以前是裝懂。

To iterate is human, to recurse divine.


遞迴的程式一定要在頭腦清楚時再來看,否則只是在浪費時間而已。這次,我真的看懂了。

以{a, b, c, d}為例子,要列出所有的排列,我們可以將這個問題拆解成:
  • 開頭為a加上{b, c, d}的所有排列
  • 開頭為b加上{a, c, d}的所有排列
  • 開頭為c加上{a, b, d}的所有排列
  • 開頭為d加上{a, b, c}的所有排列
所以,很明顯的是可以用遞迴方式來解。在此用C++來實作

void perm(char *obj, int pos, int n) {
if(pos == n - 1) {
for(int i = 0; i < n; ++i) cout << obj[i] << " ";
cout << endl;
}
else {
for(int i = pos; i < n; ++i) {
// swap()是要自己寫的函式,交換陣列內的值
swap(obj[pos], obj[i]);
perm(obj, pos + 1, n);
swap(obj[pos], obj[i]);
}}}

else內的for迴圈是整個程式的關鍵,可以用上面舉的例子來說明,假設obj陣列已經存了{a, b, c, d}四個值,我們呼叫perm(obj, 0, 4)來印出所有排列。for迴圈的解釋就如同將第一個位置分別用a, b, c, d為開頭,所以用了swap()把每一個值都對調到第一個位置,接著再呼叫perm(obj, 1, 4)來排列剩下的三個字元,依此類推。

2009年6月10日 星期三

軍旅生涯倒數

看到週遭的朋友一個一個退伍了,何時才會輪到我呢?至從上次點放在網咖裡寫了一個退伍倒數計時器放在部落格上,就這樣開始展開我的軍旅生涯倒數,很巧的是從123天開始。到現在已經剩下98天,敲敲的破百了,而破百的意義不外乎是從三位數變成兩位數,也就是可以準備開始打包行李了。

隨著退伍日一天天的逼近,心情卻是有些忐忑不安,因為退伍後即將面臨的是就業問題,不知道自己究竟能做什麼,會做什麼?很後悔自己在大學時期沒有更積極的學習,只是顧著怎樣應付期中期末考,卻沒想到要去多培養一些專業的能力來充實自己。

雖說面對未來有些徬徨不安,但有一件事非常的肯定,那就是我是不可能選擇當軍人的,外面的空氣自由多了!

2009年6月8日 星期一

UVa 113 - Power of Cryptography

終於遇見一個秒殺的題目了,UVa 113 - Power of Cryptography這題只是單純的數字開根號問題,只要用<math.h>裡的pow(double x, double y)即可完成。

程式碼

因為有使用到<math.h>的函式,在用gcc編譯時要多一個-lm的參數。

2009年6月5日 星期五

Debian GNU/Linux 5.0

將近要一年沒有碰Linux了,之前用的Debian GNU/Linux 5.0 (Lenny)都從測試版變成穩定版了。一時興起,決定再來重灌一下Debian。但這次不再選擇使用測試版本,雖說測試版本有許多較新的軟體可以使用,但更新頻率實在是太高了,有時正常的系統更新後就感覺變的怪怪的,然後就要花很多時間去搜集資料把問題解決。

在安裝完後,通常我都會先做以下幾步驟:
  • 調整系統字型
  • 更新顯示卡驅動程式
  • 安裝gcin,並且新增嘸蝦米輸入法
  • GNOME-Look.org找尋想要的桌布與佈景主題
  • 調整登入畫面
  • 安裝PCMan (主要用來PTT)
  • 安裝Audacious (聽音樂必備)
  • 安裝aMSN
另外,由於感覺桌面顯示的圖示有點大,也順手將它變小。可在組態編輯器或在終端機輸入gconf-editor進入,選擇apps -> nautilus -> icon_view裡的default_zoom_levelstandard改為small即可。

以下即為安裝後的畫面