월별 글 목록: 2014년 3월월

git server 설치 메모

사실 개인 프로젝트는 GitHub이나 bitbucket 써도 된다. 회사 일 때문에 내부 서버를 써야 할 때에나 도움이 될 듯.

1. 하드웨어 준비

실제 머신이 있으면 좋겠지만 돈도 없고 배선도 귀찮고 공간도 좁다. 가상머신 사용하기로 함.
윈도우에서 가장 안정적인 VMware 사용. VM Player는 non-commercial 조건으로 공짜로 사용가능하다.

싱글코어 + 메모리 512MB, 가상 디스크는 4GB, 16GB 두 개로 생성.
작은거에 부트 + 시스템 + 스왑 다 때려박고, 큰거는 온전히 레포지터리 저장용으로만 사용한다.

2. archlinux 설치

https://wiki.archlinux.org/index.php/Installation_Guide

사실 리눅스 배포판에는 ubuntu나 centos 기타등등 유명한게 많지만, 그만큼 덩치가 크다.
git server만 굴릴것이므로 가볍고 용량작은 + 패키지매니저 지원하는 배포판 찾아보니 archlinux가 만만해보임.
apt 사용하려면 lubuntu같은 버전 써도 될거다. 그래도 시스템파티션 크기는 키워야 하겠지만.

https://www.archlinux.org/ 에서 ISO를 다운받는다. 홈페이지에서는 Netboot 추천하는데 잘 안된다.

Live모드로 부트하면 콘솔에서 키보드 커서가 깜빡거리는 상황을 맞이하게 된다. 정상이다(…)
위키페이지를 찬찬히 읽으면서 수동으로(…) 설치하자.

설치할 때 파티션 설정을 조심하자. 마지막거만 주의하면 된다. 저기에 git 저장소가 들어가니까 큰 파티션을 잡아준다.
참고로 루트를 저만큼 잡아도 이것저것 세팅+삽질 이후에도 1.2GB 사용한다. 충분히 넉넉하다는 말임.

/dev/sda1 = /boot 300MB
/dev/sda2 = /     2.7GB
/dev/sda3 = SWAP  1GB
/dev/sdb1 = /srv  16GB **

3. 패키지 설치 및 설정

설치가 완료되면 일단 루트로 로그인한다. 일반계정에서 sudo 사용하려면 visudo 로 설정을 하나 풀어줘야 한다.

wheel 검색한 후 주석을 풀어주고 :wq 하면 wheel 그룹 유저는 sudo 사용이 가능하게 풀린다. 이제 필요한 패키지들을 설치하자.

# pacman -S --needed base-devel wget openssh git
...
# systemctl enable sshd.service
...

4. SSH 설정

https://wiki.archlinux.org/index.php/Secure_Shell

ssh 데몬 설정 편집은 /etc/ssh/sshd_config 파일을 고치면 된다. 적어도 포트번호 변경하고 루트 SSH 차단은 설정해 두자.
설정이 완료되면 ssh 데몬을 재시작하거나 시스템을 재시작.

이제 일반유저로 로그인한다. 원격으로 git을 사용해야 하는데, git 계정의 비밀번호를 까발리고 다닐 수는 없으니 인증키 방식 로그인을 사용해야 한다.

디테일한 내용은 http://opentutorials.org/module/432/3742 등 온라인에 자료 많으니까 넘어가자. 기본값으로 키를 만들면 된다.
암호는 쓸거면 입력하고(당연히 이쪽이 보안상 좋다) 자동로그인이 필요하면 안 만들면 된다.

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/myname/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
...

key를 만들면 ~/.ssh 폴더에 파일 두 개가 생성된다.
혹시모르니 개인키 파일의 권한을 확인한다. 개인키 파일(id_rsa) 권한은 반드시 600이어야 한다.

$ ls -al ~/.ssh
...
-rw------- 1 myname users 1766 Jan 01 00:00 id_rsa
-rw-r--r-- 1 myname users  399 Jan 01 00:00 id_rsa.pub

5. Gitosis 설치

https://wiki.archlinux.org/index.php/Gitosis
https://wiki.archlinux.org/index.php/AUR

아까 git도 설치했었다. 버전 확인하고 설정도 좀 바꿔준다.

$ git --version
git version 1.9.0
$ git config --global user.name "John Doe"
$ git config --global user.email "[email protected]"
$ git config -l
user.name=John Doe
[email protected]

이제 저장소 권한관리 도구인 Gitosis를 설치하자. Gitosis를 이용하면 저장소 별로 접근권한 제어를 할 수 있다.
접근권한 제어는 별도 툴이 있는건 아니고, gitosis-admin 이라는 git 저장소에 키파일과 설정파일을 커밋하면 알아서 반영된다. git으로 git을 관리하다니.

여튼, 원래 Gitosis를 설치하려면 파이썬 깔고 어쩌고저쩌고 해야 하는데, 누군가 고맙게도 이걸 자동화 시켜뒀다.
다만 archlinux 기본 패키지로는 반영 안 돼서 수동으로 패키지 파일을 만들어서 깔아야 한다. 별로 어렵지는 않다.

우선 https://aur.archlinux.org/packages/gitosis-git/ 에서 타르볼을 다운받고 압축을 해제한다.

$ wget https://aur.archlinux.org/packages/gi/gitosis-git/gitosis-git.tar.gz
...
$ tar -xzf gitosis-git.tar.gz
...

압축 풀은 폴더로 들어가서 makepkg로 패키지파일을 만든다. 의존성 해결을 위하여 -d 옵션을 준다.
패키지 빈 게 있어서 sudo 권한을 요구할거다. 설치하고 잠시 기다리면 타르볼을 만들어준다.

$ cd gitosis-git
$ makepkg -s
...
$ ls -al
...
-rw-r--r-- 1 myname users 53552 Jan 01 00:00 gitosis-git-0.2.r50-g9481bb0-1-any.pkg.tar.xz
...

만들어진 타르볼을 패키지 매니저로 설치한다.

$ pacman -U gitosis-git-0.2.r50-g9481bb0-1-any.pkg.tar.xz
...

이제 간신히 Gitosis 패키지를 시스템에 설치한 것이다.

6. Gitosis 설정

이제 Gitosis를 실제로 작동하게 만들자. 루트 권한으로 작업한다.
git이라는 유저는 git 설치과정에서 자동으로 만들어진다.

$ sudo mkdir /srv/gitosis
$ sudo chown git.git /srv/gitosis
$ sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub
Initialized empty Git repository in /srv/gitosis/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /srv/gitosis/repositories/gitosis-admin.git/

여기까지 하면 git 서버가 작동하는 것이다. 클로닝 해 보자.

$ git clone ssh://git@localhost:22222/gitosis-admin.git
...

ssh-keygen 에서 암호를 입력했으면 암호를 물어볼거다. 입력하면 된다.
클로닝까지 성공하면 Gitosis 설치가 완료된 것이다.

사용자 추가는 keydir 안에 RSA 공개키 파일을 넣어주면 되며, 파일명이 곧 계정명으로 사용된다.
접근권한 설정은 gitosis.conf 에서 한다. 자세한 설정방법은… google it.

Java의 코드페이지 MS949

개발자에게 CP949라고 하면 으레 EUC-KR을 기반으로 MS에서 확장 정의한 코드페이지를 생각할 것이다.
PC에서 한글을 표현하는 방법으로서 사실상 표준으로 사용되고 있고[footnote]아직 유니코드로 완전히 이전되지 못했다. 인터넷만 봐도 여전히 많이 쓰이는데 뭐…[/footnote], 당장 위키피디아CP949 페이지를 들어가봐도 Microsoft’s implementation으로 문서가 시작한다.

CP949

위키피디아의 CP949 Map

여튼. 어쩌다보니 MBCS 텍스트의 코드페이지를 바꿔 해석해야 하는 코드스냅이 필요하여 자바로 코드를 짜게 되었다.

예를 들면 이런거다. Shift-JIS에서 특수문자 “☆”은 0x8199 로 매핑되는데, 이를 CP949로 해석하면 “걲”이 된다.
이런 사유로, Shit-JIS에서 “☆新年☆”이라는 문자열이 CP949에서 “”걲륷봏걲”이 되어버린다. 허허허…

필요한 코드는 이를 바로잡아주는 코드인데, 사실 코드 자체는 정말 간단하다.

자바는 문자열 처리에 UTF-16BE를 사용하며, 필요한 경우 이를 꽤나 편리하게 바이트 스트림으로 변경이 가능하며,
반대로 바이트 스트림에서 코드페이지를 지정하여 문자열을 만들어낼 수도 있다.

public static String convertCodepage(String src, Charset cpCurrent, Charset cpNew)
{
	byte[] b = src.getBytes(cpCurrent);
	String n = new String(b, cpNew);
	// 사실 한 줄로 줄여도 된다.
	return new String(src.getBytes(cpCurrent), cpNew);
}

이런 코드를 짜고, 파라미터로 CP949를 적용하면 잘 될 줄 알았다.

근데 안 된다 -_-

차근히 찾아보니 자바에서 CP949는 MS 구현이 아니랜다. Charset 클래스에서 CP949는 x-IBM949의 동의어로 처리된다.
흠 그런가? 하고 좀 더 찾아보니, x-IBM949는 단지 EUC-KR에 확장 ASCII 코드를 몇 개인가 더 붙여둔 것 같다.

즉슨, 안타깝게도 x-IBM949는 KS-X-1001[footnote]일부에게는 KS-C-5601이 더 익숙할지도 모르겠다.[/footnote]에 정의된 8,848글자의 한글만 표현할 수 있으며, 이를 벗어나는 이른바 “확장 한글”[footnote]CP949에서 추가로 정의된 글자들. 예를들면 “똠”이나 “쓩”, “뷁” 같은거[/footnote]은 표기할 수 없다.

그렇다면 자바에서 MS 확장을 사용할 수는 없는걸까? 물론 쓸 수 있다. MS 확장 구현은 “MS949″로 정의되어 있다.
위의 코드에서도, 파라미터만 MS949로 변경하니 의도한대로 잘 작동하는 것을 확인할 수 있었다.

다만 안타까운 사실은, 이것을 찾아내는데 장장 세 시간이 넘게 걸렸다는 점 정도일까. 선마이크로시스템즈 나쁜색기들.

맥북에어 모니터 HDMI 출력 젠더

맥북에어는 외부모니터 연결 단자로 miniDP 단자만 제공한다. 아직은 HDMI나 DVI가 많이 사용되므로 젠더가 필요하다.

어쩌다보니 넷메이트 제품만 줄줄이 달아두게 되었는데 딱히 스폰받은건 아니고 -.-
룡산에서 집어온게 넷메이트 젠더(가운데거)라 찾기 쉬워서…

miniDP – HDMI(숫) 케이블(2미터) : http://prod.danawa.com/info/?pcode=1216123
맥북과 HDMI 모니터를 직접 연결할 수 있다.

miniDP – HDMI(암) 젠더 : http://prod.danawa.com/info/?pcode=1230327
별도의 HDMI 케이블이 필요하지만 휴대가 간편하다. 요즘 웬만한 세미나룸은 HDMI 케이블을 구비하고 있으니, 휴대가 목적이면 이쪽이 더 편리하다.

miniDP – DVI/HDMI/DP 멀티젠더 : http://prod.danawa.com/info/?pcode=1535693

참고로 상기 링크는 전부다 passive 방식이며, 최대 해상도 1920×1200까지만 지원한다.
2560×1440 이상 해상도로 넘어가려면 active 방식 젠더를 사용해야 한다. 애플 정품이 17만원 정도 한다.