« Previous : 1 : ... 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 11 : ... 13 : Next »

날개셋 한글 입력기 7.9 -- 上

바야흐로 2015년 봄에 <날개셋> 한글 입력기 7.9를 내놓게 된 것을 기쁘게 생각한다. 번호가 9로 끝나는데 날짜가 마침 서울 지하철 9호선 2차 구간 개통일과 일치하는 것은 그냥 우연...;;치고는 절묘하다. ^^

이번 7.9는 이 프로그램의 개발 역사상 "한글 입력 체계" 카테고리에만 아이템이 제일 많이 추가된 버전이다. 지난 1월 이후로 중간 개발 근황글이 없다시피했는데, 근황글을 쓰는 것조차 시간이 아까울 정도로 지금까지 너무 바쁘게 지냈기 때문이다. 코딩, 글쓰기, 학교 과제, 회사일, 교회 서적 번역..
그래도 8.0까지 가는데 더는 지체할 수가 없어서 이번 7.9에서 한번 쉬었다 가고자 한다.

※ 새로운 날개셋문자: '글쇠 누름' 타입

IME란 기본적으로 특정 키보드 입력을 가로채어 그 대신 운영체제가 제시하는 다른 규격대로 조합/완성 문자열을 생성하여 보내는 프로그램이다. 그런데 발상을 전환하여, A라는 키보드 입력을 가로채어 그 대신 B라는 다른 키보드 입력을 생성하는 기능이 날개셋문자의 타입 차원에서 추가됐다. 여기에는 단타뿐만 아니라 간단히 Ctrl/Shift 조합도 포함될 수 있다.

<날개셋> 한글 입력기는 IME일 뿐 키매크로나 키보드 드라이버 훅킹 같은 걸 '지향'하지는 않는다. 하지만 새로운 날개셋문자 타입을 이용하면 A를 눌렀는데 화살표 키가 눌린다거나, 다른 뭘 눌렀는데 Ctrl+A가 눌린다거나 하는 간단한 치환 효과를 낼 수 있다. 프로그램의 활용 가능성이 더욱 높아지리라 기대한다.

GetMessageExtraInfo 함수가 이런 용도로 쓰인다는 걸 알 수 있었다. 즉, 사용자가 진짜로 누른 키 입력 메시지와, 프로그램이 인위로 생성한 키 입력 메시지를 구분하기 위해서다. 내가 인위로 생성한 키 메시지는 또 가로채지 않아야 하니까. 이는 The old new thing 블로그에도 언급되어 있다. 그리고 <날개셋> 한글 입력기가 개발 15년 만에 이 캐잉여 함수를 사용하는 프로그램의 반열에 올랐다. 경to_the축!

날개셋문자의 종류가 3.0 시절에는 5종류밖에 없던 것(일반, 세벌, 두벌, 특수글쇠, 상태 전이)이 이제는 10종류로, 정확히 두 배로 늘었다(중종-초, 종-초중, 다중 문자, 종성 두벌, 글쇠 누름). 그래서 이 참에 날개셋문자를 생성하는 대화상자도 이렇게 바뀌었다. 라디오 박스 목록 대신, 날개셋문자 기능들이 어떻게 분류되는지를 나무 계층 구조를 통해 알 수 있게 했다.

사용자 삽입 이미지

※ 글쇠 인식 관련 마이너 기능

앞서 언급한 '글쇠 누름' 날개셋문자를 추가하기 위해, 편집기, 외부 모듈, 입력 패드라는 모든 구현체에서 글쇠 인식 부분을 상당수 손질을 해야 했다. 그리고 이걸 수행하는 과정에서 뜻밖의 작업이 덤으로 행해졌는데..
화면 키보드에, 글쇠를 클릭해서 문자를 입력하는 통상적인 기능뿐만 아니라 역으로 사용자가 누른 키보드 글쇠를 화면에다 표시해 주는 기능을 드디어 추가했다. 화면 키보드를 우클릭하면 이걸 켜는 옵션을 볼 수 있다.

그리고 '글쇠 누름' 날개셋문자를 생성하는 UI를 구현하려다 보면 결국은 "입력하고자 하는 글쇠를 직접 눌러서 선택"하는 UI가 필요해진다.
이걸 구현하는 김에, 예전 고급 입력 스키마의 '고급 글쇠 인식 옵션' 대화상자에다가도 [...]버튼을 추가하여 대상 글쇠를 콤보 상자에서만 고르는 게 아니라 직접 눌러서 고르는 UI를 같이 추가했다.

※ 입력 스키마와 글쇠배열

(1) 글쇠 수식의 R 변수에다가 임의의 32비트 크기의 난수를 되돌리게 하는 옵션을 '고급 스키마'에 추가했다. 입력 동작을 non-deterministic하게 만드는 기능인데 굳이 '기본 스키마'가 갖춰야 할 기능이라 생각되지는 않아서 고급에다가만 넣었다. 'A'+R%26 이렇게 수식을 넣어 주면 A부터 Z까지 아무 알파벳이 임의로 입력되게 된다.
R 변수는 실제로 사용할 때만 값이 정해진다. 사용하지도 않는데 매번 무조건 난수값이 계산되고 사이클이 변하는 것은 아니다.

(2) 필요하다면 글쇠배열 수식의 전후에, 모든 글쇠에 대해 공통으로 실행할 수식을 지정할 수 있게 했다. 소문자로 된 사용자 정의 변수를 공통으로 초기화한다거나(전처리), 그리고 날개셋문자를 되돌릴 때 사용하는 변수값과 최종적으로 변경되어야 하는 변수값이 다를 때(후처리) 이 기능을 사용하면 된다.
물론 이런 전처리/수처리 수식을 사용할 정도이면 글쇠 수식이 정말 상황 의존적이고 복잡한 상황일 것이다. 한글 입력 순서를 자동으로 계산하는 기능은 그런 보조 수식은 고려하지 않고 동작한다.
지금까지 글쇠배열과 관련된 속성 숫자를 지정하는 입력란이 있었지만 사용하지는 않고 있었는데, 이제부터는 그 숫자를 이런 옵션을 저장하는 용도로 사용할 것이다.

(3) 글쇠배열 수식의 T 변수에는 기본 입력기가 만들어 내는 한글 조합의 오토마타 상태만 들어있었다. 그러나 옵션을 준 경우 고급 입력기가 만들어 내는 사용자 정의 조합의 상태 번호도 여기에 들어가고, 그 대신 이 조합의 타입 값이 C라는 변수에 들어가게 했다. 한글이면 1, 사용자 정의 조합이면 2이다. 하지만 고급 입력기의 사용자 정의 조합은 개념상 오토마타와 낱자 결합을 통합한 로직을 자체적으로 갖고 있기 때문에 글쇠배열이 조합 상태에 따라 조건부로 동작해야 할 일은 그리 많지 않을 것이다.

(4) 또한 옵션을 준 경우, 굳이 '상태 전이' 날개셋문자를 사용하지 않고 글쇠배열 수식에서 T 값을 변경하면 그걸로도 상태 전이 효과가 나게 했다. 이게 언제 유용한지는 좀 더 생각해서 입력 예제를 만들어 봐야 할 것 같다.

※ 입력 기능 추가

다음으로 문자 생성기 계층으로 넘어가면,
(1) '낱자 재결합' 텍스트 필터의 기능을 일부 수행하는 특수글쇠가 추가됐다. 기[ㅇ](종성 조합 중)을 [깅]으로 바꾼다거나, 저렇게 앞으로 가는 게 아니라 뒤로 결합을 하는 특수글쇠도 있다. 물론 이것은 조합이 끝난 옆의 글자를 변형하는 기능이기 때문에 TSF A급 구현체에서만 제대로 동작한다.

(2) 비록 이번 7.9에서 온전히 구현되지는 않았지만 곧 지원될 세벌식 지능형 동시치기 기능을 염두에 두고 음수 오토마타 지시자가 두 개가 새로 추가되었다.
지금 입력된 글쇠뿐만 아니라 직전의 글쇠까지 동시에 다음 글자로 옮기는 것, 그리고 지금 입력된 글쇠와 예전에 입력된 글쇠의 입력 순서를 바꾸는 것인데, 이와 비슷한 기능을 하는 특수글쇠도 같이 추가되었다.
앞으로 입력 스키마 차원에서 새로운 기능이 추가되면, 세벌식 글자판에서도 글쇠 입력 타이밍에 따라 도깨비불 비슷한 게 일어나면서 글자 재배치가 일어나는 동작을 볼 수 있을 것이다. 문자 생성기의 기존 기능을 이런 식으로 활용하는 것이다.

(3) 낱자 결합 규칙은 잘 알다시피 A + B = C의 형태인데 여기서 A, B, C는 모두 0이 아니어야 한다. 단지, A~C를 0인 것처럼 보이게 하는 가상 낱자 규칙만을 추가로 지정할 수 있을 뿐이다.
그런데 이번 버전에서는 그 금기를 깨고, 65530이라는 끄트머리의 reserved 낱자와 결합을 시도하는 경우 지금 낱자가 무조건 0으로 바뀌게 하는 예외를 추가했다.

이런 기능이 왜 필요한 것일까? 성분과 성분을 왔다갔다 하는 굉장히 기발한 입력 방식이 존재하기 때문이다. 그 예 중 하나는 김 민겸 님께서 고안한 입력 방식이다.
이걸 보면 "ㄱ → 그 → ㅋ", "ㄱ → 기 → 끼"라는 규칙이 있다. 모음 ㅡ가 한 번 입력되어 버렸는데 그때 또 ㅡ가 입력되면 그 뒤엔 모음은 0으로 깨끗이 초기화되고 초성만 ㅋ으로 바뀌어야 한다.

단순히 표시만 0으로 되는 가상 낱자여서는 곤란하다. ㅋ이나 ㄲ이 만들어진 뒤에 또 후속 모음이 입력되는 경우를 논리적으로 감당할 수 없기 때문이다.
이때 ㅡ 자리에는, 현재 초성으로 ㄱ이 입력되어 있는지를 점검한 후, ㄱ이 있다면 ㄱ을 ㅋ으로 바꾸는 초성을 입력함과 동시에 중성 자리에는 65530을 주면 된다. 이때는 오토마타도 초+중 상태이던 것을 초성 상태로 되돌리게 해야 한다.

<날개셋> 한글 입력기는 이런 것도 이제 이론적으로 수용 가능하게 되었다. 단, 이렇게 여러 낱자가 한꺼번에 변하는 변칙적인 입력 방식은 입력 순서 찾기 같은 자동화 기능의 혜택을 받을 수는 없다. ^^

※ 고급 입력기에 기능 추가 (특히 초성 지향 도깨비불)

온갖 복잡한 기능과 옵션을 동원해서 한글 한 글자를 조합하는 기능은 '기본 입력기'에 다 들어있다. '고급 입력기'가 하는 일은 비한글 문자도 조합을 잡는 걸 가능하게 해서 한글 조합과 혼용하는 것이다. 그리고 한글을 여러 한글로 풀거나 비한글 문자가 섞인 형태로 표현하는 것도 그런 기능에 포함된다.

(1) "한글 출력 치환"에서 "글자 치환" 기능은 지금까지 그냥 이 한글을 저 한글로 치환한다는 식의 테이블 기반 치환만 지원했다. 그러나 수천~수만 자의 한글을 치환해야 하고 치환 규칙이 뭔가 수식으로 표현이 가능하다면, 무엇을 무엇으로 치환할지를 A,B,C에 대한 수식으로도 깔끔하게 표현 가능하게 했다.
유니코드 PUA 영역에다가 여러 글자들을 배당해 놓고 그 글자를 마치 한글 입력하듯이 입력하고 싶다면, 이 출력 치환 기능을 이용하면 된다.

(2) 그리고 "낱자 치환"에서 특별히 종성을 치환하는 기능은 지금까지 가상 낱자와 연계해서 ㄴ+ㅇ 같은 임시 상태를 표현하는 데 쓰이곤 했다. 이번 버전에서는 그걸 더 확장해서 "초성으로 먼저 나갔다가 다시 앞 글자 받침으로 들어가는" 도깨비불 현상을 구현하는 옵션을 추가했다. 다시 말해 "울 -> 우리"가 아니라, "하ㄴ -> 한ㄱ" 이런 식으로 입력이 진행된다는 뜻이다.

지금도 이미 모든 종성에 대해서 종성 A를 "빈 종성 + 초성 A"로 치환하는 종성 치환 규칙을 수동으로 집어넣으면 이런 동작을 구현할 수 있다. 하지만 이 기능은 지금 도깨비불 현상 예상 결과를 토대로 자동으로 구현해 주기 때문에 낱자 치환 기능의 옵션으로 들어간 것이다.

이렇게 종성까지도 초성을 먼저 추구하는 두벌식은, 초성조차 종성 형태로 먼저 입력되는 '종성 지향 두벌식'과는 성향에 관한 한 완전히 딴판이다. 그에 반해 수식을 이용해 초성에서는 초성, 종성에서는 종성 문맥으로 동작하는 일반적인 두벌식은 중도(?) 성향이고 말이다. <날개셋> 한글 입력기는 이런 두벌식의 세밀한 패러다임을 모두 잡아 냈다.

받침이 없는 글자가 받침이 있는 글자보다 더 많기 때문에 두벌식 자판의 도깨비불 현상은 "초성부터 먼저 표시했다가 다음에 종성으로 가는 형태가 원칙상 옳다"라고 주장하는 분이 계신다. 이런 방식은 도깨비불 현상 이질감이 약간 덜할지는 모르지만 조합 중인 한글의 글자 수가 잠시 둘로 늘어나며, 조합이 완성되었을 때의 글자 형태(한)와 조합 중일 때의 글자 형태가(하ㄴ) 달라지는 문제가 있다. 그러니 '선종성 후초성' 방식이 대세가 된 건 다 아무 이유 없이 그리 되지는 않은 듯하다. 이번 7.9 버전도 그 조합 중단 처리가 원활하지 못하기 때문에 이는 8.0에서 풀어야 할 숙제로 남기게 되었다.

※ 새로운 '허용 한글 범위' 기능

지금까지 '허용 한글 범위'로 선택할 수 있던 기능으로는 커널이 기본 제공하는 "KS X 1001 완성형 2350자"에 덧붙여 플러그 인이 제공하는 "한양 PUA 완성형 옛한글 5299자", 그리고 "한컴 2바이트 완조형 옛한글" 정도가 고작이었다. 2350자 테이블이야 날개셋 커널이 완성형 한글 글꼴을 지원하기 위해 어쩔 수 없이 갖추고 있는 것이고 그래서 허용 한글 범위 기능까지 완전 덤으로 제공하는 것이다. 나머지 legacy 기능들도 그냥 명분상으로 제공될 뿐이지 이 유니코드 5.2 천하통일 시대에 딱히 의미가 있다고 보기는 어렵다. '설정'을 눌러도 딱히 설정할 것 역시 없다.

그러나 7.9부터는 이 기능을 예전보다는 좀 더 창의적으로 활용할 수 있게 되었다.
(1) 고급 입력기와 연동하여 "글자 치환"이 존재하는 한글만 입력이 허용되게 하는 기능이 있었는데, 여기에 덧붙여 "낱자 치환"이 된 낱자의 다음 낱자부터는 입력되지 않게 하는 기능도 추가되었다.

좀 변칙적인 입력 방식 중에는 같은 글쇠를 눌렀는데 한글과 비한글 문자가 순환되는 형태인 것이 있다. 비한글도 내부적으로는 가상의 한글 낱자인데 단지 그걸 비한글 문자로 치환해서 출력하는 것일 뿐이다. 그래서, 정말로 한글 초성을 입력하고 있었다면 중성이나 종성으로 더 진행이 가능한 반면, 지금이 비한글 문자로 치환된 초성을 조합하는 상태라면 중성 같은 다음 성분이 현 글자에 붙지 않고 다음 글자로 떨어져 나가게 한다. 이런 기능이 '허용 한글 범위'와 연동이 가능하다는 것이다.

요컨대 한글과 비한글 문자를 섞어서 입력한다면 '낱자 치환'에다 제약을 걸면 되며, 한글을 그 자체로는 전혀 사용하지 않고 다른 문자를 입력하는 수단으로만 사용한다면 '글자 치환'에다 제약을 걸면 된다. 후자는 한글로 일본 문자를 입력하는 것이 대표적인 예인 것이다.

(2) 그리고 사용자가 지정한 UTF-16 방식의 텍스트 파일에 있는 한글만을 조합 허용하고 그렇지 않은 것은 불허하는 기능이 추가되었다. 이거 하나만 있으면 앞으로 '허용 한글 범위'에 데이터 기반의 새로운 기능이 더 추가될 여지 자체가 없을 것이다. 외장형 후보 변환 데이터와 더불어 <날개셋> 한글 입력기가 외부 데이터 파일을 참조하여 동작하는 경우가 하나 더 추가되었다.

예제로는 KS X 1001 2350자에다가 오늘날 완전히 공기 잉여화한 문자 집합인 KS X 1002 1930자를 합한 데이터를 제공하므로 이것을 불러다가 사용하면 된다. 여러 입력 항목들이 동일한 데이터 파일을 읽더라도 한 파일은 메모리가 한 번만 할당되는 정도의 처리는 다 돼 있다.
(下에서 계속됨)

Posted by 사무엘

2015/03/30 08:33 2015/03/30 08:33
Response
No Trackback , 2 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1078

프로그램 관련 올해 첫 소식

0. 예전에도 했던 넋두리 반복

<날개셋> 한글 입력기 7.7이 공개된 지 이제 40일 가까이 시간이 지났다.
지금까지의 버전업들이 다 그러했던 것처럼 7.7도 그야말로 머리부터 발끝까지 갖가지 분야에서 쇄신과 개선을 이뤘고 프로그램의 완성도를 잘 끌어올렸다.
도대체 언제까지 이렇게 코딩을 할 거리가 존재할지를 생각하면 좀 불안하기도 하다.
자연스럽게 이제 더 만들 게 없다 싶으면 프로그램의 개발은 저절로 중단되고 그냥 보안 패치나 하는 유지 보수 모드가 될 것이고 나는 다른 아이템을 찾아 나서면 될 것이다. 그런데 아직까지는 그렇지 않다.

<날개셋> 한글 입력기의 제어판은 컴퓨터에서 한글을 생성하는 것과 관련된 모든 기술과 아이디어들이 총집약해 있는 복잡한 기계 조종석과 같다.
<날개셋> 한글 입력기는 정말 똘끼 하나로 똘똘 뭉친 프로그램이며 그야말로 극한의 '자유'의 산물이다.
그 어떤 부귀영화나 안정된 고소득 직장 내지 신분, 지위도 <날개셋> 한글 입력기 개발과 어울리지 않거나 이 프로그램을 내 마음대로 자유롭게 개발할 여건을 빼앗는다면 나는 전혀 거들떠보지 않았다.

내가 스스로 선택한 외길이기 때문에 나는 남들보다 딱히 사회에 대한 불만 같은 건 없다. 그 대신, 이 자유를 위협하는 적들에 대해 나는 남들보다 더 민감하게 반응하며 이것이 나의 정치 성향에도 반영되어 있다는 것은 예전에도 한번 언급한 바 있다. 뭐, 나의 사상과 가치관은 그러하다.

나는 이렇게 내 길을 가면서 아주 만족하고 행복해하고 있지만.. 우리 부모님 세대는 그렇지 않았다.
원래 꿈은 이것이었고 저것이었는데.. 돈이 안 되기 때문에, 가족들 먹여 살려야 하기 때문에, 나보다 더 공부 잘하는 동생의 대학 학비를 마련해야 하기 때문에..
그걸 다 포기하고 그저 생업 전선으로 내몰리고, 억만 리 타지까지 가서 자기 학벌에 어울리지 않는 궂은 일 힘든 일을 해야 했다.

내가 그런 시절을 살아야 했다면 정말 못 살았을 것 같다.
그러니 그런 옛날과 비교하면 나는 정말 감사할 게 많으며, 사회 구조에 대해 불평 불만 따위를 할 자격이 없는 것이다.
그런데 언제까지나 이러고 있을 수도 없으니 늘 조급한 마음에 프로그램 개발을 계속하고 있다.

1. 사소한 버그 수정과 개선

지난 7.4 버전에서는 한자 변환을 할 때, 별도의 옵션이 지정되어 있을 때만 제1 한자 후보에서 BMP 영역의 모든 한자가 나타나고, 기본적으로는 4888자 상용 한자만 표시되게 프로그램의 동작이 바뀌었다.
그런데 '일', '반', '우' 등 몇몇 한글 독음을 한자로 바꿔 보면 맨 아래에 일부 호환용 한자 영역의 비상용 한자가 추가로 잘못 표시되던 버그가 있었다. readme에 정식으로 기록조차 되지 않을 정도로 사소한 사항이다만, 어쨌든 다음 버전에서는 수정될 예정이다..

편집기에는 아시다시피 콘솔 프로그램의 실행 결과(표준 출력) 내지 인터넷 URL 내용을 본문에 삽입하는 기능이 있다.
그 기능을 수행하는 중에 사용자가 ESC를 눌러 취소를 하면 작업이 송두리째 중단되고 아무 일도 일어나지 않는데, 이제는 지금까지 받은 텍스트라도 본문에 삽입할지를 사용자에게 묻게 했다.
이런 간단한 옵션을 왜 지금까지 생각을 못 하고 있었는지 모르겠다. 이 기능 자체는 무려 10년도 더 전 3.0부터 있었는데도 말이다.

그리고 타자연습에는 '짧은글 UI'로 방식으로 연습을 하는 문장 연습 방식에, 지금 문제를 건너뛰고 곧바로 다음 줄로 넘어가는 편의 기능이 추가될 예정이다. 즉, 낱말 연습, 짧은글 연습, 그리고 짧은글 스타일로 하는 긴글 연습 이 세 모드가 적용 대상이다. <날개셋> 타자연습을 꾸준히 잘 사용하고 계시는 어느 사용자의 여러 건의 사항 중 하나가 반영된 것이다.

파워업은 꼬마 윈도우나 글쇠배열 윈도우를 우클릭했을 때 나오는 메뉴에 투명도를 조절하는 명령을 추가했다.
이것들은 핵심 기능의 버그 수정 같은 긴급한 성격은 아니기 때문에 한글 입력기가 버전업될 때 같이 업데이트될 예정이다.

2. 초· 종 공유 낱자 결합 규칙의 연쇄 적용

7.7의 다음 버전은 올해 봄쯤에 나올 7.9로 계획하고 있으며, 계속해서 한글 입력 엔진의 기능을 확장해 나갈 것이다. 지금 당장 얘기를 할 수 없는 여러 기상천외한 기능들을 계획하고 있다. 궁극적인 목표는 세벌식 글자판에 최적화된 지능형 동시치기를 만들어 내는 것이지만, 그것과 직접적인 관련이 없는 개발 아이템도 있다.

2015년에 처음으로 한 과업은.. 사용자의 타이핑 경험과 직접적인 관계는 없지만, 뭔가 원론적인 차원에서 필요를 느껴서 진행한 것이다.
초· 종 공유 낱자 결합은 종성은 A+B=C 형태이고, 각 A와 B를 초성 낱자 결합 규칙대로 만들어 내는 걸 허용하는 변칙 기능이다. 그런데 이런 묶음도 A+B라는 두 묶음에 매인 게 아니라 필요하다면 A+B+C, A+B+C+D도 얼마든지 만들 수 있고, 그러면서도 도깨비불 현상은 언제나 맨 마지막에 입력된 묶음이 통째로 다음 글자로 넘어갈 수 있게 알고리즘을 확장 구현했다.

기능 자체는 구현하는 게 별로 어렵지 않다.
하지만, 이거 영향을 받는 건 제어판 UI에서 '실제로 입력 가능한 낱자'를 판별하여 색깔을 달리 표시하는 기능,
그리고 '타자 순서 및 연속 입력 가능 여부'를 판별하는 알고리즘이다.

안 그래도 작년 여름에 7.5 만들 때 머리가 터지도록 고생하면서 만들었고 앞으로 평생 고칠 일이 없기를 바라면서 봉인을 해 버린 코드인데 그걸 또 꺼내서 뜯어고치는 심정은 개인적으로 참담했다.
초성 기준으로 입력 순서를 찾는 것 자체가 재귀호출이고 그걸 사용자 스택으로 구현했는데,
그 묶음 자체도 이중이 아니라 임의의 깊이대로 재귀호출이 행해지는 형태로.. 이것도 사용자 스택으로 구현하자니 while/for문이 그야말로 눈이 돌아갈 정도로 깊어졌다. 이런 복잡한 코드를 묵묵히 수행하는 컴퓨터가 대단하다.

뭐, 결국은 해냈다.
깔끔하게 기능이 완성되긴 했지만, 정작 다 완성하고 나니 마음이 허무하고 "결국 이렇게 끝날 일을.. 이게 이렇게까지 힘들게 만들 정도로 가치 있는 기능이긴 했나? 다음엔 무슨 기능을 구현하지?" 싶은 생각이 들었다.;;

3. 인디자인 문제

최근에 Adobe InDesign을 사용하는 분에게서 버그 신고가 들어왔다. 사연이 좀 복잡했다.
인디자인이 최신 버전인 CC에서는 한글 입력이 제대로 안 된다고 한다. 더 구체적으로 말하면, 한글을 조합하는 중에 space를 누르면 "한글+공백"이 입력되는 게 아니라 뒤의 공백이 씹히고 한글 조합만 끝난다고 한다.

이게 원래는 MS 한글 IME를 사용할 때 나타나는 현상이어서 몹시 불편했는데, 내 프로그램의 구버전은 그런 문제가 없었다고 한다. 그런데.. 7.5인가 7.7부터는 내 프로그램까지 뒤의 공백이 씹히기 시작해서 그것이 불만이라는 것.

이것은 일차적으로는 인디자인이 고쳐져야 하는 문제이다. 내 프로그램은 한글 조합 중에 비한글 문자 글쇠가 입력됐을 때 이것을 IME가 가로채지 않고 응용 프로그램으로 넘겨 주도록, 좀 더 MS IME와 비슷하게 동작하게 7.x 중반 때 한번 잠수함 패치를 한 적이 있었다.
그런데 그것이 오히려 문제를 일으킨다면, 예전 버전처럼 조합 중일 때 비한글 문자 글쇠를 IME가 가로채게 동작을 바꾸면 된다. 그 방법은 다음과 같다.

  1. <날개셋> 제어판을 열고 "편집기 계층-단축글쇠"로 간다. 그리고 "추가"를 누른다.
  2. "가상 키코드"에서 0x20을 입력하거나 Space를 고른다. "직접 눌러보기"에서 눌러도 된다.
  3. "할당할 기능"의 "용도"는 "2 글쇠 전달"을 고르고, 계산식엔 0x20을 입력한다.
  4. "조합 중일 때만 동작" 옵션을 켠 뒤, 대화상자들을 "확인"을 눌러 종료한다.

이렇게 해 주면 해당 프로그램에서도 한글+공백을 씹히는 현상 없이 바로 입력할 수 있게 된다. 비슷한 문제를 경험 중인 분들은 참조하시기 바란다. 이 사항은 프로그램의 도움말에다가도 "알려진 문제"에다가 수록했다.

이상. 또 프로그램 개발과 관련한 좋은 소식이 있으면 소식을 업데이트 하도록 하겠다.

Posted by 사무엘

2015/01/11 08:42 2015/01/11 08:42
Response
No Trackback , 4 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1049

<날개셋> 한글 입력기 7.7

2014년의 끝을 앞두고 <날개셋> 한글 입력기가 새 버전이 나왔다.
그 어느 때보다도 다방면에서 리팩터링, 기능 추가, 버그 수정이 진행되어 프로그램의 완성도가 더욱 향상되었다. 이 글은 지난달에 썼던 GUI 개선 사항에다 또 덧붙여진 주요 변화 사항에 대한 설명이다.

※ 한글 입력 관련

1. 일부 특수글쇠의 '두벌식 종성' 지원 강화

'도깨비불', 그리고 '초· 종성 교환' 특수글쇠가 두벌식 종성까지 감안해서 동작하게 했다.
전자의 경우, 두벌식 종성 글쇠로 '않' 같은 글자를 입력하고 있었다면 '안ㅎ'에서 ㅎ이 초성이 아닌 종성 형태로 분리되어 나온다. 또한 지금까지 이 글쇠는 종성이 단독으로만 있을 때는 동작하지 않았지만, 이제는 종성 단독이더라도 ㄶ 자음끼리 분리가 가능할 때는 동작하게 알고리즘을 개선했다.

후자의 경우를 설명하자면 이렇다. '강'이라는 글자를 '악'이라고 바꿔 주는데, 애초에 글자를 두벌식 종성으로 입력하고 있었다면 이때에도 '악'을 지울 때 ㅇ은 비록 지금은 초성 모양이지만 처음에 종성으로 입력한 것처럼 재현을 해 준다. 이런 변칙적인 상황에 대한 배려를 추가했다. 두벌식은 역시 세벌식보다 근본적으로 처리가 복잡한 방식임을 알 수 있다.

2. 외부 모듈에서 글쇠를 인식하는 알고리즘 개선

사용자에게는 예전 것이나 지금 것이나 큰 차이가 안 느껴지겠지만, 이번 버전에서는 외부 모듈도 글쇠를 인식하는 뼈대 부분을 다시 구현했다.
이 과정에서 외부 모듈에서는 구조적으로 Alt 조합의 인식이 지원되지 않는다는 것을 UI 차원에서 확실하게 표시하게 했다. 외부 모듈에서 단축글쇠 추가/편집 대화상자를 꺼내면 Alt에 해당하는 슬라이더가 사용 불가능 상태가 된다.

또한 우리 프로그램이 가로채지 않는 글쇠는 조합이 있는 중에도 확실하게 가로채지 않게 동작을 개선했다. 예를 들어 space 같은 글쇠는 예전까지는 한글을 조합 중일 때 누르면 우리 프로그램이 언제나 가로채지만 다음 버전부터는 그걸 가로채지 않고도 모든 구현체에서 조합 종료 처리도 매끄럽게 된다.

3. 초-종성 공유 방식의 종성 결합에 대해 가상 낱자와 낱자 치환 규칙 자동 적용

글쇠 수가 매우 적은 휴대전화 입력 방식에서는 어지간한 거센소리나 된소리 계열 자모도 2타 이상의 합성으로 만들곤 한다. 그렇기 때문에 조합 과정에서 ㄴ+ㅇ, ㄱ+ㅆ처럼 현실에서 존재하지 않는 낱자를 특히 종성에다 임시로 풀어서 표현해야 하는 일이 생긴다.

앞부분을 표현하기 위해서는 기존 가상 낱자를 쓰면 되고, 현재 글자의 경계를 넘어가는 뒷부분을 표현하기 위해서는 지난 7.4 버전에서부터 고급 입력기에다 '낱자 치환' 규칙이 추가되어 현재는 이 문제가 깔끔하게 해결되었다.
그러나 ㄴ+ㅇ을 300 같은 가상의 낱자 결합으로 등록하고, 그 300에 대해서 ㄴ과 ㅇ에 대한 표현 규칙을 일일이 등록해 줘야 하는 번거로운 문제가 여전히 남아 있었다.

이번 버전에서는 그 문제까지 싹 해결했다.
'고급 입력기'를 문자 생성기로 사용하고 '초· 종성 공유 낱자 결합' 옵션이 지정된 상태에서
종성 A+B=C에 해당하는 C라는 종성을 조합하는 상태가 됐고, C는 물리적으로 표현 가능한 낱자의 범위를 초과하는 값이고
C에 대해 다른 가상 낱자나 낱자 치환 규칙이 존재하지 않는다면...

이 복잡한 조건을 모두 만족할 경우 <날개셋> 한글 입력기는 자체적으로 C를 종성 A와 다음 글자 초성 B로 풀어서 표현해 준다.
그래서 당장 천지인, 나랏글 같은 예제 입력 방식에서도 300 이후의 수십 개의 종성 결합이 존재하지만 그에 대한 가상 낱자와 낱자 치환 규칙은 이제부터 삭제되었다. 이제 그런 추상적인 낱자는 낱자 결합 규칙에다가 한 번만 지정해 주면 되니, 휴대전화 입력 방식을 구현하기가 더욱 수월해졌다.

4. 수식 변수에 대소문자 구분 추가

예전에도 한번.. <날개셋> 한글 입력기의 글쇠 수식에서 변수의 용도 구분과 공간 부족이 앞으로 문제가 될 수 있다고 언급한 적이 있었다. 이 문제를 간단한 방법으로 깔끔하게, 완전히 해결했다. 변수는 여전히 알파벳 한 글자이긴 한데, 여기에다가 대소문자 구분을 추가함으로써 지원되는 변수의 개수를 종전의 두 배로 늘린 것이다.

그리고 이 프로그램이 버전업되어 입력 스키마 차원에서 여러 변수들이 추가로 제공되더라도, 프로그램은 언제나 오로지 대문자 변수만을 사용한다. 소문자 변수 26개는 사용자가 자신만의 내부 상태를 구현하는 용도로 얼마든지 사용하면 된다. 대소문자이니 형태를 구분하기도 아주 쉽다. 수식을 입력할 일이 있을 때 대소문자 상태만 좀 조심하면 된다.

고유한 내부 상태를 사용하는 복벌식 입력기 플러그 인은 글쇠배열에서 Q 대신 q 변수를 사용해서 수식을 생성하도록 수정되었다.

※ 동기화 관련

5. 타입간에 입력 설정 자료 보존

<날개셋> 한글 입력기의 오랜 숙원이 이뤄졌다.
빠른설정이나 예제 파일을 통해서 '기본 입력 스키마'와 '기본 입력기' 방식으로 어떤 입력 설정이 구축되었는데, 이것을 그대로 '고급 입력 스키마'와 '고급 입력기'에다 가져올 수는 없을까?

입력 항목의 기반 루틴을 넘나들면서 입력 설정을 가져오는 것은 지금 체계에서는 일반적으로 가능하지 않았다. 그래서 편법으로 입력 항목을 XML 방식으로 저장한 뒤, 텍스트 에디터로 object를 수동으로 고쳐서 다시 불러오는 것밖에 방법이 없었다. (어차피 기본이든 고급이든.. 공통 설정은 공통된 XML 형태로 저장을 하기 때문에 가능한 일)

이제는 사용자가 원한다면 이 일을 프로그램이 직접 해 준다.
입력 스키마나 문자 생성기를 변경하고 나면 '초기화' 버튼의 메뉴에 '예전 설정 가져오기'라는 명령이 사용 가능해진다. 그리고 이것을 선택하면 변경 전에 사용하던 입력 스키마/문자 생성기가 갖고 있던 설정을 지금의 입력 스키마/문자 생성기에다가 적용을 하게 된다.

앞으로 고급 입력 스키마와 고급 입력기가 많이 쓰이게 될 텐데 이것은 꼭 필요한 기능으로 자리잡을 듯하다.
당연히, 고급에서 쓰이던 설정을 기본으로 가져오는 것도 가능하다. 기본이 지원하지 않는 기능에 대한 설정치들은 물론 소실된다.

6. 처음에 무조건 지금 default로 지정되어 있는 입력 항목으로 구동

지금까지 외부 모듈의 '고급 시스템 옵션'에는 TSF 지원 확장 하나밖에 옵션이 없었는데, 다음 버전에서는 옵션이 두 개가 더 추가되었다. 하나는 위의 기능인데, 이것은 유용하다면 굉장히 유용한 옵션이다.

Windows 운영체제는 프로그램들의 GUI에 내부적으로 한영 상태를 관리하고 있다. 외부 모듈들은 그 상태를 따라 동작하며, 자신의 상태와 운영체제의 상태 중 어느 하나가 바뀌면 다른 한쪽도 알아서 동기화를 해야 한다. <날개셋> 한글 입력기 역시 외부 모듈 구현체는 그런 규격을 따르며 동작한다.
이런 공통 프로토콜이 스펙에 규정되어 있기 때문에 응용 프로그램은 자신이 지금 무슨 IME를 사용하고 있든지간에 소프트웨어적으로 한/영 상태 정도는 강제로 바꾸는 게 가능하다.

그런데 <날개셋> 한글 입력기 외부 모듈은 사용자가 직접 글자판을 강제로 전환하지 않았다면 자기가 먼저 운영체제의 상태는 절대로 바꾸지 않는.. 일종의 read-only 전략으로 개발되었다. 이것은 MS 한글 IME도 동일하게 따르는 정책이다.

그래서 입력 설정상으로 한글 글자판이 지정돼 있더라도 그 내부 상태가 영문이라면 <날개셋>도 자기 설정을 무시하고 빈 입력 스키마 계열을 기본으로 선택하며, 그런 게 없으면 자동으로 추가도 했다. 이런 동작 방식을 이상하다고 지금까지 사용자들로부터 문의도 엄청 많이 받았다.

하지만 "안 되면 되게 하라" 정신으로.. 이 옵션을 켜 주면 외부 모듈도 편집기처럼 무조건 설정대로 동작하며, 운영체제의 상태를 자신의 상태에다 강제로 맞춰 버린다. 프로그램이 실행되자마자 영문이 아닌 한글 모드에서 시작하는 것도 이제 가능하다. 운영체제의 여타 외국어 IME/글쇠배열을 <날개셋> 한글 입력기와 병행해서 쓰는 것도 좀 더 수월해질 것이다.

7. 응용 프로그램간에 <날개셋> 한글 입력기의 활성 입력 항목 동기화

Windows 8부터는 응용 프로그램간에 사용하는 키보드 로케일/IME와 내부 한영 상태가 모조리 자동 동기화되는 옵션이 추가되었으며 이 방식이 기본으로 지정되어 있다. 하지만 운영체제가 동기화해 주는 것은 한글 아니면 영문이라는 이분법적인 논리값인 반면, <날개셋> 한글 입력기는 3개 이상의 임의의 개수의 입력 항목을 가질 수 있다. '한글'이라고 분류되는 입력 방식 중에 세벌식, 두벌식, 드보락 같은 것은 여전히 응용 프로그램별로 따로 놀며, 동기화되지 않는다.

이 옵션을 켜면 <날개셋> 한글 입력기는 프로그램간에 자기가 사용하는 구체적인 입력 항목의 번호까지 동기화해 준다. 즉, 한 프로그램에서 입력 항목을 다른 걸로 전환하고 다른 프로그램으로 이동하면, 그쪽에서도 그걸로 동기화가 된다.
이 기능은 완전 만능 동기화 기능은 아니고 운영체제의 내부 상태가 맞아야만 동작하는 등 이것저것 단서와 제약이 있긴 하지만(도움말에 명시되어 있음), <날개셋> 한글 입력기를 Windows 8 스타일에 맞춰서 좀 더 매끄럽게 사용하는 데 큰 도움을 줄 것이다.

※ 기타 다른 개선

8. 버그 수정

Windows 8.1에서 권한 부족한 Metro 앱을 사용할 때, 단어 단위 한자 변환이 되지 않던 문제를 해결했다. 지난 7.4 버전에서 추가되었던 사용자 한자어 사전 연계 기능에 문제가 있음을 뒤늦게 발견했다.
권한 부족한 Metro 앱에서 동작이 실패할 때에 대한 처리를 해야 했는데 그걸 하지 않아서 내부적으로 프로그램이 죽었다가 다시 구동되곤 했다. 이런 실행 모드에서는 화면에 로그조차도 제대로 찍히지 않아서 디버깅을 상당히 특수한 방식으로 힘들게 해야 했다.

조금 더 심각한 문제로는 텍스트 조작을 온전하게 할 수 없는 TSF B급 프로그램에서 지금 글자 앞으로 이동하는 부류의 특수글쇠를 사용했을 때 단순히 거절만 되는 게 아니라 프로그램 전체가 무한 루프에 빠지는 문제가 있어서 이를 해결했다. 이 부분의 로직이 크게 바뀐 바로 직전 7.5에만 있던 문제이다.

그리고 편집기에 있는 '키 입력으로 붙여넣기' 기능이 언젠가 space를 제대로 처리하지 못해서 조합 중이던 한글이 덧난 채 붙여지던 문제를 해결했다. 이 역시 아마 이 부분 로직이 크게 바뀌었던 7.4때부터 생긴 버그가 아닌가 싶다.
Windows 7은 콘솔에서 세벌식을 사용할 때 '다다.' 이런 식으로 글자가 덧나는 문제가 있었는데 그런 것과 기술적으로 비슷한 문제이다.

이에 덧붙여 편집기의 '현재 편집 중인 문서의 경로 복사' 기능이 언제부턴가 텍스트를 클립보드에다 제대로 저장하지 않고 있던 문제, 그리고 아무 문자를 입력하지 않을 때에도 겹침 모드에서는 뒷글자를 무조건 하나씩 지우던 사소한 문제도 해결했다. 이것도 아마 7.4~7.5 사이에 슬며시 들어간 버그가 아니었나 싶다.

9. 제어판에서 설정 파일을 초기에 저장하는 위치

날개셋 제어판에서 글쇠배열, 유형, 전체 설정 등.. 뭔가 파일로 설정 데이터를 열 때는 처음엔 예제 데이터가 있는 디렉터리가 시작 위치로 표시된다. 그러다가 파일을 한번 저장하고 나면 마지막으로 저장했던 파일이 있는 디렉터리가 열 때에도 그대로 표시된다.

그런데, 최초로 저장을 할 때는 지금까지 기본 입력 설정 파일이 저장되는 생뚱맞은 이상한 디렉터리가 표시되곤 했다. 이것을 개선하여 이제는 사용자에게 친근한 '내 문서' 디렉터리가 표시되게 바꿨다. 지금까지 이게 상당히 불편한 점이었을 것 같다.
단, 전체 설정(set)은 제공되는 예제 데이터가 없기 때문에 저장뿐만 아니라 '열기'를 처음 할 때도 '내 문서'에서 시작한다.

10. 사용자 정의 후보 관련

7.0에서 첫 도입되었던 사용자 정의 후보 관련 기능에도 엔진이나 GUI에 이것저것 개선이 있었다.
(1) 외부 후보 파일을 불러왔을 때 설명문이 space 이후가 몽땅 잘려서 출력되던 어이없는 버그가 이제야 발견되어 고쳤다. (신고해 주신 분께 감사~)

(2) 그리고 후보 데이터를 추가하는 버튼을 Ctrl을 누르고 클릭하면... 후보 데이터를 한 덩어리로 등록하는 게 아니라 각 글자 단위로 독립적으로 한꺼번에 등록하는 기능을 추가했다. 즉, "☆★○●◎"이라고 입력하고 Ctrl+클릭을 하면 ☆, ★, ○, ●, ◎ 라고 5개의 후보 문자들이 떼어져서 등록되는 것이다.

(3) 이 외에도, 호환용 한글 자모 하나를 사용자 정의 후보의 key값으로 등록해 놓으면, 유니코드 표준 자모로도 그 key에 접근할 수 있게 했다.
초성 자음 중에 ㅉ은 한자 키 특수문자 변환이 전혀 존재하지 않는 유일한 낱자이다. 그리고 모음이나 종성 겹받침도 자리가 비어 있다. 그렇기 때문에 이런 자리에다가 사용자가 자주 사용하는 상용구나 특수문자를 제2 후보에 내장형으로든 외장형으로든 등록해 놓고, "한자 1 + 오름차순 포워딩" 또는 "한자 2 + 내림차순 포워딩"을 쓰면 기존 한자 변환과 내 custom 변환을 손쉽게 같이 쓸 수 있다.
물론, 낱자뿐만 아니라 한자 독음이 없는 한글, 가령 '바'나 '카' 같은 것도 유용하게 활용할 수 있다.

11. 사용자의 건의를 반영한 GUI 개선 추가분

사용자 삽입 이미지
제어판 대화상자가 대화상자 자체의 크기뿐만 아니라 좌우(분야 vs 각 항목)의 내부 크기 조절도 드디어 가능해졌다.
단, 좌우의 폭은 양쪽 모두 지금보다 키우는 것만 가능하지, 줄이는 것은 가능하지 않다.
좌우의 크기 조절이 가능하려면 먼저 대화상자의 폭부터 더 키워야 한다.

사용자 삽입 이미지
많은 사용자들의 요청에 힘입어, 글쇠배열 수식 대화상자도 가로로 크기 조절이 가능해졌다. 생각보다 길고 복잡한 수식을 고안해서 사용하는 분들이 많은 줄을 이제야 알았다. ㅎㅎ
3.0 버전 이래로 거의 10년간 S, P, N, L 등 알아보기 어렵게 돼 있던 인접글쇠 버튼들 역시 저렇게 깔끔하게 바꿨다.

12. 설명문 추가

<날개셋> 한글 입력기에서 XML 저장이 가능한 단위인 글쇠배열, 입력 항목(유형 ist), 전체 입력 설정(set)에 대해서..
자신만의 고유한 설명문을 집어넣는 기능을 추가했다. 그리고 옵션을 줄 경우, 사용자가 제어판에서 해당 파일을 불러왔을 때 그 설명문을 반드시 먼저 사용자에게 표시하게 할 수 있다.

이 입력 방식은 언제 누가 만들었고 버전과 저작권이 어떻게 되며 제작자와 연락은 어떻게 하는지 등의 정보를 설명문에다 간단히 기재해 넣을 수 있다.
또한 복잡한 글쇠배열의 수식 로직 해설을 메모해 두는 용도로도 쓸 수 있으니 여러 모로 유용하다.

Posted by 사무엘

2014/12/05 08:29 2014/12/05 08:29
Response
No Trackback , 6 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1036

다음 버전 개발 근황

오랜만에 또 <날개셋> 한글 입력기의 다음 버전 개발 근황을 올릴 때가 됐으니 관련 소식을 전하도록 하겠다.
이제 <날개셋> 한글 입력기는 7.x 후반이나 8.0에서 진짜로 고정판, 최종 완성판에 도달하는 걸 목표로 하고 있다. 고지가 얼마 안 남았다. 그 뒤로는 그냥 그때 그때 생각 난 기능이나 버그 수정 정도로만 유지 보수가 될 것이다. 그리고 신규 기능 개발보다는 이미 만들어 놓은 기능에 대한 홍보와 문서화, 포팅에 더 비중을 둘 것이다.

지난 7.4와 7.5는 한글 입력 엔진 쪽을 갈아엎느라 GUI 부분을 살펴볼 여유가 상대적으로 부족했다. 그래서 7.5를 공개하자마자 지체없이 다음과 같은 작업이 진행되었다.

1. 다국어 UI 지원 체계 개편

<날개셋> 한글 입력기가 허접하게나마 다국어 GUI를 지원한 건 2.32 버전부터였다. 그러나 영어 한 언어로 한정이었고 편집기 프로그램만 임시방편으로 지원하는 것이었다.
그러다가 2007년에 나온 4.55 버전부터 자체적인 다국어 UI 컬렉션 파일과 함께 임의의 언어를 지원하는 길이 열렸다. 물론 구조만 그렇게 만들어 놨지, 지금까지 실질적으로 제공된 외국어는 영어 하나뿐이긴 했지만 말이다.

하지만 그 구조는 완전하지 못했다. 고유 포맷을 사용하는 다국어 UI 컬렉션 파일은 자작한 툴을 이용해서 비교적 복잡한 과정을 거쳐야만 생성할 수 있어서 비효율적이었다. 그리고 그 파일에 모든 외국어 UI가 들어가는 건 아니었으며, 기존 Help, Dic 같은 데이터 디렉터리에 다국어 구분이 필요한 파일과 그렇지 않은 파일이 섞여 있었다.

프로그램 디렉터리 한 곳에다가 압축만 쭉 풀어 줌으로써 중국어나 일본어 같은 새로운 언어를 손쉽게 추가할 수 있게 하는 게 내 목표였는데.. 실질적으로는 그렇게 되지 못했다.
그래서 다 바꿨다.

일단 언어 식별을 kor, eng 같은 자체적인 명칭으로 하는 게 아니라, 1033 (영어 미국), 1042 (대한민국) 같은 운영체제가 사용하는 숫자를 그대로 따르도록 하고, 'lang/숫자' 아래에.. Help나 Dic 같은 디렉터리를 다시 둬서 언어 구분이 필요한 파일들이 들어가게 했다. 언어 구분을 파일 이름으로 하는 게 아니라 한 디렉터리 아래에서 한꺼번에 되게 한 것이다.

그리고 고유 포맷을 사용하는 파일을 버리고 각 모듈별로(ngs3, ngsedit 등) 역시나 전통적인 리소스 DLL을 사용하게 했다. 리소스 DLL은 비주얼 C++ 같은 툴에서나 손쉽게 고치고 생성할 수 있다.
이걸 뜯어고치는 과정에서 프로그램 내부의 여러 부분을 리팩터링하고 잠재적 버그들을 고쳤다. 특히 프로그램의 주 인스턴스 핸들과 리소스 DLL 핸들 사이의 구분이 더욱 엄밀하게 바뀌었다. 예전에는 별도의 파일을 썼으니 그 정도 구분이 필요하지 않았기 때문이다.

단적인 예로, 대화상자를 생성할 때 별 생각 없이 넘겨 주던 인스턴스 핸들은 리소스 DLL이 아니라 자기 프로그램의 인스턴스를 넘겨 줘야 한다. 안 그러면 자기 프로그램이 만든 내부 custom control (CS_GLOBALCLASS가 지정되지 않은 것)조차도 생성되지 않는 참사가 벌어진다.

언어 구분이 없는 리소스이기 때문에 FindResource만 쓰면 되는 부분과, FindResourceEx로 반드시 구분을 해야 하는 곳도 용례를 다시 살펴봤다. FindResource는 어찌 된 일인지 함수 인자가 모듈, 이름, 카테고리의 순인 반면, Ex 버전은 "모듈, 카테고리, 이름"으로 순서가 더 자연스럽게 바뀌기도 했다. LOAD_LIBRARY_AS_DATAFILE 옵션을 주고 불러온 DLL은 그저 훌륭한 데이터 셔틀일 뿐이긴 하다.

이걸 뜯어고치는 것은 결과적으로 <날개셋> 한글 입력기 소스를 더욱 질서정연하게 만든 나름 즐거운 작업이었다.
덤으로, 지금까지 제어판의 '외부 모듈 관리'에서 중국어 입력기들의 언어를 간체/번체를 구분 못 하던 버그도 잡았다. 3.0 이래로 sub-language가 지금까지 제대로 처리되고 있지 않은 듯했다. 한 작업 덕분에 여기저기서 관련 버그들이 일망타진된 것이다.

2. 작은 차이이지만..

날개셋문자를 입력받는 대화상자에서..
한글 자모를 구성하는 타입을 지정하면 아래의 그림과 같이 한글 자모를 입력받는 콤보 박스가 초중종 순으로 나란히 뜬다.

그런데, '한글 중종/초'나 '한글 종/초중' 타입을 지정했을 때는 그 콤보 박스도 초중종 순이 아니라 중종초나 종초중 순으로 뜨게 했다. 이들 날개셋문자는 세 성분을 그렇게 두 음절에 걸쳐서 문자 생성기로 전달하기 때문이다.
문득 생각이 떠올라서 구현해 봤는데 이렇게 하는 게 훨씬 더 직관적이고 좋다.

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

3. 단축글쇠 규칙

편집기 계층의 단축글쇠 규칙과, 기본 입력 스키마의 추가 글쇠 규칙 리스트에서..
아이템들을 선택한 후 드래그 드롭으로 순서를 조정할 수 있으며, 헤더를 클릭한 경우 정렬이 되게 했다.

리스트 컨트롤의 아이템들을 정렬하는 메시지는 LVM_SORTITEMS인데, 나중에 LVM_SORTITEMSEX도 추가되었다. 그 이유로는.. LVM_SORTITEMS는 정렬 비교용 콜백 함수에다가 LVITEM에 있던 lParam값만을 달랑 넘겨 줬기 때문이다.

그렇기 때문에 lParam만으로는 각 아이템이 원래 갖고 있던 문자열 같은 걸 참조할 수 없었으며, 이 때문에 lParam이 아니라 아예 아이템 인덱스 값을 넘겨주는 EX 버전이 윈도 98 즈음에 추가되었다. API 내력이 다소 안습하다.
단, qsort와는 달리 콜백 함수에 사용자가 지정한 user data도 같이 넘어오게 되어 있는 것은 바람직한 디자인이라 여겨진다. 이것은 EX뿐만 아니라 오리지널 버전도 처음부터 그랬다.

인덱스 번호를 받았다 하더라도 매번 2개의 LVITEM 구조체를 세팅하는 건 상당히 번거로우니, 정렬 비교를 위한 클래스를 따로 만들어서 LVITEM 구조체를 세팅해 놓고(mask, pszText, cchTextMax 따위), 비교 함수 호출 때는 인덱스 번호(iItem)만 세팅한 뒤에 곧바로 LVM_GETITEM를 호출하는 게 효율적일 것이다.

그리고, 트리 및 리스트 컨트롤에서 아이템의 드래그 드롭을 구현하는 것은 굉장히 노가다스러운 작업으로 Windows 프로그래밍 업계에서 악명이 높았다. 운영체제는 그저 아이템 드래그가 시작되었다는 이벤트만 날려 줄 뿐, 그 뒤부터 실질적인 드래그 드롭 처리는 전적으로 프로그래머가 알아서 해야 한다.

그 처리는 뭔가 패턴이 있는 것 같으면서도 상황별로 제각각 customize해야 하는 것도 미묘하게 있어서 더욱 까다로운데, 본인은 이미 드래그 드롭이 구현되어 있는(입력 항목의 이동 및 복사) '분야' 트리의 코드를 적극 재활용했다.

공통된 부분은 클래스로 만들고, 드래그 이미지를 생성하는 부분, 마우스 포인터로부터 hit test, 특정 아이템을 드래그 타겟으로 지정하는 부분처럼 customize가 필요한 부분만 가상 함수로 빼냈다. 그리고 트리 컨트롤의 HTREEITEM이든 리스트 컨트롤의 int 인덱스이든 구애받지 않는 추상적인 인덱스 자료구조를 설계했다.
드래그 함수는 드래그 중에 복사의 허용 여부 (0. 불능, 1. Ctrl 눌렀을 때 가능, 2. 읽기 전용 컨텐츠이기 때문에 무조건 복사)를 인자로 받아서 타겟 아이템과 복사 여부를 되돌린다.

이번 글은 기능 설명뿐만이 아니라 유난히 코딩 디테일 설명이 많은 듯한데, 아무튼 그런 과정을 거쳐 해당 기능이 깔끔하게 잘 구현됐다.

4. 입력 설정 테스트 대화상자

제어판의 시스템 메뉴에 딸려 있는 '입력 설정 테스트' 기능에다, 현재 사용 중인 입력 항목을 표시하고 굳이 단축글쇠 없이도 손쉽게 바꾸는 기능을 추가했다.
이 대화상자의 입력란은 <날개셋> 편집기 같은 다른 프로그램과는 별도의 컨텍스트에서 동작하기 때문에 내부적인 입력 상태를 알 방법이 없어서 불편했는데.. 이걸 추가해 주니 아주 편하다.

사용자 삽입 이미지

5. 수식 입력란에 풍선 도움말

그리고 이건 번개같이 아이디어가 떠올라서 집어넣었다. Bravo!
이 간단한 풍선 도움말을 왜 지금까지 넣을 생각을 안 했는지 모르겠다~!

암호 같은 각종 수식들에서 최소한 사용할 수 있는 변수들이 무엇이고 그게 의미하는 값이 뭔지는 간단히 바로 알 수 있게 했다.
그래도 연산자라든가 날개셋문자 notation (H3, C0, G_, BS 등등..)에 대해서는.. 지면이 부족해서 도저히 실을 수 없으니 추가적으로 도움말을 보고 공부를 해야겠지만..
이런 간단한 도움말이라도 있는 게, 없는 것보다는 백만 배 낫지 않으신지..?? ^^;;

풍선 도움말은 수식 입력란이 포커스를 받는 순간 나타나며, 한 세션당 총 3회만 나타난다. 매번 무조건 뜨는 것도 번거로울 수 있으니까.

사용자 삽입 이미지
6. 단축글쇠 규칙을 편집할 때의 날개셋문자-특수글쇠 목록

글쇠배열처럼 날개셋문자를 받는 수식 입력란에는 근처에 날개셋문자를 만드는 대화상자를 꺼내는 버튼이 따로 있다. 글쇠배열뿐만 아니라 편집기 계층의 단축글쇠 규칙에도 글자판(입력 항목) 전환뿐만 아니라 날개셋문자를 보내는 기능이 있기 때문에 날개셋문자 생성 대화상자를 여는 기능이 사용자 편의 차원에서 마련돼 있다.
그런데, 단축글쇠 규칙을 통해서 날개셋문자 대화상자를 열고 나면.. '특수글쇠(특수 코드)' 용도로 갔을 때 특수글쇠가 bksp나 후보 변환 같은 아주 기본적인 것 몇 개밖에 있지가 않다.

이것은 특수글쇠가 원래는 편집기 계층이 아니라 입력기 계층 아래에 있는 문자 생성기의 관할에 있기 때문이다.
글쇠배열이야 입력 스키마 계층이고 자신에게 연결된 문자 생성기를 바탕으로 지원되는 특수글쇠를 얻어 오면 되지만, 편집기 계층에서는 이 단축글쇠가 무슨 문자 생성기와 연결될지 알 수 없기 때문에 아무 문자 생성기에나 공통적으로 적용되는 것만 가져오게 했기 때문이다.

이것이 불편한 점으로 인식되어 다음 버전에서는 개선이 이뤄졌다.
단축글쇠 규칙을 통해 날개셋문자 대화상자를 연 경우, 현재 '활성화돼 있는' 입력 항목을 기준으로 그 문자 생성기가 지원하는 특수글쇠들을 모두 가져온다.
따라서 빈 입력기나 영문 쿼티/드보락 같은 걸 사용하다가 제어판을 열면 예전처럼 기본적인 것밖에 있지 않을 것이고, 한글 입력을 기준으로 제어판을 열면 <날개셋> 기본 입력기가 지원하는 특수글쇠들을 모두 보면서 고를 수 있게 된다.

편집기 계층에다가 단축글쇠로 날개셋문자를 강제 입력할 정도라면 일반적인 평범한 문자보다는 조합 강제 종료 같은 특수글쇠일 가능성이 높은데 이런 조치를 통해 프로그램을 사용하기기 더 편리해질 것이다.

7. 제어판 편집기 계층 탭의 GUI 일부 개선

이것도 사소하다면 사소한 것이지만..

사용자 삽입 이미지

<날개셋> 한글 입력기는 1.0 시절부터 한글 조합 중에 Del/화살표 키가 입력됐을 때 cursor 이동을 어디를 기준으로 할지를 지정하는 옵션이 존재했다.
1.0부터 지금까지 그 옵션은 체크 형태로 어설프게 존재하였으나.. 이번 버전에서는 드디어 이렇게 콤보 박스로 바뀌었다.
아무리 이분법적인 간단한 옵션이라고 해도.. 남자 여자 성별을 고르는 UI를 체크 박스로 처리할 수는 없는 노릇 아닌가.

Posted by 사무엘

2014/11/13 08:18 2014/11/13 08:18
Response
No Trackback , 4 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1028

지난 14년간 개발되어 온 <날개셋> 한글 입력기의 유구한 역사를 표 하나로 요약하면 다음과 같다. 문득 이런 표를 한번 만들어 보고 싶었다. ^^

버전 플랫폼/모듈 구조 편집기의 에디팅 엔진 입력 기능 기타
1 ('00) 편집기+라이브러리 2바이트 조합형 기반. 옛한글 지원 안 함
줄당 글자수 제한 있었음
16비트 입력 단위
글쇠배열만 차이가 나는 2개의 입력 항목
세벌식 모아치기, bksp 없이 낱자 수정, bksp 달라붙기+역도깨비 등의 세벌식 응용 기능 최초 제공
 
2 ('02) 초보적인 수준의 플러그 인과 TSF 모듈 한컴 2바이트 기반+완조형 옛한글
줄당 글자수 무제한+탭+자동 줄바꿈 최초 지원
32비트 입력 단위
최대 4개의 독립된 입력 항목
입력 설정치의 한계값이 더 커짐
가상 낱자, 최종 변환 규칙 도입
한글 입력 순서 재연 기능 최초 도입
편집기 프로그램은 이때 지금과 같은 골격을 거의 갖춤
3 ('04) 유니코드 API 기반
최초로 외부 모듈 도입
플러그 인 구조 확립
지금과 같은 파일 구조, 제어판 UI 확립
유니코드. 조합형 옛한글 표현 가능해짐
TSF+운영체제 IME를 통한 입력도 지원
불연속 다중 블록, drag & drop 최초 지원.
초보적인 수준의 undo 지원
64비트 입력 단위 확립
임의의 개수의 입력 항목과 전환 규칙 (단축글쇠)
한글 여러 성분을 한 글쇠에 한꺼번에 배당
입력 스키마+문자 생성기 계층 확립
글쇠와 오토마타는 수식 기반
임의의 문자 조작 프로토콜 뼈대 첫 도입
특수 도깨비불, 결합 축약 규칙, 사용자 정의 조합
지금과 같은 형태의 제어판 UI
도움말 전면개정
4 ('06) 64비트 바이너리 도입
지금과 같은 디렉터리 구조 확립
외부 모듈 안정화, Windows Vista 규격 지원 추가
undo 알고리즘이 훨씬 더 강력해짐
조합 상태를 표시하는 방법(cursor/밑줄 등)이 더 정교해짐
세로쓰기 지원
  다양한 외부 글쇠배열 파일 읽기 기능
XML parser, 상수 명칭 테이블 도입
외부 모듈에서 옛한글 입력 가능해짐
지금과 같은 형태의 다국어 UI 지원
5 ('08) 변환기, 입력 패드 도입
입력 설정 파일 포맷이 지금과 같은 형태로 완전히 정착함
시스템 DLL 의존 방식 변경
유니코드 5.2 옛한글 추가 지원
비정규화 문자열도 정상 처리하고 비표준 동작 없어짐
임의의 조합 테이블을 내장한 한글 글꼴 지원
문자 조작 프로토콜 1차 개정
보조 입력 도구 도입
다중 문자, 음절 구분 방식이 다른 다중 한글 자모 추가
예제 입력 도구 추가
6 ('11)   대용량 데이터를 처리하는 속도가 훨씬 더 빨라짐
텍스트 변경 후 화면을 갱신하는 알고리즘을 전면 개선함
초-종성 공유 낱자 결합 규칙, 두벌식 종성 전용 타입
자동 조합 종료 타이머
bksp 동작 방식 세분화
단어 단위 한자 변환
사용자 정의 글쇠 인식 기능
다양한 텍스트 필터 추가
도움말 전면개정
7 ('13) 외부 모듈에 Windows 8 지원 추가   내부 입력 로직 및 (한글 입력 순서 재연 기능) 전면 개편
문자 조작 프로토콜 2차 개정
후보 변환 기능 세분화(#1~#4)
글자판 전환 수식에 C, N 변수 추가
bksp 동작 연쇄 적용 옵션
고급 입력 스키마, 고급 입력기에 고급 치환 기능 추가
TSF A급 한정, 외부 모듈에서도 옛한글에 대한 고급 조작 가능해짐
프로그램 아이콘 전면개정

1.x부터 7.x까지 각 메이저 버전대에서 이뤄진 진짜 중요한 과업들을 정리하였다. 저 표에 아이템 한 줄을 적기 위해서 최하 수 주~한두 달 가까이 작업을 해야 한 것들이 즐비하다. 14년 짬밥이 어디 간 게 아니다.

역시 3.x대가 제일 파격적인 변화가 많았다. 그러나 그 변화가 사용자들에게 제대로 와 닿기 위해서는 4.x 이후에서 도입된 무수한 편의 기능들이 뒷받침돼야 했다.

각 시기별로 중점적으로 개발이 진행되었던 분야가 있다. 일종의 유행이랄까? 가령, 4.x때는 여러 분야에서 발전이 있었지만 한글 입력 본연의 역할과 관련된 기능이 추가된 건 거의 없었다.
그 반면, 5~6.x까지 거치면서 프로그램의 모듈 구조나 에디팅 엔진 등이 그럭저럭 완성된 뒤에는 지금까지 오로지 한글 입력 엔진 쪽에만 미친 듯이 작업이 진행되고 있다. 굵고 붉은 단어가 현재의 작업 내역이다.

7.x대에서 <날개셋> 한글 입력기의 완전체 진입이 이뤄지지 않으려나 희망을 걸어 본다.

Posted by 사무엘

2014/10/21 08:30 2014/10/21 08:30
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1020

1. 잡설: 개발 후기

늘 느끼는 거지만 코딩 작업은 머리를 짜내고 멘탈을 갈아넣을수록, 그 투입한 input에 비례해서 output은 늘 좋게 나온다.
이런 식의 개발 작업 살생부를 만들어 놓고, list에서 체크 표시가 하나씩 늘어 가는 게 내 인생의 기쁨이었다. 그럼 내가 마치 무슨 암살자가 된 듯한 느낌이랄까. 해치운 아이템들은 체크 표시를 하고 목록에서 지운다.

사용자 삽입 이미지

이제 자꾸 살생부에 살생 대상 아이템이 추가되지는 않았으면 좋겠다. 나도 이제 다른 연구도 하고 연애도 하고 결혼도 좀 해야지? ㄲㄲ

테트리스에는 수직 작대기가 있고 퀘이크 3 Arena에는 레일건이 있으며, 카트라이더에는 니트로 부스터와 드리프트가 있다.
그렇다면 프로그래밍에서 그런 카타르시스와 중독성을 선사하는 요소가 무엇일까? 바로, 공통된 코드 패턴을 한 클래스나 함수로 뽑아내고, 여러 클래스들 중에서도 공통된 요소를 템플릿이나 기반 클래스로 뽑아낼 때가 아닐까 싶다.
같은 기능을 더 적은 시간과 메모리로 수행하는 방법을 찾아내는 것도 좋긴 하지만, 본인은 그런 성능 최적화보다도 복잡함에서 질서를 찾아낼 때가 더 즐겁다. 프로그래밍이라는 건 정말로 극도의 복잡도를 제어하는 지적 노동이기 때문이다.

예전에도 했던 말이 또 반복되는 듯하지만, 한글 입력 패러다임의 관점에서 봤을 때 세벌식은 한글 본연의 성능을 올리고 최적화하는 데 적합하다. 그 반면 두벌식은 직관적이지 못하기 때문에 자동화 처리를 위한 프로그래밍의 관점에서 도전적인 과제가 많다.
두벌식에서는 세벌식처럼 초성 글쇠는 반드시 초성으로, 종성 글쇠는 반드시 종성으로 일대일, 필요충분관계로 대응하는 게 아니다. 문맥에 따라서 종성 글쇠가 초성 역할을 할 수 있고, 공유 옵션을 사용하면 초성의 결합 규칙이 종성을 조합하는 데 쓰일 수 있다.

이런 요소들 하나하나가 입력 순서 재연 알고리즘이나 각종 특수글쇠 조작을 꽤 복잡하게 만든다.
현재 한글 입력 스택에서 "초성만 지워라, 종성만 남겨라" 같은 명령을 수행하는데 세벌식은 초중종 직관적으로 대응해서 테이블이 3개만 있으면 되는 게, 두벌식은 저런 추가적인 상황을 고려하느라 4개가 되고 여러 예외 처리가 또 추가된다. 그래도 두벌식도 초성부용종성 원리에 따라 엄연히 한글을 활용하는 방식 중 하나이고, 속도와 능률보다는 글쇠 수가 더 중요한 환경에서는 의미가 있으니, 이 역시 단군의 후손들이 보유한 지적 재산이다. 단지 세벌식을 적용할 필요가 없는 곳에서 2순위로 적용되어야 할 방식일 뿐이다.

이번 7.5 이후로도 후속 개발 작업은 또 지체없이 계속된다. 최소한 내년 초까지 거의 7.8~8.0 정도에 도달할 때까지는.
난 지금까지 남들 안 하는 짓만 골라서 하면서 살아 왔으며 이것을 가능하게 해 주는 것이 '자유'라고 굳게 믿는 사람이다. 나는 자유를 극도로 사랑한다. 내가 정치적으로 북한에 대해 매우 민감한 것도 이 때문이다. 다른 사람들은 어느 환경에서나 머리 잘 굴려서 알아서 적응 잘 하고 요직을 잘 찾아갈지 모르겠지만, 난 자유가 없는 곳에서는 1분 1초도 못 견딘다. “자유가 아니면 죽음을 달라”라는 말을 적극 이해한다.

2. 공지: 늘 최신 버전을 사용할 것을 권장

내 한글 입력기는 자동 업데이트 기능이 없다 보니..
내게 메일로 버그나 오동작 문의를 하는 사용자 중엔 나로서는 상상도 못 할 까마득한 구버전을 사용하고 있는 경우가 종종 있었다.
그 문제는 이미 옛날 옛적에 해결되어 있기 때문에 그냥 최신 버전 업데이트만 해도 저절로 없어지는 경우가 90% 이상까지는 아니지만 그래도 과반은 됐다.

지난 여름엔 무려 4년 가까이 전에 만들어진 골동품인 5.8 버전을 쓰시던 분을 7.4로, 6.x도 건너뛰고 가히 시간 워프를 시켜 드렸다.

나도 강제 자동 업데이트 같은 걸 무진장 귀찮아하는 타입이고, 구버전의 이미 있는 기능만을 만족하고 잘 쓰고 있는 사용자에게 새 버전을 강요할 생각은 전혀 없다.
하지만 구버전에서 명백하게 불만족스러운 문제가 있다면.. 그 경우라면 최신 버전을 살펴보려는 노력을 사용자가 먼저 해야 하지 않겠는가? ㅎㅎ

<날개셋> 한글 입력기는 버전이 올라가면서 뭐 "종성 두벌식", 초종 공유 낱자 결합 규칙, 사용자 정의 후보 데이터, 특수 도깨비불 알고리즘 등등
헤비 유저들만 사용하는 안드로메다급의 복잡한 고급 기능만 추가되는 게 아니라.. 당장 사용자에게 와닿는 외부 모듈의 안정성 같은 것도 꾸준히 눈에 띌 정도로 개선되고 있다.

그렇기 때문에 굳이 모든 기능을 사용하지 않는 사용자라도 어지간해서는 반드시 최신 버전을 써야만 굳이 겪을 필요가 없는 버그 때문에 골치 아파할 일이 줄어든다.
그런데.. IME는 간단히 EXE 하나만 종료한다고 바로 구동을 중지하고 쉽게 업데이트가 가능한 물건이 아니며, 여러 모로 기술적으로 번거로운 요소가 있어서.. 내 프로그램은 부득이 자동 업데이트 같은 건 제공하지 않고 있다. 사용자가 스스로 내 홈페이지를 찾아와서 새 버전을 설치해야 한다.

3. 잡설: 날개셋 한글 입력기와 관련된 팩트들

이 프로그램의 연구 개발과 관련된 활동은 개발자의 대학교 학· 석사 시절에 일부 학점과 졸업 논문을 책임졌다. 그리고 정보 올림피아드를 포함한 소프트웨어 공모전 입상은 덤.

2014년 8월 현재 작업 중인 프로그램의 전체 코드는 6만 7천 줄 정도이지만, 개발자의 특이한 코딩 스타일을 감안했을 때 실제로는 10만 줄을 훨씬 넘는 분량일 것이라 추측되고 있다. (한 줄에 여러 statement를 100칼럼씩 꼭꼭 채워 집어넣기)

이 프로그램이 취급하는 모든 숫자들은 정수이다. 부동소수점 연산은 전혀 존재하지 않는다.

이 프로그램을 구성하는 모든 기계어 코드들은 100% 1인 자작이다. 내부에 타인의 작업물이나 오픈소스 프로젝트 같은 걸 인용한 것은 전혀 없다. 수식 해석, XML 파싱 등등도 전부 자체 제작이다.

이 프로그램은 웹브라우저조차 없는 Windows 95 / NT4 (물론 32비트 에디션 기준) 초창기 판에서도 바로 실행과 사용이 가능할 정도로 특수하게 빌드되었으며 API 최적화가 정밀하게 돼 있다.
한글이 굳이 최신판 컴퓨터과 OS에서야 활용 가능할 정도로 무겁고 복잡한 문자가 아니기 때문에, 이를 활용하는 프로그램도 최대한 가볍게 만들어졌다. 특히 편집기는 마치 기계식 타자기를 컴퓨터로 옮겨 놓은 듯한 아주 작고 가벼운 프로그램이 컨셉이다.

그러면서도 64비트 Windows 7/8이 제공하는 최신 문자 입력 프로토콜도 완벽하게 지원한다.

이 프로그램의 개발 목표는 한글로 무슨 공허한 마술을 부리거나 세계 정복을 하는 게 아니라, 그냥 지금 한글로 당연히 할 수 있는 모든 기술적 가능성을 열어 놓는 것이다. 그 당연한 일이 지금까지 별로 가능하지 않았기 때문에..;;

이 프로그램은 국내에서는 주로 (1) 세벌식 관련 고급 기능, (2) Shift+Space로 한영 전환, (3) 옛한글 처리 (4) 한글과 여타 외국/특수 문자 병행 입력의 목적으로 사용되나, 외국에서는 오로지 (5) 한글 로마자 입력 방식 때문에 입에서 입으로 소문이 퍼지며 사용되고 있다.

Posted by 사무엘

2014/09/15 08:23 2014/09/15 08:23
Response
No Trackback , No Comment
RSS :
http://moogi.new21.org/tc/rss/response/1007

<날개셋> 한글 입력기 7.5

추석 연휴의 끝과 함께 <날개셋> 한글 입력기 새 버전 소식이 기다리고 있다.
7.5. 7.x 중반을 나타내는 좋은 번호이고, 7.4 이후로 기간도 100여 일 남짓 지났으니 시기도 적절하고, 프로그램 역시 그에 걸맞은 충분한 성장을 이뤘다.

단, 이번 버전은 지난 7.4에서 첫 도입된 '고급 입력 스키마' 쪽은 부득이 완전히 아웃 오브 안중이 되었으며 바뀐 것이 거의 없다. 그건 더 후대 버전의 작업으로 우선순위가 밀려났다.
그 대신 7.5에서 집중적으로 한 것은 바로 한글 타자 순서 재연과 연속입력 가능 판단 알고리즘을 처음부터 완전히 다시 만든 것이다. 그리고 두벌식 도깨비불 처리 관련 알고리즘들을 아작을 냈다. 더 구체적으로는,

'일반 두벌식'과 '두벌식 종성' 타입,
그리고 '특수 도깨비불 규칙'과 '초-종 공유 결합 도깨비불 규칙'이
입력, 도깨비불 처리, 역도깨비불 재현, 입력 순서 재계산 기능 등과 연계되었을 때 최대한 일관성 있게 동작하게 했다.
7.4에서 닦은 기초를 바탕으로 앞으로 한 10년은, 어쩌면 영원히 더 고칠 필요가 없을 정도의 퀄리티를 자랑하는 코드가 완성되었다. 이번 여름방학의 최대 성과이고 소득이다. 유용하게 사용하시기 바란다.

1.
예전에는 '두벌식 종성' 날개셋문자를 사용한 "Microsoft 두벌식"을 불러온 뒤,
'틀간 근하 때는' 같은 단어를 "문자열을 글자판 입력으로" 필터로 변환해 보면..
연속 입력이 불가능하다고 글자 사이에 가운뎃점이 잘못 찍히는 문제가 있었다. 이는 오류이다.

그리고 7.4 버전에서는 <날개셋> 고급 입력기가 제공하던 글쇠 치환 규칙의 '음절 강제 분리' 옵션이 없어지고 '한글 로마자 입력기'는 오토마타의 O변수를 통해(두벌/세벌 날개셋문자) 음절 강제 분리 여부를 결정하게 바뀌었다.
그런데 예전의 입력 순서 재계산 알고리즘은 이 O변수를 제대로 감안하지 않았기 때문에 이로 인해 입력 순서를 제대로 못 찾는 문제를 일으켰다.

<날개셋> 한글 입력기에 7.5 이전과 같은 골격으로 한글 입력 순서를 찾는 기능이 처음으로 도입된 건 무려 2.3 버전부터이다. 그리고 연속 입력 가능 여부를 찾는 기능은 3.9에서 추가되었다. 그 뼈대에다가 특수 도깨비불, 초-종 공유 결합 규칙, '두벌식 종성' 날개셋문자 등 새로운 옵션들을 추가로 감안하는 기능이 추가되어 왔으나 로직이 완전하지 못하고 이런 저런 한계가 있었다. 결국, 이런 식의 개선에는 한계를 느끼고 해당 알고리즘을 처음부터 완전히 다시 작성했다.

기회가 되면 옛날 코드에는 무슨 문제가 있어서 저런 오동작을 했는지도 좀 추적하고 싶었으나 차마 그러지는 못했다. 여기는 정말 <날개셋> 한글 입력기의 소스 코드 전체에서 다섯 손가락에 꼽힐 정도로 복잡하고 난해한 부분이다. 이 의문의 해답은 미제로 남게 되었다.

2.
입력 순서 탐색 알고리즘을 다시 만들면서 꽤 중요한 변화가 생겼다.
이 프로그램은 A라는 낱자를 입력하는 규칙을 찾을 때 반드시 A 자체를 조합하는 것부터 생각한 뒤, 거기서 답이 없으면 A에 대응하는 가상 낱자들을 찾게 했다. 그리고 가장 짧은 것부터 찾고, 길이가 같으면 가능한 한 일반 문자열 key를 숫자· 기호나 Shift 윗글쇠보다 더 선호하게 했다.

이것은 몇 가지 중요한 변화를 수반하는데..
지금까지는 이중모음 정석을 강요하는 세벌식의 경우 이중모음용 ㅗ,ㅜ가 실제 ㅗ,ㅜ에 대응하고 홑모음 전용 ㅗ,ㅜ는 해당 낱자에 대응하는 가상 낱자로 표현하는 게 관례였다.
그러나 이제부터는 홑모음 전용 ㅗ,ㅜ가 실제 ㅗ,ㅜ에 대응하고, 이중모음용 ㅗ,ㅜ가 가상 낱자로 역할이 바뀌었다.

이 경우 겹모음을 만드는 낱자 결합 규칙도 ㅗ+ㅏ=ㅘ가 아니라 500+ㅏ=ㅘ와 같은 식으로 다 바뀌어야 하는데 이런 불편을 감수한 이유는... 한글 입력 순서를 찾는 알고리즘이 정확하게 동작하게 하기 위해서이다.
겹모음용 ㅗ,ㅜ뿐만 아니라 홑모음용 ㅗ,ㅜ까지 전부 /, 9키로 연결되는 현상을 방지하기 위해서이다. V,B부터 먼저 살펴본 뒤 이 글쇠로는 겹모음을 만들 수 없을 때 가상 낱자에 대응하는 /,9를 살펴보게 된다.

기본 글자판 설정, 한글 로마자, 복벌식, 신세벌식 등 기존 빠른설정이나 입력 예제들도 다 이런 방식을 반영하도록 바뀌었다. 이건 만만찮은 작업이었다.

3.
<날개셋> 한글 입력기가 제공하는 두벌식 도깨비불 현상은 크게 세 가지 종류가 있다.

  • 그냥 맨 마지막 한 타가 다음 글자로 이동하고 그 직전까지 입력되어 있던 종성(만약 있다면)만 남는 일반 도깨비불
  • 입력 과정과 상관 없이 지정된 규칙대로 종성과 다음 글자 초성을 일괄 결정하고 필요하다면 초성의 일부 입력 순서를 재연하는 특수 도깨비불 (3.9에서 추가)
  • 애초에 종성을 두 뭉치로 나눠서 한쪽 뭉치를 그대로 다음 글자로 넘기는 '초-종 공유 낱자 규칙'에 따른 도깨비불 (6.0에서 추가)

이번 7.5부터는 마지막의 초-종 공유 낱자 결합 규칙에 의해 발생한 도깨비불도 예전의 초성 입력 순서를 그대로 유지하게 되었다.
예를 들어 나랏글 입력 방식을 가져와서 '슬퍼'를 입력한다. 그 '퍼' 상태에서 bksp를 누르면, 지금까지는 초성 ㅍ은 입력 순서가 보존되지 않고 한 타 만에 바로 지워졌지만, 이제는 이것도 ㅍ-ㅂ-ㅁ의 순으로 지워진다.

그리고 이것과 관련하여 더욱 획기적인 변화가 생긴 부분은 bksp 역도깨비불 재현 기능이다.
1.0 이래로 지금까지는, bksp 조작으로 인해 현재 두벌식 타입의 자음이 "한 타밖에 안 남았고" 그게 앞 글자의 종성으로 결합이 가능하면 그걸 자동으로 앞 글자에다 붙이는 방식으로 동작했다.

그러나 이제는 굳이 한 타 이상이더라도 이 자음 전체가 앞 글자와 결합 가능하면 그걸 한꺼번에 앞 글자에다 붙이게 했다. 그래서 나랏글 기준으로 '을' 뒤에서 '파'를 입력하고 있다가 ㅏ를 지우면 굳이 ㅁ까지 안 가더라도 ㅍ이 곧바로 붙어서 '을'이 '읊'으로 바뀐다. 그리고 그 상태에서 또 bksp를 누르면 바로 '을'이 아니라 ㅂ과 ㅁ을 거치게 된다. ㅍ을 조합하는 전과정이 '을' 이후로 붙었기 때문이다.

단, 아무 상황에서나 이렇게 한꺼번에 붙는 게 아니며 여기에는 중요한 단서가 있다. 그리고 이게 진짜로 중요한 점이다.

첫째, 추가로 붙음으로써 예전 낱자로의 순환이 발생하지 않아야 한다.
천지인 입력 방식은 같은 글쇠로 ㄴ과 ㄹ이 순환하는데, 예전에는 '길나' 같은 단어를 입력하고 있다가 '나'의 ㅏ를 지우면 ㄴ이 앞의 받침 ㄹ과 바로 붙어서 '길'이 '긴'으로 바뀌곤 했다.
이것은 일반적으로 바람직한 동작이 아니었을 것이다. 이 '긴'은 ㄴ→ㄹ에서 다시 ㄴ으로 되돌아온 것으로 여겨지기 때문에, 이 상태에서 bksp를 누르면 ㄹ이 복원되는 게 아니라 ㄴ이 완전히 없어지기 때문이다. 7.5부터는 그렇게 예전 낱자로 순환이 발생하는 상황에서는 역도깨비불이 발생하지 않는다.

둘째, 역도깨비불이 발생한 상태에서 다시 모음을 입력했을 때, 역도깨비불 이전 상태로 복원이 가능해야 한다. 두벌식 옛한글 입력 방식에서 받침 ㄹ 다음에 초성 ㄲ으로 시작하는 글자를 입력했다가 bksp를 누르면.. 이들은 받침 ㄹㄲ으로 한꺼번에 넘어간다. 하지만 초성 ㄲ을 ㄱ+ㄱ으로 입력했을 때는 그렇게 넘어가지 않으며, ㄱ이 하나만 남았을 때만 받침 ㄺ으로 넘어간다.
왜냐하면 ㄹㄲ 다음에 모음을 입력하면 다음 글자의 초성은 마지막 한 타만 돌아와서 ㄱ이 되지, 원래대로 ㄲ이 되지느 않기 때문이다.

이런 경우까지 일일이 다 고려해서 프로그램의 두벌식 처리 방식이 크게 강력해졌다. 두벌식 옛한글이든, 천지인이든 결국은 다들 연속 입력이 안 되는 경우라는 공통점이 있다. 다중타를 주고받는 게 가능해졌는데 원래 형태대로 복원이 가능할 때에만 한해서 그렇게 해 준다고 생각하면 정확하다.

4.
그 외에,
(1) 한글 입력 중에 오토마타는 nonzero 값을 되돌렸지만 낱자 결합이 불가능하거나 허용 한글 범위에 걸려서 더 조합이 안 되는 경우, <날개셋> 한글 입력기는 A,B,C에 모두 0을 주고 지금 상태에 대한 오토마타 수식을 재계산한다.
하지만 이때에도 원래 A~C에 무슨 값이 들어있었는지를 I~K 변수를 통해 알 수 있게 했다.

이것이 적용된 경우로는 나랏글 오토마타의 2번 상태 "B ? 2 : C ? 3 : J ? -1 : 0"이다.
모음(J)의 경우 더 결합이 되지 않으면 다음 글자로 넘어가지 않고 입력을 무시(-1)한다. ㅣ+ㅣ=ㅣ 같은 결합 규칙을 추가하는 대신 오토마타 차원에서 이런 조치를 취할 수 있다.
물론 나랏글이라는 두벌식 입력 방식에서 2번 상태에 A=B=C=0이 날아오는 경우는 사실상 모음 입력 상황밖에 없기 때문에, 굳이 J 값을 체크 안 하고 바로 -1을 줘도 문제될 건 없지만, 저게 논리적으로 더 엄밀하다.

(2) 또한 단축글쇠 규칙에서 입력기 전환 수식뿐만 아니라 날개셋문자 전달 수식에도 현재의 입력 항목 번호를 나타내는 A 변수가 추가되었다. 그래서 같은 글쇠라도 지금 사용하는 입력 항목이 무엇이냐에 따라서 서로 다른 글쇠를 되돌리는 게 가능해졌다.

(3) 제어판의 '낱자 처리' 페이지에서 '글쇠배열에 있는 낱자만' 옵션의 알고리즘이.. 초-종 공유 낱자 규칙을 반영하여 종성 부분을 더욱 정확하게 표시하게 개선되었다.
또한 지금까지는 유니코드 표준 영역에 없는 낱자도 회색이고 글쇠배열에 없는 낱자도 회색으로 표시되어 색깔이 겹쳤기 때문에, 후자는 주황색이라는 완전히 새로운 색으로 표시되게 동작을 수정했다.

(4) 꽤 오랜 기간부터 존재했던 문제로 추정되지만 정말 늦게 발견되고 수정되었다.
제어판의 '시스템 계층-외부 모듈 관리'에서, 각종 입력기들의 아이콘이 64비트 에디션에서는 제대로 표시되지 않았다. 운영체제가 기본 제공하는 여러 IME들이 동일한 아이콘으로 출력되는 문제가 있었는데 이번에 수정되었다..

(5) 그리고 간단하지만 의외로 유용한 숙원을 하나 이뤘다.
외부 모듈에서 제어판에서 '활성화' 버튼으로 active 글자판(입력 항목)을 바꾼 것이
시스템의 한/영 상태 제약이 없이 언제나 그대로 반영되게 했다.

지금까지는 <날개셋> 제어판에서 입력 항목을 바꾼 것은 운영체제 차원에서 내부적으로 관리하고 있는 해당 프로그램의 한/영 상태를 결코 바꾸지 않았다.
그래서 한글 글자판을 쓰다가 빈 입력 스키마로 변경을 할 수 없었으며, 이미 한글 모드여야만 같은 한글 세벌식, 한글 두벌식 등등끼리 전환이 가능했다.

시스템 일관성 차원에서 유지하고 있던 제약인데, 그 경우 시스템의 상태도 바꾸면서 글자판도 사용자가 설정한 것으로 바꾸게 하니까 훨씬 더 편하다.

(6) 저렇게 입력기 API가 다 뒤집어엎어졌으니 타자연습도 불가피하게 업데이트되었다.
그냥 재빌드만 된 게 아니라 예전에도 말했듯이 새 연습글에서 발견된 수십여 군데의 오타를 바로잡기도 했으니 업데이트가 마냥 아까운 삽질은 아닐 것이다.

Posted by 사무엘

2014/09/12 08:33 2014/09/12 08:33
Response
No Trackback , 4 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1006

<날개셋> 한글 입력기는 도대체 왜 만들어도 만들어도 또 만들 게 끝도 없는 걸까? 미치겠다. ㅠ.ㅠ 이거 좀 진지한 고민거리이다. 누가 이 마약 같은 코딩의 노예계약으로부터 나를 좀 해방시켜 줄꼬.

난 기술을 매우 긍정적으로 보지만, 한편으로 IT 쪽은.. 이제 어지간히 만들어질 거, 나올 건 다 나오고 한계에 도달하지 않았나 하는 회의감도 어느 정도 갖고 있다. Windows도 그렇고 Office도 그렇고.. 소프트웨어 업그레이드의 여파가 이제 예전만 하지 않다.

그러나 <날개셋> 한글 입력기에 관한 한은 상황이 다르다. 여전히 만들어 질 거, 나올 것들이 다 완성된 상태가 아니다. 이건 긍정적인 상태라고 해석해도 될 것 같다.
이 글에서는 <날개셋> 한글 입력기 7.4에 대해서 미처 제대로 공지가 안 되었던 변화 사항과 다음 버전 개발 근황 등을 전하도록 하겠다.

※ 7.4 버전의 잠수함 패치 내역

1.  고급 입력기의 사용자 정의 조합은 이제 언제나 '일반 문자' 타입의 날개셋문자만을 인식한다. 한글 타입(두벌식, 세벌식 등)의 날개셋문자를 0x11??대의 글쇠로 자동으로 인식하는 기능은 없어졌다.
이것은 동작 방식의 간결화를 위해 취해진 조치이다. 한글 자모나 글자를 이용하여 사용자 정의 조합을 만드는 것은 7.4의 고급 입력기에서 추가된 '한글 출력 치환' 기능으로 구현해도 된다. 더 전문적인 대체 기능이 생겼다.

2. 기본 입력기의 글쇠배열 수식에서 이제는 A와 C 변수가 제공되지 않는다. 이것은 사실 디자인상의 실수에 가까운 잉여일 뿐이었다.
글쇠가 눌러질 때 Alt 키가 눌러져 있으면 A에, Ctrl 키가 눌러져 있으면 C에 nonzero 값이 들어왔다. 그러나 7.4부터는 기본 입력 스키마의 기본 94개 글쇠는 언제나 Alt, Ctrl이 눌러져 있지 않을 때만 동작하게 동작이 바뀌었으며 해당 변수는 제공하지 않는다. Alt/Ctrl까지 동원해야 하는 복잡한 글쇠 조합은 고급 입력 스키마로 구현하면 되고, 또 기본 입력 스키마에도 그런 사용자 정의 글쇠 배당 기능이 6.5 버전에서부터 따로 추가되었으므로 이를 활용하면 된다.

지난 7.4 버전은 긴 시간 동안 한글 입력 관련 기존 코드들을 싹 정리하면서 각 개체와 계층들의 역할을 재정리하고 프로토콜도 다시 설계했다. 즉, 리팩터링의 비중이 컸다. 그러면서 이런 미세한 기능들은 좀 예고 없이 변경해도 여파가 별로 없겠다 싶은 것들을 과감하게 뜯어고쳤다. 그랬는데 본인은 <날개셋> 한글 입력기 헤비 유저들의 창의성을 너무 얕잡아 봤던 듯하다.

7.4의 공개 직후에, 잠수함 패치 때문에 예전에 되던 기능이 갑자기 안 되어서 불편을 겪으신 분께 사과드리며, 앞으로는 이런 변화는 충분히 예고를 드리도록 노력하겠다.
특히 고급 입력 스키마의 새 기능을 적극 사용하면서 여러 질문과 버그 신고를 해 주신 김 기윤 님께 감사드린다.

※ 다음 버전 개발 근황

7.4는 큰 버그 없이 잘 만들어진 듯하다. 딱 이 정도 만들어졌을 때 커트를 하여 새 버전을 내놓은 것도 매우 적절했다.
새로 추가된 고급 입력 스키마에서 이것저것 미흡한 점과 개선할 점들이 보이지만 그건 시간과 여유의 부족으로 인해 애초에 고려를 못 했던 부분들이다. 새 기능으로 인해 기존 기능에서 예기치 못한 오동작이 발생한다거나 프로그램의 안정성과 관련된 치명적인 버그가 생긴 것은 없다.

7.4의 다음 버전은 7.5로 계획하고 있다. 7.4를 마무리 지으면서 나머지 잔여 기능들은 하반기에 나올 다음 버전을 기약하기로 그때부터 이미 결정을 해 놨다.
다음 버전의 개발 방향은 (1) 7.4에서 미처 못 끝낸 입력 엔진 리팩터링과 개선, (2) 고급 입력 스키마의 기능 마저 구현, (3) 기타..로 나뉜다. 다만, 이것저것 넣고 싶은 기능들을 다 구현한다면 변화량이 7.5 수준을 초과할지도 모른다.

(1) 고급 입력기의 기능을 활용하고 나면, 두 글자 이상 길이의 조합을 만드는 게 가능해진다. 그러나 조합 중에 C0|0xD (앞쪽으로 조합 중단) 같은 특수글쇠를 집어넣어 보면, 현재는 정확하게 조합의 앞에 cursor가 놓이는 게 아니라 조합의 뒤에서 한 글자 앞에 cursor가 놓이게 된다. 기본 입력기의 기능만 활용해서 한글 한 글자만 조합 중일 때에야 이런 동작 방식이 문제가 없지만, 범용성 면에서 이런 동작 방식은 문제가 있다.

이렇게밖에 할 수 없는 것은 내부적으로 여러 한계가 있기 때문인데, 이 한계를 극복하는 작업을 7.4에서 완전히 마무리 짓지 못했다. 그래서 다음 버전에서는 이를 지체없이 이어서 진행할 예정이다.

또한, 한글로부터 입력 순서를 찾아내는 알고리즘, 인접한 두 한글의 연속 입력 가능 여부를 판별하는 알고리즘을 처음부터 깔끔하게 다시 작성할 예정이다. 지금 작성된 코드는 긴 세월이 흐르면서 나중에 추가된 특수 도깨비불 규칙, 종성 지향 두벌식, 오토마타의 O 변수 같은 복잡한 기능들을 정확하게 반영하여 처리하지 못하며 구조적으로 확장하기도 어려운 형태이다.

주어진 입력 설정으로부터 최적의 한글 입력 sequence를 찾는 알고리즘은 한글 입력기가 제공할 수 있는 가장 유용하고 멋진 자동화 기능이므로 올여름에 심혈을 기울여 재개발을 할 것이다.
뭐, 이것 말고도 지금 모든 내역을 밝힐 수 없는 다른 리팩터링 작업들도 남아 있음.

(2) 고급 입력 스키마에 아직 숙제로 남은 여러 미흡한 기능들을 개선하고, 본격적으로 한글 동시치기와 관련된 추가 옵션들을 구현할 예정이다. 세벌식 자판도 직전 한두 타를 아주 빠르게 누른다거나 하면 조합 중이던 자모가 다음 글자로 넘어가는 '도깨비불' 현상이 발생할 수 있게 된다.

(3) 이것도 모든 내역을 당장 밝힐 수는 없는 여러 이슈들이 현재 존재한다. 아, 입력 패드와 관련된 내용을 잠시 후에 언급하도록 하겠다.

한편, 타자연습은 다른 특이점은 없고 새 연습글들을 허겁지겁 추가하다 보니 오타가 생각보다 많이 발견되어 이걸 고쳤다. 버전 번호를 바꾸지는 않을 것이고, 입력기 새 버전이 나오는 날에 타자연습을 동일 버전으로 다시 배포할 생각이다. 그렇기 때문에 기존 3.4 사용자라면 지금 쓰는 타자연습을 제거한 후, 새 3.4를 받아서 다시 설치해서 사용하시면 될 듯하다. 연습글의 오타 신고는 지금까지 박 철현 님께서 가장 열성적으로 해 주셨다.

※ 입력 패드의 버그 수정

<날개셋> 한글 입력기의 구현체들 중 입력 패드는 7.11에서 7.4로 넘어가는 그 격변기에도 큰 변화가 없었으며, 얘는 앞으로 거의 건드릴 일이 없을 거라 여겨졌다.
그러나 다음 7.5 버전에서는 이 프로그램과 내부 hook DLL이 정말 오랜만에 좀 고쳐질 예정이다.

예전에 외부 모듈은 Excel이나 Paint.NET 같은 프로그램에서 한글을 처음 입력할 때 첫 타 조합이 끊어지거나 덧나는 등 자잘한 문제가 있었다. 엄밀히 말하면 내 프로그램의 로직에 문제가 있긴 하지만, 그 프로그램들이 또 좀 특이하게 동작을 해서... 서로 조심을 안 해서 발생하는 문제였다.

그래서 외부 모듈은 한동안 특정 프로그램에서만 인위적으로 다르게 동작하는 예외 로직을 넣어서 문제를 피해 갔었으나, 지난 7.4에서는 오랜 연구 끝에 그 문제를 드디어 완벽하게 해결했다.
그러나 그 방법이 외부 모듈 말고 입력 패드에는 적용되지 않아 있었다. 여전히 Excel에만 예외 로직이 적용되어 있었으며, Paint.NET 같은 다른 프로그램에서는 글자가 덧나는 문제가 남아 있었다. 단지 입력 패드는 편집기나 외부 모듈보다 훨씬 덜 쓰이는 잉여 프로그램이기 때문에 문제의 심각성이 덜 부각되었을 뿐이다.

그러다가 이번에 입력 패드에까지 새로운 해결책을 적용하여 그 문제를 해결했다.
원래 입력 패드는 hooking을 이용하여 변칙적인 꼼수를 부리며 동작하는 위험한 프로그램이기 때문에 이 문제는 외부 모듈만치 깔끔하게 해결하기가 어려웠다. 이 문제를 해결하느라 다른 부작용(side effect)이 생기지는 않았는지를 아주 꼼꼼하게 테스트해야 했으며 이 과정이 대단히 힘들었다.

또한, '한손 입력기'처럼 내부적으로 독자적인 문자 생성기를 가진 도구를 사용했다가 닫은 뒤에 '화면 키보드' 같은 다른 도구로 문자 입력을 시도했을 때 프로그램이 죽는 문제를 해결했다. 늘 나타나는 현상이 아니어서 그저 그러려니 싶었는데.. 확실하게 코딩 실수가 있는 걸 발견했다. 이 두 가지 버그가 현재 해결되었다.

system hook 프로그래밍을 해 본 분들은 아시겠지만, hook을 사용하는 프로그램이 hook을 해제하고 종료한 뒤에도 어찌 된 일인지 그 hook DLL은 오랫동안 메모리에서 완전히 제거되지 않고 남아 있는 경우가 많다. 그래서 그 hook DLL의 소스를 고쳐서 다시 빌드를 하려 해도 덮어쓰기가 안 되고 진행이 안 되는 경우가 많다.

자잘하게 코드 한두 군데만 고친 뒤 결과를 확인하려고 하는데 매번 운영체제 로그인을 다시 해서 상태를 초기화해야 하니, hook 개발은 IME 개발보다도 더 불편한 애로사항이 있었다. IME는 그래도 프로그램만 확실히 종료하고 나면 업데이트가 안 되는 불편은 없기 때문에 말이다. 예전에 XP/Vista 시절에는 명령 프롬프트 디버깅을 한 뒤에는 conime.exe를 매번 죽여 줘야 해서 불편했지만, 그건 7부터는 개선됐다.

아무튼 본인으로서는 문제를 최대한 해결하여, 지금 동작이 예전의 문제를 해결하면 해결해서 더 낫게 만들면 만들었지, 최소한 예전보다 상태를 더 '나쁘게' 만든 것은 없음을 확인했다. 말은 이렇게 했는데 또 버그가 발견되면 그러면 할 말이 없긴 하지만...

여담인데, Internet Explorer의 웹페이지 내부에 있는 폼에다가 입력 패드로 문자를 입력해 보면,
IE 10까지는 조합이 일반적인 IME로 한글을 입력할 때와 마찬가지로 본문에다 네모 사각형 모양으로 제대로 생긴다. 그러나 유독 IE 11부터는 조합이 그렇게 처리가 안 되고 마치 IME-aware하지 않은 프로그램처럼 프로그램 밖의 조합 창에 따로 생기는 형태로.. 시각적인 피드백이 좀 불편해졌다. 어째 이런 것에도 미세한 변화가 생겼다.

※ 기타 공지

1. 다음 버전에서는 문자 생성기를 가리키는 명칭에 날개셋이라는 단어가 빠지고, 입력 스키마의 명칭과 마찬가지로 그냥 빈 / 기본 / 고급이라는 3단계 수식어만 붙을 예정이다. '빈 입력기, 기본 입력기, 고급 입력기'.
날개셋이라는 이름이 왜 지금까지 있었느냐 하면, 오토마타라든가 각종 특수글쇠처럼 <날개셋> 한글 입력기의 가장 중요한 핵심 기능들이 구현된 계층이 문자 생성기이기 때문이다. 쉽게 말해 상징적인 의미 때문이다. 하지만 그건 군더더기라 여겨져서 다음 버전부터는 빼게 되었다.

2. <날개셋> 한글 입력기가 버전을 매기는 방식은 통상적인 소수점과 완전히 동일하다. 가령, 버전 7.4와 7.40은 동일한 표기이며 7.4는 7.11보다 더 높은 버전이다. 다만, 공식적으로는 끝의 0은 생략하여 7.40 대신 7.4라고 표기하는 것을 권장· 선호한다.

3. 그리고 이것도 한 번쯤 언급할 필요가 있어서 입장을 확실히 밝히고자 한다. <날개셋> 한글 입력기는 브랜드 이름을 지금까지 less than과 greater than 부호로 감싸는 이상한(?) 관행이 존재해 왔다. 이것은 세벌식 최종 글자판이 ()와 <>를 아랫글쇠로 입력할 수 있다는 것에 착안하여 별 생각 없이 붙이게 됐는데..
반드시 강요는 안 한다. 파일 이름이나 HTML 태그 같은 상황에서 <>를 붙이기가 대략 난감할 때는 얼마든지 생략해도 된다. 영문 표기에서도 당연히 생략.
하지만 한글로 full name을 공식 표기할 때는 <>를 넣는 것을 원칙으로 삼고자 한다. ㅎㅎ 여기에도 이런 내력이 있는 셈이다.

4. 진짜 마지막으로... 간단한 내용이지만 최근에 문의를 한 분이 있어서 또 공지하도록 하겠다.
입력기와 타자연습을 모두 사용하시는 분이라면, 두 프로그램을 모두 최신 버전으로 업데이트할 것을 강력하게 권한다.

타자연습도 실행에 필요한 최소한의 파일들은 자체적으로 모두 갖추고 있으며 입력기와 독립적으로 동작하는 게 가능은 하다. 그러나 입력기와 타자연습이 서로 API 호환이 되지 않으면 타자연습은 입력기의 모든 기능을 100% 활용할 수가 없게 된다. 특히 플러그 인을 사용할 수 없게 되기 때문에 고급 입력 스키마나 고급 입력기 같은 기능을 사용한 입력 설정이 무용지물이 된다. 반드시 업데이트를 해야 한다.
이번에 타자연습은 3.31 이후 거의 1년 반 가까이 버전업이 없다가 3.4로 업데이트됐기 때문에 문의가 들어올 만도 했던 것 같다.

Posted by 사무엘

2014/07/10 19:32 2014/07/10 19:32
Response
No Trackback , 5 Comments
RSS :
http://moogi.new21.org/tc/rss/response/983

<날개셋> 한글 입력기 7.4-- 下

* 하편에서는 지난 상편보다 좀 더 실무(?)스러운 세부 기능과 안정성 위주의 얘기가 나올 것이다.

5. 글자판 전환 단축글쇠의 지능화

PC용 문자 입력 프로그램에서는 키보드 연타를 좀 더 똑똑하게 인식하는 기능이 확실히 있긴 해야 하는 것 같다.
지난 7.1 버전에서는 bksp를 연타할 경우, 최초에 선택되었던 낱자/글자 삭제 단위를 그 다음 글자의 조합 상태와 무관하게 계속 적용하는 옵션을 추가했다. 이런 기능을 구현하려면 아무래도 예전 상태를 기억하는 변수가 있어야 하고 모든 key 동작을 감시하는 오버헤드가 불가피하지만, 그 오버헤드 이상으로 그건 사실 편리하고 필요한 기능이긴 했다.

bksp에 이어 이번 새 버전에서는 입력 항목(=글자판) 전환 단축글쇠에도 연타를 인식하는 로직이 추가되었다.
입력 항목 전환 수식은 10년 전의 3.0 이래로 지금 글자판의 번호를 나타내는 변수 A 하나밖에 존재하지 않았는데, 이번에는 연타 카운트를 나타내는 B, 전체 입력 항목 개수를 나타내는 N, 그리고 우리 직전에 사용하던 입력 항목 번호를 나타내는 C라는 여러 변수들이 추가된다.

여기서 연타라 함은 계속 누르고 있거나, 아니면 modifier에서 손을 떼지 않고 main key만 눌렀다 뗐기를 반복하는 걸 말한다. Shift+Space라면 shift는 꾹 누르고 있는 채로 space만 반복해서 누르는 것이다.

그렇다. Windows 8과 맥 OS에서는 이미 익숙한 관행일 것이다. 전자의 경우 Win 키를 누른 채로 space를 눌러서 IME를 고를 수 있으며, 맥의 경우 역시 Cmd+space를 1회만 누르면 직전에 사용하던 입력기와 내 것만 toggle되고, space를 여러 번 누르면 평소에 안 쓰던 다른 입력기를 고를 수 있다. 이 동작이 이제 <날개셋> 한글 입력기로도 가능해지는 것이다. 예를 들어,

B>0||C==A ? (A+1)%N : C

이런 수식을 배당하는 경우, 이 key가 연타 상태이거나(B>0) 글자판 전환을 처음 하는 상태라면 현재 존재하는 모든 입력 항목을 돌아가며 순회한다. 현재 입력기의 바로 다음 입력기(A+1)로 넘어가되, 이 값이 N과 같아지는 경우 도로 0으로 되돌리는 것이다(%N). 그렇지 않으면 내가 바로 직전에 사용하던 입력 항목 번호를 나타내는 C로 돌아간다.

세벌식과 쿼티, 두벌식과 드보락을 한데 배당해 놓고 있었는데 세벌식/쿼티이던 것을 세벌식/드보락으로 바꾸고 싶은 경우, 세벌식 상태에서 Shift를 누른 상태에서 Space를 몇 번 눌러서 드보락으로 이동시킨다. 그 다음부터 Shift+Space를 1회만 누르면 세벌식/쿼티가 아니라 세벌식/드보락이 된다. 마찬가지로 두벌식 전환을 하고 싶은 경우, 영문 자판 상태에서 두벌식으로 돌아가면 그 뒤부터는 두벌식/드보락 toggle이 된다.

이로써 오로지 0과 1 사이만 왕복하고 더 다양한 입력 항목을 사용하려면 별도의 단축글쇠를 추가하거나 불편하게 마우스를 동원해야 했던 번거로움이 사라지게 될 것이다.

6-1. 외부 모듈: 특정 프로그램에서 첫 타가 조합이 끊어지는 문제

이건 굉장히 오래 전에 작업이 완료된 아이템인데, 블로그 옛날 글을 읽어 보니 언급을 한 번도 안 한 것 같다. 그러니 지금이라도 좀 공지를 하도록 하겠다.

<날개셋> 한글 입력기 외부 모듈은 특정 프로그램에서 한글 입력을 곧바로 시작했을 때, 첫 타의 조합이 끊어지는 문제가 있었다. 대표적인 예가 MS Office의 엑셀. 얘만 좀 아래의 한글 IME에다가 특이한 이벤트를 날리는 게 있어서 '나라'라고 입력을 시작하면 'ㄴㅏ라'가 되곤 했다.
이 문제를 당장 피해 가는 건 물론 가능했다. 그러나 그 경우, 다른 프로그램에서 조합이 종료되어야 할 때 종료가 되지 않는 오동작이 발생하니 난감한 상황이 아닐 수 없었다.

그래서 <날개셋> 한글 입력기는 고육지책으로 외부 모듈은 자신이 동작하는 프로그램 EXE의 이름을 살펴서 엑셀 같은 '요주의 프로그램'이면 문제 회피 로직을 쓰고, 다른 프로그램에서는 그 로직을 쓰지 않는... 궁극의 지저분한 꼼수를 굉장히 오랫동안 사용해 왔다.
그런데 그렇게만 하니까 첫 타가 끊어지는 문제가 Paint .NET에서도 발생하고, 다른 듣보잡 프로그램에서도 종종 보고되면서 상황이 더욱 나빠져 갔다.

일단 난 응용 프로그램이 한글 IME를 도대체 어떻게 조작해야 첫 타를 끊어지게 만들 수 있는지, 어떻게 해야 저런 프로그램을 만들 수 있는지를 이해를 못 한다. 하지만 그럼에도 불구하고 7.4에서는 논란의 여지가 있던 부분을 없애고 오랜 연구 끝에, 문제를 일단은 이름 판별이라는 꼼수 없이 완벽하게 해결했다. 이런 미세한 동작 방식 같은 건 제대로 문서화도 돼 있지 않으니 정말 프로그래머가 경험을 알아서 축적하는 수밖에 답이 없다.

참고로 첫 타의 조합이 끊어지는 문제는, 첫 타가 아예 무시되고 씹히는 문제하고는 성격이 다르다. 후자 역시 다른 상황에서 예전에 <날개셋> 한글 입력기 외부 모듈의 버그로 종종 보고되곤 했다. ㅎㅎ

6-2. 외부 모듈: Windows 7의 명령 프롬프트에서 한글이 덧나는 문제

Windows 7에는 한글 IME의 세벌식 지원과 관련하여 이전의 XP/Vista에 없었고, 후대의 8에도 없는 전무후무한 이상한 문제가 하나 있다. 명령 프롬프트에서 한글을 입력하다가 space, 마침표, 숫자 등 비한글 문자를 입력하여 조합을 중단할 경우, 조합 중이던 한글이 덧나는 현상이 발생한다.

MS IME, 그리고 <날개셋> 한글 입력기도 동일하게, 그것도 오로지 윈도 7에서만 발생하기 때문에 이것은 IME 차원에서는 해결 불가능한 운영체제의 버그라고 간주되어 왔다.
단, MS IME로 두벌식을 쓸 때는 문제가 없는데, 두벌식의 경우 비한글 문자는 IME가 글쇠를 가로채어 직접 처리하지 않기 때문에 그렇다.

그랬는데.. 이번 7.4 버전으로 우연히 콘솔에서 한글을 입력해 봤는데.. 덧나는 현상이 없어져 있어서 깜짝 놀랐다. 윈도 7에서 세벌식으로 덧나는 현상 없이 한글을 입력하는 걸 난생 처음 본다. 저게 가능하구나!
구버전(= 현재 공식 최신 버전)인 7.11을 돌려 보니 문제가 발생하는데, 7.4를 돌리니 문제가 사라지는 게 확실하다.

도대체 무슨 변화가 생긴 건지? 저 6번하고는 영역이 다른 문제였을 텐데. 기대도 안 했던 버그가 별다른 작업 없이 저절로 해결돼 있으니 기분은 좋다만, 한편으로 좀 난감하네.

7. 타자연습

자, 입력기가 이렇게 완전히 머리부터 발끝까지 뒤집어 엎어진 동안, 타자연습도 변화가 하나도 없으면 좀 섭섭할 것이다.
입력기와 API 호환성이 다 날아갔으니 7.4 버전에 맞춰 다시 빌드되어야 한 건 두 말할 나위도 없거니와, 외형과 관련된 사소한 개선 사항이 좀 있었다.

프로그램의 16*16 소형 아이콘이 그 크기에 맞는 전용 아이콘으로 나오는 게 아니라 32*32 아이콘을 축소시킨 우중충한 형태로 지금까지 나오고 있었는데, 당장 그걸 개선했다. 개인적으로는 타자연습도 지금의 편집기나 변환기처럼 <날개셋> 한글 입력기 7.0 스타일의 동그란 네모 아이콘으로 바꾸고 싶으나, 그 작업까지 할 여유는 없다.

그리고 프로그램을 고해상도 DPI 모드에서 실행해서 UI 텍스트가 잘린다거나 하는 것을 모두 수정했다. 그 작업의 결과로 페이지의 우측 하단에 있던 “연습 시작” 버튼들이 예전보다 더욱 길쭉해지고 보기 좋아졌다. 이 역시 진작부터 개선할 생각을 왜 안 했나 모르겠다.

다음으로 장문 연습을 시작할 때 "연습을 시작합니다. 준비하세요"라고 메시지 박스가 번거롭게 뜨던 걸 없애고, 단문 연습과 마찬가지로 첫 타를 누름과 동시에 시간 측정과 경쟁 모드가 시작되게 했다. 인터페이스 개선에 기여할 것으로 보인다.

끝으로, 연습글을 상당수 교체했다. 세월을 안 타는 고전을 제외하고는 너무 구태의연하고 지금과 시기가 안 맞는 글은 삭제했다. 예를 들어 한글날이 공휴일에 국경일까지 된 마당에 한글날 국경일 지정을 촉구하는 글을 계속 남겨 둘 필요는 없으며, 월드컵 관련 글도 너무 오래 됐다고 판단하여 뺐다.
그 대신 다른 글을 넣고, 각종 인터넷 유행어 병맛 개그들을 넣었으니 타자 연습할 때 즐겁게 이용해 주시기 바란다. ^^

사실 게임도 업그레이드 시스템을 없애고 시간이 나면 시스템을 다 갈아엎고 싶었으나 도저히 손을 댈 수 없었다. 3.31에서 3.4로 번호를 작업량에 비해 좀 크게 올린 것은 거의 1년 반 만의 버전업이어서 시간 간격이 워낙 길었으며, 또 7.4와 끝자리를 맞춘다는 의미를 더 표현하고 싶었기 때문이다. 올해는 또 2014년이기도 하고.

8-1. 사소한 것: 최종 변환 규칙 UI

다른 카테고리에 분류되기가 뭣한 잡다한 얘기들은 다 여기에다가 집어넣었다.
<날개셋> 한글 입력기는 최종 변환 규칙이라는 게 추가된 무려 2.4 버전 이래로 지금까지..
입력값 from과 to를 접수하는 방식이 좀 괴이했다. 한 입력란에다가 from 문자와 to 문자를 붙여서 입력하고 '추가'를 눌러야 했으나.. 이번 7.4에서는 드디어 from과 to를 별도의 입력란에다 따로 입력하는 방식으로 UI가 직관적으로 개선되었다. 아래 그림을 참고하시라.

사용자 삽입 이미지

8-2. 떡밥 - JSON

이건 새로운 기능 얘기는 아니고 다른 잡설임.
<날개셋> 한글 입력기는 입력 설정 파일을 바이너리 고유 포맷뿐만 아니라 텍스트 에디터로 편집 가능한 XML 방식으로 저장하는 것도 꽤 오래 전부터 지원해 왔다.
그런데 텍스트 기반의 데이터 직렬화(serialize) 파일 포맷으로 XML뿐만 아니라 JSON이라는 물건도 있었구나. 얘도 보아하니 찰져 보이고 XML의 대체제가 될 수 있을 것 같다.

XML처럼 다단계 계층을 당연히 표현할 수 있으며, key-value 방식의 자료구조뿐만 아니라 배열을 통해 테이블 같은 단순 데이터 dump도 모두 손쉽게 표현할 수 있다는 게 마음에 든다. XML은 일단 후자에는 최적화돼 있지 않으니 말이다.
태그가 아니라 프로그래밍 언어의 데이터 초기화 코드에서 모티브를 땄다는 점도 참신해 보인다.

8-3. 떡밥 - 글꼴

<날개셋> 한글 입력기는 1.0 시절부터 내부 입력 프로토콜을 사용하는 자체적인 에디트 컨트롤을 갖추고 있었으며, 구현체들 중 편집기는 이 컨트롤을 기반으로 동작하는 텍스트 에디터이다. 그리고 자체 에디트 컨트롤은 16*16 비트맵 글꼴이라는 굉장히 원시적이고 똘끼 충만한 글꼴 체계를 고집하고 있다.

그것 자체는 이 프로그램의 특징이고 포기할 수 없는 특성이라고 치자. 운영체제에 의존하지 않고, TTF로는 상상도 할 수 없는 작은 크기의 조합형 글꼴로 옛한글과 미완성 한글을 출력하는 것을 애초에 목표로 삼았으니 말이다. 기계식 타자기를 컴퓨터에다 옮겨 놓은 듯한 날씬함을 개발 철학 차원에서 추구한 셈이다.

다만, 이거 하나는 대세를 무시할 수 없는 듯하다. 바로 화면 해상도. 옛날에는 16*16이라는 글자 크기가 운영체제 UI의 기본 글꼴보다 컸지만, 125% 내지 150% 배율을 쓰는 초고해상도 환경에서는 이것은 작은 크기이다.
같은 폰트라도 16픽셀을 18이나 20 정도로 확대해 주는 기능은 있어야 할 것 같다.

기능 자체는 화면에다 글자를 찍는 부분과 마우스 포인터 위치 인식 기능에다 간단한 비례식을 추가하는 정도로 구현할 수 있을 듯한데..
문제는 비트맵 그래픽을 출력하는 부분이다. 정수배 확대가 아니니 그래픽의 품질을 위해 안티앨리어싱은 필수라고 봐야 하는데, 재래식 GDI로는(StretchBlt 함수) 그걸 넣을 수 없다. 당장 <날개셋> 편집기에서 화면 인쇄 명령을 내려서 배율을 바꿔 보면, 이를 확인할 수 있음.

그러니 이것도 최소한 GDI+나 요즘 대세인 Direct2D 같은 API로 작성되어야 할 것으로 보이는데, 그것까지 신경 쓰는 건 <날개셋> 한글 입력기의 핵심 기능과 직접적인 관계가 없고, 개인적인 작업 부담이 너무 심하다. 쉽지 않은 문제다.;;

9. 마치며

(1) 후원금을 보내 주신 분들의 이름은 그 다음 버전의 프로그램 도움말의 '감사의 글' 페이지에 꼬박꼬박 등재되고 있다.
후원자가 아주 많아지면 액수 순으로, 혹은 최근 순으로 잘라서 수록하는 게 불가피하겠지만, 내 프로그램은 벌써 그런 경지에 오른 것도 전혀 아니고 아직까지는 후원해 주신 모든 분들이 명단에 올라 있다.

<날개셋> 한글 입력기는 14년째 개발자가 한글 오덕질 근성을 주체하지 못하여 자기 인생의 상당 부분을 투자하며 개발되어 왔다. 특히 이번 7.4는 개발 역사상 유례를 찾기 어려울 정도로 한글 입력 엔진에 굉장히 많은 기능 추가와 수정이 이뤄졌다. 프로그램의 개발 취지를 이해하고 후원해 주신 분들께 다시 한번 감사드린다.

(2) 단군의 후손들이 어째 라틴 알파벳도 아니고, 한자 같은 그림문자도 아니고, 한글 같은 위상의 문자를 쓰고 있는지.. IME가 필요하긴 하지만 NLP 기술 없이 글자 구조 자체와 관련된 엔지니어링이 개입할 여지가 있는 문자를 쓰는지? 생각하면 할수록 신통방통한 일이다. 거기에 세벌식 글자판까지 생각하면.. 오덕질을 안 할래야 안 할 수가 없다.

본인은 맹목적인 공 병우 빠돌이가 아니며, 맹목적인 세벌뽕도 아니다. 더 나은 한글 기계화 패러다임이 있다면 정말 열린 마음으로 수용할 의향이 있다. 어떤 한글 입력 방식이든 동등한 여건 하에서 구현되고 테스트되어야 한다. 솔직히 <날개셋> 한글 입력기야말로 바로 종류를 불문하고 한글 입력 기술의 공평한 통합을 목표로 개발되고 있기도 하고 말이다. (그러니 세벌식뿐만 아니라 두벌식 관련 고급 기능도 많이 들어있다!)

그런데 그렇게 열린 마음으로 살펴봐도 현실적으로 정말 공 병우 세벌식을 능가하는 한글 기계화 패러다임은 등장하지 않았고 앞으로도 딱히 나올 기미가 보이지 않는다. 그 정도 성능에 그 정도 범용성을 갖춘 최강 가성비를 자랑하는 입력 방식 말이다.
오히려 모바일 환경으로 가면서 굳이 그렇게 빨라야 할 필요가 없으니 의미가 퇴색했을 뿐이지, 동일 환경에서 공 병우 세벌식이 다른 패러다임에 의해 추월당한(beaten) 적은 내가 보기에 없다. 내가 식견이 부족한 것일 수도 있으니 이 명제에 대한 반박은 언제든 얼마든지 환영한다.

본인은 이런 패러다임을 바탕으로 우리나라 고유문자를 컴퓨터에서 완전 변태(?) 수준으로 쥐락펴락할 수 있는 기술을 보유한 것에 자부심을 갖고 있다. 적어도 Windows라는 한 플랫폼에서만은 마스터를 했으니 말이다. 프로그래머 만세다. 언젠가 내 프로그램의 내부 구조와 설계 이념을 강연이나 저술을 통해 지금보다 더 널리 알릴 기회가 있으면 좋겠다.

Posted by 사무엘

2014/06/04 08:27 2014/06/04 08:27
Response
No Trackback , 9 Comments
RSS :
http://moogi.new21.org/tc/rss/response/970

<날개셋> 한글 입력기 7.4-- 上

요 며칠간 개인적으로 잘 된 일도 있었고 잘 안 풀린 일도 있는 채로 다사다난한 시간을 보냈으나.. 그 어느 것도 나의 코딩을 가로막을 수는 없다. 열차는 시각표대로 무조건 달린다. 건널목에서 충돌 사고가 나도 질량과 관성 때문에 장애물을 그냥 밀고 쭉쭉 나아갈 뿐이다.

그래서 드디어 <날개셋> 한글 입력기가 7.11 이래로 무려 7개월간의 수련을 마치고 7.4 버전이 완성되었다.
원하는 기능들을 다 집어넣은 건 아니지만 한번 역에 정차하여 쉬어 가게 됐다. 이 달부터는 학기 마무리 준비를 해야 하는 관계로, 더 작업은 하고 싶어도 할 수 없기 때문이다.

5월은 안 넘긴 걸 기쁘게 생각한다. 의도했던 건 아닌데 5월 31일은 공교롭게도 <날개셋> 한글 입력기 3.0 출시의 딱 10주년 타이밍이기도 하다. 2004년 5월 31일 + 10년이다.

3.0은 최초로 유니코드 API 도입, 입력 스키마와 문자 생성기 계층 구분, 단축글쇠 테이블, 수식 기반의 오토마타, 지금과 같은 64비트 크기의 입력 단위, TSF를 인식하는 에디팅 엔진, 가변 길이 옛한글 등 오늘날 내 프로그램의 근간을 닦은 버전이었다. 2.5 이후로 거의 9개월 동안 프로그램을 밑바닥부터 다시 만들었었다.

물론 지금 보면, 기술적 디테일이나 사용자 인터페이스는 그야말로 내가 겁도 없이 이런 허접한 프로그램을 대회에 출품하고 사용자에게 공개했다 싶을 정도로, 민망할 정도로 허접하기 그지없었다.
그러나.. 포니를 개발한 뒤에야 에쿠스가 나올 수 있었듯이, 그런 개허접한 3.0이 있었기 때문에 그 뒤로 꾸준히 후속 기술이 개발되고 기능이 추가되어 무려 7.4까지 나올 수 있었던 건 자명한 사실이다. 이제 7.4를 바탕으로 올가을쯤에 7.5가 나와서 잔여 과업들을 완수해 준다면, <날개셋> 한글 입력기는 거의 대망의 완전체가 도달하지 않을까 싶다.

1. 입력 엔진 부분의 대대적인 리팩터링

예전에도 한번 소개한 적이 있듯, <날개셋> 한글 입력기에는 한 번에 한 낱자가 아니라 초중종 낱자를 한꺼번에 입력하는 기능이 있다. 그리고 그냥 입력하는 정도가 아니라 두 번에 걸쳐 입력하는 기능이 있다. 예를 들어 "받침ㅆ+다"를 배당하여 '이' 다음에 '있다'를 곧바로 만든다거나, '가' 다음에 '갔다'를 바로 만드는 게 가능하다.

극단적인 예로, 한 글쇠에다 '받침ㅋ+쌰'를 배당한다. 수식으로는 'H12|SS|YA|_K'라고 표현된다. 그 뒤, 허용 한글 범위를 KSX1001 완성형으로 맞춰서 2350자만 입력 가능하게 바꾼다.
이 상태에서 '가' 입력 중에 그 글쇠를 누르면.. '가ㅋ쌰'가 찍히는 게 맞다. '갘'은 조합이 안 되니 ㅋ이 다음 글자로 떨어져 나가고, '쌰'도 완성형에 없는 한글이기 때문에 조합이 더 진행되지 못하고 끊어지는 게 맞다. 그러나 현재 7.11 버전은 'ㅋ가쌰'가 된다. 중첩 입력을 처리하는 로직이 완전하지 못하기 때문이다.

또한 이 경우 원래 조합하던 글자에 이어서 총 2개의 글자가 추가로 완성되는 것이기 때문에 삽입이 아닌 '겹침' 모드에서는 2개의 글자가 추가로 덮어써져야 한다. 그러나 7.11은 그것도 깔끔하게 처리되지 못하고 여전히 삽입만 되고 있다.

이렇듯 NLP 기술이 하나도 없는 단순 한글 입력기 같아도 <날개셋> 한글 입력기는 서로 영향을 끼치는 입력 관련 각종 옵션과 변수들을 제어하는 게 굉장히 복잡하다. 가짓수와 가짓수를 서로 고려하다 보면 가능성이 곱셈이 되어 버려서 통제를 못 하게 된다. 각 변수들을 있는 그대로 각개격파하여 덧셈으로 유지되게 해야 한다.

굳이 저런 극단적인 상황에서의 매끄러운 처리까지 생각하는 게 아니더라도, <날개셋> 한글 입력기의 핵심 엔진 부분은 지난 10여 년 동안 다양한 기능이 추가되는 과정에서 매우 심하게 지저분해졌으며 구조적으로 심각한 한계를 드러내고 있었다. 그래서 대대적인 리팩터링이 불가피했다.

한참 옛날에 만들어 놨던 코드의 모든 로직과 의미를 다시 읽으며, 머리를 쥐어뜯고 피말리는 작업이 계속되었다.
그 결과, 단독으로 1천 줄이 넘던 핵심 함수의 일부를 2개의 함수로 떼어내고, 반복적인 패턴이 발견되는 일련의 루틴들을 별도의 클래스로도 빼냈다. 복잡한 입력, 이동, 지우기 동작을 제한된 element만으로 추상화해 낸 것이다.

특히 재귀호출이 필요한 부분과 그렇지 않은 부분을 확실히 분리했으며, 중복 무한순환 재귀호출을 감지하여 막는 부분을 더욱 똑똑하고 논리 오류가 없게 개선했다.

기능 추가도 아니고 동일한 기능을 구현하는 방식만 바꾸는 데 거의 50일이 걸렸다. 이 디자인이 과연 최선의 디자인인지 스스로 확신을 얻는 데도 긴 고뇌의 시간이 필요했다.
새로운 체계 덕분에 각종 지저분한 중복 코드가 없어지고, 지저분한 임시 변수나 비트 플래그가 없어지고, 그럼에도 불구하고 입력기의 논리적인 버그가 없어질 때마다 본인은 거의 엑스터시에 가까운 환희를 경험했다.

결합 축약 테이블에 의한 입력 순서 축약은 입력 타이밍이 아니라 bksp 지우기 동작이 실제로 일어날 때 행해지게 바꿨고,
특히 겹침 모드에서 배경의 글자를 덮어쓰는 개수를 계산하는 건, 입력 동작의 결과를 보고 공통된 post-processing 과정에서 한번에 알아서 계산하게 바꿨다.

이렇게 만들어진 출력 action은 구현체에 따라 IME에서는 WM_IME_*메시지로, TSF 환경에서는 TSF interface 함수 호출로, 자체 에디터에서는 말 그대로 내부 조작으로 seamless하게 변환되어 나간다. Windows 95부터 8.1까지 버전 불문하고 32비트, 64비트 불문하고 모두 똑같이 동작하는 건 물론이고 말이다.

이번 작업 덕분에 <날개셋> 한글 입력기의 코드는 소프트웨어공학적인 품질이 크게 향상되었으며, 이를 토대로 다른 새로운 입력 기능들도 손쉽게 확장해 넣을 수 있게 되었다.

2. 고급 입력 스키마

이번 7.4 버전에서는 종전의 '동시입력 스키마'를 대체하는 '고급 입력 스키마'가 추가되었다. 아직 넣고 싶은 기능이 100% 다 구현된 건 아니지만 어쨌든 이로써 입력 스키마와 문자 생성기가 모두 (1) 빈 (2) 기본 (3) 고급이라는 3단계 계층이 갖춰지게 됐다.

빈 입력 스키마는 아무 글쇠도 스스로 처리하지 않고 응용 프로그램에 그대로 넘겨 주는 잉여이다.
기본 스키마는 우리가 지금까지 써 온 대로, 키보드에서 통상적인 문자 입력용으로 쓰이는 47개 글쇠에다 Shift 조합을 포함한 94개 자리의 keydown을 인식한다. 거기에다 사용자가 별도로 지정한 글쇠의 keydown을 추가로 인식하거나, 기존 47개 글쇠를 부분적으로 인식하지 않게 하는 기능을 액세서리 차원으로 제공한다. 추가 글쇠는 Ctrl/Alt/Shift/Win 같은 modifier 조합을 옵션으로 가질 수 있다.

이에 덧붙여 고급 입력 스키마는 지정한 글쇠에 대해서 keydown뿐만 아니라 keyup(글쇠를 뗀 것)을 모두 인식할 수 있으며, 각 상황별로 이 글쇠를 처리할지의 여부를 모두 수식으로 지정 가능하다. 또한 이 keydown 이벤트가 몇 번째 연타인지, 그리고 이 이벤트가 발생한 시각(밀리초 단위)이 언제인지 같은 정보도 변수로 제공된다(예전에 기록한 시각과의 차이를 계산하는 데 활용 가능). 기본 입력 스키마에는 존재하지 않던 정보들이다.

그래서 이를 이용하면 한 글쇠를 0.n초 이상 오래 누른 것, 혹은 0.n초 이내에 눌렀다가 뗀 것, 어떤 두 글쇠를 연달아 누른 것, 굳이 Shift+X가 아니라 Shift를 한번 눌렀다 떼고 나서 다음 X를 순차적으로 누른 것 같은 복잡한 글쇠 동작을 모두 인식할 수 있으며, 글쇠를 오래 누르고 있어도 연타는 한 번 또는 n회 이내만 인식시킬 수도 있다. 기본 입력 스키마에다가 옵션으로 넣으려고 했으나 이론적인 기반을 마련하지 못해 지금까지 전혀 구현을 못 하고 있던 변칙적인 글쇠 인식은 전부 고급 입력 스키마를 통해 general하게 구현 가능해졌다.

단, 고급 입력 스키마는 기본 입력 스키마처럼 modifier 조합 같은 게 없다. 오로지 어떤 글쇠의 눌렀다 떼는 것에만 초점이 가 있으며, 두 글쇠의 조합은 각각의 글쇠가 눌러졌을 때 사용자가 변수에다 해당 글쇠가 눌렸다는 것을 일일이 판단함으로써 모든 로직을 수동으로 구현해야 한다. 기본 입력 스키마보다 설계 철학이 더 저수준이기 때문이다.

기본 입력 스키마는 날개셋문자를 있는 그대로 차근차근 보내는 것만 가능하다. 그러나 고급 입력 스키마는 사용자가 지정한 수식값에 따라서 지금 조합 중인 문자를 덮어쓰고 조합을 무조건 새로 시작시킬 수 있으며, 지금 조합을 무조건 종료한 뒤에 조합을 새로 시작시킬 수도 있다. 전자는 'ㄱ+ㅏ'를 '가'가 아니라 'ㅏ'로 바꾸는 기능이며, 후자는 'ㄱㅏ'로 바꾸는 것이라고 생각하면 이해하기 쉽다. 자기와 연결되어 있는 문자 생성기의 상태를 무시하고 입력을 보내는 게 가능하다는 뜻이다.

이런 고급 입력 스키마가 고급 입력기라는 문자 생성기와 만나면 활용 가능성은 더욱 커지는 건 두 말할 나위가 없다. 평상시에는 일반적인 방법으로 한 타씩 한글을 입력하지만, 특수한 글쇠 두어 개를 동시에 누르거나 한 글쇠를 오래 누른다거나 하면 미리 지정해 둔 '습니다', '000' 같은 글자 묶음이 지금 조합을 무시하거나 종료시킨 상태에서 곧장 입력되게 할 수 있기 때문이다.

더 자세한 개념과 기능 설명에 대해서는 고급 입력 스키마를 꺼낸 뒤, "고급 글쇠 인식 옵션" 페이지에서 F1 도움말을 참고하면 된다. 앞으로 이걸 이용한 창의적인 문자 입력 방식이 많이 고안되어 나오면 좋겠다. 예제 템플릿 수식 같은 거라도 더 넣어서 고급 입력 스키마에 대한 사용 접근성을 더 개선하는 게 추후 과제로 남아 있다.
또한 지금 만들어 놓은 입력 설정을 그대로 유지하면서 기반 루틴만 '기본'이던 것을 '고급'으로 업그레이드하는 방법이 없는 게 문제라면 문제임을 인정한다. 기반 루틴을 바꾸고 나면 글쇠배열 같은 입력 설정은 다시 세팅을 해야 한다.

다음 버전인 7.5에서는 이번 7.4에서 실험적으로 구현한 기능을 바탕으로, 한글의 동시 입력에 특화된 보정 기능들이 추가될 예정이다.

3. 고급 입력기 -- 한글 출력 치환

입력 스키마에 이어 문자 생성기에도 '고급 입력기'에 신선한 기능이 새로 추가되었다.
잠시 개념을 좀 복습하자면, 빈 입력기는 아시다시피 오토마타, 조합, 후보 변환 같은 게 없이 문자를 있는 그대로 완성된 형태로만 보낼 수 있는 제일 원초적인 문자 생성기이다. 영문 같은 문자에나 적합하다.
기본 입력기는 그야말로 한글 한 글자를 조합하는 데 필요한 온갖 복잡 화려한 <날개셋> 한글 입력기의 핵심 기능들이 모두 구현되어 있는 문자 생성기이다.

그리고 고급 입력기는 기본 입력기의 기능들을 바탕으로, 비한글 문자의 custom 조합과, 한글 입력과 비한글 입력을 서로 연동하는 액세서리 기능이 추가적으로 들어있다. 설계 철학이 이러하다는 걸 염두에 두도록 하자.
이번 7.4에서는 '한글 출력 치환'이라는 기능이 고급 입력기에 추가되었다. 언뜻 보기에 이것은 편집기 계층에 존재하는 '최종 변환 규칙'의 입력기 계층 버전처럼 보이기 쉬우나, 성격이 그것과는 약간 다르다.

한글 출력 치환은 초중종성 낱자별로 동작하는 버전과 글자 전체 단위로 동작하는 버전이 따로 존재한다.
전자는 가상 낱자를 가리면서 동작하고--다시 말해 세벌식에서 겹모음용 ㅗ/ㅜ와 홑모음용 ㅗ/ㅜ를 구분한다는 뜻--
후자는 그걸 따지지 않고 그냥 겉으로 보이는 한글 전체의 모양만 따지며 동작한다.

낱자 버전부터 설명하도록 하겠다.
초중종이 각각 ABC로 구성된 한글이 있고, 초중종 A, B, C에 대해 각각 1, 2, 3이라는 문자열로 출력 치환하는 규칙이 존재한다면.. ABC라는 한글은 대략 1A2BC3이라고 바뀌어 출력되게 된다. 즉, 한글의 앞뒤로 비한글 일반 문자가 삽입되며 특히 중성에 치환 규칙이 존재하면 한글 자체가 초/중종 두 글자로 찢어진다.

이런 기능이 왜 필요하며 무슨 용도로 쓸 수 있을까?
주된 활용 방법 중 하나는, 한글 입력 과정에서 현행 한글 코드에 존재하지 않는 복잡한 겹낱자를 잠시 표현해야 할 때, 이를 여러 개의 기존 낱자로 풀어서 표현하는 것이다. 물론, 123 말고 ABC 자체의 형태를 바꾸려면 기존 가상 낱자 규칙을 쓰면 된다. 따라서 낱자 출력 치환은 가상 낱자 규칙과도 연계해서 활용하면 좋다.

이번 7.4에서는 천지인이나 나랏글 같은 휴대전화 입력 방식 예제가 다 이 기능을 사용하여 다시 만들어져 있다.
종성 부분을 보면, 내부적으로는 받침 ㅃ, ㄸ, ㅉ이지만 겉으로는 초성 ㅃ, ㄸ, ㅉ이 다음 글자에 가 있는 것처럼 화면에 나타나는데, 가상 낱자를 써서 받침 ㅃ, ㄸ, ㅉ을 0으로 치환하여 원래 있던 자리에서는 없애 버리고, 그 대신 출력 치환 규칙에다가 초성 ㅃ, ㄸ, ㅉ을 대신 출력하게 한 것이다.

ㄴ+ㅇ, ㄱ+ㅆ, ㄱ+ㅊ 같은 받침이야 더 말할 필요도 없다. 300 이상의 가상의 받침을 설정한 뒤, 가상 낱자 규칙에다가는 ㄴ, ㄱ 같은 앞부분 받침만 나타나게 하고, 뒷부분 받침은 출력 치환 규칙으로 지정했다. 한글 한 글자를 조합하는 걸로 두 글자 이상의 한글이 한꺼번에 나타나게 하는 걸 이런 이론 기반으로 구현해 냈다.
단, 외부 모듈의 경우 한글 조합이 길이가 한 글자를 넘어가면 응용 프로그램에 따라서는 조합 중인 문자가 제대로 표현되지 않을 수 있으므로 주의가 필요하다.

다음으로 글자 버전은.. 쉽다. 말 그대로 지금 조합 중인 한글을 다른 문자로 바꿔서 보여 주는 것 그 이상도 이하도 아니다. 한글 입력 방식을 한글로 다른 문자를 입력하는 데 고스란히 활용할 수 있으며, 덕분에 사용자 정의 조합 기능을 쓸 일도 크게 줄어든다.

이것 덕분에 아래아한글 97 이래로 지금까지 구현된 적이 없던.. 한글로 일본 문자 입력이 가능해졌다. 이번 버전에서는 히라가나/가타카나를 종전과 같은 로마자 기반 사용자 정의 조합뿐만 아니라, 한글 출력 치환으로 구현한 예제 파일이 새로 추가됐다.

이와 관련하여, "한글 출력 범위(=문자 집합) 제한"에도 유용한 기능이 하나 추가됐다. 지금까지는 KSX1001 2350자, 한컴 2바이트 완조형, 한양 PUA 완성형처럼 완전 legacy 잉여 문자 집합을 생색내기로 흉내 내는 기능만 있었던 반면, 바로 <날개셋> 고급 입력기의 한글 출력 치환 규칙이 존재하는 글자만 허용하는 기능이 새로 추가된 것이다.
한글로 일본어 문자를 입력하는 예제 파일을 써 보면, 일본어 치환이 존재하지 않는 한글은 아예 조합이 되지 않고 낱자가 다음 글자로 튕기는 걸 볼 수 있다.

(다만, 지금까지 사용자 정의 조합으로 구현되어 있던 구결 입력 방식은, 그냥 외장형 "사용자 후보 변환"으로 입력하는 데이터 파일로 형태를 바꿨다. 한 한글에 대응하는 구결 문자가 여럿 있기 때문에 후보 변환이 더 적절하다고 판단되어서이다.)

4. 그 밖에

이번 7.4에서 이뤄 낸 위의 1~3 아이템들은 생각만 해도 후련하다. 왜 이런 기능들이 무려 2014년에 와서야 실현된 걸까. ㅠ.ㅠ 일반 사용자의 입장에서야 <날개셋> 편집기에 다른 에디터에도 있는 기능들이 덩달아 들어가기를 더 원할지 모르고 현실적으로는 외부 모듈의 안정성 개선이 더 중요하게 느껴질지 모르나, 본인의 입장에서는 그런 건 개발 방향과 직접적인 관계가 없거나 최소한 부가적인 요소들이다.

<날개셋> 한글 입력기의 개발에서 본인이 가장 중요하게 여기는 건 한글 입력과 관련된 기술을 한데 통합할 수 있는 이론 연구와 구현이다. 그러니 편집기는 10년 전이나 지금이나 똑같은 촌스럽기 그지없는 MDI 프로그램 외형이지만, 그 속의 깊이는 갈수록 심오해지고 있다. 이번 7.4가 개발 기간이 괜히 길었던 게 아니며, 7.2나 7.3을 건너뛰고 괜히 바로 7.4로 간 게 아니다.

프로그램 버전이 7.x대까지 가고 나니 프로그램의 완성도는 충분히 정착한 듯하며, 이를 토대로 지금까지 못 하고 있던 long-term 이론 연구를 최대한 진행했다.
고급 입력 스키마와 고급 입력기는 모두 ngs3 모듈이 아니라 ngsx라는 플러그 인 모듈이 담당하고 있는데, 이런 대규모 작업 덕분에 드디어 ngsx의 프로그램 크기가 <날개셋> 편집기 ngsedit의 크기를 근소하게 추월했다.

분량이 벌써 굉장히 길어진 관계로, 이 항목에서는 고급 입력기와 관련된 변화 사항을 조금만 더 얘기하고 나머지 새 버전 자랑은 다음 하편으로 미루도록 하겠다. ㅎㅎ 그러고 보니 타자연습도 빨랑 업데이트하고 저거 얘기도 해야 되는데..

7.4에서는 한글 로마자 입력 방식의 근간인 글쇠 치환 규칙이 동작하는 방식이 살짝 바뀌었다. 새로운 기능 추가가 아니라 변경임. 글쇠 치환 규칙에 존재하던 잡다한 옵션들이 모두 없어지고 이들의 구현 방식이 다른 대체제로 바뀌었다.

caps lock 무시 옵션이 없어졌기 때문에 이제는 기반 영문 글쇠배열이 caps lock을 구분하여 동작하지 않도록 바뀌어야 한다. 이것은 글쇠배열 편집기를 우클릭한 후 "전체 간소화 → 수식 제거"를 선택하면 된다. 하지만 간단히 한글 로마자 입력 빠른설정만 다시 실행해 줘도 7.4 버전 기준에 맞는 로마자 입력 방식이 다시 세팅된다.

shift 음절 강제 구분 옵션도 없어졌으며, 조합을 하는 낱자와 조합을 안 하는 낱자는 두벌식/세벌식 한글 타입으로 오토마타 차원에서 구분을 한다. 비슷한 메커니즘이 이미 네벌식 예제 입력 방식에서도 쓰인 적이 있다.
다만 이것 때문에 현재 한글로부터 글자판 입력 문자열을 구하는 방식이 제대로 동작하지 않고 있는데, 이것은 7.5에서 해당 알고리즘을 싹 다시 구현할 때 문제를 개선할 예정이다.

끝으로, 두벌식 처리 옵션도 없어졌다. 두벌식 한글로 치환되는 글쇠는 언제나 초성과 종성이 현재의 오토마타 상태에 따라 자동으로 구분되어 두벌식으로 처리된다. 번거로운 절차를 없앴다. 이 점 착오 없으시기 바란다.

Posted by 사무엘

2014/06/01 08:27 2014/06/01 08:27
Response
No Trackback , 8 Comments
RSS :
http://moogi.new21.org/tc/rss/response/969

« Previous : 1 : ... 3 : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 11 : ... 13 : Next »

블로그 이미지

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

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2024/03   »
          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            

Site Stats

Total hits:
2635439
Today:
2237
Yesterday:
1754