본문 바로가기

전체 글

(95)
[팁] macOS Sierra에서 Java Control Panel이 안열리는 경우 macOS Sierra로 업그레이드 또는 설치 이후에, Java 8을 설치하게 되면 Control Panel이 처음 한번만 실행된 이후 실행되지 않는 오류가 있습니다. 해당 오류의 원인은 macOS Sierra에 설정된 locale을 Java가 정상적으로 인식하지 못하여 생기는 문제인데 특히, 이 오류는 한글을 기본 언어로 사용하는 경우에 발생이 됩니다. 실제로 locale이 "ko-korea"로 인식되어 로컬라이징 되어야 하지만 "ko-kore" 로 인식되면서 존재하지 않는 언어셋으로 처리되면서 생기는 이슈 입니다. 해당 이슈는 재미있게도 macOS Sierra의 언어를 영어로 바꾼 이후에 (리부팅 이후 로그인 하여야 합니다.) Java Control Panel을 실행하면 정상적으로 실행이 됩니다. 이..
서버 개발자가 알아야하는 정보들.. 오랜 시간동안 서버개발자 라는 타이틀을 가지고 지금까지 활동을 하고 있습니다. 여러가지의 프로젝트를 진행하였고, 지금은 게임 개발자로서 활동을 하고 있습니다. 어찌 보면, 좀더 편한 형태의 개발을 할수 있는 기회가 많았으나 어찌된건지 자꾸 게임에 기웃거리게 됩니다. 이제, 다양한 프로젝트를 하면서 얻는 다양한 경험들을 공유해 볼까 합니다. 개발자들 중에 이러한 정보를 잘 정리하는 분들도 계시겠지만, 저 같은 경우는 상당한 귀차니즘이 있어서 잘 정리를 하지 못하였지만, 이번기회에 이러한 귀차니즘을 좀 바꿔볼까 합니다. 초급 개발자 분들에게는 미리 극한 직업을 체험해 볼수 있는 기회가 될수도 있겠고, 이제 개발에 재미 붙이신 분들에게는 유용한 정보가 되지 않을까 조심스럽게 생각해 봅니다. 이 포스팅은 계속 ..
TIP. fork() 시 callback 처리 LINUX에서 fork() 함수를 사용하는 경우, fork 전후의 처리를 해야하는 상황이 있다. 일반적으로는 pid_t pid; if ((pid = fork()) 0) { // parent } 와 같은 형태로 처리해도 되지만, pthread_atfork()를 사용하면 좀더 효율적인 처리가 가능하다. void fork_ready() { fprintf(stderr, "fork() 전\n"); } void fork_child() { fprintf(stderr, "fork() 이후 - CHILD\n"); } void fork_parent() { fprintf(stderr, "fork() 이후 - PA..
TIP. EPOLLONESHOT 사용 이슈 LINUX에서 네트워크 이벤트를 처리하기 위해 사용하는 방식으로 epoll을 많이 사용한다. 장점이 많은데 epoll의 장점 중 하나가 EPOLLONESHOT이라는 플레그가 있다. EPOLLONESHOT의 용도는 이벤트가 발생될때 한번만 발생되고, 대기상태로 진입하게 하는 특성을 가진다. 그런데, 문제가 하나 있다. - 이벤트가 발생된 이후에, 이벤트를 재 설정(epoll_ctl(EPOLL_CTL_MOD)) 하면서 발생하게 된다. - 설정 이후에, 소켓의 이벤트가 발생되지 않는 문제가 바로 그것이다. 이는 최근 커널에서 EPOLLWAKEUP 으로 해결이 되었는데, 지원하지 않은 경우는 다음 방식을 사용하면 된다. ioctl(fd, FIONREAD, &nread); 단, 소켓에서만 해당 syscall을 사..
대량의 데이터처리를 위한 알고리즘... 최근 빅데이터를 다루기 위한 여러가지 기술들이 많이 사용되고 있다. 그 중 하나의 알고리즘을 소개해보고자 한다. lucene redis leveldb 이들의 공통점은 skiplist 알고리즘을 사용한다는 것이다. Skip ListTypeListInvented1990Invented byW. PughTime complexity in big O notationAverageWorst caseSpaceO(n)O(n log n)[1]SearchO(log n)O(n)[1]InsertO(log n)O(n)DeleteO(log n)O(n) 대량의 데이터를 빠르게 검색이 가능하다는 장점이 있으며, 사용하는 방법에 따라서는 최상의 성능을 발휘하지만 몇가지 제약을 가지고 있기도 하다. 그래서, 나는 몇가지 기능을 수정해 보았..
게임 컨텐츠 구현을 위한 V8 Javascript엔진.. 저는 현재, 타이틀과 마찬가지로, Google의 V8 Javascript엔진을 게임개발에 사용하고 있습니다. 이러한 방식으로, 서비스를 만들고, 클라이언트와 통신을 합니다. var wsaio = new WSAIO();var l = wsaio.listen(8080, 10); l.onreceive = function (fd, bson) { print("RECV: " + process.id + " " + fd);}; l.onconnection = function (fd, addr) { print("CONNECTION: " + process.id + " " + JSON.stringify(addr)); l.forEach(function (fd, o) { print("FOREACH: " + fd + " => " +..
블로그 개편... 지금까지.. 방치해둔 블로그를 다시 손대볼까 합니다. 그 동안, 게임도 만들고.. 여러가지 솔루션도 개발하였습니다. 개발에 필요한 아티클과 개인적인 일상을 위주로 운영을 해볼까 합니다. 참.. 전, 서버개발자 이므로 게임클라이언트를 개발하시는 분들보다 서버에 관심있으신 분들이 개발에 도움될만한 내용들이 많을듯 합니다.
데이터 변경에 대한 로깅 대부분의 서비스는 데이터베이스를 통해서, 데이터를 관리하고 그에 대한 변경 내용을 일일이 관리합니다. 이러한 데이터는 이후 서비스의 유지 보수와 사용자 응대에 사용되기 마련입니다.그러다 보니, 개발자 입장에서 이러한 데이터를 저장하고, 처리하는 업무가 중요할수 밖에 없습니다.나름, 이러한 처리를 저 또한 많이 하고, 단순화 시키기 위해서 많은 노력을 합니다. 그래서 사용하는 방법이 Observer 형태의 개발 패턴을 사용하였습니다. 이러한 패턴을 사용하기 위해 다음과 같은 접근 방식을 택하였습니다. - 쿼리를 통해, 데이터는 Map형태로 정규화 시킨다.- Map형태로 저장된 데이터의 변경을 로깅 관리한다.- 변경된 내용을 기록하는 함수를 통해 데이터베이스에 반영한다.- 데이터베이스에 정상적으로 반영이 되..