2010년 12월 9일 목요일

googletest

최근에 Visual Studio 와 C++ 을 쓰면서 unit test framework 를 찾다 googletest 에 도착했다.
생각보다 간단히 설치되고 사용도 간편했다. eclipse 에서 junit 쓰는 것 보단 복잡하고 파란막대가 나오진 않지만..
googletest 에서 소스를 통째 다운 받는다.
압축을 풀어보면 여러 폴더들이 나오고 msvc 폴더에 보면 Visual Studio 의 프로젝트 파일이 들어있다. Visual Studio 에서 열어 빌드하고 gtest.lib 가 나오면 프로젝트에 연결해서 사용하면 된다.
빌드할때 런타임 라이브러리를 위와 같이 맞춰야 한다는데 어떤 차이가 있는지 시간날때 한번 알아봐야 겠다.


실제 코드는 샘플만 봐도 쉽게 알 수 있을 만큼 직관직이다. 굳이다.
test fixture 를 사용하는 걸 간단히 보면
// ::testing:Test 를 상속받아 클래스를 만든다.
class ModuleTest : public ::testing:Test {
  ModuleTest() {}
  virtual ~ModuleTest() {}
  virtual void Setup() {}
  virtual void TearDown() {}
}
// 만든 클래스로 테스트를 한다.
TEST_F(ModuleTest, 모듈_1_입력테스트) {
  ASSERT_EQ(expected, actual);
}

2010년 11월 11일 목요일

오랜만에 책 구매

회사를 옮기고 이것저것 새로이 배워야 할게 많아졌다는 핑계로 거의 책을 안 보고 있었다.
거기다 폴더폰을 사용하다 스마트폰으로 바꾸게 되니 책은 뒷전이고 남는 시간은 스마트폰 가지고 노는데 다 허비했다.

이때 팀원들이 스터디 필요성을 이야기 하면서 'GoF 디자인 패턴! 이렇게 활용한다' 라는 책을 선택해 오전에 스터디를 하기로 했다.
디자인 패턴을 언제 한번 봐야겠다 생각하던 차에 올커니 하고 몇권을 더 구매해서
현재 읽히길 기다리고 있는 책이 3권


이나 있다.

어릴때 부터 책에 대한 욕심?이랄까 책을 사기만 하면 내 지식이 되는 느낌?이랄까
해서 책사는데 주저함이 없다.
덕분에 읽지도 못하고 있는 CODE COMPLETE 2ed 을 덥석 사버렸지만..

Head First 책은 Head First C# 을 처음 봤는데 구성이 신선하고 쉽게 읽을 수 있어서 괜찮았다. 물론 책 구성상 깊이 있는 설명이 부족한게 사실이지만 처음 접하는 분야의 책은 Head First 로 시작하는게 상당한 장점이 있다고 생각된다.
그래서 이번에도 Head First Design Pattern 을 구매했고
인사이트의 블로그 추천! 소프트웨어 엔지니어링 책 100선에서 두권 다 꽤 높은 순위에 있기도 해서 주저 않고 했다.

 

뭐 어쨌거나 책을 좀 열심히 보자 뭐 그런 이야기다.

2010년 9월 28일 화요일

정규표현식의 함정

손에 잡히는 정규표현식이란 책을 읽고 정규표현식의 매력에 푹 빠져있었다.
어쩌면 제대로 쓸 기회를 갖지 못해서 뜬구름만 잡고 환상속에 살고 있었는지도,,

업무에 관계되어 요 며칠 정규표현식을 뒤지고 다녔다.

무려 14개나 되는 패턴을 만들어놓고
하나씩 지워나가도록 했다.

html 파일에서 처음엔 스크립트 태그들을 지우고, 그 다음은 스타일 태그,,
신나서 이것저것 자꾸만 추가했다가
오늘에야 뒤통수 맞은 느낌을...

나처럼 어설프게 배워서는 정규표현식을 최적화 하지 않고 마구잡이로 쓰다간
CPU 사용률 100% 에 속터지게 느려지는 컴퓨터와 마주하게 될 것이다.

자바에는 정규표현식을 쓰지 않아도 왠만큼 처리가능한 많은 클래스가 있다.
간과하고 있었다.

CPU를 괴롭히던 녀석은 [^ㄱ-ㅎㅏ-ㅣ가-힣\w] 인데
특수문자들을 제거하기 위해 넣었던 놈이다.

혹시나 하고 검색을 해보니 발견.. 두둥

boolean java.lang.Character.isLetterOrDigit(char ch)

한글까지 지원된다고 하니 즉시 교체,,
성능은 대 만족!!

뭐든 어설프게 배워서 좀 안다고 까불다간 큰코다친다는 오늘의 교훈!

2010년 8월 7일 토요일

Android 에뮬레이터 실행시 오류

eclipse 의 Android SDK and AVD Manager 로 AVD 를 만들고 에뮬레이터를 실행하려는데 다음과 같은 오류가 발생하는 경우가 있다.

emulator: ERROR: bad config: virtual device directory lacks config.ini

컴퓨터 사용자 명이 한글로 되어 있는 경우에 발생한다.

ndroid SDK and AVD Manager 로 AVD 를 만들게 되면
C:\Documents and Settings\[사용자명]\.android\avd
폴더 내에 AVD 이름으로 된 ini 파일이 있고 그 파일에 avd 정보가 들어있다.
예를들어 Google2.2 라는 이름으로 AVD 를 만들었을 경우
C:\Documents and Settings\[사용자명]\.android\avd\Google2.2.ini
C:\Documents and Settings\[사용자명]\.android\avd\Google2.2\[상세한 설정파일]
로 파일들이 만들어진다.

Google2.2.ini 파일은

target=Google Inc.:Google APIs:8
path=C:\Documents and Settings\[사용자명]\.android\avd\Google2.2
와 같은 정보가 들어 있을 뿐이다.

여기에서 Google2.2.ini 파일은 읽었으나 C:\Documents and Settings\[사용자명]\.android\avd\Google2.2 폴더는 한글때문에 찾지 못하는 것으로 보인다.

SDK 가 설치된 폴더의 tools 폴더의 android.bat 파일을 이용해서 avd 를 특정 폴더에 만들 수 있다.

android create avd -n [AVD이름] -p [경로] -t [타겟]

타겟은 android list target 으로 확인 할 수있다.

위의 Google2.2 를 C:\avd 에 만드는 경우

android create avd -n Google2.2 -p C:\avd -t 10

으로 할 수 있다.

2010년 7월 30일 금요일

사이냅소프트 2010년 상반기 추가 채용 퀴즈 - 1

외부 라이브러리나 프레임워크는 쓸 수 없습니다
- 입력된 발사각도와 초기속도를 가지고 포탄의 궤적을 그립니다.
- 궤적은 x축을 따라 8픽셀씩 이동하면서 y축 값을 asterisk 문자로 찍어줍니다.
- 화면의 크기는 600 x 400 으로 하며, 화면을 벗어난 궤적은 보여주지 않습니다.
- 타겟의 위치는 x축상의 300 ~ 600픽셀 사이에서 랜덤하게 정합니다.
- 적당한 오차범위 내에서 궤적이 타겟에 일치하면 메시지를 보여줍니다.
- 1 pixel 은 0.1m
사이냅소프트 2010 상반기 추가채용에 지원하기 위해 풀어야 하는 퀴즈다. 관심을 가지고 있는 회사라 당연히 퀴즈를 풀어보았다.
퀴즈를 정리해서 구현해야 할 부분을 뽑아내면
  1. 포탄의 각도와 속도를 입력하면 포탄이 날아간다.(x축 8픽셀마다 포탄을 표시한다)
    1. 포탄은 각도와 속도를 가진다.
      - 포탄을 화면상에서 이동시키기 위해 각도와 속도를 통해 가로속도, 세로속도로 변환한다.
    2. 포탄은 x축 8픽셀마다 표시된다.
      - x축의 이동거리는 0.8m 로 고정하고 y축의 이동거리를 이에 맞게 보정한다.
  2. 포탄은 날아가면서 중력의 영향을 받는다.
    1. 포탄의 가로속도는 고정된다.
    2. 포탄의 세로속도는 중력에 따라 속도가 변한다.
      - y축의 이동거리를 중력값으로 보정한다.
  3. 정해진 크기의 화면 밖으로 나간 포탄은 보여주지 않는다.
  4. 포탄이 오차범위 내로 타겟에 접근하면 메세지를 보여준다.
와 같다.
1.1 을 구현하기 위한 테스트코드는

function testGetVerticalVelocity() {
var bullet = new Bullet(90, 10);
assertEquals("when degree is 90, VerticalVelocity is equals Velocity", 10, bullet.getVerticalVelocity());
var bullet = new Bullet(0, 10);
assertTrue("when degree is 0, VerticalVelocity is 0", 0.0001 > bullet.getVerticalVelocity());
var bullet = new Bullet(23, 10);
var expected = 10 * getSin(23);
assertEquals(expected, bullet.getVerticalVelocity());
}

function testGetHorizontalVelocity() {
var bullet = new Bullet(90, 10);
assertEquals("when degree is 90, HorizontalVelocity is 0", 0, bullet.getHorizontalVelocity());
bullet = new Bullet(0, 10);
assertEquals("when degree is 0, HorizontalVelocity is equals Velocity", 10, bullet.getHorizontalVelocity());
bullet = new Bullet(23, 10);
var expected = 10 * getCos(23);
assertEquals(expected, bullet.getHorizontalVelocity());
}


물론 getSin, getCos 은 라디안 값으로 바꿔서 Math.sin Math.cos 을 사용하면 되겠다.

1.2 는 각 세로, 가로 속도를 보정해야한다. 즉 가로 속도는 8px/[시간] 으로 표현되고 일반적인 1초에 이동하는 pixel 이 아니라 8pixel 을 이동하는 시간을 계산하고 계산된 시간으로 세로속도도 표현한다.

function testGetVerticalDistanceForPixelUnit() {
var bullet = new Bullet(0, 8);
assertEquals(0, bullet.getVerticalDistanceForPixelUnit());
var bullet = new Bullet(45, 10);
assertEquals(8, bullet.getVerticalDistanceForPixelUnit());
var bullet = new Bullet(23, 10);
assertEquals(3.4, bullet.getVerticalDistanceForPixelUnit());
}
function testGetNewHorizontalDistance() {
// 속도에 상관없이 수평이동거리는 항상 0.8m 즉 8px 이다.
var bullet = new Bullet(0, 10);
assertEquals(8, bullet.getHorizontalDistanceForPixelUnit());
var bullet = new Bullet(0, 50);
assertEquals(8, bullet.getHorizontalDistanceForPixelUnit());
var bullet = new Bullet(45, 10);
assertEquals(8, bullet.getHorizontalDistanceForPixelUnit());
}

이사하다

기존블로그에서 이사했다.
가장 큰 이유는 syntax highlighter 가 이글루스에서는 쓸 수 없다는거.
Blogger 와 T-story 중에서 고민하다가 결론은 Blogger로