2013/12/16

[Java] Web Server撰寫

網路的連線可以分成TCP以及UDP連線,TCP是連線導向且為可靠式,傳送上以每個byte為單位,有重傳機制確保資料可以正確地送到目的IP位址,適合用在傳輸文字、各種檔案、HTTP網路連線等這種不能損失封包的資料上,缺點是較無效率;而UDP則是非連線導向且為不可靠式,傳送上以每個packet為單位,因為不保證資料都能夠送達目的地,沒有重傳機制,速度較快,適合用在傳輸影音串流上,缺點是封包會有損失。

網路的連線可以從Physical layer -> Data Link layer -> Network layer -> Transport layer -> Application layer來探討,舉HTTP這個在user上的application為例子,是透過網路連線,經過電腦的MAC和IP位址,還有IP port number 80,最後透過HTTP的protocol來連線溝通。

2013/12/10

[Android] Bundle Error: java.lang.NullPointerException

使用Eclipse編寫Android程式,撰寫兩個Activity以上之間的切換,常常Activity之間會需要有資料的傳遞,就必須要透過Intent()及Bundle()來完成。

Android的資料傳遞架構如下

2013/12/09

[網際網路] 乙太網路封包格式(MAC Frame Format)

Ethernet (802.3 MAC frame format)

在網路傳輸資料是透過所謂的封包來傳送,封包內包含了目的及來源的MAC位址、IP和Port,才能夠讓資料正確的傳送到目的地。不過整個電腦的網路是利用各種網路拓樸連結在一起,有時候封包間會發生碰撞的問題,可以想像成在單行道上,兩台車都要通過,就會造成堵塞的現象。因此透過CSMA/CD(Carrier Sense Multiple Access with Collision, IEEE 802.3)的設計,訂定出了網路的封包大小最小為64bytes;最大為1518bytes,來避免封包碰撞的現象。

TCP/IP封包為例子,扣掉MAC位址及一些辨識碼[6(DA)+6(SA)+2(Ether type)+4(FCS)=18bytes],因此IP封包的大小為46~1500bytes,所以也常常會看到人家說網路的MTU1500bytes,就是這麼來的。

2013/12/05

[Linux] 常用指令:chmod

在執行Linux的執行檔時,有時候會發現並不能執行,這是因為目前的使用者沒有這個權限。
權限的概念在Linux中很常使用,有分為 user / group / other三種,根據不同的使用者狀態,就會有不同的檔案使用權限( read / write / execute ) 。

要改變使用權限就要使用chmod指令
chmod [options] mode file

-R recursive, i.e. include objects in subdirectories

-rwx 421

[Linux] 常用指令:grep

除了find之外,還有一個類似的指令是grep,這指令主要用來搜尋檔案裡相關的程式碼結果,在trace code的時候都非常的好用。

用法:
grep [-acinv] [--color=auto] 'find things' filename

-d, --directories=ACTION  how to handle directories;
-R, -r, --recursive       equivalent to --directories=recurse
-n, --line-number         print line number with output lines

[Linux] 常用指令:find

在Linux中常常會需要尋找檔案,這時候就要利用find這個指令來達成。

用法:
find [PATH] [option] [action]

-type [bcdpflsD] 搜尋檔案的類型為 TYPE 的,類型主要有:一般正規檔案 (f), 裝置檔案 (b, c), 目錄 (d), 連結檔 (l), socket (s), 及 FIFO (p) 等屬性。

-iname filename 不限大小寫

-exec command 將搜尋結果執行command動作

2013/11/29

[OpenVPN GUI] Server及Client設定

OpenVPN GUI是一套簡單好操作的設定軟體,來讓電腦可以透過虛擬的VPN網域來上網。對於常出差的朋友們來說,能夠利用VPN來上一些被擋掉的網站,也是挺方便的!

OpenVPN的下載網址
注意下載的時候要注意電腦是32位元還是64位元的系統,如果是64位元建議到以下網站下載
http://openvpn.se/download.html
另一個下載地址
http://openvpn.net/

原因是因為一開始架設的時候採用http://openvpn.net/下載的檔案,在32位元的電腦上架client沒有問題,但是64位元的server端一直架不起來,發現Error訊息如下


Wed Nov 27 19:03:25 2013 CreateFile failed on TAP device: \\.\Global\{498541F0-8CBD-4231-8F00-F9F4F2152179}.tap
Wed Nov 27 19:03:25 2013 All TAP-Win32 adapters on this system are currently in use.
Wed Nov 27 19:03:25 2013 Exiting

會發現OpenVPN建立的虛擬網卡TAP device架不起來,Google一下才知道是位元版本有問題,因此64位元的作業系統請按這裡下載,避免OpenVPN架設失敗。


2013/11/28

[jQuery] Object和Array的不同及應用

寫網頁常常會需要在表格中列出大量相似的資料,這時候array和object就很好用。

array與一般的程式語言相同,擁有index及value,只要輸入index值,就可以得到存放在array之中的value;而object也類似,但不同的點在於,object有所謂的key及value,可以自己定義存放在object中的value的key是什麼,輸入這個key就可以得到相對應的值。


2013/11/22

[JAVA] Socket網路server/client文字傳輸程式

想要練習對程式語言的各種應用熟悉程度,像是檔案I/O、執行緒、網路Socket還有程式介面,最快速的方式就是寫一個類似MSN的文字傳輸程式。既可以綜合練習到以上的部分,還可以藉由撰寫的過程中,更加了解程式語言。

JAVA也不例外,物件程式導向的程式語言,筆者對此一直還懵懵懂懂,但透過撰寫這個程式,對於類別架構、Socket還有AWT(Abstract Window Toolkit)物件的應用,更有不同的心得。


2013/11/18

[Wi-Fi] IEEE 802.11 a/b/g/n/ac 有什麼差別?

在市面上的行動通訊產品,常常會看到IEEE 802.11 a/b/g/n 或者 IEEE 802.11 ac的規格,但這幾種規格到底有什麼差異呢?

Wi-Fi使用的radio frequency頻段為2.4GHz或者5GHz,簡單整理成下表:
Protocol
Frequency
Max PHY Rate
Inside
Outside
Legacy
2.4-2.5GHz
2Mbps
-
-
802.11a
5.15-5.35GHz
5.47-5.725GHz
5.725-5.875GHz
54Mbps
30m
45m
802.11b
2.4-2.5GHz
11Mbps
30m
100m
802.11g
2.4-2.5GHz
54Mbps
30m
100m
802.11n
2.4 / 5GHz
150Mbps(40MHz * 1MIMO)
600Mbps(40MHz * 4MIMO)
70m
250m
802.11ac
5GHz
200Mbps(40MHz * 1MIMO)
433.3Mbps(80MHz * 1MIMO)
866.7Mbps(160MHz * 1MIMO)
35m


其中 IEEE 802.11b/g 為2.4GHz的RF頻段,802.11g為802.11b的升級版,最大PHY rate從11Mbps提升到了54Mbps;IEEE 802.11a為5GHz頻段,最大PHY rate為54Mbps。所使用的channel頻寬都是20MHz。

2013/11/15

[Iperf] 簡單測試網路效能

想要測試無線網路、有線網路的效能,可以簡單透過iperf這個工具來測試。
可以從Iperf下載iperf到電腦,windows / linux / Mac都可以使用。

設定的方式,首先先確認兩台測試的電腦在同一個區域網段之下或者能夠透過預設閘道或路由器去連線到不同網域的電腦。可以用ping來測試兩台電腦之間的連線。

iperf 簡介
--------------------------------------------------------
-s    server 模式
-c    client 模式
-w    TCP windows設定
-t    測試總時間(秒)
-i    每隔幾秒show速度在cmd視窗上
--------------------------------------------------------


2013/11/14

[Wi-Fi] Wi-Fi 無線網路頻段、OperatingChannelBandwidth & ExtensionChannel

Wi-Fi是透過2.4GHz或者5GHzRF信號做傳輸資料,當然有頻段就會有干擾的問題,尤其如果是身處在到處有Wi-Fi設備的都市,使用上就會影響到速度。因此,常常會聽到人家說channels要設定在1611頻道,這樣才不會有干擾,為什麼呢?

2013/11/11

[Linux] 用CFLAGS -D來定義Makefile中global變數

在Linux編譯的時候,常常會需要讓程式去辨認一些變數,像是目前版本、或者自己定義的一些功能項目,所以.c檔會需要從Makefile那邊得到一些變數來做判斷。

利用CFLAGS -D來定義巨集變數,經過編譯之後,就可以在.c檔案中使用此定義巨集來做判斷。

# Makefile
CC = gcc
RM = rm

CFLAGS += -DTest

TARGETS := myapp

$(TARGETS): main.c
 $(CC) $(CFLAGS) $< -o $@

clean:
 -$(RM) -f *.o
 -$(RM) -f $(TARGETS)

$@:指的是編譯的目標檔,也就是$(TARGETS)的myapp
$<:指的是目前的相依檔,也就是$(TARGETS)後面的main.c,意思是若要編譯$(TARGETS),則必須先把main.c編譯


2013/11/10

[JAVA] 使用FileReader / FileWriter寫出亂數小寫字母字串檔案

使用JAVA來做檔案IO,透過FileReader和FileWriter就可以達成,搭配緩衝區BufferedReader和BufferedWriter更可以增加檔案IO的效率。

透過亂數產生100個小寫字母,並用FileWriter和BufferedWriter寫入至"rand_letters.txt"檔案中,然後再用FileReader和BufferedReader讀入並顯示在電腦螢幕上。以下為參考程式碼:


2013/11/09

[JAVA] 使用FileInputStream&FileOutputStream讀取寫入二進制檔案

JAVA跟C在檔案IO部分有些不同,C只要在fopen()函數中設定"r"或者"rb"就可以讀取一般文字檔或者是二進制檔案。而JAVA,要讀取二進制檔案就一定得用以下兩個method來實作。

Constructors
FileInputStream(File file)
創造一個讀入檔案file

Methods
int available()
回傳估計檔案的長度
int read(byte[] b)
讀取檔案內容至b的byte陣列中
void close()
關閉讀入檔案

Constructors
FileOutputStream(File file)
創造一個寫入檔案file

Methods
void write(byte[] b)
寫入b的byte陣列資料到檔案中
void close()
關閉寫出檔案


2013/11/07

[OpenSSL] Encrypted Digest加密摘要計算

在數位簽章的傳輸架構下,傳送方必須傳送檔案的明文以及Encrypted Digest(加密摘要)給接收方,接收方得到檔案之後,會用plaintext(明文)來計算的摘要訊息,以及用RSA公鑰來解密Encrypted Digest,進而比較兩者之間是否有不同,來確認檔案是否有被改寫過。底下為整個架構圖,UserA會把plaintext利用hash()計算出message digest,然後使用private key加密之後變成encrypted digest;接著把plaintext和encrypted digest傳送給UserB,UserB接收到之後,會把encrypted digest使用UserA的public key作解密,和接收到的plaintext代進hash()計算出來的message digest做比較,看看檔案是否有遭到竄改或者接收錯誤。




OpenSSL是怎麼來計算Encrypted Digest呢?做法是把驗證屬性(Authenticate Attributes)的部分,不包含格式前面的OID,然後把第一個byte改成0x31帶進去,利用RSA私鑰加密,就可以得到Encrypted Digest。也就是說,會影響Encrypted Digest結果的包含了contentsigning time以及message digest

2013/11/06

[OpenSSL] S/MIME數位簽章範例

使用OpenSSL的S/MIME來做數位簽章,得到三個不同簽章格式的結果(SMIME、PEM和DER)。
OpenSSL網站參考http://www.openssl.org/

舉例如下:
簽章檔案
Sign.txt
------------------------------檔案內容-----------------------------------
Content-type: text/plain

Test OpenSSL Signed Content
------------------------------檔案內容-----------------------------------


[OpenSSL] 數位簽章格式(SMIME, PEM and DER)

基於X.509和PKCS#7之下的數位簽章檔案有三個格式,分別是SMIME(Secure Multipurpose Internet Mail Extensions)、PEM(Privacy Enhanced Mail)和DER三種格式,SMIME會把整個簽章檔案內容以及簽章base64編碼的數據做為輸出內容;而PEM則是只有base64編碼的部分。
什麼是base64呢?簡單來說,在MIME格式的email中,將binary轉成ASCII的一種方法,把原本的二進制取6個bit為一個單位,用大寫字母(26個)、小寫字母(26個)、0~9(10個)和加除號"+ /"(2個),總共64個(26+26+10+2=64),基於這64個字元的編碼方式,可以簡單地做文字的加密。


2013/11/05

[軟體分享] CRC32、SHA1、MD5驗證碼檢測工具 HashMyFiles

網路上傳輸檔案,或者是OpenSSL加密傳輸,常會看到CRC32、SHA1或者MD5的驗證碼,在自己撰寫或開發軟體時候,有時候會不確定計算出來的驗證碼是否正確,因此可以使用HashMyFiles這個免費的小軟體來幫助驗證,其實挺方便的。

官方網站:http://www.nirsoft.net/utils/hash_my_files.html
下載:按此下載
版本:v2.01

舉例來說
假設要計算這個txt檔的驗證碼。


2013/11/02

[MATLAB] 用CSV讀檔分析財務報表

MATLAB是個很方便的工具,尤其可以讀入CSV檔,來分析大量的資料,甚至可以替我們塞選出前幾排名的資料。

利用 csvread函數來達到此功能
M = csvread(filename)
M = csvread(filename,row,col)
M = csvread(filename,row,col,csvRange)

以下以財務報表來舉例,首先去公開資訊觀測站下載上市公司102年Q2的綜合損益表的CSV檔案,然後透過MATLAB來分析毛利率、營業利益率以及淨利率,選擇營業收入在$100,000,000以上的公司,挑選出各前10名作為代表。如下圖


2013/10/28

[JAVA] Recursive 方式 撰寫 Fibonacci Sequence & Factorial Function

使用遞迴方式實現 Fibonacci 數列 和 Factorial Function 階層函數,兩個函數的內容為:

Fibonacci Sequence
  F(n) = F(n-1) + F(n-2) , n>=3
  F(n) = 1                        , n = 2 or 1
Factorial Function
  F(n) = n * (n-1) * ... * 2 * 1 = n!

[C/C++] 利用gmtime()和mktime()轉換time_t以及struct tm * 時間格式

寫程式的時候常常有機會會抓取系統的時間來做設定,不過在Linux C之中,時間設定分成幾種格式,像是time_t格式,取出來的時間為一個長整數,是自1970年1月1日0分0秒到現在的秒數,藉由ctime()函數就可以轉換成幾年幾月幾日的日期格式。而另外一個時間struct tm *則是一個結構變數,包含了

int tm_sec     秒數(0~61)
int tm_min     分鐘(0~59)
int tm_hour    小時(0~23)
int tm_mday  日期(1~31)
int tm_mon    月份(0~11,從1月算起)
int tm_year    年份(從1900年算起)
int tm_wday   星期幾(日→0、一→1、二→2、以此類推)
int tm_yday    一年中的第幾天
int tm_isdst    夏令時間旗標

2013/10/27

[C/C++] argc 和 argv 引數的應用

寫程式的時候常常可以看到main函數裡面的argc和argv這兩個變數。

int main(int argc, char **argv)
但這兩個變數有什麼應用呢?這兩個是用來傳遞參數到程式裡面。
舉例來說:

./a.out      CCC        aaa        bbb
argv[0]   argv[1]    argv[2]    argv[3], argc=4

2013/10/25

[VirtualBox] Samba 下 Ubuntu與Win7共享資料夾設定,利用 host-only網路

使用Samba設置Ubuntu有多種方式,像是Guest OS利用橋接方式與Host OS連結,搭配指定同網段IP的方式來做,但這樣的方式會讓所有區網內的使用者都可以連上Guest OS。只是想在Guest OS上寫寫code應該不用昭告天下吧!
所以為了達到讓Guest OS能夠上網,且同時只有Host OS可以用Samba分享透過內部網路存取Guest OS上的資料,要如何達成呢?

以下用VirtualBox下設置為例
Host OS : Win 7 64bit
Guest OS : Ubuntu 12.04.3 LTS

首先設置VirtualBox網路卡設定



2013/10/22

[OpenSSL] Linux下S/MIME範例教學

在網路的世界中,資料來來往往的傳遞,就會存在著資料是誰送來的,或者,資料安全性的問題。因此就有所謂的SSL(Secure Sockets Layer)的機制,在OSI七層架構的屬於表現層(Presentation Layer)之下的應用。

在OpenSSL的官網上可以載到最新的Library。
http://www.openssl.org/


2013/10/19

[網際網路] ARP協定

ARP(Address Resolution Protocol) ,位址解析協定,屬於OSI七層模型中,資料鏈結層(Data Link Layer)架構的協定,因為 MAC不具有階層性,無法有效尋找到目的位址,因此要透過具有階層性的 IP協定。但一個網路設備上,包括 IP位址與MAC 位址,兩者之間就存在一個對應和轉換的問題。在區域網路之下,才有 ARP協定。

主要是透過『廣播』的方式,也就是說由來源主機先送出一個 APR request『廣播位址』,只要是位於該網路的所有主機,皆會收到此要求,最後只有目的位址符合的主機便會回應該封包,並告訴來源主機,有關自己的 MAC Address。負責將網路設備的網路層 (Network Layer)IP Address 』,轉換或對應成鏈結層中的網路介面卡 (Network Interface Card,簡稱NIC) 上的實體位址『 MAC Address』之協定。

[網際網路] IP定址

IP為OSI七層協定中屬於網路層(Network Layer)的協定,一定會有疑問的是,既然電腦行動設備都具備了獨一無二的MAC位址,為什麼還需要IP協定呢?
舉例來說:雖然MAC是設備獨一無二的確認代碼,但是設備是有移動的可能性的,可能今天在家裡上網之後,隔天又去圖書館使用。因此在網路架構上就必須透過IP的協定,來分類各區域中的電腦,藉由IP定址,讓電腦可以透過區域網路(LAN)及廣域網路(WLAN)來達到上網的功能。
簡單說明,IP定址的目的,就是幫助電腦設備做區域的分類,來達到每個網路及子網路能夠連線以及上網的結果。

1.     子網路遮罩(Subnet mask):幫助子網路的切分,Net_ID為1、Host_ID為0
2.     網關(Gateway):連接兩個網路裝置,所有子網路內的電腦都會透過這台Gateway連線到不同的子網路

An office network consists of six hosts and a router is given as:
Hosts addresses:
 192.168.4.3
 192.168.4.4
 192.168.4.5
 192.168.4.6
 192.168.4.7
 192.168.4.8
Router (this side) address:
 192.168.4.1
The network has a subnet mask of:
 255.255.255.0 (/24 in CIDR notation)

2013/10/17

[網際網路] OSI七層網路模型

OSI七層網路模型,大體來說描述了整個網路架構的概念。從最底層的實體層,透過傳輸介質連線到各網路設備上;資料鏈結層則是包含了MAC定址的協定,讓每個網路設備有獨一無二的辨識碼;然後透過網路層可以分類每一個網路設備所在的區域;確定位置區域及名稱後,就可以利用傳輸層的TCP/UDP協定來建立連線;會議層決定傳輸的模式;表現層則可以做資料的加密及壓縮解壓縮等等;最上層的應用層則是在使用者介面上所開發服務的協定。

以下表格為簡單的整理內容:
功能
舉例
單位
應用層
(Application Layer)
User 操作
HTTP(Port 80), FTP(Port 21), Telnet(Port 23)…
Data/message
表現層
(Presentation Layer)
編碼與轉碼
壓縮與解壓縮
加密與解密
Secure Socket Layer(SSL)
會議層
(Session Layer)
傳輸模式 : 單工、半雙工和全雙工

傳輸層
(Transport Layer)
編定序號
流量控制
可靠性與效率性
TCP/UDP Protocol
(Port)
Segment
網路層
(Network Layer)
IP 定址
路由
Internet Protocol(IPv4, IPv6), Address Resolution Protocol(ARP)
Packet/datagram
資料鏈結層
(Data Link Layer)
介質存取控制方法
MAC 定址
錯誤檢查及更正
Ethernet Protocol(CSMA/CD), Wi-Fi, WiMAX
Frame, MAC Rate(throughput)
實體層
(Physical Layer)
傳送訊號的介質規格
訊號的編碼與轉換
Modem, ISDN
Bit, PHY Rate