다솜 입력기 테스트 버전을 준비하고 있습니다.

다솜 입력기 개발 진행 상태입니다.
현재 굵직한 버그를 잡았고 곧 테스트 버전을 준비하고 있습니다.

다음은 http://www.cogno.org/node/134 와 동일한 글입니다.

안녕하세요…
다솜 입력기를 만들기 시작한지가 벌써 5개월 정도 지났습니다.
최근 입력기 서버 및 im 클라이언트에 있던 굵직한 버그(race condition)를 잡았습니다.
그걸 잡고 나니 focus out / focus in 이 싱크가 안 맞더군요.
자세히 살펴보니…
창이 2개가 있고, 창1에 포커스가 있을 때, 창2번을 찍으면
창1번은 focus out 신호를 발생시키고 focus out 신호에 대한 처리(reset, commit 등)가 완료되지 않아도
창2번은 바로 focus in 신호를 발생시킵니다.
아마도 윈도 관리자가 창관리를 thread로 처리할 것으로 추정됩니다. 그래서 이러한 현상이 나타나는 것 같습니다.
그래서 focus in / out 싱크 맞추기 위해 아래처럼 작성하였습니다.

[code:3ereq4pk]
case DASOM_MESSAGE_FOCUS_OUT:
pending = TRUE;
dasom_context_focus_out (context);
dasom_send_message (socket, DASOM_MESSAGE_FOCUS_OUT_REPLY, NULL, NULL);
pending = FALSE;
break;
...
if (pending)
{
ctx = g_main_context_new ();
GSource *source = g_socket_create_source (context->socket, G_IO_IN, NULL);
g_source_set_can_recurse (source, TRUE);
g_source_set_callback (source, (GSourceFunc) on_incoming_message_dasom, context, NULL);
g_source_attach (source, ctx);
}

do {
g_main_context_iteration (ctx, TRUE);
} while (context->reply && (context->reply->type != type));
[/code:3ereq4pk]
이것은 완벽한 해결책은 아닙니다. 왜냐하면 서버 엔진의 focus_out 함수에서 signal 을 발생시킨 후 이를 처리하는 클라이언트의 callback에서 아래처럼 비정상적으로 호출할 경우 문제가 발생할 수 있기 때문입니다.
또한, engine의 caller (target context)가 변경이 되기 때문입니다.

[code:3ereq4pk]
void client_signal_callback (im1)
{
dasom_im_some_api (im1); /* fd: 38 이런 건 문제가 되지 않습니다. /
dasom_im_some_api (im2); /
fd: 39 이렇게 im1과는 다른 im2를 호출하는 경우 문제가 됩니다 */
}
[/code:3ereq4pk]
위의 같은 코드를 허용하려면 현재 모듈별로 engine 인스턴스가 1개만 생성되는 싱글톤 방식인데, 클라이언트 context 당 1개씩 생성하도록 변경하면 해결이 되지만, 이 경우 클라이언트/서버 구조로 만들 필요도 없어지고 그냥 일반적인 라이브러리 호출로 작성하고 엔진이 변경될 때 입력기 상태 알림 agent 서버에 한/영/중/일 엔진 상태를 알려주도록 만들면 되겠죠.
그런데 왜 서버 구조로 만들었냐면, 응용 프로그램이 im_context를 여러개를 생성하기 때문에 응용 프로그램 당 im_context를 5개씩 생성한다고 가정하면, 응용 프로그램을 5개(웹 브라우저, 편집기, 파일 관리자, 음악 플레이어, 터미널) 정도 실행시키면 25개 정도의 im_context가 생성되는데 한국어의 경우 별로 부담이 되지는 않지만, 중국어, 일본어의 경우 로딩되는 사전 파일의 크기가 커서 시스템에 큰 부담이 되기 때문에, 서버측의 엔진 인스턴스를 엔진 모듈당 1개만 생성(싱글톤 방식)하도록 설계하였습니다.
그래서 엔진 인스턴스 1개로 여러 프로그램이 사용을 하게 됩니다. 예를 들어 한국어의 경우, 응응 프로그램을 5개를 실행시키더라도 서버측 엔진은 1개만 생성됩니다. 기존의 라이브러리 방식이라면 약 25개가 생성이 되겠죠.
그리고 우리가 입력을 할 때 창이 5개가 있다면 키보드 5개로 5개의 창에 동시 입력을 하는 것이 아니라, 5개의 키보드가 있다고 하더라고 키보드 1개로 촛점이 잡힌 1개의 창에 입력을 합니다. 그래서 다솜 입력기에 스레드를 사용하지 않았습니다. 스레드를 사용해봤자 얻을 수 있는 이득이 없습니다.
저 혼자 알파 테스트를 좀더 거친 후에, 반드시 필요한 최소한의 기능을 갖춘 후, 보다 폭넓은 베타 테스트를 하기 위해 테스트 버전을 조만간 만들 계획입니다.

기대를 가지고 기다리고 있습니다.
힘내십시오.

화이팅!!
혹시나 나중에 필요하신 부분이 있으시면 말씀해 주세요!

테스트 버전 준비한다는 글 올리고서 열심히 테스트하고 있는데
중대 버그가 해결이 안 된 상태인 것을 재발견…ㅠㅠ
버그 잡다가 날 샜네요. 다행히 해결했습니다.

[quote="janghe11":52ychz6r]화이팅!!
혹시나 나중에 필요하신 부분이 있으시면 말씀해 주세요![/quote:52ychz6r]

네 알겠습니다.

열심히 응원드립니다.

무더운 날 수고가 많으십니다.
응원합니다.

제가 알고 있는 버그는 모두 잡은 것 같습니다.
이제 드디어 테스트 가능한 상태가 되었습니다.

자질구레한 작업들만 남았습니다.
예를 들자면,
.deb 제작용 debian 파일, 설정 창, 한자 창 더 이쁘게 보이기, 조합 중인 상태 색깔, 예외 처리 방법 등.
엔진 개발을 위한 api 다듬기, agent / candidate interface 설계 등.
아… 나중에 시간 날 때 qt 용 모듈 및 중국어, 일본어 엔진들도 만들어야 하는군요.

초보자 분들은 따라하시면 스트레스 좀 받으실겁니다.
설치는
./autogen.sh
에러 발생시 필요한 패키지 설치.
make
sudo make install
sudo ldconfig
im-config 하면 창이 뜰텐데 Dasom 선택
윈도 logout
다시 윈도 login

프로젝트 주소

https://github.com/cogniti/dasom

버그, 기능 개선, 희망 사항 등은 아래 주소에 글을 남겨주세요.

https://github.com/cogniti/dasom/issues

autogen.sh에서 아래와 같은 메시지가 나오고 make가 진행이 안되면 어떻게 해야 하나요?

[code:3ffkv1tx]autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force -I m4
autoreconf: configure.ac: tracing
autoreconf: configure.ac: creating directory build-aux
autoreconf: running: libtoolize --copy --force
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, build-aux'. libtoolize: copying file build-aux/ltmain.sh’
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, m4'. libtoolize: copying file m4/libtool.m4’
libtoolize: copying file m4/ltoptions.m4' libtoolize: copying file m4/ltsugar.m4’
libtoolize: copying file m4/ltversion.m4' libtoolize: copying file m4/lt~obsolete.m4’
autoreconf: running: /usr/bin/autoconf --force
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing
configure.ac:13: installing ‘build-aux/ar-lib’
configure.ac:13: installing ‘build-aux/compile’
configure.ac:21: installing ‘build-aux/config.guess’
configure.ac:21: installing ‘build-aux/config.sub’
configure.ac:9: installing ‘build-aux/install-sh’
configure.ac:9: installing ‘build-aux/missing’
Makefile.am: installing ‘./INSTALL’
agents/standalone/Makefile.am: installing ‘build-aux/depcomp’
libdasom/Makefile.am:90: error: HAVE_INTROSPECTION does not appear in AM_CONDITIONAL
autoreconf: automake failed with exit status: 1[/code:3ffkv1tx]

gobject-introspection 를 설치하세요

이건 또 무슨 패키지를 설치해야 하나요?

[code:9l2rxf0l]configure: error: Package requirements (gtk±3.0) were not met:

No package ‘gtk±3.0’ found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.[/code:9l2rxf0l]

gobject-introspection libgtk-3-dev python-gtk2-dev libhangul-dev 설치 후에,
make에서 아래 오류가 나면 어떻게 해야 하나요? 그냥 deb 파일 올려주시면 안되나요?

[code:wjzjioa6]make[4]: Entering directory ‘/home/parkmino/Downloads/dasom-master/libdasom/IMdkit’
make[4]: Nothing to be done for ‘all’.
make[4]: Leaving directory ‘/home/parkmino/Downloads/dasom-master/libdasom/IMdkit’
make[4]: Entering directory ‘/home/parkmino/Downloads/dasom-master/libdasom’
CC libdasom_la-dasom-private.lo
dasom-private.c: In function ‘dasom_send_message’:
dasom-private.c:48:5: error: format ‘%ld’ expects argument of type ‘long int’, but argument 5 has type ‘gssize’ [-Werror=format=]
g_critical (G_STRLOC ": %s: sent %ld less than %d",
^
dasom-private.c:70:7: error: format ‘%ld’ expects argument of type ‘long int’, but argument 5 has type ‘gssize’ [-Werror=format=]
g_critical (G_STRLOC ": %s: sent %ld less than %d",
^
dasom-private.c: In function ‘dasom_recv_message’:
dasom-private.c:110:5: error: format ‘%ld’ expects argument of type ‘long int’, but argument 5 has type ‘gssize’ [-Werror=format=]
g_critical (G_STRLOC ": %s: received %ld less than %d",
^
dasom-private.c:138:7: error: format ‘%ld’ expects argument of type ‘long int’, but argument 5 has type ‘gssize’ [-Werror=format=]
g_critical (G_STRLOC ": %s: received %ld less than %d",
^
cc1: all warnings being treated as errors
Makefile:619: recipe for target ‘libdasom_la-dasom-private.lo’ failed
make[4]: *** [libdasom_la-dasom-private.lo] Error 1
make[4]: Leaving directory ‘/home/parkmino/Downloads/dasom-master/libdasom’
Makefile:806: recipe for target ‘all-recursive’ failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory ‘/home/parkmino/Downloads/dasom-master/libdasom’
Makefile:502: recipe for target ‘all’ failed
make[2]: *** [all] Error 2
make[2]: Leaving directory ‘/home/parkmino/Downloads/dasom-master/libdasom’
Makefile:439: recipe for target ‘all-recursive’ failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory ‘/home/parkmino/Downloads/dasom-master’
Makefile:370: recipe for target ‘all’ failed
make: *** [all] Error 2[/code:wjzjioa6]

현재 버전 번호를 붙이지 않아서 deb 파일 제공은 어렵겠습니다. 그런데 소스를 보니 gssize 로 되어있지 않고 guint16 으로 되어 있거든요. 그리고 5번째 인수가 없는 것 같은데…
퇴근 후 다시 한번 확인을 해보겠습니다.
사용하시는 환경이 32비트인지 64비트인지 알려주세요

네, 32비트입니다.

혹시 코드를 임의 수정하셨다면
삭제 후에 다시 해보세요…
만약 그런게 아니라면
제가 우분투 14.04.2 LTS 32비트 받아서 가상 머신에 설치 후에 컴파일해볼게요…약 2시간 정도 소요되는데…ㅠㅠ

코드 수정할 실력은 없구요.
당장 32비트 지원이 어렵다면, 천천히 시간을 가지고 하시지요.

컴파일 안 되는거 방금 고쳤습니다. 그리고 im-config-data가 설치되지 않던 부분도 고쳤고요.
아래 명령으로
git clone https://github.com/cogniti/dasom.git
받아서 컴파일하면 잘 됩니다.
그런데, 막상 ubuntu-14.04.2-desktop-i386 32비트에서 컴파일하여 설치해보니 dasom-daemon 은 돌아가는데 한글 입력이 되질 않더군요…
맨처음에 ibus에서 영어로 전환이 안 되어서 애먹었었는데… 가상환경에서 한/영 전환에 문제가 있는 것일 수도 있겠습니다.
일단 다솜 입력기의
엔진 전환키는
Control + space, Shift + space, 한글키입니다.
미래에 바뀔 수 있는 부분입니다.

make 후에
sudo make install
sudo ldconfig 하시면 됩니다. 아마 제가 위에 글에다가 sudo make ldconfig 라고 써놓은거 같은데… sudo ldconfig 가 맞습니다.

참고로 저의 개발환경은 데비안 jessie 64비트, GNOME 환경, Gnome-Shell 환경입니다.
아… 그러고보니 우분투는 gnome-shell이 아닌거 같은데… 아… 머리아파…
현재 만들어놓은 한/영 상태 표시기가 gnome-shell extension이므로 우분투에서 작동이 되지 않을 겁니다.

이번 테스트의 주안점은…
서버, 응용프로그램 사이의 통신이 끊기는가…
입력이 먹통이 되는가…
서버 또는 응용 프로그램이 퍽하고 죽는가…
이런 걸 테스트하기 위함입니다.

설치는 되었는데, 저도 한글 입력은 안되네요.
다음 버전을 기다려 보아야겠습니다.

README 파일에도 써놓았는데… gtk 모듈 캐시 업데이트하는 걸 깜박했네요…

환경에 따라 명령어 찾는 방법을 만들 시간 없으니
나중에 아래 부분을 하드코딩해서 Makefile.am 에 넣어야겠군요.

32비트
sudo /usr/lib/i386-linux-gnu/libgtk-3-0/gtk-query-immodules-3.0 --update-cache
sudo /usr/lib/i386-linux-gnu/libgtk2.0-0/gtk-query-immodules-2.0 --update-cache

64비트
sudo /usr/lib/x86_64-linux-gnu/libgtk-3-0/gtk-query-immodules-3.0 --update-cache
sudo /usr/lib/x86_64-linux-gnu/libgtk2.0-0/gtk-query-immodules-2.0 --update-cache

ubuntu-14.04.2-desktop-i386 32비트 우분투에서 다솜입력기가 잘 작동합니다.
다만, 제가 설치한 우분투는 gnome-shell 환경이 아닌 관계로 gnome-shell extension 이게 작동이 안 되어 한/영 전환 표시가 되지 않습니다.
여태껏 우분투 설치하면 기본으로 gnome-shell 이 돌아가는 줄 알았네요.

오늘도 자정을 넘어서 자는군요…
열심히 사용해주세요…

오~ 이제 한글 입력이 되네요!
다솜으로 쓰고 있습니다. 노트북 한/영키를 사용하려면 어떻게 해야 하나요?
fcitx에서는 따로 설정이 가능해서 편리했습니다.

쉬프트 + 스페이스
컨트롤 + 스페이스
입니다. 표시기, 설정기는 앞으로 만들어야 합니다.
열심히 사용해주세요