Search Results for '2019/06/16'


1 POSTS

  1. 2019/06/16 다음 버전 개발 근황 by 사무엘 (6)

다음 버전 개발 근황

올해가 벌써 절반이 끝나 가는구나.. ㅠㅠ 오늘은 오랜만에 프로그램 개발 소식을 전하도록 하겠다. 날개셋 한글 입력기 9.8과 타자연습 3.9가 일단은 다음 달, 즉 7월 초/중순 쯤에 나올 예정이다.
4~5월쯤에 9.71 형태로 나왔어야 할 물건이었으나.. 온갖 곳에서 고치고 개선할 점들이 잔뜩 튀어나오는 바람에 일정은 한없이 늘어나고 버전도 0.1 더 오르게 됐다.

새 버전이 지금 나왔다는 말이 아니니 오해 없으시기 바란다. 이 글은 내부적으로 작업이 완료된 것들만 늘어놓은 것이다. 새 버전이 완성되어 실제로 업로드될 즈음에는 다른 개발 아이템들이 더 추가되어 있을 것이다. 난 예나 지금이나 날개셋 한글 입력기 코딩을 할 때 내가 살아 있음을 느끼고 삶의 의미와 목적을 느낀다.

1. 오동작· 안정성과 관계 있는 버그

(1) 날개셋 제어판에서 빠른설정을 적용하는 등 입력 설정을 이것저것 바꾼 뒤 닫을 때 프로그램이 가끔 뻗던 버그는 이미 지난 4월에 문제의 원인을 파악해서 해결했다.
지난 9.5쯤부터인가, 화살표 키로 제어판의 카테고리를 이동할 때 페이지가 곧바로 표시되지 않고 약간 뜸을 들인 뒤에 표시되기 시작했는데(UI 반응성의 향상을 위해), 그 동작의 부작용 때문에 그런 문제가 발생했던 것이었다. 문제의 정확한 발생 조건을 찾기가 굉장히 어려웠다.

(2) 아울러, 편집기에서 다른 TSF 방식 외부 모듈을 구동해서 한글 조합을 만들었다가 끊기를 반복할 때 memory leak가 발생하던 것도 비슷한 시기에 해결됐다. 원인은 내가 짠 코드의 COM object 관리 잘못 때문이라고 허무하게 판명되었다.
옛날 버전까지 다 구해서 추적해 보니 8.2 또는 8.4 버전쯤부터 슬며시 생겼던 문제이다. (8.0 문제 없음, 8.4 있음.. 8.2는 구해 보지 못함) 그러니 대략 2016년쯤에 작성한 코드에 버그가 들어간 셈인데, 너무 옛날이어서 내가 그 시절의 코드 스냅샷까지는 갖고 있지 않았다. 결국 에디팅 엔진을 통째로 다 뜯어내고 전수조사를 벌여야 했다.

내 프로그램 코드에서 어지간한 포인터들은 RAII 이념에 충실하게 몽땅 smart pointer 역할을 하는 클래스로 감싸 놨다. 그렇기 때문에 소멸자에서 알아서 해제가 되며, 무식한 memory leak 같은 게 발생할 여지는 거의 없다.
하지만 포인터가 타 구조체의 멤버로 들어있거나, 포인터를 얻는 함수로 종료 조건으로 삼아서 뺑뺑이를 돌 때(while, for문)는 이런 자동화의 혜택을 받지 못한다. 이번 버그도 그런 사각지대에 존재하고 있었다.;;

(*) 최근엔 크롬 브라우저에서 날개셋 한글 입력기가 제대로 동작하지 않고 프로그램이 뻗는다는 버그 신고가 곳곳에서 들어와 있다. 크롬이 버전 74쯤부터 과거에 존재하던 버그가 고쳐져서 뭔가 좀 개선이 됐나 싶었는데.. 그 대신 다른 문제가 생긴 것 같다.
특히 신세기 님께서 제작하신 세벌식 모아치기 설정을 사용했을 때 크롬이 뻗는 것은 본인도 확인했다. 하지만 뻗은 지점이 내 코드가 아니라 크롬의 코드인지라.. 원인이 정확하게 무엇인지, 문제를 피해 갈 방법이 무엇인지는 아직 잘 모르겠다. 혹시 타이머 때문인가 추측만 할 뿐이다.

(*) 똑같은 영문인데 어떤 프로그램에서는 글쇠를 IME가 가로채지 않고 그대로 넘겨 줘야 정상 동작하고, 어떤 프로그램에서는 반드시 가로채 줘야 정상 동작하는 경우가 있다.
얼마 전엔 인디자인에서 한글 조합 중의 space/enter 키 인식 문제 때문에 본인에게 문의를 하신 분이 있었다. 인디자인은 여전히 몇 년째 그 버그가 고쳐지지 않고 있는가 보다.

사실, 글쇠를 IME가 가로채든 그렇지 않든.. 원래는 문자 입력 기능의 동작에 차이가 있어서는 안 된다. 그리고 사실 어찌 보면, 일부러 다르게 동작하게 만드는 게 더 어렵다.
하지만 한중일 언어나 문자 따위 모르는 외국인의 입장에서는 IME 인식하며 동작하는 프로그램에 대한 지식이 부족하고 정상적인 동작 모습을 상상하기 쉽지 않을 것이다. 그러니 이건 해당 프로그램이 고쳐지기를 바랄 수밖에 없는 노릇이다.

2. 안정성까지는 아니지만 그래도 사소하지 않은 버그

(1) 언제부턴가 문자 생성기가 기본이 아닌 고급인 상태에서 타이머 설정 대화상자를 들어가 보면 기존 타이머 설정들이 제대로 설정되지 않던 문제가 있었다. 곧바로 고쳤다.

(2) 날개셋 편집기에는 문자 영역 검색 기능이 있다. 굉장히 옛날부터 제공되었고 지금까지 큰 변화도 없는데, A<=0xFF, A==0처럼 아예 0문자가 조건에 걸릴 수 있게 수식을 주면 텍스트 블록이 이상하게 잡히면서 프로그램이 오동작한다. 이 버그를 이제야 발견해서 즉시 고쳤다.

3. UI

(1) 모든 대화상자들에서 명령 버튼의 기본 크기를 45*16 DLU 대신 47*15 DLU로 소폭 수정했다. 마소가 권장하는 50*14 dlu와 완전히 같지는 않지만 그에 좀 더 근접하게 바꾼 것이다. 버튼의 높이가 16 dlu이면 다른 한 줄짜리 에디트 박스와 비교해 봐도 솔직히 너무 크긴 했다.

(2) 고급 입력 스키마의 '고급 글쇠 인식' 페이지는 각 글쇠별로 down/up 상황에 대해 복잡한 수식을 설정하는 곳이다. 글쇠를 추가하거나 편집하는 UI를 별도의 대화상자로 만들어도 됐을 것 같으나.. 어쩌다 보니 동일 페이지에서 몽땅 설정한 뒤에 '추가'를 누르는 형태가 됐다.
한창 수식을 편집하고 있다가 왼쪽의 글쇠 리스트에서 다른 걸 찍는 순간 그 임시 데이터들은 몽땅 날아가 버린다. 이것이 직관적이지 못하다고 여겨진지라, "편집하던 내용을 반영/저장할까요?"라는 질문을 표시하게 했다.

(3) 외부 모듈(입력 패드도 포함)은 전용 환경인 편집기와 달리 한글 표현 방식을 따로 설정하는 곳이 있다.
이걸 옛한글이 아닌 현대 한글로 맞춰 놓은 상태에서 옛한글의 입력을 시도하면 지금까지는 간단한 주의· 경고문이 나타났다. 한 번 나타난 뒤엔 다시 나타나지 않지만, 현재 프로그램이 실행돼 있는 동안만으로 한정이고, 그 다음부터는 또 나타난다.

옛할글이 온전히 표시되지 못하고 첫 자음이나 모음만 나타나도 괜찮으니, 일부러 이런 설정을 일시적으로 사용하는 사람도 있다는 점을 감안하여.. 메시지 박스에다가 "다음부터 이 메시지를 표시하지 않음" 체크를 넣었다. 이걸 체크하면 최소한 다음에 제어판을 열어서 한글 표현 방식 옵션을 변경하기 전까지는 동일 메시지가 나타나지 않게 된다.
그리고 메시지를 '확인'이 아닌 '예/아니요' 형태로 바꿔서 그냥 즉석에서 설정을 옛한글을 사용하도록 변경할 수도 있게 했다.

사용자 삽입 이미지

(4) 제어판의 '시스템 계층'을 가 보면 다음에 편집기나 외부 모듈 같은 구현체 프로그램이 실행될 때 자동으로 띄워 놓을 입력 도구들을 선택하는 체크 상자가 있다.
이것은 지난 9.3 버전부터 추가된 옵션이다. 지금까지는 체크들을 모두 없애는 버튼만 있었는데.. 사실은 지금 사용자가 띄워 놓은 도구들을 그대로 다음에도 자동으로 띄우도록 하는 버튼도 있는 게 사용자의 입장에서 좋다.

사용자 삽입 이미지

그래서 그 버튼이 이번 9.8에서 추가되었다. 이걸 구현하기 위해서는 제어판 대화상자가 자신을 호출한 호스트와 통신하는 방식이 확장되고 고쳐져야 했다. 이 과정에서 코드가 더 깔끔하게 바뀌긴 했지만 타자연습도 API 호환이 깨졌다. 그래서 최신 버전을 쓰려면 입력기도 반드시 최신 버전을 써야 하게 됐다.

4. 입력 도구들의 깨알같은 개선점

(1) '휴대전화 입력기'의 숫자 모드에서 표시 형식을 전화기가 아닌 계산기를 선택했을 때.. 0과 그 주변의 숫자 배치를 실제 계산기에 더 가깝게 변경했다. 무성의한 , 0 . 대신 0 00 . 로 바꿨다.
글쎄, 콤마가 사라진 건 아쉽지만 계산기라면 0이 왼쪽에 가 있고 00이 있긴 해야 할 듯해서 말이다. 00이야 날개셋문자의 '다중 문자' 타입으로 간단히 구현 가능하다.

사용자 삽입 이미지

(2) '화면 키보드'에서 '눌린 글쇠 표시' 옵션을 켜면, Caps lock의 경우 램프가 켜진 것도 글쇠배열에 반영되어 보이게 했다. 이 간단하고 당연한 동작을 왜 지금까지 구현하지 않고 있었나 모르겠다.

(3) '조합 안에 조합 생성'의 '영문 T9 방식 입력'을 위한 DB가 지금까지 8~9글자짜리 짧은 단어밖에 없어서 불편했는데.. 이번에 최대 15자짜리 긴 단어도 대폭 추가했다. 그래서 DB의 내장 어휘 수와 파일 크기도 거의 2배 가까이 증가했다. international 같은 단어를 예전보다 더 편하게 입력할 수 있을 것이다.

(4) 예제로 제공되던 "천지인, SKY, Google 단모음 입력 방식"에 종성뿐만 아니라 초성도 시간차로 경계를 구분하는 로직을 추가했다. 이들 입력 설정에는 오토마타에 "B ? 2 : 0"라고 중성의 입력만 받아들이는 새로운 상태가 추가되었다. 초성만 입력된 상태에서 타이머가 경과하면 이 상태로 진입하게 된다. 임시 변수를 동원해서 글쇠배열 수식을 고치는 방식으로도 동일 기능을 구현할 수 있긴 하지만 그냥 오토마타를 고치는 게 더 단순하다.
그리고 '내부 입력 상태 표시' 도구에서.. 수식 계산만 하고 별도의 날개셋문자를 보내지 않는 타이머가 경과했을 때 변수 상태를 업데이트 해서 보여주지 않는 버그를 발견하여 이것도 고쳤다.

5. '한글 낱자 재결합'의 기능 개선과 강화

텍스트 필터 중에 '한글 낱자 재결합'이라고, 블록으로 잡은 한글을 낱자 단위로 분해한 뒤 다시 조합시키는 기능이 있다. 얘는 사용하면 동일한 타자 시퀀스인 한글을 모아쓰기/풀어쓰기, 복합 낱자/기본 낱자 등의 형태로 변환할 수 있다. '문자열을 글자판 입력으로 → 글자판 입력을 문자열로' 필터를 연달아 적용한 것과 비슷하지만, 얘는 한글이 아닌 문자를 제거한다거나 초중종 결합 여부와 순서를 더 세밀하게 지정할 수도 있다.

한글을 재결합하기 위해서는 먼저 분해부터 해야 하는데.. 지금까지는 그냥 평범하게 현재 입력 설정을 바탕으로 타자 순서를 구하는 식으로 분해했다.
그러니 세벌식의 경우, ㄻㅄㄲ처럼 글쇠가 별도로 존재하는 겹받침들은 더 분해되지 않았다. 그리고 지금 입력 설정에서 타자 순서를 구할 수 없는 낱자는 분해가 불가능하니 그 낱자를 그냥 통째로 취급했다. 가령, 현대 한글 입력 방식을 사용하면서 옛한글을 재결합 시켰을 때 말이다.

이번 버전에서는 '결합'은 현재 입력 설정을 따라서 하지만, '분해'는 입력 설정과 무관하게 그냥 그 한글 낱자의 기본 낱자 형태로 직관적으로 하는 옵션을 추가했다. 자음은 ㄱ~ㅎ과 ㅿㆆㆁ, 정치· 치두음, 모음은 ㅏ~ㅣ와 ㅐㅔㅒㅖ, 아래아 단위로 분해한다.

사용자 삽입 이미지

그래서 ㄻㅄㄲ은 초· 종성과 현재 입력 설정을 불문하고 언제나 ㄹㅁ, ㅂㅅ, ㄱㄱ의 형태로 분해된다. 낱자 결합 규칙과 오토마타가 전혀 없는 입력 설정에서 이 방식으로 한글 낱자를 분해하고 재결합하면 한글을 기본 낱자들로 늘어놓을 수 있다. 이건 회사 사람에게서 제안 받은 아이디어인데 꽤 의미 있고 유용한 기능인 것 같다.

그리고 다음으로, 예전과 같이 '타자 순서'대로 한글을 분해할 때, 종성 두벌식 방식의 한글이 제대로 처리되지 않던 문제를 해결했다. 예전에는 '한' 같은 글자를 재결합하면 ㅎ이 곧이곧대로 종성으로 인식되어서 중성 다음에 ㅏㅎㄴ 같은 식으로 결합됐는데.. 이 동작이 개선되었다.

6. 타자연습

(1) 다소 엽기적인 연습글인 이 상의 '오감도', 그리고 '영화 클레멘타인 감상평'을 연습글로 추가했다. "13인의아해가거리로질주하오"라든가.. "남친 집에서 클레멘타인 DVD를 발견했고, 결혼을 결심했습니다" 같은 문장으로 타자 연습을 할 수 있다.

(2) 예전엔 이런 현상이 없었던 것 같은데.. 게임을 창 모드에서 하다가 Alt+Enter를 눌러서 전체 화면으로 진입하면 첫 프레임은 화면이 전체적으로 몇 픽셀 offset되어 잘못 렌더링 되다가 그 다음부터 제대로 된다. 화면이 수시로 업데이트 되는 게임 중이면 별 상관 없지만, 첫 프레임이 "레벨 n 시작합니다" / "게임을 그만 할까요?" 같은 메시지 화면일 때는 다소 부자연스러운 glitch가 된다.
이 현상을 수정했다. 아마 Windows 8/10쯤에서 새로 발생한 부작용 같다.

(3) 그 외에 댓글로 올라온 의견과 제안을 반영하여 도움말의 일부 오타를 고쳤다. 그리고 게임에서 저장 가능한 상태 또는 이미 저장된 상태를 사용자에게 더 분명하게 알려주게 했다.
저장은 사용자가 게임에서 한 레벨 이상을 직접 깨서 다음 레벨로 진입한 다음부터 가능하다. 단, 레벨 2는 너무 낮고 쉬운 레벨이기 때문에 제외다. 저장되는 대상은 시작 레벨과 주인공 종류, 체력과 장갑, 점수이다. 게임 도중의 중간 상태는 저장되지 않으며, 저장 슬롯 자체도 단 하나만 만들 수 있다.

저장 기능 자체는 오랫동안 지원돼 왔으며 딱히 버그도 없었다. 단지 저장이 가능한 레벨이 시작되었을 때는 게임 시작 안내 화면의 우측 하단에 "F4: 저장"이라는 말을 작게나마 출력하게 했으며, 이때도 저장을 할 수 있게 했다. 그리고 게임 중에 사용자가 F4를 여러 번 누르면 "이 레벨의 시작 지점이 이미 저장돼 있습니다"라는 안내도 나오게 했다.

Posted by 사무엘

2019/06/16 08:32 2019/06/16 08:32
Response
No Trackback , 6 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1630


블로그 이미지

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

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2019/06   »
            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:
2659917
Today:
1153
Yesterday:
1047