본문 바로가기

반응형

진리는어디에

(291)
[C++] 구조체 바이트 패딩 규칙(structure byte padding or align rule in C++) 들어 가며.. 지금 까지 나는 byte padding이 cpu 레지스터 사이즈를 따라 일괄적으로 적용 되는 줄 알고 있었다. 하지만 오늘 exe와 dll 사이에서 일어난 문제를 해결하며 찾아본 자료에서 byte padding은 아래의 네 가지 규칙에 따라 구조체에 따라 다르게 적용 된다는 사실을 알았다. 예를 들어 설명 하자면 지금까지 페이지 사이즈가 4byte인 어플리케이션에서는 byte padding 사이즈를 따로 지정해 주지 않는 한 1 byte 짜리 멤버 변수를 가진 구조체나 4 byte 멤버 변수를 가진 구조체의 sizeof 결과가 모두 4 byte로 같을 것이라고 생각 했으나 실제로는 각각 1 byte, 4 byte로 다르게 align 되고 있었다. 바이트 패딩 규칙 msdn의 align (C..
ACL을 이용한 적절한 사용 권한 설정 1. ACL이 중요한 이유는? ACL(Access Control List)은 개개의 사용자들이 디렉토리나 파일과 같은 특정 시스템 개체에 접근할 수 있는 권한을 설정해 놓은 표이다. 공격자(해커)가 리소스에 접근 할 수 있다면 게임 끝이다. “만약 레지스트리키의 ACL이 Everyone에게 모든 권한 허용으로 설정 되어 있으면, 누구나 해당 레지스트리의 키 데이터를 읽고, 쓰고 심지어는 다른 사람의 접근을 차단 할 수 있다” ACL을 이용해 리소스에 대한 접근 권한을 설정 해 두지 않으면 예측하지 못한 다양한 방법 공격이 가능하다. ex) 64byte 로 지정된 버퍼에 더 많은 데이터를 써버려 오버런 발생 대량의 데이터를 읽고 쓰게 강제 2. ACL의 구성 ACE(Access Control Entry) ..
error: too few template-parameter-lists " error: too few template-parameter-lists"는 신규 버젼 gnu cpp 컴파일러에서 발생하는 에러다. 이 문제는 템플릿 클래스의 static 멤버 변수를 초기화 할 때 발생하며, 해결을 template을 static 멤버 변수 초기화 코드 앞에 붙여 주어야 한다. 예를 들어 : template class A { static int a; static const char * const name; }; 와 같은 코드가 있다고 해보자. 예전에는 아래와 같이 써도 무방했다 : int A::a = 0; const char * const A::name = NULL; 하지만 위와 같은 코드는 CeePlusPlus 표준에 의해 이제는 더 이상 유효한 코드가 아니며 "" error: too..
벡터(vector)의 크기(길이) [이전] 포스트에서 벡터는 크기와 방향을 가진다고 했으며, 그중 크기(또는 길이)를 나타내는 것이 바로 벡터의 '길이'이다.v = 일 때, 벡터 v의 크기는 얼마인가?대략 보면 답이 없다. 값 세 개로 벡터의 크기를 구하라니..이번 포스트에서는 주어진 벡터로 그 '크기(길이)'를 구하는 방법에 대해서 공부해 보도록 하겠다.들어가기에 앞서..벡터의 길이는 스칼라 값이다.벡터의 길이를 나타내기 위해 ‖v‖와 같은 방식으로 표기한다(절대 값을 나타내는 |a|와 구분하기 위함)를 알아 두자.수학 책에 나오는 Rn인 공간에서 벡터의 길이를 구하는 공식은 간단하다 :‖v‖ =  sqrt(v02 + v12 + v22 + ... + vn2)(sqrt는 '루트'라고 생각하자. 텍스트로 표현할 방법이 없다..-_-;;)..
기저 벡터(basis vector) 기저 벡터의 정의 벡터 공간에서 각각의 축방향을 가리키는 단위 벡터 라고 한다. 간단해서 좋다. 하지만 이것으론 부족해서 조금 더 자세한 정의를 찾아 보았다. 기저 벡터란 n차원 공간에서 임의의 벡터를 표현할 수 있는 기준이 되는 벡터이다. n차원(R^n)에서는 n개의 벡터가 있어야 기저 벡터가 이루어지며, 또한 벡터가 서로 선형독립적이거나 행렬식이 0이 되지 않아야 기저 벡터이다. 위의 정의도 결론은 n차원에서 임의의 벡터를 표현하기 위한 기준이 되는 벡터란다. 결국 축방향을 가리키는 단위 벡터라는 말이다. '선형 독립'에 관해서는 [여기]를 참조 하자. 기저 벡터에 대해 좀 더 자세히 설명하자면, 예를 들어 1차원 공간을 상상해 보자. 1차원이라고 하면 직선 공간을 말한다. 옆도 없고 위도 없고 오로..
안드로이드 측정 단위(android measure unit) px - 픽셀(pixel) in - 인치(inche) mm - 밀리미터(millimeter) pt - 포인트(point) 1/72 인치 dip(=dp) - Density-independent Pixels - 추상적 단위. 스크린을 160dpi로 보고, 160 dpi 스크린에서는 1dp는 1픽셀. sp - scale independent pixels - dp와 비슷. 유저가 지정한 폰트 사이즈에 따라 스케일이 조절된다는데..무슨말인지.. ref. http://stackoverflow.com/questions/2025282/difference-of-px-dp-dip-and-sp-in-android
안드로이드 - 다이얼로그에 Spinner 붙이기 안드로이드 어플리케이션에서 다이얼로그 안에 Spinner를 하나 붙이려고 했으나 모든 것이 정상인것 처럼 보임에도 불구하고 Spinner 객체가 null로 셋팅 되는 현상이 있었습니다. 코드는 아래와 같습니다 : static final int DLG_ID_INSERT = 0; private Spinner spinner; private ArrayAdapter adapter; protected Dialog onCreateDialog(int id) { Dialog dlg = null; switch (id) { case DLG_ID_INSERT: dlg = new Dialog(this); dlg.setContentView(R.layout.insert_dlg); spinner = (Spinner)findViewB..
템플릿(template)을 이용한 에러객체 만들기 ♥ 에러 객체란? " 에러객체 = 에러코드 + 에러문자열 " 프로그래밍을 하다보면 종종 에러코드를 정의해서 써야하는 경우가 있다. 종종이라기보다는 항상 에러코드를 정의해야한다. C++을 사용하는 나의 경우에는 enum을 주로 이용하여 에러코드가 겹치는 것을 방지하고, 다른 언어를 사용하는 사람들도 각자의 언어에서 제공하는 여러가지 방법을 사용하여 에러 코드를 정의해 쓸 것이다. 이렇게 에러코드들을 주루룩 정의해서 쓰다보면 한가지 아쉬운 점이 꼭 생각난다. "에러 코드만 넣으면 무슨 에러인지 알수 있는 방법은 없을까?" 오늘 소개해볼 '에러 객체'라는 것은 위의 불편함을 조금이라도 해결해 보기 위해 만들어진 몸부림 중에 하나다. ♥ 에러 객체에게 필요한 것들? 중복은 절대 안되!! 에러 코드는 중복되어서는..
템플릿 특화를 이용한 멀티 키 맵(Multi Key Map) 이전에 템플릿 특화(template specialization)와 특화를 이용한 튜플(Tuple)클래스를 만들어 본적이 있다. 오늘은 비슷한 원리를 이용해 N개의 키를 가질 수 있는 멀티 키 맵을 만들어 보겠다. 멀티키 맵이라고 해서 특별이 다를 것은 없다. 다만 단일 키만을 제공하는 std::map을 좀 더 확장하여 N개의 키를 타입 리스트를 통해 넘겨주는 것 뿐이다. 물론 이런 방법 말고도 구조체를 키로 쓰는 std::map을 활용하거나, 바이너리 메모리로 모든 키들을 복사해서 쓰는등 구현에는 다향한 취향과 트레이드 오프가 존재한다. 오늘 이 포스트에서 소개하는 것은 그 방법들 중 한 가지 방법일 뿐이다. 멀티키 맵에 관련된 설명에 앞서 이전에 다뤘던 Typelist라던지 템플릿 특화의 개념은 이미 ..
윈도우(Win32) 프로그램에서 콘솔창 띄우기 1. 왜 윈도우(Win32) 프로그래밍에서 콘솔 창이 필요한가 윈도우 창에서 프로그램을 작성하다 보면 쉽게 쉽게 디버그 상태를 보여 줄수 있는 창이 있다면 좋을 텐데 라는 생각을 종종 하게 된다. 물론 새로운 자식윈도우를 하나 더 띄우고 거기에 리스트 컨트롤을 붙인다면 그런 문제가 해결 되긴 하겠지만 그리 크지도, 작도 않은 프로그램에서 새로운 디버그 창을 만들어 내는 것은 여간 귀찮은 일이 아니다. 여러 SendMessage등 여러 단계를 거쳐야 하고, 초보에게 익숙하지 않은 함수를 쓰는 것보다는 printf를 사용한다면 프로그램 작성의 편리와 가독성을 높일 수 있을 것이다. 2. 사용 방법 1) #include 콘솔 모드에서의 입출력을 하기위해서는 'stdio.h'가 필요하다. 2) 본 문 다음 두 ..

반응형