2014. 12. 30. 12:05

map 멤버함수 중에 count라는 함수가 key 값이 존재하는지 아닌지 알려준다

Key 값이 존재하면 1을 리턴

존재하지 않으면 0을 리턴한다


예제 참고



2014. 12. 29. 12:05

1. NVIDIA 홈페이지에서 cuda_6.5.19_windows_general_64.exe를 다운 받은 후 설치한다

- 각자의 그래픽 카드와 OS 사양에 맞추어 다운로드


2. 설치하면 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5에 설치될 것이다

- 환경변수 CUDA_PATH를 설정한다.(아마 설치하면 자동으로 환경변수가 설치되어 있을 것이다)


3. C:\ProgramData\NVIDIA Corporation\CUDA Samples\v6.5에서 Samples_vs2012.sln 파일을 열어서 빌드한다

- 빌드가 성공적으로 끝나면 이상이 없는 것이다


4. Visual Studio를 실행하고 새 프로젝트를 만든다


5. cu 확장자를 가진 소스 파일을 만든다


6. 솔루션 탐색기에서 해당 프로젝트를 우클릭해서 "사용자 지정 빌드를 선택"한 후 CUDA 6.5(.targets, .props)를 체크한다


7. 메뉴 - 보기 - 속성 - 구성속성 - C/C++ - 일반 - 추가 포함 디렉터리 에

$(CUDA_PATH)\include를 포함시킨다


8. 메뉴 - 보기 - 속성 -구성속성 - 링커 - 일반 - 추가 라이브러리 디렉터리

에 $(CUDA_PATH)\lib\Win32를 포함시킨다


9. 각자에 맞는 라이브러리를 포함시킨다.(cudart.lib 등)


10. main.cu 파일을 우클릭, 속성-> 구성 속성 -> 일반 -> 항목 형식을 CUDA C/C++로 선택한다.(제일 중요함)


11. 소스를 입력한 후 빌드한다.


예제 소스




2014. 12. 24. 14:09


두 개의 값은 다르게 나온다

bmp 저장은 배열의 값 그대로 나오고

jpg는 압축 되어서 나오기 때문에 다른 픽셀값으로 출력된다.

이걸 몰라서 일주일 헤매었다 ㅠㅜ


2014. 12. 22. 09:40

3D 그래픽스 쪽으로 회사를 다니다가

새로운 회사에서 영상처리를 하느라 다시 OpenCV를 사용하기 시작했다


내가 예전에 사용하던 버전은 1.0인데 벌써 3.0까지 나와서

지금은 3.0으로 사용하고 있다...


적응하는데 시간이 오래 걸릴 거 같다...


열심히 해야지...

2014. 12. 22. 09:37

CUDA 6.0에서는 빌드를 못하다가 

최신 버전 CUDA 6.5에서 다시 빌드를 성공했다


방법은 cuda_6.5.19_windows_general_64.exe 를 다운 받아 설치한다음

Visual Studio를 빌드하면 된다


빌드를 성공하면 어떤 프로그램이든지 실행이 가능하다 ^^


차근 차근 시작해보자~~

2014. 1. 8. 00:27

다음과 같은 코드를 통해 그리기(Drawing)이 이루어진다

 

 

 

2-2 는 사각형을 칠할 색상이다

2-3dms 사각형을 그린다.

glRectf(x1, y1, x2, y2);

(x1, y1)은 좌측 하단 좌표, (x2, y2)는 우측 상단 좌표이다

핵심은 z = 0 인 평면에 사각형을 그린다

 

다음 코드는 화면에 그리는 코드이다

 

 

 

 

3-1 은 화면 사이즈에 맞게 끔 늘려주는 함수이다

뷰 포트라고 하고 처음 두 좌표가 시작점이고 마지막 두 점이 끝 점이다

보통 화면에 다 이미지를 채우고 싶으면 위와 같이 작성한다

 

3-2 는 Projection Matrix를 사용하겠다는 의미이다

Projection 종류는 두 가지가 있다

Orthographic Projection 과 Perspective Projection 이 있다

여기서는  Orthographic Projection에 대해 자세히 다룬다

 

glOrtho() 함수가 핵심인데 6개의 인자는 다음과 같다

left, right, bottom, top, near, far 이다

left, right - x 축 최소 최대

bottom, top - y 축 최소 최대

near, far - z 축 최소 최대

z 축의 경우는 값이 작아질수록 관측자로부터 물어진다

 

near, far 의 값은 Z = 0을 사이에 두고 값이 있으면 된다

즉 -1 ~ 1 이어도 상관 없고 -5~5 이어도 상관 없다

만약 near, far 값이 3 ~ 5 이면 클리핑 영역이

직사각형 앞 쪽에 있으므로 빨간 사각형이 화면에 보이지 않는다

마찬가지로 -7 ~ -9로 두면 클리핑 직육면체가 사각형 뒤 쪽에 있으므로

보이지 않는다

 

값을 넣어서 테스트 해보기 바란다

 

glOrtho()의 인자 값을 바꾸어서 테스트 해서 감을 잡아봐라 많은 도움이 될 것이다

 

해상도 600 x 600 화면에 오른쪽 위의 1/4을 채운 빨간 사각형을 그리고 싶으면

다음과 같은 값을 주면 된다

glViewport(0, 0, 600, 600);

glRectf(0.0f, 0.0f, 10.0f, 10.0f);

glOrtho(-10.0f, 10.0f, -10.0f, 10.0f, 1.0f, -1.0f);

 

다음과 같은 코드도 가능하다

glViewport(0, 0, 600, 600);

glRectf(0.0f, 0.0f, 2.0f, 2.0f);

glOrtho(-2.0f, 2.0f, -2.0f, 2.0f, 0.001f, -0.005f);

 

기본은 끝났다 다음은 기본 도형들을 그려보자

 

프로그래밍 연습

1. 사각형을 다음과 같은 비율과 위치로 나오게 해보라

가로 5 세로 2 위치 왼쪽 아래 꼭지점이 화면 가운데 나오게 하기

결과는 다음과 같을 것이다

 

 

 

2. near, far 가 -1 ~ 1 과 1 ~ -1 이 무슨 차이인지 조사해 보라

glOrtho(-10.0f, 10.0f, -10.0f, 10.0f, 1.0f, -1.0f);

glOrtho(-10.0f, 10.0f, -10.0f, 10.0f, -1.0f, 1.0f);

 

위의 두 줄의 코드는 무슨 차이인가?

 

 

다음은 전체 코드이다

 

 

 

2014. 1. 6. 21:14

기본 코드를 확인해보자

SetupRC() 함수는 초기에 한 번 호출 된다 ( Init() 함수와 같다고 보면 된다 )

 

SetupRC() 함수 안에 Region 1 안에 glClearColor(0.0f, 0.0f, 1.0f, 0.0f); 를 입력한다

이 함수는 지우는 색을 지정하는 함수이다

일단은 처음에 한 번만 지정한다

 

Region2에 다음 코드를 입력한다

glClear(GL_COLOR_BUFFER_BIT);

Color Buffer(색상 버퍼, 픽셀 버퍼)를 지우는 함수이다

GL_COLOR_BUFFER_BIT로 플래그로 설정한다

 

색상 버퍼 이외에도 버퍼 종류로는 깊이 버퍼, 스텐실 버퍼 등이 있다

이 버퍼들은 이후에 자세히 다룬다

 

glutSwapBuffers() 함수를 추가한다

이 함수는 더블 버퍼일 때 Front Buffer와 Back Buffer를 교체한다

코드의 추가 내용은 다음과 같다

 

 

 

 

결과 내용은 다음과 같다

 

 

 

우리가 원하는 대로 창을 지정한 색으로 다 지우고 그 색으로 채웠다

다음 과정은 이 위에 원하는 그림을 그리자

 

아래의 코드는 전체 코드이다

 

 

* 프로그래밍 연습

1. 배경 화면을 빨간색으로 채워보자

2. 배경 화면을 녹색으로 채워보자

3. 배경 화면을 노란색으로 채워보자

 

2014. 1. 6. 20:21

앞으로 사용될 기본 코드이다

Visual Studio 2010을 사용했다

Console Application을 사용했고

Empty Project이고 Unicode에서 구현한다

 

 

다음 소스는 기본 틀이다

맨 위의 주석 두 줄은 GPL License의 기본 틀이다

OpenGL 기본 세팅은 생략한다 다른 사이트를 참고하기 바란다

크게 다른 프로그램을 만들지 않는 한 Region 으로 구분, 코드를 추가한다

 

 

다음은 실행 결과이다

코드와 일치시켜서 알 수 있는 것은

4-3과 4-4의 코드가 적용 되었다는 것을 확인

4-3 윈도우 사이즈가 800 x 600 이다

4-4 윈도우 타이틀 제목이 "OpenGL Basic Code Window~~!!" 이다

4-8 은 GLUT 프레임 워크를 실행하는 기능이다

4-5는 화면의 사이즈가 변할 때 호출되는 콜백함수(ChangeSize)를 등록한다

4-6은 화면이 그려질 때 호출되는 콜백 함수를 등록한다

다음에 할 일은 창에 나타난 부분이 배경화면인데

이 부분을 지우는 부분을 구현하도록 한다

즉 창 바탕 화면을 원하는 색으로 칠해보도록 하자

 

* 프로그래밍 연습

1. 윈도우 사이즈를 400 x 200으로 수정해보자

2. 윈도우 타이틀 제목을 "Hello, World"로 바꾸어 보자

 

2014. 1. 6. 17:22

5년 만에 제대로 다시 자료를 정리하고 어느 정도까지 기술을 오픈하고

라이센스를 걸어야 할 지 모르겠다

상업적으로 많은 돈을 벌 수도 있고

GPL로 오픈 하자니 상업 쪽에서 안 쓰면 활용 가능성이 없을 수도 있고

BSD로 하자니 막 갖다 쓸 수도 있고 해서

우선 GPL 라이센스로 오픈하고 정말 상업적으로

필요하신 분들은 lividious@naver.com 으로 연락주시면

BSD 허가 여부를 알려 드리겠다

 

그리고 대부분은 핵심 코드만 올려놓거나 추상적으로 이론만 올려 놓으면

아무 도움도 안 되고 공부도 안 된다

 

물론 머리 좋은 사람은 단박에 알아낼 수 있지만 나 같은 사람은

그렇지 못하다

 

소스 코드만 올려 놓는다.

다이얼로그나 솔루션은 알아서 하시고

그러나 너무 복잡한 프로그램일 때는 같이 올려 놓는다

 

OpenGL, OpenCV, CUDA, Image Processing, Augmented Reality, 3D Reconstruction 에 관해 일단 자료 정리 하고

 

도전 분야는 Network Programming, Pattern Recognition, 동영상 프로그래밍에 관해 할 생각이다

 

추가 분야로는 리눅스, C#이 될 것이다.

 

다시 열심히 하자

 

 

 

 

2010. 1. 6. 21:02

UML Relation

프로그래밍 2010. 1. 6. 21:02

▶ 관계 (Relationship)
   1) Association
       - 구조적 관계 표현
       - 실선으로 표기, 필요에따라 Role Name , Multiplicity , Navigable 표시
       - 객체별 연관관계 표시
       - 두 클래스가 Association 관계에 있다면 한쪽에서 다른한쪽을 참조 할수 있음을 의미
       - Notation

       - Code
            class A{
                  B b;
             }
 
            class B{
            }
 
   2) Aggregation : 집합
       - 두 클래스가 Association 관계 이면서 전체와 부분의 관계 일경우
       - Notation
        - Rose에서 Association 표기 선택 후  마우스 오른쪽 클릭 Aggregate
 
   3) Composition : Aggregation의 특수한 경우
       - Aggregation의 특수 경우 이며 전체 소멸시 부분도 함께 소멸
       - 강한 소유의 표시
       - Notation     
      
      * Aggregation 선택후 Rose 에서 마우스 오른쪽 > Open Spec > By Value 체크
 
   4) Generalization : 일반화
       - 일반화된 개념적 사물과 구체화된 특수 사물의 관계 표현
       - 부모 자식 간의 상속 개념
       - 자식은 부모의 속성과 행동을 공유
       - Notation
    

   5) Realization : 실체화
       - 정의 와 구현 관계 표현
       - Use Case에 정의된 기능을 구현하는 Collaboration에 연결시 사용
       - 정의된 interface와 이를 구현하는 Class 연결시 사용
       - Notation
 
   6) Dependency 
       - 의존형 관계 표시
       - Class 간 의존은 필요할때 만들어 사용하여 버린다는 의미
       - Association 은 지속적이며 강한 관계, Dependency 는 일시적인 약한 관계
       - Notation
       
       - Code
 
          class A
          {
                void play(B b) 
               { 
               }
          }
 
         class B
         {
             int num;
         }
 
   7) Association Class 
       - Association자체가 속성을 가질때 클래스로 모델링 한다.
       - Notation

      
 
   8) Recursie Association
       - 동일한 클래스 내에서의 Association
       - Notation
 

출처 : [기타] http://blog.naver.com/blubeard/80035938698

2010. 1. 6. 20:50

 

Code Craft 요약좋은 프로그래머 나쁜 프로그래머

 

1.    방어하기

l  좋은 프로그래머

-      자기 코드가 튼튼한지 신경을 씁니다.

-      모든 추측을 방어적 코드안에 명시적으로 캡처해서 표현합니다.

-      가비지가 입력되었을 때에도 정의된 동작이 실행되기를 원합니다.

-      코드를 작성하면서 코드에 대해 신중히 생각합니다.

-      다른 사람의 어리석음으로부터 코드가 자신을 보호하도록 작성합니다.

l  나쁜 프로그래머

-      자기 코드 안에서 잘못된 일이 발생할 수도 있다는 사실을 생각하고 싶어 하지 않습니다.

-      고장을 일으킬 수도 있는 코드를 통합하라고 내주고, 다른 사람이 대신 정리해 주기를 바랍니다.

-      코드의 사용법에 대한 중요한 정보를 자기 머리 속에만 넣어둠으로써, 쉽게 잊어버릴 있게 합니다.

-      거의 생각을 하지 않고 코드를 작성하기 때문에, 결국 예측할 없고 신뢰할 없는 소프트웨어를 만듭니다.

 

2.    최고의 레이아웃 계획

l  좋은 프로그래머

-      무의미한 논쟁을 피하고, 다른 사람들의 의견에 예민하게 신경을 씁니다.

-      겸손해서 자기가 항상 옳지 않다는 것을 압니다.

-      코드 레이아웃이 가독성에 얼마나 영향을 미치는지 알고, 가능한 명료한 코드를 작성하기 위해 노력합니다.

-      자기의 개인적인 기호와 다르더라도 하우스 스타일을 채택할 것입니다.

l  나쁜 프로그래머

-      마음이 닫혀 있고 고집이 셉니다.

-      아주 사소한 일을 가지고도 아무하고나 싸움을 합니다.

-      개인적인 코딩 스타일에 일관성이 없습니다.

-      다른 사람의 코드를 자기 스타일을 가지고 짓뭉갭니다.

 

3.    이름이 뭐길래

l  좋은 프로그래머

-      이름이 중요하다는 것을 알고, 이름을 소중히 다룹니다.

-      이름을 어떻게 만들지에 대해서 생각하고, 자기가 생성하는 모든 것에 적절한 이름을 붙입니다.

-      이름의 길이, 명료성, 콘텍스트 등과 같은 힘들의 균형을 맞춥니다.

-      그림을 바라보고, 프로젝트 전체에 걸쳐서 자기가 만든 이름들이 조화를 이루게 만듭니다.

l  나쁜 프로그래머

-      자기 코드의 명료성에 대해 거의 신경 쓰지 않습니다.

-      일회서 코드를 생성합니다.

-      언어 고유의 관용구를 무시합니다.

-      이름을 짓는데 있어서 일관성이 없습니다.

-      전체론적으로 생각하지 않습니다. 자기가 만든 코드가 전체와 어떻게 맞물리는지 생각하지 않습니다.

 

4.    문서화 도구

l  좋은 프로그래머

-      스스로 문서화하는 명료한 코드를 작성하기 위해 노력합니다.

-      필요한 최소 분량의 문서를 작성하기 위해 노력합니다.

-      자기 코드를 유지보수할 프로그래머가 무엇을 필요로 할지 생각합니다.

l  나쁜 프로그래머

-      이해가 불가능한 스파케티 코드의 작성을 자랑스러워합니다.

-      어떤 문서 작성도 하려 듭니다.

-      문서의 업데이트에 신경을 쓰지 않습니다.

-      이런 생각을 합니다. “내가 작성하기 힘든 코드는 다른 사람도 이해하기 힘들어야

 

5.    가벼운 코멘트

l  좋은 프로그래머

-      정말 훌륭한 소량의 코멘트를 작성하려고 노력합니다.

-      왜에 대해서 설명하는 코멘트를 작성합니다.

-      과도한 코멘트가 아니라 좋은 코드의 작성에 집중합니다.

-      의미 있는 유용한 코멘트를 작성합니다.

l  나쁜 프로그래머

-      좋은 코멘트와 나쁜 코멘트의 차이를 모릅니다.

-      어떻게에 대해서 설명하는 코멘트를 작성합니다.

-      코멘트가 자기에게만 의미가 통해도 개의치 않습니다.

-      잘못된 코드를 많은 양의 코멘트로 보강합니다.

-      쓸데없이 중복되는 정보로 소스 코드를 채웁니다.

 

6.    사람은 실수를 하기 마련

l  좋은 프로그래머

-      자신의 좋은 의도를 좋은 코딩 습관과 결합시킵니다.

-      에러 처리 코드도 주된 코드를 작성할 때처럼 작성합니다.

-      코드를 철저히 작성해서 모든 에러 가능성을 커버합니다.

l  나쁜 프로그래머

-      자기가 하는 일에 대해 생각이나 검토를 하지 않고, 되는대로 식의 접근 방법으로 코드를 작성합니다.

-      코드를 작성하는 도중에 발생하는 에러를 무시합니다.

-      처음부터 에러 상황을 고려하는 일이 절대 없기 때문에, 나중에 고장 부분을 찾아서 오랜 디버깅 작업을 하게 됩니다.

 

7.    프로그래머의 도구 상자

l  좋은 프로그래머

-      지루한 일을 하고, 하고, 하는 식으로 반복하기 보다는, 적절한 툴의 사용 방법을 배우는 편을 택하려고 합니다.

-      여러 가지 툴체인(Toolchain) 모델을 알아두고, 각각을 힘들지 않게 사용할수 있습니다.

-      자기의 생활을 편하게 만들기 위해서 툴을 사용합니다. 하지만 툴의 노예가 되지는 않습니다.

-      자기가 사용하는 모든 것을 툴로 봅니다.

-      생산성이 높습니다. 왜냐하면 툴이 2 천성이 되었기 때문입니다.

l  나쁜 프로그래머

-      가지 툴의 사용 방법을 알고 있지만, 모든 문제를 툴의 관점에서만 바라보려고 합니다.

-      새로운 툴을 배우기 위해 시간을 보내는 것을 꺼려합니다.

-      어떤 개발 환경을 사용하기 시작하면, 그것을 종교처럼 받들고, 절대 다른 것의 사용을 시도하거나 검토조차 하지 않으려 듭니다.

-      가치 있는 새로운 툴을 마주쳐도 자신의 툴박스에 추가하지 않습니다.

 

8.    시험 보는 시간

l  좋은 프로그래머

-      자기가 작성한 모든 코드에 대해 테스트 코드를 작성합니다.(일반 코드를 작성하기 전에 작성할 있습니다.)

-      마이크로 레벨에서 테스트를 하기 때문에 매크로 레벨에서 테스트를 바보 같은 코딩 실수로 인해 방해 받는 일이 없습니다.

-      전체 테스트에서 자기가 맡은 역할을 하면서, 제품의 품질에 대해 신경을 쓰고, 그에 대한 책임을 집니다.

l  나쁜 프로그래머

-      테스트가 소프트웨어 개발의 중요한 필수 요소라고 생각하지 않습니다.

-      테스트하지 않은 코드를 QA 부서에 제출하고, 테스트가 결함을 드러내면 놀라는 모습을 보입니다.

-      문제를 너무 늦게 발견해서 자기 인생을 복잡하게 만듭니다.

 

9.    결함 찾기

l  좋은 프로그래머

-      버그르르 배양하지 않습니다. 코드를 조심스럽게 작성해서 애초에 버그를 끌어들이는 일을 방지합니다.

-      자신의 코드가 무엇을 하는지 알고 있고, 쉽게 고장 나지 않도록 보장하기 위해 테스트 코드를 신중하게 작성합니다.

-      전투 계획도 없이 무모하게 돌진해서 버그 사냥을 하기보다는 방법론적이고 신중하게 합니다.

-      자신의 한계에 대해 알고 있고, 앞뒤가 모두 막혔을 때는 다른 사람에게 결함 찾는 일을 도와달라고 요청합니다.

-      코드의 변경을 조심스럽게 합니다.

l  나쁜 프로그래머

-      디버깅을 하지 않습니다. 여기저기 마구 두드리면서 잘못된 코드의 바다 속으로 침몰합니다.

-      대부분의 생활을 디버거 안에서 보내고, 안에서 자신의 코드가 무엇을 하고 있는지 풀어내려고 합니다.

-      고장에 직면하면 감추려 듭니다.

-      자신의 코드 품질과 결함을 고치는 능력에 대해 비현실적으로 기대감을 가지고 있습니다.

-      진짜 원인을 찾아내기 위해 뒤로 돌아가서 문제점을 추적하기보다는, 증상을 감추는 것으로 버그를 고칩니다.

 

10. 코드 빌드

l  좋은 프로그래머

-      자신이 사용하는 빌드 시스템의 작동 방법, 사용 방법, 확장 방법을 알고 있습니다.

-      단순하고 단위로 빌드 시스템을 만들어서, 소스 코드와 나란히 관리합니다.

-      있는 많은 빌드 작업을 자동화 합니다.

-      오버나이트 빌드를 이용해서 통합의 문제점을 잡아냅니다.

l  나쁜 프로그래머

-      빌드 시스템의 작동 방법을 무시하다가 바보 같은 빌드 문제에 발목이 잡힙니다.

-      자신의 빌드 시스템이 얼마나 불안전하고 신뢰할 없는 것인지에 대해 걱정을 하지 않습니다.

-      자신의 묘하고 복잡한 빌드 절차를 신참이 거의 적대적인 방법으로 스스로 터득하기를 기대합니다.

-      정의된 릴리즈 절차를 따르지 않고, 한꺼번에 던지는 식으로 릴리즈 빌드를 만듭니다.

 

11. 속도의 필요성

l  좋은 프로그래머

-      최적화가 절대적으로 필요하다는 사실이 증명되지 않으면 최적화를 하지 않습니다.

-      사려 깊고 신중한 접근 방법으로 체계적인 최적화를 시도합니다.

-      코드 수준의 최적화에 호소하기 전에, 일찍 대안을 찾고 설계 개선에 대해 연구합니다.

-      코드의 품질을 파괴하지 않는 최적화를 선호합니다.

l  나쁜 프로그래머

-      코드의 부적절성을 증명하기도 전에 최적화부터 시작합니다.

-      측정이나 조사도 하지 않고 보틀텍이라고 생각하는 코드를 공격합니다.

-      그림을 고려하는 일이 절대 없습니다. 자기가 하는 최적화가 다른 코드 영역이나 사용 패턴에 대해 어떤 의미를 갖는지 전체적으로 고려하지 않습니다.

-      코드의 품질보다 속도가 중요하다고 생각합니다.

 

12. 불안전 콤플렉스

l  좋은 프로그래머

-      자기가 일하는 프로젝트의 보안 요구사항에 대해 알고 있습니다.

-      본능적으로 일반적인 보안 취약점을 피하면서 코드를 작성합니다.

-      시스템 각각에 대해 보안을 설계합니다. 보안을 마지막에 끼워 넣지 않습니다.

-      보안을 테스트하는 전략을 가지고 있습니다.

l  나쁜 프로그래머

-      보안이 별로 중요하지 않다고 간단하게 결론을 내려버립니다.

-      자기가 보안 전문가라고 생각합니다.

-      취약점이 발견되었을 , 나쁜 경우로는 자기 코드가 손상되었을 , 자기 프로그램에 있는 보안 결합에 대해서만 생각합니다.

-      코드를 작성할 때만 보안에 초점을 맞추고, 설계나 아키텍처 수준에서는 보안을 무시합니다.

 

13. 웅대한 설계

l  좋은 프로그래머

-      자기가 건드린 모든 것이 좋은 상태로 남게 되기를 희망합니다.

-      프로그래밍을 창의적인 과정으로 생각하고, 자기가 하는 일에 예술적인 요소를 끼워 넣습니다.

-      코드 작업을 시작하기 전에 코드의 구조에 대해 생각합니다.

-      지저분한 코드를 보면 추가 작업을 하기 전에 깔끔하게 정리하고 리팩토링해야겠다는 생각을 합니다.

-      다른 소프트웨어의 설계에 대해 끊임없이 공부하고 성공과 실패에 대한 지식을 쌓아 올립니다.

l  나쁜 프로그래머

-      뜨개질하듯이 코드를 작성해서 점점 딱딱한 공처럼 만듭니다. 자기가 만족할 때까지 일을 계속하고, 결과에 대해서 불평을 합니다.

-      나쁜 설계를 알아볼 모르고, 밀집된 코드를 가지고 작업할 때도 아무 협오감도 느끼지 않습니다.

-      즐겁게 해킹하듯 코딩하고 나서 자기가 어질러놓은 것을 다른 사람들이 치우라고 남겨둔 도망갑니다.

-      코드의 내부 설계를 음미하거나 존중하지 않습니다.

 

14. 소프트웨어 아키텍처

l  좋은 프로그래머

-      자기의 소프트웨어 아키텍처에 대해 알고 있고, 안에서 새로운 코드를 작성합니다.

-      설계 시나리오 각각에 대해서 적절한 아키텍처를 적용할 있습니다.

-      아름답고 세련된 단순한 아키텍처를 만들어냅니다 소프트웨어 설계의 아름다움을 올바르게 인식하고 있습니다.

-      시스템 아키텍처를 캡처해서, 계속 업데이트되고 있는 활성화된 문서 안에 기록합니다.

-      시스템 구조에 관한 문제점을 시스템 아키텍트에게 전달해서 설계의 개선에 도움이 되도록 합니다.

l  나쁜 프로그래머

-      아키텍처의 전체 비전에 전혀 신경을 쓰지 않으면서 코드를 작성합니다 결과 코드는 다른 부분과 조화를 이루지 못하게 되고, 컴포넌트들은 서로 통합 되지 않습니다.

-      코딩을 시작하기 전에 높은 수준의 설계를 수행하지 않습니다. 아키텍처 상에서 선택할 있는 대안을 모두 무시합니다.

-      아키텍처 수준의 정보를 머리 속에만 둠으로써 아예 접근할 없게 만들거나, 위험할 정도로 업데이트가 되지 않는 규격서 안에 둡니다.

-      부적절한 아키텍처를 참고 계속 사용합니다. 하부에 깔려 있는 문제점을 고치는 것이 아니라 거기에 잘못 설계된 코드를 추가 합니다 일이 커지는 것을 귀찮아 합니다.

 

15. 소프트웨어의 진화 또는 혁명

l  좋은 프로그래머

-      깨끗한 구조와 논리적인 레이아웃을 갖는 유지보수가 쉬운 소프트웨어를 작성한다.

-      나쁜 코드를 알아차리고, 그런 코드를 다룰 각오가 되어 있다.

-      코드의 변경을 시작하기 전에 코드와 원작성자의 모리 모델에 대해서 가능한 많은 것을 알려고 합니다.

-      자기가 작업하고 있는 코드의 품질을 돌본다.

l  나쁜 프로그래머

-      유지보수 프로그래머가 필요로 하는 것을 생각하지도 않고 복잡한 코드를 생성한다.

-      예전 코드를 관리하지 않으려 하고, 문제를 고치기보다 무시하는 것을 좋아한다.

-      좋은 솔루션을 생각하는 것보다 손쉬운 땜질을 좋아한다.

-      재빠르고 지저분한 해킹으로 코드의 주변을 어지럽힌다. 있는 모든 꼼수를 사용한다.

-      엉뚱한 곳에 주의를 집중하고, 실제로 고칠 필요가 없는 부분을 땜질한다.

 

16. 코드 멍키

l  좋은 프로그래머

-      정치적이고, 대인관계가 좋고, 예술적이고, 기술적으로 뛰어납니다.

-      플레이어이고, 정직/겸손하고, 끊임없이 발전하고, 주의 깊고, 열심히 합니다.

l  나쁜 프로그래머

-      좋은 코드의 작성에 관심이 없습니다.

-      팀에 속해서 일을 잘하지 못합니다.

-      실제의 자신보다 능력 있는 사람처럼 보이려고 애를 씁니다.

-      활기가 없습니다. 자신을 발전시키려고 하지 않습니다.

 

17. 여기 우리 함께 있네

l  좋은 프로그래머

-      자기가 작성한 코드에 대해 영역권을 주장하지 않습니다.

-      소프트웨어 시스템을 좋게 만들 있다면, 어떤 종류의 개발 업무든 수행할 것입니다.

-      팀에 기여하면서 배우고 성장합니다. 팀을 희생시키지 않으면서 성취할 있는 개인적인 목표를 세웁니다.

-      의사소통을 있습니다. 항상 다른 팀원들의 말에 귀를 기울입니다.

-      겸손하고, 팀에 도움이 되고, 다른 팀원들을 존중하고 가치 있게 평가합니다.

l  나쁜 프로그래머

-      자기만의 코드 제국을 건설하고, 자신을 아주 중요한 사람으로 만들려고 노력합니다.

-      자기만의 일을 하고 싶어하고, 가장 매력적인 일을 찾아 다닙니다.

-      팀의 효율성을 희생시켜가면서 가지가 하고 싶은 일을 수행합니다.

-      항상 자기의 개인적인 의견을 주장하고 싶어합니다.

-      팀이 자기에게 봉사하기 위해 존재한다고 생각하고, 자기가 팀의 최고 팀원이라고 생각합니다.

 

18. 안전한 소스 습관

l  좋은 프로그래머

-      자기가 일에 대해 책임을 지고, 코드 개발을 안전하게 보호하는 방법을 알고 있습니다.

-      소스 컨트롤을 신중하게 사용하고, 항상 레포지터리를 일관성 있고 사용 가능한 상태로 만들어 둡니다.

-      망가진 코드를 절대 소스 컨트롤에 체크인하지 않습니다.

-      유지보수하기 쉽고 사용하기 쉬운 코드를 만들겠다는 의도를 가지고 모든 툴을 신중하게 사용합니다.

l  나쁜 프로그래머

-      재앙이 일어나기 전까지는 코드의 안전성과 접근 가능성에 대해 신경을 쓰지 않습니다.

-      코드의 백업과 안전에 대해서 다른 사람이 생각할 것이라고 추측합니다.

-      문서의 업데이트에 신경을 쓰지 않습니다.

-      레포지터리에 있는 자기 코드의 상태에 대해 신경을 쓰지 않습니다 망가진 코드를 체크인하고, 자기가 어질러놓은 난장판을 다른 사람이 치우라고 그대로 둡니다.

 

19. 규격화 하기

l  좋은 프로그래머

-      규격서의 중요성을 알고 있고, 규격서를 이용해서 자기의 개발 생활을 편하게 만듭니다.

-      문서의 적절한 수준을 알고 있습니다.

-      자신의 문서 작성 스킬을 향상시키고 싶어 하고, 리뷰와 연습할 기회를 쫓아다닙니다.

l  나쁜 프로그래머

-      설계, 문서, 리뷰에 대한 생각을 하지 않고 코딩으로 곧장 다이빙합니다.

-      자기가 쓰는 텍스트에 대해서 생각을 하지 않습니다. 구조도 없고, 따라가기도 힘든 규격서를 만들어냅니다.

-      문서 작성을 피하려고 하고, 따분하고 무의미한 일이라고 생각합니다.

 

20. 사냥감 확인하기

l  좋은 프로그래머

-      코드 리뷰를 받고 싶어 하고, 자기의 코드 품질에 자신이 있습니다.

-      다른 사람의 의견을 받아들이고, 의견으로부터 배웁니다.

-      다른 사람의 코드에 대해 상대방 기분을 생각하면서 정확한 의견을 제시할 압니다.

l  나쁜 프로그래머

-      코드 리뷰를 두려워하고, 다른 사람의 의견을 무서워합니다.

-      비평을 나쁘게 받아들입니다. 방어적이고 쉽게 화를 냅니다.

-      리뷰를 통해서 자기보다 못한 코더들보다 자기가 잘났다는 것을 보여주려고 합니다. 심할 정도로 가혹하고 비건설적인 논평을 합니다.

 

21. 얼마나 걸릴까?

l  좋은 프로그래머

-      개발 프로세스의 모든 부분에 대해 생각하고, 건실한 컴포넌트 분할에 기초해서 훌륭한 소요시간 추정치를 만들어냅니다.

-      예상 소요 시간 안에 완전히 문서화되고 테스트된 코드를 만들어내고, 올바르게 통합시키려고 노력합니다.

-      소요 시간의 문제점을 일찍 부각시켜서 처리될 있게 합니다.

l  나쁜 프로그래머

-      오로지 육감과 직관에 기초한 자기가 희망하는 추정치를 만들어냅니다.

-      추정된 소요 시간 안에 약간의 코드를 해킹하듯이 만들어내기는 하지만, 높은 품질의 제품과 버그 없는 코드를 만들어내지는 못합니다.

-      소요 시간의 문제점을 받아들이는 것을 약함의 표시라고 생각하고, 바보 같이 그것을 따라잡으려고 애씁니다.

 

22. 프로그램의 요리법


2008. 9. 4. 21:03

if(ptnum > 0)
 {
  cvCalcOpticalFlowPyrLK(prev_gray, gray, prev_pyramid, pyramid,
                 m2DOld, m2DNew, ptnum, cvSize(win_size, win_size),
        3, status, 0,
        cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 20, 0.03), flags);
   flags |= CV_LKFLOW_PYR_A_READY;

   int k = 0;
   for(int i = 0; i < ptnum; ++i)
   {
    if( !status[i] )
               continue;

    m2DNew[k++] = m2DNew[i];
   }
   ptnum = k;
 }

 if(add_point)
 {
  m2DNew[ptnum].x = (float)pt.x;
  m2DNew[ptnum].y = (float)pt.y;
 
  add_point = false;
  cvFindCornerSubPix( gray, m2DNew, ptnum,
                cvSize(win_size,win_size), cvSize(-1,-1),
                cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,20,0.03));
  ++ptnum;
 }

tracking을 먼저 한 다음에 점을 추가해야

tracking이 제대로 된다

 if(add_point) 를 한 다음에

if(ptnum > 0)

를 실행하면 new2D 에 0.413 등의 소수점으로 바뀌어서

계속 tracking이 되지 않는다

주의하자

2008. 9. 1. 15:38
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

이렇게 하면 바탕 색이 적용된다.

glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

이렇게 하면 바탕색이 적용되지 않는다.
2008. 8. 19. 04:39

생각하건데 OpenCV 모든 함수에서도 그렇겠지만

함수의 인자에서 포인터를 넣으면 안 된다

예를 들어서


class CDataSet
{
protected:
 CvPoint2D32f * m2DNew;
 CvPoint2D32f * m2DOld;

public:
CvPoint2D32f * GetNew() { return m2DNew; }
 CvPoint2D32f * GetOld() { return m2DOld; }
};

이라고 했을 때

cvCalcOpticalFlowPyrLK(prev_gray, gray, prev_pyramid, pyramid,
                     OldPt, NewPt, *n,
         cvSize(win_size, win_size), 3, status, 0,
         cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 20, 0.03), flags);

이렇게 했을 때

Point Tracking 이 되지 않는다.

이거 때문에 이틀을 날리고 그 다음에

두번째 실수이다 잊어버리지 말자

그래서 같은 클래스에 넣었었던 것으로 기억된다.