1. 색소폰 연주

아시다시피 본인은 Looking for you를 3천 번 들었다.
성경의 사무엘이 '사무엘아' 음성을 두 번 듣고 나서 세 번째 들은 뒤엔 출처를 공부한 뒤 들을 준비를 하고 잠자리에 누웠다. 네 번째 '사무엘아' 음성을 들은 뒤에야 하나님의 음성에 제대로 응답하게 됐다.

그것처럼 나도 새마을호에서 Looking for you를 두 번 듣고 나서 세 번째 들은 뒤엔 출처를 인터넷으로 검색했고, 다음엔 들을 준비를 하고 새마을호를 탔다. 네 번째 Looking for you가 흘러나왔을 때 나는 철도 안에서 거듭났고 철도를 내 개인의 교통수단으로 영접하는 놀라운 일이 벌어졌다.

그 뒤로 나는 Looking for you를 주선율, 주요 화음, 대략의 비트까지 다 청음 채보했다.
콩나물 대가리를 한땀 한땀 입력해 넣고 원곡과 대조하면서, 어느 기보가 원음에 더 근접한 정확한 기보인지를 고민하면서..
Looking for you 작곡자의 마음과 심정을 이해하는 자가훈련을 했다.

이 음악의 어느 부분이 나를 감화시켜서 나를 철덕으로 만들었는지, 왜 이런 결과가 야기될 수밖에 없는지를 연구했다.
그리고.. Looking for you의 주선율을 만든 악기 공부를 (잠깐 동안이지만) 시작했다.

사용자 삽입 이미지

작년 성탄절, 우리 교회 복음 전도 집회에서.
아, 교회에서 Looking for you 연주했다는 얘기는 아님. 오해 마시길..

2. 나의 등산 노트

사용자 삽입 이미지

조건부 서식이 있으니 올랐던 산들의 높이를 일목요연하게 파악할 수 있어서 매우 좋다.
이것도 중복 정보 없이 정규화가 잘된 구조로 구축하려면 산에 대한 테이블과 등산 세션과 관련된 테이블을 분리하긴 해야 하는데, 엑셀로 그것까지 하기에는 많이 귀찮지.

입산 지점에 최종적으로 어떤 교통수단을 이용해서 가서 어디로 하산했는지,
산 속에서 주로 본 게 무엇인지, 바깥 경치로 주로 무엇을 봤는지,
정상에는 무엇이 있었고 어떤 형태였는지, 산이 행정적으로 어떤 관리를 받고 있는지 같은 것을 일목요연하게 조회 가능하게 했다.

3. 코딩

그럼 이제 일상생활 얘기로 넘어가겠다.

사용자 삽입 이미지

(밝은 화면을 비추느라 명암차 때문에 주변이 어두워진 거지, 촬영 당시에 책상 주변은 실제로는 저 사진만치 어둡지 않았음)
화면이 미치도록 광활한 데스크톱 컴과,
눕든지 앉든지 편한 자세로 침대, 책상, 자동차 등 아무 데서나 사용 가능한 놋붉 컴 중
뭘로 코딩을 할지가 매우 고민된다. 일종의 행복한 고민.

참고로 노트북의 화면 전체와, 데스크톱 모니터의 오른쪽에 떠 있는 작은 프로그램 창하고 화면 크기(화소 수)가 동일하다. ㄲㄲㄲㄲㄲㄲㄲㄲ 미래의 리드미 문서를 작성하고 있는 날개셋 편집기의 화면임.
내가 지금까지 갖고 있던 그림과 동영상들이 화질이 얼마나 구린지를 까발리고 정죄하는 마법의 모니터다.

역시 프로그래머에게 화면이 큰 건 컴퓨터에게 램이 많은 것과 같다~! 정말 다다익선이다.
그도 그럴 것이 자꾸 창 전환이나 스크롤 하는 게(개발툴, 웹브라우저, 에디터, msdn 등등) 컴터로 치면 메모리 부족해서 하드디스크 스와핑 하는 것과 개념적으로 완전히 동일하기 때문이다.

무식하게 혼자 3~5K급으로 해상도가 너무 높은 모니터 하나냐, 혹은 걍 2K 해상도급 모니터 듀얼/트리플 중 어느 게 더 좋을지는 잘 모르겠다. 제각기 장단점이 있어 보인다.
참고로 배(선박)와 DLL(Windows 파일..;; )은 작은 놈 여럿보다는 큰 놈 하나가 성능면에서 더 효율적이다.

일체형 PC는 간지나고 공간 덜 차지하고 지저분한 선 없이 콘센트 하나만 꽂으면 모니터 본체 스피커가 전부 OK이니 정말 좋긴 하다.
다만, 이렇게 한번 세팅된 이후로 부품 업그레이드가 어려울 것이고 발열 제어도 곤란하니 엔드급 게임은 무리일 것이다.

구조적으로 볼 때 철도 차량의 동력분산 / 동력집중의 차이와 비슷해 보인다. 일체형 PC가 동력집중이 아니라 분산식에 대응한다. 그리고 트렁크· 캐빈· 엔진룸 따위의 구분이 없는 원박스 형태의 자동차도 일체형 PC와 비슷한 컨셉이라 볼 수 있겠다. (공간 활용 최대, 그러나 정비가 어렵다는 점에서 비슷)

4. 시간 부족과 일정 압박

CPU 클럭 속도 향상의 병목은 발열이고, 자동차 속도 향상의 병목은 공기 저항이다. 스마트폰 성능 향상의 병목은 배터리 용량이다.
그리고 날개셋 한글 입력기 개발에서 최악의 병목은 잠으로 인한 시간 부족 되시겠다.
난 오랜 경험상 매일 6시간이 정말 마지노선이고 그 이하로는 도저히 못 줄이겠다. 결국은 낮에 졸음과 집중력 저하로 인해 밤에 안 잔 것 이상의 대가를 치르게 되더라. -_-;;

어지간한 고시 준비생만치 시간을 분초 단위로 쪼개며 살아도 시원찮을 판에 이래 가지고 날개셋 9.0은 언제 완성할 것이며 박사 졸업은 도대체 언제 하나..;;
늦게 자고 늦게 일어나는 것보다는 일찍 자고 일찍 일어나는 것 선호함. 눈 감았다 뜨면 그냥 6시간이 싹 워프되고 개운 가뿐하게 일어나긴 한다. 천성적으로 남 눈치 안 보고 앞날 걱정을 미리 안 하는 체질이어서 그런지 스트레스는 적게 받는 편. 불면증 같은 게 어떻게 존재하는지 이해를 못 한다.

단지 잠을 더 줄일 수가 없을 뿐임.
이것도 기초체력 문제인가..? 잠 적으신 분이 굉장히 부럽다.

5. 덕질

논문 쓸 '꺼리, 아이템'들을 만들어내는 활동은 재미있지만 (코딩, 시스템 구현, 실험 등등)
그걸로 온갖 형식 갖춰서 실제로 논문을 쓰는 건 꽤 성가시고 번거롭다. =_=;;
그래도.. 잔인한 주인이 무자비하게 내린 온갖 복잡한 재귀호출 뺑뺑이와 자질구레한 메모리 할당· 해제 요청들을 컴퓨터는 진짜 순식간에 전광석화처럼 해낸다.

소프트웨어의 추상화 계층이 올라가면 코드를 유지보수하고 확장하기는 편해지지만 컴퓨터의 입장에서는 뭘 하나 하려 해도 포인터가 가리키는 대로 메모리를 여러 단계 요리조리 따라가야 하고, 캐시 미스가 나면 더 느린 메모리에 갔다가 와야 된다.

사용자가 '확인'을 누르거나 키보드를 하나 눌러서 화면에 글자 한 자가 찍힐 때까지 컴퓨터가 전자적으로 처리하는 일의 양이 도대체 얼마나 될까.
하물며 실존하지 않는 종이, 실존하지 않는 음악과 영상이 존재하는 것 같은 경험을 사람에게 제공하기 위해서 컴퓨터는 얼마나 많은 계산을 순식간에 해치우고 있을까?
프로그래머로서 이런 컴퓨터가 고맙고 대단하게 느껴질 때가 있다.

글자를 온통 배배 틀고 배경과 뒤섞어 놓은 일명 '캡챠'는 사람은 곧바로 알아보지만 컴퓨터가 알아보지 못하는 (걸 지향하는) 그림이다.
그러나 사람이 도무지 판독할 수 없는 랜덤 노이즈로 보이는 QR 코드 같은 건 컴퓨터가 곧바로 판독해 낸다.
예전에도 말했듯이 주석과 들여쓰기가 잘 된 코드와, IOCCC용 난독화 코드는 컴퓨터가 해석하는 데 아무런 차이가 없다.
이런 걸 생각해 봐도 사람과 기계는 근본적으로 특성이 달라도 이렇게 다르다는 걸 느낄 수 있다.

6. 컴퓨터 세팅

개인용 컴퓨터를 새로 지르거나 회사 같은 데서 내 업무용 컴터를 받았을 때 내가 기종을 불문하고 제일 먼저 하는 일은

  • 키보드 속도를 최고속으로 맞춘다. 보통 디폴트 값은 반복 속도가 늘 최고속에서 한 단계 낮은 걸로 돼 있는데.. 난 이게 최고속으로 돼 있지 않으면 답답하고 불편해서 못 쓴다. 키를 이 정도 시간 동안 눌렀으면 cursor나 선택 막대가 어느 정도로 이동해 있을 거라는 예상치와 기대치가 있기 때문이다. 지금 같은 '재입력/반복 키보드 속도 조절 체계'는 IBM PC AT 시절 이래로 변함없이 이어져 온 유구한 전통이다.
  • <날개셋> 한글 입력기를 설치한다. 내 홈페이지에 대외적으로 공개돼 있는 최신 버전이 아니라, 나 혼자만 갖고 있는 "개발 중"인 진짜 최신 버전이다. 한글을 내가 원하는 형태로 입력 가능하고 그 구닥다리 16*16 비트맵 폰트를 화면으로 좀 봐야 내가 심리적으로 안정된다.
  • Looking for you.mp3 복사해 넣는다. 음악 파일 중에서 묻지도 따지지도 않고 내가 무조건 제일 먼저 집어넣는 파일, 특히 사운드 테스트용으로 쓰는 파일은 답정너 looking for you이다. 이게 흘러나와야 내 개인용 컴퓨터라는 생각이 든다.

그나저나 노트북 내지 미니키보드들의 왼쪽 아래를 보면 Ctrl의 오른쪽에 Alt가 있는 것은 보장되지만 이것 말고 Fn, Win, 한자 키 같은 것은 생각보다 배치가 제멋대로이고 파편화가 심하다. 규격이 통일돼 있지 않다. 이것 때문에 한 키보드에 적응되고 나면 다른 키보드에서 modifier 키를 잘못 누르기 쉬워서 몹시 불편하다.

말이 나왔으니 하나 더.. 요즘 Windows 10은 사용자에게 선택의 여지를 안 주고 시도 때도 없이 강제 업데이트를 해서 꺼져야 할 때 바로 안 꺼지고, 켜져야 할 때 바로 안 켜지는 게 굉장히 싫다. 대규모 업데이트가 너무 잦고, 심지어 업데이트 후에 컴퓨터가 맛이 가는 것도 몇 번 겪어서 하기가 더욱 싫어진다. 그리고 컴퓨터를 오래 쓰고 나면 언제부턴가 시작 메뉴에서 앱들 검색이 제대로 동작하지 않기 시작한다. 나만 이러는 거 아니지?

그래서 인터넷을 뒤져서 이더넷 유선 랜도 데이터 요금이 부과되는 네트워크라고 속이는 레지스트리 패치를 적용시켰다. 그래야 운영체제가 제멋대로 깽판을 안 부린다. 제아무리 보안 업데이트도 인터넷 패킷 종량제 앞에서는 깨갱 할 수밖에 없으니까.

7. 삼각형의 오심을 그리는 프로그램

작년이니 엄청 옛날에 이미 작업된 사항이긴 한데, 막 중요한 건 아니어서 이제야 여기서 공지를 하게 됐다. 홈페이지의 '옛날 자료실'에 올라와 있는 '삼각형 오심을 그리는 프로그램'이 거의 10여 년 만에 기능이 크게 추가되고 보강됐다. 수학 강사인 교회 지인의 제안으로 행해진 작업이다.

삼각형의 오심이야 간단한 기하 알고리즘으로 (1) 두 직선의 교점과 (2) 두 변이 이루는 각을 이등분하는 변만 구할 줄 알면 컴퓨터로 아주 쉽게 구할 수 있다. 삼각형은 2차원 평면도형 중 가장 간단한 물건인데 얘의 모양에다 중심이라는 의미를 부여하는 방법도 이렇게 다양하다는 걸 알게 된다.

구체적인 개선 사항은 해당 웹페이지에도 나와 있지만, '구점원'이라는 걸 그리는 걸 추가했다. 삼각형 세 변들에 대해 변의 중점으로만 이뤄진 작은 삼각형의 외심원을 구한 것인데, 이게 또 방점과 접하고 수심을 지나기도 하는 등 기하학적인 의미가 장난이 아니다. 이걸 제6심이라고도 볼 수 있을지는 모르겠다.

그리고 내심을 제외한 수심, 구점원 중심, 무게중심, 외심 이렇게 네 점은 언제나 한 직선상에 있다는 게 보장된다..;; 이 오일러 직선을 그리는 기능도 추가했다.
또한 삼각형의 꼭지점만 마우스로 끌어서 이동시키는 게 아니라 삼각형 내부를 끌면 삼각형이 통째로 움직이게 했다. 한 점이 삼각형의 내부에 있는지 판별하는 건 세 점의 방향성 판별 공식을 이용해서 구현 가능하다.

웹브라우저에서 윤곽선 폰트 에디터까지 구동하는 세상인데 이런 간단한 그림을 그리는 프로그램쯤은 이제 플래시조차 필요 없고 HTML+(JS)로 다 만들 수 있을 것이다. 엔드 유저의 관점에서는 EXE 형태의 프로그램이 점점 필요 없어지고 있긴 한데, 일단 내가 아는 skill은 C++과 Windows API이니 저렇게 간다. GDI 말고 다른 API를 동원해서 선들을 안티앨리어싱도 좀 시킬 걸 하는 아쉬움도 남는다. 완벽하게 만들려고 욕심 부리면 뭐 한도 끝도 없다.

Posted by 사무엘

2017/02/26 19:33 2017/02/26 19:33
, , , ,
Response
No Trackback , 2 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1332

1. 터널의 번호

예전에도 남산 터널에 대해서 글을 쓰면서 명칭의 일관성에 대해서 살짝만 언급한 적이 있었는데,
개인적으로 서울 남산 터널은 “제1~제3 남산 터널” 같은 식으로 불렀으면 하는 바람이 있다.
이게 제1~제4 땅굴, 제2 경인 고속도로 같은 유사 분야의 다른 명칭들과 일관성이 있다. 교량조차도 한강대교, 양화대교, 한남대교는 예전 명칭이 각각 제1~제3 한강교였다는 것을 생각해 보자.

순서를 나타내는 의존명사 ‘-호’는 일반적으로는 보통 제일 끝에 붙는다. 서식 2호, 명령 1호처럼.. 이게 자연스럽다. 그 반면 “남산 1호 터널”은 다른 유사 용례가 없고 너무 이상하게 느껴진다.
참고로 호 뒤에 추가로 더 붙는 ‘호실’, ‘호선’, ‘호기’ 같은 걸 보면 ‘실, 호, 기’도 의존명사이기는 마찬가지다. ‘터널’과 같은 위상의 형태소가 아니다.

요까지만 글을 썼는데..
팔당 역 근처의 국도변에 연달아 등장하는 터널들의 이름도 찾아보니 거기는 '팔당 제1터널', '팔당 제2터널'... 이렇게 이름이 붙어 있었다.;;; 일관성 없는 혼란의 극치이긴 하다만 제n이 그래도 차라리 n호보다는 나은 것 같다.

2. 비슷한 단어

decease (디씨-스) 죽다 / disease (디지-즈) 질병
철자와 발음과 뜻이 서로 은근히 헷갈리기 쉬운 단어쌍인 것 같다.
loyal(충성스러운)과 royal(왕가의)
 jealous(질투심 강한, 시샘하는)와 zealous(열광· 열성· 열심적인)에서도 비슷한 심상이 연상된다.

sharp / pointed
'날카롭다'와 '뾰족하다'의 차이라고 생각하면 된다. 뾰족한 건 진짜 0차원 점으로 모이는 것만 해당하고, 날카로운 건 1차원에도 해당된다. 칼날이 닿는 곳이 선을 형성하니까 말이다. 송곳을 끝이 뾰족하다고는 하지만 날카롭다고는 잘 하지 않는다. (하지만 이것도 미래에 구분이 없이 모호해질 여지는 있음)

dark는 '어둡다'와 '캄캄하다' 중에 어디에 더 가까울까 궁금해한 적이 있다. 송 명희 시인의 찬송시 중에도 "우리의 어두운 눈이 그를 미워했고, 우리의 캄캄한 마음이 그를 몰랐으며"가 있으니 말이다.
물리적으로 빛이 안 비쳐서 풍경이 시커먼 것 중심인 단어가 있는가 하면, 바깥과는 무관하게 내가 지금 앞이 안 보이는 것 중심인 단어도 있다. 둘 다 dark에 대응할 수도 있지만, "아 문제가 너무 안 풀려서 눈앞이 캄캄하다"라고 말할 때는 "눈앞에 어둡다"라고 하지 않기 때문이다. 반대로 진짜로 시력이 어둡거나 야맹증을 앓고 있는 건 "눈이 어둡다"라고 표현하기도 한다. 관계가 서로 오묘하다.

pull / tow / haul
모두 기본적으로 '끌다, 견인하다'라는 뜻이 있다. pull은 뜻이 제일 넓고 보편적이기 때문에 사고 차량이나 불법주차 차량을 다른 기계로 견인하는 건 tow라고 표현하는 것 같다. 공항에서 갓 출발한 비행기를 자력 주행 가능한 곳으로 밀거나 끌어 주는 차량도 tow car라고 부른다.
한편, haul은 기관차가 객차를 끌고 간다고 할 때 종종 본 것 같다. tow와는 어감이 미묘하게 다른 상황이어서 그런 것 같다.

3. 중국어

내가 제대로 구사할 줄 아는 외국어는 현재 영어밖에 없긴 하다만, 그래도 중국어에 일말의 관심을 갖게 만드는 것은 (1) 열차 안내방송과 (2) 아저씨 대사다.
(1)이야 “번쯔 리에처 목포 더 무궁화 하오 리에처” 같은 것이고, (2)는.. 해당 영화가 정말 명대사가 너무 많은 작품이어서 말이다. “즈 차예시 총 샨양 아이더. 허 디얼바.”

테이큰에 이어 아저씨에 너무 꽂힌 나머지 오죽했으면 도대체 심양이 어떤 곳인지 궁금해서 대륙 지도를 꺼내서 찾아 보기까지 했다. 딱히 차가 특산품인 동네는 아닌거 같던데. ㄲㄲㄲㄲㄲㄲ
그나저나 덩달아 같이 알게 된 건, 하얼빈이 우리나라에서 딱 정북향이라는 점이다. 안 중근 의사가 순국한 곳인 다롄-뤼순과도 생각보다 굉장히 멀리 떨어져 있다. 하얼빈도 막연히 황해 건너편 대륙 어딘가에 있지 않겠나 생각했는데 전혀 그렇지 않다. 시기적으로 별 관계 없는 임시정부의 망명 동선 같은 것과 헷갈렸던 것 같다. 만주, 훈춘 이런 건 그냥 동쪽 끝이고.

“중국서 조폭영화 좀 봤는갑네. 깜장으로 쫙 빼.. 무슨 장례식 왔나. ㅋㅋㅋㅋ” 를 통역할 수 있으려면 중국어 공부를 많이 해야 할 듯하다.

인터넷 글을 통해 보게 된 새로운 영단어들을 단어장으로 정리해서 틈틈이 외우고 있다. 일본어도 최소한 글자(히라/가타)는 좀 읽을 수 있게 테이블을 암기하고 있는데 머릿속에 정말 안 들어가진다. 특히 읽는 거 말고 쓰는 건..;;

어학이라는 게 사람에게 매우 큰 지적 자산이요 스펙이 되는 건 사실이다. 언어 장벽으로 사람들을 갈라 놓은 게 괜히 신의 한수가 아니다. 이거 생각 이상으로 극복하기 어렵다. 언어를 뒤엎는다는 건 아예 사람이 생각하는 방식 자체를 바꿔 놓는 거니까.
본인은 창조론자에 언어 신수설을 믿는 사람으로서, 언어마다 문법과 어휘에 이유 없이 존재하는 온갖 괴상한 굴절과 불규칙들도 배후에 일종의 지적 설계가 있다고 추측할 정도이다. -_-;;

이 와중에 그나마 영어 같은 언어가 세계어가 된 건 축복이다. 철자법이 개판인 것만 빼면 그나마 글자도 형태가 간단하고, 이 정도면 굴절어가 아닌 그냥 고립어(형태론) 아닌가 하는 생각이 들 정도로 굴절이 굉장히 단순해졌고, 그러면서 정/부정관사 단/복수처럼 엄밀해야 할 건 엄밀하게 남아 있고, 쓸데없는 높임법 따위 없이 2인칭은 하나님이래도 you라고 간단하게 호칭할 수 있고..

그렇다고 해서 모국어가 쓰레기라는 소리는 아니다. 본인은 이런 주류 영어· 알파벳과는 구조가 극과 극으로 너무 다른 한국어· 한글이 그 때문에 오히려 유니크한 가치가 있다고 생각하고 창의적인 활용 방안을 찾는 중이다. 하지만 한국어도 언어의 사회성을 심각하게 침해하지 않는 선에서는 최대한 모호하고 무질서한 면모를 없애고 문법과 어휘를 조금씩 개량해 나가야 한다고 생각한다.

4. More..

  • 우리말의 '보통'은 생각보다 뜻이 굉장히 많고 중의적이다. 부사로서 in general이라는 뜻과 형용사로서 ordinary라는 뜻이 있는 품사통용어이다. 아, 거기에다 빈도부사(sometimes) 같은 뜻도 지닌다. 와/과(접속조사 and & 부사격조사 with), 그리고 '다른'(형용사 different & 관형사 another)만큼이나 어떨 때는 굉장히 불편하게 느껴진다.
  • 친정, 처가, 외가 .. 다 기본적으로 같은 의미인 거 맞지?
  • 똑같이 '돌'이 들어가는 이름인데 리빙스턴 / 산돌(서체 회사 이름이기도!), 아인슈타인 / 일석..;; 어감이 굉장히 다르다.
  • 똑같은 lawyer이어도 성경에 나오는 율법사와 오늘날의 변호사는 완전히 다른 개념임. 유대교의 priest와 천주교의 priest가 완전히 다르듯이 말이다.
  • 정신승리, 영적 승리.. 영어로는 똑같이 spiritual victory인데 그야말로 천차만별로 뉘앙스가 달라진다. 영어는 <아Q정전>의 영문 번역본에서 실제로 쓰인 단어이기도 하다.
  • 영어는 I/Y 같은 고모음에서 장모음/단모음이 오락가락 하는 편인 것 같다. vitamin(바이/비타민), missile(미싸이얼/미쓸), direct(다이렉트/디렉트). 비타민은 그렇다 치지만 미국 영어는 뒤의 두 단어에 대해서 영국식 국제 영어와는 달리 단모음을 선호한다.
  • 난 '이름'이 full name(성명)도 되고 first name(...)도 되는 게 불편하고 싫었는데 잘 알다시피 영어에도 어차피 day(날/낮), man(사람/남자), egg(알/달걀) 같은 어정쩡한 의미 관계는 얼마든지 있다. 특히 man과 day는 성경 번역과도 아주 직접적인 관계가 있을 정도의 의미 중의성을 제공한다.
  • pray, bless, repent 이런 단어들은 기본적인 심상은 공통이지만 동작 주체 내지 대상이 사람이냐 하나님이냐에 따라서 구체적인 번역이 달라지는 단어이다. (기도하다/부탁하다, 복을 빌다/복 주다/찬송하다, 회개하다/돌이키다)
  • 난 개인적으로 '미덥다 미쁘다' 이런 용언이 안 그래도 믿음 짱 종교의 경전인 성경에 들어갔으면 하는 바람이 있다. 솔직히 정치색만 없으면 두음법칙도 없는 게 더 낫고.. 친구와 동무, 국민과 인민도 구분해서 쓰는 게 더 나을 것이다. 굳이 얼음보숭이 같은 이상한 말 만들 필요 없이 이미 있는 말이라도 적절히 구분해서 잘 쓰면 된다.

Posted by 사무엘

2017/02/24 08:34 2017/02/24 08:34
,
Response
No Trackback , 4 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1330

1. 창군

지금으로부터 멀다면 멀고 가깝다면 가까운 과거인 1940년대 말에, 대한민국이라는 나라가 건국되었다. 그리고 나라를 지키기 위한 군대, 즉 국군이 창설되었다. 마치 성경의 천지창조에서 궁창 상하의 물이 나뉘듯이 국방 경비대인 육군에서 해군과 공군이 차례로 분리되어 나갔다(1946~49).

조선(또는 대한 제국)이 망해 가던 1907년엔 있던 정규군도 해산되고 군인들이 외세에 의해 강제로 무장 해제를 당했는데.. 그로부터 거의 정확히 40년 뒤엔 단군의 후손들도 정규군을 가진 독립 국가로서 국제 사회의 일원이 되었다. 이웃의 일본은 전범+패전의 대가로 명목상으로는 아예 군대를 가질 수 없는 나라가 됐으니, 그것과 비교해도 행로가 완전 극과 극이 됐다.

정상적이라면 대한민국 국군은 남동쪽의 바다 건너 일본을 견제하고 강 건너 중국과 소련을 마주 보면서 나라 지키는 일을 해야 했을 것이다. 그러나 소련의 괴뢰로 시작한 북괴의 존재는 안 그래도 좁은 국토를 반으로 분단시켰을 뿐만 아니라 우리로 하여금 숨 돌리고 천천히 자연스럽게 발전할 틈도 주지 않았다. 상황을 너무 긴박하고 급격하게 바꿔 놓았다.

2. 즉결처분

6· 25 전쟁 시작 당시에 국군이 얼마나 허둥대고 당황했으며 싸움다운 싸움도 못 하고 전선이 붕괴했으면, 즉결처분이라는 극약 중의 극약 개막장 처방이 1년 남짓 시행되었을 정도였다. 적진에서 상관의 명령 없이 무단으로 후퇴하고 뒤로 내빼는 부하는 일벌백계 사기 진작 차원에서 상관 재량으로 읍참마속의 심정으로 현장에서 바로 쏴 죽여 버릴 수 있게 한 것이다. 옛날 전열보병 전투 시절처럼 "적의 총탄에 장렬히 산화할 확률 90% vs 아군 지휘관에게 맞아 뒈질 확률 100%"를 만든 거다.

하지만 실제로는 읍참마속은 개뿔.. 장군님 훈시 하는 중에 졸거나 몸 움직였다고, 혹은 상관이 탄 차량 주변에서 얼쩡댄다고 부하를 쏴 죽이는 미친놈이 있을 정도였다고 한다. 또한 황당하고 비현실적인 명령을 수행하는 것을 거부한다고 병뿐만 아니라 초급 장교까지 상관의 기분대로 괘씸죄로 즉결처분 당했다.
이거 뭐 계급 없는 군대 내지, 린치가 허용되는 사회만큼이나 군대 꼬라지가 개판오분전이 따로 없었다.
즉결처분은 1950년 7월부터 이듬해 7월까지 1년 남짓 시행되다가 결국 폐지되었다. 이런 야만적인 제도가 부활되는 일은 다시는 없어야 할 것이다.

3. 여군 병사

"여러분들은 해병 몇 기라고요?" / "1077기입니다." / "난 해병대 4기예요." / (ㅎㄷㄷㄷㄷㄷㄷ)
예전에 2010년 무렵이던가, 요런 TV 화면 캡처 짤방이 나도는 걸 보신 분이 있을 것이다.
해병대는 안 그래도 자기들끼리 선후배 기수놀이에 완전 목숨을 거는 집단인데, 그 당시에 저 말을 들은 현역병들은 그 자리에서 그대로 얼어붙어 버렸지 싶다. (내 밑으로 전부 대가리 박어!)

사용자 삽입 이미지

정말 사기적인(!) 기수를 인증하신 저 어르신은 제주도에서 살다가 6· 25 전쟁 때 파릇파릇한 17세의 나이로 학도병 명목으로 참전했던 분이다. 그 당시 제주도는 4· 3 사태 같은 비극도 있고 해서 "난 빨갱이가 아니요" 누명 벗기 차원에서 해병대 같은 데에 자진입대한 사람들이 많았다고 한다. 2차 세계 대전 때 일본계 미국인들이 애국심을 입증하기 위해 미군에 특별히 자진입대 많이 했듯이 말이다. (진주만 폭격으로 인해 미국 내에서 '쪽발이'에 대한 인식이 최악 막장으로 치달았었기 때문)

그런데 문제는 저분은 할아버지가 아니라 할머니라는 점이다. 난 지금까지 이 점에 대해서 한 번도 진지하게 생각해 본 적이 없었다. 여자라고 해서 부사관급 이상의 간부로 입대한 게 아니고, 군 병원이나 군수공장에서 일한 것도 아니다. 미인계 차원에서 특별히 양성되어 몰래 침투된 스파이냐 하면 그것도 전혀 아니다. 여느 남자 학도병들과 마찬가지로 기초 군사훈련만 받고 나서는.. 정확한 병과는 모르겠지만 어쨌든 말단의 병 신분으로 투입되었던 것이다.

알고 보니 우리나라는 총질까지 하는 여자 전투병이 모병 형태로나마 1970년대까지 있었다고 한다. 여군 훈련병만 입소하는 전용 훈련소도 있었다니, 여성 삼청교육대만큼이나 놀랍기 그지없다. 이스라엘군만 그랬던 게 아니구나!
단지, 전쟁이 끝나면서 국가가 존망의 위기에 몰렸던 시기도 끝나자 거기엔 아무도 안 가서 관련 규정은 유명무실한 사문으로 전락했다.

솔직히 여자가 병으로 입대하는 건 국가가 아닌 개인 당사자의 입장에서 봐도 아무 메리트가 없었다. 우리나라가 왕창 못살던 시절엔 당장 남자 장교들도 봉급이 쥐꼬리 수준이었다고 한다. 고학력자 고급 인력이 워낙 부족했던 관계로 진급 적체야 지금보다 덜했을지 모르지만, 그게 딱히 고소득과 우월한 복리후생으로 이어진 건 아니었으니 별 의미가 없었다.

그러니 하물며..;; 강제 징집 대상도 아닌 여자사람이 최말단의 병으로 가서 고생해 봐야 돈을 많이 모으겠나, 경력 커리어를 쌓겠나 도대체 뭐..?? 시골 깡촌에서 집이 찢어지게 가난하고 식구가 10명이 넘게 있어서 입을 하나라도 줄여야 되는데, 배운 것 할 줄 아는 건 없지만 군대에 가면 최소한 공짜로 먹고 자면서 시간을 벌 수 있다.. 이 정도 막장 상황이 아니고서야 여자사람이 병으로 입대해야 할 이유와 동기는 하등 없었다.
결국 1974년 1월 1일부터 군인사법의 개정으로 인해 여군은 간부만 모집하게 바뀌어서 오늘날에 이르렀다.

4. 6· 25의 여파로 남조선이 바뀐 것들

  • 개전 초기에 삽질했던 것에 대한 트라우마가 정말 강하게 남았다. 우리나라 수뇌부는 북괴의 추가적인 전쟁 도발을 억제하기 위해서는 군대의 덩치를 쪽수로 키워야겠다는 생각을 하게 되었다. 결국 우리나라는 상시(평시에도) 징병제가 시작되어 오늘에 이르고 있다. 건국과 창군 직후 처음부터 이랬던 게 아니다.
  • 신 성모 같은 민간 출신 X맨이 너무 병신짓을 하면서 안 좋은 선례를 남기는 바람에 우리나라에 국방부 장관에 문민통제 같은 건 정서상 물 건너 갔다. 참모총장이 전역식 하고 나서 1시간 뒤에 곧장 국방부 장관으로 취임하는 일이 벌어질 정도이니 이건 사실상 무늬만 민간인일 뿐이다.
  • 장교(육군 기준)는 누구든지 반드시 야전 통솔 능력이 있어야겠다는 교훈을 받아, 출신과 병과를 불문하고 임관 직후에 소대장은 거의 무조건 일정 기간 하게 됐다.

5. 1. 21의 여파로 바뀐 것들

6· 25 이후로 이것에 준하거나 심지어 이를 능가할 정도로 남조선에 강렬한 트라우마를 남긴 사건은 바로 1968년의 1· 21 사태임. 순진한 건지 거 참 "내레 박 정희 목(혹은 멱?) 따러 왔수다"라는 인터뷰 내용은 그야말로 광역 어그로를 끌었다.

  • 5분 대기조, 향토예비군
  • 군사와 직접적인 관계가 있는 건 아니지만, 주민등록번호 도입
  • 우리도 무작정 주석궁 침투와 김 일성 암살을 목표로 북파공작원을 양성함. (훗날 실미도 사건)
  • 군 복무 기간이 2년 반에서 단축될 예정이었는데 그 계획 완전 나가리 남. 병은 육해공 공통 3년으로 우리나라 역사상 역대 최장 기간으로 늘었으며, 그게 무려 1984년까지 이어졌다. 울 아버지 세대가 이때 왕창 피 봤다.
  • 교련 왕창 강화. 학교까지 반쯤 "때려잡자 공산당" 병영화
  • 북악· 북한산 일대의 주요 등산로와 도로는 완전 통제 봉인 (21세기가 돼서야 해금)

물론 이런 살벌한 반공 분위기는 아무 근거 없이 조성된 건 아니었다. 1969년 한 해 동안만 해도 울진· 삼척 무장공비에, YS-11기 납북 등 북괴의 대남 도발이 장난이 아니었기 때문이다. 그로부터 몇 년 뒤엔 땅굴도 발견됐고. 그러니 경각심이 최고조에 달할 수밖에 없었다.

6. 박 정희

앞에서 잠시 언급했듯, 우리나라가 옛날에는 직업 군인이라고 해서 딱히 풍족하게 산 게 아니었다. 오죽했으면 그 당시 박 정희도 생계를 위해 무려 중령 계급으로도 몰래 투잡을 뛰어야 했을 정도이며, 장인인 육 영수의 부친은 영예로운 군인은 개뿔, 돈 못 버는 무능한 사위를 굉장히 싫어했다고 한다. (신부 쪽 집안이 당대로서는 꽤 잘사는 집안이었음)

박 정희의 장인은 1960년대 중반, 임종을 얼마 안 남기고서야 자기가 큰 인물을 지금까지 못 알아봤다고 사위에게 사과를 했다고 한다. 그때는 이미 사위가 혁명인지 쿠데타인지 어쨌든 나라를 통째로 뒤집어엎고 대통령이 된 뒤였으니...;;;; 박 정희는 일제 강점기 때 교사 하던 시절에 자기를 무시하던 일본인들에게도 나중에 '긴 칼 차고' 돌아와서 설욕하기도 했다. 정말 출세욕 야망이 있고, 뭔가 남에게서 무시당한 걸 되갚는 걸 잘한 듯하다.

육 영수 여사는 이름부터가 좀 남자 같고(=_=;) 키도 굉장히 커서 남편보다 더 컸다. 결혼식 때 주례가 "신랑 육 영수 군과 신부 박 정희 양"이라고 충~분히 실수할 만했으며, 게다가 저건 실화다.
기가 왕창 셌을 것 같고 부부싸움을 하면 진짜 '육박전'이 벌어졌을 법도 해 보이지만, 이분은 남편 내조를 잘 했고 인품이 매우 훌륭했다. 역대 대통령의 영부인들 중에서는 제일 많은 존경과 추앙을 받고 있다. 다른 영부인도 아니고 하필 이런 분이 테러리스트의 흉탄에 맞아 비명에 간 것은 대통령 개인에게나 국가적으로나 큰 불행이었다.

7. 야전군 편제 개편

군대 조직의 단위라는 건 분대부터 시작해서 소대, 중대, 대대, 연대로 쭉 올라가서 나중에는 사단, 군단, 야전군, 집단군으로까지 마치 셸 정렬의 묶음 단위처럼 규모가 커진다.
우리나라는 한동안 육군의 야전군 편제가 전방(제1)과 후방(제2)이라는 둘로만 나눠져 있었다. 그러던 것이 1973년에는 전방이 서부 경기도 전선과 동부 강원도 전선으로 나뉘어서 그 중 서부 전선을 담당하는 제3야전군 사령부가 창설되었다. 포스타 대장이 맡는 보직이 하나 더 생겼다.

그로부터 거의 30년 뒤인 2007년엔 후방을 담당하는 제2야전군 사령부가 경영 효율 명목으로 '제2작전 사령부'로 격이 미묘하게 낮아졌다. 마치 화투에서 삼광이 비삼광으로 바뀐 듯한 느낌이다.
그리고 앞으로 10여 년 뒤 근미래 계획으로는 제1야전군과 제3야전군이 '지상작전사령부'라는 이름으로 다시 통합될 예정이라 한다. 역사는 돌고 도는지 1973년 이전 체제로 다시 회귀하는 듯.

뭐, 저출산과 전문화 기계화 때문에 군의 규모 자체는 앞으로 계속 작아질 수밖에 없긴 하다. 무인운전과 기계화 전자화 때문에 철도나 항공 쪽도 기관사 조종사 채용이 계속 줄듯이 말이다.
앞서 언급한 것처럼 우리나라는 6· 25 트라우마 때문에 애시당초 몸집만 의도적으로 너무 부풀리기도 했었다. 그런데 징병제를 시행하니 옛날에는 징집 대상 인원이 군 TO를 능가하기도 했을 정도였기 때문에 병역 면제 조건도 지금보다 훨씬 더 널널했으며, 잉여 인원을 처리하기 위해 방위병 같은 것(오늘날 공익, 사회 복부 요원의 전신)도 있었다.

그나저나 사관학교도 3군 통합하고 임관식도 3군 연합으로 하겠다는 말은 한 10여 년 전부터 나돌았는데 그건 각 군 분위기 텃새 때문에 실현될 기미가 안 보인다. 그렇다고 우리나라 3군의 상호 관계가 과거 일본군 육군 해군 급의 개막장인 것 역시 물론 아니니..

8. 계급 체계

국군 창군 당시에는 계급 체계도 지금과는 많이 달랐다.
앞에서 6· 25 전쟁 얘기를 했는데, 그 시절에는 짬밥이 주먹밥으로 나왔었고 계급 체계도 지금과 같지 않았다. 병과 부사관의 계급 구분이 지금만치 분명하지 않았으며 병 신분의 계급은 사실상 두 종류밖에 없었다(하사, 이등중사?).

그러다가 상병· 병장 계급은 1962년에야 추가로 생겼다. 그러니 나중에 노 무현 대통령이 당시 월남전 때문에 진급 TO가 부족해서 병장이 아닌 상병 제대를 했네 하는 이야기의 배경이 성립하는 것이다.

지금이 군 복무 3년씩 하던 시절도 아닌데, 개인적으로는 병의 계급 수가 복무 기간 대비 너무 많다고 느껴진다. 병장 빼고 3계급 정도로만 바꿔도 되지 않을까?
그 반면, 부사관은 복무 기간 대비 계급 수가 부족한 감이 있다. 대부분이 중사이고 상사 약간이다. 하사는 너무 금방 끝나고 원사와 준위는 여전히 너무 적다. 현사인지 영사인지 추진하려다 파토 난 거 알고는 있지만, 거기야말로 계급이 하나 좀 더 있어도 되지 않을까 싶다.

9. 군인의 간지, 군인에 대한 예우

군인이라면 굳이 사관 생도가 아니라 최말단의 이등병 쫄병이라 해도 최소한의 '가오'와 체통· 위신이 요구되는 게 있다.
일례로, 군인은 상급자에게라도 넙죽 고개를 숙이지 않아야 한댄다. 이런 이유 때문에 군인은 민간인 스타일의 평범한 인사 대신에 그냥 손 끝을 이마로 가져가는 거수경례를 한다. 군인이 전투모 벗고 고개를 숙이는 건 아예 전사해 버린 전우 앞에서 슬픔을 표할 때에나 하며, 이것도 공적인 자리에서는 그냥 경례로 대체된다.

또한 극형을 당할 만한 범죄를 저질렀을 때에도 여느 민간인은 교수형을 당하지만, 군인에게는 동급의 전쟁 무기를 동원한 총살형이 쓰인다. 심지어 과거에 일본과 나치 독일의 2차 세계 대전 전범들 중에도 어차피 자기를 사형에 처할 거면 군인답게(?) 총살형을 내려 달라고 요구하는 경우가 있었다. 괜히 별 쓰잘데기없는 사소한 디테일에서 명예니 체통이니 따진다는 생각도 든다만, 이런 차이도 아무 이유 없이 존재하지는 않는 듯하다.

잠시 소재를 바꿔서, 태평양 건너 저 멀리 있는 미국, '아메리카', 일명 천조국이라는 나라를 생각해 보자.
참 대단한 게 많은 부러운 나라이다. 세계 최강의 과학 기술 강국· 군사 강국· 선진국에 땅 넓고 자원도 풍부하고, 무려 3억이 넘는 인구를 가졌으면서 국민 대부분이 집 있고 차 있고 총 가진 중산층이다. 이런 특이한 나라는 세계에서 미국이 유일하다.
세계 최초의 마천루 대도시를 이미 1900년대 초에 이뤘고 마이카 시대 같은 건 우리나라로 치면 일제 강점기 때 이미 시작됐다.

어떻게 지구상에 이런 나라가 존재 가능했을까? 기본이 잘 돼 있다.
얘들은 거짓말· 위증, 학문 부정행위에 자비심이 없다.
그리고 강력한 문민통제가 정착한 한편으로 군인에게는 그야말로 최고의 예우를 하고 있다. 그 사례는 인터넷 검색 조금만 하면 줄줄이 쏟아져 나오니 굳이 여기서 또 소개하지 않겠다. 이런 게 미국의 저력이 아닌가 싶다.
돈이 많아서 저렇게 할 수 있는 게 아니라, 마인드가 저러니까 그 시너지가 축적되어 저런 부자 나라가 된 거라고 봐야 하지 않겠는가?

또한, 우리나라는 겨우 이 좁아 터진 한국 땅에서 같은 민족끼리도 갈라져서 싸우느라 정신 없었는데 쟤들은 2차 세계 대전, 한국 전쟁, 베트남 전쟁, 이라크 전쟁..;; 미군은 그야말로 세계 각국에서 싸우기 때문에 국가 유공자라는 마인드에 담긴 심상부터가 domestic이 아닌 international이다. 뺑이 치는 쫄병 '군바리' 아니면 군사정권 이런 거나 떠오르는 우리나라와는 심상이 달라도 너무 다르다.

뭐, 미국 칭찬하면서 글을 시작했지만, 궁극적으로는 제복 입고 근무하는 사람들, 근무 중에 긴급피난이 허용되지 않는 직업에 종사하는 사람들, (경찰, 군인, 소방관, 선장· 승무원)
예비군 훈련 따로 없이 전쟁 중에도 자기 직업이 그대로 유지되는 사람들의 고마움을 다시 생각하게 된다. 나는 그런 것과는 완전 상극인 직종에 종사하고 있기 때문이다.

Posted by 사무엘

2017/02/21 08:31 2017/02/21 08:31
, , , , ,
Response
No Trackback , 2 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1329

란체스터의 법칙

A와 B라는 두 집단이 서로 패싸움을 시작했다. A는 전투원이 5명이고 B는 4명이다. 그런데 양 진영의 모든 전투원들은 체력· 정신력· 무장 등등이 완전히 동일하며, 기습 가능성이라든가 지형적인 유불리, 엄폐물 같은 것도 없이 탁 트인 개활지에서 순수하게 힘과 힘만이 충돌하는 형태로 싸우게 됐다고 치자. 싸움은 둘 중 한 진영의 전투원들이 몽땅 죽거나 중상을 입어서 전투력을 상실할 때까지 계속된다. 그렇다면 이 싸움의 결과는 어찌 될까?

마오 쩌둥이던가 스탈린이던가.. 인권 쌈싸먹은 독재자답게 "전쟁 나서 1억 인구가 죽는 것쯤은 별 일 아니다. 사람이야 또 낳으면 되니까. 적군이 병력이 1억이면 우리는 1억에다 한 명만 더 붙여서 이기면 된다" 그런 요지의 무지막지한 말을 한 적이 있었다. 정확하게 누가 언제 한 말인지 출처 확인이 잘 안 되네, 분명 본 기억은 있는데..

그런데 저건 병신 같지만 묘하게 설득력이 있는 말이다. 외적인 요인이 차이가 전혀 없고 완전히 동일하다면 상식적으로 생각했을 때 쪽수가 한 명이라도 더 많은 집단이 필승하고 부족한 집단은 필패할 것이다.
위의 경우라면 B가 지고 A가 이기는 것 자체는 따 놓은 당상이다. 단지 문제는 A가 B를 얼마나 너끈히 이기느냐, 어느 정도의 피해를 입고 승리하느냐로 귀착된다.

그 답은 A와 B가 어떤 방식으로 싸우느냐에 따라 달라진다.
조폭들 패싸움처럼 기껏해야 일대일로 근접해서 냉병기를 사용하는 싸움이라든가, 총이라 해도 18세기 전열보병 전술처럼 비현실적일 정도로 너무 신사적으로 일대일 턴제로 싸우는 거라면 말 그대로 일대일로 상쇄하고 남은 병력만이 생존자가 된다. B는 전멸이요, A는 A-B에 해당하는 인원이 남는다. 고로 5:4의 싸움이라면 한 명만 남는 거다. 이것을 일명 란체스터 제1법칙이라고 한다.

그러나 점 vs 점이 아니라 면 vs 면 단위로 실시간으로 부딪치는 현실의 전투에서는 다구리가 더 대규모로 가능하며 병력의 작은 차이가 훨씬 더 큰 차이를 야기한다. 설정상 한 집단의 전투력은 병력에 비례해서 나오게 돼 있는데 그 전투력 자체가 병력의 손실로 인해서 차츰 감소한다. 두 변수가 같이 변화하면서 비선형적인 구도를 만든다는 뜻이다. 그래서 처음부터 병력과 전투력이 열세였던 집단은 그 감소폭이 더욱 커지면서 전멸에 이르지만, 우세 집단이 받는 대미지는 시간이 흐를수록 더욱 작아진다. 전투력도 부익부 빈익빈으로 치닫는다!

그래서 답부터 말하자면, 이런 현실의 싸움에서 A와 B가 붙으면 B가 전멸한 뒤 A는 한 명만 남는 게 아니라 이론적으로 3명이나 생존해 있게 된다. B는 자기 진영 4명이 전멸하는 동안 A를 2명밖에 못 죽인다는 것이다. 공식으로 표현하면 단순한 A-B가 아니라 sqrt(A^2 - B^2)이다.
마치 직각삼각형 세 변의 길이와 같은 구도가 된다. 그렇다면 5명 vs 4명이 아니라 13명 vs 12명이 붙으면, 12명 팀은 전멸하고 13명 팀은 8명만 죽어서 5명이 남는다.

이것은 란체스터 제2법칙이라고 명명되어 있다. 영국의 항공 공학 엔지니어가 1차 세계 대전의 양상에서 착안하여 고안했다.
스타크 같은 전략 시뮬 게임에서 드라군, 마린, 히드라 같은 원거리 공격 유닛들을 서로 마주보게 해서 어택 땅으로 싸움을 붙여 보면 이 법칙이 의외로 굉장히 잘 적중한다고 한다. 란체스터의 법칙에 대해 소개해 놓은 타 블로그 글들을 검색해 보면 전략 시뮬 게임으로 실험을 해 봤는데 높은 적중률을 보고 놀랐다는 말이 많이 나온다. 1억 명에다가 딱 한 명만 더 보태서 이기면 된다는 말이 그저 허세만은 아닌 셈이다.

란체스터 제2법칙이 어째서 성립하는지를 엄밀하게 논하려면 삼라만상의 변화량을 기술하는 끝판왕 도구인 미분방정식을 동원해야 한다.
시각 t에 대해서 A 진영의 병력을 나타내는 함수 f(t), B 진영의 병력을 나타내는 함수 g(t)를 정의하자.
위의 예에서는 전투 전의 초기 상태 t=0에 대해 f(0)=5, g(0)=4가 될 것이다. 뭐, 일반화해서 f(0)=a, g(0)=b라고 잡아도 된다.

전투의 진행으로 인해 f(t), g(t) 모두 병력이 감소할 것이다. 그런데 그 감소하는 변화량이 바로 상대방 함수의 함수값과 같다. d f(t) / dt = -g(t) 요, d g(t) / dt = -f(t)라는 뜻이다.
그렇다면 이 f와 g는 도대체 어떻게 생겨먹은 함수일까? 0보다 큰 t에 대해서 g(t)=0이 되고(B 진영의 전멸) 그 정의상 동시에 f'(t)=0도 되는 지점이 있을 것이다. 그 t가 얼마인지는 중요하지 않겠지만, 이때 f(t)의 값을 a와 b에 대해서 구하면 란체스터 제2법칙을 유도할 수 있을 것이다.

f의 도함수가 -g이고 g의 도함수가 또 -f라니.. 일단 얘는 미분을 짝수 번 반복하면 도함수가 자기 자신으로 돌아오는 뭔가 골때리는 함수 형태가 될 듯하다. 즉, 4배수 주기로 제자리로 돌아오는 삼각함수보다는.. cosh, sinh 같은 쌍곡선함수 형태가 될 것 같다. 걔들은 미분을 하면 cosh, sinh, cosh ... 이렇게 반복되는데, 문제의 저 함수는 f, -g, f, ... 이렇게 반복된다.

그래서 답을 구해 보면.. a>b여서 f가 더 우세한 진영을 나타낸다는 걸 염두에 뒀을 때
2*f(x) = (a+b)/e^x + (a-b)*e^x 요, 2*g(x) = (a+b)/e^x - (a-b)*e^x 가 된다. (2를 곱한 게 저런 것이므로 전체를 2로 나눠 줄 것)
e^x와 e^x의 역수를 절반씩 적절히 더하거나 빼는 cosh / sinh 함수를 상수배/평행이동만 한 형태인 걸 알 수 있다. f는 cosh에 대응하고 g는 그냥 sinh가 아니라 -sinh가 된다.

cosh는 현수선을 나타내는 함수이기도 하다. 그 말인즉슨 A와 B가 싸울 때 A의 피해 양상은 빨랫줄이나 쇠사슬이 아래로 축 늘어진 것과 비슷한 양상으로 스무스하게 감소할 거라는 뜻이다. 실제로 그런지 확인해 보자.


사용자 삽입 이미지

사용자 삽입 이미지
바로 이것이 5명과 4명, 또는 엄밀히 말해 5:4 비율의 병력이 맞붙었을 때 란체스터 제2법칙에 따라 예상되는 병력의 변화 양상이다!
g(x)=0이 되는 시점은 x= ln( (a+b)/(a-b) )/2 가 되며, (a=5, b=4일 때는 저 값은 대략 1.1)
이때 f(x)를 구해 보면 (a+b)/sqrt( (a+b)/(a-b) )가 나오고 식을 정리하면 진짜로 sqrt(a^2 - b^2)가 나온다.
임계점 이후부터는 g는 음수가 나오고 f는 감소가 아니라 오히려 증가하기 시작하지만, 이건 현실에서는 아무 의미 없는 추세일 테니 제끼면 된다.

더 직관적인 비유로 설명하자면.. 5:4가 붙어서 곧이곧대로 1명만 남는 싸움, 즉 란체스터 제1법칙은 y=1이라는 상수 그래프를 떠올리면 된다. 여기서 x가 4부터 0까지 가는(B진영) 동일 면적(= 정적분)을 5에서부터(A진영) 시작한다면 1에 도달한다.

그러나 란체스터 제2법칙은 y=1이 아니라 y=x라는 가변적인 그래프에 대응한다. 여기서 x가 4부터 0까지 가는 B진영의 면적 8(밑변과 높이가 모두 4인 삼각형)을 5에서부터 시작한다면.. 1이 아니라 3에서 멈추게 된다. 윗변 3, 아랫변 5, 높이 2인 사다리꼴의 넓이가 8이 되니까 말이다.
이를 일반화하면, 0부터 B까지 y=x를 정적분한 값은 sqrt(A^2-B^2)에서부터 A까지 정적분한 값과 같다. 이렇게 이해해도 된다.

전쟁이라는 건 여기저기 가성비를 따지면서 지킬 것과 버릴 것을 가리고 작전을 잘 짜야 이길 수 있다. 즉, 경제· 경영과도 밀접한 관계가 있다. 그렇기 때문에 오늘날 란체스터의 법칙은 군사학보다는 경제학 쪽에서도 기초 이론으로 더 중요하게 다뤄진다. 포병 장교에다 수학 박사 출신인 지 만원 박사 같은 분이 아마 이런 분야의 최고 전문가가 아닐까 싶다.
이 법칙은 스플래시 데미지나 사이오닉 스톰-_- 같은 변수가 있지 않은 한, 왜 일반적으로는 "뭉치면 살고 흩어지면 죽는다"가 성립하는지를 무식하게 시행착오 겪을 필요 없이 수식만으로도 잘 설명해 준다. 5:4로만 붙여도 저 그래프와 같은 처참한 결과가 나오지 않던가?

더 나아가서 어지간히 절체절명의 위급한 상황이 아닌 이상, 스타에서 유닛이 생성되는 족족 적진으로 찔끔찔끔 축차투입을 해서는 절대 안 되며 캐리어 같은 유닛도 반드시 일정 기수 이상 모아야 제 성능이 발휘된다는 것을 보여준다.
또한 전쟁이 나면 전투 직전에야 양 진영이 모두 사기 진작이 매우 중요하기 때문에 "마지막 하나까지 결사항전" 운운하지만.. 대세를 도저히 뒤집을 수 없을 정도로 승부가 너무 기울고 100% 개죽음밖에 선택의 여지가 없을 때는 불가피하게 꼬리 내리고 항복도 하는 것이다.

이상. 란체스터 법칙 하나 갖고 미분방정식에, 쌍곡선함수에 별 얘기가 다 나왔다.
다만, 현실의 전장에서는 수학 숫자놀음 나부랭이보다 예측할 수 없는 외부 변수가 훨씬 더 많이 존재하기 때문에 란체스터 법칙이 절대적인 만능 장땡인 건 아니다. 겉으로 드러나는 병력 열세를 극복하고 B가 A를 이긴 사례도 역사엔 얼마든지 존재한다는 것도 생각할 필요가 있다.
그러니 성경에서 하나님께서 기드온에게 병사 수를 32000명에서 거의 1% 수준인 300명으로 일부러 줄여 버리고도 오히려 전투를 승리로 이끄신 것이 대단한 이야기인 것이다(삿 7). 진짜 300의 원조는 무슨 영화에 나오는 스파르타 군대가 아니라 저 군대였던 셈이다.

Posted by 사무엘

2017/02/18 08:32 2017/02/18 08:32
, ,
Response
No Trackback , 2 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1328

0. 들어가는 말

<날개셋> 한글 입력기와 타자연습이 개발 17년째에도 변함없이 온갖 새로운 기능들로 무장하여 새 버전이 나왔다. 4개월 동안 정말 많은 기능들이 추가되고 개선되었다. 지금까지 올라온 개발 근황글 시리즈만 봐도 이번 버전은 뭔가 심상찮다는 것을 알 수 있을 것이다.

정상적인 개발 사이클이라면 지금보다 더 전에 새 버전이 나오고도 남았을 텐데 이번 버전만 이례적으로 중간 개발 근황글이 많아진 이유는..
8.8의 개발 완료 조건은 따로 있었는데 그게 너무 어려워서 오랫동안 충족되지 못하는 동안, 다른 분야에서 새 기능들이 잔뜩 추가되고 개선 사항이 생겼기 때문이다.

그것들이 새 버전 형태로 석방(release)되지 못한 채 장기간 갇혀 있었다. 지금 새 기능 리스트를 다시 읽어 보면 나로서는 "아니 이건 언젯적 작업 내역인데 8.6에서는 아직 반영이 안 된 상태였구나. 내 프로그램 사용자들은 작년 10월 이후로 시간이 정지해 있었구나!" 싶은 것들이 많다. 그걸 이제야 훌훌 털어내고 밖으로 내보내게 되어 참 기쁘다.

이 글에서는 이번 8.8 버전에서 궁극적으로 추가하려고 했고 시간적으로 제일 마지막에 구현된 '복합 낱자 입력 로직 생성기'에 대해서 소개하도록 하겠다. 이것은 <날개셋> 한글 입력기가 제공하는 '빠른설정' 중의 하나이다.

1. 빠른설정

빠른설정이란 어떤 입력 항목에 대해서 사용자가 선택한 옵션대로 입력 스키마와 문자 생성기를 곧바로 세팅 해 주는 보조 GUI의 총칭이다. 지금 이미 지정돼 있는 입력 설정을 보완· 변경할 수도 있고, 그건 싹 무시하고 완전히 새로운 입력 설정으로 덮어쓸 수도 있다.

요런 개념과 기능은 먼 옛날, <날개셋> 한글 입력기 3.0에서 처음으로 도입됐다. 그리고 역사상 최초로 도입된 빠른설정은 '기본 글자판 설정'이었다. 두벌식, 세벌식, 쿼티, 드보락처럼 사용자가 가장 자주 사용하는 한글과 영문 글자판을 묻지도 따지지도 않고 곧바로 맞춰 주는 중요한 역할을 한다. 한글의 경우 옛한글 사용 여부, bksp의 동작 단위 같은 옵션을 받기도 한다.

그러다 지난 2006년, 3.9 버전에서 빠른설정이 3개가 더 추가되어 4개가 되었으며, 빠른설정은 이렇게 4개가 거의 10여 년 동안 변경 없이 그대로 유지돼 왔다.
먼저, 한글 로마자 입력기. 얘는 기반 영문 글쇠배열(쿼티 or 드보락)과 로마자-한글 매핑 방법 같은 몇 가지 옵션을 받아서 로마자 입력 방식을 설정해 준다. 한글 로마자 입력 방식이라는 건 딱 한 가지만 존재하는 게 아니라 어떤 공통된 사상, 이념, 컨셉에 속하는 다양한 입력 방식들을 찍어 내는 '메타 입력 방식'에 가깝다. 그러니 이런 건 '빠른설정'이 커버하기에 적합하다.

한글 로마자 입력기는 한국어· 한글을 배우는 외국인에게 매우 유용하다. 그래서 <날개셋> 한글 입력기의 영문 페이지는 프로그램의 모든 기능을 영어로 소개하지는 못하는 대신, 입력 설정을 로마자 입력 방식으로 바꾸는 방법만을 간단히 안내해 놓았다.

나머지 빠른설정은 주어진 세벌식 글쇠배열을 표준 두벌식 배열과 합성해 주는 '복벌식 빠른설정', 그리고 한 글쇠에서 초성과 종성이 아니라 중성과 종성을 수식으로 구분해서 합성한 '신세벌식 빠른설정'이 있다. 이들 역시 두벌식과 세벌식을 절충하는 훌륭한 메타 입력 방식이므로 빠른설정 형태로 구현했다.
전자는 타자가 처음에 왼손으로 시작됐으면 두벌식, 오른손으로 시작됐으면 세벌식으로 인식해 준다. 후자는 도깨비불 현상이 없으면서 4단도 사용하지 않는 입력 방식이라는 의의가 있다.

'기본 글자판'과 '한글 로마자 입력기'는 완전히 새로운 입력 환경을 맞춰 주는 빠른설정이지만 복벌식과 신세벌식 빠른설정은 기존 입력 설정에다가 변형을 가하는 형태로 동작한다.
그러다가 제5의 빠른설정인 '복합 낱자 입력 로직 생성기'가 거의 10년 만에 또 추가되었다. 얘 역시 기존 입력 설정을 변형하는 형태로 동작한다. 단, 글쇠배열 같은 입력 스키마 설정은 직접 건드리지 않으며, 문자 생성기 계층의 설정을 건드린다. 뭐, 글쇠배열을 직접 고치지는 않더라도, 필요한 경우 요런 글쇠를 사용자가 직접 배당해서 쓰라고 안내를 해 주긴 한다.

이 로직 생성기는 단순한 편의 기능 이상으로 <날개셋> 한글 입력기의 아주 중요한 핵심 기능이다. 이거 하나만 코드의 양이 2천 줄을 넘어가며, 기존 4개 빠른설정들의 코드를 다 합한 것보다도 분량이 2배 이상 많다.

2. 본 기능 소개

복합 낱자 입력 로직 생성기가 하는 주된 일은.. 초중종성의 낱자 결합 규칙을 편의상 '대결합'과 '소결합'으로 또 나눠서 대결합을 소결합 노가다만으로 몽땅 자동 생성해 주는 것이다.

좀 formal하게 표현하자면, 기존 설정(소결합)과 우리 빠른설정 자체의 설정(대결합) 사이의 cartesian product를 구한다.
그리고 이와 연동해서 같이 움직이는 가상 낱자, 특수 도깨비불, 심지어 한글 치환 규칙을 다 자동으로 맞춰 주며, 대결합과 소결합 사이에 논리적으로 충돌이 있는 것도 감지해서 보여주고 회피해 준다.

PC용 한글 입력 방식이라면 낱자 결합 규칙을 굳이 대결합과 소결합으로 나눌 필요가 없다. 하지만 글쇠 수가 왕창 적은 모바일에서 옛한글 같은 복잡한 한글 입력 방식을 구현한다고 생각하면 저런 추가적인 추상화가 반드시 필요하다.

ㅎ 같은 기본 자모를 "ㅇ+가획"(나랏글) 내지 "ㅅ+ㅅ"(천지인)의 합성으로 입력하는 건 소결합이다. 그러나 ㄴ+ㅎ으로 ㄶ을 입력하고 ㄹ+ㅎ으로 ㅀ을 입력하는 건 대결합이며 어느 입력 방식이든 동일하다. 그러면 이 로직 생성기는 소결합과 대결합을 토대로 ㄶ과 ㅀ을 입력할 때 필요한 중간 상태인 ㄴㅇ, ㄹㅇ도 날개셋의 기존 기능으로 다 표현해 준다는 것이다.

이런 예가 옛한글로 가면 얼마나 많겠는가? 게다가 두벌식의 경우는 한 낱자를 다 입력한 뒤에도 아직 안심할 수 있는 상황이 아니다. 나랏글 기준으로 ㄽ이라는 겹받침을 입력한 뒤에도 ㄹㅈ, ㄹㅉ, ㄹㅊ 같은 임시 낱자를 고려해 줘야 ㄹ 다음에 ㅈ 계열 자음들을 연속 입력을 할 수 있다.

요런 식의 자동화를 종성에 한해서 찔끔 간단하게 구현해 준 것이 바로 6.x 버전 시절에서 추가된 '초-종성 공용 낱자 결합'이었다. 하지만 임시 낱자들의 처리는 여전히 사용자가 해야 하고 한계가 많았다. 그러다가 복합 낱자 입력 로직 생성기가 추가됨으로써 <날개셋> 한글 입력기는 한글 엔지니어링의 영역을 한 단계 넓혔다.

3. 예제

사용자 삽입 이미지

위의 그림은 천지인 입력 방식을 설정한 뒤, 대결합과 소결합 사이의 관계 분석을 통해 종성-초성 사이에 연속 입력이 안 되는 pair들을 프로그램이 찾아 준 것이다. 천지인은 모든 종성에 대해서 연속 입력이 안 되는 초성이 적어도 하나 이상 존재한다. 그 반면, Google 단모음 입력기라면 ㄱ, ㅅ뿐만 아니라 쌍자음이 존재하는 ㄺ, ㄽ, ㅄ 같은 일부 자음만이 이런 조건에 걸린다.

'글자판 입력을 문자열로' 텍스트 필터에는 사용자가 입력한 문자열에 대해서 연속 입력 가능 여부를 판별하는 기능이 있는데, 이 빠른설정은 아예 구조적으로 연속 입력이 불가능한 모든 경우의 수를 찾아 준다는 차이가 있다.

사용자 삽입 이미지

천지인과는 달리 나랏글은 구조적인 모호성이 없기 때문에 로직 생성 결과가 깔끔하다. 나랏글은 소결합을 담당하는 글쇠(가획, 쌍자음)와 대결합을 만드는 타 한글 자모 글쇠가 완전히 분리되어 있기 때문이다. 다만, 생성되는 임시 낱자 수는 나랏글이 천지인보다 더 많다.

중성을 보면 나랏글에서 ㅝ를 입력하기 위해 중간에 거치는 ㅜ+ㅏ를 이 프로그램이 자동으로 처리해 줬다는 말이 뜬다. 사용자가 일일이 대결합에 등록하지 않았더라도 말이다. 그리고 이 경우, ㅜ+ㅏ까지만 입력해도 화면에는 절차를 단축해서 자동으로 ㅝ를 띄워 준다. (대결합의 마지막 단계가 확정되어 다른 선택의 여지가 없을 때)
또한 중성에는 쌍자음(501) 글쇠가 결합용으로 전혀 쓰이지 않았다는 것도 알려 준다.

사용자 삽입 이미지

이건 좀 더 엄청난 장면이다. 천지인의 모음 입력 방식을 옛한글에다가도 적용했을 때 입력 순서가 동일해져서 충돌이 발생하는 쌍을 모두 찾은 것이다. 천지인의 경우 음절 경계에만 모호성이 있는 게 아니라 한 성분 내부에서도 ㅡㆍㆍㅡ를 ㅝ(2:2)로 보느냐 ㆌ (3:1)로 보느냐 같은 문제가 존재하기 때문이다. 단, 이건 세벌식이라도 구조적으로 얼마든지 존재할 수 있는 모호성이다.

인위적인 모호성 보정이 없다면 이 프로그램은 언제나 대결합보다 소결합을 우선시하기 때문에 2:2(ㅝ)가 아닌 3:1(ㆌ)이 채택된다. 이때 모호성은 2가지 방법 중 하나로 회피할 수 있는데, (1) 먼저 사전 구분이다. 2타까지 치고 'ㅜ+보정'을 누르면 이 ㅜ는 ㅠ로 넘어가는 ㅜ가 아니라 ㅜ+ㆍ, ㅜ+ㅓ 등 대결합 경계가 바뀌는 임시 낱자 ㅜ로 바뀐다. 즉, 임시 낱자도 입력을 위한 것과 모호성 보정을 위한 것 두 종류로 나뉜다.

(2) 그리고 사후 변환을 할 수 있다. 이미 ㅠ 또는 ㆌ가 된 상태에서 이 변환을 누르면 ㅜㆍ 또는 ㅝ를 왔다갔다 할 수 있다.
이 프로그램은 입력 순서가 동일한 낱자들에 대해 일정 시점에서 구분자를 넣어서 상태를 분기하는 것을 일종의 binary tree 형태로 표현해서 관리하는데, 사전 구분은 그렇게 가지를 뻗는 것이고 사후 변환은 자신의 가장 가까운 sibling을 왔다갔다 하는 것으로 정의한다.

(1) 또는 (2), 그리고 (1)과 (2)를 모두 사용하는 것도 가능하다. 이 프로그램은 마치 나랏글의 가획/쌍자음처럼 저런 사전/사후 보정용 낱자를 초중종성 공용으로 하나 설정한 뒤, 수식을 생성해서 사용자에게 다음과 같이 안내도 해 준다.

입력 중에 낱자 결합 모호성을 해소하려면 다음 수식을 글쇠배열에 배당하여 사용하십시오.
- 사전 구분:
  F ? H2|0x25800000000 : E ? H2|0x2580000 : D ? H2|0x258 : 0
- 사후 변환:
  F ? H2|0x25900000000 : E ? H2|0x2590000 : D ? H2|0x259 : 0


또한 사후에라도 대결합 적용 방식이 바뀌는 것조차 처리해 준다. 현대 한글에서는 굳이 저렇게 보정을 하지 않아도 ㅠ 다음에 ㅣ가 입력됐을 때 ㅝ로 바로 넘어가게 할 수 있다. ㆌ가 쓰이지 않으므로 모호성이 없기 때문이다.
옛한글의 경우 위의 스크린샷에서 보다시피 소결합 단독으로 처리되던 ㅖ에서 옛한글 ㅕㅑ로 자동으로 넘어가는 것, ㅜㅡ에서 ㅡㅗ로 자동으로 넘어가는 것 등 그런 예가 더 많다.

한글 입력 방식의 고안자는 소결합 수준에서 기본 한글 자모를 입력하는 방법만 생각하면 된다. 이로부터 복합 자모를 입력하고 오류를 찾는 온갖 복잡한 노가다는 이제 컴퓨터 프로그램이 알아서 해 준다!

비록 한글 타자는 마치 알파벳 풀어쓰기처럼 sequential하게 이뤄지지만 한글은 구조적으로 ㄱㄱ과 ㄲ이 동일하지 않고 초성 ㄱ과 종성 ㄱ이 같지 않은 문자이다. 자체적으로 낱자 경계가 있고 음절 경계가 있는데 이것 구분을 한글 입력 오토마타가 implicit하게 자동 처리하게 된다. 이와 관련해서 생각할 수 있는 거의 모든 자동화 절차를 이 빠른설정이 담당해 준다.

작년에 본인이 부산 학회에 가서 발표한 논문(한글 및 한국어 정보 처리 학술대회)이 바로 이런 시스템의 구현에 관한 것이었다. 본인은 박사 졸업 이수요건 충족을 위해 중간에 이렇게 한글 자체에 지극히 특화된 연구를 해서 논문을 투고하고 발표하게 된 것에 자부심을 느낀다.

4. 옵션 대화상자

'복합 낱자 입력 로직 생성기'는 이례적으로 마치 설치 프로그램처럼 단계가 휙휙 진행되는 마법사 형태로 UI가 구현되었다. 1단계는 대결합을 지정하는 단계이며, 마지막 3단계는 지금까지 봐 온 결과 로그 화면이다.
운영체제가 제공하는 마법사 UI는 대화상자의 크기 조절을 지원하지 않기 때문에 마법사 UI를 불가피하게 자체 구현했다. 로그가 분량이 상당할 수도 있기 때문에 크기 조절 기능이 없으면 안 된다. 그리고 마법사 UI는 자체 구현하는 것도 그리 어려운 일은 아니니..

사용자 삽입 이미지

그리고 위의 그림은 바로 중간의 2단계인 옵션 지정 화면이다. 복합 낱자 입력 로직과 관련하여 이 옵션들을 생각해 내고 구현하는 게 지금까지 정말 머리 쥐어 뜯도록 힘든 일이었고, 개념을 도움말에다 설명하는 것도 어려웠다. 내가 누구만치만 머리가 빨리빨리 잘 돌아가기만 했어도..;; 단지 나보다 똑똑한 사람들은 이런 프로그램을 만들 생각 자체를 안 하겠지..

'글쇠배열 종류'를 두벌식이 아닌 세벌식으로 지정하면 음절 경계 체크라든가, ㅂㅉ, ㅂㅊ처럼 종성 연속 입력을 위한 임시 낱자 생성이 생략된다. 세벌식에서는 그런 걸 고려할 필요가 없으니까.

그리고 '옛한글 자모 사용' 옵션을 '끄면', ㄸㅃㅉ 같은 건 종성에 등장이 허용되지 않고 자동으로 다음 글자 초성으로 넘어간다. 이런 지저분 자질구레한 처리까지 가상 낱자와 한글 출력 치환을 이용해서 이 빠른설정이 알아서 다 세팅해 준다.
옛한글을 사용하더라도 정치· 치두음 같은 건 어차피 초성 전용이니 그런 게 종성에 등장하지 않게 처리된다.

'미리 분리' 옵션은 "(갇) ↔ (가ㄸ)" 왕복을 하느냐 "(갇) → 가(ㄸ) ↔ 가(ㄷ)" 왕복을 하느냐 차이를 결정한다. 이런 자음들을 그냥 다음 글자로 보내 버리면 종성에 생성되는 임시 낱자의 개수가 상당수 줄어든다. 세벌식에서는 초성 전용 자음을 처리할 때를 빼고는 이런 옵션이 필요하지 않다.

또한 세벌식에서는 아까 나랏글 중성 ㅜㅏ → ㅝ 단축처럼 종성도 ㄴㅇ까지만 입력하더라도 ㄶ으로 자동으로 단축이 가능하다. 단지 두벌식에서는 허용되지 않을 뿐이다. 진짜 받침 ㄴ + 초성 ㅇ을 의도한 것일 수도 있기 때문이다. 이런 세밀한 처리까지 다 고려해서 동작한다.

로직을 생성해 보니 결합 모호성이 존재하는데도 '모호성 해소 방식' 두 옵션 중 적어도 하나 이상이 선택돼 있지 않으면 일부 낱자는 모호성 때문에 입력할 수 없을 거라고 경고문이 끝에 나온다.
단, "짧은 소결합으로 연장 결합 지원" 옵션을 켜면 일부 낱자는 입력 가능해질 수도 있다. 아까 ㅠ에서 ㅝ로 자동으로 넘어가는 것처럼 말이다.

옵션들에 대한 더 자세한 설명은 대화상자에서 F1을 누르면 볼 수 있다.
8.8의 다음 버전은 올해 6월쯤에 나올 9.0 정도로 잡고 있다. 9.0에서는 이 빠른설정에 '허용 한글 범위' 제한 기능과 연계하는 새로운 기능이 더 추가될 예정이다.

* 마지막 썰: 프로그램 관련 문의는 둘 중 한 곳으로

'복합 낱자 입력 로직 생성기'는 이번 버전의 워낙 독보적인 끝판왕이다 보니 이거 하나만 간략하게만 소개했는데도 글 분량이 벌써 이만치가 됐다. -_-;;
기능 자랑은 이 정도로 하고, 이제 프로그램 관련 공익 광고(?)를 덧붙이며 글을 맺고자 한다.
본인은 여건상 개발자와 사용자 사이의 소통을 위해서 딱히 <날개셋> 한글 입력기 공식 게시판이나 카페 같은 걸 운영하고 있지는 않다. 프로그램 관련 문의는

  1. 공개적으로 하려면 프로그램의 다운로드 페이지에 있는 페이스북 플러그 인
  2. 비공개로 몰래 하려면 본인의 개인 메일(gmail)

둘 중 한 곳으로 하는 것을 가장 권장한다.

블로그에 올라오는 날개셋 한글 입력기 새 버전 공지글의 댓글로는 가능한 한 새 버전에 대한 의견만을 가장 권장한다. 하지만 이전 버전부터 보편적으로 있던 기능에 대한 문의가 올라오는 걸 명시적으로 금지할 것도 없기 때문에 받아들일 뿐이다.

다음으로 블로그 방명록이 있다. 여기도 프로그램 문의 게시판은 아니다. 그렇기 때문에 거기엔 내 블로그 방문 소감이나 안부 인사만 권하지 프로그램 문의는 원하지 않는다. 뭐, 문의글이라고 해서 무슨 스팸 광고글 쓰레기는 아니니, 게시판의 원래 성격에 맞지 않은 글이라고 해서 내가 매정하게 무시 또는 삭제한다거나 하지는 않는다. 답변을 하긴 하지만 그래도 원래 취지와 권고 사항은 저렇다는 거다.

페이스북 플러그 인을 열면서 동시에 내 페이스북 계정도 노출되었는데.. 요 몇 년 간 지켜보니 페이스북 쪽지로 프로그램 문의를 하는 분도 있었다. 하지만 쪽지로는 보내지 마시기 바란다.
페친이 아닌 모르는 사람이 보낸 쪽지는 페이스북이 알림창으로 안내를 하지 않기 때문이다. 그래서 쪽지가 왔다는 것을 내가 즉시 알아채기가 거의 불가능하다. 거의 몇 달 뒤에야 뒤늦게 발견해서 답변을 허겁지겁 했거나 아니면 그 사이에 질문자가 계정을 삭제하여 답변을 못 하게 된 일이 몇 번 있었다.

아무튼, 이 점을 염두에 두고 프로그램 관련 문의는 페이스북 플러그 인 또는 메일 중 한 곳을 이용해서 하셨으면 한다.

Posted by 사무엘

2017/02/15 08:28 2017/02/15 08:28
Response
No Trackback , 17 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1327

서울의 중부에서 동쪽 북부까지 늘어선 산들을 살펴보면 북악산 - 북한산 - 도봉산의 순이다. 지금으로부터 1~2년 전쯤만 해도 본인은 북악산과 북한산의 차이도 몰랐는데 등산 많이 하면서 서울 지리 지식이 참 많이 늘었다. 북한산과 도봉산의 사이에 있는 것이 '우이령 고갯길'이며 본인은 거기도 갔다 와 봤다.

북한산은 서울 주변의 여러 산들과 비교했을 때 워낙 거대하고 등산로가 많은 산이다. 그래서 이번에는 지난번에 갔던 정릉-백운대-우이동보다 더 서쪽으로 가서 형제봉· 문수봉 일대를 오른 뒤, 평창· 구기동 일대로 하산하는 경로를 짜서 북한산을 올랐다.

본인은 예전에 북악산을 북동쪽으로 종단해서 국민 대학교 방면으로 하산한 적이 있었다. 계속해서 북한산을 오르는 등산로가 근처에 존재한다는 것까지는 그 당시 확인했지만, 시간과 체력 문제 때문에 더 진행하지 않고 귀가했었다.
그때 더 가지 못했던 길을 이제야 다시 찾아가서 개척하게 됐다. 지하철 길음 역에서 내려서 버스를 타고 국민 대학교로 러쉬를 갔다.

사용자 삽입 이미지

국민대가 대중적으로는 홍대만큼이나 미대가 유명한 걸로 본인은 알고 있다. 뭐, 주변에 애들 놀 곳이 차고 넘치는 홍대에 비해, 북악산과 북한산 사이의 산기슭에 자리잡은 국민대는 위치와 분위기 차이가 많이 나긴 한다. 국민대는 놀기 좋은 위치가 아니라 등산 가기 참 좋은 위치에 있다.

그리고 본인 개인에게 국민대의 인지도는 강 승식 교수가 대부분을 차지한다고 해도 과언이 아니다. 한국어 형태소 분석기를 연구· 개발하고 있는 컴퓨터공학과 교수여서 말이다. 아, 그렇다고 개인적으로 만나 보고 아는 사이는 아님.
2010년대부터는 U-tagger라는 걸출한 작품 때문에 울산대가 국어 정보처리 경진대회에서 상을 연달아 휩쓸기도 하면서 이 바닥의 막강한 경쟁자로 등극해 있긴 하다. 거기는 주 개발자인 박사 출신 학생은 들어 봤지만 교수님은 누군지 잘 모르겠다.

이런 잡생각을 하다가 다시 본론으로 돌아온다. 국민대 정문을 지나서 더 북쪽으로 가면 사진과 같은 터널이 보이며, 사진 기준 오른쪽에 공터와 함께 등산로가 나온다.

사용자 삽입 이미지

예전에도 몇 차례 언급했듯, 북한산은 평범한 산이 아니라 국립공원이다. 그래서 입구에 이런 간단한 초소가 있고 밤에 '통금'도 존재한다. 하지만 저 초소는 안이 잠겨 있고 근무자는 없었다.

국민대 근처에 있는 등산로 출입구의 명칭은 '북악공원 지킴터'이다. 여느 등산로 입구처럼 '탐방 지원 센터'라는 이름이 붙어 있지는 않다. 아마 '탐방 지원 센터'보다는 더 간소화된(?) 시설이 아닌가 싶다.
그리고 바로 옆에 대학교가 있다 보니..;; 네임드급 산의 등산로 출입구라고 해서 식당과 등산용품 매점이 즐비하다거나 하지는 않은 것도 이색적이었다.

아, 등산 당시의 개인 근황과 관련된 중요한 사실을 지금까지 얘기를 안 했구나.
본인은 지금까지 거의 모든 등산을 꼭두새벽이나 그에 준하는 매우 이른 아침에 해 왔다. 조금이라도 더위를 피하기 위해서다.
하지만 이 등산은 점심 시간이 지난 오후 2시 무렵에 시작했다. 그 이유는 이 등산은 평범한 정규 스케줄에 근거해서 진행한 게 아니었기 때문이다.

하루는 4년 반이 넘게 아무 탈 없이 잘 썼던 맥북이 아무 징후도 없다가 하드디스크 케이블의 노후화로 인한 인식 + 부팅 불가라는 중대한 기능 고장을 최초로 일으켰다. 교체 부품을 주문해서 받아야 하기 때문에 당일 즉시 수리는 안 되었으며, 컴을 얄짤없이 며칠 맡겨야 했다.
당연한 말이지만 애플 공인 서비스센터는 무슨 삼성이나 LG전자 서비스센터처럼 곳곳에 많이 있지 않다. 회사와 가까운 분당 소재의 센터들은 아이폰만 취급하지 컴퓨터의 수리는 되지 않아서 서울 센터들밖에 선택의 여지가 없었다.

이제 며칠간 날개셋 코딩은 어차피 못 할 텐데, 맥북 없이 할 수 있는 다른 일들을 그 동안 몰아서 미리 처리하는 쪽으로 개인 스케줄을 재조정했다. 그래서 오전에 서비스센터를 들렀던 당일의 오후에 등산을 급히 가게 된 것이다. 본인은 노트북 PC의 고장에 대비해서 이런 식으로 시간 손실을 최소화하는 Plan B 전략을 보유하고 있다.

또한 이 날은 낮 기온도 10도가 안 될 정도로 매우 추웠던 덕분에 한낮에도 무더위 걱정 없이 높은 산의 등산이 가능했다. 단지, 낮이 매우 짧아져 있어서 등산 시간에 제약이 심했던 게 아쉽다. 오후 2시도 정말 아슬아슬했다.

사용자 삽입 이미지

'북악공원 지킴터'의 등산로는 이런 모양으로 시작되었다. 오르막이 계속됐다. 시기가 시기이다 보니 마지막으로 등산을 갔을 때보다 단풍은 더욱 진행돼 있었다.
나중에 갈림길이 몇 번 나왔는데, 길을 잘못 들어서 북악산이나 정릉 탐방 지원 센터 방면으로 빠지지 않게 주의했다. 나의 목표는 '형제봉 + 대성문'이었다. 그러기 위해서는 초기에는 심곡사· 영불사라는 절을 찾아가면 됐다.

사용자 삽입 이미지

국립공원 특유의 울타리 쳐진 흙길과 문명화(?)의 흔적은 영불사까지가 끝이었다. 그 뒤부터는 여느 산처럼 숲이 우거지고 비좁고 가파른 산길 산행이 시작됐다. 해발 287m에, 대성문까지 약 2.5km가 남았다는 이정표를 지난 지 얼마 안 됐다.

여기서 능선에 도달할 때까지는 별다른 볼거리가 없었다. 전망대나 계곡이나 특이한 자연· 인공물 같은 거 없고, 묵묵히 산을 오르는 것 말고는 할 게 없었다. 중간에 형제봉에 근접했으며 거기로 가는 갈림길도 있었지만 본인이 못 보고 그냥 지나친 것 같다.

사용자 삽입 이미지사용자 삽입 이미지

드디어 일말의 전망대 비슷한 바위가 나왔다. 여기서는 전망이 훤히 다 보였다.

사용자 삽입 이미지

그리고 다시 울타리 쳐진 흙길이 나왔다. 여기는 벤치 하나 없고 전망대가 있는 것도 아닌데 공간이 굉장히 넓다.

사용자 삽입 이미지사용자 삽입 이미지

한참을 더 올라간 뒤에야.. 드디어 첫 목적지인 북한산성 대성문에 잘 도달했다.
예전에 정릉에서 북한산을 올랐을 때는 보국문에 도달한 뒤 동쪽의 대동문 쪽으로 갔다. 이번에는 보국문의 서쪽인 대성문에 도달한 뒤, 또 서쪽의 대남문으로 갔다. 여기 고도는 이미 620m쯤 된다.

사용자 삽입 이미지

보국-대동과는 달리 대성-대남은 거리가 무척 짧은 편이다. 사진에서 보는 것처럼 잠시 하강만 하면 곧 대남문이며, 성곽 전방의 저 봉우리는 그 이름도 유명한 문수봉 정상이다.
허나, 등산을 너무 늦게 시작했다는 시간상의 한계(이미 오후 3시가 다 돼 감), 그리고 어차피 성곽을 따라 그대로 오르지도 못한다는 이유(안전상의 문제로 우회 등산로 이용) 때문에 본인은 문수봉은 가지 않았다. 그냥 이 사진만으로 만족한 뒤, 대남문에서 하산을 선택했다. 결과적으로는 그게 바람직한 선택이었다.

사용자 삽입 이미지사용자 삽입 이미지

여기가 대남문이다. 벌써부터 태양의 고도가 극도로 낮아지는(= 날이 저묾) 게 티가 난다. 이러면 찍은 사진의 색감과 명도· 채도도 별로 안 좋고 특히 역광은 감당할 수가 없어서 풍경 사진 남기는 데는 큰 악재가 된다.

사용자 삽입 이미지

대남문에서 구기동 방면으로 하산을 시작했다. 저기까지도 대략 2.5km 정도라고 한다. 처음에는 통나무 계단이 있었지만 그게 끝난 뒤부터는 흙길이 아니라 돌길이 굉장히 길게 지겹도록 이어졌다.

사용자 삽입 이미지사용자 삽입 이미지

돌길은 언제부턴가 계곡으로 바뀌었다(구기 계곡). 산 중턱에는 계곡을 건너는 다리도 몇 개 있었지만 물은 바짝 말랐거나 고인 웅덩이 형태로만 있었다. 하지만 아래로 계속 내려가자 그래도 나름 흐르는 맑은 물이 몇 군데 있었다.
해수욕장뿐만 아니라 이런 계곡에서 물놀이 하는 것도 좋다. 물론 국립공원들은 계곡이 죄다 민간인 출입 금지이기 때문에 저것들은 그림의 떡일 뿐이다.

추워서 콧물이 나고 손이 시려운 지경인데도 본인은 물놀이 생각을 하면서 산을 내려갔다. 몸은 별로 안 추운데 손가락 같은 말단은 어쩔 수 없이 추위의 영향을 받고 있었다.

사용자 삽입 이미지사용자 삽입 이미지

구기 탐방 지원 센터를 지나서 드디어 하산을 마쳤다. 서울 종로구 산기슭 그린벨트 지대에 이렇게 땅밟기를 하게 됐다. 여기엔 정치인들이 많이 산다는데...

버스가 다닐 정도의 큰길에 도달하니 '현대'라는 이름이 붙은 아파트도 아니고 3층짜리 벽돌 빌라가 있었다. 이건 물론 고도 제한 때문에 건물을 저렇게 지은 것이지 싶다.
지도를 보니 지금까지 말로만 듣던 '이북 5도청'이 여기서 불과 몇백 m, 버스 한두 정거장 남짓한 그리 멀지 않은 거리에 있었다. 그러나 5km가 넘는 산길을 다니고 와서 다리에 근육통을 호소하는 상태에서 선뜻 걸어서 갈 수 있는 거리는 아니었다. 또한 여기저기 돌아다니면서 풍경 사진을 찍기에는 이미 날이 많이 춥고 어두워져 있었다.

결국 선택의 여지가 없이 귀가했다. 이북 5도청을 일부러 안 찾아가고 하산길에 자연스럽게 구경하려면 구기보다 더 서쪽의 비봉 탐방 지원 센터 방면으로 하산했어야 했다.
그러고 보니 여기는 구기 터널과도 꽤 가까이 있었다. 거기를 지나면 이미 지하철 3호선과 6호선이 나오는 은평구가 나온다.

이북 5도청을 구경하지는 못했지만 그 대신 지금까지 말로만 듣던 한국 고전 번역원은 버스 차창 밖으로 잠시 구경했다. 조선 왕조 실록은 전산화와 번역이 완료됐지만 그보다 분량이 더 방대하고 디테일한 승정원 일기는 여전히 완역이 요원한 상태라고 한다.
한편, 북한산은 비록 서울 북부의 확장을 가로막는 지형 장애물이긴 하지만, 역설적으로 그 덕분에 나름 군사· 안보상의 의미를 지니고 있고 또 시민들에게 굉장히 좋은 휴식처 역할도 한다는 게 느껴졌다.

북악산, 인왕산, 남산 (, 그리고 낙산)에 있던 성곽은 한양도성이다. 그러나 북한산에 있는 성곽은 북한산성이며 성남 쪽의 산엔 잘 알다시피 남한산성도 있다.
남한산성 일대는 6· 25 때 부산이 그랬고 고려 시대 때 강화도가 그랬던 것처럼 유사시에 임시 수도 역할을 할 수 있게 행궁이 있다. 저긴 워낙 천혜의 요새이기 때문에... 실제로 병자호란이 치러졌으며 지금은 도로가 닦여서 안에 자동차가 들어갈 수 있고 심지어 마을버스까지 다닌다.

그 반면 북한산성은 발로 힘들게 등산을 하지 않으면 접근할 방법이 없으며, 군사 목적으로 건축했음에도 불구하고 이후에 여기서 전쟁을 치른 내력이 없다.
그러니 북한산성은 접근성이 좋은 한양도성과, 역사 내력과 유적이 풍부한 남한산성에 밀려서 상대적으로 존재감이 없는 것 같다. 남한산성과 비교했을 때 마치 북극과 남극, 그리고 지구형 행성과 가스형 행성의 차이를 보는 것 같다.

또한, 남한산성은 거기 유적지 일대만 도립공원인 반면, 북한산성은 그냥 산 전체가 통째로 국립공원이니 격이 차이가 있다. 뭐, 유적지 때문이 아니라 자연 환경 때문에 그렇게 된 것이긴 하지만 말이다.

Posted by 사무엘

2017/02/12 08:36 2017/02/12 08:36
, ,
Response
No Trackback , 4 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1326

다음 버전 개발 근황 3

<날개셋> 한글 입력기의 다음 버전 8.8은 이례적으로 개발 근황글만 무려 3차분까지 올라오게 됐다.
개발 완료 조건은 "원래 생각하고 있던 굉장히 어려운 기능을 다 구현하는 것"인데.. 원래 목표는 달성되지 못한 상태에서 온갖 자잘한 다른 개발 작업만 애드립으로 엄청나게 쌓이고 쌓였기 때문이다.
이것만 감안해도 8.8을 넘어 8.85나 8.9로 가야 하지 않나 고민될 지경이 됐다.

※ 외부 모듈 분야

1. "조합을 자체 처리하는 프로그램에서만 동작" 옵션

<날개셋> 한글 입력기가 외부 모듈이 개발된 이래로 왜 이런 걸 지금까지 생각 못 했을까 싶은 기능이 사용자의 기능 제안 메일과 갑자기 떠오른 아이디어, 발상의 전환을 토대로 하나 추가되었다.
외부 모듈 제어판의 "시스템 계층 - 고급 시스템 옵션" 탭에 있는 "조합을 자체 처리하는 프로그램에서만 동작" 옵션이다.

IME들은 글쇠 입력을 가로채서 한글 같은 조합을 생성 후, 그 결과를 응용 프로그램으로 보낸다. 워드 프로세서나 에디트 컨트롤은 텍스트 입력을 전문적으로 처리하는 프로그램이니, IME가 보낸 문자열을 즉각 본문에다 삽입하여 화면에 직접 표시한다. 그러나 그런 처리를 하지 않는 프로그램에서는 운영체제 또는 IME가 자체적으로 자그마한 창을 꺼내서 조합 중인 문자열을 표시해 준다.

기술적으로 이런 동작의 차이를 IME-awareness라고 표현한다.
그런데 IME가 자체적인 조합 창을 꺼내야 하는(IME-aware하지 않음) 프로그램이라면 십중팔구 한글을 입력할 일이 없고 한글 모드가 존재할 필요가 없는 상황이다. 문자 입력을 받는 상황이 아니며, 각각의 알파벳 글쇠들이 어떤 기능을 수행하는 단축글쇠인 경우가 대부분이다.

저 옵션이 켜져 있으면.. 먼저 조합을 보내 봤는데 프로그램이 조합 문자열을 제대로 표시하지 않고 IME로 되돌려보내는 경우, 조합을 없애고 원래 글쇠를 응용 프로그램으로 다시 보내 준다~!
가령, 그래픽 툴의 경우 B는 브러시, F는 채우기, X는 텍스트, S는 영역 선택인데, 한글 모드라 하더라도 해당 글쇠를 누르면 쓸데없이 ㄹ, ㄴ 같은 조합 창이 생기는 게 아니라 기능 모드가 바뀐다. 그러면서 텍스트 입력은 곧장 한글 모드로 할 수 있게 된다.

물론, 아주 옛날에 만들어져서 국제화 관념 따위 없고 유니코드조차 지원하지 않을 정도인 구닥다리 외국산 프로그램 중에는 무려 텍스트를 입력받는데도 IME-aware하지 않은 경우가 있다. 옛날에 Visual C++ 6의 IDE조차 그러했다. 그런 프로그램에서 한글을 입력하려면 저 옵션을 켜서는 안 된다. 그러나 저 옵션은 요즘 같은 시대엔 거의 모든 상황에서 사용자의 번거로움을 해소해 주는 매우 편리한 기능이 될 것이다.

그리고 반가운 소식이 이것만 있는 게 아니다.
저렇게 조합이 도로 튕겨서 돌아오는지 감시하기 위해서는 약간의 성능 부하가 필요한데, 이걸 해결하는 과정에서 Google Chrome + 하드웨어 가속에서 조합 덧나는 문제도 같이 해결하게 되었다. 외부에 의해서 조합이 강제 중단되는 상황을 감지하는 방법을 추가적으로 알아냈기 때문이다.

물론, 마소 IME가 날개셋과 동일한 방법을 써서 해결한 것 같지는 않기 때문에 이 역시 완전히 근본적이고 원초적인 문제 해결이라고 여기기는 어렵다. 하지만 "조합을 자체 처리하는..." 옵션을 켜면 일단 Google Chrome 문제도 덤으로 해결되긴 한다는 것을 밝힌다.
이렇듯, '고급 시스템 옵션'에는 구현체들 중 오직 외부 모듈에만 적용되는 온갖 기상천외한 옵션들이 들어있다.

2. 긴 조합이 튕기는 문제 자체 보정

TSF B급 프로그램에서 2글자 이상 길이의 조합을 시작했을 때 조합이 끊기는 골치 아픈 문제 말이다.
단순히 이런 문제가 존재한다고 알려 주기만 하고 "운영체제의 이상한 동작이어서 더 어쩔 수 없음. 사용자가 알아서 조심하시고 조합 시작은 언제나 1글자 단위로 시작하게 노력해 보세요"라고 대응하고 끝내던 것이 이번 버전에서 개선되었다.

처음에 2글자 이상 조합을 덥석 만드는 것만이 문제이지, 처음엔 가상의 1글자 조합을 만든 뒤에 곧바로 원래 길이의 긴 조합으로 대체하는 것은 괜찮다는 특성을 이용하여 내부적으로 일종의 회피, 보정 옵션을 구현했기 때문이다.
이제 두벌식 옛한글 입력기에서 '한' 다음에 곧바로 '하 + ㄴ아래아' 같은 글자를 도깨비불 현상으로 만드는 것도 아무 걱정 없이 할 수 있게 됐다.
비록 조합 중인 문자 자체는 한 글자밖에 안 보이고 그거 제어하는 건 애초에 IME의 영역도 아니기 때문에 어쩔 수 없지만, 최소한 조합이 끊어지고 엉뚱한 동작을 하는 문제는 사라졌다.

세상에 이런 간단한 아이디어를 구현할 생각을 왜 지금까지 안 하고 있었나 모르겠다.
사용자가 굳이 이 옵션을 켜지 않더라도 조합이 끊어졌다 싶으면 프로그램이 알아서 이 옵션을 켜며, 켰다는 사실을 사용자에게 알려 준다.

혹시나 해서 다시 말하는데, 이렇게 2글자 이상의 조합 시작을 막는 건 Windows 운영체제가 거의 일부러 저러는 것이다.
한글 IME는 전통적으로 중국어· 일본어 IME와는 달리, 조합 문자열을 밑줄 대신 깜빡이는 네모 cursor로 표시하는 등 내부적으로 처리가 다르게 돼 왔다. 자체 한글을 구현한 도스용 프로그램들의 관행을 마소에서 벤치마킹 해서 현지화에 반영한 것이다.

그런데 그 대신 한글 IME는 중국어· 일본어 IME와는 달리 조합은 언제나 딱 한 글자 단위로만 만들 거라는 assumption도 들어가게 되었고 그게 한동안은 별 문제가 없다가 유니코드 시대에 옛한글을 구현할 때가 되자 문제가 된 것이다. 옛한글은 내부적으로 여러 개의 글자로 구성되니까.
조합이 한 글자뿐이라는 전제조건이 만족되지 않을 경우 제대로 동작하지 않는 프로그램이 있어서 호환성+방어 차원에서 운영체제가 저런 동작을 하는 것이지 싶다.

3. 한영 상태 동기화 기능의 알고리즘 개선

Windows에서 IME는 dll인 관계로 프로그램들(정확히는 스레드)별로 내부 한영 상태가 다~ 따로 노는 형태이다. 그래서 지난 7.7 버전에서 <날개셋> 한글 입력기의 인스턴스들 간에 사용 중인 입력 설정을 한데 동기화해 주는 옵션이 추가되었다. 한 프로그램에서 ‘세벌식 최종’을 선택하면 다른 프로그램에 가도 세벌식 최종이 자동으로 지정되는 식이다. 그 기능이 이번 8.8 버전에서는 동작이 더 개선되었다. 예전에 별 생각 없이, 혹은 시간이 부족해서 대충 구현했던 기능들을 엄밀하게 다듬었다.

첫째, 이미 실행된 프로그램을 전환할 때뿐만 아니라 갓 새로 실행된 프로그램에 대해서도 아까 전까지 설정되어 있는 글자판을 곧장 따라가게 했다. 이 기능은 지금까지 저게 지원되지 않아서 사실상 반쪽짜리 기능에 불과했다. 새로 실행된 프로그램은 기존 설정을 무시할 뿐만 아니라 자기 설정을 덮어쓰기까지 하기 때문에 동기화 상태를 망가뜨리곤 했다.

둘째, 제어판을 ‘확인’을 눌러서 종료해서 설정을 파일로 저장하고 공통 설정을 확인하는 인스턴스들에 대해서만 글자판이 동기화되고, ‘미저장 확인’을 눌러서 자기 혼자만 독자적인 입력 설정을 쓰는 인스턴스에 대해서는 글자판이 동기화되지 않게 했다. 공통 설정을 쓰는 곳에서 글자판을 바꾼 것이 거기로 가지 않을 뿐만 아니라, 저렇게 고립된 곳에서 글자판을 바꾼 것이 밖으로 나가지도 않는다. 이건 프로그램의 논리 구조상 진작에 당연히 취했어야 할 조치이다.

하지만 어느 곳에서든 제어판을 ‘확인’을 눌러서 종료하고 나면 지금까지 고립되어 있던 인스턴스들까지도 전부 입력 설정들이 한데 동기화된다. 이 논리를 이 기회에 완전히 정립했다.
이거 뭐 양파도 아니고, 2017년이 다 되도록 <날개셋> 한글 입력기는 까도 까도 개선할 게 계속 나와서 내가 심히 힘들다. ㅠ.ㅠ 처음부터 이렇게 엄밀하게 만들어 놓으면 좋았을 것을.

※ 제어판 분야

4. 빠른설정과 유형 파일(*.ist) 열기 기능에 Ctrl+클릭 '복사' 추가

<날개셋> 한글 입력기의 제어판에는 빠른설정이라는 게 있어서 특정 입력 항목(입력 스키마+문자 생성기)에 대해 특정 입력 설정을 곧바로 맞추거나 변형하는 기능이 있다. 다시 말해, 이건 현재 선택돼 있는 입력 항목을 변형해서 A로부터 A'를 만드는 기능이다. 뭐, A를 전혀 참조하지 않고 완전히 새로운 B로 바꾸는 것도 가능하다.

그런데, 빠른설정이 제공하는 대화상자를 Ctrl을 누른 채 '확인'을 눌러서 닫으면..
A로부터 A'를 만들되 기존 A는 그대로 두고 A'를 뒤에다 새로 추가하도록, 다시 말해 새로운 입력 항목을 생성하는 동작을 추가했다.
그러니 '기본 글자판 설정'으로부터 세벌식, 두벌식, 쿼티, 드보락 등등을 계속 추가해 넣고 싶으면 매번 번거롭게 '복사본 생성'을 누를 필요 없이 저 빠른설정을 계속 띄워서 확인 버튼을 Ctrl+클릭만 하면 된다.

ist 파일을 여는 기능도 마찬가지다. 그냥 열면 지금 선택된 입력 항목이 파일의 내용으로 바뀌지만, Ctrl+클릭을 하면 파일로부터 생성된 항목이 지금 항목의 뒤에 추가된다. '복사본 생성' 말고도 새 입력 항목을 간편하게 생성하는 방법이 더 생겼다.

자그마한 개선 사항이지만 넣고 보니 굉장히 편하다.
문자표, 낱자 결합 규칙, 사용자 정의 후보 등에 겉으로 티는 안 나지만 Ctrl+클릭 기능이 지금까지 은근히 많이 들어갔다.
버튼에다 자그맣게 * 표시라도 넣든지 해서 일반 클릭과 차이점이 있다는 시각적인 피드백이 있으면 좋겠는데 아직 그것까지는 신경 쓰지 못했다.

5. 입력 항목의 예전 설정 가져오기 기능 개선

지난 7.7버전부터는 제어판의 어떤 입력 항목에 대해서 스키마나 문자 생성기를 변경(기본 ↔ 고급 사이)한 뒤에도 이전의 입력 설정을 최대한 가져와서 유지시키는 기능이 추가되었다. 하지만 이건 지금까지 미세한 버그가 있었다.
한 입력 항목 A에서 입력 스키마를 먼저 변경한 뒤, 다른 입력 항목 B에서 문자 생성기만 변경하고서 '예전 설정 가져오기'를 시키면..
B가 문자 생성기만 예전 것으로 동기화되는 게 아니라 입력 스키마까지 엉뚱한 A의 것으로 바뀌곤 했다. 이 버그를 고쳤다.

한 입력 항목에서 스키마나 문자 생성기를 변경한 것은 일단 내부 버퍼에 저장되며 이건 다른 입력 항목에서 스키마나 문자 생성기를 또 변경하는 순간 정확하게 사라지게 했다. 이건 위에서 열거했던 아이템들보다는 상대적으로 존재감이 덜한 개선 사항이다.

※ 편집기 분야

6. <날개셋> 편집기 창의 이전 위치와 편집 문서 복원은 첫 인스턴스에 한해서만 적용

본인은 평소엔 <날개셋> 편집기에서 '프로그램의 중복 실행 허용' 옵션을 끄고 지낸다. 하지만 편집기는 구닥다리 MDI 프로그램이며, 창 하나만으로는 멀티모니터를 제대로 활용할 수 없다. Visual Studio 201x의 IDE처럼 문서 창을 도구상자의 도킹 기능처럼 프로그램 창 안팎으로 마음대로 붙이고 떼는 기능이 있으면 좋겠지만, 그런 건 내 프로그램의 관심사가 아니다. 그래서 평소에 프로그램의 중복 실행을 허용하는 걸 염두에 두고 편집기의 동작 방식을 살짝 변경했다.

내 프로그램은 기본적으로 예전의 창 위치와 크기를 기억하며, 옵션을 지정할 경우 예전에 편집하던 문서 목록도 기억하고 다음에 다시 불러들여 준다. 그런데 이 기능은 최초로 실행되는 첫 인스턴스일 때만 동작하고, 그렇지 않은 중복 인스턴스일 때는 무시하게 했다. 둘째 이후의 인스턴스에서는 언제나 임의의 위치에 빈 문서창 하나만 달랑 생긴다.

지금까지는 프로그램의 둘째/셋째 인스턴스도 첫 인스턴스와 완전히 동일한 위치에 생기고(첫 인스턴스의 창의 위치와 크기를 일부러 변경하지 않았다면) 문서도 똑같이 다시 로딩되었기 때문에 프로그램이 중복 실행되었다는 것을 알기 어려웠다. 동일 파일을 서로 다른 인스턴스에서 수정하여 수정 내역이 꼬일 위험도 있었다.

그러나 이제는 편집기가 중복 실행되더라도 창이 서로 겹치지 않으며 이미 열어 놓은 문서가 또 열리지는 않는 게 보장되기 때문에 더 부담없이 중복 실행이 가능하다. 이런 간단하고 유용한 조치를 왜 지금까지 취하지 않았었나 자괴감이 들 지경이다.

7. 기존 창의 활성화 방식 개선

사용자가 어떤 대화상자나 창을 열라는 지시를 내렸는데, 이전에 동일한 창을 열어 놓은 게 존재하고 여러 인스턴스를 생성할 필요가 없는 상황이라면 프로그램은 당연히 기존 창을 활성화시켜서 보여준다. 앞의 6번에서처럼 프로그램을 중복 실행하지 않는다거나, 아니면 날개셋 제어판 같은 modeless 대화상자를 열 때 말이다.

그런데, 그 창이 자체적으로 또 modal 대화상자를 열어 놓은 상황이라면 어떨까?
<날개셋> 한글 입력기의 경우 지금까지 이런 경우에 대한 대비가 돼 있지 않았다. (뭐, 입력기라고 썼는데 주 적용 대상은 사실상 편집기밖에 없긴 하다)
그러던 것이 이번 버전에서 드디어 개선됐다. 제어판에서 빠른설정이나 열기 대화상자를 열어 놓은 상태에서 백그라운드로 갔다가 다시 제어판으로 돌아갈 때..

혹은, 편집 화면 설정에서 색상 대화상자를 추가로 열어 놓은 상태에서 본문 편집 화면으로 갔다가 다시 편집 화면 대화상자로 돌아가라는 명령을 내렸을 때.
이제 <날개셋> 편집기는 해당 대화상자에서 제일 겉에 열어 놓은 modal 대화상자로 알아서 복귀한다. 이런 세밀한 UI까지도 싹 개선됐다.

※ 기타

8. 새로운 한글 입력 예제 데이터

비한글뿐만 아니라 한글 분야의 예제 입력 설정 데이터도 보충했다. (1) 먼저, 예전에 코노 노보루(河野 登) 님이 고안하신 "모음 연타 순아래 두벌식"이 참신함이 인정되어 예제로 들어갔다. 초성 쌍자음은 초성 다음에 중성의 2연타로 입력하는 게 매우 기발하다. 중성의 첫 타는 도깨비불 현상을 일으키니 자연스럽게 종성을 초성으로 분리하고, 그 뒤 2타가 초성을 쌍자음으로 바꾸는 것이다.

한 글쇠가 초성과 중성 경계를 오가기 때문에 이런 입력 방식은 내 프로그램에서 타순 분석 같은 게 제대로 안 될 것이다. 그리고 그 특성상 모음은 동일 글쇠 연타로 결합을 할 수 없기 때문에 ㅒㅖ 같은 것은 ㅐㅐ ㅔㅔ 연타가 아니라 반드시 ㅑㅣ/ㅕㅣ로 입력되게 해야 한다. 그래도 이건 Shift를 안 누르면서 딱히 다른 모호성도 없는 두벌식을 만드는 방법 중 하나로 충분히 고려할 만하겠다.

(2) 그 다음으로 타임스페이스 시스템이라는 회사에서 지금으로부터 10몇 년 전에 고안한 '가림토'라는 입력 방식을 예제로 넣었다. 이것은 모음뿐만 아니라 자음에 대해서도 천지인 스타일의 필획 분해를 시도한 것이다. ㄱ은 가로+세로, ㅂ은 세로+세로+가로+가로 같은 식. 모음은 알다시피 ㅡㅣㆍ 세 요소로 분해되는데 자음은 ㅡㅣ 다음으로 ㅅㅇ 이렇게 네 요소로 분해된다.

한글이 꼬부랑 획이 별로 없고 기하학적으로 굉장히 단순하다 보니 이것도 굉장히 참신하긴 하다. 그러나 빨리 치기 좋은 능률적인 입력 방식이라고 볼 수는 없으며 딱히 실용화되지는 못했다. 더구나 자음을 세벌식도 아닌 두벌식으로 만들면 경계의 모호성을 감당할 수가 없게 되며, 실제로 저 방식은 10키 환경 기준으로 ㅇ만 두벌식으로 두고 세벌식으로 만들어졌다. 뭐, 내 예제에서는 어차피 컴퓨터 키보드로 갖고 노는 거니 ㅇ도 초· 종성 구분하여 세벌식으로 집어넣긴 했다만.

얘는 자음의 입력이 처음 시작돼서 아직 가로줄 세로줄 같은 것밖에 없는 초기 상태가 있다. 이런 미완성 낱자는 가상 낱자+낱자 치환을 이용해 표시한다.
또한, 모든 겹모음과 겹받침을 입력 가능한 상태가 아니라 초성과 중성의 기본 낱자만 입력 가능하며, 나머지는 이번 버전에서 들어갈 핵심 중의 핵심 기능인 '복합 낱자 입력 로직 생성기'를 이용해서 합성해서 생성하면 된다. 이런 입력 방식을 분석하면 얼마나 복잡한 규칙이 파생돼 나오고 모호성이 얼마나 발생하는지를 직접 확인할 수 있다.

Posted by 사무엘

2017/02/09 08:37 2017/02/09 08:37
Response
No Trackback , 4 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1325

1. WNDCLASS와 HCURSOR

GUI 환경에서 키보드로 글자 입력을 받기 위해 캐럿(caret, 혹은 cursor)이라는 깜빡이는 세로줄이 나타난다면, 마우스의 입력을 받기 위해서는 마우스 포인터라는 게 떠 있다. 키보드 문자 입력과 마우스는 상호 배타적인 관계이다 보니, 문자 입력이 시작되면 마우스 포인터는 화면을 가리지 말라고 쏙 사라지곤 한다. 그 반면, 키보드 단축키와 마우스는 전혀 배타적이지 않고 상호 보완적이므로 이 경우는 마우스 포인터가 사라질 필요가 없다. 간단히 말해 스타를 하는 경우를 생각하면 된다.

Windows 운영체제 내부에서 생성되는 모든 창(window)들은 마우스 포인터가 자기 영역을 지날 때 어떤 모양의 포인터를 표시할지를 자유롭게 지정할 수 있다. 가장 static하고 간단한 방법으로는 윈도우 클래스를 등록할 때 WNDCLASS의 hCursor 멤버에다가 지정해 주면 된다.

HCURSOR라는 타입은 마우스 포인터의 모양을 나타내는 자료구조의 포인터이다. 마우스 포인터는 아이콘(HICON)과 거의 동급으로 취급되며, 아이콘에다가 중심 위치(hot spot) 정보만이 추가되었을 뿐이다. 화살표 그림의 경우 화살표가 가리키는 뾰족한 지점이 바로 hot spot의 위치가 되는 것이다.

그리고 그 아이콘이라는 것은 개념적으로 AND 연산용 비트맵(마스크)과 XOR 연산용 비트맵(그리기)이 추가된 정사각형 비트맵(HBITMAP) 쌍이다.
마우스 포인터 자체를 프로그램 코드를 통해 동적으로 생성하고자 한다면 이런 관계에 대해서도 이해할 필요가 있다. 이런 구조 덕분에 배경색을 반전시키는 마우스 포인터도 만들 수 있다. 또한, Windows에서 아이콘과 마우스 포인터가 매우 유사하게 취급된다는 것은 GetIconInfo 함수나 ICONINFO 구조체의 스펙을 보면 금방 수긍할 수 있다.

색깔 중에 system color가 있고 DC 오브젝트들(브러시· 펜 따위) 중에도 stock object가 있으며, 클립보드 포맷 중에 표준 포맷(CF_TEXT ...)이 있는 것처럼.. 마우스 포인터 중에도 용도가 고정되었고 운영체제 차원에서 모양을 공통으로 관리하는 것이 몇 종류 있다. 이런 공용 포인터의 예로는 일반 화살표, 모래시계, 입력란용 I-beam 등 우리에게 친숙한 것이 있으며, 이들은 제어판을 통해 그 모양을 바꿀 수 있다. 응용 프로그램에서는 LoadCursor(NULL, IDC_*)를 호출해서 이들의 HCURSOR 값을 얻을 수 있으며 이를 응당 클래스 등록 시에 사용하면 된다.

그래픽 에디터라든가 게임 급으로 정말 아주 튀는 GUI를 제공하는 프로그램을 만드는 게 아니라면, 공용 포인터 말고 다른 독자적인 포인터를 쓸 일은 잘 없을 것이다. 하지만 튀지 않는 일반 업무용 프로그램에서도 custom 포인터가 필요한 경우가 가끔은 있다.

  • 워드 프로세서의 경우, IDC_IBEAM의 변형이 필요할 때가 있다. 이탤릭체 글자에서는 포인터의 모양도 살짝 기울어지며, 세로쓰기 모드에서는 포인터의 모양 역시 90도 돌아간다.
  • drag & drop 상태를 표시하기 위해, 화살표 밑에 사각형 테두리와 [+] 마크가 붙은 포인터가 필요할 때가 있다. 이것도 의외로 공용 포인터에는 존재하지 않으며, ole32.dll 내부에 있는 비공식 리소스를 몰래 뽑아 와서 쓰는 경우가 많다.
  • 먼 옛날, IDC_HAND가 존재하지 않던 Windows 95/NT4에서는 winhlp32.exe의 내부에 있는 손가락 링크 모양 비공식 리소스를 몰래 뽑아 와서 하이퍼링크를 구현할 때 쓰기도 했다.

LoadCursor는 원래 모듈(EXE/DLL)의 리소스로부터 마우스 포인터 그림을 추출하는 함수이다.
CreateCursor 함수는 HBITMAP을 받는 게 아니라 쌩짜 AND/XOR 비트맵 배열만을 입력받아서 포인터를 생성해 주는데, 그 말인즉슨 얘는 애초에 모노크롬 포인터밖에 못 만든다는 뜻이다. 컬러를 지원하지 않는다.

그러고 보니 마우스 포인터는 마치 GIF처럼 애니메이션 가능한 버전도 생겨서 단순 아이콘과 차별화가 이뤄지긴 했다. ico 파일에는 크기와 화질이 다른 여러 아이콘들이 있을 수 있다면, ani에는 동일 아이콘의 여러 프레임이 들어갈 수 있게 된 것이다. 교집합인 정보가 있지만 서로 완전히 호환되지는 않는 미묘한 관계가 됐다.

2. WM_SETCURSOR와 SetCursor 함수

윈도우 클래스를 등록할 때 hCursor 멤버에다가 NULL을 지정하면 그 윈도우는 마우스 포인터가 기본적인 화살표로 지정된다거나, 아니면 말 그대로 아무것도 없는 올투명 이미지가 지정되어서 포인터가 사라진다거나 하지 않는다.
어찌 되는가 하면, 이 윈도우 영역으로 들어오기 직전에 유지되었던 마우스 포인터가 변경 없이 그대로 유지된다..! 마치 C언어에서 초기화되지 않은 변수처럼 undefined 상태가 되는 것이다.

이런 동작을 원하는 프로그래머나 기대하는 사용자는 전무할 것이다. 그러므로 클래스 차원에서 지정된 기본 포인터가 없는 윈도우는 자신의 윈도우 프로시저 내부에서 매번 실시간으로 마우스 포인터를 지정해 줘야 한다. 어떻게? WM_SETCURSOR라는 메시지가 왔을 때 SetCursor라는 함수를 호출해서 하면 된다.
아니 사실은 클래스 포인터가 이미 지정돼 있는 창이라도 필요하다면 이렇게 마우스 포인터를 실행 중에 얼마든지 변경할 수 있다. 동일한 웹브라우저 창이라도 포인터가 링크 위를 가리키고 있을 때는 조건부로 손가락 모양으로 바뀌어야 할 테니까 말이다.

윈도우 안에서 마우스 포인터가 움직이면 WM_MOUSEMOVE만 오는 게 아니라 그 전에 WM_SETCURSOR부터 날아온다. 그에 반해 SetCursor는 굳이 WM_SETCURSOR 메시지 타이밍이 아니어도 아무 때나 언제든지 호출 가능하다. 이 함수 자체는 지금 포인터가 나 자신이(스레드 단위) 생성한 윈도우에만 있으면 위치 불문하고 포인터 모양을 즉시 바꿔 준다. WM_PAINT 타이밍 때에만 사용 가능한 BeginPaint/EndPaint처럼 특정 메시지에 매여 있는 게 아니라는 뜻이다.

그럼 왜 굳이 WM_SETCURSOR라는 메시지가 따로 있는 것일까? 그 이유는 저렇게 일상적으로 마우스 포인터가 움직였을 때 빼고는 얘는 WM_MOUSEMOVE와는 설계 철학과 생성 조건이 매우 다르기 때문이다.

  • 윈도우가 disable됐을 때는 그 윈도우로 마우스가 움직이더라도 통상적인 WM_MOUSEMOVE가 오지 않는다. 그러나 이때에도 WM_SETCURSOR는 전달하는 상황 정보(hit-test code)만 달라진 채 언제나 온다.
  • hit-test code가 같이 온다는 점에서 유추할 수 있듯, WM_SETCURSOR는 클라이언트와 논클라이언트를 가리지 않고 온다. 그에 반해 WM_MOUSEMOVE는 클라이언트 영역 전용이고 WM_NCMOUSEMOVE가 따로 있다.
  • 마우스가 capture된 뒤부터는 마우스가 움직이면 반대로 WM_MOUSEMOVE만 오지 WM_SETCURSOR는 오지 않는다. 마우스의 포커스가 포인터 위치와 무관하게 이 윈도우에 집중되었기 때문에 포인터의 모양도 잠시 고정된다.
  • 그리고 결정적으로.. WM_MOUSEMOVE는 지금 화면을 대면하고 있는 최하위 child 윈도우에 직통으로 전달되는 반면, WM_SETCURSOR는 최상위 parent 윈도우에 먼저 전달되어서 얘들이 처리를 포기/거부했을 때에만 child로 내려간다.

마지막 항목이 중요하다. 이런 메커니즘의 차이로 인해 두 메시지는 서로 호환성이 전혀 없으며 별도의 메시지로 분리되어야만 한다. 이 메시지가 그냥 이 시점에서 표시할 HCURSOR 값만 곱게 얻는 게 목적이라면 WM_SETCURSOR 메시지는 SET이 아니라 GET이라는 동사가 붙어서 WM_GETCURSOR, WM_QUERYCURSOR처럼 명명됐을 수도 있다. 대화상자의 WM_GETDLGCODE 메시지처럼 그냥 return (LRESULT)LoadCursor(...)의 형태.
그런데 그게 아니기 때문에 자기가 직접 마우스 포인터를 재지정할 의향이 있다면 WM_SETCURSOR가 올 때마다 SetCursor를 수동으로 매번 호출도 해야 하고, 그러면서 리턴값도 0이 아닌 값으로 되돌려야 한다. 특히 DefWindowProc를 호출해서는 안 된다.

DefWindowProc가 WM_SETCURSOR 때 하는 일 중에는 논클라이언트 영역에서 포인터를 화살표 내지 창의 크기 조절 손잡이 모양으로 바꾸는 것이 포함돼 있다.
하지만 클라이언트 영역에서 DefWindowProc은 "난 마우스 포인터 모양을 자체적으로 처리할 의향이 없으니, (1) 내 부모 윈도우에서 이의 없으면 (2) 최종 처리를 내 자식 윈도우에 맡기겠소"라는 의미가 된다. Def..없이 return 0은 (2)만을 담당한다.

참고로, SetCursor(NULL)을 하면 클래스 WNDCLASS::hCursor = NULL과는 달리 비로소 마우스 포인터가 화면에서 사라진다. 이것은 HideCursor / ShowCursor 함수와 비슷한 효과를 낸다. 이들 함수는 포인터의 레퍼런스 카운터를 1 증가나 감소시켜서 카운터가 양수이면 포인터를 계속 표시시키고, 그렇지 않으면 계속 감추고 있는다. 캐럿을 표시하거나 감추는 ShowCaret / HideCaret과 비슷한 원리로 동작한다.
그에 반해 SetCursor(NULL)은 효과가 일시적이므로 해당 윈도우가 WM_SETCURSOR에서 계속해서 SetCursor(NULL)을 해 줘야만 포인터가 없는 상태가 유지된다.

사소한 사항이다만, WM_MOUSEMOVE는 메시지 큐에 post 형태로 전해지는 반면, WM_SETCURSOR는 리턴값을 꼼꼼히 확인해야 하기 때문에 언제나 sent된다는 차이도 있다. 마우스 메시지 훅킹 같은 걸 한다면 요런 차이가 민감하게 와 닿을 것이다.

3. 대기 상태 표현하기

프로그램이 파일을 읽고 쓰고 복잡한 계산을 시작해서 대략 0.n초 정도 짤막하게 사용자의 응답(더 정확히는 운영체제 메시지)에 반응을 하지 않게 됐다면, 이에 대해 가장 간단하게 피드백을 주는 방법은 SetCursor(LoadCursor(NULL, IDC_WAIT))를 해서 마우스 포인터를 그 악명 높은 모래시계 모양으로 바꾸는 것이다.

물론 처리가 끝났다면 포인터 모양을 원상복구 해야 한다. 이것은 SetCursor의 리턴값을 보관하고 있다가 도로 전달하는 것으로 쉽게 구현 가능하며, 이렇게 시작과 끝을 생성자와 소멸자에다 넣어서 간단한 C++ 클래스를 구현할 수도 있다. MFC에 있는 CWaitCursor가 그 예이다.
모래시계로 변해 있던 동안 마우스 포인터가 조금이라도 다른 곳으로 이동했거나, 위치가 안 바뀌었더라도 그 사이에 포인터 아래의 윈도우가 바뀌었다면.. 프로그램이 의식을 회복(?)했을 때 WM_MOUSEMOVE와 그에 상응하는 WM_SETCURSOR도 오기 때문에 포인터 모양이 자동으로 갱신되긴 한다. 그러나 그런 외부적인 변화가 전혀 없었더라도 포인터 모양이 원상복귀 되어야 하니까 말이다.

마우스 포인터의 움직임은 일종의 하드웨어 인터럽트 형태로 발생하며, 응용 프로그램이 WM_SETCURSOR 메시지에 응답하지 않고 있더라도 포인터가 움직인 것에 대한 반응은 해야 한다. 그렇기 때문에 프로그램이 처리를 열심히 하고 있는 동안에는 좀 전에 지정된 모래시계 모양이 유지된다. 물론, 포인터가 정상적으로 응답 중인 다른 프로그램 창 위에 놓여 있으면 거기 모양으로 바뀌며, 한 프로그램이 수 초 이상 너무 오랫동안 응답을 안 하고 있으면 그건 그것대로 문제가 된다. 내 프로그램 창이 고스트 윈도우로 바뀌는 일은 없어야 한다.

시간이 굉장히 오래 걸리는 작업을 한다면 프로그램의 디자인 형태가 바뀐다. 작업은 백그라운드 스레드에다 담당시키고 프로그램은 현재 진행 상황을 출력하면서 UI 메시지 반응도 평소처럼 한다. progress 컨트롤이 장착된 대화상자가 이 역할을 하며, 사실 Windows Vista부터는 task dialog로 이걸 간단하게 띄울 수도 있게 됐다.
동영상 인코더처럼 input 데이터를 직접 생성하고 작성하는 기능은 없고, 이미 있는 데이터를 변환하는 일이 전부인 프로그램이라면 별도의 대화상자 없이 자기 main frame window 자체가 통째로 진행 상황을 표시하는 용도로 쓰이기도 한다. <날개셋> 변환기도 이런 형태의 프로그램이다.

이를 좀 더 일반화해서 생각하면 이렇다. 어떤 윈도우가 하는 역할이 자신과 별개이고 독립적인 타 작업의 진행 상황을 관찰하면서 표시하는 게 전부라면, 보통은 그 윈도우 내부의 마우스 포인터를 굳이 별도로 모래시계 모양으로 바꾸지 않는다. 설치 프로그램들이 그 예이다. 다만, Windows Installer 엔진의 경우 본격적으로 설치/제거를 수행하는 마법사가 뜨기 전에 준비 작업을 하느라 자그마한 대화상자가 떴을 때는 마우스 포인터를 거기로 가져가면 모래시계로 바뀐다.

사용자 삽입 이미지

요런 게 대화상자 윈도우에서 WM_SETCURSOR를 처리함으로써 구현 가능하다. 이 메시지는 부모-자식 top-to-bottom 형태로 내려가기 때문에, 부모에서 메시지를 가로채 버리면 자식 윈도우의 의도와 상관없이 마우스 포인터를 모래시계 모양으로 바꿀 수 있다. 밑에 지금 무슨 윈도우가 있는지 핸들도 wParam으로 친절하게 전달된다. 여기서 SetCursor 호출만 하고 리턴값으로 nonzero를 지정하지 않으면, 대화상자 배경들만 포인터가 바뀌고 버튼 같은 각종 컨트롤들은 바뀌지 않게 된다. (위의 스크린샷처럼)

이와 대조적으로, 키보드 메시지는 포커스를 잡고 있는 최하위 윈도우에 직통으로 전달되니(bottm-to-top), 그 위에서 공통 단축키 같은 걸 처리하려면 message loop 차원에서의 pre-processing이 필요한 것이다.

<날개셋> 변환기의 경우 변환하는 파일이 적으면 스레드 없이 그냥 비응답 상태로 빠진 채로 변환을 수행한다. 그러나 수십 개, 수MB 이상 분량 파일을 요청하면 대화상자의 모든 컨트롤들을 disable시키고 progress 컨트롤을 출력하고, 대화상자 내부의 마우스 포인터를 모래시계로 바꾼 뒤 변환을 수행한다. 이때는 어차피 대화상자의 다른 기능들을 전혀 사용할 수 없고 ESC나 [X]를 눌러 중간 취소만 가능하기 때문이다.

그리고 하나 더 생각할 만한 상황은.. 딴 작업이 아니라 대화상자 자기 내부에다 출력할 데이터들을 준비하고 초기화하는 작업이 시간이 좀 오래 걸릴 때이다. <날개셋> 한글 입력기 제어판의 대화상자에도 그런 경우가 몇 가지 있다.
이때는 문제의 콤보나 리스트박스가 빈 채로 먼저 대화상자를 출력한 뒤, 스레드를 만들고 마우스 포인터를 IDC_WAIT가 아니라 IDC_APPSTARTING 모양으로 바꿨다. 대화상자가 출력은 됐지만 아직 초기화가 덜 돼서 백그라운드에서 작업 중임을 이렇게 나타낸다.

요렇게 백그라운드의 스레드 작업이 끝난 뒤에는 마우스 포인터를 어떻게 원상복구 할지가 문제가 된다.
아까처럼 스레드 없던 시절에는 작업하던 사이에 포인터 위치가 바뀌었으면 WM_SETCURSOR와 WM_MOUSEMOVE가 자동으로 생겼다. 그러나 지금은 그렇지 않다. 작업이 수행되던 중에 포인터 이동에 대한 처리는 이미 다 이뤄졌기 때문이다.

마우스 포인터의 이동 없이 아래의 창에다가 WM_SETCURSOR를 인위적으로 생성해서 포인터 모양을 원래 것으로 갱신할 수 있어야 하는데.. 이것만 어떻게 하는지 잘 모르겠다.
일단 본인이 사용하는 방법은 GetCursorPos로 현재 포인터 위치를 얻은 뒤, 그거 그대로 SetCursorPos를 하는 것이다. 위치가 바뀐 게 없음에도 불구하고 이렇게 하면 WM_SETCURSOR와 WM_MOUSEMOVE가 생성되기는 하는 것 같더라.
이 정도면 Windows 프로그래밍에서 마우스 포인터 제어와 관련해서 어지간한 문제는 다 다룬 것 같다.

Posted by 사무엘

2017/02/06 08:35 2017/02/06 08:35
, ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1324

교도소 이야기

요즘은 사회 전반에 비밀이라는 게 갈수록 없어지고 내부가 개방되고 있다. 어떤 폐쇄적인 집단에 대해서 직접 소속된 당사자가 아니고서는 알 수 없던 내부 사정이 인터넷을 통해 널리 알려진다. 이로 인한 부작용이 전혀 없는 건 아니지만, 그 과정에서 내부의 오랜 비리나 부조리가 폭로되고 시정되기도 한다. 그러니 비밀이 없어지고 투명해지는 것 자체는 대체로 긍정적인 현상으로 보인다.

굳이 북한 주민 인권 같은 거창하고 정치적인 얘기까지 가지 않아도 된다. 폐쇄적인 조직 중 대표적인 예인 군대를 예로 들면.. 2000년대 중후반에 연재되었던 주 호민 씨의 웹툰 <짬>이 미필자나 여성을 상대로 군대의 내부 사정을 대중적으로 잘 알렸다. 그저 긍정적인 면만 부각시키는 관제언론인 국방일보 같은 것 말고 말이다.
그 뒤로 2010년대에는 군대 안에서도 더욱 희소한 병과를 소재로 한 <DP 개의 날> 같은 웹툰까지 발표되었다. <짬>의 주인공이 평범한 육군 운전병인 반면, 저건 주인공이 탈영병 체포조 소속인 헌병이다.

이런 식으로 사회 복지 음지, 소록도, 무슨 특수부대, 극한 직업, 원양어선, 국정원 내부, 대성동 주민 등등..
이 좁은 대한민국 땅에 저렇게 사는 사람도 있나 싶은 이야기들에 본인은 개인적으로 관심이 많다.
그래서 그런지 요즘은 군대 체험으로도 모자라서 교도소 내지 그에 준하는 피의자· 피고인 신분 체험기까지 인터넷에 종종 올라와서 유명세를 탄 게 있다. 직접 범죄를 저질러 보지 않고서는 도저히 경험할 수 없고, 유경험자는 부끄러워서라도 공유를 꺼리니 대중적으로 알려질 일이 극히 드문 아이템인데도 말이다.

예전에 '마사토끼'라는 웹툰 작가가 "마사토끼 아청법에 걸리다"라고.. 기소되어 재판을 거쳐 벌금형을 받기까지의 실화 각색 만화를 공개한 적이 있었다. 이분에 대해서 다른 만화 작품은 모르겠고 "물은 답을 알고 있다"를 풍자하여 탐정 만화를 그린 걸 개인적으로 아주 재미있게 봤었다. (그러고 보니 <빵점동맹>에서는 그림 말고 스토리 작가이기도 했구나.)
그랬는데 자신이 피고인 신분으로 법원에 출두하고 벌금형을 받은 체험기까지도 선뜻 웹툰 소재로 선택해서 공개했다니, 대단하다는 생각이 들었다.

아무 스펙 없던 어떤 지방대 문과 계열 졸업생이 노량진에서 죽어라고 공부한 끝에 영어, 국어, 국사 등의 맥을 차례로 잡고 국가직· 지방직 공무원 시험 합격 3관왕을 달성했다. 누군지 기억은 안 나지만 그 사람은 전문 웹툰 작가가 아님에도 불구하고 꽤 준수한 그림 실력으로 자신의 시험 준비와 시간 관리 요령을 만화로 그려서 연재했으며, 본인은 이걸 본 적이 있다. 이런 성공 자랑 스토리에 비해 법원 다녀 온 이야기는 다시 떠올리고 싶은 유쾌한 경험도 아니었을 텐데 말이다.

그런데 마사토끼보다 더 수위가 센 만화도 나왔다. 바로 "교도소 일기"로, '엄격 진지 근엄' 짤방의 근원지이기도 하다.

사용자 삽입 이미지

위의 그림은 교도소 내부에서 군기를 잡는 헌병뻘 되는 교정직 공무원을 묘사한 것이다. 무슨 나치 시절 SS 요원처럼 검은색 제복 차림이다.

주인공은 제목과는 달리 교도소에서 실형을 산 건 아니고, 구치소에만 있다가 집행유예를 받고 풀려났다. 하지만 일반인들은 그걸 크게 구분하지 않으며, 구치소와 교도소 무슨 용어를 선택하건 만화가 말하고자 하는 주제가 달라질 건 없으니(이런 데에 절대 와서는 안 된다. 범죄 저지르지 말고 착하게 살아야 한다)... 제목을 편의상 교도소 일기라고 뽑았다고 한다. 미결수들은 관대한 처분을 받기 위해 일과 시간에 판사에게 '앙망문'ㅠㅠ을 많이 써서 보낸댄다.

저기를 전근대 용어로는 '감옥'이라고 하고 '형무소'는 일본 본토에서는 지금도 쓰이는 일본식 한자어다. 오늘날 우리말의 공식 명칭은 '교도소'. 죄인을 가둬서 벌을 준다는 의미 대신 얘들을 바르게 교화한다는.. 뭔가 긍정적인 뉘앙스를 넣어서 말을 다시 만든 것이다. 가격을 인상하는 게 아니라 합리화, 재조정하듯이 말이다. -_-;;
영어로는 prison 또는 jail이라고 하는데, 한국어 같은 유치장-구치소-교도소를 영어로 정확하게 어떻게 구분하는지는 잘 모르겠다. jail은 prison보다 동사로 활용도 더 잘 되는 것 같다. "I could have jailed you for doing/saying that!"처럼.

요즘 워낙 교도소의 사정이 좋아지고 공권력의 위상도 땅에 떨어진 덕분에 그냥 차라리 "깜빵이나 갈래요" 심정으로 범죄 저지르는 간 큰 사람까지 등장할 정도라지만..
근본적으로 개인 사생활과 자유가 없는 곳은 아무리 생물학적인 생존이 보장되는 곳이라 해도 사람이 갈 곳이 못 된다.
화장실 이용이 저 따위로 극도로 불편한 거 하나만 봐도 오금이 저릴 것 같다. 저기가 진짜로 국립 호텔이라고 생각하는 건 큰 오산이다.

군대에서 짬밥을 먹는다면 교도소에서는 콩밥을 먹는다. (여담이다만, 왜 '짬밥'만 사이시옷/사잇소리가 적용되어 '짬빱'이 되고 '콩밥'은 그렇지 않은지는 모르겠다. '볶음밥'과 '비빔밥', '물고기'와 '불고기'의 차이처럼 말이다. 이건 국어학계에서도 "그냥 케바케. 정말 원칙이 없다"로 귀착되고 있는 문제이다.)

경찰서 유치장은 무슨 입소대대요, 구치소는 훈련소나 보충대, 진짜 형이 확정되어 가는 교도소는 자대뻘 되려나 모르겠다.
군대에 대한 비하 발언으로 군대가 교도소와 다를 바 없네 하는 말이 있다. 군대와 교도소는 개인의 자유가 없거나 지극히 제한된다는 공통점이 있는 건 사실이다. 하지만 존재 목적이 서로 매우 다르기 때문에 다음과 같은 큰 차이도 있다.

  • 군대에서는 휴대와 관리 효율을 위해서 식당에서 포크 겸용 숟가락 하나만 쓰는 반면, 교도소에서는 끝이 아주 뭉툭한 플라스틱제 숟가락과 젓가락이 쓰인다. (자해 내지 탈옥 도구로 활용 못 하게. 죄수들에게 금속류를 줘서는 위험하다)
  • 군대에서는 병사들의 체력 단련을 강조하고 권장하지만, 교도소에서는 실내에서 신체 운동이 절대 금지다. 하다가 걸리면 징계 받는다. (가혹행위 못 하게)
  • 전투복은 야외 활동 능률을 위해 상의와 하의 곳곳에 주머니가 많다. 그러나 죄수복은 정반대로 주머니 같은 거 없다. 신발에도 명백한 이유로 인해 전투화와는 달리 끈이 일체 없다.
  • 군대에서는 병사들의 선거권이 보장되지만 교도소 수감자들은 그렇지 않다.
  • 군대는 비록 몰래 목 매달아 자살하는 사람도 나올지언정, 영창 화장실이 아닌 이상 화장실 안만큼은 사용 중 완전한 폐쇄를 보장해 준다.
  • 그나마 교도소는 불침번 같은 건 없구나. 일과 시간이 끝나면 다같이 푹 자는 게 보장된다. 다만, 밤중에 화장실 이용은 여전히 편하게 못 한다.

수저조차 흉기가 될 수 있기 때문에 사실은 교도소뿐만 아니라 비행기에서 기내식을 줄 때도 비슷한 조치가 취해지고 있음을 생각해 보자. 실제로 9· 11 테러 때 테러범들은 스테이크 써는 용도의 플라스틱 나이프만 갖고도 승객과 조종사들을 제압했다고 하니까. 그 뒤 미국에서 운용되는 여객기들은 액체 반입 제한에다 스테이크는 미리 다 썰어 놓은 채로 주는 등, 별별 보안 제약이 더 생겼다.

다음으로, 집단 내 서열에 대해서 생각해 보자.
군대에서 훈련소는 같은 날 들어와서 같은 날 나가는 동기들만으로 구성돼 있어서 형태가 제일 단순하다. 자대부터는 병들이 들어온 날이 제각각이어서 짬과 서열과 계급 차이가 존재하지만, 기본적으로 복무 기간은 다들 동일하다. 또한 장교인 소대장 아래로 병 중에서도 완장 찬 분대장이 있어서 후임들을 통제한다.

그에 반해 교도소는 한 방의 수감자들이 들어온 날과 나가는 날에 아무 개연성이 없다. 연령대도 전혀 비슷하지 않다. 그러니 동기는 전혀 아니지만 그렇다고 신참과 말년 서열도 공식적으로는 존재하지 않으며 존재해서도 절대 안 된다. 감방 내부에서 죄수들끼리 군대놀이가 행해지고 일진 같은 조직과 '짱'이 존재하고 간수 끄나풀이 존재하는데 그걸 간수들마저 죄수 관리의 편의라는 미명 하에 묵인· 동조· 방치한다면 교도소가 얼마나 개판이 되겠는가?

물론, 아예 사형수나 극도의 흉악범 또는 죄질과 별개로 멘탈에 문제가 있는 위험 죄수는 독방에 따로 수용되거나 더 엄한(= 햇빛 구경하기가 더욱 어려운) 교도소로 옮겨지긴 한다.
군대에 소규모 징계 시설인 영창이 있듯이, 교도소도 그런 목적으로 독방이 있다. 보는 눈이 없이 혼자 지내는 게 좋을 것 같지만 하루 종일 아무 행동도 못 하고 벽만 쳐다보고 지내야 하니 그건 그것대로 고문이라고 한다. 독방이 무슨 왕중왕도 아니고 교도소 안의 교도소 역할을 한다.

병역 의무가 있는 나라에서 누구든지 가능한 한 군대에 안 가려고 애쓰는 것은 인지상정이다. 허나, 질이 지나치게 안 좋아서 통제가 안 되는 단점이 신체 능력이 뛰어난 장점보다 더 큰 사람은 군대에서도 아무리 사람이 부족해서 난리라 한들 받아들이지 않는다.

만만한 게 죄수들이니까 얘들을 삼청교육대 식으로 인간흉기로 개조시켜서 공작원으로 투입하거나 선원으로 부려먹는 건 인권 문제를 차치하고라도 부려먹는 갑의 입장에서도 영화· 소설에서 보는 것만치 쉽게 가능한 일이 아니다. 언제 딴마음 품고 사고 칠지 모르는 사람을 어떻게 믿고 덥석 위험한 무기나 도구를 쥐어 주고 일을 시킬 수 있겠는가? 일례로, 박통 시절에 실미도에서 몰래 양성되었던 북파 공작원들도 사형수· 죄수 출신이 아니었다.

오죽했으면 일제 강점기 때도 조선인을 상대로 징병제는 갈 데까지 다 간 말기인 1938년이나 돼서야 시작됐다는 점을 기억할 필요가 있다.
군대 안 가려고 장애인으로도 모자라서 전과자가 되는 것까지 불사할 정도로 극단적인 선택을 하는 사람은 요즘 같은 평시에야 많지 않다. 하지만 옛날에 정말 나라가 전쟁에 휘말려서 위태롭고 병사들의 사망률이 높던 시절에는 "군대 가느니 차라리 감옥 가고 만다, 배째!"도 당연히 있었다.

사람이란 살면서 병원에 갈 일이 없어야 하듯이 법원이나 경찰서 같은 곳에도 정말 갈 일 없고 마주칠 일이 없는 게 제일 좋을 것이다. 피해 신고자나 증인 신분으로 가는 거면 최소한 자기 마음은 부끄러울 것 없고 떳떳하겠지만, 그래도 골치 아픈 일에 엮인 상태인 건 변함없지 않은가?

군인과 민간 공무원의 하이브리드인 군무원이라는 직종이 있듯이, 군대와 교도소의 하이브리드인 '국군 교도소'도 있다. 군인 신분으로서 영창보다는 크고(빨간 줄 그이고), 그렇다고 군번 즉각 말소에 민간인 싸제 교도소로 옮겨질 정도까지는 아닌 규모의 죄를 지은 사람이 가는 곳인데.. 이곳 역시 가서 좋을 건 전혀 없는 곳이다.

반대로 그런 업종에 종사하는 사람들은 그에 비례해서 고소득 전문직이다. 남의 인생을 좌지우지하는 스트레스와 책임감이 크고 재미없는 일을 하니까. 영적으로 보자면 저런 직업은 인간의 죄의 결과를 수습하는 직종에 속하기 때문에 저건 인류가 존재하는 한 수요가 절대 없어질 수가 없다. 옛날에 그 고상한 청교도들이 신대륙으로 건너가서 미국을 세운 뒤에도 교도소는 거의 곧장 필요해졌다지 않는가?

가령, 검사라 하면 얼마나 머리가 비상하고 공부 많이 한 사람일 텐데, 그 좋은 머리로 맨날 하는 일이 뭔가 기술을 연구 개발하는 게 아니라 남을 일단 의심하고 나쁘게 보고 기소하고 형량을 판사에게 청구하는 일이다. 정신 건강에 좋은 일은 아니어 보인다. 저것만 하다가 맛이 가 버려서 인격 파탄 막장 싸이코 검사가 나오는 것도 본인은 이해는 할 것 같다. (피의자에게 막말, 가혹행위..;; )

우리나라에 10월 28일은 '교정의 날'이라고 법정 기념일이다. 저건 9월 18일 철도의 날만큼이나 교정 분야의 궂은일에 종사하는 사람들의 노고를 치하하는 날이다. 우리나라가 민간 싸제 교도소가 막 발달한 나라는 아니니, 이 바닥 종사자들은 사실상 다 공무원이라고 봐야 할 것이다.

공무원뿐만 아니라 교도소만 찾아 다니면서 포교· 선교 활동을 하는 종교인들도 있다. 군대보다도 저런 곳이 복음이 더 절실히 들어가야 하는 곳이기도 하니까. 개인 활동을 못 하는 곳에 있으면서 성경이라도 제대로 읽고, 인생과 죄 문제와 죽음 이후 세계에 대해서 진지하게 생각을 해 보라는 것이다.

사람이란 게 꿈에도 생각을 전혀 안 하고 있다가 불의의 교통사고로 덜컥 장애인이 될 수도 있고, 비슷한 이치로 욱 하다가 정말 사소한 실수 때문에 은팔찌 득템에 경찰서 정모를 할 수도 있다. 굳이 우리가 생각하는 그런 흉악한 범죄를 저지르지 않더라도 말이다. 사람이 죽는 급의 큰 교통사고를 내거나 경제 사범으로 몰리는 바람에 철창 신세를 질 수도 있다.
그런 일이 애초에 절대로 일어나지 않기를 바라야겠지만 세상엔 이런 바닥도 있다는 걸 미리 염두에 둔다면 나중에 예상치 못한 비극이 찾아왔을 때 좀 덜 당황할 수 있을 것으로 보인다.

Posted by 사무엘

2017/02/03 08:34 2017/02/03 08:34
, , , , ,
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1323


블로그 이미지

그런즉 이제 애호박, 단호박, 늙은호박 이 셋은 항상 있으나, 그 중에 제일은 늙은호박이니라.

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2017/02   »
      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        

Site Stats

Total hits:
2663352
Today:
527
Yesterday:
1553