2014의 게시물 표시

Iterator Pattern

이미지
ref. GoF Design Pattern. Intent 내부 구조를 노출하지 않고 집합 객체의 element를 순차적으로 접근 할 수 있는 방법을 제공 Also Known As Cursor Motivation 집합 객체의 element에 대한 access와 순회에 대한 책임을 Iterator Object에 전가 Iterator class는 집합 객체의 element에 순차적으로 접근 할 수 있는 다음의 Interface를 정의 First() : current element를 첫번째 element로 초기화  Next() : current element를 다음 element로 변경  IsDone() : current element가 마지막 element 인지 확인  CurrentItem() : current element를 return  이러한 Iterator class를 다형성을 지원하도록 일반화  Aggregate : Iterator Object를 생성하기 위한 Interface를 정의  ConcreteAggregate : Aggregate를 Implement한 집합객체  Iterator : element를 접근하고 순회하기 위한 interface를 정의  ConcreteIterator : ConcreteAggregate에 대한 Iterator  Consequences 객체 내부의 표현 방식을 모르고도 객체의 각 요소를 순회  집합 객체를 순회하는 다양한 방법을 제시  서로 다른 집합 객체 구조에 대해서도 동일한 방법으로 순회 가능  Implementation 누가 Iterator를 제어 하는지에 따라 다음의 두 가지 방식의 Iterator로 나뉨 External Iterator Client가 Iterator를 control. Internal Iterator보다 유연함  Ex)  C++ STL이나 java의 Iterator  C#의 IEnumerato

Google Test를 이용한 Class의 Private/Protected Member Test

ref : googletest advance guild 예전에는 Private/Protected member를 Test할때 test main에 #ifdef TEST #define private public #define protected public #endif 이런 코드를 삽입하여 Test 하는 개발자를 보았다.. ㅋ 이럴 경우 #define TEST를 삽입하면 Test 대상이 아닌 모든 class의 접근 권한까지 public이 되어 버리는 상황이 발생한다. 뭐.. 구현과 Test code의 컴파일을 분리하면 별 문제는 되지 않겠지만...대세처럼 되어가는 TDD 방법론의 경우 Test code를 작성하면서 main code를 작성하기 때문에 위와 같은 code는 개발자가 의도하지 않은 실수를 유발하기 딱 좋다 ㅋ Google Test는 이러한 상황에서 Test code가 다른 프로그램 까지 영향을 미치지 않도록 하는 좋은 방법을 제공한다. // foo.h #include "gtest/gtest_prod.h" // Defines FRIEND_TEST. class Foo {   ...   private :   FRIEND_TEST ( FooTest , BarReturnsZeroOnNull );   int Bar ( void * x ); }; // foo_test.cc ... TEST ( FooTest , BarReturnsZeroOnNull ) {   Foo foo ;   EXPECT_EQ ( 0 , foo . Bar ( NULL ));   // Uses Foo's private member Bar(). } 깔끔하다.. FRIEND_TEST는 gtest_prod.h에 정의 되어 있는데 코드를 보면 다음과 같다. #define FRIEND_TEST(test_cast_name, test_name)\ friend class test_case_na

std::string::find(...) 사용시 실수..

bool DoTest() {     std::string temp("TEST0006.ts");     if (temp.find("TEST") == 0 && temp.find(".m3u8") > 0) {         return true;     }     return false; } 위 함수를 수행하면 결과는? 결과는 false를 예상했지만... true 가 나온다. 왜? temp.find(".m3u8") 이 -1 이 나오니까 false가 나올꺼 같은데... c++ standard를 찾아보니...     size_type find(const _CharT* __s, size_type __pos = 0) const { ...} 으로 되어 있다. size_type을 찾아보니.. unsigned integral type 이다. unsigned int에서 -1은 최대값 65535이므로 true가 맞다. 앞으론 실수하지 않아야겠다.. -_-;;

gstreamer debug log 출력하는 방법

gstreamer 이용한 실행 파일 실행 전에 $ export GST_DEBUG=[Level] Level = 1 : GST_ERROR()  Level = 2 : Level 1 + GST_WARNING() Level = 3 : Level 2 + GST_INFO() Level = 4 : Level 3 + GST_DEBUG() Level = 5 : outputs everything 을 입력 후 실행

Exceptional C++ Style : 15. 접근 권한의 사용과 오용

이미지
Access Modifiers public protected private class 자신 접근 가능 접근 가능 접근 가능 파생 class 접근 가능 접근 가능 접근 불가 friend 접근 가능 접근 가능 접근 가능 외부 접근 가능 접근 불가 접근 불가 위의 표를 보면 private나 혹은 protected는 외부에서 접근이 불가능하다고 하지만 방법이 없는 것은 아니다. 표준을 만족하지 않고 이식성(Portability)을 만족하지 않는 많은 편법이 존재하고 있으며 그 중 악명높은 방법들을 3가지로 압축하고 있다. Forger(위조범) Pocketpicker(소매치기) The Cheat(사기꾼) 그리고 표준을 완전히 만족하면서 이식성도 보장하는 1가지 방법을 소개한다. 다음 코드를 예로 설명하면 // X.h #ifndef X_H_ #define X_H_ #include <stdio.h> class X { private:    int private_; public:    X() : private_(1) {}    virtual ~X();    template<class T>    void f(const T& t) {    }    int Value() {        return private_;    } }; #endif /* X_H_ */ 위의 코드는 private_라는 private member를 가지고 있고 1로 초기화 되어 있으며 해당 값을 변경할 수 있는 member function을 제공하지 않는다. 이 값을 앞서 말한 3가지 편법과 1가지 적법을 이용하여 변경해보면, Forger(위조범) X.h의 X class의 정의를 복사하고 friend를 추가한다. 이 방법이 위법인 이유는 ODR(One Definition Rule) 을 위반하기 때문이다. 단, 하

Ubuntu에서 wireshark 사용하기

이미지
Ubuntu에 wireshark를 처음 설치 하고 실행하면 network interface가 보이지 않아 패킷 캡춰를 할 수 없다. 이유는 권한 문제인데 super user 권한으로 실행하면 된다..  문제는 매번 이렇게 하기 귀찮다라는 것. terminal에 이렇게 입력해 보자 $ sudo dpkg-reconfigure wireshark-common 위 화면이 나오면 wireshark를 root 권한으로 쓰는 것의 대안으로 Dumpcap을 설치하고 일반 사용자도 패킷 캡춰할 수 있도록 할꺼냐고 물어본다.  <Yes> 를 선택한 후 wireshark를 실행하면  일케 나온다.. -_-  ls로 해당 파일의 속성을 보면 헐.. file permission이 owner랑 group에만 실행 가능 하다고 나와 있다. -_-;; 일반 사용자도 쓸수 있다며;; (이해 안되면  FilePermissions  참고 하시길..) 아래와 같이 실행 권한을 주자. $ sudo chmod +x /usr/bin/dumpcap 다시 파일 속성을 확인 하면 마지막에 실행 권한이 추가되었음을 확인 할 수 있다. 다시 wireshark 실행하면 아래와 같이 network interface가 정상적으로 잡힘을 확인 할 수 있다. 끝.