일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
자연과 자주 씨름해 온 나의 눈에는 자연이 유연하고 순종적인 것처럼 보인다. 물론 내가 그 정도 수준에 도달했다는 말은 아니다. 단지 지금 그 문제에 대해 나보다 더 많이 생각하고 있는 사람은 없다는 말이다."반 고흐, 영혼의 편지"란 책을 읽고 있는데 마음에 드는 문장이 있어서 옮겨 보았습니다. 고수란 저런 것 아닐까요? 자신보다 그 문제에 대해서 더 많이 고민하고 있는 사람은 없다는 생각, 그런 느낌. 2008년엔 무엇에 대해서 가장 많이 고민을 하셨나요? 전 생각해보니 사냥꾼 DPS 시트에 관해서 가장 많은 고민을 했던것 같더군요. 일명 씨오리 크래프트(theory craft)로 불리는 장르로 와우 내의 각종 산술 공식을 기준으로 어떤 장비를 사용해서 어떤 기술을 어떤 순서대로 사용했을 때 가장 효율적인가를 연구하는 것이죠. 아래 링크는 사냥꾼 플레이어의 기본 소양 중에 하나인 샷 로테이션에 관한 글입니다. 물론 저런 복잡한 걸 안다고 좋은 플레이를 하는 것은 아니지만 아는만큼 보인다고 깊이있게 이해할수록 게임도 더 재밌어 지는 법이죠. ㅋㅋㅋ~ http://wow.allakhazam.com/wiki/Shot_Rotation_(WoW) 2009년엔 회사 제품에 대해서, 제가 하는 분야에 대해서 자신감을 가질 수 있는 한 해가 되었으면 좋겠습니다. 좋은 피드백을 주시는 분들이 생겨서 많은 도움을 받을 수 있는 한 해가 될 것 같기도 하네용. 다들 2008년 마무리 잘하시고, 새해 복 많이 받으세요. |
오늘은 날씨가 무지하게 추웠다. 가는 날이 장날이라고, 이런 날 늘 외근 일정이 잡혀있기 마련이다. 고객사에 들어가서는 이상한 몇 가지 버그 증상을 살피고 원인을 추적하고, 디버깅하는 일들을 했다. 늘 느끼는 일이지만 남의 회사에서 일하는 것은 가시방석 마냥 불편하다. 그나마 우리 제품의 새로운 담당자는 굉장히 온화한 성품이어서 작업하는데 불편함은 없었지만 말이다. 몇 가지 더 처리해야 하는 작업들이 있었지만 회사에 왔을 때는 이미 그런 것을 처리하기에는 머리가 돌아가지 않는 상태였다. 저녁을 먹고는 일찍 퇴근했다. 그런데 회사에서 나오는데 설상가상으로 눈까지 내렸다. 사실 내린다는 표현은 적절하지 않았다. 쏟아졌다, 아니 휘몰아쳤다. 그래서 무지하게 추웠다. 쌩으로 눈을 다 맞고 오는 그 처량함이란... 따뜻한 코코아 한 잔을 마시고 싶었지만 물을 끓이기가 귀찮았다. 구내 식당에서 먹었던 저녁이 부실했던지 배가 고팠다. 데운 소시지, 치즈, 우유를 뱃속에다 집어 넣었다. 씻고 나니 정신이 좀 들었다. 침대에 눕기에 너무 이른 시간. 다른 일을 하기에도 정신이 없었다. 지난 번에 보려고 다운로드 받아 두었던 영화를 틀었다. 단순한 영화를 보고 싶었는데, 유태인이 나오는 전쟁 영화였다. 3~40분을 새우깡과 함께 보다 결국 껐다. 어려웠다. 음악을 틀고는, 읽다만 기욤 뮈소의 "완전한 죽음"이란 책을 집어 들었다. 복잡하지도 않고, 사건의 전개는 나름 재밌었다. 결론이 조금 작위적이긴 했다. 너무 인위적인 반전이었다고 할까? 그래도 나름 교훈도 있고 삶에 대한 진정성을 조금은 담은 괜찮은 소설이었다... 하지만 대부분의 경우 당신이 해야 할 일은 거의 없소. 그저 환자의 곁에서 그의 고통과 두려움을 조금씩 가져가 함께 나누는 일이 전부라오. 그들이 찾을 때 곁에 있어 주고, 얘기를 하면 들어주는 일, 그게 바로 함께하는 것이오.함께 한다는 것에는 많은 것이 필요하지 않다. 하지만 항상 우리는 그것을 거창한 것들로 착각해버린다. 그리고 정작 중요한 것은 뒤로한 체 그 거창한 것에만 몰두하는 실수를 저지르곤 한다. 그 또는 그녀에게 진정 필요했던 것은 그런 거창한 것보다는 단지 아주 조그만 관심이었을 뿐인데도 말이다. 내일도 힘든 하루가 되겠지. 잠이나 자야겠다. |
2005년 이었던 것 같다. "지금 사랑하지 않는 자, 모두 유죄"라는 글을 인터넷에서 보게 되었다. 글이 참 인상적이었던지 예전에 잠시 했던 이글루에도 글을 퍼다 올려 두었다. 맘에 드는 글이라 글쓴이가 어떤 사람인지 검색해 보았는데 드라마 작가라 했다. 에세이 집은 쓰지 않는다 했다. 아쉬웠다. 몇 년이 지났다. 집에 놀러 온 녀석이 본다는 "그들이 사는 세상", 내가 좋아할 법한 드라마는 아니었다. 두 편을 보았는데 한 편에 혜교씨 나레이션이 있었다. "화이트아웃 현상에 대해서 들은 적이 있다"라고 시작하는 나레이션 내용이 제법 맘에 들었다. 작가가 노희경이라 했다. 그랬던 그녀가 이번에 에세이 집을 전격 출간했다. 법정 스님의 수필집이 나왔을 때도 사야지 하고 맘만 먹고 있었는데, 과감하게 질러 보았다. ㅋ 화이트아웃 현상에 대해서 들은 적이 있다.부모님에 대한 애틋한 감정을 담은 글들이 몇 편 있었는데, 불효를 많이 해서 그런지 심히 공감이 갔다. 특히나 아래 부분을 읽으면서는 조금 반성 했다. '잘해야지' 하는 다짐도 했다. 다시 태어나도 성여사의 막내 아들을 하고 싶을 만큼 훌륭한 부모님이시지만 아마 부모님은 싫어하겠지 ㅋㅋㅋ~ ... 아픈 기억은 많을 수록 좋다는 내용들 ...10년을 두고 다시 쓴 글이 하나 있었다. "드라마는 왜 꼭 재미있어야 하나?"라는 제목의 글로 이것도 예전에 인터넷에서 본 기억이 있었다. 물론 10년 후에 다시 쓴 부분에 대해서는 못 읽었었지만. 10년이란 시간은 그녀를 조금은 겸손하게, 조금은 유하게 만든 듯 싶었다. 나이가 들면 겸손해지고, 온화해지고, 사려 깊어 진다는 말이 거짓은 아니었단 생각이 들게 하는 부분이었다. '10년 후에 내가 쓴 글을 보면 어떤 느낌일까?'라는 생각을 잠시 해보았다. 프로그래머 적인 입장에서 10년 전에 내가 쓴 코드들을 보면 정말 어처구니 없을 때가 있다. 물론 꼭 10년이란 시간 때문만은 아니다. 어제 쓴 코드도 어처구니 없을 때가 있으니... ㅋㅋㅋ~ 제법 오랜 기간 틈틈이 써 둔 것을 모아둔 것인데도, 아껴보고 싶을 만큼 몇 편 안 되는 에세이가 아쉬웠다. 한 장 한 장 넘기면서 노희경이라는 사람에 대해서 조금은 이해를 하게 됐고, 조금은 공감을 했고, 조금은 위로를 받았다. 영롱한 표현이 넘치는 그녀의 글은 읽는 내내 독자들에게 즐거움을 준다. 또한 그녀의 당돌한 문체는 읽는 사람들에게 힘을 준다. 마치 상처받은 사람들에게 주고 싶은 한 알의 아스피린과 같은 책이었다... |
회사 사람들이 하도 열심히 책을 읽고 있길래, 뭔가 했더니 기욤 뮈소의 소설이었다. yes24 아이 쇼핑을 하면서 요즘 가장 뜨고 있는 작가구나 라는 생각이 많이 들게 했던 기욤 뮈소. 돌려보던 사람이 다보고 나도 궁금해서 첫 장을 넘겼다. 심상치 않은 전개. 사실 요즘 소설답지 않게 심하게 말도 안 되는 시작이라 생각했다. 하지만 어느새 나는 소설에 몰입하고 있었다. 절반 정도를 회사서 읽고, 약속이 있어서 밖에서 놀다가 집으로 오는 길에 나머지 절반을 읽었다. 나머지 부분을 읽으면서 이 소설 제목, "사랑하기 때문에"와 스토리를 매칭시켜 보려고 노력했다. 이 소설은 과연 무엇일까? 내용이 어떻게 전개될까? 주인공 마크가 비행기 속에서 손님 노트북을 훔치는 장면에서 내 상상은 극에 달했다. 난 여러 가지 갈래를 추측했다. 하지만 그 중 하나도 소설의 내용과는 들어맞지 않았다. 그만큼 내용이 의외였다 ㅋㅋㅋ~ 요즘 인기 있는 책들처럼 박진감 넘치는 전개, 말도 안되게 복잡한 등장 인물들 간의 관계, 쉴새 없이 앞뒤로 넘나드는 장면들은 독자의 눈을 한시도 책에서 뗄 수 없게 만든다. 그런데 이 책, "사랑하기 때문에"는 그런 것과 더불어 뭔가 느낌이 있는 내용이 있다. 가볍지 않다는 뜻이다. 헐리웃 블록버스터를 염두에 두고 쓴 그런 싸구려 3류 소설은 아니라는 느낌이 많이 드는 책이었다. ㅎㅎ~ 한참을 읽다가 아래 문장이 너무 웃겨서 컴퓨터에 옮겨 적어 두고는 계속 읽었다. 내 책이 아니라 낙서를 할 수는 없었다. ㅋㅋ~ 그들의 뇌는 바이러스에 감염된 파일을 삭제하고 디스크 조각모음을 한 다음 포맷한 컴퓨터의 하드디스크에 비견할 수 있었다.작가가 아마도 그들의 뇌가 얼마나 깨끗하게 됐는지를 나타내기 위해서 비유한 것이라 생각된다. 참 재미있는 비유기도 하고 나처럼 컴퓨터 전문가 입장에서는 정말 쓸 때 없는 비유기도 했다. ㅋㅋ~ 사실 포맷을 할 거라면 바이러스에 감염된 파일을 삭제할 필요도 디스크 조각모음을 할 필요도 없기 때문이다. 조각모음을 한 하드디스크로 마무리 했으면 좀 더 좋았을 껄 괜히 포맷까지 가버려서 내 입장에서는 2% 아쉬운 비유랄까 그래도 참신하긴 했다. ㅋㅋ~ 책의 마지막 장을 덮으면서 예전에 법정 스님의 책에서 읽었던 오해라는 제목의 글이 떠올랐다. 내가 느끼기에 우리가 대부분의 경우 상대방을 용서하지 못하는 가장 큰 이유는 오해에 있기 때문이다. 진정한 이해가 선행된다면 우리는 거의 대부분의 일들을 용서할 수 있지 않을까? 왜냐하면 그 사람 입장에 선다면 대부분 그런 결과를 선택하기 마련이기 때문이다. 쌀쌀한 날씨 탓일까? 아니면 소설 탓일까? 아직도 내가 오해하고 있을 많은 사람들을 이해하고 싶은 그런 밤이다. 그들도 그들 나름의 스토리를 가지고 있을 테니 말이다... |
의학물이란 이유로 공부용 미드로는 천덕꾸러기 취급을 받고 있죠. 하지만 제가 여러 미드를 들어본 결과, 그나마 잘 들리는 축에 속하는 미드더군요. 프렌즈가 신물난 분들에게 권해드리고 싶습니다. 사실 보신 분들은 아시겠지만 무늬만 의학물이지 실제 내용은 완전 연애물입니당. 게다가 의학 용어는 나오는 것들이 그놈이 그놈이라 한 번 알아두시면 나중에는 별 부담이 안되더군요. 문제는 듣고나서 대부분 기억에 남는 것들이 mcdreamy, mcsteamy, mcrebound 따위라는 게 좀... ㅋㅋ~ 참고로 아래 페이지에 가시면 미드를 직접 다운로드 받지 않고도 보실 수 있습니다. http://www.dramain.com 괜찮은 장면 두 부분을 퍼왔습니당. 첫 장면은 일명 메르디스 굴욕이라고도 불리는 장면인데, 데릭에게 자기를 선택해달라고 고백하는 부분입니다. 두 번째 장면은 버크가 결혼 서약서를 읽는 장면인데 웅얼되서 잘 들리진 않지만 내용은 나름 멋지답니당... 하우스를 자막없이 듣는 그날까지 함 달려보자구용... ㅋㅋ 하우스는 정말 좌절이더군요... MEREDITH: I lied. I’m not out … of this relationship. I’m in. I’m so in it’s humiliating because here I am begging…
|
![]() 얼마 전에 아는 형 소개로 다음-구글 가젯 공모전에 출품을 하게 되었습니당. 블로그에 뜬금없이 올라온 체스 기보 뷰어 가젯이 그것인데용... ㅋㅋㅋ~ 1차 심사를 통과해서 당당하게 네티즌 여러분들의 투표를 기다리고 있답니당... 흐흐~~ 하지만 형편없는 추천수... ~~ ㅠㅜ 풉... 그 다음 멘트는 안봐도 비디오죠? ㅋㅋㅋㅋ~ 아래 페이지에 들어가셔서 거침없이 체스 기보 뷰어 가젯에 한 표 눌러주시는 센스를 보여주세용. ㅎㅎ~ http://widgetbank.daum.net/event/competitionVote.do 투표하신 여러분 모두모두 복 받으실 거예용 ㅋㅋㅋ~ 크리스마스도 이제 얼마 안남았군요 *^^* |
[js]var funcs = new Array(2); for(var i=0; i<funcs.length; ++i) { funcs[i] = function() { alert(i); } } funcs[0]();[/js] 간단한 자바 스크립트 코드입니다. 뭐가 출력될까요? 3이 출력됩니다. 고쳐봅시다. [js]var funcs = new Array(2); for(var i=0; i<funcs.length; ++i) { funcs[i] = function() { return function() { alert(i); } }; funcs[i] = funcs[i](); } funcs[0]();[/js] 의미가 좀 불명확하죠. 아래와 같이 고치면 확실히 무슨 일을 하는 코드인지 눈에 들어옵니다. [js]var funcs = new Array(2); function GenerateFunction(i) { return function() { alert(i); } } for(var i=0; i<funcs.length; ++i) { funcs[i] = GenerateFunction(i); } funcs[0]();[/js] 설명해 봅시다. 클로저에 관한 건데요. 첫 번째 샘플은 for문이 마치 클로저같은 역할을 하는 것처럼 보이지만 아닙니다. 자바스크립트 클로저는 항상 함수랑 관계가 있기 때문입니다. 즉, 저기는 클로저가 없습니다. 그러니 i가 저장된 런타임 정보는 글로벌 밖에 엄죠. 그러니 마지막 값인 3이 출력되는 겁니다. 마지막 예제를 살펴봅시다. GenerateFunction안에서 리턴되는 함수에서는 GenerateFunction 함수 안의 값인 i를 참조하고 있습니다. 즉, 클로저가 생긴거죠. 그래서 리턴된 함수가 계속 살아 있는 동안 해당 컨텍스트 정보도 파괴되지 않고 같이 살아 있습니다. 그래서 0이 출력되는 겁니다. |
뉴스그룹에서 진짜 욱긴글을 발견해서 포스팅합니다. ㅋㅋㅋ 사실 별로 욱긴건 아니고 저 말고도 이런 고민을 한다는 사람이 있다는게 신기하네용. 질문은 다음과 갈습니다. this has to be the silliest question ever asked in this newsgroup :) 간단하게 번역하면 __declspec을 어떻게 발음하는지 모르겠다. 알려달라. 정도가 되겠습니다. 리플이 많이 달렸는데요. "deckelspec"이라고 읽는다는 것 같군요. 저도 항상 뭐라고 읽을까 궁금했었거든요. 매번 디이씨엘하면서 읽으니 굉장히 불편했었는데, 이제 좀 간지나게 읽어줘야 겠군요 ㅋㅋㅋ~ 사실 저런 질문 포스팅하기가 쉽지 않은데... 재밌네용... ㅋㅋㅋ~ 예전에 이런 비스무리한 포스팅을 함 한적이 있었죠. 아래 링크에서 보실 수 있습니다. http://www.jiniya.net/tt/662 |
출근 길에 버스를 타고 오는 길이었습니다. 보통은 mp3를 꼽고, 책을 읽곤 하는데 오늘 따라 귀찮아서 mp3만 끼고는 유리창에 머리를 기대고 있었습니다. 그러다 버스 앞자리에 낙서가 되어 있는 걸 발견했습니다. 마을 버스 같은 경우에는 낙서가 많이 되어 있어서 진짜 심심한 날이 아니면 읽어 보진 않는데, 이 버스는 일반 버스인데다, 노란 시트에 적힌 딱 한 줄의 낙서라 눈에 띄더군요. 화이트로 적은듯한 그 글씨는 다음과 갈았습니다. ㅈㅎㅇㅅㄹㅎ 모음은 없지만 금방 무슨 말인지 떠올랐습니다. 아마 여러분도 3초 안에 한 가지 문장이 떠오를 겁니다. 다른 문장을 만들순 없을까를 잠시 생각해 보았지만 제 상상력의 한계 탓인지 딱히 마땅한 문장이 떠오르지 않더군요. '이 동네 어떤 중삐리의 소심한 사랑 고백일까?'라는 의문을 가지고는 버스에서 내렸습니다... 낙서를 보지 않는 사람도 있지만, 저는 낙서를 보는 것을 좋아합니다. 특히 은밀한 곳에 되어 있는 낙서를 보는 것을 더 좋아하죠. 낙서를 위해 일부러 오픈해둔 음식점 벽면과 같은 공간 보다는 왠지 낙서를 해서는 안될 것 같은 공간에 쓰여 있는 것들입니다. 그런 점에서 예전 대학교 도서관 화장실은 참 좋은 공간이었습니다. 정말 말도 안되는 낙서들인데 앉아서 읽다보면 풉하고 웃게되는 그런 낙서들이 많았죠. 제가 보았던 가장 흥미로운 낙서중에 하나는 "100번 찍어 안넘어가는 나무 없다"라는 말에 대한 낙서였습니다. 과연 몇 번을 찍는 것이 가장 효율적인가에 관한 이야기를 수식같은 걸로 진짜 욱기게 적어 놓은 낙서였습니다. 더 흥미로운 사실은 그런 참신한 낙서가 하나 적히면 거기게 리플이 달린다는 사실입니다. 반론이 제기되고, 반론에 반론이 제기 되고, ... 그러다 세월과 함께 청소 아줌마의 손길이 닿으면 그 낙서의 원문은 지워지고 중간에 알 수 없는 묘한 한 문장만 -- "여자는 찍을 수 있는 대상이 아니다." -- 남게됩니다. 낙서에 관해 또 하나 재미난 기억은 대학교 시험 때 있었습니다. 대학교에서 컨닝하는 유치한 방법 중에 하나로 판치기라는 방법이 있습니다. 책상에 핵심 내용들을 미리 적어두는 아주 유치찬란한 방법입니다. 자리바꾸기 신공만 피하면 그럭저럭 쓸만한 방법이죠. 판치기에도 상도가 존재하는데 바로 연필로 쓰는 겁니다. 왜냐하면 그래야 다음 사람이 지우고 다시 쓸 수 있거든요. 그래서 보통 판치기는 지우개로 책상을 지우는 일로부터 시작한답니다. 그 날도 전 시험 시작 전 책상을 지우고 있었더랬죠(처음이었습니다 ㅋㅋ). 지우개로 막 지우는데 중간에 시꺼먼 유성 매직 같은 걸로 써진 조그만 글씨가 보이더군요. 여기다 판치기하면 3년 동안 재수 음따. 아주 그냥... 딴 책상 가서 할려다가 그냥 그 날은 쉬었습니다. 그 낙서를 본 것 만으로도 충분히 재수가 없다는 생각이 들었거든요... ㅋㅋㅋ~ 중딩, 고딩때는 책상이나 교과서에 낙서를 하는 일들이 많았습니다. 우리는 주로 게임들의 연속기를 적어놓고 외우는 일들을 많이 했었습니다. 심지어 교과서 오른쪽 하단 부분에 그림을 그려서 연속기의 연속 동작을 볼 수 있도록 만들어 놓는 놈들도 있었죠. 가끔은 서로 새로운 연속기를 적어서 교환하고는 토론하는 일들도 있었답니다. 낙서를 넘어서 책상을 오락기로 개조하는 엄청난 녀석들도 종종 있었죠. 스프링과 유리 테입 그리고 칼로 오락기 버튼을 아주 기가막히게 모조한 대단한 작품이었습니다. 버스 자리의 노란 시트, 화장실 벽의 하얀색 타일, 연갈색 책상 판, ... 모두 다 무언가를 적으라고 만들어 둔 공간은 아닙니다. 그럼에도 불구하고 사람들은 왜 낙서를 할까요? 자신의 흔적을 남기고 싶어서가 아닐까요?... 누구나 흔적을 남기고 싶은 본능은 있으니까요... 오래 전, 술집 벽면에 했던 낙서들... 공중 전화 박스에 했던 낙서들... 도서관 사물함에 써 둔 낙서들... 더 오래전, 불국사 다보탑 가는 길의 어느 나무에 했던 낙서... 속리산 문장대 바위에 새겨둔 글자들... 책상 위에 적어둔 연속기들... 아직도 있을지 궁금해졌습니다... 누군가 본 사람이 있을까요?... 무지 궁금해지는 오늘입니다. ㅋㅋㅋ~ |
얼마전에 절찬리에 NC의 야심작 아이온이 출시됐다. 지스타 갔다가 그 그래픽에 반해서 장장 7GB의 용량을 다운 받았다. 물론 겜방하는 친구가 머 등록해야 한다고 아이온 계정좀 만들어 달라는 부탁도 있기는 했다. ㅋㅋ~ 계정도 만든 김에 설치하고 게임을 했다. 와우랑 비슷하다는 회사 사람의 말... 정말 비슷했다. 시스템은 거의 그대로 차용한 수준이었다. 하지만 와우랑은 하늘과 땅 차이만큼의 차이가 있었으니... 와우는 죽었다 깨어나도 못 따라갈 바로 그 차이... 바로 룩간지 였다... ㅋㅋ~ 1레벨 캐릭임에도 뽀대가 좔좔... 와우는 상위 1%에 드는 아이템을 착용해도 룩간지가 음따... 심지어 투구 같은 경우는 종종 상위 0.00001%에 드는 아이템을 착용하고도 "투구 표시 하지 않음" 옵션을 켜야 하는 경우도 있다. 그 때의 안습함이란 ㅠㅜ 물론 종종 전설 템들은 간지가 좀 나긴 하는데 캐릭 간지는 완전 0%... 그런데 아이온 캐릭은 진짜 이뻤다... 블리자드에서는 왜 그런 디자이너를 영입 안하나 모르겠당... ![]() 출처: 다음 판타지 걸, 세상에 존재하지 않는 美 내 드레이나 냥꾼 캐릭을 저 룩으로 만들어주면 내일이라도 결제 때리고 만렙까지 함께할텐데 ㅠㅜ~ 근데 캐릭에 비해 활은 좀 간지가 안나는듯,,, ㅋㅋ 쪼렙인지도... 사격 자세는 딱 고정사격인데 ... ... 그런데 아이온을 한 세 시간 플레이 해봤는데 조작이 상당히 불편했다. 특히 시점 변환이 너무 제한적이라 이건 머 ㅠㅜ~ 오덕후들이나 한다는 인간 여도적의 현실... 그나마 아지 쌍수는 간지가 좀 나는듯... ![]() 도게 대문에 걸렸던 룩 관련 작품들... 도적님들 센스가 좀 쩔죠... ㅋㅋ~ |
어젠가 뉴스그룹에서 재미난 질문을 보았습니다. 질문의 내용은 다음과 같습니다. 이번에 아주 재미난 것을 발견했다. 다른 여러 사람들도 이 문제를 겪은 것 같은데 해결 방법이나 문서에 커멘트가 하나도 없다. 내용은 다음과 같다.예외에 대해서 처음 접하신 분들이 생각할 수 있을 법한 질문입니다. 특히나 콜백 루틴의 버그가 위와 같은 상황으로 조용히 실패한 경우에는 더욱 찾기 힘들어지죠. 그럼 더 열받게되고 왜 이런 디자인을 했는지에 대한 불평을 늘어놓게 됩니다. 하지만 명백하게 이는 의도된 디자인이며 다른 모든 모듈도 win32와 같은 구조를 취하는게 좋습니다. 우선 타이머의 콜백 루틴에서 발생한 예외가 전파되지 않은 이유를 살펴봅시다. 이는 윈도우 내부 코드에서 콜백을 호출하는 부분을 SEH로 보호하고 있기 때문입니다. 보통 아래와 같은 루틴을 통해서 콜백을 호출합니다. [CPP]... 콜백 호출 전 작업 ... __try { your_timer_callback(); } __except(EXCEPTION_EXECUTE_HANDLER) {} ... 콜백 호출 후 작업 ...[/CPP] 이제 왜 예외가 전파되지 않았는지는 명백해지죠. SEH 때문에 잡아먹힌 거죠. 그렇다면 왜 콜백을 SEH로 보호해서 호출했을까요. 이유는 간단합니다. SEH로 보호하지 않게 되면 시스템 모듈이 불안정한 상태에 놓이게 되기 때문입니다. 즉, your_timer_callback에서 발생한 예외 때문에 타이머 콜백 호출 이후에 해야 하는 작업들이 진행이 되지 않을 수가 있다는 거죠. 결국은 시스템이 불안정해지는 겁니다. 이래서 Windows에서 사용하는 대부분의 콜백은 위와 같은 원리가 적용됩니다. 그렇다면 문제를 제기했던 사람이 버그를 잡기 힘들었다는 불평은 어떻게 해결해야 할까요? 간단합니다. 타이머 루틴 내부에 예외 처리 루틴을 삽입하는 겁니다. 아래와 같이 타이머 루틴을 작성하는거죠. 요롷게 만들면 자신의 루틴에서 발생한 예외는 자신이 책임질 수 있습니다. [CPP]my_timer_callback() { __try { } __except(EXCEPTION_EXCUTE_HANDLER) { ... 여기서 예외를 처리하세요 ... } }[/CPP] 콜백 루틴은 콜백을 설정하는 모듈과(응용 프로그램), 그것을 호출해 주는 모듈이(Windows 커널) 다릅니다. 즉, 콜백 루틴에서 예외를 던져 버리면 그것을 호출한 모듈인 Windows 커널로 그 예외가 전파된다는 말입니다. 이는 서로 다른 모듈간에서 예외를 전파하는 문제가 되는 것이죠. 예외 처리에 대해서 조금만 공부하신 분들은 알겠지만 여기에는 다음과 같은 명백한 한 가지 규칙이 있습니다. 절대로 다른 모듈에 예외를 던지지 마라. 자기가 싼 똥은 자기가 치우자. 이러한 규칙을 정한 이유는 바이너리 단계에서 호환되는 예외 처리 메카니즘이 없기 때문입니다. 보통의 경우 예외처리 메카니즘은 고급 언어에서 각자 나름의 방식대로 구현해서 사용합니다. 그것들이 바이너리 단계에서 호환이 된다는 보장이 없습니다. VC++로 만든 모듈에서 던진 C++ 예외가 Visual Basic의 예외처리 메카니즘으로 자동적으로 변환되지 않는다는 이야기입니다. 물론 자신의 시스템에서 사용하는 모든 모듈에 대해서 동일한 예외 메카니즘이 사용되어 있다면 다른 모듈로 예외를 전파시켜도 상관은 없습니다. 모두 동일한 컴파일러에서 동일한 예외처리 메카니즘 옵션으로, 동일한 예외 시스템을 사용한다면 말이죠. 하지만 개발자가 저런 보장을 하기란 사실 불가능합니다. 왜냐하면 혼자서 다 만든것이 아니기 때문이죠. 서드 파티 업체의 라이브러리 하나만 들어와도 사실상 호환이 안된다고 생각해야 합니다. 결론은 질문을 하신 분의 말처럼 Windows에서 콜백의 예외를 알려주지 않고 씹는 것이 나쁜 디자인이 아니라 좋은 디자인이란 겁니다. 자신이 모듈을 설계함에 있어서도 자신의 예외가 절대 다른 모듈로 전파되지 않도록 만드는 것이 중요합니다. 특히 많이 접하게되는 DLL 경계, 스레드 경계에서 예외가 전파되지 않도록 신경을 쓸 필요가 있습니다. 반대로 자신이 다른 라이브러리의 코드를 호출할 때에도 Windows와 같이 SEH를 사용해서 해당 코드에서 발생한 시스템적 예외가 자신의 프로그램에 영향을 미치지 않도록 만드는 것도 중요합니다. |
마인드 스포츠 시대가 도래하고 있습니다. 그리고 그 중심에는 체스가 있다죠. 체스를 두는 것도 재미가 있지만 고수들의 경기를 보는 것 또한 쏠쏠한 재미가 있습니다. 하지만 그랜드 마스터들의 경기를 일일히 찾아 보는 것도 쉽지 않은 일이죠. 그런 불편함을 단방에 날려주기 위해서 절찬리 개발된 가젯을 소개해 드립니다. 이름하며 체스 기보 뷰어입니다. 이 가젯을 사용하면 세계 정상급 선수들의 체스 경기 기보를 손쉽게 살펴 볼 수 있습니다. 아래는 체스 뷰어 가젯의 초기 화면 입니다. 한 번에 세 경기를 불러와서 보여줍니다. 경기는 랜덤하게 가져와서 보여준답니다. 혹시 이미 본 경기라면 네 번째 있는 다른 게임 보기 버튼을 누르면 새로운 게임을 받아서 보여줍니다. ![]() 마우스를 버튼에 올려두면 아래와 같이 진해져서 보기가 좀 편해집니다. 리로드를 하면 서버에서 새롭게 경기 목록을 받아오기 때문에 오른쪽 화면과 같은 로딩 장면이 나타납니다. 네트워크 상황에 따라서 수 초에서 수 분까지 걸릴 수 있습니다. 마우스 조작하는 불편함을 없애기 위해서 키보드를 이용해서 조작할 수 있습니다. 1-3번 까지 키를 사용하면 1번부터 3번 경기 까지를 보실 수 있습니다. R키를 입력하면 게임을 새롭게 로딩해서 보여줍니다.
이제 실제 경기 화면으로 들어가 볼까요? 아래 화면이 실제 체스 경기를 보여주는 화면입니다. 체스판과 함께 오른쪽에 커맨드 바가 나와 있습니다. 버튼을 클릭하면 각 메뉴에 맞는 명령을 수행할 수 있습니다. 오른쪽 하단에 있는 밝은 부분은 현재 진행되고 있는 기보의 내용을 보여줍니다. Bb5는 비숍을 b5로 이동시킨다는 것을 의미하죠.
마지막 체스판 상황과 함께 누가 승리했는지가 오른쪽 하단에 출력됩니다. 뒤집기 버튼을 누르면 다른 진영의 입장에서 판을 바라볼 수 있습니다. 메뉴 버튼을 누르면 초기의 메인 화면으로 돌아갑니다. 설명 버튼을 누르면 경기에 대한 간략한 설명을 볼 수 있습니다. 모든 버튼 또한 단축키를 가지고 있습니다. 처음(f), 이전(p), 다음(n), 마지막(l), 뒤집기(r), 메뉴(m), 설명(h)를 사용하시면 됩니다.
설명을 누르면 해당 경기에 대한 아래 화면과 같은 간략한 브리핑 정보가 출력됩니다. 게임으로 돌아가기 버튼을 사용해서 보고 있던 게임 화면으로 돌아갈 수 있습니다. 각 플레이어 정보에는 플레이어의 전체 이름이 나타납니다. 게임 정보에는 해당 경기에서 사용된 오프닝의 종류, 총 말의 이동 회수, 경기가 치러진 연도, 그리고 어떤 대회의 경기인지를 보여줍니다.
백 마디 말보다 한 번 사용해 보는게 더 도움이 되는건 말할 것도 없겠죠... ㅎㅎ^^ 가젯을 퍼가고 싶으신 분들은 아래 코드를 복사하시면 됩니다. 190x150 <script src="http://www.gmodules.com/ig/ifr?url=http://codewiz.googlepages.com/chess23.xml&synd=open&w=190&h=150&title=%EC%B2%B4%EC%8A%A4+%EA%B8%B0%EB%B3%B4+%EB%B7%B0%EC%96%B4&border=%23ffffff%7C3px%2C1px+solid+%23999999&output=js"></script> 250x210 <script src="http://www.gmodules.com/ig/ifr?url=http://codewiz.googlepages.com/chess23.xml&synd=open&w=250&h=210&title=%EC%B2%B4%EC%8A%A4+%EA%B8%B0%EB%B3%B4+%EB%B7%B0%EC%96%B4&border=%23ffffff%7C3px%2C1px+solid+%23999999&output=js"></script> 420x380 <script src="http://www.gmodules.com/ig/ifr?url=http://codewiz.googlepages.com/chess23.xml&synd=open&w=420&h=380&title=%EC%B2%B4%EC%8A%A4+%EA%B8%B0%EB%B3%B4+%EB%B7%B0%EC%96%B4&border=%23ffffff%7C3px%2C1px+solid+%23999999&output=js"></script> |