항공사고 수사대 – 에어맥시코 Flight 498 and The piper archer N4891F

http://en.wikipedia.org/wiki/1986_Cerritos_mid-air_collision

관제사가 TCA에 잘못 들어온 Grumman AA-5 Tiger 에 정신이 팔려 있는 도중, 에어 맥시코 Flight 498 와 The piper archer N4891F가 캘리포니아 세리토스 시 상공에서 충돌, 주거지역으로 낙하하여 승객과 추거지역의 사람들이 죽었다.

1. LA공항 레이더가 구렸다. 경비행기정도는 레이더에 나왔다가 안나왔다 했다고. 사고 이후 신형으로 교체됨.

2. 경비행기인 The piper archer N4891F에 설치된 트랜스폰더는 레이더에 고도를 전송하지 않아서 관제사가  에어 맥시코와 동일 고도가 되는 줄 몰랐다. 이후 경비행기의 트랜스폰더들도 고도 전송하도록 법이 바뀜

3. 항공기에 충돌 경보 장치(TCAS)가 없었다. : 충돌 경보 장치인 TCAS가 사고 이후 모든 항공기에 의무 탑재됨. 40초 안에 충돌 가능성이 있으면 조종사에게 알린다.

[etc] visual studio online 5분 감상.

쓰기 전 처음 상상은 코드와 비주얼 스튜디오가 모두 클라우드에 있고 VDI 처럼 쓸 수 있나? 였다. 하지만 원격 레파지토리 생성한 뒤 visual studio 2013 을 다운 받으라고 해서 김샜다. 내심 빌드도 다 클라우드에서 해서 로컬에 바이너리만 던져줬음 했는데 역시 그런 것은 아님.

hello world 를 로컬에서 만들고 MS가 제공하는 GIT 원격 레파지토리에 올려서 cloud build 해봤다. 그 뒤 introduction page 를 좀 읽어보니 MS가 제공하는 azure 클라우드를 이용하고 MS가 제공하는 agile 도구들을 모두 쓰는 방식이라면 좀 쓸모가 있지 싶더라. 직전 프로젝트에는 회사망에서 Teamcity 로 Build & Test 를 진행하고, jenkins 로 배포했었다. visual studio online 이 딱히 이것보다 좋아 보이지 않는다. 그냥 우리도 이런거 된다~ 이정도로 느껴졌다.

[etc] Withings WS-50 Smart Body Analyzer wifi 재설정하기

공부방 공유기가 고장나서 체중계와 WIFI 다시 연결을 해야 했음.

아이폰 withings 앱에 새 기계 등록하듯이 하면 된다.

설마 이 기기를 새로 등록해야 하는가 했는데 검색해보니 설마가 사실이었음.

기존 앱에 기기 설정이 있더라도 그냥 덮어 쓴다. 편하지만 이걸 받아들이기 까지 오래걸렸다.

와이파이 변경 메뉴라도 따로 만들어 놓지..

항공 사고 수사대 – 보잉737기의 미스터리 (united 585, us airline 427)

  1. 비행기가 갑자기 방향을 잃고 급강하 하여 추락. 585,427 모두 비슷한 현상. 같은 보잉737  비행기. 3년의 차를 두고 발생함.
  2. 두 사건 모두 미결 사건으로 남을 뻔 했는데 비슷한 사고지만 무사히 착륙한 사고가 있어서 재 조사에 활력이 됨. (역시 멀쩡하게 재현이 되어야 힘이 난다)
  3. 테스트할 때 멀쩡해보이던 방향타 조사 장치가 실제 비행 환경과 유사한 환경에서 멈추는 문제를 보였음. (재현 환경이 중요하다..)
  4. 또한 특별한 경우에는 조종사의 의도와 정 반대로 동작하기도 했음.

[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 디버거가 어떤 이유로 더 느려졌는지 따로 실험을 해보고 싶다. 일단 기대하는 성능은 얻었으니 여기서 끝~