Monday, July 29, 2013

다익스트라 알고리즘이란?

그래프상에서 단일 출발점에서 모든 지점까지의 최단 거리를 구하는 알고리즘이다. 최단거리 알고리즘인 shortest path problem중의 하나이다.


이 알고리즘의 응용범위는?
응용 범위가 넓은 알고리즘 중의 하나로써, 인터넷상에서의 라우팅이나 대중교통을 이용할 경우 환승해서 목적지까지 가는 경로를 탐색할 때 자주 사용된다.

응용될 수 있는 그래프의 구조
다익스트라 알고리즘은 음수의 가중치를 가지지 않는 그래프에서 활용된다.


알고리즘 분석(방법)
1. 거리 값(Distance value)을 설정.
시작 노드의 거리 값은 0으로 , 나머지 노드의 거리 값은 무한대로 초기화 한다.
2. 방문 상태(visit state)를 설정.
시작 노드를 current(현재)상태로, 나머지 노드는 Unvisited(미방문)상태로 초기화 한다.
3. 현재 노드에서 미방문(univisited) 상태의 이웃 노드들에 대해 잠정적인 거리를 계산한다. 예를 들어 현재 노드 A의 거리 값이 6이고, A와 연결된 이웃 노드 B까지의 거리가 2라면, B의 잠정적인 거리는 6 + 2 = 8 이 된다.
3-1. 만약 이 값(8)이 이미 기록되어 있는 잠정적인 거리 값보다 작으면 B의 거리 값을
8로 갱신한다.
3-2. 하지만 잠정적인 거리 값 보다 크면 갱신하지 않고, 같을 경우에는 갱신은 자유이다.
4. 3번과 같은 방법으로 인접하고 있는 모든 이웃노드에 대해서 거리 값을 갱신 하였으면, 가장 작은 거리 값을 가지는 노드를 현재 노드로 갱신하고, 방문(visited)상태로 전환한다.
5. 3번으로 다시 돌아가서 모든 미방문(unvisited) 노드가 방문(visited)상태로 전환될 때까지 3-4을 반복한다.
6. 미방문 상태의 노드가 모두 방문상태로 갱신되면 알고리즘 종료.
다익스트라 알고리즘 진행과정(출발점 s)
c언어 코드


#include<stdio.h>


#define num 6
#define max 99999


void file_read();
void init();
void algo();


FILE *in;
int dis[num][num] = {0, };
int sht[num], state[num], pre[num];
int start, arrive;


void algo(){
int i, j, min, tmp, k;
for(k=start, i=start; k<start+num; k++){
           //k는 단순히 정점의수(6)만큼 반복문을 실행하기 위한 변수.
min = max;
                       //min은 다음 턴에 선택할 노드의 잠정적인 거리값중 최소값을 저장할 변수.


for(j=0; j<num; j++){
if(i != j){
if(state[j] == 0 && dis[i][j] < max){
                                               //미방문 상태이고 i와 인접하고 있는 노드 선택.
if(sht[j] > sht[i] + dis[i][j]){
                                                           // 알고리즘 분석의 3-1번과정
sht[j] = sht[i] + dis[i][j];
pre[j] = i;
                                                                       //노드 j의 거리 값과 pre값을 갱신
                                                                       if(sht[j] < min){
tmp = j;
                              //tmp는 최소값을 가지는 노드의 번호를 임시 저장하는 변수.
min = sht[j];
}
}
else{ // 3-2번 과정
if(sht[j] < min){
tmp = j;
min = sht[j];
}
}
}
}
else // 자기 자신과의 비교는 패스.
continue;
}
state[tmp] = 1; //최소값을 가지는 노드를 방문상태로 바꾼다.
i = tmp; // 최종적으로 최소값을 가지는 노드 번호를 i에 저장한다.  
}
}


void init(){
int i, j;
for(i=0; i<num; i++){
for(j=0; j<num; j++){
fscanf(in, "%d", &dis[i][j]);
if(dis[i][j] == -1)
dis[i][j] = max;
}
}


printf("출발점과 도착점을 입력하십시오 : ");
scanf("%d %d", &start, &arrive);
for(i=0; i<num; i++){
if(i == start){
sht[i] = 0;
state[i] = 1;
pre[i] = 0;
}
else{
sht[i] = max;
state[i] = 0;
pre[i] = max;
}
}
}

void file_read(){
int i, j;
in = fopen("dij_input.txt", "r");


if(in == 0){
perror("File read error\n");
}
}

int main(void){
int i;

file_read();
init();
algo();

for(i=0; i<num; i++)
printf("i = %d, sht= %d,  pre = %d\n", i, sht[i], pre[i]);
printf("노드%d부터 노드%d까지의 최단 거리는 : %d\n", start, arrive, sht[arrive]);
return 0;
}

Thursday, July 25, 2013

리눅스에서 tcp/ip 설정 확인


동작하고 있지 않은 인터페이스의 설정까지 표시
/sbin/ifconfig

IP 주소를 새롭게 할당하는 방법.
/sbin/ifconfig [인터페이스 명] [새로운 아이피 주소] netmask [새로운 넷 마스트] broadcast [새로운 브로드캐스팅 주소]
예 -> /sbin/config eth0 192.168.1.200 netmask 255.255.255.0 broadcast 192.168.1.255

상대 호스트까지의 경로를 조사하는 방법
traceroute [호스트 명]
traceroute www.google.com

라우팅 정보를 표시
netstat -r 

네트워크 인터페이스에 관한 정보를 표시
netstat -i 

dns 정보를 확인
dig [호스트 명]

NAT ( Network Address Translation )

1.개요

  - 로컬 네트워크 내부에서만 사용할 수 있는 주소인 로컬 IP 주소(사설 IP 주소)를 할당받은    호스트가 인터넷을 경유해서 외부 호스트랑 통신을 하기 위해서는 로컬 IP 주소를 인터넷에서 사용할 수 있는 글로벌 IP 주소로 변환할 필요가 있다. 그래서 생각해 낸 구조가 바로 NAT다. NAT는 로컬 IP 주소를 가진 호스트가 마치 글로벌 IP 줏를 가진 것처럼 행동하기 위한 라우터의 기능이다.

2. 사설IP 주소

CLASS          주소 영역
    A      10.0.0.0 ~ 10.255.255.255
    B      172.16.0.0 ~ 172.16.255.255
    C      192.168.0.0 ~ 192.168.255.255

3. NAT설정에 따른 분류

1) Dynamic NAT

  - 내부 네트워크에 있는 호스트가 외부로 통신을 시도하면, 먼저 address pool에서 사용 가능한 주소를 동적으로 연결(Mapping)하여 외부로 나간다.
address pool : 사용할 수 있는 글로벌 ip의 집합

2) Static NAT

  - 정적 NAT는 글로벌 주소로 들어온 요청을 내부 서버로 전달 될 수 있도록 목적지 주소를 변환하는 기능이다.
  - 로컬과 글로벌 주소들은 정적으로 1 : 1 로 매핑된다.
  - 고정IP를 할당하는 것처럼 항상 똑같은 주소로 할당하므로 외부에서 IP를 물고 들어 올 수 있다.

4. IP 마스커레이드(IP Masquerade)

  동적 NAT를 사용한다 하여도 글로벌 IP 주소가 여러 개 필요하게 된다. 하지만 포트 번호도 같이 변환해주게 되면 글로벌 IP 하나로도 내부 네트워크의 복수의 호스트가 동시에 인터넷에 접속하는 것이 가능해 진다. 이런 기술을 바로 IP 마스커레이드 혹은 NAPT(Network Address and Port Translation)라고 부른다. 하나의 글로벌 주소당 65535개의 구분된 동시 연결을 하는 것이 가능하다. 모든 NAT는 이 기술을 이용하기 때문에 NAT라고만 말해도 NAPT와 차이가 없다.

  그리고 라우터에 포트 포워딩이라는 기술을 내장시켜 놓은 것을 버츄얼 서버 혹은 정적 IP 마스커레이드 라고 부른다. 이 기능은 특정 포트 번호에 전송된 데이터를 미리 지정한 로컬 네트워크 내의 호스트에 전송하는 기능이다.

Sunday, July 21, 2013

MySql 구문들

From Evernote:

MySql 구문들


JOIN - 두개 혹은 그 이상의 테이블에서 특정한 컬럼들 간의 관계에 기초해서 데이터를 질의하기 위해 사용된다.

INNER JOIN - 양쪽 테이블에서 최소한 한개라도 매치되는 게 있으면 해당 열을 리턴한다.
LEFT JOIN - 오른쪽 테이블과 매치되는 것이 없어도 왼쪽 테이블의 모든 열을 리턴한다.
RIGHT JOIN - 왼쪽 테이블과 매치되는 것이 없어도 오른쪽 테이블의 모든 열을 리턴한다.
FULL JOIN - 양쪽 테이블의 모든 열을 리턴한다(매치 여부 관계 없음)

UNION - 두개 혹은 이 상의 select 문으로 생성되는 result-set을 결합하기 위해 사용한다.

UNION - 중복되는 결과는 출력하지 않도록 디폴트 설정되어 있다.
UNION ALL - 중복되는 결과까지 모두 출력

SELECT INTO - 하나의 테이블로부터 데이터를 선택하고 그것을 다른 테이블에 삽입하기 위해
사용된다.(테이블을 백업하기 위해 자주 사용된다.)

Constraints - 테이블안에 들어갈 데이터의 타입을 제한하기 위해 사용되는데 여러가지 종류가 있다.

NOT NULL - 디폴트로써 보통 데이터의 칼럼을 NULL 값을 가질 수 있는데, NOT NULL 제약을
입력하면 해당 칼럼은 NULL 값을 가질 수 없게 된다.
UNIQUE - 데이터 베이스 테이블에서 각각의 레코드들이 서로 다른 값을 가지도록 한다.
테이블당 몇번이고 제약을 둘 수 있다.(제약은 테이블을 만들 때도 가능하지만,
이미 만들어진 테이블에도 가능하다.)
PRIMARY KEY - 데이터 베이스 테이블에서 각각의 레코드들이 서로 다른 값을 가지도록
한다. 하나의 테이블에서 primary key는 하나이다.
FOREIGN KEY - 어느 테이블에서의 외래키는 다른 테이블의 primary key를 가리킨다.
테이블간의 링크가 파괴되는 것을 보호하기 위해서 사용된다.
CHECK - 칼럼에 들어갈 값의 범위를 제한하기 위해 사용된다.
DEFAULT - 칼럼에 디폴트 값을 입력하기 위해 사용된다. 데이터를 입력시, 어떤 값도 입력
하지 않으면 디폴트값이 설정된다.

CREATE INDEX - 테이블에 인덱스를 생성하기 위해 사용된다. 인덱스는 데이터 검색을
빠르게 해준다. 설정해 놓아도 유저에게는 보이지 않는다.


TRUNCATE TABLE - 테이블 안에 데이터를 전부 지우기 위해 사용된다.

AUTO INCREMENT - 테이블에 새로운 레코드를 삽입할 때 유일한 값이 생성되도록 한다.
PRIMARY KEY와 함께 자주 설정한다.


VIEW - 데이터베이스에서 view란 result-set 을 기반으로 생성되는 가상의 테이블을 의미한다.


DATE - 데이터베이스에서는 날짜를 표시하기 위해 여러가지 함수가 존재한다.
그리고 DATE 데이터형 또한 존재한다. (http://www.w3schools.com/sql/sql_dates.asp)
DATE - YYYY-MM-DD
DATETIME - YYYY-MM-DD- HH:MM:SS
TIMESTAMP - YYYY-MM-DD HH:MM:SS
YEAR - YYYY or YY

NULL - SQL에서 NULL이란 입력되지 않은 상태의 알려지지 않은 값을 의미한다.
NULL과 숫자 0은 다르다.

IFNULL - 레코드로써 NULL이 들어 있을 경우, 어떤 값으로 처리할지를 설정할 때 사용된다.
다른 데이터베이스에서는 ISNULL 혹은 NVL 이라 불리운다.

(참고)데이터 타입의 종류에 대해서 알아보기
http://www.w3schools.com/sql/sql_datatypes.asp


Friday, July 19, 2013

HTTP Request와 response, 실제 HTML파일과 JSP파일에서의 적용


HTTP 프로토콜
HyperText Transfer Protocl  www(World Wide Web)으로 접속하는 통신 수단이고 오늘날의 웹에 적용해서 사용되고 있습니다. 정적인 페이지에서 동적인 페이지로 만들기위해 발전되었고 복잡하고 웹 애플리케이션을 지원하기 위하여 만들어진 프로토콜입니다. HTTP는 고객이 Request를 보낸 메시지에 근거한 모델을 사용합니다. 그리고 서버는 Response를 돌려줍니다. 덧붙여 HTTP 필터가 가끔 사용자들에게 돌아가는 경우도 있다. 예를 들어 서버에서 발생한 오류 코드들을 브라우저로 보여줄 때가 있다.



HTTP Request(웹 브라우져로부터)

웹 브라우져는 웹 서버와 접속이 확립되면 다음과 같은 요구를 보낸다. 
다음은 전형적인 HTTP request 구조이다.

리퀘스트 행
헤더
공백
본문(본문은 작성하지 않는 경우도 있다. )

다음은 전형적인 http request의 내용이다.


GET /books/search.asp HTTP/1.1             
Accept: image/gif, image/xxbitmap, image/jpeg, image/pjpeg,
application/xshockwaveflash, application/vnd.msexcel,
application/vnd.mspowerpoint, application/msword, */*
Referer: http://wahh-app.com/books/default.asp
Accept-Language: en-gb,en-us;q=0.5
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
Host: wahh-app.com
Cookie: lang=en; JSESSIONID=0000tI8rk7joMx44S2Uu85nSWc_:vsnlc502
(
                           공백행                               )


각각의 구조에 대해서 설명한다. 

리퀘스트 행과 메소드
request의 첫번째 행의 다음과 같이 이루어져 있다. 
GET /books/search.asp HTTP/1.1
메소드 URI http버전
GET 메소드를 이용하여 search.asp라는 문서를 요청하며, 이 때 HTTP1.1버전을 사용한다.

메소드란?
서버에게 사용자의 목적을 알리는 역할을 하는데, HTTP에서는 미리 정의 된 GET, HEAD, POST가 있다. 물론 다른 메소드도 지원하지만 현재 서버에서 폭넓게 지원하지는 않는다. 참고로 메소드는 대소문자를 구분한다. 그 예로는 다음과 같다.

GET 
URI의 내용을 취득하는 메소드로써, 웹 브라우저가 문서를 받아 보는데 사용되는 일반적인 방법이다. 사용자가 GET 메소드를 사용하여 요청할 때, 서버는 상태 표시줄, 헤더, 요청된 데이터로 응답한다. 서버에서 오류가 발생하거나 권한이 아닌 상태로 인해 요청을 진행시킬수 없다면 서버는 적절한 오류 메세지를 보낸다. 

HEAD
URI의 내용 중에 헤더 부분을 취득하는 메소드이다. 클라이언트는 다음과 같은 정보를 원한다.
 - 캐시 관련 질의에 유용한 문서의 수정 시간
 - 도착 시간을 측정하거나 문서의 더 작은 버전을 요청을 결정하는 페이지
 레이아웃에 유용한 문서의 크기
 - 클라이언트가 특정 문서만 검색할 수 있도록 해주는 문서의 유형
 - 주문형 서버 질의를 가능하게 하는 서버의 유형
서버가 제공하는 헤더 정보의 대부분은 선택적이며 모든 서버들이 제공하는 것은 아니다. 또한 클라이언트에게 유익한 설계는 요구하는 헤더 정보를 서버가 전달하지 못할 경우, 서버가 융통성 있게 응답하고 기본적인 조치를 취하도록 하는것이다.

POST
URI에 정보를 송신하는 메소드이다. POST 메소드는 다음과 같은 애플리케이션에서 사용될 수 있다. 
- 글을 올릴수 있는 네트워크 서비스
- 명령행에서 실행되는 프로그램
- 서버에 있는 문서의 주석
- 데이터베이스 조작

기타 메소드들에는 LINK, UNLINK, PUT, DELETE, OPTIONS, TRACE, CONNECT 등이 있다.

헤더 부분
통신의 부가정보(메타정보)가 포함되어 있다. 복수의 헤더를 붙이는 것도 가능하다.

호스트명
어떤 이름의 호스트에 액세스 할 것인지를 지정한다. HTTP1.1에서 필수로 바뀌었다. 

User-Agent
웹 서버에 액세스 하고 있는 웹 브라우저의 명칭이 표시된다. 

공백 부분 
헤더의 끝을 알리기 위해 공백 행을 추가한다.




HTTP Response(HTTP 응답)
웹 서버는 웹 브라우저로부터 요구를 받은 뒤, 다음과 같은 응답을 돌려준다.
다음은 전형적인 응답의 구조이다.

STATUS(상태) 행
헤더
공백
본문


다음은 전형적인 응답의 내용이다.


HTTP/1.1 200 OK

Date: Sat, 19 May 2007 13:49:37 GMT
Server: IBM_HTTP_SERVER/1.3.26.2 Apache/1.3.26 (Unix)
Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-US
Content-Length: 24246

(                                공백행                                    )


각각의 구조에 대해서 설명한다.

상태 행 
응답 메세지의 첫번째 행은 다음과 같이 이루어져 있다.

HTTP/1.1 200 OK
http버전 상태 코드 설명문
HTTP버전은 서버가 응답하기 위해 사용하는 HTTP의 버전을 나타내며, 상태코드는 사용자가 요청한 서버의 결과를 나타내는 세자리 숫자이다. 설명문은 우리들이 이해할 수 있는 텍스트로 되어있다.

상태코드란?
서버의 결과를 알기 쉽게 숫자로 나타낸 것이다. 그 예로는 다음과 같은 숫자들이 사용되고 있다.

코드 범위
응답의 의미
100 ~ 199
200 ~ 299
300 ~ 399
400 ~ 499
500 ~ 599
정보
클라이언트의 요청이 성공적이다.
다른 동작이 더 필요해 클라이언트의 요청을 리다이렉트 했다.
클라이언트의 요청이 불완전하다.
서버오류

100 ~199 정보 응답
100 Continue
요청된 초기 부분은 접수되었고 클라이언트는 계속해서 요청할 수 있다.
101 Switching Protocols
서버는 Upgrade 헤더 필드에 명시된 프로토콜로 교환하기 위한 클라이언트 요청에 따르고 있다.

200~299 클라이언트 요청의 성공 응답
200-299의 범위에 있는 응답은 클라이언트의 요청이 성공적이었다는 것을 의미한다.

200 OK
클라이언트의요청이성공적이였으며, 서버는요청한데이터를포함하여응답한다.
201 Created
이 상태 코드는 새로운 URI가 만들어질 때마다 사용된다. 결과 코드와 함께 새로운 데이터가 위치한 곳을 지정하기 위해 Location 헤더가 서버에 의해 주어진다.
202 Accepted
요청은 받아들여 졌지만 즉시 실행되지는 않는다. 트랜잭션에 대한 심층 정보가 서버 응답의 엔티티 몸체에서 주어지기도 한다. 주의할 점은 요청이 정당한 것처럼 보였을 수도 있지만 서버가 요청을 실제로 승인하리라는 보장은 없다는 것이다.
203 Non-Authoritative Information
엔티티 헤더에 있는 정보는 원래 서버가 아니라 로컬이나 다른 서버로부터 온다.
204 No Content
이 코드는 응답할 때 주어지는 헤더이다. 그러나 응답된 실제 내용은 없다는 뜻이다. 이런 응답을 받는 이유는 웹 브라우저가 문서를 보기 위해 갱신을 하지 않았기 때문이다. 이미지맵에서 클라이언트가 이미지의 영역 중 사용하지 않거나 공백인 부분을 클릭했을 때를 처리할 때 유용하다.
205 Reset Content
웹 브라우저가 추가적인 입력을 위해 사용된 트랜잭션을 지우는 것이다. CGI 애플리케이션에서 데이터를 입력받을 때 적합하다.
206 Partial Content
서버가 요청된 크기의 부분 데이터를 반환하고 있다. Range 헤더 지정 요청에 응답하는 데 이용된다. 서버는 반드시 Content-Range 헤더와 응답에 포함된 범위를 지정해야 한다.

300~399 리다이렉션
300~399 범위에 있는 응답 코드는 요청이 수행되지 않았다는 것을 나타내며, 클라이언트는 요청을 성공시키기 위해 다른 행위가 필요하다는 것을 나타낸다.

300 Multiple Choices
요청된 URI는 하나 이상의 리소스를 참조한다. 예를 들면, URI는 여러 개의 언어로 변환된 문서를 참조할 수 있다. 서버에 의해 반환된 엔티티 몸체는 올바른 리소스를선택하는 방법에 대한좀 더 특정한 데이터의 목록을 가지고 있을수 있다.
301 Moved Permanently
요청된 URI는 더 이상 사용되지 않으며 요청에서 지정한 연산은 수행되지 않았다. 요청된 문서를 위한 새로운 위치는 Location 헤더에 명시한다. 앞으로 요청될 모든 문서는 새로운 URI를 사용할 것이다.
302 Found
요청된 URI는 일시적으로 새로운 URI를 가진다. Location 헤더는 새로운 장소를 가리킨다. 만일 이것이 GET이나 HEAD 메소드에 대한 응답이라면 클라이언트는 응답을 받자마자 요청을 해결하기 위해 새로운 URI를 사용해야 한다.
303 See Other
요청된 URI는 다른 URI(Location 헤더에 명시한)에서 찾을 수 있으며, 리소스는 GET 메소드로 구할 수 있다.
304 Not Modified
이것은 If-Modified-Since 헤더에 대한 응답 코드로써 지정한 날짜 이래로 수정되지 않았다. 엔티티 몸체는 보내지 않으며, 클라이언트는 자신의 로컬 사본을 사용해야 한다.
305 Use Proxy
요청된 URI Location 헤더에 있는 프록시를 통해서만 접근할 수 있다.
307 Temporary Redirect
요청된 URI가 일시적으로 옮겨졌다. Location 헤더가 새로운 장소를 가리킨다. 이 상태 코드를 받는 즉시, 클라이언트는 요청을 해결하기 위해 새로운 URI를 사용해야 하지만, 앞으로 모든 요청들은 이전의 URI를 사용할 것이다.

400~499 클라이언트 요청의 불안전 응답
400~499 범위에 있는 응답 코드는 클라이언트의 요청이 불안전하며, 클라이언트가 요청을 성공시키려면 다른 정보가 필요하다는 것을 나타낸다.

400 Bad Request
이 응답 코드는 클라이언트의 요청에 문법적인 오류가 있는 것을 서버가 알아냈다는 것을 의미한다.
401 Unauthorized
이 결과 코드는 WWW-Authenticate 헤더와 함께 그 요청에 적당한 권한이 부족했다는 것을 나타내기 위해 주어지며,  URI를 다시 요구하면 클라이언트는 적당한 권한으로 접속해야 한다.
402 Payment Required
이 코드는 아직 HTTP로 구현되지 않았다. 하지만 언젠가는 서버의 문서를 받아 보기 위해 지불이 필요하다는 것을 나타낸다.
403 Forbidden
이 요청은 서버가 클라이언트를 가리키고 싶어하지 않아(또는 아무 이유 없이) 거부되었다.
404 Not Found
지정한 URI에 문서가 존재하지 않는다.
405 Method Not Allowed
이 코드는 Allow 헤더와 함께 클라이언트가 사용한 메소드가 이 URI에 대해 지원되지 않는다는 의미이다.
406 Not Acceptable
클라이언트가 지정한 URI는 존재하지만 클라이언트가 원하는 형식이 아니다.서버는 Content-Language, Content-Encoding, 그리고 Content-Type 헤더를 제공한다.
407 Proxy Authentication Required
프록시 서버는 요청된 문서를 보여주기 전에 권한을 필요로 한다. Proxy-Authenticate헤더와 함께 사용한다.
408 Request Time-out
이 응답 코드는 클라이언트의 모든 요청이 지정한 시간(일반적으로 서버의 구성할때 명시한다) 동안 처리되지 않았음을 뜻하며, 서버는 네트워크 연결을 끊는다.
409 Conflict
이 코드는 다른 요청이나 서버의 구성과 충돌이 있음을 나타낸다. 충돌에대한 정보는 응답되는 데이터의 일부로 반환된다.
410 Gone
이 코드는 요청된 URI가 더 이상 존재하지 않고, 서버에서 완전히 사라졌음을 나타낸다.
411 Length Required
서버는Content-Length 헤더가 없는 요청을 받아들이지 않는다.
412 Precondition Failed
하나 이상의 If…헤더에 의해 명시된 조건에 의해 요청을 평가하여 false 값을 가지는 경우이다.
  413 Request Entity Too Large
서버는 실제 본문이 너무 커서 요청을 처리할 수 없다.
  414 Request-URI Too Long
서버는 요청된 URI가 너무 커서 요청을 처리할 수 없다.
 415 Unsupported Media Type
서버는 실제 본문이 지원되는 않는 형식이라 처리할 수 없다.
 416 Requested Range Not Satisfiable
서버는 목표에 대해 어떤 유효한 값도 포함하지 않은 Range 헤더를 찾아냈다. 가로 If-Range 헤더는 없어졌다.
  417 Expectation Failed
Expect 헤더에서 명시된 조건은 만족될 수 없다.

500~599서버 오류
500~599 범위에 있는 응답 코드는 서버가 오류를 만나거나, 클라이언트의 요청을 수행할 수 없음을 나타낸다.

500 Internal Server Error
이 코드는 서버의 일부(예를 들면, CGI 프로그램)가 멈추었거나 설정에서 오류가 났음을 나타낸다.
501 Not Implemented
이 코드는 클라이언트의 요청된 행위가 서버에서 수행할 수 없음을 나타낸다.
502 Bad Gateway
이 코드는 서버(또는 프록시)가 다른 서버(또는 프록시)로부터의 응답이 적절하지 않음을 나타낸다.
503 Service Unavailable
이 코드는 서비스를 일시적으로 제공할 수 없으나, 앞으로 복구된다는 의미이다.만일 서버가 복구될 때를 알기 위해서는 Retry-After 헤더도 함께 제공해야 한다.
504 Gateway Time-out
이 응답은 게이트웨이나 프록시의 시간이 경과했다는 것만 빼고는 408(Request Time-out)과 같다.
505 HTTP Version not supported
서버가 요청에 사용된HTTP 프로토콜 버전을 지원하지 않는다.

헤더 부분
서버로부터의 응답의 본문은 HTML 문장이지만, 본문 앞에 헤더 부분이 붙여진다.

ETag 
Entity Tag의 줄임말으로써, 본문의 내용을 식별하기 위한 ID같은 역할을 하는 문자열이다. 해당 자원이 업데이트 되기 전에는 결코 변하지 않는 값이다.
Last-Modified
본문에 적혀있는 웹 페이지가 마지막으로 경신된 날짜를 표시한다.
Content-Type
본문에 적혀있는 것이 어떤 종류의 문서인가를 표시한다. 
Content-Length
본문의 사이즈를 나타낸다.
Date
응답을 돌려준 날짜를 나타낸다.
Server
서버로써 사용하고 있는 소프트웨어의 이름을 나타낸다. 

웹 브라우저의 동작
HTTP의 요구와 응답은 페어로 이루어져 있다. 즉, 1회 요구를 전송하면 1개의 파일밖에 취득하지 못한다. 그러나 웹 페이지에는 1개의 HTML 파일 뿐 만이 아니라 복수의 영상 파일이 포함되어 있는 경우가 있다. 그리고 프레임을 사용한 웹 페이지에는 복수의 HTML 파일이 포함되어 있다. 웹 브라우저는 처음에 취득한 HTML 파일을 분석해서 만약 <img> 태그를 발견하면 그 영상 파일을 취득하기 위한 요구를 전송한다. 이러한 식으로 리퀘스트를 반복해서 1개의 웹 페이지를 완성한다. 


폼에서의 입력과 POST, GET 메소드
HTML 폼(doGet.html)
서치 엔진이나 게시판의 사이트에서는, 유저의 입력에 반응해서 웹 페이지가 변화한다. 이런 사이트에서는 HTML 폼을 이용해서 유저로부터 입력을 받는다. 폼에서 이름을 입력받고, 그 데이터를 그대로 출력하는 예를 보이겠다. HTML 문서이다.


<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content= "text/html; charset=UTF-8" >
<title> do Get Method</title >
</head>
<body>
                 <p> Input the name : </p >
                 <form method="post" action="Ex_Request.jsp" >
                                 <p> Family name : <input type="text" name="familyName"></ p>
                                 <p> Given name : <input type="text" name="givenName"></ p>
                
                                 <input type="submit" value="Submit">
                                 <input type="reset" value="Cancel">
                 </form>
</body>
</html>



위의 코드의 결과 화면은 다음과 같다.


성을 입력하는 곳에 입력된 문자열은 input태그의 name 속성의 값인 familyName 이라는 파라메터에 저장된다. 이름 또한 마찬가지로 givenName 이라는 파라메터에 저장된다. 폼으로부터 입력되는 데이터는 HTTP의 POST 메소드나 GET 메소드를 이용해 그 데이터를 처리하는 프로그램에 전해진다.  


POST 이용
POST 메소드를 이용해 데이터를 송신할 경우에는, HTML의 form 태그에서 method 속성에 post 라는 문자를 이용해 지정한다.


<form method="post" action="request.jsp">
  .....
  .....
</form>

POST 메소드를 이용하는 경우에는 request 의 구조 중 본문에 문자열이 들어간다. 위의 HTML 문서의 경우에서 만약 성에 kim, 이름에 lee 를 입력했을 경우 본문의 내용은 다음과 같다.

familyName=kim&givenName=lee

이 문자열을 쿼리라고 부른다. 이러한 POST 메소드는, 쿼리를 request의 본문에 넣어서 데이터를 송신한다. 


GET 이용
GET 메소드를 사용해 데이터를 송신할 경우에는, HTML의 form 태그에서 method 속성을 get 이라고 써주기만 하면 된다.


<form method="get" action="request.jsp">
  .....
  .....
</form>

GET 메소드를 이용하는 경우에는 request 메세지에 POST 와는 달리 본문에는 아무것도 적히지 않고 리퀘스트 행에 파라메타가 포함된다. 

GET /request.jsp?familyName=kim&givenName=lee HTTP/1.1

리퀘스트 행이 위와 같이 변한다. 위의 HTML 과 같은 경우에는 POST, GET 둘 중의 결과는 같다. 


GET과 POST의 구분
 일단, GET과 POST는 쿼리를 송신하는 방법이 다르다. 많은 경우, POST 메소드를 이용하는 것이 좋다. GET 메소드는 송신 가능한 쿼리의 사이즈에 제한이 있기 때문이다. 또한 유저명과 패스워드를 입력하게 하는 경우, GET 메소드는 URI 중에 패스워드를 표시해 버리는 단점이 있기 때문에, POST 메소드를 이용하는 것이 좋다. 게다가 GET 메소드는 입력된 데이터의 개행을 전달할 수 없다. 그러므로 게시판과 같은 목적으로는 사용할 수가 없다. 
 하지만, GET 메소드를 이용하는 것이 좋은 경우도 있다. 예를 들어, 구글이나 상품 데이터베이스 등의 검색 결과를 북마크에 등록하거나, 링크를 걸 것으로 예상되는 경우에는, GET 메소드를 사용해야 한다. GET 메소드는 쿼리가 URI에 포함되므로 나중에 참고하는 것이 가능하다. 하지만 POST 메소드를 본문에 쿼리가 포함되므로, 나중에 참고하는 것이 불가능하다. 


JSP에서의 요구, 응답의 처리
request 변수와 response 변수

JSP에서는, 웹 브라우저 로부터의 요구를 처리하기 위해서 reqeus 라는 변수를 사용한다. 그리고 웹 서버 로부터의 응답을 처리하기 위해서는 reponse 라는 변수를 사용한다.
일단 밑의 코드와 같이 reqeust를 이용해서 리퀘스트 행과 헤더의 내용을 표시할 수 있다. 


<!DOCTYPE html >
<html>
<head>
<title> handle request</title >
</head>
<body>

<% request.setCharacterEncoding("UTF-8" ); %>
<ul>
                 <li> Method: <%= request.getMethod() %> </ li>
                 <li> Request URI: <%= request.getRequestURI() %> </ li>
                 <li> Protocol: <%= request.getProtocol() %> </ li>
                 <li> Remote Address: <%= request.getRemoteAddr() %> </ li>
</ul>
</body>
</html>



쿼리의 처리(Ex_Request.jsp)
JSP는 GET의 경우에도 POST의 경우에도 request 변수를 사용해서 쿼리중의 파라메터의 값을 취득할 수 있다. 위의 HTML 문서에서 값을 입력한 뒤, 제출 버튼을 누르면 그것을 처리하는 JSP 코드를 살펴보자. 


<!DOCTYPE html >
<html>
<head>
<title> request process</title >
</head>
<body>
                 <% request.setCharacterEncoding("UTF-8" ); %>
                
                 <p>
                                Family name:
                                 <%= request.getParameter("familyName" ) %>
                 </p>
                 <p>
                                Given name:
                                 <%= request.getParameter("givenName" ) %>
                 </p>
</body>
</html>


request.getParameter 의 인수로 HTML 에서 쓰인 파라메터의 이름을 적으면 된다. 위의 코드의 결과는 다음과 같다. 



뉴라이트의 기본적인 개념과 특징

뉴라이트  한국에서 자칭 신우익을 이르는 말. 영어의 신(new) + 우익(right)의 합성어이다.  옛날 종북주의자 시절의 파시즘과 전체주의적 사상을 간직한 채 친일반민족 행위 옹호로 돌아선 사람들이다.  우파를 가장한 짝퉁 우파...