2009년 8월 29일 토요일

구글 어스를 좋아할 수 밖에 없어!

이번 주말에 드레스덴프라하를 다녀오기로 했다.
문제는 그곳들이 좋다는 건 알겠는데, 길이나 볼 것들에 대해 단편적인 정보들은 손쉽게 찾을 수 있어도 한 눈에 전체에 대한 정보를 볼 수 있는 곳은 없다는 거...

역시 도움이 필요하면 구글이 언제나 그 곳에 있다.

구글 어스에서 3D로 건물들을 표시하고 약간 기울이니 시내에 대한 그림이 머리 속에 쏙쏙 들어온다.
역시 조쿠나!

드레스덴 츠빙거 궁 및 프라하 성 주변




2009년 8월 28일 금요일

[카지노 로얄(1954)] 간단 감상기

사용자 삽입 이미지

최초의 제임스 본드는 션 옹이 아니라 고 배리 넬슨 옹이라는 거...



그간 한번쯤 보려고 생각만 하곤 전혀 보지 않던 전설의 1954년작 [카지노 로열]을 드디어 감상.
비록 단편이지만, 1967년작보다 이게 훨 낫다는 생각이 들었음. 1967년작이 워낙에 앞뒤 없는 괴작 코미디였긴 했지만, 제목이라도 그렇게 안 붙였으면 하는 생각이 아직도 들고 있음.

1. 제임스 본드가 도대체 왜 미국 첩보원인 것이얌? 지미 본드... 이게 가당키나 한 호칭이냐!

2. 미국 첩보원 제임스 본드, 영국 요원 클래런스 라이터... OTL. 그래도 여기까지는 이해하려 노력함. 도대체 연인 이름은 웬 발레리 마티스냐고! 르네 마티스를 뺀 대신에 이름을 슬쩍 섞은 것 같은데, 그러려면 베스퍼란 이름이라도 살려두지 그랬냐고!

3. 르쉬프의 이름에 대한 설명은 1954년작에서만 제대로 나옴. 각국어로 숫자라는 별명을 다 갖고 있단 얘기부터 (소설에선 언급되지 않았던) 루시퍼를 연상시키는 르쉬프를 주로 사용한단 얘기까지.
갠적으로 2006년작에서 이 설명이 누락된 것이 좀 아쉬웠는데, 넘 만족스러웠음.

4. 소설을 보면 르쉬프는 도박에 미친 것 외에 마약이나 매춘에도 손을 대어 스멜쉬가 버리려고 한다는 설정이 나오는데, 이건 쏙 빼고 도박만 얘기함. 아마도 TV라는 매체의 한계가 아닐까.

5. 충격의 낭심고문 장면 대신 뻰찌로 발가락을 으깨는 장면이 들어갔음. 나름 완화시킨다고 한 것 같은데, 이거나 저거나 티비에서 보여주기 좋은 장면은 아니어서 고민 많이 했을 듯.

6. 엘리베이터에서 본드가 발레리를 갈구는 장면이 있는데, [카지노 로얄(2006)]의 엘리베이터에서 베스퍼가 본드에게 빈정거리는 장면은 이 장면을 오마주한 것이 이 아닐까 함. "여긴 당신의 자존심이 탈 공간이 없네요!"

7. 소설에도 나오는 자동차 추격장면이 쏙 빠진 것은 좀 아쉬움. 어쩔 수는 없었을 듯. 티비 단편의 한계.

8. 원래 르쉬프를 KGB가 죽이도록 하기 위해 그 난리를 떨었는데, 결국 본드가 르쉬프를 죽이는 설정은 뭔지... 르쉬프의 돈이 그렇게도 탐났던 걸까?

9. 사실, "카지노 로얄"이란 이름이 언급된 영화는 세 편이 아니라 네 편임. 그 죽일 놈의 [네버 세이 네버 어게인]에서 도박장의 이름이 다름아닌 "카지노 로얄"임. 이 네 편의 시작으로서 손색이 없는 영화임.

10. 라이터와 접선 암호를 확인하는 장면, 도청장치를 피하려 음악을 트는 장면 및 수표로 바꾼 상금을 숨기는 장면 등은 최초의 007 영화답게 멋지구리하게 묘사되어 만족스러움.

11. 비록 2006년작에서 박진감 넘치는 포커씬을 보여주긴 하지만, 역시 [카지노 로얄]은 바카라가 제격인 듯.



2009년 8월 27일 목요일

오직 IE6만을 위한 iNove스킨 패치 (젠장!)

독일 출장중에 처음으로 올리는 포스트임. v^.^v

독일에 출장을 왔는데, 여기 사무실 PC엔 IE6만 깔려있다.
게다가 관리자 권한 따윈 절대 주지 않기 때문에 이놈의 구닥다리 웹브라우저를 쓸 수 밖에 없다.

덕분에 IE6에서 iNove 스킨을 유심히 쳐다볼 수 있었는데, 메뉴바가 약간 이상하게 나오는 문제가 있더라.

사용자 삽입 이미지

메뉴바가 1픽셀 아래로 밀려서 나옴


다른 브라우저에서는 아무 문제 없는데, IE6에서만 말썽을 일으켰길래 IE6 핵을 이용해서 문제를 해결했다.

우선 스킨 편집으로 가서, style.css에서 아래와 같은 내용을 찾는다.

#navigation {
    margin:1px 0;
}

이 부분을 아래와 같이 수정한다.

#navigation {
    margin:1px 0 !important;
    margin:0;
}

IE6의 버그를 이용하는 수정으로 정상적인 브라우저는 2행을 적용해야 하지만, IE6는 같은 스타일을 두번 지정하면 무조건 마지막에 지정된 스타일을 적용하여 3행을 적용한다. 희안한 놈.

사용자 삽입 이미지

티끌만치 나아지긴 했지만, 구닥다리 브라우저란 점은 변함이 없다


2009년 8월 12일 수요일

IE6 No More에 동참!

사용자 삽입 이미지

Internet Explorer 6은 인터넷 세상을 좀먹는 벌레다.

Active X나 웹표준 미준수 운운하는 거창한 얘기를 하지 않더라도, FF3, IE8, 크롬, 오페라 등에서 똑같이 보이는 페이지가 유독 IE6에서만 병신처럼 보이는 꼴은 마치 현재의 대한민국이 자유민주주의국가라는 얘기같다.

이제 IE6에 대한 공식적인 거부운동이 여기저기서 시작되었더라.
나도 IE6 No More에 동참한다.

이제부터 IE6 및 그 이하의 버전의 웹브라우저를 사용하시는 분들은 아래와 같은 따뜻한 문구를 만나실 수 있다.
제발 우리나라의 그 무식하리만치 높은 IE6의 점유율이 좀 줄어들었으면 좋겠다.

사용자 삽입 이미지

IE6에서는 이런 따뜻한 문구를 보실 수 있습니다. ^^;


덧, IE6 No More에 동참하고 싶은 브로거는 적절한 위치에 아래의 코드를 삽입하면 된다.

<!--[if lt IE 7]>
<div style='border: 1px solid #F7941D; background: #FEEFDA; text-align: center; clear: both; height: 75px; position: relative;'>
  <div style='position: absolute; right: 3px; top: 3px; font-family: courier new; font-weight: bold;'><a href='#' onclick='javascript:this.parentNode.parentNode.style.display="none"; return false;'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-cornerx.jpg' style='border: none;' alt='Close this notice'/></a></div>
  <div style='width: 640px; margin: 0 auto; text-align: left; padding: 0; overflow: hidden; color: black;'>
    <div style='width: 75px; float: left;'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-warning.jpg' alt='Warning!'/></div>
    <div style='width: 275px; float: left; font-family: Arial, sans-serif;'>
      <div style='font-size: 13px; font-weight: bold; margin-top: 12px;'>구닥다리 웹브라우저를 사용하시는군요!</div>
      <div style='font-size: 12px; margin-top: 6px; line-height: 12px;'>본 사이트를 원활하게 보실 수 있도록 웹브라우저를 업데이트 하세요.</div>
    </div>
    <div style='width: 75px; float: left;'><a href='http://www.firefox.com' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-firefox.jpg' style='border: none;' alt='Get Firefox 3.5'/></a></div>
    <div style='width: 75px; float: left;'><a href='http://www.browserforthebetter.com/download.html' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-ie8.jpg' style='border: none;' alt='Get Internet Explorer 8'/></a></div>
    <div style='width: 73px; float: left;'><a href='http://www.apple.com/safari/download/' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-safari.jpg' style='border: none;' alt='Get Safari 4'/></a></div>
    <div style='float: left;'><a href='http://www.google.com/chrome' target='_blank'><img src='http://www.ie6nomore.com/files/theme/ie6nomore-chrome.jpg' style='border: none;' alt='Get Google Chrome'/></a></div>
  </div>
</div>
<![endif]-->


김연아 선수의 새 쇼트프로그램 배경음악에 사용될 음악들

김연아 선수의 새 쇼트프로그램 배경음악은 "썬더볼트"가 아니라고!에 언급했듯이, 김연아 선수는 007 주제음악 메들리를 쇼트프로그램의 배경음악으로 사용할 예정이다.
(언젠간 풀버전을 공개해주길 간절히 바랄 뿐임)

사용자 삽입 이미지

COPYRIGHT(C) 2008, YUNAKIM.COM. ALL RIGHTS RESERVED.


음악을 공개한 것은 아니라 정확한 음악은 알 수 없지만, 공개된 제목을 통해 어떤 음악들이 편곡될 것인가 들어보자.


1. <The Name's Bond... James Bond>

영화 [카지노 로얄]의 엔딩음악인 <The Name's Bond... James Bond>이다.
데이빗 아놀드가 편곡한 이 음악은 클래식 007의 느낌이 물씬 느껴지도록 편곡된 음악이다.




2. [From Russia With Love(위기일발)]

초기 션 코너리의 걸작 스파이 스릴러인 [위기일발]의 주제곡이다.
맷 먼로의 감미로운 목소리가 일품인 주제곡이며, 영화 역시 (J.F.K가 좋아했던) 원작소설의 포스가 살아있는 걸작이다.




3. [Thunderball(썬더볼)]
 
걸작 스파이 스릴러 [위기일발]과 더불어 액션 어드벤처의 신화를 이룬 [썬더볼]의 주제곡이다.
"타이거" 톰 존스의 멋진 목소리의 포스를 느낄 수 있다.
영화 역시 1965년 아카데미 특수효과상을 수상하고, 공전의 흥행을 이루어내었다.




4. [Die Another Day(어나더데이)]

피어스 브로스넌 시절의 최대 흥행작이자, 최악의 막장 007 영화다.
전작들에 대한 패러디를 빼면 볼 건덕지가 없는 영화지만, 마돈나가 부른 주제곡은 의외로 들을만 하더라.
007 영화 주제곡 같지 않은 게 문제긴 해도. 쩝.

2009년 8월 11일 화요일

김연아 선수의 새 쇼트프로그램 배경음악은 "썬더볼트"가 아니라고!

김연아 선수의 새 쇼트프로그램 배경음악이 발표되었다.
다름아닌 007 영화 주제곡 메들리다.

그런데, 관련 기사들이나 블로그에 글들을 보면 하나같이 틀린 내용이 올라와 있다.

007 시리즈의 배경음악을 메들리 형식으로 엮었는데, 그 대상은 <The Name's Bond... James Bond>, [선더볼트](1995), [다이 어나더 데이], [위기일발], [닥터 노] 등을...

조금씩 다르기는 하지만, 위의 내용을 복사/붙이기 한 뒤에 조금씩 편집한 것이더라.
문제는 틀린 내용을 그대로 복사/붙이기 하다 보니 틀린 내용이 점점 더 늘어나는 것이다.


사용자 삽입 이미지

한경닷컴: 선더볼트, 닥터 노


사용자 삽입 이미지

노컷뉴스: 선더볼트, 닥터 노


사용자 삽입 이미지

머니투데이: 선더볼트(1995)


사용자 삽입 이미지

참살이푸드뱅크: 선더볼트(1995)


사용자 삽입 이미지

블로그와이드닷컴: 선더볼트, 닥터 노



최초의 소스를 제공한 김연아 선수 측에서 실수했을 수도 있지만, 근본적인 문제는 이 기사들을 쓴 기자들의 자질이다.
뭐가 뭔 지도 모르고 대충 써갈겨서 내보내고, 그걸 다른 기자가 그대로 베껴서 또 내보내다보니 그런 것이다.

틀리거나 수상한 부분은 아래와 같다.


1. 007 시리즈의 테마곡은 <James Bond Theme(제임스 본드 테마)>임.
    <The Name's Bond... James Bond>는 [카지노 로얄]의 엔딩곡으로 편곡된 제임스 본드 테마임.
    ('007 시리즈'도 아니고, '오프닝'도 아니라고!)
    굉장히 클래식한 스타일로 편곡을 했기 때문에 오리지널에 가깝긴 하지만...
    (참, 이것도 Name's 가 아니라 Names 라고 썼던데... 뭥미?)

2. [썬더볼트](1995)라는 영화는 성룡이 주연을 맡았던 액션영화임.
    쇼트프로그램의 배경으로 쓰이는 음악은 [썬더볼](1965)임.

사용자 삽입 이미지

[Thunderball(썬더볼)] (1965)


3. [닥터 노]는 별도의 주제곡이 없음.
    이 영화에서 대표적으로 쓰인 음악은 <James Bond Theme>과 <Under the Mango Tree>임.


어쨌거나, 새 주제곡도 정해졌으니 김연아 선수의 멋진 활약 기대한다!!!

2009년 8월 8일 토요일

휴가 기간에 3대 어플 업데이트 완료!

일 주일의 휴가동안 꽤 바쁜 시간을 보냈다.
처가, 본가에 갔다 왔고, 거제도에서 해수욕 및 피서도 즐겼으며, 풀장 있는 식당에서 가족들과 더불어 물장구와 함께 식사도 즐겼고, 에버랜드에 가서 밤 11시 30분까지 대탐사도 하고, 마눌님과 [UP]을 관람한 등등...

그 와중에 짬을 내서 본 블로그의 3대 프로그램들도 업데이트를 했다.


사용자 삽입 이미지

낮에는 놀러다니고 밤에는 코딩하는 주놀야코를 통해 이룬 성과임. ㅠ.ㅠ


노는 짬짬이 시간을 내고, 밤 며서 수정한 프로그램들이라 더욱 뿌듯함. ^^;

Cumulus for Tistory 1.21a 업데이트! (버그패치 포함)

태그 구름을 멋지게 출력해주는 플러그인인 Cumulus for Tistory 1.21는 사소한 버그가 있다.

@, &, + 등 일부 태그가 제대로 출력되지 않거나, 출력이 되어도 정상적으로 클릭이 되지 않는 문제다.
일부 태그를 화면에 출력하지 않는 미봉책을 사용했었는데, 이걸 모든 태그에 대해 정상동작하도록 대폭 수정했다.

사용자 삽입 이미지

이렇게 & @ '



1. 파일의 설치

아래 파일을 다운받아 압축을 풀면 swfobject.js, TiCumulus.js 그리고 tagcloud.swf 세 개의 파일이 나온다.
이  세 파일을 스킨 직접올리기 기능을 이용해서 올린다.

TiCumulus_v121a.zip

엔터튤립9 글꼴을 이용해서 만들어 파일 크기가 157KB밖에 안 됨



2. 스킨 수정 (새로 설치하는 것을 기준으로 함)

우선 헤더에 아래와 같이 두 줄을 추가한다.

<script type="text/javascript" src="./images/swfobject.js"></script>
<script type="text/javascript" src="./images/TiCumulus.js"></script>

다음으로, 스킨을 직접 편집해서 아래와 같은 내용을 찾는다.

<div id="tagbox" class="module">
  <h3>태그목록</h3>
  <div class="tagboxWrap">
  <ul>
    <s_random_tags>
    <li>
      <a href="[#\#_tag_link_#\#]" class="[#\#_tag_class_#\#]"> [#\#_tag_name_#\#]</a>
    </li>
    </s_random_tags>
  </ul>
  </div>
</div>

스킨에 따라 조금씩 모양이 다르기는 하지만, 꼭 있는 태그가 <s_random_tags>이다.
우선 수정해야하는 부분은 이 <s_random_tags> 밖에 있는 <ul>-</ul>이다.

이 부분을 아래와 같이 수정한다.

<div id="htags" style="display:none;"><tags>
<s_random_tags>
<a href="[#\#_tag_link_#\#]" class="[#\#_tag_class_#\#]">[#\#_tag_name_#\#]</a>
</s_random_tags>
<a href="/"></a></tags></div>
<div id="TiCumulus"><p>Tistory Cumulus Flash tag cloud by <a href="http://zoc.kr">BLUEnLIVE</a> requires Flash Player 9 or better.</p></div>
<script type="text/javascript">
//<![CDATA[
var flashvars = {
tcolor: "0x2970A6",
hicolor: "0x462A56",
mode: "tags",
distr: "true",
tspeed: "100",
tagcloud: document.getElementById('htags').innerHTML.E4Cumulus()
};
var params = {
allowScriptAccess: "always",
wmode: "opaque",
bgcolor: "#f7f7f7"
};
swfobject.embedSWF("./images/tagcloud.swf", "TiCumulus", "100%", "200", "9.0.0", null, flashvars, params);
//]]>
</script>

조금 길지만 소스 보기를 한 뒤에 복사하면 된다.

a. 22행"100%", "200"은 각각 가로, 세로의 크기임.

b. 20행"#f7f7f7"배경의 색상임.

c. 10행"0x2970A6"태그의 기본색상임.

d. 11행"0x462A56"선택된 태그의 색상임.

e. 1.21에 비해 바뀐 부분15행. 기존 버전에 비해 훨씬 정교하고 정확하게 변환하도록 수정되었음.

그럼 잘 쓰시기 바란다!!!

IE에서도 배경색이 잘 동작하도록 수정됨 (2009. 10. 19)

JW Player 도우미 플러그인 1.5 업데이트

JW Player 도우미 플러그인 1.2를 사용하시는 블로거 한 분이 외부 파일을 재생할 수 있는 기능을 요구하셨다.
(기존 버전은 함께 업로드한 파일만 재생할 수 있었음)

원래의 취지와 맞지 않아 업데이트를 하지 않았는데, 마침 시간도 좀 나고 해서 관련 기능을 업데이트 했다.

기존의 flv/mp4 파일 및 flvi(초기 이미지) 파일의 사용방법은 변함없고, 외부 비디오/오디오 파일 지정 기능이 추가되었다.
추가된 기능은 아래와 같다.


1. 외부 비디오 파일 지정

용법: <div class='flvvideo'>비디오url 가로x세로[ 초기 이미지 url]</div>
예)
<div class="flvvideo">http://www.youtube.com/get_video?video_id=lkwh4ZaxHIA&t=vjVQa1PpcFObzVECfpqqV30tUO2IvgA9EUOYAV9j4tk%3D 400x225</div>
<div class="flvvideo">http://www.youtube.com/get_video?video_id=lkwh4ZaxHIA&t=vjVQa1PpcFObzVECfpqqV30tUO2IvgA9EUOYAV9j4tk%3D 320x240 http://farm4.static.flickr.com/3096/2787692781_6b5b27d7df_o_d.jpg</div>

초기 이미지는 생략 가능하며, 영상의 가로, 세로 크기는 역시 필수이다.



2. 외부 오디오 파일 지정

용법: <div class='mp4audio'>오디오url</div>
예)
<div class="mp4audio">http://zoc.kr/attachment/cfile5.uf.2076E8144A596495D58A51.mp4</div>

물론 aac 형식의 mp4 파일만 재생 가능하다.


설치방법은 아래 압축파일을 스킨 업로드를 통해 업로드하면 되며, 상세한 설치 방법은 기존 포스트(JW Player 도우미 플러그인 1.2 업데이트)를 참고하시기 바란다.



이제 이 플러그인을 이용하면 아래와 같은 유트브 비디오를

사용자 삽입 이미지

아래와 같이 직접 재생하는 것이 가능하다.

사용자 삽입 이미지

덧. 위 비디오는 유튜브에 올라온 Bruno Kammerl jumps이며, 참고의 목적으로만 사용되었음을 알립니다.

2009년 8월 7일 금요일

notepad2 컴파일 삽질기 6 : 일본어 IME도 정상적으로 사용이 가능하도록 수정

삽질기2: IME 메시지 처리삽질기3: undo/redo 정상동작토록 수정에서 발견된 IME 관련 버그를 수정하는 포스트임


step6. 일본어 IME 메시지도 잘 처리하도록 수정

모 포럼에서 notepad2를 일본어 윈도우에서 돌려보니 IME 쪽에서 문제가 발생했다는 버그 리포트가 들어왔다.
(notepad2를 일본어 윈도우에서 돌려볼 생각도 해본 적이 없었음)

한글의 경우 한 순간에 조합되고 있는 글자의 수가 무조건 하나인데, 수정된 방식은 이 상황에 최적화되어있어 발생한 버그이다.
하지만, 일본어의 경우 아주 많은 글자가 동시에 입력되는 상황이 발생할 수 있다는 것이다.

일본어 윈도우에서도 notepad2를 무난하게 사용하려면 아래와 같이 수정하면 된다.
(일본어 윈도우를 쓸 일이 없다면 이 수정은 당연히 무의미하다)

수정 대상 파일은 ScintillaWin.cxx 하나이다.


1. ScintillaWin 클래스 선언부에서 메쏘드 및 변수 추가

ScintillaWin 클래스의 선언부에 아래와 같이 메쏘드 및 변수를 추가한다.
선언부 맨 끝부분에 추가하면 된다.

private:
void DelCharBacks(int iCount);
int GetCompositioningStrLen(DWORD index);
long lCompositioningLenOld, lCompositioningLen;



2. HandleComposition() 메쏘드 수정

IME에서 글자를 입력중일 때 메시지를 처리하는 메쏘드가 바로 HandleComposition() 이다.
따라서, 뭘 바꾸든 이 메쏘드가 바뀔 가능성은 백푸로다.

이번에는(에효... 또냐... ㅡ.ㅡ;) 아래와 같은 내용으로 통째로 바꿔준다.

sptr_t ScintillaWin::HandleComposition(uptr_t wParam, sptr_t lParam) {
#ifdef __DMC__
// Digital Mars compiler does not include Imm library
return 0;
#else
ClearSelection();
if (!inOverstrike) pdoc->cb.uh.EnableUndoAction(false);

if (lParam & GCS_COMPSTR)
{
if (inComposition) DelCharBacks(lCompositioningLenOld);

if (inOverstrike) bCompositioning = true;

inComposition = !(AddImeCompositionString(GCS_COMPSTR) == 0);
}
else if (lParam & GCS_RESULTSTR)
{
if (inComposition) DelCharBacks(lCompositioningLenOld);

if (inOverstrike) bCompositioning = false;
else pdoc->cb.uh.EnableUndoAction(true);

AddImeCompositionString(GCS_RESULTSTR);
inComposition = FALSE;
lCompositioningLenOld = 0;
}

UpdateSystemCaret();
return 0;
#endif
}



3. ImeStartComposition() 메쏘드 수정

ImeStartComposition() 메쏘드를 찾는다.
이 메쏘드의 앞부분은 아래와 같은 모양이다.

void ScintillaWin::ImeStartComposition() {
#ifndef __DMC__
// Digital Mars compiler does not include Imm library
if (caret.active) {
// Move IME Window to current caret position
HIMC hIMC = ::ImmGetContext(MainHWND());

여기에 한 줄을 추가해서 아래와 같이 바꿔준다.

void ScintillaWin::ImeStartComposition() {
#ifndef __DMC__
// Digital Mars compiler does not include Imm library
lCompositioningLenOld = 0;
if (caret.active) {
// Move IME Window to current caret position
HIMC hIMC = ::ImmGetContext(MainHWND());

중간에 한 줄(4행)이 추가된 것 외엔 바뀐 부분은 없다.



4. AddImeCompositionString() 메쏘드 수정

ImeStartComposition() 메쏘드를 찾는다.
이 메쏘드를 아래의 내용으로 통째로 바꿔준다.

내부적으로만 사용되던 문자의 개수(wides)를 멤버변수(lCompositionLenOld)로 바꿔주는 것이다.

LONG ScintillaWin::AddImeCompositionString(DWORD index)
{
const int maxImeBuf = 200;
wchar_t wcs[maxImeBuf];

LONG bytes = GetCompositionString(index, wcs, (maxImeBuf-1)*2);
lCompositioningLenOld = bytes/2;

if(bytes == 0)
return bytes;

if (IsUnicodeMode()) {
char utfval[maxImeBuf * 3];
unsigned int len = UTF8Length(wcs, lCompositioningLenOld);
UTF8FromUTF16(wcs, lCompositioningLenOld, utfval, len);
utfval[len] = '\0';
AddCharUTF(utfval, len);
} else {
char dbcsval[maxImeBuf * 2];
int size = ::WideCharToMultiByte(InputCodePage()
, 0
, wcs
, lCompositioningLenOld
 , dbcsval
, sizeof(dbcsval) - 1
, 0
, 0);
AddCharUTF(dbcsval, size);
}

return bytes;
}



5. GetCaretSize() 메쏘드 수정

GetCaretSize() 메쏘드에서 아래와 같은 부분을 찾는다.

    if(inComposition)
{
Point end = LocationFromPosition(currentPos);
Point start = LocationFromPosition(currentPos-2);
cs.x = end.x - start.x;
cs.y = vs.lineHeight;
}

위에 하일라이트된 4행을 아래와 같이 수정한다.

    if(inComposition)
{
Point end = LocationFromPosition(currentPos);
Point start = LocationFromPosition(currentPos - lCompositioningLen);
cs.x = end.x - start.x;
cs.y = vs.lineHeight;
}

한글이란 가정 하에 길이를 무조건 2로 설정하지 않고, 조합중인 글자 수로 설정하는 수정이다.



6. 메쏘드 2개 추가

수정중인 ScintillaWin.cxx의 맨 끝부분에 아래와 같이 새로운 메쏘드 2개를 추가한다.

int ScintillaWin::GetCompositioningStrLen(DWORD index)
{
HIMC hIMC = ::ImmGetContext(MainHWND());
if (hIMC) {
const int maxLenInputIME = 200;
wchar_t wcs[maxLenInputIME];
LONG bytes = ::ImmGetCompositionStringW(hIMC,
index, wcs, (maxLenInputIME-1)*2);
int wides = bytes / 2;
return wides;
}
return 0;
}

void ScintillaWin::DelCharBacks(int iCount)
{
DestroySystemCaret();
while (iCount--) DelCharBack(false);
CreateSystemCaret();
}


이렇게 수정하면 일본어 IME에서도 정상적인 문자의 입력이 가능하다.

사용자 삽입 이미지

XPMode + 일본어 Win XP에서 입력중인 모습


2009년 8월 1일 토요일

Windows 3.x는 3.2까지 개발되었다

Windows 3.x를 기억하는가?
부실한 DOS 기반의 GUI 환경이었지만, 결국 이 놈은 MS Office라는 킬러앱과 함께 IBM의 OS/2를 이겨내었다.

당시 OS/2에는 seamless 모드라는 기능이 있었는데, 이를 통해 Windows 3.0/3.1을 내부적으로 실행함으로써 Win16 어플리케이션을 실행하는 환경을 제공했다.

하지만, 이를 두고볼 MS가 아닌지라 Windows 3.11이라는 환경을 만들어 seamless 모드를 차단시킨다.
웃긴건 버전번호를 제외하면 3.11은 3.1과 100% 동일한 프로그램이었다는 거다.

OS/2를 물리친 MS는 Windows 95를 출시함으로써 OS 시장을 지배하게 된니다.

그런데... MSDN 개발자 계정이 있는 친구 덕분에 MSDN 사이트를 구경할 수 있는 기회가 생겼다.
그런데, MS가 Windows 3.11 외에도 Windows 3.2라는 환경도 만들었었더라.

사용자 삽입 이미지

Windows 3.2!!!


지금 와서 굳이 돌려볼 생각도 없는 환경이지만, 이런 것이 있었다는 것만으로도 신기하다.