2016년 3월 29일 화요일

HTTP 상태 코드

== 1xx (조건부 응답) ==
요청을 받았으며 작업을 계속한다.

이 상태의 상태 코드는 상태-라인과 선택적 헤더(컴퓨터에서 출력될 때 각 페이지 맨 윗부분에 자동으로 붙는 부분)만을 포함하는 임시의 응답을 나타내고 빈 라인에 의해서 종결된다. HTTP/1.0이래로 어떤 1XX 상태 코드들도 정의 되지 않았다. 서버들은 1XX 응답을 실험적인 상태를 제외하고 HTTP/1.0 클라이언트(서버에 연결된 컴퓨터)로 보내면 안 된다.
* 100(계속): 요청자는 요청을 계속해야 한다. 서버는 이 코드를 제공하여 요청의 첫 번째 부분을 받았으며 나머지를 기다리고 있음을 나타낸다.
* 101(프로토콜 전환): 요청자가 서버에 프로토콜 전환을 요청했으며 서버는 이를 승인하는 중이다.
* 102(처리, RFC 2518)

== 2xx (성공) ==
이 클래스의 상태 코드는 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리했음을 가리킨다.
* 200(성공): 서버가 요청을 제대로 처리했다는 뜻이다. 이는 주로 서버가 요청한 페이지를 제공했다는 의미로 쓰인다.
* 201(작성됨): 성공적으로 요청되었으며 서버가 새 리소스를 작성했다.
* 202(허용됨): 서버가 요청을 접수했지만 아직 처리하지 않았다.
* 203(신뢰할 수 없는 정보): 서버가 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공하고 있다.
* 204(콘텐츠 없음): 서버가 요청을 성공적으로 처리했지만 콘텐츠를 제공하지 않는다.
* 205(콘텐츠 재설정): 서버가 요청을 성공적으로 처리했지만 콘텐츠를 표시하지 않는다. 204 응답과 달리 이 응답은 요청자가 문서 보기를 재설정할 것을 요구한다(예: 새 입력을 위한 양식 비우기).
* 206(일부 콘텐츠): 서버가 GET 요청의 일부만 성공적으로 처리했다.
* 207(다중 상태, RFC 4918)
* 208(이미 보고됨, RFC 5842)
* 226 IM Used (RFC 3229)

== 3xx (리다이렉션 완료) ==
클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.<ref name="RFC_2616"/>
* 300(여러 선택항목): 서버가 요청에 따라 여러 조치를 선택할 수 있다. 서버가 사용자 에이전트에 따라 수행할 작업을 선택하거나, 요청자가 선택할 수 있는 작업 목록을 제공한다.
* [[HTTP 301|301]](영구 이동): 요청한 페이지를 새 위치로 영구적으로 이동했다. GET 또는 HEAD 요청에 대한 응답으로 이 응답을 표시하면 요청자가 자동으로 새 위치로 전달된다.
* [[HTTP 302|302]](임시 이동): 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.
* [[HTTP 303|303]](기타 위치 보기): 요청자가 다른 위치에 별도의 GET 요청을 하여 응답을 검색할 경우 서버는 이 코드를 표시한다. HEAD 요청 이외의 모든 요청을 다른 위치로 자동으로 전달한다.
* 304(수정되지 않음): 마지막 요청 이후 요청한 페이지는 수정되지 않았다. 서버가 이 응답을 표시하면 페이지의 콘텐츠를 표시하지 않는다. 요청자가 마지막으로 페이지를 요청한 후 페이지가 변경되지 않으면 이 응답(If-Modified-Since HTTP 헤더라고 함)을 표시하도록 서버를 구성해야 한다.
* 305(프록시 사용): 요청자는 프록시를 사용하여 요청한 페이지만 액세스할 수 있다. 서버가 이 응답을 표시하면 요청자가 사용할 프록시를 가리키는 것이기도 하다.
* 307(임시 리다이렉션): 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.
* 308(영구 리다이렉션, RFC에서 실험적으로 승인됨)

== 4xx (요청 오류) ==
4xx 클래스의 상태 코드는 클라이언트에 오류가 있음을 나타낸다.
* 400(잘못된 요청): 서버가 요청의 구문을 인식하지 못했다.
* 401(권한 없음): 이 요청은 인증이 필요하다. 서버는 로그인이 필요한 페이지에 대해 이 요청을 제공할 수 있다.
* [[HTTP 403|403]](금지됨): 서버가 요청을 거부하고 있다.
* [[HTTP 404|404]](찾을 수 없음): 서버가 요청한 페이지를 찾을 수 없다. 예를 들어 서버에 존재하지 않는 페이지에 대한 요청이 있을 경우 서버는 이 코드를 제공한다.
* 405(허용되지 않는 방법): 요청에 지정된 방법을 사용할 수 없다.
* 406(허용되지 않음): 요청한 페이지가 요청한 콘텐츠 특성으로 응답할 수 없다.
* 407(프록시 인증 필요): 이 상태 코드는 401(권한 없음)과 비슷하지만 요청자가 프록시를 사용하여 인증해야 한다. 서버가 이 응답을 표시하면 요청자가 사용할 프록시를 가리키는 것이기도 한다.
* 408(요청 시간초과): 서버의 요청 대기가 시간을 초과하였다.
* 409(충돌): 서버가 요청을 수행하는 중에 충돌이 발생했다. 서버는 응답할 때 충돌에 대한 정보를 포함해야 한다. 서버는 PUT 요청과 충돌하는 PUT 요청에 대한 응답으로 이 코드를 요청 간 차이점 목록과 함께 표시해야 한다.
* 410(사라짐): 서버는 요청한 리소스가 영구적으로 삭제되었을 때 이 응답을 표시한다. 404(찾을 수 없음) 코드와 비슷하며 이전에 있었지만 더 이상 존재하지 않는 리소스에 대해 404 대신 사용하기도 한다. 리소스가 영구적으로 이동된 경우 301을 사용하여 리소스의 새 위치를 지정해야 한다.
* 411(길이 필요): 서버는 유효한 콘텐츠 길이 헤더 입력란 없이는 요청을 수락하지 않는다.
* 412(사전조건 실패): 서버가 요청자가 요청 시 부과한 사전조건을 만족하지 않는다.
* 413(요청 속성이 너무 큼): 요청이 너무 커서 서버가 처리할 수 없다.
* 414(요청 URI가 너무 긺): 요청 URI(일반적으로 URL)가 너무 길어 서버가 처리할 수 없다.
* 415(지원되지 않는 미디어 유형): 요청이 요청한 페이지에서 지원하지 않는 형식으로 되어 있다.
* 416(처리할 수 없는 요청범위): 요청이 페이지에서 처리할 수 없는 범위에 해당되는 경우 서버는 이 상태 코드를 표시한다.
* 417(예상 실패): 서버는 Expect 요청 헤더 입력란의 요구사항을 만족할 수 없다.
* 418(I'm a teapot, RFC 2324)
* 420(Enhance Your Calm, 트위터)
* 422(처리할 수 없는 엔티티, WebDAV; RFC 4918)
* 423(잠김,WebDAV; RFC 4918)
* 424(실패된 의존성, WebDAV; RFC 4918)
* 424(메쏘드 실패, WebDAV)
* 425(정렬되지 않은 컬렉션, 인터넷 초안)
* 426(업그레이드 필요, RFC 2817)
* 428(전제조건 필요, RFC 6585)
* 429(너무 많은 요청, RFC 6585)
* 431(요청 헤더 필드가 너무 큼, RFC 6585)
* 444(응답 없음, Nginx)
* 449(다시 시도, 마이크로소프트)
* 450(윈도 자녀 보호에 의해 차단됨, 마이크로소프트)
* 451(법적인 이유로 이용 불가, 인터넷 초안)
* 451(리다이렉션, 마이크로소프트)
* 494(요청 헤더가 너무 큼, Nginx)
* 495(Cert 오류, Nginx)
* 496(Cert 없음, Nginx)
* 497(HTTP to HTTPS, Nginx)
* 499(클라이언트가 요청을 닫음, Nginx)

== 5xx (서버 오류) ==
서버가 유효한 요청을 명백하게 수행하지 못했음을 나타낸다.<ref name="RFC_2616"/>
* 500(내부 서버 오류): 서버에 오류가 발생하여 요청을 수행할 수 없다.
* 501(구현되지 않음): 서버에 요청을 수행할 수 있는 기능이 없다. 예를 들어 서버가 요청 메소드를 인식하지 못할 때 이 코드를 표시한다.
* 502(불량 게이트웨이): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 잘못된 응답을 받았다.
* 503(서비스를 사용할 수 없음): 서버가 오버로드되었거나 유지관리를 위해 다운되었기 때문에 현재 서버를 사용할 수 없다. 이는 대개 일시적인 상태이다.
* 504(게이트웨이 시간초과): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 제때 요청을 받지 못했다.
* 505(HTTP 버전이 지원되지 않음): 서버가 요청에 사용된 HTTP 프로토콜 버전을 지원하지 않는다.
* 506(Variant Also Negotiates, RFC 2295)
* 507(용량 부족, WebDAV; RFC 4918)
* 508(루프 감지됨, WebDAV; RFC 5842)
* 509(대역폭 제한 초과, Apache bw/limited extension)
* 510(확장되지 않음, RFC 2774)
* 511(네트워크 인증 필요, RFC 6585)
* 598(네트워크 읽기 시간초과 오류, 알 수 없음)
* 599(네트워크 연결 시간초과 오류, 알 수 없음)

원문 : 위키백과 < https://ko.wikipedia.org/wiki/HTTP_상태코드 >

2016년 2월 15일 월요일

Common Table Expression

Common Table Expression

기본 구조

WITH [CTE의 이름] ( [CTE에서 반환하는 열] )
AS (
 Table View
)
SELECT *FROM [CTE의 이름];

주의 사항

1. WITH 전에 GO 혹은 세미콜론(;)을 사용해야 함
2. [CTE에서 반환하는 열]은 AS 안의 Table View의 반환값과 같아야 함
3. AS 안에서는 내부 조인만 가능하다.

예제

이 예제에서는 CTE를 사용하여 반복+계층 질의문을 반환하도록 한다.

1. 예제 테이블 형식

[부서 ID], [부서 명] , [상위 부서 ID], [사용자 명]

2. 예제 테이블 기본 값

부서 ID 부서 명 상위 부서 ID 사용자 명
Dev 개발부 NULL 김개발
Ope 영업부 NULL 이영업
Dev1 개발1팀 Dev 김일팀
Dev2 개발2팀 Dev 김이팀
Dev1-1 개발1팀1조 Dev1 김일조
Ope1 영업1팀 Ope 이일팀
Ope2 영업2팀 Ope 이이팀

3. 질의문 작성

3-1. QUERY TEMPLATE

WITH CTE_DEPT ( [부서 ID], [부서 명] , [상위 부서 ID], [사용자 명] )
AS (
 Table View
)
SELECT *FROM CTE_DEPT

3-2. 기준이 되는 테이블 (상위부서가 없는 행)

WITH CTE_DEPT ( [부서 ID], [부서 명] , [상위 부서 ID], [사용자 명] )
AS (
 -- Table View
SELECT [부서 ID], [부서 명] , [상위 부서 ID], [사용자 명] 
FROM DEPT_TABLE 
WHERE [상위부서 ID] IS NULL 
)
SELECT *FROM CTE_DEPT


부서 ID부서 명상위 부서 ID사용자 명
Dev개발부NULL김개발
Ope영업부NULL이영업

3-3.  반복+계층을 위한 UNION ALL 작성

(기본 테이블의 [상위 부서 ID]와 CTE테이블의 [부서 ID]가 같은 것을 가져온다는 것은
"3-1"에서 가져온 기준이 되는 테이블 외의 것을 가져오는 것을 의미함)
WITH CTE_DEPT ( [부서 ID], [부서 명] , [상위 부서 ID], [사용자 명] )
AS (
 -- Table View
SELECT [부서 ID], [부서 명] , [상위 부서 ID], [사용자 명]
FROM DEPT_TABLE
WHERE [상위부서 ID] IS NULL
UNION ALL 
SELECT A.[부서 ID], A.[부서 명] , A.[상위 부서 ID], A.[사용자 명]
FROM DEPT_TABLE A 
    INNER JOIN CTE_DEPT B ON A.[상위부서 ID] = B.[부서 ID]
)
SELECT *FROM CTE_DEPT


부서 ID부서 명상위 부서 ID사용자 명
Dev개발부NULL김개발
Ope영업부NULL이영업
Dev1개발1팀Dev김일팀
Dev2개발2팀Dev김이팀
Dev1-1개발1팀1조Dev1김일조
Ope1영업1팀Ope이일팀
Ope2영업2팀Ope이이팀

3-4. 계층을 보여주는 LEVEL 함수 사용 및 반복 확인 열 추가

WITH CTE_DEPT ( [부서 ID], [부서 명] , [상위 부서 ID], [사용자 명], LEVEL )
AS (
 -- Table View
SELECT [부서 ID], [부서 명] , [상위 부서 ID], [사용자 명], 0
FROM DEPT_TABLE
WHERE [상위부서 ID] IS NULL
UNION ALL
SELECT A.[부서 ID], A.[부서 명] , A.[상위 부서 ID], A.[사용자 명], B.LEVEL+1
FROM DEPT_TABLE A 
    INNER JOIN CTE_DEPT B ON A.[상위부서 ID] = B.[부서 ID]
)
SELECT [부서 ID], REPLICATE('ㄴ',LEVEL)+ [부서 명] , [상위 부서 ID], [사용자 명], LEVEL
FROM CTE_DEPT


부서 ID 부서 명 상위 부서 ID 사용자 명 LEVEL
Dev 개발부 NULL 김개발 0
Ope 영업부 NULL 이영업 0
Dev1 개발1팀 Dev 김일팀 1
Dev2 개발2팀 Dev 김이팀 1
Dev1-1 ㄴㄴ개발1팀1조 Dev1 김일조 2
Ope1 영업1팀 Ope 이일팀 1
Ope2 영업2팀 Ope 이이팀 1

3-5. 정렬 

WITH CTE_DEPT ( [부서 ID], [부서 명] , [상위 부서 ID], [사용자 명], LEVEL )
AS (
 -- Table View
SELECT [부서 ID], [부서 명] , [상위 부서 ID], [사용자 명], 0
FROM DEPT_TABLE
WHERE [상위부서 ID] IS NULL
UNION ALL
SELECT A.[부서 ID], A.[부서 명] , A.[상위 부서 ID], A.[사용자 명], B.LEVEL+1
FROM DEPT_TABLE A 
    INNER JOIN CTE_DEPT B ON A.[상위부서 ID] = B.[부서 ID]
)
SELECT [부서 ID], REPLICATE('ㄴ',LEVEL)+ [부서 명] , [상위 부서 ID], [사용자 명], LEVEL
FROM CTE_DEPT
ORDER BY [부서 ID] , LEVEL
/* 부서 ID가 숫자일 경우 */
-- ORDER BY ISNULL([상위부서 ID], [부서 ID]), LEVEL


부서 ID부서 명상위 부서 ID사용자 명LEVEL
Dev개발부NULL김개발0
Dev1ㄴ개발1팀Dev김일팀1
Dev2ㄴ개발2팀Dev김이팀1
Dev1-1ㄴㄴ개발1팀1조Dev1김일조2
Ope영업부NULL이영업0
Ope1ㄴ영업1팀Ope이일팀1
Ope2ㄴ영업2팀Ope이이팀1

3-6. 최상위 부모 가져오기

WITH CTE_DEPT ( [부서 ID], [부서 명] , [상위 부서 ID], [사용자 명], LEVEL, TOPID)
AS (
 -- Table View
SELECT [부서 ID], [부서 명] , [상위 부서 ID], [사용자 명], 0, [부서 ID] AS TOPID
FROM DEPT_TABLE
WHERE [상위부서 ID] IS NULL
UNION ALL
SELECT A.[부서 ID], A.[부서 명] , A.[상위 부서 ID], A.[사용자 명], B.LEVEL+1, B.TOPID
FROM DEPT_TABLE A 
    INNER JOIN CTE_DEPT B ON A.[상위부서 ID] = B.[부서 ID]
)
SELECT [부서 ID], REPLICATE('ㄴ',LEVEL)+ [부서 명] , [상위 부서 ID], [사용자 명], LEVEL, TOPID
FROM CTE_DEPT
ORDER BY [부서 ID], LEVEL

부서 ID 부서 명 상위 부서 ID 사용자 명 TOPID
Dev 개발부 NULL 김개발 Dev
Dev1 개발1팀 Dev 김일팀 Dev
Dev2 개발2팀 Dev 김이팀 Dev
Dev1-1 개발1팀1조 Dev1 김일조 Dev
Ope 영업부 NULL 이영업 Ope
Ope1 영업1팀 Ope 이일팀 Ope
Ope2 영업2팀 Ope 이이팀 Ope

2016년 1월 19일 화요일

비트 연산자와 시프트 연산자

C,C++ 에도 있고, 대충은 아는 비트 연산자와 시프트 연산자를 정리하는 이유는,
C 와는 달리 자바에는 시프트 연산자에 >>> 가 있기 때문이다.
<비트 연산자>
컴퓨터 내부의 정보를 비트 단위로 비교하거나 조작할때 사용한다.
○ 논리곱(and) &
각 비트를 비교하여 양쪽 모두 1 이면 1, 아니면 0 을 반환한다.
a = 170, b = 245 일때
a   = 1 0 1 0 1 0 1 0
b   = 1 1 1 1 0 1 0 1
a&b = 1 0 1 0 0 0 0 0
10진수로 바꾸면 160 이 된다.

○ 논리합(or) |
각 비트를 비교하여 어느 한쪽이 1 이면 1, 그렇지 않으면 0 을 반환한다.
a = 170, b = 245 일때
a   = 1 0 1 0 1 0 1 0
b   = 1 1 1 1 0 1 0 1
a|b = 1 1 1 1 1 1 1 1
10진수로 바꾸면 255 가 된다.

○ 배타적 논리함(xor) ^
각 비트를 비교하여 한쪽이 1 이고 다른 한쪽이 0 이면 1을, 아니면 0 을 반환한다.
a = 170, b = 245 일때
a   = 1 0 1 0 1 0 1 0
b   = 1 1 1 1 0 1 0 1
a^b = 0 1 0 1 1 1 1 1
10진수로 바꾸면 95가 된다.

○ 1의 보수 표현(not) ~
각 비트를 반전시킨 값을 반환한다.
a = 170 일때
a   = 1 0 1 0 1 0 1 0
~a  = 0 1 0 1 0 1 0 1
10진수로 바꾸면 85 가 된다.

<시프트 연산자>
비트 열을 좌우로 지시한 만큼 이동시키는(shift) 연산자를 말한다.
C 에도 시프트 연산자가 있는데, C 에는 >> 과 << 만 있으나,
자바에는 추가적으로 >>> 연산자도 있다.
○ 왼쪽 시프트 연산자 <<
178 << 2 : 178 의 이진코드를 왼쪽으로 2비트 시프트 한다.
  10110010
1011001000
왼쪽으로 두칸 밀면서, 비게 되는 오른쪽 두칸은 0 으로 채운다.
그런데, 문제는 왼쪽으로 밀면서 기존의 크기를 넘어서기 때문에 왼쪽으로 넘어선 2개의 비트는 삭제된다.
따라서, 10110010 을 왼쪽으로 밀면 왼쪽 두개 비트인 10 은 삭제되고, 오른쪽의 2개 비트는 0으로 채워져
결과값은 11001000 이 된다.

○ 오른쪽 시프트 연산자 >>
178 >> 2 : 178의 이진코드를 오른쪽으로 2 비트 시프트 한다.
10110010
1110110010
오른쪽으로 2비트 이동한후, 비게되는 왼쪽의 2개비트는 1로 채워지고, 오른쪽에서 2비트 넘어간 부분은 삭제된다.
따라서, 10110010 을 오른쪽으로 2비트 시프트하면, 11101100 이 된다.
그런데, 주의할점은, 오른쪽으로 밀면서 왼쪽에 비게되는 비트부분이 무조건 1 로 채워지는 것이 아니라,
밀기전의 최초 첫째자리 값과 동일한 값으로 채워진다는 것이다.
여기에서는 밀기전의 첫째자리값이 1 이었으므로, 1 로 채워진 것이다.
○ 논리 오른쪽 시프트 연산자 >>>
178 >>> 2 : 오른쪽으로 2 비트 시프트한다.
자바에 추가된 논리 시프트는 오른쪽으로 밀면서 비게되는 앞쪽 비트를 무조건 0 으로 채워넣는 것이다.
10110010
0010110010
으로 되는 것으로,
역시 오른쪽으로 밀려난 2개 비트 10 은 삭제되고, 비게되는 왼쪽 2비트는 무조건 0으로 채워진다.
따라서 10110010 을 오른쪽으로 논리 시프트 하면, 00101100 이 된다.
예시)
--------------------------------------
public class a{
  public static void main(String [] args){
    byte a = 10;  // 00001010
    byte b = 9;   // 00001001
    byte c = 1;  //시프트할 칸수
    System.out.println(a + " & " + b + " = " + (a&b));  //논리합
    System.out.println(a + " | " + b + " = " + (a|b));  //논리곱
    System.out.println(a + " ^ " + b + " = " + (a^b));  //배타적 논리합(xor)
    System.out.println("~10 = " + (~a));  //a 의 보수(반전)
    System.out.println(a + " << " + c + " = " + (a<<c));  //왼쪽 1비트 시프트(뒤를 0 으로 채움)
    System.out.println(a + " >> " + c + " = " + (a>>c));  //오른쪽 1비트 시프트(앞을 밀리기전 첫째자리와 동일한 비트로 채움)
    System.out.println(a + " >>> " + c + " = " + (a>>>c)); //오른쪽 1비트 논리 시프트(앞을 0 으로 채움)
    System.out.println(-1 * a + " >> " + c + " = " + (-1*a >> c));
  }
}
--------------------------------------
/*
출력:
10 & 9 = 8    : 00001000
10 | 9 = 11   : 00001011
10 ^ 9 = 3    : 00000011
~10 = -11     : 11110101
10 << 1 = 20  : 00010100
10 >> 1 = 5   : 00000101
10 >>> 1 = 5  : 00000101
-10 >> 1 = -5 : 11111011
*/
부호가 붙은 정수형에서는 최상위 비트를 부호비트로 사용한다.
0 은 + 를 표시하고, 나머지 비트로 수를 표시한다.
1은 - 를 표시 하고, 나머지 비트를 반전하여 1 을 더한값이 절대값이 된다.

----------------------------------------
쉬프트연산자 >>, >>> 차이점이요.

양의 숫자를 쉬프트 시킬때는 차이가 없습니다.

하지만 음의 숫자는 2진수로 표시할때 맨앞에 부호비트 1이 붙습니다.

>>연산자의 경우는 부호비트는 고정되고 쉬프트 되지만
>>>연산자는 부호비트도 함께 쉬프트가 됩니다.

ex) 

System.out.println(-300>>>2);
System.out.println(-300>>2);

실행시키면 

1073741749 
-75

가 됩니다.

Last Index Of in MS Office Excel

[구분]  엑셀 함수
[내용] 특정 문자를 뒤에서부터 검색하여 치환한다.
SUBSTITUTE의 특정 위치의 문자만을 치환하는 기능을 이용한다.

사용 함수 : 


LEN - 문자의 갯수를 가져온다. 
LEN(text) 
e.g. LEN("excel") = 5
SUBSTITUTE - 특정 문자를 치환한다.
SUBSTITUTE(text, old_text, new_text, [instance_num]) 
e.g.1 SUBSTITUTE("contact","ta","ne") = connect 
e.g.2 SUBSTITUTE("good","o","",2) = god

사용 설명 : 

1. 특정 문자를 공백으로 치환한다.
SUBSTITUTE(A1,"\","")
2. 특정 문자를 공백으로 전부 치환한 문자의 갯수와 원래 문자의 갯수의 차이를 구한다.
    이 숫자가 특정 문자의 빈도 수 이다.
LEN(A1) - LEN( SUBSTITUTE(A1,"\","") )
3. 기준 문자에서 마지막에 있는 특정 문자만을 치환한다.
SUBSTITUTE(A1, "\", "/", LEN(A1) - LEN( SUBSTITUTE(A1,"\","") ) )

예시 :





주의 : SUBSTITUTE 는 영문 대 소 문자를 구분함.



2015년 8월 19일 수요일

OS X 에서 NTFS 읽기

OS X 에서 NTFS 읽기

두 가지 방법이 있다.

1. 프로그램 설치
    http://www.enjoygineering.com/mounty/

2. 운영체제에서 가능하도록 하기
    NTFS 형식의 외장하드를 연결 후
    터미널을 통해 file system table 접근  [ sudo nano /ect/fstab ]
    팝업되는 편집기에 type [ LABEL=myNTFS none ntfs rw,auto,nobrowse ]
        * myNTFS 는 외장하드 이름이므로 변경가능
        * 대 소문자 구분함
    저장 [ control - O ]
    닫기 [ control - X ]
    NTFS 형식의 외장하드 추출
    NTFS 형식의 외장하드 재 연결
    Finder 에서 연결되었는지 확인해 보고 없으면 터미널에서 type [ open /Volumes ]

참고 :
    FAT (File Allocation Table)
        FAT12, FAT16, FAT32, FATX, exFAT(FAT64), Turbo FAT, TFAT, tex FAT
        거의 모든 운영체제를 지원한다.
        느리다....... 적은 용량의 파일이 많으면 디스크 공간 활용 능력이 더 떨어진다.
    NTFS (New Technology File System)
        v1.0, v1.1, v1.2(NT 3.51, NT 4), v3.0(Windows 2000),
         v3.1(Windows XP, Windows Server 2003, Windows Vista,
                Windows Server 2008, Windows 7)
        MS 윈도우즈 계열에서만 사용가능하다.
        시스템 고장과 디스크 손상을 복구하는 능력이 있다.
             

2015년 8월 5일 수요일

XML parsing with JAVA

XML을 JAVA에서 Parsing 하다.....
일단 xml은..
<code-define>
    <red>
        <code>1100</code>
        <code>1100</code>
        <code>1100</code>
    </red>
    <green>
        <code>1100</code>
        <code>1100</code>
        <code>1100</code>
    </green>
</code-define>
코드값을 자바의 배열로 넣고자 합니다.

// w3c 의 DOM을 사용합니다.
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

// 일단 값을 넣을 배열을 선언하고
List<String> redCodesFromXML = new ArrayList<String>();
List<String> greenCodesFromXML = new ArrayList<String>();

// DOM 문서를 준비합니다.
DocumentBuilderFactory docBF = DocumentBuilderFactory.newInstance();

// xml parsing 을 준비합니다.
DocumentBuilder docB = docBF.newDocumentBuilder();

// 이제 xml 받을 준비
String fileLocation = "C:/test.xml";Document xmlDoc = null;

// parsing
xmlDoc = docB.parse(fileLocation);

// 최 상위 태그를 엘레멘트로 불러옵니다. 태그이름은 code-define 이 됩니다.
Element root = xmlDoc.getDocumentElement();

// red를 엘레멘트 형식으로 가져옵니다. red 태그가 하나밖에 없다고 뒤에 item(0) 이거 무시하면 에러 납니다.
Element red = (Element) root.getElementsByTagName("red").item(0);

// 이제 code를 노드 리스트로 가져옵니다.
NodeList codeValueForRed = red.getElementsByTagName("code");


// for 문으로 리스트 배열에 넣습니다.
for(int i=0; i < redCodesFromXML; i++){
   redCodesFromXML.add(codeValueForRed.item(i).getTextContent());
}


// 이걸 String-array로 바꾸고 싶다면
String [] redStringArray = redCodesFromXML.toArray(new String[redCodesFromXML.size()]);





이상입니다.




2015년 8월 3일 월요일