기존에 짜여진 코드를 새로운 언어로 변경하여 검증을 할 때 신경써야 하는 부분이 정말 많습니다. 이 중에서 우선순위를 두어 순차적으로 문제해결하는 방법을 설명하겠습니다.

기존에 진행하면서 애먹었던 경험을 기반으로 작성한 주관적인 글입니다.

단계별 중요도

1) 이전 코드와 정확한 동작을 하는 프로세스인지 확인

가장 기본이 되는 부분입니다. 기존 코드와 변경한 코드가 동일한 동작을 하는 것이 맞는지 확인을 해야 합니다.

2) 각 언어의 정책 확인

여기서 중요하게 봐야할 점은 데이터 타입빌트인 함수의 동작syntax error 등이 있습니다.

이전에 기존 소스를 새로Go라는 언어로 개발하여 데이터를 검증한 경험이 있는데 Go의 경우 그냥 int를 사용하면 os에 영향을 받아 int 32일 수도 있고 int 64일 수도 있습니다. 이와 같이 데이터 타입을 먼저 확인해야 하고 빌트인 함수가 기존 언어의 동작과 동일한지 확인해야 합니다. 동일한 함수명일지라도 동작하는 형식이 조금 씩 다를 수 있습니다.

한마디로 기존에 사용하던 언어와 변경할 언어의 정책을 확인해야 합니다.

3) 인코딩

1)번과 2)번이 다른 테스트 케이스를 통해 동일하게 동작하는 것이 확인되면 이제 데이터에 대해 의심을 해야 합니다. 먼저 인코딩을 같은 코드로 했는지 먼저 확인합니다. 윈도우 메모장을 압축하여 해당 파일을 전달한 다음 디비에 밀어 넣는다면 UTF8-BOM 문제로 인해 골치아플 것입니다. 

4) 데이터베이스간 정책 확인

위 까지 동일하다면 데이터베이스간 취하는 정책을 확인해야 합니다. 동일한 쿼리여도 어느 데이터베이스에서는 동작하는데 다른 데이터베이스에서는 동작하지 않는 쿼리가 있습니다. 또한 order by 정책이 달라 나오는 순서가 다르다던지 aggregate 함수가 존재하는데 group by나 aggregate 함수로 감싸지 않은 필드에서 그대로 데이터가 나오는 둥 여러 문제가 있습니다. 앞에서 다 말했지만 다음 sqlite와 postgresql 정책 차이를 예로 들겠습니다.

SQLite, PostgreSQL 정책 비교


SQLitePostgreSQL
문자열 우선순위가 달라 order by의 순서가 동일하지 않음

문자열 가장 첫 글자부터 순서대로 크기 비교
100보다 99가 더 큰 문자열로 나옴 - 첫 번째 문자을 비교하면 1과 9이기 때문

**만약 문자열이 숫자가 아닌 한글이라면?
1. 숫자와 마찬가지로 가장 첫 문자끼리 비교 (길이 상관 x)
2. 첫 문자가 같다면 다음 문자 비교
3. 다른 문자 값이 나올 때까지 비교

문자열 가장 첫 글자부터 순서대로 크기 비교
100보다 99가 더 큰 문자열로 나옴 - 첫 번째 문자을 비교하면 1과 9이기 때문

**만약 문자열이 숫자가 아닌 한글이라면?
1. 먼저 글자의 길이대로 정렬
2. 길이가 같다면 첫 번째 문자끼리 비교
3. 첫 번째 문자가 같다면 다음 문자 비교
4. 다른 문자 값이 나올때까지 반복

[가, 나, 다, 바, 가나다, 나다, 가나바] 정렬 결과

[가,가나다,가나바,나,나다,다,바]

[가,나,다,바,나다,가나다,가나바]
select name, date from test group by date; - 쿼리의 동작 여부

해당 쿼리가 동작함

원래는 동작하면 안되는 쿼리지만 SQLite 내에서 group by 나 aggregation function이 필요한 부분에 기본값으로 max()함수를 씌워서 출력

해당쿼리가 동작하지 않음

원칙대로 name에 aggregation function이나 group by로 묶여있지 않기 때문에 에러를 출력

SQLite만 가지고 있는 특징

위 쿼리의 select 부분에 max(count)를 추가하면 나오는 결과가 변경됨

aggregation function이 추가되면 name에 max()를 씌우는 것이 아니라 date가 같은 로우들을 전부 오름차순으로 정렬 (여기서 정렬 순서는 group by에 나열된 순서 혹은 select에 명시한 필드명 순서 같음)한 다음 가장 첫 번째 로우를 뽑아서 출력

그런거없음


'공부' 카테고리의 다른 글

소프트웨어 개발 방법론  (0) 2017.03.08
문자열 인코딩 (unicode/UTF8, UTF16, ASCII)  (0) 2016.11.09
데이터 검증 유의사항  (0) 2016.10.17
유니코드 BOM(Byte Order Mark)  (0) 2016.10.12
전각문자(double byte)와 반각문자(single byte)  (0) 2016.10.10
Busybox란?  (0) 2016.07.28

BOM이란

BOM이란 문서 맨 앞에 눈에 보이지 않는 특정 바이트(byte)를 넣은 다음 이것을 해석해서 정확히 어떤 인코딩 방식이 사용되었는지 알아내는 방법을 나타냅니다. 자세하게 유니코드가 little-endian 인지 big-endian 인지 아니면 UTF-8 인지 쉽게 알 수 있도록, 유니코드 파일이 시작되는 첫부분에 보이지 않게, 2~3바이트의 문자열을 추가하는데 이것을 BOM이라고 합니다. BOM은 텍스트 에디터 화면에서는 보이지 않고, 헥사 에디터(Hex Editor)*로 열었을 때만 보입니다.

BOM의 종류

인코딩 방식Byte Order Mark(BOM)
UTF-8EF BB BF
UTF-16 Big EndianFE FF
UTF-16 Little EndianFF FE
UTF-32 Big Endian00 00 FE FF
UTF-32 Little EndianFF FE 00 00

UTF-16 이상 인코딩일 때, 문서의 맨 처음 BOM을 파악하여 Big Endian인지 Little Endian인지 구분하지만 UTF-8의 경우는 BOM이 하나로 고정입니다. 그래서 이 BOM은 바이트 순서와(Byte Order) 상관없기 때문에 UTF-8 Signature라고 불리기도 합니다. 즉, 해당 문서가 UTF-8로 인코딩되었다는 사실을 알리는 사인(signature)입니다.

BOM 문제점

UTF-8에는 BOM이 없는 것이 보통인데(UTF-8은 BOM이 고정이라 인코딩 방식을 자동으로 알 수 있음), 일부 윈도우즈 프로그램(메모장 같은)은 UTF-8 파일을 생성할 때 자동으로 BOM을 집어넣습니다. 윈도우즈 환경에서는 눈에 띄지 않는 경우가 많지만 리눅스(LINUX)나 유닉스(UNIX) 환경에서는 많은 문제를 일으키는 원인이 됩니다. BOM이 추가된 데이터의 경우, 글자 앞에 빈칸이 생기면 그 차이점을 알 수 있지만 대개 눈으론 보이지 않습니다.

데이터베이스에서 BOM이 추가된 데이터와 그렇지 않은 데이터를 비교할 경우 눈으로는 동일한 데이터지만 비교를 할 땐 같지 않다는 데이터로 나옵니다. 그 이유는 문자열 앞에 BOM이 붙어있기 때문입니다. (이 문제때문에 하루를 고생한적이..)


울트라에디트라는 프로그램을 울트라에디트의 헥사 모드(Ctrl+H)로 UTF-8 파일을 보면, 16비트 유니코드처럼 보이고 BOM이 있든 없든 항상 FF FE 라는 엉뚱한 BOM이 나타납니다. 이것은 울트라에디터가 유니코드를 편집할 때, 내부적으로 '16비트 little-endian 유니코드 (UTF-16LE)'로 변환하여 편집하기 때문입니다. 진짜 헥사 에디터로 보아야만 UTF-8의 BOM인 EF BB BF 가 제대로 보이게 됩니다. 물론 BOM이 없는 UTF-8이라면 BOM이 없는 것으로 나옵니다

해결책

가장 좋은 방법으로는 메모장 같은 프로그램보단 BOM설정이 가능한 프로그램을 사용하는 것입니다. 하지만 모든 파일을 BOM설정이 가능한 프로그램을 사용할 수 없기 때문에 BOM파일을 받은 다음, 코드로 해당 파일을 UTF-8로 인코딩 처리하는 부분도 생각해야 합니다.

'공부' 카테고리의 다른 글

문자열 인코딩 (unicode/UTF8, UTF16, ASCII)  (0) 2016.11.09
데이터 검증 유의사항  (0) 2016.10.17
유니코드 BOM(Byte Order Mark)  (0) 2016.10.12
전각문자(double byte)와 반각문자(single byte)  (0) 2016.10.10
Busybox란?  (0) 2016.07.28
정규 표현식  (0) 2016.07.07

전각문자와 반각문자

전각문자는 특수문자 기호로 생각하면됩니다. 여기서 말하는 특수문자 기호는 !@#와 같이 shift+숫자가 아닌 123abc?!과 같은 형태로 윈도우 같은 경우 자음+한자로 생성되는 문자입니다. (맥에서 특수문자를 쓰기가 어려워서..)

반각문자는 흔히 우리가 쓰는 기호입니다.


유니코드가 등장하기 전의 멀티바이트 문자 인코딩에서는 일반적으로 반각 문자는 1바이트, 전각 문자는 2바이트로 처리되었으나, 유니코드가 등장한 현재는 반드시 그렇다고는 할 수 없습니다. 일례로 유니코드 인코딩 중 하나인 UTF-8에서는 반각 1은 1바이트로 처리되나 전각 1은 2바이트가 아니라 3바이트로 처리되며, UTF-16에서는 반각 1과 전각 1 모두 2바이트로 처리됩니다.
아스키 코드에 속하는 문자는 반각 형태와 전각 형태를 모두 가지고 있습니다.

  • 반각: 123abc?! / 전각: 123abc?!

다만 반각 숫자(123)는 숫자로 인식되나, 전각 숫자(123)는 숫자가 아니라 일반 문자로 인식되는 경우가 많습니다. 따라서 수를 입력하고자 할 때는 반드시 반각으로 입력해야 합니다. 

그리고 문자 인코딩에 따라 같은 문자라도 전각/반각 여부가 달라지기도 합니다. 확장 로마자(Æ, ø 등)나 그리스 문자, 키릴 문자의 경우 동아시아권 문자 인코딩에서는 2바이트 영역에 속해 전각으로 표시되나, 서양권 문자 인코딩에서는 반각으로 표시됩니다. 실제로 확장 로마자, 그리스 문자, 키릴 문자의 경우 반각으로 표현하는 것이 가독성을 높여 주며, 전각으로 표현하면 글자 간격이 너무 벌어져서 가독성이 상당히 떨어진다는 문제가 있습니다.

전각문자 반각문자로 변환

특수문자 기호(전각문자)와 일반 문자(반각문자)는 아스키코드로 120차이가 나고 16진수론 80차이가 납니다. 따라서 0xfee0 이상의 문자는 전각문자이므로 0xfee0를 빼서 일반 문자로 변환하면 반각문자가 나옵니다. 특수문자 공백(white space)은 0x3000이여서 해당없으므로 별개로 하드코딩하여 일반 공백(0x20)으로 변경해야 합니다.

(왜 0xfee0 차이가 나는지는..)

c#에서는 이를 처리해주는 함수가 존재합니다.

더 자세한 내용은 전각과 반각 에서 확인할 수 있습니다.

'공부' 카테고리의 다른 글

데이터 검증 유의사항  (0) 2016.10.17
유니코드 BOM(Byte Order Mark)  (0) 2016.10.12
전각문자(double byte)와 반각문자(single byte)  (0) 2016.10.10
Busybox란?  (0) 2016.07.28
정규 표현식  (0) 2016.07.07
IDS와 IPS  (0) 2016.07.07

리눅스 상에서 자주 사용되는 명령어들만 모은 압축파일. 

Busybox에서는 각각에 함수들을 최소 사이즈로 다시 구현하였으며 제한된 자원을 가진 임베디드 플랫폼에서는 기반 툴로 사용됩니다. 안드로이드 기본 커널에서는 파일복사 명령어 등이 없기 때문에 system에 접근해서 시스템 파일을 복사하기 위해서는 이 명령어가 필요합니다. 또한 dockerfile들을 까다보면 최상단 busybox를 기반으로 진행되는 것을 확인할 수 있습니다.



'공부' 카테고리의 다른 글

유니코드 BOM(Byte Order Mark)  (0) 2016.10.12
전각문자(double byte)와 반각문자(single byte)  (0) 2016.10.10
Busybox란?  (0) 2016.07.28
정규 표현식  (0) 2016.07.07
IDS와 IPS  (0) 2016.07.07
네트워크 가상화  (0) 2016.07.07

정규 표현식이란?

정규표현식의 사전적인 의미로는 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어입니다.  주로 Programming Language나 Text Editor 등 에서 문자열의 검색과 치환을 위한 용도로 쓰이고 있습니다. 입력한 문자열에서 특정한 조건을 표현할 경우 일반적인 조건문으로는 다소 복잡할 수도 있지만, 정규표현식을 이용하면 매우 간단하게 표현 할 수 있습니다. 하지만 코드가 간단한 만큼 가독성이 떨어져서 표현식을 숙지하지 않으면 이해하기 힘들다는 문제점이 있습니다.

정규 표현식 방법

정규표현식은 표준인 POSIX의 정규표현식과 POSIX 정규표현식에서 확장된 Perl방식의 PCRE가 대표적이며, 이외에도 수많은 정규표현식이 존재하며 정규표현식 간에는 약간의 차이점이 있으나 거의 비슷합니다. 정규표현식에서 사용하는 기호를 Meta문자라고 합니다.  Meta문자는 표현식 내부에서 특정한 의미를 갖는 문자를 말하며, 공통적인 기본 Meta문자의 종류로는 다음과 같습니다.

. ^ $ * + ? { } [ ] \ | ( )


문  자

 설   명

 예   제 

 \

 다음에 오는 문자를 특수 문자, 리터럴, 역참조 또는 8진수 이스케이프로 표시합니다. 

 "\\"는 "\"를 찾고 "\("는 "(" 찾습니다.

 ^

 입력 문자열의 시작 부분에서 위치를 찾습니다. 

 ^abc -> abcdef

 ^a?bc -> bcdef, abcdef

 $

 입력 문자열의 끝 부분에서 위치를 찾습니다.  

 t$ -> eat

 동$ -> 홍길

 *

 앞의 문자나 부분식을 0개 이상 찾습니다. 

 ab* -> abaabb, abbaaaa

 ab*d -> adabdabbbbd 

 +

 앞의 문자나 부분식을 1개 이상 찾습니다. 

 zo+ -> zozoo 

 ?

 앞의 문자나 부분식을 0개나 1개 찾습니다. 

 te?n -> tentn
  teen(x) 

 {n}

 n의 수만큼 정확하게 앞글자를 반복합니다.

 te{2}n -> teen 

 {n, m}

 n과 m사이의 수만큼 앞글자를 반복 

 te{1,2}n -> tenteen 

 .

 New Line을 제외한 모든 글자 

 .n -> an apple, on the tree 

 (pattern)

 패턴을 체크하고 체크한 값을 변수로 저장

 (f..) (b..) -> foobar 

 (?:pattern)

 패턴을 체크하고 체크한 값을 변수로 저장하지 않음 

 (?:f..) (b..) -> bar

 (?=pattern)

 패턴에 일치하는 문자열이 시작된 위치에서 검색 문자열을 찾습니다.

 blah(?=soft|hard) -> blahsoft, blahhard, blah hard(x) 

 (?!pattern)

 패턴에 일치하지 않는 문자열이 시작된 위치에서 검색 문자열을 찾습니다.

 blash(?!hard) -> blahsoft, blah soft 

 x|y

 x 또는 y를 찾습니다. 

 z|food -> zfood

 (z|f)ood -> zoodfood 

 [xyz]

 문자 집합, 괄호로 묶인 문자 중 하나를 찾습니다. 

 [abc] -> plain 

 [^xyz]

 음수 문자 집합, 괄호로 묶이지 않는 문자를 찾습니다. 

 [^a-z] -> I'm a good man, I am A Good Man

 [a-z]

 문자의 범위. 지정한 범위에서 문자를 찾습니다. 

 [a-z]{4,} -> She sells sea shells by...

 [^a-z]

 음의 범위 문자. 지정한 범위에서 있지 않은 문자를 찾습니다. 

 [^a-z] -> KNOW know  

 \b

 단어와 공백 사이의 위치를 찾습니다. 

 er\b -> naver, verb(x)

 \B

 \b 를 제외한 전부를 찾습니다.

 er\B -> verb, naver(x)

 \cx

 x로 표시된 제어 문자를 찾습니다. 

 \cM -> Control-M or 캐리지 리턴 문자를 찾습니다. 

 \d

 숫자를 찾습니다.

 == [0-9]  

 \D

 숫자가 아닌 문자를 찾습니다.

 == [^0-9] 

 \f

 용지 공급 문자를 찾습니다. 

 == \xOc, \cL

 \n 

 줄 바꿈 문자를 찾습니다. 

 == \xOa, \cJ 

 \r 

 캐리지 리턴 문자를 찾습니다. 

 == \xOd, \cM 

 \s

 공백, 탭, 용지 공급 등을 비롯한 모든 공백 문자를 찾습니다. 

 == [\f\n\r\t\v] 

 \S 

 공백이 아닌 문자를 찾습니다. 

 == [^\f\n\r\t\v] 

 \t

 탭 문자를 찾습니다. 

 == \x09, \cL 

 \v

 새로 탭 문자를 찾습니다. 

 == \x09, \cK 

 \w

 밑줄을 비롯한 모든 문자를 찾습니다. 

 == [A-Za-z0-9_] 

 \W 

 비단어 문자를 찾습니다. 

 == [^A-Za-z0-9_] 

 \xn

 n을 찾는데, 여기서 n은 16진수 이스케이프 값입니다. (ASCII 코드가 정규식에 사용될 수 있습니다.)

 \x41 -> A

 \x041 -> \x04 & 1

[a-z] : 소문자

[A-Z] : 대문자

[a-zA-Z] : 영문자

[가~힣] : 완성형 한글

'공부' 카테고리의 다른 글

전각문자(double byte)와 반각문자(single byte)  (0) 2016.10.10
Busybox란?  (0) 2016.07.28
정규 표현식  (0) 2016.07.07
IDS와 IPS  (0) 2016.07.07
네트워크 가상화  (0) 2016.07.07
인터프리터와 컴파일러  (0) 2016.07.06

IDS(Intrusion Detection System)

IDS는 컴퓨터나 전산망의 비정상적인 사용이나 오남용과 같은 잠재적인 침입 시도 등을 실시간으로 탐지 하기 위한 시스템입니다. IDS는 컴퓨터 시스템에서 발생하는 서비스 거부 공격 등과 같은 네트워크 공격에 대비하여 기밀성, 무결성, 가용성 등을 제공 하기 위해 만들어진 시스템입니다. 공격자는 특별한 목적없이 공격을 수행할 수 있고, 컴퓨터의 사용자가 인지 하지 못한 상태에서 공격에 가담하고 있을 수 있습니다. 네트워크 규모의 확대와 정보시스템들의 통합은 막대한 양의 시스템 로그 및 감사(Audit)자료를 발생시키기 때문에 관리자에게 정형화 된 형태로 필요한 정보만 선택 하여 수용할 수 있어야 합니다. 이 역할을 하는 것이 바로 IDS입니다.

IPS(Instrusion Prevention System)

IPS는 공격 피해를 최소화 할수 있는 능동적 보안시스템으로. IDS는 탐지하는 역할까지만 담당하고 탐지한 자료를 바탕으로 차단을 할 것 인지 통과를 시킬 것 인지는 IPS가 담당 합니다. IPS는 잠재적 위협을 인지한 후 이에 즉각적인 대응을 하기 위한 네트웍 보안기술 중 예방적 차원의 접근방식에 해당합니다. IPS 역시, 침입 탐지 시스템인 IDS와 마찬가지로 네트워크 트래픽을 감시합니다. 공격자가 일단 액세스 권한을 획득하고 나면 시스템의 악의적인 이용이 매우 빠르게 진행될 수 있기 때문에, IPS 역시 네트워크 관리자가 설정해 놓은 일련의 규칙에 기반을 두고 즉각적인 행동을 취할 수 있는 능력을 가지고 있어야 합니다. 이를 위하여, IPS는 어떤 한 패킷을 검사하여 그것이 부당한 패킷이라고 판단되면, 해당 IPS주소 또는 포트에서 들어오는 모든 트래픽을 봉쇄하는 한편, 합법적인 트래픽에 대해서는 아무런 방해나 서비스 지연 없이 수신측에 전달합니다.IDS와 IPS

'공부' 카테고리의 다른 글

Busybox란?  (0) 2016.07.28
정규 표현식  (0) 2016.07.07
IDS와 IPS  (0) 2016.07.07
네트워크 가상화  (0) 2016.07.07
인터프리터와 컴파일러  (0) 2016.07.06
JIT(Just-In-Time)  (0) 2016.07.06

+ Random Posts