해외폰을 살 때, 지원되는 Band나 주파수를 어떻게 결정해야 할까?

  1. 이통사에 물어본다
    큰 기대를 안하는 게 좋습니다.
    왜냐면, 국내 이통사들은 국내 출시폰 말고는 거의 모르기 때문이죠…
  2. 인터넷에서 이통사별 Band 를 검색해 본다.
    이것도 만만치 않습니다.
  3. 국내폰의 스펙을 찾아본다.
    BS가 내린 결론입니다.
    삼성이나 엘지 홈페이지에서 적당한 핸드폰의 스펙을 보면 지원하는 주파수 대역에 대해 나오는 것이 있습니다.
    아래에 삼성 갤럭시 S7의 주파수 대역을 적어봅니다.
    이걸 가지고 구매하려는 핸드폰의 지원 대역과 비교해서 2번에서 검색되는 것과 병합
    3개의 정보를 가지고 잘 결정하면…
    GSMARENA 사이트 같은 경우 네트워크로 필터링도 되니 참고하세요.

2G GSM
GSM900, DCS1800, PCS1900
3G UMTS
B1(2100), B2(1900), B5(850)
3G TD-SCDMA
B34(2010), B39(1880)
4G FDD LTE
B1(2100), B2(1900), B3(1800), B4(AWS), B5(850), B7(2600), B8(900), B12(700), B17(700), B18(800), B19(800), B20(800), B25(1900), B26(850), B28(700)
4G TDD LTE
B38(2600), B39(1900), B40(2300), B41(2500)

육하원칙(5W1H)와 CS 구조의 게임서버 개발

육하원칙

  • 누가(who)
  • 언제(when)
  • 어디서(where)
  • 무엇을(what)
  • 어떻게(how)
  • 왜(why)

게임 서버

  • 누가
    클라이언트 or 서버 오브젝트
  • 언제
    디자이너의 결정
  • 어디서
    디자이너, 프로그래머의 합의
  • 무엇을
    디자이너 결정
  • 어떻게
    디자이너, 프로그래머의 합의

  • 디자이너 결정

이렇게 생각하는데…

문제는 지금까지 겪어 온 게임 디자이너들 중에 디자이너가 결정해야 하는 것을 제대로 결정하는 경우가 극히 드물다는 것이다.

특히! 왜(why)에 해당하는 것을 충분히 디자인 문서에 적는 경우가 없어서, 디자인 담당자가 변경된 경우, 이전 담당자의 의도를 파악하지 못하고…

결국은 디자인은 처음부터 갈아 엎어서 개발 기간을 쭈욱 늘리는 결과를 만들어 내는 경우가 많았음…

그리고, 왜(why)에 해당하는 걸 물었을 때에 받는 답변은…

  1. 요새 잘나가는 OOO 게임이 그렇게 하니까요.
  2. 그냥 느낌이 그래요.
  3. OOO 해서, XXX 하고, NNN 해서, AAA가 필요하게 됩니다.

3번과 같은 답변이 정상인데, 어째서 1, 2번 답변은 대부분인지…

게임 서버 프로그래밍이란…

BS가 생각하는 서버 프로그램

  1. 클라이언트에서 데이터를 입력 받으면
  2. 서버의 데이터와 검증하고
  3. 서버의 데이터와 병합해서 새로운 데이터를 만들고
  4. 서버에 저장하고
  5. 클라이언트에 알려준다

그럼 게임 서버는?

  1. NPC와 같은 클라이언트가 제어하지 않는 객체가 무수히 많다
  2. 서버 관리 객체들의 변화를 클라이언트에 알린다

이게 전부? 라고 생각되네요.

Exception has been thrown by the target of an invocation

Exception has been thrown by the target of an invocation

라고 뜨면서 Visual Studio 2017 디버깅이 불가능한 지경에…
재설치를 해도 해결 되지 않고 해서 찾다보니

  1. Visual Studio 를 모두 종료
  2. AppData\Local\Microsoft\VisualStudio\12.0\ComponentModelCache 의 파일 모두 삭제
  3. 재시작… 그래도 안되면
  4. devenv.exe /Setup /ResetSkipPkgs

Skip 된 패키지의 찌끄러기가 남아서 그랬나 봅니다.

최근 Ubuntu를 사용하고 있는데

우선 Wubi로 멀티부팅을 했더니 BS의 노트북에 있는 모든 H/W가 인식이 안되고 일부는 드라이버를 구하기 힘들어서 패스…

Windows 10 + Hyper-V + Ubuntu 16.04 LTS 조합으로 Ubuntu를 사용 중인데 Windows 를 사용하는 것보다 좀 불편한 것이 많이 있네요.

Hyper-V 위에서 동작하다보니 일단 기본 GUI 환경의 반응 속도가 상당히 느리고

동적 메모리로 제한을 두지 않았더니 운 나쁘면 저장된 상태를 복원할 수 없는 경우가 발생… VM 인데도 일시 정지를 하기가 두렵고

Linux용 Firefox가 Dokuwiki와 잘 맞지 않는지 글 저장하고 맹한 페이지가 출력되고 Linux용 Chrome 또한 Keyboard shortcut이 잘못 적용되어서 도움말에는 분명 탭 이동이 Ctrl + 숫자인데 Alt + 숫자도 함께 먹는 버그가…

아무래도 BS에겐 개인 PC의 작업 환경으로는 Ubuntu는 아닌가 봅니다.

Windows 10보다 빠르지 않고, Windows 10보다 저사양으로 실행되지 않고, …
이러면 Windows 10을 버리고 작업환경으로 사용할 이유가 없다는…

Windows 10 + Hyper-V + Ubuntu 16.04 + VNC 로 리눅스 GUI 어플을 실행하자

Windows 10 설치법 -> 생략
Hyper-V 설치법 -> 생략
Ubuntu on Hyper-V 설치 -> 생략

VNC 환경을 위한 설치

참고자료: Medium.com의 자료

# 관련 패키지 설치
# gnome-panel: 런처와 태스크바
# gnome-settings-daemon: 각종 설정을 편리하게 하기 위함
# metacity: 창 관리자
# nautilus: 파일 관리자
# gnome-terminal: 터미널
# vnc4server: VNC 서버
apt-get install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal vnc4server

# 설치 후 일단 실행
vnc4server

# 실행되고 나면 일단 종료
vnc4server -kill :1

# 시작 스크립트 편집
# 내용은 아래의 예제 파일 참고
vim ~/.vnc/xstartup

# 해상도를 지정해서 다시 실행
vnc4server -geometry 1280x800

~/.vnc/xstartup 예제

#!/bin/sh
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &

gnome-panel &
gnome-settings-daemon &
metacity &
nautilus -n &
gnome-terminal &

한글은 im-config 실행해서 해결

Ubuntu에 폰트 설치하기

D2Coding 폰트 설치를 예로…

# D2Coding 받기
wget https://github.com/naver/d2codingfont/releases/download/VER1.21/D2Coding-1.2.zip
 
# 설치할 디렉토리 만들기
mkdir /usr/share/fonts/truetype/D2Coding
 
# 압축 풀기
unzip D2Coding-1.2.zip -d /usr/share/fonts/truetype/D2Coding/
 
# 쓸데없는 맥 디렉토리 삭제
rm -rf /usr/share/fonts/truetype/D2Coding/__MACOSX
 
# 폰트 캐싱 강제로 다시 하기
fc-cache -f -v

터치 패드의 드라이버 진단 단축키 방지

노트북을 사용하면 Synaptics 터치패드가 대부분 붙어 있는데… (아직도 특허가 남아서)

Alt + Shift + L 을 누르면 TouchPad Driver Diagnostics 팝업이 발생

이걸 막으려면

HKLM/SYSTEM/CurrentControlSet/Services/SynTP/Parameters/Debug/DumpKernel 라는 REG_DWORD 값을 0으로 설정

사용하지 않는 프린터 드라이버를 삭제

  1. 관리자 권한으로 명령 프롬프트 실행
  2. printui /s 또는 printui /s /t2 를 실행
  3. 불필요 드라이버 정리

위 방법이 Print Spooler 서비스로 인해 방해 받는 경우에는

  1. 서비스 관리자에서 Print Spooler 서비스 중지
  2. Windows/System32/Spool/Printers 안의 내용을 정리
  3. 서비스 관리자에서 Print Spooler 서비스 시작
  4. 위에 적힌 방법대로 printui 로 삭제

간단한 Docker 체험

Docker는 업계 표준 컨테이너 기술이 된 녀석입니다. Windows도 결국 이를 따라서 Windows Container를 발표했죠.

아주 간단하게 Docker 사용에 대해 정리합니다.
Ubuntu 16.04 LTS 기준으로 작성되었습니다.

자세한 내용은 여기를 참고하시면 도움이 될 겁니다. 가장 빨리 만나는 Docker

  1. 설치
    docker라는 패키지명은 이미 사용 중이여서 docker.io라는 패키지 명을 사용합니다.

    apt-get install docker.io
    
  2. docker를 사용할 사용자를 그룹에 추가
    미리 docker를 사용할 유저를 docker 그룹에 추가하면 sudo 명령을 통하지 않고 docker를 사용할 수 있습니다.

    usermod -G docker -a bs
    
  3. 이미지를 찾기
    왠만한 이미지는 공식 버전을 사용하면 됩니다.
    자신만의 설정이 필요한 경우에는 Host의 OS와 동일한 이미지를 추천합니다.

    docker search ubuntu
    NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    ubuntu                            Ubuntu is a Debian-based Linux operating s...   5365      [OK]
    ubuntu-upstart                    Upstart is an event-based replacement for ...   69        [OK]
    rastasheep/ubuntu-sshd            Dockerized SSH service, built on top of of...   66                   [OK]
    consol/ubuntu-xfce-vnc            Ubuntu container with "headless" VNC sessi...   37                   [OK]
    ubuntu-debootstrap                debootstrap --variant=minbase --components...   27        [OK]
    torusware/speedus-ubuntu          Always updated official Ubuntu docker imag...   27                   [OK]
    nickistre/ubuntu-lamp             LAMP server on Ubuntu                           14                   [OK]
    nuagebec/ubuntu                   Simple always updated Ubuntu docker images...   13                   [OK]
    nickistre/ubuntu-lamp-wordpress   LAMP on Ubuntu with wp-cli installed            8                    [OK]
    ...
    
  4. 이미지를 받기
    아래 예제에서는 ubunt 최신 버전을 받습니다.

    docker pull ubuntu
    
  5. 가지고 있는 이미지 확인
    docker images
    
  6. 가지고 있는 모든 이미지 확인
    태그 되지 않고 이름이 없는 이미지들이 보일 수 있습니다.
    이는 이미지가 스냅샷의 성격을 가지고 있어서 중간 단계의 의존성을 가지는 이미지들이 존재하기 때문입니다.

    docker images -a
    
  7. 컨테이너를 생성하면서 실행
    create로 생성하고 start로 실행할 수도 있지만 run으로 바로 생성과 시작을 할 수도 있습니다.
    --rm 옵션을 주면 종료시 컨테이너를 자동으로 삭제할 수도 있습니다.
    아래는 쉘에서 입출력을 하는(-i, -t) ubuntu-test 라는 이름의(–name ubuntu-test) 컨테이너를 ubuntu:latest 이미지(ubuntu)를 생성하여, “/bin/bash -” 를 실행하는 예제입니다.

    docker run -i --name ubuntu-test -t ubuntu /bin/bash -
    
  8. 실행 중인 컨테이너 확인
    docker ps
    
  9. 모든 컨테이너 확인
    종료된 컨테이너를 포함한 모든 컨테이너를 확인할 수 있습니다.

    docker ps -a
    
  10. 컨테이너를 이미지로 만들기
    아래는 “BS <bs@bspfp.pe.kr>”로 저자를 지정하고, “Commit Test”라는 메시지를 기록하면서, “ubuntu-test” 컨테이너를 mytest:0 이미지로 생성합니다.

    docker commit -a "BS <bs@bspfp.pe.kr>" -m "Commit Test" ubuntu-test mytest:0
    
  11. 이미지에 새로운 태그 붙이기
    아래는 mytest:0 이미지에 mytest:latest 이름을 추가로 붙입니다.

    docker tag mytest:0 mytest:latest
    
  12. 이미지 삭제
    삭제되는 이미지에 의해 더이상 참조되지 않는 익명의 이미지들도 함께 삭제 됩니다.

    docker rmi mytest:0
    
  13. 종료된 컨테이너 다시 실행
    아래는 “ubuntu-test” 컨테이너를 표준 입출력을 열어서 실행하도록 합니다.

    docker start -a -i ubuntu-test
    

Linux Run Level 정리

  1. 0 – halt
    시스템 종료
  2. 1 – Single user mode
    루트 사용자로 시작하는 복구용도로 쓰이는 모드
  3. 2 – Multiuser mode, No networking
    네트워크 기능이 사용되지 않는 멀티 유저 모드
  4. 3 – Full multiuser mode
    일반적인 서버용 Linux의 기본 모드
  5. 4 – 미사용
  6. 5 – X11
    3과 동일하나 쉘이 텍스트 기반이 아니라 GUI 기반(X Window)
  7. 6 – reboot
    시스템 재시작