2014/09/27

uim 벼루 Qt5 immodule build


우분투 uim 기본 패키지에는 Qt5 immodule이 들어 있지 않아서 Qt5 애플리케이션에서 한글 입력이 안된다. uim 사이트에 가보니 2013/6/30일자 uim-1.8.6 소스가 최신인데 받아 보니 Qt5를 지원하지 않는다. 문서에도 Qt5에 대한 언급이 전혀 없다. 혹시나 해서 github에서 소스를 받아 보니 Qt5 immodule 소스가 있었다. Qt5 모듈을 build하는 문서가 없어서 좀 헤매야 했는데 헤맸던 것들을 정리한다.

결론은, uim Qt5 모듈을 사용하면 Qt5 애플리케이션에서도 한글입력은 잘 되는데, 안정성 문제가 있다. 한글 입력 문제에 관한 한 uim이 ibus보다 좋아 보인다.

uim Build 및 설치

uim 설치 가이드를 따라가면, 소스를 build하기 위해서 아래의 tool 들이 필요하다.

$ sudo apt-get install intltool
$ sudo apt-get install librsvg2-bin libtool ruby git

build에 필요한 header 파일들도 있어야 하고...

$ sudo apt-get install libanthy-dev libgtk2.0-dev libgtk-3-dev libqt4-dev

그런데, Qt5는 우분투 패키지 구성이 꽤 복잡하다. 한마디로 libqt5-dev가 없다. 일단, 아래 정도가 필요해 보인다.

$ sudo apt-get install qtbase5-dev qtbase5-private-dev qt5-default qtdeclarative5-dev

이제 다시 가이드 대로, 소스를 github에서 받아서 build하고 설치까지 문제가 없다. 아, 도중에 폴더 권한이 없다는 오류가 발생했었다. 해당 폴더(/usr/plugins)를 만들어 주고 사용자 권한을 주면 해결된다. Qt5 모듈이 엉뚱한 폴더를 중간 폴더로 사용하고 있었다.

그리고, ./uim/qt5/immodule/quimplatforminputcontext.cpp 파일 윗부분에 debug 사용하도록 define이 있는데 주석 처리하는게 좋다.

$ git clone https://github.com/uim/uim.git
$ cd uim
$ ./make-wc.sh --with-qt5 --with-qt5-immodule
$ make
$ sudo make install

위와 같이 해서 설치하면 /usr/local 하위 폴더들에 uim 파일들이 분산된다. 단, Qt5 모듈은 Qt5 폴더 (/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts)에 설치된다.

Qt5 모듈은 가야할 위치에 이미 가 있어서 Dynamic loading 문제가 없다. 그런데, GTK 모듈들은 immodules.cache에 등록해 주어야 한다. GTK2는 별로 쓸일이 없을 것 같아서 GTK3 모듈만 아래와 같이 등록하였다.

$ /usr/lib/x86_64-linux-gnu/libgtk-3-0/gtk-query-immodules-3.0 /usr/local/lib/gtk-3.0/3.0.0/immodules/im-uim.so >> /usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules.cache

uim 자동 실행

시스템 설정 가이드에 보면 ~/.xinitrc나 ~/.xsession에 아래의 내용을 넣어 주면 된다는데 잘 안되었다.
export GTK_IM_MODULE=uim
export QT_IM_MODULE=uim
export QT4_IM_MODULE=uim
export XMODIFIERS=@im=uim
/usr/local/bin/uim-xim &
그래서, 우분투의 im-config를 사용하기로 하였다. 먼저, ~/.xinputrc에 아래 내용을 등록해 주고,
run_im uim
/usr/share/im-config/data/24_uim.rc 파일을 수정해서 /usr/local 폴더 위치를 잡아 주었다. 그리고 나서 재로그인하면 uim이 잘 기동된다.

uim Qt5 모듈의 문제점

Qt5 애플리케이션에서 한글입력은 아무 문제없다. 심지어 ibus의 Qt5 애플리케이션에서 발생하는 한글입력 문제도 없다. 그런데, 공식 사이트에 Qt5 모듈이 없는 이유를 알게 되었다. 불안정하기 때문이다. 일단, 두어가지 문제를 발견했다.
  • Qt5 애플리케이션을 새로 실행할 때마다 uim-candwin-qt5 프로세스 수가 계속 증가함
  • 애플리케이션을 중지하면 프로세스가 좀 줄어 들지만 다시 새로운 프로세스가 생김
  • Qt5 애플리케이션을 쓰다 보면 컴이 느려지는데 uim-helper-server 프로세스가 CPU를 거의 100% 가까이 잡아먹고 있음

참고 사이트

https://code.google.com/p/uim/wiki/InstallUim
https://code.google.com/p/uim/wiki/UimSystemConfiguration

2014/09/25

하드디스크의 우분투 설치 iso로 우분투 설치


(2014/10/29 오류 수정)

Facebook 우분투사용자모임에 USB 플래시 메모리 없이 하드디스크(HDD)로 우분투를 재설치 할 수 없느냐는 질문이 있어서 겸사겸사 정리해 보기로 했다. 이미 우분투가 설치되어 있는데 우분투를 업그레이드 하기 위해 Clean Install 하고자 한다면 굳이 USB를 사용하지 않아도 되기 때문에 매우 편리한 우분투 설치 방법이다.

우분투 설치를 USB를 사용하지 않고 하드디스크를 이용해서 설치하는 것은 우분투 설치 USB 만들기를 응용하면 쉽게 할 수 있다. 하드디스크를 USB라고 생각하면 되기 때문이다. 다만, 하드디스크에 Grub이 설치되어 있지 않다면 USB가 반드시 필요하기는 하다. 여기서는 우분투가 이미 설치되어 있는 경우에 하드디스크에 저장된 우분투 설치 iso로 우분투를 재설치하는 방법이다. Grub이 당연히 설치되어 있기 때문이다.

우분투를 재설치하려면 우분투 홈페이지에서 내려 받은 우분투 설치 iso 파일은 우분투를 새로 설치할 파티션과는 다른 파티션에 있는 것이 좋다. 평소에 OS와 데이터 파티션을 분리해서 사용하는 것은 여러모로 장점이 많다. Windows를 같이 사용하고 있다면 Windows 파티션에 iso 파일을 복사해서 사용해도 된다. 파티션이 하나 밖에 없다면 parted로 파티션을 분리하는 것이 좋고, 그게 어려우면 iso 폴더를 만들어서 우분투 설치 시에 덮어쓰기로 설치할 수도 있기는 하다.

우분투 설치 iso 파일 위치 확인

기존에 데이터 파티션은 /home에 마운트해서 사용하고 있고 aaa라는 사용자의 Downloads 폴더에 우분투 설치 iso를 내려 받았다고 가정한다. 향후에도 우분투 iso 이미지를 가지고 하드디스크에서 부팅해서 설치할 경우를 대비해서 아래와 같이 /home/boot-isos 폴더를 만들고 사용자 권한을 부여해 두면 좋다. 내려 받은 iso 이미지들은 모두 /home/boot-isos 폴더로 몰아 넣는다.

$ sudo mkdir /home/boot-isos
$ sudo chown aaa:aaa /home/boot-isos
$ mv ~/Downloads/*.iso /home/boot-isos

이제, /home이 어느 파티션인지 알아야 한다. 아래와 같이 /dev/sda9 파티션임을 알 수 있다.

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda8        92G   22G   65G  26% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            3.9G  4.0K  3.9G   1% /dev
tmpfs           793M  1.4M  791M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.9G   17M  3.9G   1% /run/shm
none            100M   76K  100M   1% /run/user
/dev/sda11      145G  129G  8.7G  94% /opt
/dev/sda9        92G   29G   59G  34% /home
/dev/sda1       197M   48M  150M  25% /boot/efi

우분투 설치 iso 파일에 대한 Grub boot menu entry 등록

Grub에서 우분투 설치 iso로 부팅하려면 Grub boot entry를 새로 추가하되, 하드디스크 파티션 정보와 파일 경로를 지정해 주어야 한다. 위에서 /dev/sda9 파티션이니까 디스크의 9번째 파티션이다. 디스크는 첫번째 하드디스크이다. 즉, 아래 menu entry의 (hd0,9)에 해당한다. USB 메모리로 부팅할 경우에도 USB 메모리가 첫번째 디스크가 되므로 hd0이다. 또한, iso 파일 경로는 파티션을 기준으로 하기 때문에 /home/boot-isos/...가 아니라 /boot-isos/ubuntu-14.04.1-desktop-amd64.iso가 됨에 유의할 필요가 있다.
menuentry "HDD Ubuntu 64-bit iso" {
   set isofile="/boot-isos/ubuntu-14.04.1-desktop-amd64.iso"
   loopback loop (hd0,9)$isofile
   linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile noprompt noeject
   initrd (loop)/casper/initrd.lz
}
위의 내용을 nano등의 편집기를 사용하여 /etc/grub.d/40_custom 파일 맨 끝에 추가한다.

$ sudo nano /etc/grub.d/40_custom

/boot/grub/grub.cfg를 새로 생성하기 위해서는,

$ sudo update-grub

이제 재부팅 해서 Grub 메뉴 중 위에 만든 "HDD Ubuntu 64-bit iso" 메뉴를 선택한 후, 다시 "Try Ubuntu without installing" 메뉴를 선택해서 우분투 live CD 환경으로 부팅하면 iso 이미지로 부팅해서 우분투를 설치할 수 있게 된다.

$ sudo reboot

우분투 설치 iso로 재부팅 후 우분투 설치전에 해야 할 일

우분투 14.10을 이 게시물 대로 하드디스크의 iso 이미지로 설치하다가 뭔가 빠졌음을 알게 되었다. 우분투 설치 파일을 마구 복사하면서 빨리 설치가 진행되어야 하는데  File System을 인식하지 못해 설치가 진행되지 않고 계속 멈춰 있는 증상이다.

설치 중에 파티션 테이블을 건드리는데 하드디스크의 iso 이미지를 사용하기 위해 하드디스크를 mount 상태로 두고 있으니 파티션 테이블을 수정할 수 없게 된다. 물론 설치 과정 중에 unmount 할지 물어보고 yes라고 해도 root 권한이 없으니 unmount가 안된다.

우분투 설치 icon을 click 하기 전에 <Ctrl>+<Alt>+<t>로 터미널을 띄워서 아래와 같이 umount 해주면 된다.

$ sudo umount -l /isodevice

ibus 기동 방지 및 uim 벼루 설치


우분투 14.04에서 ibus 대신 uim 벼루와 같은 다른 입력기를 테스트 해보려고 ibus를 삭제하면 불상사가 생기니 삭제하지 말고 ibus 프로세스만 기동되지 않도록 하는 방법을 찾을 필요가 있었다.

ibus를 삭제하면

우분투 14.04에서 ibus를 삭제하면 아래 스크린 샷과 같이 [시스템 설정] 메뉴가 대폭 사라지는 일이 생긴다.


원래의 [시스템 설정] 스크린 샷은 아래와 같다.


아래에서 알 수 있듯이 삭제 명령 실행시 ibus만 지워지는게 아니기 때문이다. 한마디로 ibus를 붙박이로 써라는 엉뚱하고도 고약한 패키지 dependency이다.

$ sudo apt-get remove ibus ibus-hangul
[sudo] password for aaa: 
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다       
상태 정보를 읽는 중입니다... 완료
다음 패키지가 자동으로 설치되었지만 더 이상 필요하지 않습니다:
  libhangul-data libhangul1
Use 'apt-get autoremove' to remove them.
다음 패키지를 지울 것입니다:
  ibus ibus-hangul ibus-pinyin ibus-table ubuntu-desktop unity-control-center
  unity-control-center-signon webaccounts-extension-common xul-ext-webaccounts
0개 업그레이드, 0개 새로 설치, 9개 제거 및 0개 업그레이드 안 함.
이 작업 후 8,654 k바이트의 디스크 공간이 비워집니다.
계속 하시겠습니까? [Y/n] 
다시 복구하기 위해서 아래와 같이 하면 ibus와 ibus-hangul 두 개만 달랑 설치된다.

$ sudo apt-get install ibus ibus-hangul

아래와 같이하면 ibus도 같이 설치되고 [시스템 설정]도 원래의 상태가 된다.

$ sudo apt-get install ubuntu-desktop unity-control-center unity-control-center-signon webaccounts-extension-common xul-ext-webaccounts

로그인시 ibus 프로세스가 자동 시작 방지 및 uim 벼루 설치

ibus를 삭제하려던 원래 이유는 uim 벼루와 같은 다른 입력기를 테스트해 보기 위해서 였다.

예를 들어, uim/uim-byeoru를 아래와 같이 설치하고 나서,

$ sudo apt-get install uim uim-byeoru

[시스템 설정] > [언어 지원]에서 [키보드 입력기]를 uim으로 바꾸고 재로그인해도 ibus 프로세스들이 같이 떠 있다. 구글링해 보니 굳이 ibus를 지우지 않아도 ibus 프로세스가 로그인시 기동되지 않도록 하는 방법이 있었다.

$ gsettings set org.gnome.settings-daemon.plugins.keyboard active false

위와 같이하고 다시 로그인하면 더이상 ibus 프로세스가 기동되지 않는다.

추가적으로, 기존에 ibus 환경에서 <Shift>+<Space> 등의 키를 한영 변환키로 사용했는데 uim에서도 같은 키조합을 사용하려면 [시스템 설정] > [텍스트 입력창]에서 단축 키를 다른 키로 바꿔 주어야 한다. 단축 키에 대한 우선권이 거기에 있기 때문이다.

Unity 상단 패널의 키보드 indicator도 ibus에서만 사용하는 것이므로 안보이도록 설정하려면,

$ gsettings set com.canonical.indicator.keyboard visible false

uim에서 한영키를 등록하려면 uim-pref-gtk를 실행시켜서 [벼루 키 설정 1]에 한영키("hangul")를 추가해 주면 된다.

$ uim-pref-gtk

uim 벼루의 제약 사항

일단, 두가지 제약 사항이 있다. 하나는 Unity 상단 패널에 uim indicator가 등록되지 않아 한영 상태를 구분하기 어렵다는 것이고, 다른 하나는 Qt5 애플리케이션에서 한글입력이 안된다는 것이다.

참고로, Mint 17에서는 uim indicator가 정상 동작한다.