Be lost in thought…

Nineye’s personal weblog!!!

Archive for the ‘development tools’ Category

x11을 통해 원격으로 Android 프로젝트 개발을 해보자

Published by Nineye under development tools on August 30, 2010

Android 프로젝트를 진행하게 되어서 개발 환경을 구축하게 되었는데, 이것이 그다지 간단한 작업이 아니었다. 물론, 안드로이드 개발자 사이트에 개발 환경을 구축하는 방법을 자세히 설명해 놓았지만, 3번 이상은 하지 않고 싶은 작업이다. 또한, 우리 본부내에서 안드로이드 프로젝트에 참여하는 사람들이 설치에 관해 이것 저것 물어보고, 설치 메뉴얼을 제대로 따라하지 않아서 문제가 많이 발생하는 것을 보고, “아~ 이건 아니다~”라고 생각했다.

그때 나타난 우리의 구세주~~~ 우리 부서에서 관리하는 성능이 좀 괜찮은 우분투 서버가 있었는데, 창진형이 그 서버에 이클립스를 설치하고 x11을 통해 원격으로 접속하게 환경을 갖춰 놓은 것을 보고, “아!!! 이거다!!!” 라는 생각이 들었다. 그래서 그 우분투 서버에 안드로이드 플랫폼 개발 환경을 모두 정상적으로 갖춰두고, “자~ 여러분들 이제 힘들게 개발 환경 따로 구축하지 말고, 여기에서 개발하면 됩니다!”… 내 생각에는 좋은 환경이었으나, 생각외로 리눅스라는 환경이 좀 귀찮았나보다. 현재 우분투에 구축된 개발 환경을 통해 개발하는 사람은 창진형과 나밖에 없다…ㅋㅋ

이 글의 주제는 이것이 아니고, 최근 회사에서 스마트폰 프로젝트 열풍이 불어서 맥북을 하나 얻었는데, 이게 개발 환경으로는 더 없이 좋은 것 같다. 운영체제도 깔끔하고 내장되어 있는 소프트웨어도 깔끔하고… 그래서 안드로이드 프로젝트도 여기서 개발하려고 환경을 갖추다가, 어떻게 하면 가장 깔끔한 원격 개발 환경을 갖출 수 있을까 고민하다가 알아낸 정보들을 정리하고자 한다. 우분투 서버에 개발 환경 구축하는 방법은 필요하면 다음에 포스팅 하도록 하겠다.

Android app 개발을 위한 툴은 이클립스를 사용할 것이기 때문에, Mac에서 이클립스를 통해 개발하는 방법을 간단히 요약하면 다음과 같다. 그리고 이후부터 Android 개발 환경이 구축되어 있는 서버를 “ubuntu”라 부르고, 실제 개발을 위해 사용하려는 pc를 “mac”이라 부르겠다.

-
x11_1-

즉, ssh client를 통해 ubuntu에 접속하고 ubuntu에서 eclipse process를 구동시킨다. 그리고 eclipse app의 화면 출력은 x11 forwarding을 통해 mac의 x11 server로 전송하고, x11 server는 전송된 데이터를 이용해 ubuntu에서 실행된 eclipse 프로그램을 mac에 띄우게 된다.

물론 위의 방법은 x11 forwarding기능을 이용한 ssh tunneling을 통한 방법이다. 그 이외에 xhost나 xauth를 통해 실행하는 방법도 있다. 하지만 그 두가지 방법은 보안상으로 취약하다고 하기때문에 일단 ssh를 이용한 방법부터 설명하고 나머지 둘은 나중에 설명하도록 한다.

-

-
ssh를 이용한 x11이용 방법

1. ubuntu 측의 필요한 설정
우선 x11 forwarding 기능을 이용하려면 ubuntu측의 sshd설정 중, X11Forwarding 플래그의 값을 yes로 설정해야 한다. 일반적 설정의 ubuntu는 /etc/ssh/sshd_config 파일에 sshd 관련 설정들이 있다. X11Forwarding 플래그는 보안상의 이유로 주석 처리 되어있는데, 주석을 풀고 yes로 바꾸자. 물론 시스템의 보안이 최우선인 서버에서는 이것을 풀지 말아야 하고, 이 서버를 통한 개발도 하지 말아야 한다. 신중히 선택하자. 이 플래그를 바꾸면 x11을 다시 구동시켜야 한다.
ubuntu에 접속할 계정에 DISPLAY 환경 변수가 설정되어 있는지 확인한다. ssh 메뉴얼의 x11 forwarding 부분의 설명에도 나와있지만, DISPLAY 환경 변수는 설정되어 있지 말아야 x11 forwarding이 제대로 동작한다.

2. mac에서 x11을 구동시킨다.
eclipse를 실행시키는 입장은 ubuntu가 서버이고 mac이 클라이언트이지만, x11의 입장에서는 mac이 서버이고 ubuntu가 클라이언트이다. 즉, mac에서 실행된 x11 서버가, 각종 x11 클라이언트들로부터 전송된 x11 어플리케이션들을 화면에 띄우게 된다. 따라서 원격으로 eclipse를 실행시키기 전에, mac에서 x11 서버를 먼저 띄워야 한다.
x11은 dock > 응용프로그램 > 유틸리티에 있다.

3. ubuntu에 접속하고, eclipse를 실행
x11을 실행시키면 기본적으로 xterm이 뜬다. 다른 터미널로 접속해도 상관이 없지만, 이왕 뜬거니 그냥 여기에서 접속하자. xterm에서 다음을 실행한다. 참고로, 예전에는 ssh -X 옵션을 사용했었는데, 보안상의 문제로 -X 옵션이 참조하는 x11 forwarding은 표준에서 제외되었다. 대신 -Y옵션을 이용한다. -Y옵션은 trust x11 forwarding이다.

ssh -Y -l 접속할계정명 접속할서버
접속할계정명@접속할서버's password:
[$] eclipse &

x11_2
잘 실행된다.

-

-
xhost를 이용한 x11이용 방법

1. mac 측의 필요한 설정

x11에서 네트워크 연결을 가능하게 하기 위해서, mac에서 다음을 설정해줘야 한다고 한다.

defaults write com.apple.x11 nolisten_tcp -boolean false
defaults read com.apple.x11
{
"nolisten_tcp" = 0;
}

이는 mac의 x11 gui 환경설정 창에서도 설정할 수 있다.

x11_3
위에서 “네트워크 클라이언트에서의 연결을 허용”에 체크해 주면 된다.
하지만 실제로 테스트해보니, 환경설정 창에서의 설정은 먹혔는데, defaults를 이용한 세팅은 먹히지 않았다. 아마 개인적인 생각으로는 환경설정 창의 설정이 우선 시 되는 것 같다. 예전에 ubuntu 서버에서도 그런 현상이 있었던 것으로 봐서는…
설정을 바꾼 뒤에는 x11을 다시 실행시켜야 적용된다. x11을 종료시키고 다시 실행시키자.

2. ubuntu 측의 필요한 설정
x11 forwarding에서와는 달리, xhost를 이용한 방식은 eclipse 어플리케이션을 디스플레이 할 위치를 환경변수에 설정해 줘야 한다. 일반적으로 ubuntu에 접속할 계정의 홈디렉토리의 .bashrc에 다음을 입력해서 자동으로 설정되게 한다.

export DISPLAY=mac의주소:0

이제, 위의 해당 계정으로 접속해서 x11 어플리케이션을 실행시키면 항상 mac에 뜨게 된다.

3. eclipse를 실행시키자
xhost를 통한 접근이 가능하게 하려면, 접근하는 x11클라이언트(ubuntu)를 접근 가능하게 등록해 줘야 한다. mac에서 다음을 실행하자.

xhost +ubuntu주소

위에서 말했다시피, xhost는 보안에 아주 취약하다. 보내어지는 정보가 암호화 되지 않기때문에 mac에서 입력하는 정보들을 고스란히 캡춰당할 수 있다. 아주 안전한 접속에서만 이 방법을 사용하자.
이제 ubuntu에 접속하여, eclipse를 실행해 보자.

eclipse &

잘 실행된다.

xauth는… 알아봐야 할 것들이 많아서 다음에 설명해야 할 것 같다(사실은 포스팅하는데 시간이 너무 걸려, 눈치가 보여서…ㅋㅋ)
어쨌든 개발 환경을 하나로 구축해 놓으니 정말 환상이다. 처음에는 windows가 설치된 pc에서 개발하다가, 다른 환경에서 개발하려니, 개발 환경부터 소스 복사까지 귀찮은 일이 한 두가지가 아니었는데, 이제는 어떤 환경에서건 ubuntu 서버로 접속만 하면 끝이다. 또한 구글에서 Android sdk 및 ndk들을 자주 업그레이드 하는데, ubuntu 서버에서만 업그레이드 해주면 모든 사용자들이 업그레이드 된 sdk를 쓸 수 있다. 물론 eclipse Android plug-in 설정만 바꾸면 개인 sdk도 사용 가능하다. 역시 이래서 linux계열 운영체제와 gnu를 좋아한다…ㅋ

Leave a Reply

LaTeX에 unicode와 cjk 패키지 적용하기

Published by Nineye under development tools on November 23, 2009

 

회사에서 정보 공유의 목적으로 MediaWiki를 이용하여 위키를 만들게 되었는데, 업무를 목적으로 하다보니, 입력되는 위키 페이지들을 보고용으로 쉽게 만들 수 있게 하는 기능이 필요하게 되었다. 따라서 그 기능을 지원하기 위해, w2l이라는 MediaWiki extension을 설치하게 되었고, w2l을 이용하기 위해 기본적으로 세팅해야 하는 내용들 중, 폰트와 관련된 부분을 보기로 한다.

w2l extension은 LaTeX 기반이며, pdflatex명령어를 통해 “위키문서 => LaTeX코드 => pdf문서”로 만드는 extension이다. 즉, w2l extension을 이용하려면 해당 서버에서 LaTeX을 지원해 주어야 하는 것이다.

필자가 MediaWiki를 설치한 서버에는 texlive LaTeX package가 이미 설치되어 있었으며, 영문 문서를 테스트 했을 때는 아무런 문제가 없었다. 하지만 linux가 항상 그렇지만, 한글 문서를 적용하려고 하니 여러 가지 문제가 발생하였고, 문제의 근간이 된 폰트 문제에 대해 쓰고자 한다.

우선, 적용하고자 하는 서버에 LaTeX이 설치되어 있지 않다면 설치하자. 필자는 현재까지 계속 지원되고 있는 texlive를 설치하였다.

 
# Debian의 apt-get을 통한 설치(필자의 환경은 이것인데, 다른 환경은 구글링을 통해...ㅋㅋ)
# LaTeX 기본 설치(texlive tool + 기본 포맷 package)
$ apt-get install texlive
# LaTeX  풀 설치(약 700MB 정도된다. ㅡㅡ;;; 기본으로만 설치하고 필요한 package만 따로 설치해도 된다.)
$ apt-get install texlive-full

 

 

1 LaTeX에 한글은 어떻게 적용할까?

LaTeX 에 있어서의 변환 툴은 그저 껍데기에 지나지 않고, 실질적으로는 LaTeX문서를 다양하게 표현하는 package가 더욱 중요하다. LaTeX은 이러한 다양한 문서 표현에 대해, 사용자들이 직접 문서 표현 포맷을 작성하고, 이 포맷을 package로 공유하게 함으로써, 현재의 LaTeX은, 표현하지 못하는 문서의 모습은 거의 없을만큼 방대해 졌다. 하지만 너무 방대해 지고, 전 세계의 사용자들이 각각 package를 제작하다보니, package들 끼리의 관계가 너무 복잡하게 얽혀있어서 소위 삽질을 많이 하게 된다.  필자도 한글을 적용하면서 삽질을 많이 하였고, 다시 삽질을 하지 않기 위해 한글 적용 문제를 정리해 보고자 하는 것이다.

LaTeX에서의 한글 적용은 다양한 package들이 존재하는데, kotex, cjk(chinese, japanese, korean – 우리나라가 맨 마지막에 나와서 기분 나쁘지만 뭐, 알파벳 순서니… ㅡㅡ;;;)등이 그것들이다. kotex은 국내에서는 많이 알려졌는데, 세계적으로는 아시아권(한국, 중국, 일본) 언어를 지원하는 cjk package가 더욱 알려져있으며, 이 package에 대한 지원도 잘 되고 있어서, cjk package를 선택하기로 했다.

# cjk package는 각 언어별로 따로 설치할 수 있다. "latex-cjk-해당언어"의 명칭으로 package가 제공된다. 필자는 귀찮고 문제 생길까봐 다 설치했다.
$ apt-get install latex-cjk-all
# fontforge로 cjk 관련 폰트를 생성할 때, 폰트 스크립트가 필요하다. 이는 latex-cjk-common package에 들어 있으니, 없으면 설치하자.

자, cjk가 설치되었으니, pdflatex명령을 통해 한글 tex문서를 변환해 본다. 아마… 잘 안될 것이다. 변환이 잘 된다면 성공이고, 이후의 과정은 무시해도 된다. 필자의 경우 utf-8 인코딩으로 저장된 tex문서를 변환해야 해서, unicode font를 설치해야 했고, byte단위의 한글 인코딩 문서라면 잘 변환될 수도 있을 것 같다. 아래 과정은 tex문서가 utf-8로 인코딩된 문서라 가정하고,  utf-8문서를 다룰 수 있는 unicode font의 설치에 관련된 내용이니, 다른 문제로 고민한다면 아래 내용을 읽지 않아도 된다.

 

 

2 LaTeX에서는 어떻게 unicode를 지원할까?

pdflatex명령을 통해 생성되는 ~.log 파일에 “!Undefined control symbol ~어쩌구~ <문서내의 한글 내용> ~어쩌구~” 라는 에러 메세지가 있다면, 한글을 변환하는 cjk package는 정상적이지만, utf-8 인코딩 tex문서내의 한글 변환에 사용되는 폰트가 정상적이지 않은 것이다. 이 글에서는 이 경우의 오류만 다루기 때문에 다른 종류의 오류라면 구글링을 통해 찾아보기 바란다. 

우선, LaTeX package들이 설치되는 곳에 truetype폰트가 설치되어 있는지 확인해 보자. 위치는 필자의 경우, /usr/share/texmf/fonts/truetype/ 이었다. 일단 여기 font가 설치되어 있다면 unicode를 지원하는 font인지 확인해 보자. unicode를 지원하는 폰트라면 LaTeX cjk package가 사용가능한 font인지 해당 font정보를 확인해 보도록 하자. 만약 cjk package에서 적용하지 못하는 font이거나, unicode를 지원하는 font가 없다면 Bitstream의 Cyberbit font를 설치하자.

잠깐 Cyberbit font에 대해서 설명하면, 이 font는 Bitstream사가 보유한, 비영리적인 목적으로 사용할 때는 공짜인 font이다. 그리고 이 font는 전 세계에서 큰 비중을 차지하는 unicode 입력 리스트들에 대해 지원을 하는, 역사적으로 가장 널리 알려진 font중 하나이다. 이 font에 대한 상세 내용은, Bitstream사의 홈페이지(www.bitstream.com)에 가보면 어딨는지 잘 모르겠고, Wikipedia의 설명(http://en.wikipedia.org/wiki/Bitstream_Cyberbit)을 참고하자.

 

 

3 unicode를 표현하기 위한 cyberbit font를 설치해 보자.

Cyberbit font를 LaTeX내에 설치해 주는 package가 존재한다면, 그 package를 통해서 쉽게 설치할 수 있겠지만, 아쉽게도 아직 없나보다. 따라서 수동으로 설치하는 방법을 따라 설치하였다. 다음의 순서에 따라 cyberbit font를 LaTeX내에 설치해 보자. 참고로 설치하는 위치는 필자의 환경 기준으로 쓰며, 만약 설치 장소가 /usr/share/~ 가 아니면 환경에 맞게 설치한다.

1. cyberbit font의 복사

1. 여기를 클릭해서, cyberbit font를 받자.

2. 압축을 해제하면 Cyberbit.ttf가 나오는데 이를 cyberbit.ttf로 이름을 변환해서(LaTeX에서는 대소문자를 구분한다.) /usr/share/fonts/truetype/bitstream/ 위치에 넣자.

3. 이렇게 설치한 font를 LaTeX에서도 사용할 수 있게 링크를 걸어준다.

$ mkdir -p /usr/share/texmf/fonts/truetype/bitstream/cyberbit/
$ ln -s /usr/share/fonts/truetype/bitstream/cyberbit.ttf /usr/share/texmf/fonts/truetype/bitstream/cyberbit/cyberbit.ttf

2. LaTeX 문서의 변환에 이용되는 파일들의 설치

 - fontforge tool을 이용하여, LaTeX typesetting 시스템에 사용되는 파일 포맷인 .tfm(http://en.wikipedia.org/wiki/TeX_font_metric 참고)과, uuencoding에 사용되는 파일 포맷인 .enc(http://en.wikipedia.org/wiki/Uuencoding 참고)와,  PostScript에 이용되는 파일 포맷인 .pfb(http://en.wikipedia.org/wiki/PostScript_fonts)파일을 설치

1. fontforge가 설치되어 있지 않다면 설치한다.

$ apt-get install fontforge

2. 앞에서 latex-cjk-common package를 설치했으면, /usr/share/latex-cjk-common/utils/subfonts/ 위치에 cjk용 폰트 스크립트인 subfonts.pe 파일이 있다. 이를 작업 디렉토리에 복사하자.

3. fontforge에서 사용하는 unicode 폰트 형판(?) 파일(http://en.wikipedia.org/wiki/FontForge 참고)인 Unicode.sfd를 작업 디렉토리에 복사한다. 보통 freetype1-tools(현재는 freetype2-demos로 명칭이 변경된 듯 하다. 정확한 설명이 없음) package를 설치하면 /usr/share/texmf/fonts/sfd/ 위치에 있다고 하지만 필자의 경우 없었다. 따라서 여기에서 다운 받아서 위의 위치에 넣었다.

4. 이제 fontforge를 이용해서, 작업 디렉토리에 .tfm, .enc, .pfb 파일들을 생성한다. 이 작업은 시간이 많이 소요된다. 필자의 경우 한 4~5시간 정도? ㅡㅡ;;;

# 작업 디렉토리에서 실행
$ fontforge -script subfonts.pe cyberbit.ttf cyberbit /usr/share/texmf/fonts/sfd/Unicode.sfd

5. 파일들이 생성됐으면, LaTeX문서를 PostScript로 변환 시, 사용하는 .map 파일을 생성한다. 이는 .pfb파일로부터 다음의 스크립트를 통해 생성한다.

# 작업 디렉토리에서 실행
for i in *.pfb
do
echo "$(basename $i .pfb) $(basename $i .pfb) <$i" >> cyberbit.map
done

6. 이제 생성된 파일들을 다음의 위치에 넣는다.

  • .afm ==> /usr/share/texmf/fonts/afm/cyberbit/
  • .tfm ==> /usr/share/texmf/fonts/tfm/cyberbit/
  • .pfb ==> /usr/share/texmf/fonts/type1/cyberbit/
  • .map ==> /usr/share/texmf/fonts/map/dvips/cyberbit/

7. texmf 디렉토리 내의 구조가 변경되었으므로 “texhash”나 “mktexlsr” 명령을 root권한으로 실행하여 ls-R을 다시 구성한다.

3. 20cyberbit.cfg 파일의 추가

 - /etc/texmf/updmap.d/ 위치에 20cyberbit.cfg 파일을 다음과 같은 내용으로 편집하여 추가한다.

######
# 20cyberbit.cfg
Map cyberbit.map
######

4. cyberbit.map파일의 적용

 - 다음과 같은 명령을 실행하여, cyberbit.map font map 파일을 적용한다. 이 때 주의할 점은 작업 디렉토리내의 cyberbit.map 파일로 적용되지 않기 위해, 작업 디렉토리 내의 cyberbit.map 파일을 삭제하고 실행한다.

$ update-updmap -c /etc/texmf/updmap.d/
$ updmap-sys

5. c70song.fd파일의 생성

 - /usr/share/texmf/tex/latex/CJK/UTF8/의 위치에 c70song.fd 파일이 있는지 확인하고, 있으면 삭제하고 다음의 내용으로 c70song.fd 파일을 생성한다.

%%%%%%
% This is the file c70song.fd of the CJK package
%   for using Asian logographs (Chinese/Japanese/Korean) with LaTeX2e
%
% created by Werner Lemberg <wl@gnu.org>
%
% Version 4.6.0 (11-Aug-2005)

\def\fileversion{4.6.0}
\def\filedate{2005/08/11}
\ProvidesFile{c70song.fd}[\filedate\space\fileversion]

% character set: Unicode U+0080 - U+FFFD
% font encoding: Unicode

\DeclareFontFamily{C70}{song}{\hyphenchar \font\m@ne}

\DeclareFontShape{C70}{song}{m}{n}{<-> CJK * cyberbit}{}
\DeclareFontShape{C70}{song}{bx}{n}{<-> CJKb * cyberbit}{\CJKbold}

\endinput
%%%%%%

6. ls-R의 재 구성

 - root 권한으로 “texhash” 명령어를 다시 실행한다.

 

 

자, 이제 다 되었다. 위에서 테스트 한 LaTeX 소스 파일로 다시 테스트 해 보자. 필자의 경우 오류 없이 한글이 변환되었다. 드디어~ MediaWiki 한글 페이지를 pdf문서로 만들 수 있다~!!! 언제나 생각하는 것이지만 정말 linux에서는 어떤 프로젝트든지, 한글을 적용하는 것은 삽질이다. ㅡㅡ;;;

2 Responses to “LaTeX에 unicode와 cjk 패키지 적용하기”

Leave a Reply

linux linker ld에서 여러 library linking 시, library 순서에 대해

Published by Nineye under development tools on February 24, 2009

가끔 가다, project를 빌드할 때, 여러 library를 참조하고, 그 library들 중의 한 library가 또 다른 library를 참조하는 복잡한 링킹 구조일 때, 링킹 시키는 library순서에 따라 링킹 오류가 발생하는 경우가 있었다.

링커가 링킹시키는 과정은 http://blog.naver.com/nineye09/50028505467 에 설명되어 있다. 관련된 글을 약간 보면, 링커는 커맨드 라인에서 받아들인 재배치 가능한 object파일과 library파일을 왼쪽에서 오른쪽으로 스캔하는데, 입력으로 주어지는 library들은 순서대로 주어져서 다른 archive의 멤버들이 참조할 수 있도록 해야하며, 정의된 하나의 심볼은 뒤따르는 커맨드 라인의 입력에 의해 참조되어야 한단다. 결국 링킹 시키는 것도 순서가 중요한 것 같네… 어쨌건 우리가 하고자 하는 건, 이러한 복잡한 링킹 구조일 때, 어떻게 명확하게 링킹시킬 것인가 하는 것이다.

설마 이렇게 유명한 링커가 library의 순서나 따지는 무식한 짓을 할리는 없을 거라고 생각하며, 이와 관련해서 검색하다 보니 다음과 같은 좋은 방법이 있었다.

gcc -o exefile -Xlinker –start-group libmod1.a libmod2.a libmod3.a -Xlinker –end-group

-Xlinker 는 뒤에 따라오는 flag를 linker에 넘기라는 flag이다.

–start-group, –end-group : 두 개의 정의 사이에 오는 archive들은 새로운 undefined references 가 생성되지 않을 때까지 반복적으로 검색된다.

결국 위의 문장을 해석하면, exefile을 빌드하는데 mod1, mod2, mod3 library들을 링킹하고, 이 library들은 undefined references 가 하나도 없을 때까지 반복적으로 검색되게 된다… 는 것이다. 이제 우리가 고민했던 복잡한 링킹 구조에서 library를 빠짐없이 참조가 가능해진 것 같다.

Leave a Reply

Be lost in thought… is powered by Nineye in WordPress | Entries RSS and Comments RSS

Copyright © 2009. All right reserved by Nineye.