[C++] __VA_ARGS__ 를 유니코드로 변경하기

대충 요약해서 아래와 같은 매크로가 있었다.


#define MAKE_STRING0(str1) L#str

#define MAKE_STRING(str1, str2) L#str1 L#str2

MAKE_STRING0 를 없애려고 variadic macro 1 를 써보려고 했음.

 

#define MAKE_STRING(str1, ...) #str1 #__VA_ARGS__ //non-unicode

MAKE_STRING(any_token) 이런 식으로 2번째 파라미터가 없을 때 non-unicode 버전으로 만들면 문제 없으나

 

#define MAKE_STRING(str1, ...) L#str1 L#__VA_ARGS__ //unicode 

unicode 버전에서는 __VA_ARGS__ 가 사라지면서  “L” 만 남는 불상사가!

macro overloading 뭐 비슷한게 없을 까 해서 stackoverflow 를 찾아보니 http://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments  흐익 이런 트릭이…

여기서 아이디어를 얻어와서 다음과 같은 방식으로 해결!

#define TO_UNICODE_IMPL(first, ...) L#first
#define TO_UNICODE(...) TO_UNICODE_IMPL(__VA_ARGS__, "")
#define MAKE_STRING(str1, ...) L#str1 TO_UNICODE(__VA_ARGS__)
  1. http://msdn.microsoft.com/ko-kr/library/ms177415(v=vs.100).aspx

[ios] UITextView 의 Placeholder text 지우기 & 다른 곳을 터치하면 키보드 없애기

맥북 프로 샀었던 (이미 7월에 샀는데 -.,-) 기념으로 깨작거리기.

0. .h <-> .m 파일 switching : control+command+arrow up

1. UITextView 를 클릭했을 때 미리 입력된 Text 속성을 지우고 싶었다. 보통 <your message here> 이런 것을 미리 넣어놓고, 포커스되면 지우는 그런 UI 있잖슴. 그런데 UITextView 는 IBAction을 받지 못한다. (왜 그런지는 아직 모른다…이제 첫페이지 읽었다.) ViewController 가 UITextViewDelegate 프로토콜을 구현하면 된다고 한다.

@interface 당신의ViewController : UIViewController

대신

@interface 당신의ViewController : UIViewController <UITextViewDelegate>

이렇게 입력하고 마우스를 UITextViewDelegate 쪽으로 가져가면 xcode quick help가 UITextViewDelegate Protocol Reference 링크를 보여준다. 거기가서 쓱 보고 알맞은 함수를 찾자. 나는 포커스가 갔을 때 행동할 것을 구현하려고 했으니 textViewDidBeginEditing 함수를 구현하면 된다. 아참 중요한 게 있네. viewDidLoad 함수에 넣을 게 있다.

자기가_만든_UITextView의_IBOutlet변수.delegate = self;

이걸해야 UITextView 가 받는 이벤트를 ViewController 로 던지나보다.

 

2. UITextView 가 아닌 다른 곳을 터치하면 키보드가 사라지게 하고 싶었음. 검색해보면 과거 Interface Builder 를 주로 쓸 때의 예제 밖에 잘 없어서 삽질 좀 했다.

  1. 일단 스토리보드에서 배경에 해당하는 UIView를 터치한다.
  2. Identity Inspector 를 연다.
  3. Custom Class 항목에 Class 에 UIView 라고 아마 써있을텐데 이걸 UIControl 로 변경한다.
  4. Connections Inspector 로 가보자. Sent Events 가 생겼다! 오예~
  5. 뭐 그 다음은 버튼 연결하듯이 스토리보드로 가서 UIView를 Control 누른 상태로 ViewController.h 로 드래그 엔 드랍한다.
  6. 그럼 팝업 윈도우가 뜬다. Connection 에 Action을 선택
  7. 이름은 아무거나 나는 backgroundTouched 를 입력했음.
  8. Event 는 TouchDown 을 선택
  9. 자 이제 남은 건 새로 추가된 IBAction 함수 구현이다. 이건 쉽다. xcode documentation 에서 dismiss keyboard 로 검색하면 나온다. 요약하면 키보드를 부른 textView의 outlet 변수가 a 라면 [_a resignFirstResponder]; 라고 입력하면 된다.
- (IBAction) backgroundTouched:(id)sender {
    [_textView resignFirstResponder];
}

ps : 헤드퍼스트 아이폰~ 책 보고 있다. 1번을 뜬금 없이 찾게 된 계기는 예제에서 지들이 text 에 placeholder 넣어놓고, 그걸 지우는 예제가 없이 나중에 활용하는 코드가 이어 나와서 아놔 이뭐병 이러다가 찾게되었어..

[UnitTest] 유닛테스트 실행 속도 개선하기

개발 마감을 앞두고 약간의 잉여 시간이 생겨서 작업해 보았다. 시작은 이렇다. DEBUG빌드, 디버거(VS2010SP1)가 붙은 상태에서 약 1,000개의 유닛테스트가 싱글쓰레드로 실행된다. 실행 시간은 46초 정도. 하나당 46ms 정도 걸렸다. 16G i7 머신에서 이정도로 돌리가 없다고 의심했다.

동일한 환경에서 30초로 돌고 있는 동료 머신이 있었다. 뭐가 다르지 하면서 깨작이다가 삼성SSD 매지션이라는 프로그램 설정을 건드렸더니 내것도 30초로 줄었다. 왜 해결되었는지는 그때까지도 몰랐다. 46초였던 다른 동료가 매지션 설정을 변경했지만 안된다고 했다.  그 뒤에 우연히 찾았다. 윈도우즈7 기준으로 제어판->전원 옵션->고성능으로 변경하면 실행 시간이 줄어든다. 매지션이라는 프로그램은 전원 옵션에 새로운 옵션을 하나 만들어 주는 역할을 하는 것이었다.  그럼 고성능 설정이 왜 속도를 빠르게 할까? 말 그대로 고성능이니까 -_-? 좀 더 찾아보니1 균형 모드에서는 터보부스트 기능이 활성화 안되는 문제(?)가 있나보다.

이렇게 재수좋게 성능 향상을 한 뒤(으하하;;) 가벼운 마음으로 다음 의심 되는 녀석인, 각 테스트 하나하나 마다 실행되는 TestEventListener 를 조사했다. (google test 에서의 용어임) 싱글턴 객체의 목록을 초기화 하는 코드가 있는데 탬플릿으로 싱글턴 객체의 크기를 조절할 수 있다. 왜인지 모르겠지만 디버거(VS2010)가 붙은 환경에서만 이 객체의 크기가 ‘커질수록 급격히’ 성능이 줄어든다. (최초의 크기는 320k 정도…추후 줄인 후 크기는 20k) 물론 _NO_DEBUG_HEAP=1 옵션도 입력되어 있는 상태였다.  디버그 모드에서는 해당 싱글턴의 크기가 중요한 건 아니라서, 디버그 모드일 때 크기를 줄여놓는 것으로 결론냈다.  30초였던 실행 시간은 17초로 줄었다.  추후 시간이 된다면2 디버거가 어떤 이유로 더 느려졌는지 따로 실험을 해보고 싶다. 일단 기대하는 성능은 얻었으니 여기서 끝~