도대체 무슨 일이 있었던 것일까 어젯밤부터 궁금했는데
지난 며칠간 장애가 있었다는 사실을 오늘 출근해서야 무슨 일이 있었는지 알게 되었습니다.
그 긴박했던 시간들을 사죄와 함께 이야기 해드리죠.
2009년 3월 20일 금요일
어떤 마법사 한분이 깜빡 인증을 걸지 않고 피망 공통 파일이 업로드하다.
그 시각 이후, UAC가 적용된 윈도우 비스타에서 피망 공통 파일들이 제대로 설치가 되지 않는 현상이 발생.
이 패치는 IE8를 위한 패치였다.
2009년 3월 23일 PM 12시 30분
Rhea君, 점심 식사를 마치자마자 운영팀에게 긴급체포.
오래전 비스타때 니가 했으니 니가 고치라는 배려와 따스한 눈길로 봐라보는 엄중한 감시하에 버그 원인 규명을 강요받음.
잘 고치면 고객센터 여직원들과 만나게 해줄지도 모른다는 부질없는 기대 하에 정작 하던 일을 버려두고 작업 개시.
이때만 해도 그냥 인증서만 갱신해주면 된다고 생각함.
2009년 3월 23일 PM 01시 23분 "지난 주말 동안 내 블로그에 피망으로 검색되어 들어온 손님 엄청 많았다~~ 랄라~~"
"와~ 좋겠다, 담부턴 버그 발생 전에 패치 파일을 올린 다음, 구글 애드 센스 붙이는거야!"
등의 헛소리를 주고 받음.
그리고 지난 금요일 패치의 이유는 IE8 때문이었다는 보고를 들음.
이때부터 IE7과 IE8, 각각의 UAC On/Off 상황을 번갈아가며 에러원인 규명
운영팀, 점점 먹이를 노리는 매의 눈빛으로 변하기 시작함.
2009년 3월 23일 PM 02시 00분
Rhea君, HDD 속에 있는 인증서가 유효기간이 지난 것임을 확인,
SE들을 비롯한 각 부서에 요청.
또한 조금이라도 이상 현상 발생시, 관련 부서를 무조건 까기 시작함.
"이거 이거 이렇게 된거, 니네가 말안하고 올렸지?"
"이거 설정 누가 바꿨어!!!"
등의 공격에,
"...그거...올해 들어 한번도 업데이트 안했어."
로 바로 응전이 들어옴.
2009년 3월 23일 PM 02시 35분
인증서를 예쁘게 바꿔 달아도 UAC 하에서 실행 불능 발생.
고객센터에 문의가 빗발침.
운영팀의 감시가 더더욱 엄중해지며 식은 땀이 흐름.
지나가던 1人,
"얼래? 오늘은 운영팀으로 취직했어요?"
2009년 3월 23일 PM 03시 00분
Self Extract(SFX)파일에 대한 인증 상속이 되지 않는다고 느낌.
모든 EXE에 일일이 인증을 걸기 시작함.
운영팀, 작두를 준비하려고 함 ㅠ.ㅠ
2009년 3월 23일 PM 03시 42분
레지스트리가 무한 삭제되는 현상 발견.
믿을껀 Process Monitor뿐, 고마워요 SysInternals.com 복받으세요 ㅠㅠ
이때만 해도 레지스트리를 삭제하는 것은 UAC가 범인이라고 굳게 믿음.
왜냐면 오래전 범인은 UAC였었으니까... .
따라서 당근 인증서 문제라고 인증에 계속 매달림.
2009년 3월 23일 PM 05시 30분
각종 개삽질 시작함.
하나 둘씩 관련자 모여들기 시작함.
2009년 3월 23일 PM 06시 00분
운영팀 파티션에 각종 용병 개발자들이 한가득 도착함.
운영팀 슬슬 퇴근 준비 시작.
2009년 3월 23일 PM 06시 13시
용병들중 두명, 맥도X드에 햄버거 사러감.
Rhea君, 시계를 보며 "오늘도 미술학원 못가네~ 3타임째 못가네~"라며 하소연을 함.
2009년 3월 23일 PM 06시 33븐
햄버거는 먹었지만 치킨은 깜빡 잊고 먹지 않음.
먹지 않을려던 감자 튀김은 먹음.
2009년 3월 23일 PM 07시 00분
일말의 미술학원 수업 가는 기대를 완전 포기함.
참고로 강남역 한복판이라 물 좋음.
아줌마들도 많지만 Rhea君 수업듣는 class는 여대생 혹은 젊은 여직장인들뿐.
참고로 약 50평 넓이에 남자는 Rhea君 혼자 뿐임.
정말 일주일에 두번있는 수업이 너무 기다려짐.
이때까지도 레지스트리 삭제 요인은 UAC라고 여전히 굳게 믿음.
2009년 3월 23일 PM 07시 15분
결국 터미널서비스, 원격 디버깅 등을 동원하여 소스 디버깅 걸기 시작함.
사실 진~작 했어야 했으나 잘 돌아가던 소스가 절대로!!! 잘못일리가 없다고 생각했음.
2009년 3월 23일 PM 07시 17분 레지스트리를 지우는 것은 UAC가 아니라 피망 에이전트가 범인이란 놀라운 사실을 알고 모두들 경악함.
한명은 거픔을 물고 쓰러졌고 다른 한명은 복도로 달려나가 소화기에 부딪혀 쓰러짐.
두명은 옷을 찢고 얼굴에 재를 바르며 울면서 폐인이 됨.
다른 두명은 스스로 알아서 머리를 박음.
Rhea君, 조용히 PSP를 꺼내 아이돌마스터SP를 플레이함.
2009년 3월 23일 PM 07시 47분 레지스트리가 삭제되는 원인을 발견함.
GetLastError()의 답변은 770 이었음.
2009년 3월 23일 PM 08시 00분
대체 함수를 사용함.
믿고 믿었던 삐~~~~~ 대신 삐~~~~~를 사용함
그래도 버전별로 구분은 해주고 나름 최대한 리턴값 처리도 해줌.
결국 IE8 관련 코드는 전혀 상관없는 무죄였음이 밝혀짐.
2009년 3월 23일 PM 08시 30분
최종 빌드 및 배포.
XP, 비스타 UAC On/Off 하에서 이상 없음을 확인.
그러나 이전과 달리 UAC 경고창이 하나 더 들어갔음.
원인 불명, 계속 조사중
대신 IE8 새창, 새탭에서도 세션 유지 완벽하게 잘됨!
운영팀, 갈고 있던 칼을 다시 창고로 들여보냄.
2009년 3월 23일 PM 09시 05분
미술학원 쪽을 봐라보며 울며 퇴근... .
참고로 내일 새벽 05시 00분 부터 3월 정기점검 시작!
결론입니다, 며칠간 비스타 UAC를 사용하시는 분들에게 혼란을 드렸던 피망 에러껀은 100% 해소되었으며
IE8의 새창/새탭 문제도 잘 작동합니다.
여전히 UAC하에사도 피망, 잘 됩니다.
대신 PMangSetup.exe와 Setup.exe를 허용해주시는 것을 잊지 말아주시길 바랍니다.
혹시 게임을 못하셨던 분들께는 제가 대신 사과드립니다. ( _ _);;;
그리고 이렇게 많은 검색이 되었음에도 아무런 문의를 해주시지 않는 분들,
아마도 비공식 채널이라 그러하셨을꺼라 생각합니다.
다시 한번 게임이 안돼 고생하셨을 분들께 양해를 드리며
오늘을 하얗게 붙태워주신 여러 개발자분들, 정말 수고하셨습니다.
Rhea君에게 의심의 눈초리를 받으신 분들도 죄송합니다.
다음부턴 1분전까지 생생히 잘 돌아가는 코드라도 무조건 의심을 하도록 하겠습니다.
왜 Beep()를 제외시켰는지 모르겠네요... . GW-BASIC에 있었던 Play 함수, 그리고 PC 스피커의 비프음, 정말 좋아합니다. 언제가 IBM PC도 MSX처럼 "-"로 3중 화음을 지원해주길 기대했지만 아예 비프음 자체를 없애버리는군요.
그럼 64비트 비스타에는 뭘써야 할까요? API 함수인 sndPlaySound() 입니다.
sndPlaySound()는 프로젝트의 SubSystem이 Windows (/SUBSYSTEM:WINDOWS)가 아니더라도 잘 작동합니다. 즉, 콘솔모드(Console (/SUBSYSTEM:CONSOLE)에서도 사용할 수 있다는 말이죠. 물론 windows.h와 Winmm.lib는 반드시 인클루드 시켜야합니다.
디버깅을 위해 WAV 파일을 연주해야 하는 시대가 왔다니 빨라진 컴퓨팅 속력에 기뻐해야할지, 귀찮음에 슬퍼해야 할지요... .
비스타에는 DWM의 관리를 받는 Thumbnail 미리보기가 지원된다. DWM에 등록하기 때문에 업데이트를 동시에 볼수 있다.
이 예제는 윈도우 핸들을 Enum해서 찾는 법을 보여주고 있다. (클래스내에 CallBack 함수 넣는 법도 부록이라 할수 있다. ^^)
여기서 더 생각해볼 것!! 1) 윈도우 시계, 네트워크 등록 정보 같은 Thumbnail은 실제 윈도우 모양과 다르게 나타난다. 즉, 다른 UI를 가진 윈도우를 숨겨놓고 그 윈도우의 핸들을 실제 보여주는 것이라 추측할 수 있다. 이를 통해 무언가를 해볼수는 없을까?
2) 이것을 이용해 WPF나 다른 애플리케이션에서 특정 윈도우나 바탕화면 등을 텍스쳐 맵핑으로 구현해 볼수 있다.
위의 플래시처럼 나름의 활용방법들은 무궁무진하며 약간의 3D 지식만 있다면 재미있는 UI를 많이 만들어낼수 있을 것이다. 대표적으로 3D Flip도 이를 통해 구현한 것이라 예상하며, 좀더 응용하면 자신만의 3D Flip도 어렵지 않을 것 같다. (이말은 곧 만들겠다는 선전포고?)
VS2008로 만들었으나 VS2005 + Windows SDK 가 있으면 프로젝트를 다시 만들어 빌드하면 Ok~*
주요 함수는,
DwmRegisterThumbnail() : DWM에 특정 윈도우(핸들)를 등록 DWM_THUMBNAIL_PROPERTIES 구조체 : Thumbnail의 속성 정의 DwmUpdateThumbnailProperties() : 출력 DwmUnregisterThumbnail() : DWM에 Thumbnail 해제 및 지우기