다솜 입력기 소스를 조기에 공개할까 합니다.

Wed, 3 Jun 2015 00:41

어휴 답답한 정부…
메르스 발생 지역, 발생 병원을 공개해야 사람들이 피하고 주의하지…
그래야 확산이 줄어들지…
정부가 병원 수익을 왜 걱정하냐. 탄저균에 메르스에 우리들은 언제 죽을지 모르는 파리 목숨입니다.
일이 손에 잡히지도 않습니다.
입력기 소스를 미완성 상태로 공개하면 창피해서 자존심 상하고, 이거 해주셈, 저거 해주셈, 세벌식은 왜 지원 안 함? 각종 요구로 피곤해지고,
소프트웨어 출품 대회나 전시회 있으면 호시탐탐 노리는 사람들이 있을텐데…
그래서 완성된 상태로, 공개와 동시에 각종 사이트에 알림글을 올려야 하는데…
현 정권, 현 정부가 취하는 대응을 보면 무정부 상태에 있는 듯한 느낌이라… 어느날 갑자기 죽을 수도 있다는 생각이 많이 듭니다.
그래서 소스코드 조기 공개 여부를 고려하고 있습니다.

우분투 포럼에 글을 남겼습니다.

다솜 입력기 소스를 조기에 공개할까 합니다.
http://forum.ubuntu-kr.org/viewtopic.php?f=4&t=28121


hodong 2015-06-11 21:36

소스코드를 조기에 올렸습니다. https://github.com/cogniti/dasom


hodong 2015-06-18 01:15

파이어폭스로 map.daum.net 을 이용할 때 race condition이 발생합니다.

g_main_depth () 를 사용하여
if depth > 1 일 때, focus_in / focus_out 을 그냥 return 하도록 하여 일단 해결은 했으나, 파이어폭스 이용할 경우, map.daum.net 에서 마지막 글자가 날라가는 상황이 발생하는데,

의사 코드로 표현하자면,

map.daum.net 검색어 넣고 엔터키 치면, 파이어폭스가 아래처럼 작동합니다.

void im_1_commit_callback
{
  im_1.focus_out (im1); /* fd: 38 */
  im_2.focus_in (im2);  /* fd: 39 */
}

아휴 이걸 어떻게 해결해야 하나…. commit_cb () 내에 focus in / out 이 들어가면 서버, 클라이언트가 서로 메시지를 기다리게 되므로 멈추어 버립니다.

async queue, pending queue 이런 걸 만들어야 하나… 아휴 머리 아파…


hodong 2015-06-19 10:37

GMainContext, GMainLoop, GSimpleAsyncResult 를 사용하여 해결의 실마리를 찾았습니다. 이 문제도 곧 해결될 듯.


hodong 2015-06-21 15:29

아이유 나오는 프로듀사… 재미있게 잘 봤습니다.
사실 아이유 팬은 아니지만, 아이유 노래 중, 몇몇 노래들을 즐겨듣고 있는데, 프로듀사 보면서 아이유 팬 된 것 같네요.
아이유!! 아이유!! 만세~~~~
수년 전 사람들이 왜 아이유에 열광하는지 몰랐는데, 이제서야 알겠네요.
프로듀사 보고 또 보냐고,,, 다솜 입력기 개발이 하루~이틀 늦춰졌네요 ㅠㅠ
그래도 다행인 것은, 이번에 race condition을 방지하는 코드를 작성하였습니다.
map.daum.net 에 들어가서 입력하여도 멈춰서는 일이 없습니다. 다만, 마지막 글자가 짤리기는 하는데,
그건 입력기의 문제가 아니라 firefox 또는 map.daum.net 코드의 문제입니다.
firefox 또는 map.daum.net 코드의 문제임은 확실한데, 둘 중 어느 것이 문제인지는 확인해보지 않아서 모릅니다.
imhangul-gtk2로 해보면 끝글자가 짤리지 않고 작동하던데, 그건

guint
gtk_key_snooper_install (GtkKeySnoopFunc snooper,
                         gpointer func_data);

때문입니다. 이 코드를 다솜 입력기 gtk 클라이언트 부분에 넣으면 역시 끝글자가 짤리지 않고 작동합니다. 그러나 이렇게 하는 임시방편책 내지는 차선책보다는 firefox 또는 map.daum.net 코드를 수정해야 하겠죠. firefox 또는 map.daum.net 코드의 문제임은 확실한데, 둘 중 어느 것이 문제인지는 확인해보지 않아서 모릅니다.


hodong 2015-06-23 21:32

이 문제를 해결하기 위해 10일 정도를 고민에 고민을 거듭하여 GMainContext, GMainLoop, GSimpleAsync를 공부하여 클라이언트에 코드를 적용해보았는데, 되긴 되는데 완전한 해결책이 아니었습니다.
그러던 중 서버측에 thread를 도입하여 해결봤습니다.
기존 GSocketService를 GThreadedSocketService로 변경하였습니다. 코드 10여 줄로 간단하게 해결하니 그동안 소비한 시간이 허무하게 느껴지네요.


hodong 2015-06-26 00:34

오늘부터 GMainContext, GMainloop 를 이용하여 다솜에 적용하고 race condition 회피 코드 작성할 예정. 서버는 스레드를 적용하지 않기로 결정함. 스레드 적용시 얻을 수 있는 잇점이 없음. 만약 미래에 어떠한 이유로 서버에 스레드 적용시 dasom_context_save (), dasom_context_restore (), dasom_engine_save (), dasom_engine_restore () 와 유사한 함수로 엔진 상태를 save, restore 할 수 있어야 함. 이렇게 하면 정상적/비정상적 호출 여부와 관련없이 클라이언트 측의 함수 작동과 서버 측의 함수 작동이, 마치 일반적인 라이브러리 함수 직접 호출처럼 작동합니다.


hodong 2015-06-30 23:58

race condition 해결봤습니다.
스레드를 사용하지 않았습니다.
g_source_set_can_recurse (source, TRUE);
해준 후,
이렇게 루프를 돌리면 간단하게 해결되는 문제였습니다.

dasom_send_message (context->socket, DASOM_MESSAGE_COMMIT, g_strdup (text), NULL);

do {
  g_main_context_iteration (NULL, TRUE);
} while (context->reply->type != DASOM_MESSAGE_COMMIT_REPLY);

hodong 2019-03-31 20:30

예전에 작성한 문서를 복구했습니다.
지나간 세월을 생각해보면 꿈만 같군요.
벌써 4년이 흘렀군요.
세월 참 빠릅니다.