My Calendar

2012年9月16日 星期日

HTTP

HTTP

            HTTP是Hyper Text Transfer Protocol的縮寫,這是一種通訊協定,架構與TCP/IP之上應用層的一種協定。通訊協定基本上就是兩台電腦間溝通的方式。依不同的連線方式與所使用的網路服務而定,會有不同的通訊協定。例如發送信件時用SMTP,傳輸檔案用FTP等等。而瀏覽器跟Web伺服器之間的溝通方式,則是HTTP,它有兩個非常重要的特性:
  • 請求(Request)/ 回應(Response)模型
  • 無狀態(Stateless)通訊協定
             HTTP是基於請求/回應的通訊協定,客戶端對伺服器放出一個取得一個資源的請求,伺服器將要求的資源回應給客服端,每次的連線只作一次請求/回應,沒有請求就不會有回應。


             在HTTP協定下,伺服器是一個健忘的傢伙。伺服器回應客服端後,就不會記得客戶端的資訊,更不會維護與客戶端之間的狀態。因此HTTP又稱為Stateless 通訊協定。

HTTP 請求方法
瀏覽器在使用HTTP發出請求時,有幾種請求方法:
  • GET     請求獲取Request-URI所標識的資源
  • POST    在Request-URI所標識的資源後附加新的數據
  • HEAD    請求獲取由Request-URI所標識的資源的響應消息報頭
  • PUT    請求服務器存儲一個資源,並用Request-URI作為其標識
  • DELETE  請求服務器刪除Request-URI所標識的資源
  • TRACE   請求服務器回送收到的請求信息,主要用於測試或診斷
  • CONNECT 保留將來使用
  • OPTIONS 請求查詢服務器的性能,或者查詢與資源相關的選項和需求

在日常生活中最常接觸的請求方法就是GET和POST這兩種方法。以下分別介紹GET和POST的使用。

GET
GET 顧名思義,就是向伺服器取得指定的資源,在發出GET請求時,必須告訴伺服器所請求資源的URL,例如一個GET請求的發送範例如下:

在上圖中,請求標頭的內容是傳給伺服器參考的額外資訊。請求參數通常是使用者發送給伺服器的必要資訊 。請求資訊通常是使用者傳給伺服器的必要資訊,這些資訊通常是透過表單進行發送,伺服器必須有這些資訊才可以進一步對使用者的請求作出正確的回應,請求參數是在URL之後跟隨一個問號(?) 然後就是請求參數名稱和請求參數值,如果需要多個請求參數,則以&字元連接。GET請求可以發送的請求參數長度是有限的,對於太大量的資料不適合用GET進行傳送,這時候可以改成POST

POST請求
POST請求就是讓你請求時發怖(POST)資訊給伺服器,對於大量或是複雜的資訊,基本上都會採用POST來進行發送,一個POST發送的例子如下:





            從上圖中可以看到,POST的請求參數從URL轉移到訊息本體當中。因為訊息本體的內容長度沒有限制,所以大量的資料發送都會使用POST方法。而且請求參數移到訊息本體中,因此一些敏感資訊即使長度不長,通常也會採用POST方法發送。




  

2012年7月30日 星期一

URN,URL,URI是什麽

URN、URL和URI是什麽?

介紹URL,URN,URI這三個名詞之前,首先它們的全名分別為:
  • URL  :Uniform Resource Locator
  • URN :Uniform Resource Name
  • URI   :Uniform Resource Identifier

URL
URL的主要目的是透過文字的方式說明網際網路上的資源如何取得。URL的主要格式為:

<協議>:<特定協議部分>

協議指定了以何種方式取得資源,一些比較著名的協議名字有:
  • ftp (檔案傳輸協定)
  • http (超文本傳輸協定)  
  • mailto (電子郵件)
  • file (檔案名稱)
特定協議部分的格式為:

//<使用者>:<密碼>@<主機>:<埠號>/<路徑>

簡單來說URL就是代表資源的位址資訊。

URN
URN是代表某個資源獨一無二的名稱,舉例來說,每一本書都會有一個獨一無二的ISBN碼,現在有一本書的名字是“aaa” ,它的ISBN為『ISBN 111-222-333-444-5』這個ISBN就是URN。

URI
URN 和 URL的目的都是迎來識別某個資源,後來的標準制定了URI,而URN與URL成為URI的子集。如果相對URL、URI與URN的歷史演進與標準發怖更多的了解可參考一下的網址。


參考資料:
  1. Servlet/JSP 教學手冊
  2. www.wikipedia.org


2012年5月5日 星期六

String,StringBuilder和StringBuffer的區別

      在日常開發中串接字串是常有的工作,Java有三種方式處理字串串接分別是String, StringBuilderStringBuffer(JDK1.5 才提供) 這三種都可以達到我們想要的效果,但各自在使用上還是有些區別。

具體看以下的例子講解:
String str = "" ;
for(int i=0 ; i<10000 ; i++)
    str+="java";

相信大家都知道String這個類別是屬於Immutable Object,不知道的可以到Java String和String Pool查看。以這段code來說用迴圈進行大量的串接字串的工作,在效能上會有隱憂。所以Java提供了其他的方法提高效能。

我們為這三個方式做一個小測試。

public class Test {
 public static void main(String args[])
 {
  testString();
  testStringBuffer();
  testStringBuilder();
 }
 
 public static void testString()
 {
  String str = "" ;
  long begin = System.currentTimeMillis();  
  for(int i=0 ; i<10000 ; i++)
   str+="java";
                long end = System.currentTimeMillis();       
                System.out.println("String Spend Time:"+(end-begin)+"ms");
 }
 
 public static void testStringBuffer()
 {
  StringBuffer sbuf = new StringBuffer();
  long begin = System.currentTimeMillis();
  for(int i=0 ; i<10000 ; i++)
   sbuf.append(i);
  long end = System.currentTimeMillis();       
  System.out.println("String Buffer Time:"+(end-begin)+"ms");
 }
 
 public static void testStringBuilder()
 {
  StringBuilder sb = new StringBuilder();
  long begin = System.currentTimeMillis();
  for(int i=0 ; i<10000 ; i++)
      sb.append("java");
         long end = System.currentTimeMillis();  
         System.out.println("String Builder Spend Time:"+(end-begin)+"ms");
 }
 
}

執行結果:






從上面的結果可以看到同樣的工作StringBuilderStringBuffer的處理時間是差不多,但String的處理時間相對於其他兩種方式慢了很多。

在一般情況執行效率StringBuilder>StringBuffer>String,不一定所有情況都是這樣。

String: 適合在少量的字符串操作的情況。
StringBuilder:適合在單線程下進行大量操作的情況
StringBuffer:適合在多線程進行大量操作的情況

在compile的時候可以確定字串的常量,那沒必要使用StringBuilderStringBuffer,直接使用String常量"+"進行連接效率最好。



2012年5月2日 星期三

Java String和String Pool

     在開發Java應用程式當中String是我們常用的一個物件,要理解String的運作方式,首先要知道String是一個Immutable Object

宣告
宣告String有兩種方式 :
String str1 = "abc";
String str2 = new String("abc");
雖然這兩種方式都可以宣告String的物件,但JVM對於這兩種的處理方式是不一樣的。第一種首先會在String Pool中尋找是否存在,如果有就從String Pool回傳該String物件,反之將該常量新增到String Pool中。第二種則會在Heap Memory新增一個物件,而不是String Pool中。

String Pool
String Pool是Java Heap Memory中儲存String的一個區域。當使用常量(literal)方式宣告String物件JVM會從String Pool檢查是否有相同的字串,如果有將會從String Pool回傳該實例,而不會重分配新的記憶體,從而達到節省記憶體的目的。

例子:
String str1 = "abc";
String str2 = "abc";


















使用new關鍵字宣告的方式就會在Heap Memory新增一個字串,而不管該字串是否在String Pool中。
String str3 = new String("abc");
String str4 = new String("abc");

















我們看以下的code就能更加清楚。
public class Test {
 public static void main(String args[])
 {
  String str1 = "abc";
  String str2 = "abc";
  String str3 = new String("abc");
  String str4 = new String("abc");
  
  System.out.println(str1==str2);
  System.out.println(str1==str3);
  System.out.println(str3==str4);
  System.out.println(str1==str3.intern()); 
 }
}

執行的結果是
true
false
false
true

==只能判定兩個instance是否指向同一個記憶體位址(M.A),而不是M.A裡面的內容。從結果可以看出 str1==str2 是true原因是雙方都是指向在String pool裡面同一個M.A,反之str1==str3會是false

雖然str3的內容和str1一樣,但因為宣告方式的不同造成str3不會在String pool裡面尋找,而是直接在Heap memory重新分配新的M.A給str3。str3==str4是false也是M.A的不同。在String有一個方法可以先從String Pool裡面尋找該內容那就是intern()。str1==str3.intern()是true是可以預料的,str3調用intern()方法造成str3指向的M.A會和str1一樣。


2012年4月14日 星期六

Assembly language (Intel-Based) Chapter3 Exercise 1

TITLE Subtract (Subtract.asm)

COMMENT &
Using the AddSub program from Section3.2 as a refresnce, write a program that subtract three integers using only
16-bit registers
&

include Irvine32.inc

.code
main PROC

mov ax,7000h
sub ax,2000h
sub ax,3000h
sub ax,1000h
call DumpRegs
exit
main ENDP
END main

2012年4月12日 星期四

清除float效果

Float 在設計多欄佈局時,是CSS常用的手段。但常常就會遇到的一種情況,就是用來包覆float子元素的父元素無法跟隨float子元素的高度一併延伸:


HTML
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="container">
   <div class="left"></div>
    <div class="right"></div>
</div> 
</html>

CSS
.container{
 margin : 0 auto;
 width: 500px;
 background: red;
 padding: 30px;
}

.left{
 background: black;
 width : 50px;
 height : 300px;
 float :left;
}

.right{
 background: green;
 width : 50px;
 height : 300px;
 float: right;
}


如果我們希望將父元素將全部子元素都包覆在裡面,可以有幾種方法清除float的效果:


使用Clear屬性的空元素
在浮动元素后使用一个空元素如<div class="clearfix"></div>,并在CSS中赋予 .clearfix{clear:both;}属性即可清除浮动。


在浮動元素後面增加<br/>標籤
<br/>吧有自帶的清楚浮動屬性

父級元素定義overflow:auto屬性
.container{
.over-flow{
   overflow: auto; zoom: 1; //zoom: 1; 處理兼容性問題
}
}

2012年4月11日 星期三

CSS float

在設計網頁版型的時候CSS float是大家都常用的屬性,特別是 DIV 區塊的浮動排版更加實用。

CSS float 語法
float : 參數

參數有 left,right和none分別是『向左浮動』,『向右浮動』和『不要浮動』

範例:我們要將兩個div做並排的效果。

HTML
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="box1"></div>
<div class="box2"></div>
</body>
</html>

CSS
.box1{  
    background: green;
    width:250px;  
    height: 50px; 
}

.box2{  
   background: red;
   width:250px;  
   height: 50px;
}

呈現效果如下












在沒有使用float 效果的時候你會發現兩個div是沒辦法並排,因為div屬於區塊元素會將整個瀏覽器盛滿。那我們現在將float :left 加到 CSS 中看會出現什麼效果。

.box1{  
    background: green;
    width:250px;  
    height: 50px; 
    float:left;
}

.box2{  
   background: red;
   width:250px;  
   height: 50px;
   float:left;
}









2012年4月8日 星期日

CSS Box Model

CSS 中有個重要的概念,就是盒子模式 (Box model)主要是用來設計和佈局時使用.  而盒子模型有兩種詮釋方式分別是W3C标准模型 和 IE6的模型。

先看看下面的圖

IE模型




 W3C標準模型


  • Margin(外邊距) - 清除邊框區域。 Margin沒有背景顏色,它是完全透明
  • Border(邊框) - 邊框周圍的填充和內容。邊框是受到盒子的背景顏色影響
  • Padding(內邊距) - 清除內容周圍的區域。會受到框中填充的背景顏色影響
  • Content(內容) - 盒子的內容,顯示圖檔和字


從上面兩張圖中可以看到標準模型和IE模型的差別
  • 標準模型:盒子模型的總寬度在設定width的會分別被padding 和 border影響
  • IE模型:盒子模型的總寬度在設定width的不會被padding 和 border影響

例子: 我們需要設定總寬度為300px的div

在標準模式下設定的時候如果注意如果有設定 padding和 border 都會影響總寬度

div {  
    width:250px;  
    padding:15px;  
    border:10px solid gray;  
} 

300px = 250px+ 30px (padding 左右15px) + 20px(border 左右10px)

在IE模式下寬度的計算方法如下,不會因為設定padding 和 border而影響width 所設定的寬度
div {  
    width:300px;  
    padding:15px;  
    border:10px solid gray;  
} 

300px  =  300px


如果在標準模式下的瀏覽器每次設定寬度的時候都要計算,其實是很麻煩的事情所以在CSS3 提供一個box-sizing 的屬性, 可以讓我們設定成使用IE模型的計算方式。

*{
 box-sizing: border-box; 
 -moz-box-sizing: border-box;  /*Mozila Fox*/
 -webkit-box-sizing: border-box; /*Chrome */
}

有時候為了兼容較舊版本的瀏覽器的時候,且該屬性還沒制訂為標準但各家的瀏覽器已經加入支持就會需要到前綴詞來提前支援新屬性如上面的範例 -moz是火狐webkit 是Safati,Chrome

2012年4月5日 星期四

CSS margin 和 padding

在CSS當中 marginpadding 都是常用來調整邊界的屬性。但也很容易搞混,接下來會透過圖解釋這兩個屬性。
  • margin : 調整邊界 (往外推)
  • padding : 調整內距 (往內推)
例子:我們有一個div,div裡面有一個p段落,

HTML
<!DOCTYPE html>
<html>
<head>
 <link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="container">
   <p>內容</p>
</div>
</body>
</html>

CSS
.container{
 border: 2px solid red;
 width: 300px;
 height: 100px;
}

1) 從瀏覽器看到的結果。


2) 內容太接近邊界,我們希望將內容往右推20px但紅色框不要移動, 這時候我們就要用padding

CSS     
.container{
 border: 2px solid red;
 width: 300px;
 height: 100px;
 padding-left: 20px;
}
















3)  如果我們要移動紅色框,可以使用margin. 舉例我們要將整個紅色框往下調20px;

CSS   
.container{
 border: 2px solid red;
 width: 300px;
 height: 100px;
 padding-left: 20px;
 margin-top : 20px;
}






2012年4月4日 星期三

CSS display 屬性 display:block 與 display:inline


display 是設計 CSS 版面配置中最重要的屬性,每個 HTML 元素都有一個預設的 display 值,不同的元素屬性會有不同的預設值。大部分元素的 display 屬性,預設值通常是 block 或 inline 其中一個

display:block 與 display:inline 的差異
  • display:block - 元素的顯示型態被設定為區塊元素
  • display:inline - 元素的顯示型態被設定為內行元素。


範例:將  <h1> 透過 css 設定display:block屬性 (h1 標籤預設display 屬性也是 block)

HTML
<!DOCTYPE html>
<html>
<head>
 <link rel="stylesheet" href="css/style.css">
</head>
<body>
 <h1>標題一</h1>
 <h1>標題二</h1>
</body>
</html>

CSS 
h1{
 display: block;
}

顯示結果



範例二:將display:block 改成 dispaly:inline


CSS 
h1{
 display: inline;
}


顯示結果