Egloos | Log-in


Tokyo Tyrant Java Client 0.7 출시

0.7 버전 출시!

0.5 이후로 달라진 점:
* putnr 명령이 이제 올바르게 동작합니다.
* 송신 버퍼 수위를 검사하여 송신 버퍼가 범람하지 않습니다.
* bufferCapacity로 송수신 버퍼 기본 크기를 설정할 수 있습니다.
* bufferHighwatermark로 송신 버퍼 최고 수위를 설정할 수 있습니다.
* 명령 큐가 넘치지 않도록 크기가 정해지지 않은 명령 큐를 사용합니다.

0.6 버전에는 치명적인 메모리 누수가 있으니 꼭 새 버전을 쓰세요. 대량으로 자료를 추가할 때에는 RDB#putnr을 사용하는 것이 좋습니다. 아주 빠르게 많은 명령을 MRDB로 실행하면 명령이 큐에 쌓여서 메모리가 부족하게 됩니다.

by 이피 | 2009/03/27 17:23 | Java | 트랙백(1) | 덧글(1)

Schemaless 시작

How FriendFeed uses MySQL to store schema-less data를 보고 영감을 받아 자바 버전을 만들었습니다. 개념이 간단하기 때문에 만들기도 쉬웠습니다. 기본 기능은 모두 구현이 되었고 깨진 인덱스를 효과적으로 복구하는 기능만 완료하면 필수 기능은 모두 구현이 됩니다.

엔티티와 인덱스를 분리하여 다루는 방식은 확장성, 가용성 면에서 장점이 있고, 스키마가 없다는 점은 유연성과 가용성면에서 장점이 있습니다. 이 둘이 조합되어 가용성, 확장성, 유연성 모두를 만족시킬 수 있습니다.

프로젝트를 뛰어야 시험해볼 수 있을텐데... 다시 일자리를 구할 수 있게 빌어 주세요. ㅋㅋ

by 이피 | 2009/03/14 00:14 | Java | 트랙백(1) | 덧글(3)

Tokyo Tyrant Java Client 0.5 출시

아마 안정적일거야 버전 출시!

달라진 점:
* 안정성과 성능 향상
* Netty의 ChannelBuffer 사용으로 간결해진 코드
* 실험적인 NettyNetworking 추가

NioNetworking 에서 찜찜하던 버퍼 조작 코드를 Netty 3ChannelBuffer로 대체하였습니다. 제가 작성한 코드가 많이 줄었으니 이제 안심하고 쓰셔도 될 것 같습니다.

by 이피 | 2009/02/27 17:56 | Java | 트랙백 | 덧글(2)

JUnit Max

Welcome to JUnit Max

예전에 Infinitest 라는 툴을 소개했습니다. 코드 수정 후 유닛 테스트를 따로 실행시키지 않아도 코드를 수정하면 연관된 테스트 케이스를 실행시켜주는 툴입니다. Inifinitest도 훌륭하지만 이클립스 플러그인이 아니라 조금 불편했습니다. 어제 Inifnitest와 비슷한 켄트 벡이 직접 만든 JUnit Max를 발견했습니다. JUnit Max는 이클립스와 완전히 통합되어 테스트 실패를 컴파일 실패와 동일하게 취급합니다. 즉 코드를 수정하면 자동 컴파일만 되는 것이 아니라 테스트까지 수행되고 문제가 있으면 문제가 있는 곳의 정보가 컴파일 오류와 같은 Problems 뷰에 표시가 됩니다.

by 이피 | 2009/02/05 10:11 | Java | 트랙백 | 덧글(1)

자연과학과 종교



를 같이 묶을 수도 있구나... 나는 "인문/역사/사회/자연과학"과 "예술/대중문화/여행/종교"로 묶었을 스도 있었을 텐데. 왜 종교와 자연과학이 묶였을까 궁금하다.

by 이피 | 2009/01/09 11:43 | 트랙백(1) | 덧글(5)

서버 어플리케이션 배포 스크립트

배포 작업의 최소 단위는 다음 복사, 실행, 루트 사용자로 실행 세 가지 기능이다. 이를 조합하여 배포 작업을 쉽게 기술할 수 있다. Fabric의 Bash 판이다.


user=blog

_put()
{
src=$1
dst=$2
host=$3
scp -pr $src ${user}@${host}:$dst
}

_run() {
cmd=$1
host=$2
ssh -l ${user} $host $cmd
}

_sudo() {
cmd=$1
host=$2
ssh -l root $host $cmd
}


간단한 사용 예. JDK 설치:

  1. 설치된 JDK 제거한다.

  2. 로컬의 .jdk1.6.0_10 디렉토리를 대상 호스트의 app의 하위 디렉토리로 복사한다.

  3. jdk1.6.0_10의 Soft Link jdk를 만든다.



jdk_install()
{
host=$1
echo "Install JDK on $host"
_run "mkdir -p app ; rm -rf app/jdk1.6.0_10 app/jdk" $host
_put ./jdk1.6.0_10 app/ $host
_run "cd app && ln -sf jdk1.6.0_10 jdk" $host
}


조금 어려운 아파치 HTTP 서버 설치와 시작:

  1. 설치된 아파치 HTTP 서버 제거한다.

  2. 바이너리 패키지를 대상 호스트로 복사한다.

  3. 바이너리 패키지 압축을 푼다.

  4. 일반 계정으로 실행하여도 80포트를 사용할 수 있도록 httpd 실행 파일의 소유주를 root로 변경하고 setuid를 설정한다.

  5. 바이너리 패키지를 삭제한다.

  6. 설정 파일을 대상 호스트로 복사한다.



httpd_install()
{
host=$1
echo "Install httpd on $host"
_run "mkdir -p app ; rm -rf app/httpd-2.2.10" $host
_put $source_dir/src/main/httpd-2.2.10-linux.tar.gz ./ $host
_run "tar xvzf httpd-2.2.10-linux.tar.gz -C app --exclude manual" $host
_sudo "cd /home/blog/app/httpd-2.2.10/bin && chown root httpd && chmod +s httpd" $host
_run "rm httpd-2.2.10-linux.tar.gz" $host
_put "$source_dir/src/main/environment-release/httpd/*" app/httpd-2.2.10/ $host
}



  1. 열 수 있는 파일 디스크립터 수를 만 개로 설정하고 아피치 서버를 시작한다.



httpd_start()
{
host=$1
echo "Start httpd on $host"
_run "ulimit -n 10000 && app/httpd-2.2.10/bin/apachectl start" $host
}


명령행에서 target_hosts 에 나열된 호스트를 대상으로 작업을 차례로 실행할 수 있다.

#!/bin/sh

#
# Tasks
#

target_hosts="
10.0.1.1 10.0.1.2
"
for host in $target_hosts
do
echo "Host $host"
for task in $@
do
$task $host
done
done


이렇게

$ ./deploy.sh httpd_stop httpd_install httpd_start

by 이피 | 2009/01/07 14:24 | 트랙백 | 덧글(0)

KDiff3 replaces Araxis Merge and Beyond Compare

예전 회사 다닐 때 맡은 업무 때문에 Diff, Merge 도구를 많이 사용했다. 상용인 Araxis Merge와 Beyond Compare를 즐겨 썼다. Araxis Merge는 파일 내용을 비교하고 머지할 때 좋고, Beyond Compare는 파일이 무지하게 많은 디렉토리를 통째로 비교할 때 좋다. 회사를 옮긴 후에는 대량의 파일을 비교할 일은 없어서 가끔 Araxis Merge를 불법으로 쓰고 있었다.

작년부터 Tokyo Tyrant Client for Java 작업을 하면서 TortoiseHg를 썼는데 Diff, Merge 툴이 포함되어 있다. 윈도우용 KDiff3다! Araxis Merge 안녕~

by 이피 | 2009/01/07 13:56 | 트랙백 | 덧글(0)

크리스마스 만찬 닭다리살 조림



냐하하. 조린 닭다리살에 각종 채소 듬뿍.

by 이피 | 2008/12/27 12:57 | 트랙백 | 덧글(2)

Tokyo Tyrant Java Client 0.3 출시

크리스마스 이브 기념 출시!

달라진 점:

  • 명령에 값을 위한 Transcoder를 직접 지정할 수 있다

  • 복제된 여러 서버 노드에 접근 가능한 TokoyTyrantClient API



다음 버전에서는 Master/Slaves 복제시 쓰기는 Master에 하고 읽기는 Slaves에서 하는 기능을 추가할 예정입니다. 그러나 저러나 쓰는 사람이 없어서 다 헛짓이군요. 이제 다중 노드 지원과 오류 복구 기능이 테스트 가능한 단계가 되었는데 제가 하던 프로젝트는 이미 코드 프리즈가 되어서 밀어 넣을 수가 없네요.

메리 크리스마스~

by 이피 | 2008/12/24 19:15 | Java | 트랙백 | 덧글(2)

저장은 DB로 열람은 검색기로

웹서비스를 만들면서 자주 만나게 되는 문제가 있다. 목록 형태로 정보를 열람하는 문제인데... 열람 대상 객체와 관련이 있는 다른 객체의 속성을 같이 보여주거나 정렬을 해야하면 정말 골치 아프다. 그런데 기획자들은 다양한 기준으로 정렬하고 부가 정보도 최대한 같이 보여주고 싶어 한다. 어떤 열람 방식이 최적인지 판단하기 힘드니 일단 사용자에게 다양한 방식을 제공하기 위해서인 것 같다.

이런 요구 사항은 RDBMS로 구현하기가 쉽지 않다. 데이터가 적은 경우는 그냥 JOIN을 사용하면 되는데 데이터가 많은 경우는 JOIN하기 어려운 경우도 많다. 반정규화를 해야 하면 코드도 늘어나고 데이터가 서로 일치 하지 않는 경우도 종종 발생해서 개발자를 괴롭힌다. 그냥 덮어 두기에는 너무 자주 만나는 상황이라 방법을 찾았으면 좋겠다. 한가지 생각한 방법은 데이터는 RDBMS나 단순한 DB에 다 넣고, 열람할 때는 검색 엔진을 쓰는 것이다. 검색 엔진을 쓰면 인덱스를 만들 때 검색 대상과 관련 속성도 같이 넣어 놓으면 쉽게 정렬할 수 있고 보여줄 수도 있다.

문제는 검색 엔진이다. 실시간으로 인덱스를 추가할 수 있어야 하고 문자열만 아니라 다양한 형의 필드를 지원해야 하고, 여러 서버에서 동작해야 한다. 자바로 만들어진 Lucene가 적당해 보인다. JDBC로 인덱스를 저장할 수도 있으니 여러 대의 서버에서도 돌아갈 것 같다. 하지만 API가 그리 쉬워보이지는 않는다. 검색을 해보니 비슷한 생각을 하는 사람이 있다. 이미 누군가 만들어 놓았을 것 같은데 못찾겠다. 일단 접었다.

오늘 어쩌다 Compass 라는 것을 봤다. 메뉴얼을 보니 그럴싸 하다. 검색 속도만 충분히 빠르다면 쓸만할 것 같다. "이건 구현하기 힘들어요", 반정규화, 복잡한 WHERE 절, 페이징 처리와 이별할 수 있을까?

by 이피 | 2008/12/23 16:37 | 트랙백(1) | 덧글(2)

◀ 이전 페이지          다음 페이지 ▶