2009年9月26日 星期六

update-alternatives

Debian提供了update-alternatives的工具,可以用來管理套件的版本。例如:系統有三套Java的套件GIJ、GCJ和Sun Java,如何能自由且快速的切換不同版本。

首先,先看一下java指令的路徑
#which java
/usr/bin/java

# ls -l /usr/bin/java
/usr/bin/java -> /etc/alternatives/java
# ls -l /etc/alternatives/java
/etc/alternatives/java -> /usr/lib/jvm/java-gcj/jre/bin/java

我們可以看到java的指令用一個symbolic link連到/etc/alternatives/java,而/etc/alternatives/java又是一個symbolic link連到/usr/lib/jvm/java-gcj/jre/bin/java。
所以update-alternatives就是將/etc/alternatives/java改掉。

# update-alternatives --display java
java - status is auto.
link currently points to /usr/lib/jvm/java-gcj/jre/bin/java
/usr/bin/gij-4.2 - priority 42
slave java.1.gz: /usr/share/man/man1/gij-4.2.1.gz
/usr/lib/jvm/java-gcj/jre/bin/java - priority 1042
/usr/lib/jvm/java-6-sun/jre/bin/java - priority 63
slave java.1.gz: /usr/lib/jvm/java-6-sun-1.6.0.00/jre/man/man1/java.1.gz
Current `best' version is /usr/lib/jvm/java-gcj/jre/bin/java.

可以看到目前系統有gcj和Sun Java,由於status是auto,而gcj的優先權最高,所以可以最下面顯示目前最佳的版本是gcj。若要改變成java-6-sun:

# update-alternatives --config java

即可選擇java-6-sun。

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