Thursday, March 18, 2010
MVC 패턴 Architecter / SW Engineering
Thursday, March 11, 2010
linux 하위카테고리까지 권한 변경하기
명령어 => chmod
하위디렉토리까지 => -R
권한 777 => 읽고.쓰고.실행 가능
data => 해당 디렉토리
linux 일괄 하위폴더 파일권한 변경
하위디렉토리find . -type d -exec chmod 755 {} \;
하위 디렉토리의 모든 파일+디렉토리의 권한을 644로 바꾼다find . -type f -exec chmod 644 {} \;
문자인코딩] 유니코드, UTF-8, UTF-16, UTF-32 간단 정리
Unicode provides a unique number for every character,
no matter what the platform,
no matter what the program,
no matter what the language.
위에 설명되어 있는대로다.
유니코드란?
unicode는 모든 문자에 index를 줘 놓은 것이다. 더 이상도 아니고, 더 이하도 아니다.
이 index를 code point라고 부르는데, 그냥 index라고 칭하도록 하자.
'A'라는 글자는 0x0041 이라는 index를 가진다.
'a'라는 글자는 0x0061 이라는 index를 가진다.
'가'라는 글자는 0xac00 이라는 index를 가진다.
( 더 많은 글자와 index를 보려면 http://www.unicode.org/charts/ 를 참고하자 )
표현방법
저렇게 정해져 있는 index를 표시하는 방법에는 UTF와 UCS두가지 종류가 있다.
( UTF - Unicode Transformation Format , UCS - Universal Character Set )
UCS
UCS는 몇바이트로 index를 표현할 수 있느냐를 나타낸다.
즉 UCS-2는 2byte로 index를 나타낼꺼고 UCS-4는 4byte를 이용해서 index를 나타낼거라는거다.
UTF
UTF는 몇 비트단위로사용해서 index를 나타낼것인가를 말한다.
UTF-8은 8bit씩 늘려가며 index를 나타낼꺼라는거고,
UTF-16은 16bit씩 index를 나타낼꺼고, UTF-32는 32bit씩 index를 나타낼꺼라는거다.
( 실상 UTF-16과 UCS-2는 같다고 볼 수 있다. 마찬가지로 UTF-32와 UCS-4도 마찬가지다. )
UTF-16
원래 처음에 unicode의 index는 2byte로 나타낼 수 있었다.
그랬는데, unicode 가 버젼업되어 4.0이 나왔을때에는 0x10FFFF 까지의 index가 생겼다.
처음에는 UTF-16으로 모든 문자를 나타낼 수 있었으나,
( 2byte로 표현할 수 있는 index를 가진 문자 목록을 BMP Basic Multilingual Plane 라고 부른다. )
유니코드 4.0이 나오면서, 2byte로는 0x10FFFF 같은 값을 가리킬 수 없게 되었다.
그래서 UTF-16으로는 BMP에 있는 문자들은 2byte로 처리하고,
BMP보다 더 높은 index를 가지는 놈들은 4byte로 처리 한다.
문자 index 0x0000 부터 0xFFFF 까지는 2byte로 처리 하고
문자 index 0x10000 부터 0x1FFFF 까지는 4byte로 처리 된다.
UTF-32
UTF-32는 기본적으로 4byte를 사용하기 때문에, 위와 같은 짓을 하지 않아도 된다.
UTF-8
영어권에 있는 사람들은 UTF-16을 쓰면 손해다.
모든 영어는 1byte만 있으면 256개를 표현할 수 있으므로, 모든 문자를 넣을 수 있기 때문이다.
그래서 나온게 UTF-8이다.
영어권은 1byte로 표현하고, 그것보다 높은 index를 가지는것은 2byte 혹은 3byte 혹은 4byte ..
요렇게 늘려 가면서 쓰도록 되어 있다.
서로간의 변환
UTF-8, UTF-16, UTF-32, UCS-2, UCS-4 는
모두 unicode의 문자 index를 나타내기 위한 방법이기 때문에,
서로간의 변환은 당연히 잘 된다.
글자처리
우리가 글자 "가"를 쓴다고 해 보자. 글자 "가"는 1글자이다.
그러므로 "가"를 나타내는 index가 있다. 물론 "나"를 나타내는 index도 있다.
한글로 표현할 수 있는 글자는 매우 많다.
그 많은 글자 모두에게 index를 줄 수가 없다.
현재 사용하고 있는 모든 글자에 index를 준다고 해도,
시간이 지나서 새로운 글자가 추가 되어 index가 모자르게 된다면 어떻게 할것인가?
그래서 유니코드는 완전한 글자를 제공해 주기도 하지만,
글자를 조립할 수 있도록 조립가능한 글자를 제공해 준다.
다시 "가"를 쓴다고 해 보다.
"가"라는 글자는 1개이지만, 실제로는 초성 "ㄱ"과 중성"ㅏ" 가 합쳐져서 만들어진 글자이다.
그러므로 "가"를 표현하는 방법은 완성된 글자 "가"0xAC00가 될 수도 있고,
초성"ㄱ"과 중성"ㅏ"를 조립한 "가"0x1100,0x1161 로 나타낼 수도 있다.
( 초성 "ㄱ"은 0x1100 - HANGUL CHOSEONG KIYEOK )
( 중성 "ㅏ"는 0x1161 - HANGUL JUNGSEON A )
이를 조합할 수 있게 해 주는 index는 1100 부터 있다.
( Hangul Jamo - Korean combining alphabet -http://www.unicode.org/charts/PDF/U1100.pdf )
이는 비단 한글뿐만 아니라,
일본어 역시 완성된 글자가 있기도 하고, 조합할 수 있게도 되어 있다.
영어 역시 그렇다. 영어에서 무슨 글자를 조합하냐 라고 말하겠지만,
이력서를 나타내는 Résumé 의 경우에는 e 와 ' 의 조합으로 이루어 질 수도 있다.
Tuesday, March 9, 2010
[Linux] grep 명령어 사용법
grep 명령어 사용법
출처 : 유닉스 쉘 바이블 (엘리 퀴클리 지음)에서 발췌.
3.1 grep 명령어
grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다.
egrep : grep의 확장판으로, 추가 정규표현식 메타문자들을 지원한다.
fgrep : fixed grep 이나 fast grep으로 불리며, 모든 문자를 문자 그래도 취급한다. 즉, 정규표현식의 메타문자도 일반 문자로 취급한다.
3.2 정규표현식을 사용하는 grep의 예제
# grep NW datafile
# grep NW d* (d로 시작하는 모든 파일에서 NW를 포함하는 모든 행을 찾는다.)
# grep '^n' datafile (n으로 시작하는 모든 행을 출력한다.)
# grep '4$' datafile (4로 끝나는 모든 행을 출력한다.)
# grep TB Savage datafile (TB만 인자이고 Savage와 datafile은 파일 이름이다.)
# grep 'TB Savage' datafile (TB Savage를 포함하는 모든 행을 출력한다.)
# grep '5.' datafile (숫자 5, 마침표, 임의의 한 문자가 순서대로 나타나는 문자열이 포함된 행을 출력한다.)
# grep '.5' datafile (.5가 나오는 모든 행을 출력한다.)
# grep '^[we]' datafile (w나 e로 시작하는 모든 행을 출력한다.)
# grep '[^0-9]' datafile (숫자가 아닌 문자를 하나라도 포함하는 모든 행을 출력한다.)
# grep '[A-Z][A-Z] [A-Z]' datafile (대문자 2개와 공백 1개, 그리고 대문자 하나가 연이어 나오는 문자열이 포함된 행을 출력한다.)
# grep 'ss* ' datafile (s가 한 번 나오고, 다시 s가 0번 또는 여러번 나온 후에 공백이 연이어 등장하는 문자열을 포함한 모든 행을 출력한다.)
# grep '[a-z]{9}' datafile (소문자가 9번 이상 반복되는 문자열을 포함하는 모든 행을 출력한다.)
# grep '(3).[0-9].*1 *1' datafile (숫자 3,마침표,임의의 한 숫자,임의 개수의 문자,숫자 3(태그),임의 개수의 탭 문자,숫자 3의 순서를 갖는 문자열이 포한된 모든 행을 출력한다.)
# grep '
(north로 시작하는 단어가 포함된 모든 행을 출력한다.)
# grep '' datafile (north라는 단어가 포함된 모든 행을 출력한다.)
# grep '<[a-z].*n>' datafile (소문자 하나로 시작하고, 이어서 임의 개수의 여러 문자가 나오며, n으로 끝나는 단어가 포함된 모든 행을 출력한다. 여기서 .*는 공백을 포함한 임의의 문자들을 의미한다.)
3.3 grep에 옵션 사용
# grep -n '^south' datafile (행번호를 함께 출력한다.)
# grep -i 'pat' datafile (대소문자를 구별하지 않게 한다.)
# grep -v 'Suan Chin' datafile (문자열 Suan Chin이 포함되지 않은 모든 행을 출력하게 한다. 이 옵션은 입력 파일에서 특정 내용의 입력을 삭제하는데 쓰인다.
# grep -v 'Suan Chin' datafile > black
# mv black datafile
# grep -l 'SE' * (패턴이 찾아진 파일의 행 번호 대신 단지 파일이름만 출력한다.)
# grep -w 'north' datafile (패턴이 다른 단어의 일부가 아닌 하나의 단어가 되는 경우만 찾는다. northwest나 northeast 등의 단어가 아니라, north라는 단어가 포함된 행만 출력한다.)
# grep -i "$LOGNAME" datafile (환경변수인 LOGNAME의 값을 가진 모든 행을 출력한다. 변수가 큰따옴표로 둘러싸여 있는 경우, 쉘은 변수의 값으로 치환한다. 작은따옴표로 둘러싸여 있으면 변수 치환이 일어나지 않고 그냥 $LOGNAME 이라는 문자로 출력된다.)
3.4 egrep
egrep(extended grep) : grep에서 제공하지 않는 확장된 정규표현식 메타문자를 지원 한다. grep와 동일한 명령행 옵션을 지원한다.
3.4.1 egrep 예제
# egrep 'NW|EA' datafile (NW나 EA가 포함된 행을 출력한다.)
# egrep '3+' datafile (숫자 3이 한 번 이상 등장하는 행을 출력한다.)
# egrep '2.?[0-9]' datafile (숫자 2 다음에 마침표가 없거나 한 번 나오고, 다시 숫자가 오는 행을 출력한다.)
# egrep ' (no)+' datafile (패턴 no가 한 번 이상 연속해서 나오는 행을 출력한다.)
# egrep 'S(h|u)' datafile (문자 S 다음에 h나 u가 나오는 행을 출력한다.)
# egrep 'Sh|u' datafile (패턴 Sh나 u를 포함한 행을 출력한다.)
3.5 고정 grep 과 빠른 grep
fgrep : grep 명령어와 동일하게 동작한다. 다만 정규표현식 메타문자들을 특별하게 취급하지 않는다.
# fgrep '[A-Z]****[0-9]..$5.00' file ([A-Z]****[0-9]..$5.00 이 포함된 행을 출력한다. 모든 문자들을 문자 자체로만 취급한다.)
Tuesday, January 26, 2010
C언어] 문자열 합치기 / 문자열 연결, 추가 함수 strcat()
C언어] 문자열 합치기 / 문자열 연결, 추가 함수 strcat()
문자열 합치기 예제
0.cpp
#include
void main(void) {
char result[] = "안녕하세요. ",
s[] = "똠방각하입니다!";
strcat(result, s); // result에, s를 추가
printf("%s\n", result);
// 결과: 안녕하세요. 똠방각하입니다!
// 다른 방법: sprintf() 함수로, 문자열 3개를 한번에 연결하기
char test[100];
char *t1 = "봉숭아", *t2 = " ", *t3 = "학당";
sprintf(test, "%s%s%s", t1, t2, t3); // 빈 배열 test 에 여러 문자열 집어넣기
puts(test);
// 결과: 봉숭아 학당
}
여담이지만 C언어는 문자.열을 다루는 데 적합한 언어가 아닙니다. 문자열 다루는 일을 주로 하시는 분에게는 Perl(펄)을 추천합니다.
☞ C/C++
posted by mwultong @ 3:41 PM del.icio.us
Thursday, January 14, 2010
[C++] C++ RTTI (Run Time Type Information)
http://furyheimdall.tistory.com/156
[C++] C++ RTTI (Run Time Type Information)
Posted on 2008/06/17 20:01
Filed Under Computer languages
이 글은 Jake에 의해 www.jakeworld.net 에서 작성되었습니다.
- 퍼가실 때는 이 박스와 함께 복사해주세요.
RTTI 란?
Run Time Type Information or Run Time Type Identification의 약자로 실행시간에 타입정보를 식별 정도로 풀이할 수 있습니다.
정확한 의미는, 실행중에 기반 클래스 타입 포인터의 실체를 밝혀내는데 목적을 두고 있습니다.
C++ 표준화의 역사와 RTTI의 등장
1991: First meeting of WG21
1994: CD1
1996: CD2
1997: FDIS (Final Draft International Standard)
1998: C++ Standard (C++98)
CD : Committee Draft
TR : Technical Report
WG : Working Group
WG21 : WG for C++
RTTI 는 현재 표준화 된 지원을 제공하지만, 애초부터 표준이었던 것은 아닙니다.
C와의 후방 호환성을 유지하며, C의 효율성 유지에 대한 우려때문이었습니다.
가상함수라는 대안도 있었지만 결국 정적 타입체크 와 가상함수들로는 불가능한 문제점들이 제시되었습니다.
결국 C++ 표준화 위원회는 RTTI 추가를 승인하였습니다.
그 이전에는 각각 독자적으로 RTTI 기능을 소스코드 수준에서 구현하여 제공하였는데, 그 대표적인 예가 92년에 등장한 MFC의 RTTI 입니다.
CRuntimeClass 와 몇가지 매크로를 통해서 구현하게 되어있는데 현재까지도 MFC에서 사용되고 있습니다.
MFC RTTI 에 관해서는 http://captainthomas.tistory.com/entry/MFC-RTTI-CRuntimClass 를 참고하시기 바랍니다.
RTTI 는 어째서 필요한가?
RTTI는 위에서 언급했듯 실행중에 기반 클래스 타입 포인터의 실체를 밝혀내는데 목적으로 하고 있습니다.
정확하게 다형성을 가진 객체에 대해 정확한 타입을 알아내기 위해서 나왔다고 볼 수 있습니다.
간단한 예를 들면 Base 클래스가 있고 그것을 상속받은 Child1, Child2 클래스가 존재한다고 가정했을때,
Base* m_Base = new Child1();
이렇게 할당하였을 경우 기존의 방법으로는 실행중에 m_Base 가 가르키고 있는 객체가 Child1 이라는 것을 알 수가 없습니다.
하지만 RTTI 를 사용하면 Child1 타입이라는 것을 정확하게 알 수 있게 됩니다.
이것은 하나의 단편적인 예이며 사실 가상함수를 사용하는 다형성을 통해서 굳이 런타임때 타입을 알필요가 없을지도 모릅니다.
하지만 가상함수로도 해결할 수 없는 문제점을 RTTI 를 통해서 해결 가능한 부분들이 존재합니다.
이에 관해서는 http://blog.naver.com/moodern?Redirect=Log&logNo=80005025903 를 참고하시기 바랍니다.
제약사항
위에서 다형성이란 말을 언급하였는데 , 이 다형성을 구현하기 위해서 C++ 은 가상함수를 사용하며, 이 가상함수를 위해 별도의 공간을 사용하고 있습니다. 바로 vftbl 이라는 가상함수 테이블입니다.
RTTI 정보는 vftbl 에 저장되기 때문에 가상함수가 사용된 클래스에 한해서만 정보가 유지되게 됩니다.
즉, 비다형성 클래스의 객체는 RTTI 정보를 가지지 않습니다. (프리미티브 타입들도 마찬가지입니다)
이는 RTTI를 일반적인 클래스 객체에 두게되면 C와의 하위호환성을 포기해야 되는 사태가 발생합니다.
C의 구조체와 C++의 클래스 객체는 바이너리 호환성을 지니기 때문에 C에서 객체에 액세스가 가능한데 , C++ 클래스가 멤버중 vitrual 을 가지게 되면 액세스가 불가능한 점을 볼 수가 있습니다.
RTTI 의 간단한 예
다형성과 비다형성을 가진 클래스에 대해 RTTI 정보에 대해서 쉽게 테스트 해 볼 수 있습니다.
01 | #include |
02 | #include |
03 |
04 | class Base |
05 | { |
06 | public: |
07 | void B(){} |
08 | }; |
09 |
10 | class Child1 : public Base |
11 | { |
12 | public: |
13 | void C(){} |
14 | }; |
15 |
16 | class Child2 : public Base |
17 | { |
18 | public: |
19 | void C(){} |
20 | }; |
21 |
22 | void main() |
23 | { |
24 | Base* Cast = new Child1(); |
25 | Base* Cast2 = new Child2(); |
26 | printf( "%s \n", typeid(*Cast).name() ); |
27 | printf( "%s \n", typeid(*Cast2).name() ); |
28 | } |
위와 같이 비 다형성 클래스에 대해서 선언하여 클래스 타입을 조회하면 둘다 "Class Base"로 나오게 됩니다.
정체성을 잃어버리고 자기가 누군질 모르고 있습니다.
즉 RTTI 정보를 가지지 않게 됩니다.
01 | #include |
02 | #include |
03 |
04 |
05 | class Base |
06 | { |
07 | public: |
08 | void B(){} |
09 | virtual void a(){} |
10 | }; |
11 |
12 | class Child1 : public Base |
13 | { |
14 | public: |
15 | void C(){} |
16 | virtual void a(){} |
17 | }; |
18 |
19 | class Child2 : public Base |
20 | { |
21 | public: |
22 | void C(){} |
23 | virtual void a(){} |
24 | }; |
25 |
26 | void main() |
27 | { |
28 | Base* Cast = new Child1(); |
29 | Base* Cast2 = new Child2(); |
30 | printf( "%s \n", typeid(*Cast).name() ); |
31 | printf( "%s \n", typeid(*Cast2).name() ); |
32 |
33 | } |
이번에는 클래스 내부에 의미없는 virtual 멤버를 포함시켰습니다.
수행결과는
"Class Child1"
"Class Child2"
로 나오게 됩니다. 지가 누군지 알게 되었네요.
RTTI 정보를 가지게 되는 것을 알 수 있습니다.
C++ RTTI 에 의존하는 dynamic_cast 도 상속 관계 안에서 하나 이상의 가상함수를 가지고 있어야 하며, RTTI 기능이 활성화 되어야 사용할 수 있는 제약사항을 동일하게 가집니다.
마치며
간단하게 C++ RTTI 에 알아보기 위해서 썼기 때문에 정작 중요한 예나 비용등의 언급은 빠졌습니다.
RTTI 에 관련된 정보는 많이 있기 때문에 검색을 통해 충분히 찾을 수 있을 것으로 생각됩니다.
자세한 예와 사용에 대해서는 http://blog.naver.com/lovinghc?Redirect=Log&logNo=30013832987 를 참고하시기 바랍니다.


Post a Comment
<<>