java Byte.parseByte throw exception java.lang.NumberFormatException

 Java 에서 개발중에 16진수 값으로 구성된 String type의 Mac 주소를 String을 Byte Array로 변경하기 위해 다음의 코드를 작성하였다. 1 2 3 4 5 String temp [] = strMacAddr . split ( "(?<=\\G..)" ); byte [] mac Addr = new byte [ temp . length ]; for ( int i = 0 ; i < mac Addr . length ; i ++) { mac Addr [ i ] = Byte . parseByte ( temp [ i ], 16 ); } 여기서 잘 실행될줄 알았지만... java.lang.NumberFormatException이 발생했다. 이유는 java의 모든 정수형 primitive type은 signed value 이기 때문이다. unsigned를 지원하지 않는 이유는 찾아보면 많다 ㅋ 다음은 java를 만든 james gosling 횽님의 인터뷰이다. (발췌 :  http://www.gotw.ca/publications/c_family_interview.htm ) Gosling: For me as a language designer, which I don't really count myself as these days, what "simple" really ended up meaning was could I expect J. Random Developer to hold the spec in his head. That definition says that, for instance, Java isn't -- and in fact a lot of these languages end up with a lot of corner cases, things that nobody really understands. Quiz an...

git reset 으로 원하는 이전 commit으로 되돌리기

git에서 commit을 이전의 commit 상태나 branch로 되돌리리려면 아래와 같이 reset을 사용하면 된다. $ > git reset [commit-id][ ~|^] [숫자] 여기서 [commit-id]  다음에 ~ 와 ^ 가 올수 있는데 각각의 의미는 다음과 같다. [commit-id][~][숫자] : [commit-id]를 기준으로 [숫자]만큼의 commit-id [commit-id][^][숫자] : [commit-id]를 기준으로 [숫자] 번째의 branch의 commit-id 1은 master branch  만약에 latest commit-id의 3번째 이전 commit으로 되돌아간다면 $ > git reset HEAD~3 3번째 이전 commit에 2번째 branch로 되돌아 간다면 $ > git reset HEAD~3^2 위와 같이 사용할 수 있다. 참고로 정확하게 돌아갈 commit id를 가리키는지 확인하려면 $ > git log HEAD~3^2 를 먼저 해서 가장 위의 log가 되돌리려는 commit-id인지를 확인하는걸 추천한다...

Google Mock

Why Mock? Mock Object는 real object를 모방하여 대신하기 위해 만들어진 객체로서 real object와 같은 interface를 가지고 각각의 interface 호출시 유저가 정의한 값을 반환하도록 만들어진다. 이러한 Mock Object는 다음의 이유로 사용된다. Object가 비결정적 결과를 return할 때 (현재 시간, 온도 등) Object가 재현 또는 구현하기 힘든 상태를 가질 때 (network error) Object의 동작이 느릴 때 (Test 전에 초기화 되어야 하는 DB) Object를 아직 구현하지 않았거나 동작이 바뀌었을 때 Test를 위한 method나 information을 포함해야 할 때 여기서 Unit Test 시에는 마지막 두가지 이유로 Mock을 사용한다. 아직 구현되지 않은 Object를 대신하여 Test를 진행할 수 없을 때 fake object의 목적으로 구현 Test하고자 하는 과정에서 대상 객체의 Interface가 다음과 같이 정상적으로 호출되었는지를 검사 호출시 parameter 검사 호출 횟수 검사 Google Mock 자체는 Test Framework가 아니라 앞서 말한 Mock Object를 쉽게 만들어주기 위한 도구이다. 결국 Test를 위해서는 Test Framework와 같이 사용되야 한다. Google Test bundel과 함께 제공되므로 Google Test를 사용해도 좋고 CppUnit등과 같은 다른 Test Framework 와 같이 사용할 수 도 있다. System Requirement gcc 4.0+ or Microsoft Visual C++ 8.0 SP1 Users reported that it also works with gcc 3.4, Microsoft Visual C++ 7.1, and Cygwin, although we haven't tested it there ourselves. E...

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 Iterat...

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)\ frien...

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 을 입력 후 실행