<날개셋> 한글 입력기 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

Trackback URL : http://moogi.new21.org/tc/trackback/1006

Comments List

  1. 지나가며 2014/10/27 17:14 # M/D Reply Permalink

    한글 3벌식을 위해 애쓰시는 것에 대해 감사하게 생각합니다.
    한글 입력기를 사용해 보겠습니다.
    저도 3벌식을 오랫 동안 사용하고 있지만, 자녀에게는 3벌식을 가르치지 않고 지가 알아서 공부하도록 방치하고 있습니다. 그것은 아무래도 아직까지 3벌식을 사용하는 것이 여러 모로 불편한 점이 있었기 때문입니다.
    2벌식에도 문제가 많지만, 당장 3벌식을 가르치자니 너무 힘든 측면이 있다고나 할까요.

    정치적인 견해에 대해서는 저하고 다소 차이점이 있는 것 같습니다.
    기본적으로 대한민국은 민주공화국입니다. 민주공화국을 파괴했던 독재세력에 대항해서 다시 민주공화국으로의 위상을 되찾았습니다. 독재세력을 필요악이라고 할 수도 있지만, 필요하지만 악은 분명히 악이라는 것을 인정해야 합니다.
    물론 이 세상에 절대 선은 없습니다. 하지만 현대 헌법에 따른 민주국가에서는 독재란 분명 체제를 붕괴시키는 악입니다. 꼭 공산주의만 그런 것은 아니지요. 공산주의와 전체주의는 모두 뿌리가 같습니다. 대등한 권력관계가 아니라 특정부류에게 권력을 집중시킨다는 점이지요. 인간의 악을 견제 균형할 수 없는 수단을 제거하는 것입니다.
    박정희와 김일성은 같은 존재입니다. 박정희가 김일성을 막은 것이 아닙니다. 둘은 서로 공생했지요.
    민주주의적 사고방식으로 보면 이것은 너무 자명할 것입니다. 민주주의적 견지로 보면, 박정희와 김일성은 모두 민주주의에 대한 적입니다.

    1. 사무엘 2014/10/27 20:01 # M/D Permalink

      세벌식 자판에 관심을 가져 주셔서 고맙습니다.
      다만, 그냥 MS 한글 IME로도 세벌식 자판 자체는 얼마든지 쓸 수 있으니 제 프로그램은 특별히 사용하고 싶은 customize 기능이 있을 때 시도해 보셔도 됩니다.

      정치 쪽은 죄송하지만 상대방 말을 들을 의향이 없는 분(본인과 견해가 다른 사람이 아님)과의 논쟁은 극구 사양하오니, 자신이 그런 속성에 해당하는지 다시 한번 생각해 보시기 바랍니다.
      안보가 탄탄하고 등 따시고 배가 불러야 그 뒤에야 민주화고 뭐고 더 고차원적인 욕구를 추구할 수 있지요. 남북 지도자를 그렇게 판단하는 것은 북한 주민들에 대한 모독이며, 올바른 판단이 전혀 아닙니다.
      저는 아무 근거 없이 주장을 하는 게 아니니, 굳이 제 사상을 안 바꿔 놓고는 못 견디겠다면 '현대사/안보' 카테고리 글을 먼저 정독은 해 보실 것을 권합니다. 감사합니다.

  2. wishdon 2015/07/09 15:15 # M/D Reply Permalink

    안녕하세요, 세벌식 최종 사용자입니다. 날개셋 입력기 너무 잘 쓰고 있습니다. 감사합니다.
    날개셋 입력기는 다양한 입력 방식을 테스트 해볼수 있어서 정말 좋은것 같습니다.
    제가 아는 한도내에서는 동시치기를 할 수 있는 가장 좋은 입력기 입니다.
    그런데, 한가지 의문점이 들어서 덧글 남겨봅니다.

    혹시 `500 + 중성'은 합성을 하지만 `중성 + 500'은 합성은 하지 않고 있는것 아닌지요?
    "과"를 입력할 때, "이중모음 정석 강요+받침은 한타로만+세벌식 모아치기2"에서
    "ㄱ + ㅗ(500) + ㅏ"은 "과"가 되지만 "ㄱ + ㅏ + ㅗ(500)"은 "가 ㅗ" 가 됩니다.
    다른 옵션들로 거의 완벽한 동시치기가 되는데 딱 이경우 하나가 걸리네요.
    제가 잘 못이해하고 있는건지, 이 상황을 처리할 방법이 있는지 문의드립니다.

    감사합니다.

    1. 사무엘 2015/07/09 15:55 # M/D Permalink

      안녕하세요? 딱 최소주의에 입각한 형태로 세벌식 최종 글자판을 사용하고 계시네요.
      A+B뿐만 아니라 B+A도 조합되게 낱자 결합 규칙을 직접 넣어 주면 됩니다.
      "낱자 처리 → 중성"에서 "ㅏ+ㅗ(500) → ㅘ"를 추가해 보세요. 감사합니다.

Leave a comment
« Previous : 1 : ... 1322 : 1323 : 1324 : 1325 : 1326 : 1327 : 1328 : 1329 : 1330 : ... 2204 : Next »

블로그 이미지

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

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

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

Site Stats

Total hits:
2978568
Today:
338
Yesterday:
1358