2008年1月8日 星期二

Jpcap - 列出系統的網路介面資訊

JpcapCaptor.getDeviceList()可以取得主機上的所有網路介面的資訊,以陣列NetworkInterface[]回傳。藉由這個陣列可以取得網路卡名稱、IP位址等資訊。

NetworkInterface[] interfaces = JpcapCaptor.getDeviceList();

for(int i = 0; i < interfaces.length; i++)
System.out.println(i + ": " + interfaces[i].name + "(" + interfaces[i].description +")");

System.out.println("Datalink: " + interfaces[i].datalink_name + "(" + interfaces[i].datalink_description + ")");
System.out.print("MAC: ");
for(byte b : interfaces[i].mac_address)
System.out.print(Integer.toHexString(b & 0xff) + ":");
System.out.println();
for(NetworkInterfaceAddress addr : interfaces[i].addresses) {
System.out.println("Address: " + addr.address);
}
}
輸出結果如下:
0: eth1(null)
Datalink: EN10MB(Ethernet)
MAC: 0:17:31:25:6f:ed:
Address: /140.120.15.173
Address: /fe80:0:0:0:217:31ff:fe25:6fed
以下略

2008年1月7日 星期一

編譯多個source code

將函式的prototype的宣告以及一些constant的定義寫在另一個header檔是程式常用的技巧。自行定義的header必須以雙引號include進來,如:
#include "selfdefined.h"

至於如何編譯多個source code,以下以GNU C compiler gcc作說明:

假設有以下檔案:main.c selfdefined.c selfdefined.h

# gcc -c main.c selfdefined.c
會產生兩個object file
# gcc -o main main.o selfdefined.o
連結兩個object file產生main的執行檔

如果後來main.c做了更改,我們只須重新編譯main.c即可
# gcc -o main main.c selfdefined.o

2008年1月5日 星期六

24歲了

生日,總免不了蛋糕才是,所以到85度C買了小蛋糕和咖啡,另外再加上一盒章魚小丸子,自己為自己慶生吧!



通常在生日這天都會許下生日願望,然而,對我來說,這顯然不太靈驗。曾經許下一個以為很容易實現的願望,後來才發現原來我是個傻瓜。不過,一切都成過往,人總是要不斷地往前走。

雖然生日願望看似不太可靠,但我還是要許願一下,願望是不能說出來的,秘密~~~

原子結構

基本粒子
原子(atom)是由原子核(atomic nucleus)和電子(eletron)構成,而原子核是由中子(neutron)與質子(proton)所組成。
事實上,所有的基本粒子可以由兩種型態的粒子構成:

  • 夸克(quark)
  • 輕子(lepton)
電子不是由夸克所組成的,它本身即是一種基本粒子,屬於輕子。

每一種型態的原子可以由電子數及質子數來和其它的元素作區別。例如氫原子有一個質子和一個電子,而氦原子則有兩個質子、兩個中子和兩個電子。

原子序
所有元素可以依照原子序排列在化學週期表上,而原子序就等於原子核裡的質子數,在一個平衡狀態的原子裡也等於電子數。

電子能階
原子核外有一層一層的能量軌域,電子只能繞行在某個軌域上,離原子核距離較近的電子,其能量比離原子核距離遠的電子還要低。每個離散的距離(軌域),可以對應到某一個能階(Energy level)。每個能階都能視為一種Shell,每一個Shell都有最大可允許的電子數量。可以用以下的式子來計算:

Ne = 2n^2

Shell 1: 2(1)^2 = 2 (可容納2個)
Shell 2: 2(2)^2 = 8 (可容納8個)
...

每一層都要填滿才能到下一層,因此只有Valence shell不必完全填滿。

價電子 (Valence Electrons)
離原子核愈遠的電子擁有較高的能量,因此位於最外層的Shell的電子最不被原子核束縛。最外層的Shell又稱為Valence shell,而在Valence shell的電子則稱為價電子。

離子化 (Ionization)
當一個原子吸收到能量,如熱能或光能,則電子的能量會提昇。因為價電子擁有較高的能量且較不被原子核束縛,所以他們很容易跳到更高的軌域。因為價電子已在最外層,所以當取得足夠的能量時,便會完全脫離原子核束縛。而由於失去一個電子,則此時原子的質子數變大於電子數而帶正電。這種失去價電子的過程稱為離子化,而帶正電的原子稱為陽離子。脫離原子核的價電子稱為自由電子,當一個自由電子失去能量且掉入另一個原子的Valence shell,則這個原子會變成帶負電,稱陰離子。

2008年1月2日 星期三

迴圈小技巧

從PTT上看到別人的小技巧,和大家分享一下。

若程式裡的迴圈是用來計數的話
ex.
for(i = 0; i <= n; i++)
s = s + i;

可以做以下的修改
for(i = n; i; i--)
s = s + i;

如此,編譯成組合語言時,會少一個cmp的指令。
修改後的組合語言,會用jne來判斷,若i變成0,會將flag設為0。


小技巧的確是能將效率提升,然而卻可能讓程式變的不可讀,有利有弊。最佳的情況當然是compiler夠聰明的話,程式寫作就可以輕鬆多了。

2008年1月1日 星期二

跨年 - 迎向2008

以往的跨年總是待在家裡,不然就是待在宿舍。然而,這次和以往不同,和一群國中的好朋友一起迎接2008。阿佑、小武、蒜督、昱銓、我以及兩位小武的朋友如芬、詒真(如果沒記錯的話!)
寒冷的夜晚,當然少不了火鍋,於是找了一間吃到飽的火鍋店大吃一頓。阿佑剛好是元旦寶寶,蒜督原來準備了小禮物送給了他,令人驚奇的是,我也有一份,雖然離生日還有幾天才會到,感覺整個心都熱了起來。





吃完火鍋都快十一點了,再晚就看不到101煙火了,於是就先去接小武的兩個朋友,然後就前往辛亥隧道旁的一座山前進。時間一分一秒的流逝,最後我們就把目的地改在辛亥路三段上,這個路口也是擠滿了人,看來應該也是不錯的地點。時間是十一點四十五分。



五、四、三、二、一,Happy New Year!101煙火一開始的瞬間真是漂亮,現場看和電視看就是不太一樣,不過,美中不足的是後來的煙火都被煙遮住了。



看完煙火後,小武提議要到五股憲兵學校後面的一座山看夜景,所以又開始了長途的旅程,冷死我了。費盡千辛萬苦終於到了,可惜沒相機,不能拍下來。

回到家的時候已經四點多了,今年的跨年真是特別!