2015年7月30日 星期四

htop 編譯錯誤

1. htop 在執行 autogen.sh 時,出現
./autogen.sh: 3: ./autogen.sh: aclocal: not found
./autogen.sh: 4: ./autogen.sh: autoconf: not found
./autogen.sh: 5: ./autogen.sh: autoheader: not found
./autogen.sh: 6: ./autogen.sh: libtoolize: not found
./autogen.sh: 7: ./autogen.sh: automake: not found
解決辦法:
sudo apt-get install automake autoconf libtool

2. htop 在 configure 時出現
configure: error: missing libraries:  libncurses
解決辦法:
sudo apt-get install libncurses5-dev libncursesw5

3. htop 在 configure 時出現
configure: error: You may want to use --disable-unicode or install libncursesw.
解決辦法:
sudo apt-get install libncursesw5-dev libncursesw5
然後再重新 configure 一次

2015年7月5日 星期日

Simple pthread example on Linux

想要在 Linux 下練習 multi-thread 程式,可以從這個簡單的範例開始,首先可以先參考幾個 pthread API. 

pthread_create 是你第一個要用的 pthread API,下列是我們的範例程式
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

/*
 * 在 thread_1 裡面執行一個無窮迴圈,並不斷印出 thread_1 訊息
 * 為了避免不斷的 loop,我們用 sleep function 在每次迴圈停 1 秒
 */
void *thread_1(void *argv) {
 while(1) {
  sleep(1);
  printf("I am thread_1\n");
 }
}

/*
 * 基本上和 thread_2 相同,但時間停留 2 秒
 */
void *thread_2(void *argv) {
 while (1) {
  sleep(2);
  printf("I am thread_2\n");
 }
}

int main() {
 pthread_t t1, t2; // 先宣告兩個 pthread 的變數

 // 之後開始建立並執行這兩個 thread,這兩個 thread 分別執行上面 thread_1, thread_2 這兩個 function
 pthread_create(&t1, NULL, &thread_1, NULL);
 pthread_create(&t2, NULL, &thread_2, NULL);

 // 而我們自己的 main thread 也同樣執行無窮迴圈,每次停留三秒
 while (1) {
  sleep(3);
  printf("I am main thread\n");
 }

 return 0;
}

結果在這邊
> ./pthread-example 
I am thread_1
I am thread_2
I am thread_1
I am main thread
I am thread_1
I am thread_1
I am thread_2
I am thread_1
I am main thread
I am thread_2
I am thread_1
I am thread_1
I am thread_2
I am thread_1
I am main thread
I am thread_1
I am thread_2
I am thread_1

我們可以注意到,在撰寫 multi-thread 程式時,需要改變以往 Sequential 的思維,實際上在 multi-thread 的觀念中,所有的 thread 都是同時在執行的 (實際上可能不是啦,但我們在比較高階的角度來看,就當作是同時在進行)。
另外,可以發現雖然 thread_1 停一秒,thread_2 停兩秒,main thread 停三秒,但實際在印出來時還是有先後順序之分,而且每一次都不太固定,這也是 thread 有時候比較抽象的地方。

最後,main thread 是不能停止的,這也是為什麼我們要在 main function 也插入無窮迴圈,因為 main thread 如果直接 return 停止,連帶的會把 thread_1 和 thread_2 一起停止。


thread_create manual: http://man7.org/linux/man-pages/man3/pthread_create.3.html
source code on github: https://github.com/jackzzjack/blogger.git

可以下載 source code 並直接執行 make simple,則會編譯出 pthread-example,之後直接 ./pthread-example 直行即可。

2015年7月2日 星期四

Signals on Linux

Linux 存在有 Signal 的機制,當我們在執行某支 Process 時,可以利用 Signal 對特定正在執行的 Process 給予特定的訊息。

事實上,當我們執行 Process 時,按下 Ctrl-C、Ctrl-Z 等等,其實也算是另外一種對 Process 送出 Signal 的動作,例如在 Linux 裡 Ctrl-Z 是送出 SIGTSTP 的 Signal,預設是將 Process 進行暫停的動作,而 Ctrl-C 則是送出 SIGINT 的 Signal,其意義是鍵盤對 Process 送出 Interrupt 的動作,預設是停止目前前景的 Process。

在 Signal manual 有更詳細所有的 Signal 介紹

另外,在處裡關於 Signal 的部分,預設在 Linux 都具有原本預設的處理方法,但其實我們是可以 Overwrite 改成我們想要的處理方式。

C API
http://man7.org/linux/man-pages/man2/signal.2.html

首先需要引入 signal.h 這個 header file,然後建立一個 signal handler 帶有 signal number 的參數,最後在 main function 利用 signal function 掛上 signal handler,一旦 process 發生了你所指定的 signal,便會導到你自己的 handler。


#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);


P.S. 如果想要改成原來預設 Linux 的 Default Handler,可以將 handler 改成 SIG_DFL,如果要忽略這一個 Signal,則可以改成 SIG_IGN。

其中 SIGKILL 和 SIGSTOP 是不能被更改和捕抓的,意思就是你不能 Overwrite,就算 Overwrite 了,他也不會理你。

2013年7月30日 星期二

Error, javax.servlet.ServletException

最近在寫 Java Servlet 時遇到了一個問題,錯誤訊息如下:


exception
javax.servlet.ServletException: Error instantiating servlet class
root cause
java.lang.IllegalAccessException: Class org.apache.catalina.core.StandardWrapper can not access a member of class

大約是這樣,解決辦法為,在 class 的權限控管中,我使用了 protected,而改成 public 就正常了 !

2013年7月16日 星期二

parse.com

最近發現到一個不錯的網站,可以做為開發時的後端,一般而言在開發初期,最令人頭痛的就是後端的部分,在這邊有不錯的後端與前端資源,在後端可以使用它提供的 API,不用花太多心力,而前端又有許多不同平台的資源。

還有一個重點,這網頁的 doc 做得很用心,而且蠻漂亮的,help 那邊也有不錯的資源 (Help 才是重點阿) !!

https://parse.com/

2013年7月4日 星期四

Eclipse 下載

這篇文章與先前的 Android SDK 環境設定 - 1 的第二點相同,這篇會比較新而且詳細些。
可以直接看這篇就好 !!


首先,先到 eclipse download 這邊去下載 eclipse 主程式,eclipse 為免安裝的程式,直接解壓縮就可以使用,紅色框框顯示 Java EE 的版本,下面還有很多種版本,可以挑選自己喜歡、適合的。
另外,也有 Windows、Linux 與 32-bit、64-bit 可以挑選。(這和 JDK 或 JVM 的 32-bit、64-bit 有點關係,為了省去麻煩,eclipse 與 JDK 我都選擇 32-bit)


之後在下面可以選擇不同的 mirror,而紅色框框這邊,你也直接使用他給的網址,點選 [Taiwan] Providence University (http)


之後應該就會出現下載的畫面了,如果沒有出現下載提示,可以點選 click here 來進行下載。


下載完後,直接解壓縮,會有 eclipse 的資料夾,裡面直接執行 eclipse.exe 即可。