2009年10月27日 星期二

CMake簡單範例

CMake是一個軟體建構工具,可以幫我們產生MakeFile。以下就用簡單的範例來呈現:
我們有三個檔案main.cpp hello.cpp hello.h和三個CMakeLists.txt
分別位於

|-- CMakeLists.txt
|-- lib
| |-- CMakeLists.txt
| |-- hello.cpp
| |-- hello.h
|-- src
|-- CMakeLists.txt
|-- main.cpp

hello.h
void hello();
hello.cpp
#include "hello.h"
#include <iostream>
void hello() {
std::cout << "Hello CMake!" << std::endl;
}

main.cpp
#include "hello.h"
int main() {
hello();
return 0;
}

最上層的CMakeLists.txt
PROJECT (HELLO)
# 加入兩個子資料夾(src後面bin的意思是將src的輸出放到bin資料夾)
ADD_SUBDIRECTORY (src bin)
ADD_SUBDIRECTORY (lib)

lib/CMakeLists.txt
# 將hello.cpp編譯成static library
ADD_LIBRARY (HelloLibrary hello.cpp)

src/CMakeLists.txt
INCLUDE_DIRECTORIES (${HELLO_SOURCE_DIR}/lib)
SET (HELLO_SRCS main.cpp)
ADD_EXECUTABLE (HelloCMake HELLO_SRCS)
TARGET_LINK_LIBRARIES (HelloCMake HelloLibrary)

在執行cmake前,我們可以在最上層先建立一個目錄(例如:build),然後到build目錄下執行cmake,如此cmake後產生的資料皆會在build資料夾裡。
# mkdir build
# cd build
# cmake ../
# make

若順利的話,便可在bin找到HelloCMake執行檔,在lib可找到libHelloLibrary.a

2009年10月24日 星期六

FastCGI

FastCGI是一個網頁伺服器端應用程式介面,CGI有一個很大的缺點就是CGI程式每次執行就會產生一個新的process,當同時很多人上線時,會對伺服器造成很大負擔;而FastCGI程式是常駐型的CGI程式,不會因為Http_Request結束而終止。

在Debian 5安裝Apache2 + FastCGI
# apt-get install apache2 libapache2-mod-fastcgi
# /etc/init.d/apache2 restart

接著用c寫一個helloFCGI的程式來驗証:
#include "fcgi_stdio.h"
#include <stdlib.h>

int main()
{
int count = 0;
while(FCGI_Accept() >= 0) {
printf("Content-type: text/html\r\n"
"\r\n"
"<title>Hello FastCGI</title>"
"<h1>Hello FastCGI</h1>"
"Request number %d running on host <i>%s</i>\n",
++count, getenv("SERVER_NAME"));
}
return 0;
}

編譯時要加上-lfcgi參數
# gcc -lfcgi -o helloFCGI.fcgi helloFCGI.c

將helloFCGI.fcgi放到所設定的FastCGI執行的資料夾內(Debian安裝好的預設資料夾在/usr/lib/cgi-bin),在網頁執行http://localhost/cgi-bin/helloFCGI.fcgi即可看到結果。

2009年10月7日 星期三

Windows Multithreaded Programming

要建立多執行緒程式,我們會用到<process.h>標頭檔定義的函式:

uintptr_t _beginthread(

void( __cdecl *start_address )( void * ),
unsigned stack_size,
void *arglist

);

_beginthread()需要三個參數,第一個是要執行緒所執行的函式名稱(注意這個函式的prototype);第二個參數為給這個執行緒的stack size,若設定0值則作業系統會自動設定此值;第三個參數可以用來傳遞資料給欲執行的函式。

#include <windows.h>
#include <process.h>
#include <iostream>

using namespace std;

void func1(void *);
void func2(void *);

int main()
{
_beginthread(func1, 0, NULL);
_beginthread(func2, 0, NULL);

Sleep(10000);
cout << "Main exit" << endl;
getchar();
return 0;
}

void func1(void *p)
{
for(int i = 1; i < 6; ++i)
cout << "func1 value " << i << endl;
}

void func2(void *p)
{
for(int i = 1; i < 6; ++i)
cout << "func2 value " << i << endl;
}

以下用簡單的範例說明:
執行結果如下:


這個結果可以發現兩個執行緒可以在任何時間點去插隊執行,若要避免這種情況發生,我們可以利用critical section來解決它。

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

2009年8月13日 星期四

插座產生火花

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

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


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

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

2009年7月25日 星期六

空軍軍歌

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

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



空軍軍歌
簡樸詞 劉雪庵曲

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

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