osx, linux에서 테스트했는데 잘 됩니다...

osx에서 ftp서버 설치하려니 하이시에라부터 뭐가 바뀌어서 깔기 귀찮게 되어있더군요.

그래서 docker로 설치해봤습니다.


kitematic은 아직 osx에서는 불안한 감이 있네요. 죽기도하고....



좀 더 돌려봐야겠지만 .. ftp 서버를 간단히 만들기 좋습니다.


kitematic 조금 쓰다가.... 편한데? 불편합니다...

역시... 커맨드라인쪽이 기능이 풍부합니다.


docker run -d -v /home/erith:/home/vsftpd \
-p 20:20 -p 21:21 -p 21100-21110:21100-21110 \
-e FTP_USER=[아이디] -e FTP_PASS=[비번] \
-e PASV_ADDRESS=[아이피] -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 \
--name vsftpd --restart=always fauria/vsftpd



https://gitnub.com/fauria/docker-vsftpd




11기가 정도파일은 쭉-- 잘 올라가는데, 50기가 짜리파일은 올라가면서 자꾸 멈추는 문제가있네요.

첨에 osx에서만 테스트하다가 맥 문제인가 싶었는데... 파일이 너무 커서 그런듯한데...

일단 여기까지만 테스트.


https://docs.docker.com/docker-for-mac/#explore-the-application



50기가 파일 테스트.. 자주 끊킴현상이 발생합니다. 도커설정에서 swap늘려주고하면 좀 증상이 줄어들긴한데 끊키는건 마찬가지입니다.


11기가 파일 테스트. 그냥 쭉 잘 올라갑니다.


도커로 mysql을 설치하고 보니 시간대가 이상합니다.

KST로 변경이 필요해 보였습니다.


우선 운영컨테이너에 다음 명령으로 시간대를 수정합니다.


ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime


mysql에서도 아래와 같이 수정하였습니다.




select now()해서 현재 시간을 확인합니다.


이후, 


set time_zone = 'Asia/Seoul';

하여 시간대를 변경합니다.

그리고 바뀐 것을 확인합니다.


* 추가 배포판 확인

#grep . /etc/*-release


#cd /usr/share/zoneinfo/


파일있는지 확인하여

cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime

ovewrite 확인

date 해서 시간확인

mysql 최신버전에서 암호방식이 바뀌어서 그렇습니다. 

mysql.dll을 포함한 mysql을 설치하여 dll을 heidisql로 복사하는 방법도 있는데, mysql을 따로 설치하기 싫어서 아래 방법으로 해결했습니다.


docker ps 해서, CONTAINER ID를 확인입니다, 화면에서는 f0c69ac1c8dc 입니다.



docker exec -it [CONTAINER_ID] bash 하여 배쉬쉘로 접근합니다. 컨테이너 아이디는 구분되는 첫글자들만 입력해도 됩니다.

그리고 mysql -uroot -p[암호] mysql 하여 mysql로 접속합니다.




ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '암호';

flush privileges;

합니다..




Docker를 이용하면 번거롭게 서버 이것저것 깔지 않고 컨테이너 설치만으로 깔끔하게 서비스 운용이 가능합니다.


더군다나 Kitematic을 이용하면 GUI를 이용해 굳이 커맨드라인 안쓰더라도 설치가 가능합니다. 설치도 굉장히 간단해서 좋습니다.! 

수분만에 설정이 완료입니다. ㅎㅎ,



윈도우즈10기준으로 설명하며, 워드프레스 설치를 해보겠습니다.




먼저 윈도우즈용 도커를 다운로드 받아 설치합니다. CE(Community Edition)을 설치하면 됩니다.


https://docs.docker.com/docker-for-windows/install/



Docker Hub 로그인이 필요한데, 가입하고 로그인을 합니다.





워드프레스의 경우 MySQL DB Container와 Wordpress Container를 설치하면 됩니다.




우선 Share설정을 해줍니다. MySQL 저장소를 특정 디렉토리에 지정하기 위함입니다.


Setting를 들어갑니다.


저는 MYSQL 저장소를 D:\Docker\mysql 에 저장할 것이기때문에 D: 를 Share 하고 Apply했습니다.












이제 도커 트레이 아이콘에서 Kitematic을 클릭합니다.

그럼 Kitematic을 다운로드 받을텐데요. 적당한 곳에 압축을 풀고 실행해줍니다.



이후, C:\Program Files\Docker\Kitematic 폴더로 위치시킵니다. 








Kitematic을 실행합니다.







먼저 mysql Container설치가 필요합니다. mysql을 검색하시고 공식 컨테너이너에 Create버튼을 눌러주세요.







설치 후, MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD, MYSQL_RANDOM_ROOT_PASSSWORD 중 하나 설정이 필요하다고 하는데요. 설정해주러 갑니다. 오른쪽 위에 Setting 를 클릭합니다.








환경변수에 MYSQL_ROOT_PASSWORD  항목을 입력하고, 암호를 입력합니다. 저는 wordpress로 했습니다.


그리고 반드시 SAVE버튼을 눌러주어 저장해야합니다.











Hostname / Ports 탭에서 포트 설정도 해줍니다. 기본적으로 임의로 포트로 구성되는데 mysql의 기본포트인 3306 포트로 지정하고 SAVE버튼을 꼭 눌러줍니다.












Volume도 지정합니다. 저의 경우 D:\Docker\mysql 폴더를 지정했기 때문에 \host_mnt\d\Docker\mysql로 연결되었습니다. 이렇게하면 MySQL의 DB데이터들이 이 디렉토리에 저장 됩니다.












이제 다시 좌 상단에 + NEW 버튼을 눌러 새로운 컨테너를 검색해서 설치합니다.  wordpress를 검색해서 공식 wordpress 컨테이너에 CREATE버튼을 클릭합니다.









설치 후, 역시 Settings 탭에 들어가 외부포트를 80으로 맞추어줍니다. 혹시 이미 80포트를 사용하고 있다면, 기존 서비스를 꺼준다던가, 다른포트를 사용해야 합니다.






앞서 설치한 mysql container와 연결시켜주기 위해 Network탭에서 Link 항목에 mysql을 위 그림과 같이 설정해줍니다. 주의할 점은 위처럼 입력 후, 반드시 + 버튼을 클릭해주셔야 합니다.









이제 끝났습니다. 


localhost로 접속해보시면 아래와 같이 워드프레스 화면이 뜨는 것을 볼 수 있습니다!









ps) 워드프레스 컨테이너의  Volumes 디렉토리를 지정하여, PC 내부 디렉토리로 연결할 수 있습니다...



GEMS 8


SECTION 01 프로그래밍 일반

1.1 인스턴싱을 이용한 빠른 글꼴 렌더링

1.2 화면 공간 주변광 차폐의 원리와 응용

1.3 다해상도 지연 셰이딩

1.4 DirectX 11에서 캐트멀-클라크 패치의 시야 절두체 선별

1.5 DirectX 11의 계산 셰이더를 이용한 주변광 차폐

1.6 비정형 그림자 매핑을 위한 시점 시야 픽셀 앨리어싱 제거

1.7 프로그래밍 가능한 그래픽 하드웨어에서의 중첩 실행

1.8 SPU들에서 정점, 단편 셰이딩을 효과적으로 수행하기 위한 기법들


SECTION 02 애니메이션과 물리

2.1 다용도, 상호작용적인 해부학적 인간 얼굴 모형

2.2 이음매 없는 캐릭터 애니메이션을 위한 곡선 경로

2.3 비반복, 닫힌 형태 역기구학(NCF IK) 사슬 해법

2.4 게임 프로그래밍 위한 입자 무리 최적화

2.5 해석적 기법들로 수치 적분 개선하기

2.6 대단한 항력: 사실적인 3차원 공기 및 유체 저항 모형

2.7 임의의 닫힌 메시에 준유체 동역학 적용하기

2.8 실시간 충돌 검출을 위한 근사 볼록꼴 분해


SECTION 03 인공지능

3.1 아주 큰 세계를 위한 AI 세부수준

3.2 모듈식 게임 AI를 위한 패턴 기반 접근방식

3.3 고급 성장 기반 기법들을 이용한 내비게이션 메시 자동 생성 

3.4 동물과 에이전트 이동을 위한 실용적인 공간 표현 아키텍처

3.5 제어 이론을 게임 AI와 물리에 적용하기 

3.6 1인칭 슈팅(FPS) 게임의 적응적 전술 선택

3.7 혼돈 이론 응용: 결정론적 시스템으로 이용해서 외관상의 예측불가능성 만들기

3.8 욕구 기반 AI

3.9 감정을 가진 디지털 배우를 위한 프레임워크 하나

3.10 규모가변적 대화 작성

3.11 MMORPG의 플레이어 궤적 분석을 위한 그래프 기반 자료


SECTION 04 프로그래밍 일반

4.1 빠른 Is-A 관계 판정

4.2 등록된 변수

4.3 효율적이고 규모가변적인 다중 코어 프로그래밍

4.4 메모리와 자료 접근의 관점에서 본 게임 최적화

4.5 스택 할당

4.6 게임 내 메모리 프로파일러의 설계와 구현

4.7 좀 더 많은 정보를 담은 오류 기록 생성

4.8 QA를 위한 코드 포괄도

4.9 게임 엔진 안의 영역 국한 언어

4.10 다종다양한 환경들을 위한 유연한 사용자 인터페이스 배치 시스템

4.11 투영 가능한 지형 메시를 위한 도로 생성

4.12 게임 개발에서 디지털 드로잉 태블릿 활용하기

4.13 Intel® TBB를 이용한 다중 스레드 행위자 기반 아키텍처 만들기


SECTION 05 네트워킹 및 다중 플레이어

5.1 보안 채널 통신

5.2 게임 속 사회망: Facebook 친구와 함께 놀기

5.3 규모가변적 게임 서버를 위한 비동기 I/O

5.4 MMOG에 3D 스트리밍 기술 도입하기


SECTION 06 오디오

6.1 실용적인 DSP 무선 통신 효과

6.2 음향 팀에 큰 힘을 주는 훌륭한 음향 엔진 하나

6.3 강체 효과음의 실시간 합성


SECTION 07 GPU 범용 컴퓨팅

7.1 이질적인 병렬 아키텍처들에서 OpenCL 활용하기

7.2 Batman: Arkham Asylum의 PhysX GPU 강체 시뮬레이션

7.3 PhysX를 이용한 빠른 GPU 유체 시뮬레이션



GEMS 7


SECTION 1 프로그래밍 일반

1.1 연령 및 비용 측정을 통한 효율적인 캐시 교체

1.2 고성능 힙 할당자 

1.3 웹캠 기반 비디오 게임을 위한 광류 응용

1.4 다중 플랫폼 스레드 관리 엔진의 설계와 구현

1.5 꿀벌과 게이머를 위해: 육각 타일 다루기

1.6 세포자동차에 기초한, RTS 게임을 위한 스케치 기반 인터페이스

1.7 1인칭 슈팅 게임을 위한 발 기반 항행 기법

1.8 함수 지연 호출 시스템

1.9 다중 스레드 작업 및 의존성 시스템

1.10 고급 디버깅 기법들


SECTION 2 수학과 물리

2.1 난수 만들기

2.2 게임을 위한 빠른 범용 반직선 질의

2.3 최원 자질 맵을 이용한 빠른 강체 충돌 검출

2.4 투영 공간을 이용한 기하 계산의 정밀도 향상

2.5 XenoCollide: 복잡한 충돌을 간단하게 처리하기

2.6 변환 의미론을 이용한 효율적인 충돌 검출

2.7 삼각 스플라인

2.8 가우스 난수를 이용한 사실적인 탄도 다변화


SECTION 3 인공지능

3.1 행동방식 복제를 이용해서 흥미로운 에이전트 만들기

3.2 사실적이고 통합된 에이전트 감각 모형

3.3 AI 알고리즘 코드의 복잡도 다스리기: 일반적인 프로그래밍 접근방식

3.4 문제는 태도: 여론, 평판, NPC 개성의 구축요소

3.5 플레이어 궤적과 상호작용적 플레이어 그래프를 이용한 게임

3.6 목표지향적 계획 병합

3.7 A*를 넘어서: IDA*와 주변부 검색


SECTION 4 오디오

4.1 CPU 프로그램을 이용한 음향 신호 처리

4.2 MultiStream-차세대 음향 엔진 작성의 예술

4.3 게임 음향 환경에서 되풀이 없애기 및 사운드 설계에 대한 새로운 접근방식

4.4 실용적인 실시간 음향 효과

4.5 문맥 주도적인 계층적 믹싱


SECTION 5 그래픽

5.1 고급 입자 퇴적

5.2 골격 애니메이션의 누적 오차 줄이기

5.3 거친 재질을 위한 또 다른 분산광 셰이딩 모형

5.4 고성능 세분 표면

5.5 방사 기저 함수 텍스처를 이용한 부조 임포스터의 애니메이션

5.6 셰이더 모형 1.1 이상에서의 클립매핑

5.7 개선된 데칼 시스템

5.8 실외 지형 랜더링을 위한 대형 텍처스 맵핑

5.9 그래프탈 임포스터를 이용한 회화 기반 랜더링

5.10 동적 실시간 립싱크


SECTION 6 네트워크 및 다중 플레이어

6.1 게임 세계 동기화의 고수준 추상

6.2 온라인 게임의 인증

6.3 똑똑한 패킷 스니퍼를 활용한 게임 네트워크 디버깅


SECTION 7 스크립팅 및 자료주도적 시스템

7.1 자동 루아 바인딩 시스템

7.2 내부조사를 이용한 C++ 객체의 직렬화와 데이터베이스 저장

7.3 자료 운반체

7.4 그래픽 팀원들을 고려한 자료주도적 셰이더 시스템

7.5 Python의 AST 다루기 




GEMS 6

들어가며

서문

표지 그림에 대하여

저자 소개


SECTION 1 프로그래밍 일반


1.1 무잠금 알고리즘들

1.2 OpenMP를 이용한 다중 코어 프로세서 활용

1.3 OpenCV 라이브러리를 이용한 게임에서의 게임 컴퓨터 시각 활용

1.4 게임 객체의 지리 격자 등록

1.5 BSP 기법들

1.6 최근접 문자열 부합 알고리즘

1.7 CppUnit을 이용한 단위 검사 구현

1.8 저작권 침해의 억제 및 검출을 위한 출시전 빌드 지문 적용

1.9 접근 기반 파일 재배치를 이용한 빠른 파일 적재

1.10 빠른 반복을 위한 실행시점 자산 즉석 적재


SECTION 2 수학과 물리


2.1 부동소수점 비법들

2.2 동차 좌표를 이용한, 투영 공간 안에서의 GPU 계산

2.3 외적으로 1차 연립방정식 풀기

2.4 게임 개발을 위한 순차 색인 기법

2.5 다면체의 정확한 부력

2.6 강체와 상호작용하는 실시간 입자 기반 유체 시뮬레이션


SECTION 3 인공지능


3.1 모형 기반 의사결정 방법을 게임에 적용: Locust AI 엔진을 Quake III에 적용하기

3.2 자율 NPC들의 협동 구현

3.3 게임을 위한 행동 기반 로봇 아키텍처

3.4 퍼지 감지기, 유한상태 행동, 행동망으로 목표 지향적 Unreal Tournament 봇 만들기

3.5 목표 지향적 Unreal 봇: 확장 행동망으로 목표 지향적 행동과 간단한 개성을 가진

게임 에이전트 만들기

3.6 지지 벡터 기계를 사용하는 단기 기억 모형

3.7 교전 분석에 정량 판정 모형 적용하기

3.8 플러그인 모듈식 다층 AI 엔진 설계

3.9 장면 복잡도 관리에 퍼지 제어 사용하기


SECTION 4 스크립팅 및 자료주도적 시스템


4.1 스크립팅 언어 개괄

4.2 C/C++ 객체와 루아의 바인딩

4.3 루아 코루틴을 이용한 고급 제어 메커니즘 구현

4.4 다중 스레드 환경에서 고수준 스크립트 실행 관리하기

4.5 비개입 대리자를 이용한 활동 객체 속성 노출

4.6 게임 객체 구성요소 시스템


SECTION 5 그래픽


5.1 상호작용 캐릭터를 위한 사실적인 유휴 동작 합성

5.2 적응형 이진 트리를 이용한 공간 트리

5.3 준 유향 경계상자를 이용한 개선된 객체 선별

5.4 최적의 렌더링을 위한 스킨 분할

5.5 GPU 지형 렌더링

5.6 상호작용적인 유체의 동역학 및 GPU 렌더링

5.7 빠른 픽셀 당 다중 광원 조명

5.8 도로 표지를 뚜렷하게 렌더링하기

5.9 게임을 위한 실용적인 하늘 렌더링

5.10 OpenGL 프레임 버퍼 객체를 이용한 HDR 렌더링


SECTION 6 오디오


6.1 변형 가능 메시에서 실시간으로 소리 내기

6.2 실시간 효과음을 위한 가벼운 음 합성기

6.3 실시간 버스 믹싱

6.4 잠재 가청 집합

6.5 저렴한 도플러 효과

6.6 실시간 DSP 효과 흉내내기


SECTION 7 네트워크 및 다중 플레이어


7.1 3D 캐릭터 애니메이션 자료 스트림의 동적 적응

7.2 대규모 다중플레이어 게임을 위한 복잡계 기반 고수준 아키텍처

7.3 게임 객체를 위한 전역 고유 식별자 생성

7.4 MMOG의 프로토타이핑: 세컨드라이프를 이용한 게임 개념 프로토타입 작성

7.5 NAT 구멍 뚫기와 신뢰성 있는 동급간 게이밍 TCP 연결


부록CD에 대하여



GEMS 5

Section 1 프로그래밍 일반


1.1 편집기를 위한 문맥 감지 HUD

1.2 게임 안에서 텍스트 자료 파싱하기

1.3 구성요소 기반 객체 관리 

1.4 템플릿을 이용한 C++ 반영 기능 구현

1.5 빠른 BSP를 위한 구 트리 

1.6 개선된 절두체 선별 

1.7 일반적 페이저 

1.8 대규모 스택 기반 상태기계

1.9 BSP 트리를 이용한 CSG 구축 

1.10 루아를 게임에 통합 

1.11 방침 기반 설계로 자유목록 개선하기

1.12 실시간 원격 디버그 메시지 기록기

1.13 투명한 클래스 저장 및 로딩 요령

1.14 효과적인 캐시 무관 ABT 트리 구현

1.15 상태기계의 시각적인 설계 

1.16 일반적 구성요소 라이브러리

1.17 선택의 문제 - 메뉴 시스템 하나



Section 2 수학


2.1 컴퓨터 그래픽에 기하대수 사용하기

2.2 최소 가속 에르미트 곡선 

2.3 스플라인 기반 애니메이션 제어 

2.4 근사를 이용한 더 빠른 사원수 보간 

2.5 최소최대 수치 근사 

2.6 거울과 포탈을 위한 비표준 시야 절두체 



Section 3 인공지능


3.1 네비게이션 메시를 이용한 자동적인 엄폐 찾기

3.2 인위적 퍼텐셜장을 이용한 빠른 대상 등급 평가 

3.3 랜체스터 소모 모형을 이용한 전투 결과 예측 

3.4 게임 AI를 위한 실용적인 계획수립 구현 

3.5 다중 스레드 아키텍처를 위한 의사결정 트리 질의 알고리즘의 최적화

3.6 PVM을 통한 병렬 AI 개발 

3.7 A*를 넘어서 

3.8 최소의 재계획 비용을 가진 개선된 길찾기: 동적 A*(D*) 



Section 4 물리


4.1 게임 물리를 위한 어림셈 공기역학 

4.2 동적인 풀 시뮬레이션 및 기타 자연 효과 

4.3 질량-용수철 모형을 이용한 사실적인 옷감 애니메이션 

4.4 게임 개발을 위한 실용적인 연체 애니메이션: 가압 연체 모형 

4.5 피드백 제어 시스템을 이용한 생동감 있는 헝겊인형 시뮬레이션

4.6 사전처방식 물리 시스템의 설계 

4.7 사전처방식 물리: 기법과 응용 

4.8 3차원 차량 시뮬레이션의 사실적인 카메라 움직임 



Section 5 그래픽


5.1 최근 GPU 상에서의 사실적인 구름 렌더링 

5.2 눈과 비 내리기 

5.3 위짓: 빠르고 영속적인 군엽 렌더링 

5.4 사실적인 나무와 숲을 위한 2.5차원 임포스터 

5.5 격자 없는 제어 가능한 불 

5.6 빌보드 입자를 이용한 강력한 폭발 효과 

5.7 간단한 보석 렌더링 방법 

5.8 입체적 후처리 

5.9 절차적 레벨 생성 

5.10 조합식 셰이더 



Section 6 네트웍 및 멀티플레이어


6.1 대규모 다중 플레이어 온라인 게임의 대규모, 온라인, 영속성 유지

6.2 이음매 없는 세계 서버 구현 

6.3 비속어 걸러내기 시스템의 설계

6.4 빠르고 효율적인 원격 프로시저 호출 구현

6.5 동위간 통신에서 네트웍 주소 변환을 이겨내려면 

6.6 신뢰성 있는 메시징 프로토콜 

6.7 안전한 난수 시스템 

6.8 설계에 의한 보안 



Section 7 오디오


7.1 다중 스레딩 음향 프로그래밍 기법들 

7.2 그룹별 사운드 관리 

7.3 3차원 표면을 발음체로 사용하기 

7.4 되먹임 지연망에 근거한 빠른 환경 반향 

7.5 단일 화자 음성 인식 입문




GEMS 4

ection 1 프로그래밍 일반


소개


1.1 게임 디버깅의 과학

1.2 HTML 기반의 로깅 및 디버깅 시스템

1.3 클럭: 게임의 심장 박동

1.4 커다란 크로스플랫폼 라이브러리의 설계와 유지

1.5 자유목록 템플릿을 이용한 메모리 단편화 해결

1.6 C++ 일반 트리 컨테이너

1.7 약한 참조와 널 객체의 미덕

1.8 게임 개체 관리를 위한 시스템

1.9 Windows와 Xbox를 위한 주소 공간 관리식 동적 배열

1.10 임계 감쇠식 가속/감속 평활화

1.11 유연한 즉석 객체 관리자

1.12 커스텀 RTTI 속성을 이용한 객체 스트리밍과 편집

1.13 속도를 희생하지 않고 XML 사용하기



Section 2 수학

2.1 메르센느 트위스터를 이용한 조브리스트 해시

2.2 절두체와 카메라 정보 추출

2.3 커다란 세계 좌표의 정밀도 문제 해결

2.4 비균일 스플라인

2.5 공분산 행렬을 이용해서 좀 더 잘 들어맞는 경계입체 만들기

2.6 역기구학을 위한 야코비 전치법


Section 3 물리

3.1 죽음의 열 손가락: 전투 무력화 알고리즘들

3.2 CPU가 제한된 시스템을 위한 차량 물리 시뮬레이션

3.3 벌레뜨 기반 물리 엔진 작성

3.4 강체 동역학의 구속조건들

3.5 동역학 시뮬레이션을 위한 빠른 접촉 줄이기

3.6 상호작용적인 수면

3.7 다층 물리를 이용한 빠른 변형

3.8 빠르고 안정적인 변형을 위한 양상 해석


Section 4 인공지능

4.1 3인칭 카메라 네비게이션

4.2 이야기식 전투: AI를 이용해서 액션 게임의 긴장감 높이기

4.3 NPC 의사결정: 무작위성 다루기

4.4 객체지향적인 효용 기반 의사결정 아키텍처

4.5 분산 추론 투표 아키텍처

4.6 끌개와 밀개

4.7 RTS 게임을 위한 개선된 벽 건설

4.8 프로그래밍 가능한 그래픽 하드웨어를 이용한 인공 신경망 시뮬레이션




Section 5 그래픽

5.1 포스터 품질 스크린샷

5.2 닫히지 않은 메시를 위한 GPU 그림자 입체 구축

5.3 원근 그림자 맵

5.4 결합된 깊이 및 ID 기반 그림자 버퍼

5.5 정적 그림자를 기하구조에 새겨 넣기

5.6 그림자 입체와 최적화된 메시를 위한 실시간 조명 조정

5.7 실시간 망점처리: 빠르고 간단한 양식화된 셰이딩

5.8 3차원 모형에 팀 색상을 적용하는 기법들

5.9 빠른 세피아 색조 변환

5.10 표본화된 장면 휘도를 이용한 동적 감마 보정

5.11 열과 아지랑이 후처리 효과

5.12 사원수를 이용한 하드웨어 스키닝

5.13 모션 캡처 자료 압축

5.14 3차원 뼈대 기반 관절 캐릭터를 위한 빠른 충돌 검출

5.15 지평선을 이용한 지형 차폐 선별



Section 6 네트웍 및 멀티플레이어

6.1 일반적인 로비 설계와 개발

6.2 서버 당 수천의 클라이언트들

6.3 효율적인 MMP 게임 상태 저장

6.4 클라이언트-서버 환경에서 병렬 상태기계의 실용적인 적용 방법

6.5 비트 패킹: 한 가지 네트웍 압축 기법

6.6 다중서버 기반 MMORPG를 위한 시간 및 일관성 관리


Section 7 오디오

7.1 OpenAL에 대한 간략한 소개

7.2 간단한 실시간 립싱크 시스템

7.3 동적 변수와 오디오 프로그래밍

7.4 오디오 스크립팅 시스템 만들기

7.5 EAX와 ZoomFX를 이용한 환경 음향 솔루션 구현

7.6 게임 물리에 기반한 실시간 음 합성 제어



GEMS 3

제1부 프로그래밍

1.1 게임 이벤트의 일정 관리

1.2 객체 조합식 게임 프레임웍

1.3 C 스타일 매크로의 새로운 가치를 찾아서

1.4 플랫폼 독립적인 함수 바인딩 코드 생성기

1.5 핸들 기반의 똑똑한 포인터

1.6 커스텀 STL 할당자

1.7 자동화된 게임 저장 구현

1.8 자동목록 설계 패턴

1.9 부동소수점 예외 처리

1.10 UML을 이용한, 게임 디자인을 따르는 엔진 프로그래밍

1.11 Lex와 Yacc로 커스텀 데이터 파일 파서 만들기

1.12 해외 시장을 위한 게임 개발

1.13 3D 게임에서의 실시간 입력 및 UI

1.14 자연 선택: 파이 메뉴의 진화

1.15 경량의 방침 기반 로깅

1.16 저널링 서비스

1.17 실시간 계통적 프로파일링


제2부 수학

2.1 로그와 난수 발생을 위한 빠른 기수 2 함수들

2.2 정확한 기하학을 위한 벡터 분수의 활용

2.3 좀더 정확한 삼각함수 근사

2.4 사원수의 압축

2.5 구속조건이 있는 역기구학

2.6 물리 모델링을 위한 세포 자동자

2.7 동역학 시뮬레이션에서 마찰 다루기


제3부 인공지능

3.1 GoCap을 이용한 최적화된 기계 학습

3.2 영역 네비게이션: 길찾기 패러다임의 확장

3.3 함수 포인터 기반의 내장형 유한상태기계

3.4 RTS에서의 지형 분석-숨겨진 거인

3.5 AI 에이전트, 객체, 퀘스트를 위한 확장성있는 트리거 시스템

3.6 A*를 이용한 전술적 길찾기

3.7 네비게이션 메시에 대한 한 가지 빠른 접근 방식

3.8 길찾기와 충돌 사이의 관계 선택


제4부 그래픽

4.1 T 접합부의 제거 및 재삼각화

4.2 빠른 높이필드 법선 계산

4.3 빠른 패치 법선

4.4 빠르고 간단한 차폐 제외 기법

4.5 삼각형 띠의 생성, 최적화, 렌더링

4.6 복잡한 데이터 집합에 대한 최적화된 그림자 입체의 계산

4.7 캐릭터 애니메이션을 위한 표면 분할

4.8 개선된 뼈대 변형

4.9 사실적인 캐릭터 움직임을 위한 하나의 틀

4.10 프로그래밍 가능한 정점 셰이더 컴파일러

4.11 빌보드를 이용한 광선 효과

4.12 아이소메트릭 엔진을 위한 3D 기법들

4.13 법선 맵을 이용한 곡면 흉내내기

4.14 동적이고 실사적인 지형 조명 방법

4.15 입방체 맵 조명 기법들

4.16 절차적 텍스처링

4.17 고유한 텍스처

4.18 픽셀 당 조명 계산을 위한 참조 테이블로서의 텍스처

4.19 수작업으로 만든 셰이딩 모형으로 렌더링하기


제5부 네트웍 및 멀티플레이어

5.1 실시간 전략 게임에서의 지연 최소화

5.2 실시간 전략 네트웍 프로토콜

5.3 대규모 멀티플레이어 게임을 위한 유연한 시뮬레이션 아키텍처

5.4 규모가변적인 멀티플레이어 서버

5.5 템플릿 기반 객체 직렬화

5.6 보안 소켓

5.7 네트웍 모니터링 및 시뮬레이션 도구

5.8 DirectPlay 8.1로 멀티플레이어 게임 만들기

5.9 Java Micro Edition을 이용한 무선 게임 개발


제6부 오디오

6.1 Ogg Vorbis를 이용한 오디오 압축

6.2 매력적인 3D 오디오 환경 만들기

6.3 축에 정렬된 경계상자를 이용한 음향 차단

6.4 겹이차 공명 필터의 활용

6.5 음성 압축 및 효과를 위한 선형 예측 코딩

6.6 복잡한 음의 확률론적 합성

6.7 게임을 위한 실시간 모듈식 오디오 처리



GEMS 2

1부 프로그래밍 일반

C++ 게임의 최적화

인라인 함수 대 매크로

추상 인터페이스를 이용한 프로그래밍

DLL로부터 C++ 클래스 내보내기

DLL 지옥과 존재하기 않는 OS 함수들에 대한 방어 전략

동적인 형 정보

범용 C++ 멤버 접근을 위한 속성 클래스

게임 개체 팩토리

C++를 위한 폐기 메커니즘의 구현

드롭-인 디버그 메모리 관리자

게임에 내장되는 프로파일링 모듈

윈도우즈 기반 게임을 위한 선형적 프로그래밍 모델

스택 와인딩

스스로 수정하는 코드

자원 파일을 이용한 파일 관리

게임 입력의 기록 및 재생

유연한 텍스트 파싱 시스템

범용 트위커

순정난수 생성

블룸 필터를 이용한 계산 성능의 향상

3ds Max 스킨 익스포터 및 애니메이션 툴킷

비디오 게임에서의 웹 카메라 활용


2부 수학

부동소수점 비법들 : IEEE 부동소수점을 통한 성능 향상

벡터와 평면 충돌 기법들

3D 선분에 대한 빠르고 충실한 교차 판정

역탄도 계산

평행 수송 프레임

매끄러운 C2 사원수 기반의 공간 이동 경로

재귀적 차원 클러스터링 : 충돌 검출을 위한 빠른 알고리즘

프랙탈의 프로그래밍


3부 인공지능

AI 최적화 전략들

게임 객체 AI를 위한 마이크로 스레드

마이크로 스레드를 통한 AI 관리

RTS 게임의 명령 큐잉을 위한 기반 구조

고성능 타일 기반 시선 및 검색 시스템

영향력분포도 기법

전략적 판단 기법

3D 액션 게임을 위한 지형 분석

가시점 길찾기를 위한 확장된 기하 구조

가시점 길찾기의 최적화

먹고 먹히는 플로킹 : 포식자와 먹이

C++로 구현한 범용 퍼지 상태 기계

퍼지 시스템에서 조합의 폭합적 증가를 방지하려면

게임에서의 신경망 활용 : 구체적인 예


4부 기하 관리

VIPM 방법들의 비교

맞물린 타일들을 이용한 단순화된 지형 시스템

빠른 가시성 제외, 레이 트레이싱, 범위 검색을 위한 구 트리

압축된 축 정렬 경계상자 트리

직접 접근 쿼드트리 참조

어항 굴절의 근사

인쇄 해상도의 스크린샷 만들기

임의의 표면에 데칼 적용하기

하늘 상자를 이용한 원경 렌더링

캐릭터 자신에 대한 그림자 만들기

명작 Super Mario 64의 3인칭 조종 및 애니메이션


5부 그래픽 디스플레이

카툰 랜더링 : 실시간 외곽선 변 검출 및 랜더링

텍스쳐 매핑과 프로그래밍 가능한 정점 셰이더를 이용한 카툰 렌더링

동적인 픽셀 당 조명 기법

3D 하드웨어를 이용한 절차적 구름 생성

빠른 렌즈 플레어를 위한 텍스쳐 마스킹

실용적인 우선순위 버퍼 그림자

임포스터 : 장면에 소품 추가하기

하드웨어 가속 절차적 텍스쳐 애니메이션을 위한 연산들


6부 오디오 프로그래밍

게임 오디오 설계 패턴

샘플 기반 신디사이저에서의 즉각적인 음성 재사용을 위한 기법

소프트웨어 기반 DSP 효과들

상호작용적인 디지털 오디오 처리 파이프라인

게임을 위한 기본적인 음악 시퀀서

게임을 위한 상호작용적 음악 시퀀서

저수준 사운드 API 



GEMS1


1. 프로그래밍 기법들

데이터 주도적 설계의 마법

객체 지향적 프로그래밍과 설계 기법

템플릿 메타프로그래밍을 이용한 빠른 수학 연산

자동적인 단일체 유틸리티

게임 프로그래밍에서의 STL 활용

일반화된 함수-바인딩 인터페이스

범용 핸들 기반 자원 관리자

자원과 메모리 관리

빠른 데이터 로드 기법

프레임 기반 메모리 할당

간단하고 빠른 비트 배열

온라인 게임을 위한 프로토콜

assert의 비법들

Stats: 실시간 통계와 게임 내 디버깅

실시간 게임 내 프로파일링


2. 수학

예측 가능한 난수

보간법

강체 운동 방정식들의 해법

삼각 함수들에 대한 다항식 근사

수치적 안정성을 위한 암묵적 오일러 해법

파형요소: 이론과 압축

상호 작용적인 수면 시뮬레이션

게임 프로그래밍을 위한 사원수(쿼터니언)

행렬-사원수 변환

사원수들의 보간

최단호 사원수


3. 인공지능

범용적이고 견고한 AI 엔진의 설계

유한 상태 기계 클래스

게임 트리

A* 길라잡이 알고리즘의 기초

A*의 미학적 최적화

A*의 속도 최적화

네비게이션 메시를 이용한 단순화된 3D 이동과 길찾기

플로킹: 집단 행동을 흉내내는 간단한 기법

비디오 게임을 위한 퍼지 논리

신경망 입문


4. 다각형 기법

OpenGL을 위한 정점 지정 최적화

정점의 투영 깊이값 조절

벡터 카메라

카메라 제어 기법

빠른 원동- 절두체 교차 판정

3D 충돌 검출

다해상도 맵을 이용한 충돌 판정

구역 안에서의 거리 계산

가려진 객체의 제외 기법

자연스러운 세부 수준 변화

옥트리의 구축

느슨한 옥트리

뷰 독립적인 점진적 메싱

보간을 이용한 3D 키프레임 애니메이션

빠르고 간단한 스키닝 기법

틈 매우기-스티칭과 스키닝을 이용한 고급 애니메이션

실시간 사실적 지형 생성

프랙탈 지형 생성-단층 변형

프랙탈 지형 생성 - 중점 높이 이동

프랙탈 지형 생성 - 입자 퇴적


5. 픽셀 효과

2D 렌즈 플레이

3D 하드웨어를 이용한 2D 스프라이트 효과

동기 기반 정적 조명

정점 색상 보간을 이용한 모의 실시간 조명

감쇠 맵

텍스처 좌표 생성을 이용한 고급 텍스처 기법

하드웨어 범프 매핑

기준 평면 그림자 효과

복잡한 객체에 대한 실시간적인 그림자 생성

광택성 사전 필터링과 프레넬 향을 이용한 개선된 환경 매핑 반사 효과

게임을 위한 그럴 듯한 유리 효과

용기에 담긴 액체를 위한 굴절 매핑


6. 부록

행렬 유틸리티 라이브러리

텍스트 유틸리티 라이브러리

부록 CD-ROM에 대해




C# WPF, 지난번 포스트 소스에 연결됩니다.

상황에 따라, 표시되는 템플릿이 자동으로 지정되게끔 만들 수 있네요.


SubjectSelectDataTemplate.cs

using System.Windows;

using System.Windows.Controls;

 

namespace WPF_MVVM_SAMPLE01

{

    public class SubjectSelectDataTemplate : DataTemplateSelector

    {

        public override DataTemplate SelectTemplate(object item, DependencyObject container)

        {

            Score score = item as Score;

            FrameworkElement el = container as FrameworkElement;

            return (DataTemplate)el.FindResource(score.SCORE > 60 ? "DataTemplate3" : "DataTemplate4");

        }

    }

}



TemplateSelectWindow.xaml

 

<Window x:Class="WpfApp1.TemplateSelectWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"       

        xmlns:local="clr-namespace:WPF_MVVM_SAMPLE01"

        mc:Ignorable="d"

        Title="TemplateSelectWindow" Height="450" Width="800">

    <Window.DataContext>

        <local:ItemViewModel></local:ItemViewModel>

    </Window.DataContext>

    <Window.Resources>

        <local:SubjectSelectDataTemplate x:Key="SubjectSelectDataTemplate"></local:SubjectSelectDataTemplate>

    </Window.Resources>

    <DockPanel>

        <ListBox ItemsSource="{Binding Items}" ItemTemplateSelector="{StaticResource SubjectSelectDataTemplate}" ></ListBox>

    </DockPanel>

</Window>



Dictionary1.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

                    xmlns:local="clr-namespace:WPF_MVVM_SAMPLE01">

    <DataTemplate x:Key="DataTemplate1">

        <TextBlock Text="{Binding SUBJECT}"></TextBlock>

    </DataTemplate>

    <DataTemplate x:Key="DataTemplate2">

        <Grid >

            <Rectangle HorizontalAlignment="Left" Height="30" Width="{Binding SCORE}" StrokeThickness="1" Fill="Red"></Rectangle>

            <TextBlock Text="{Binding SCORE}"></TextBlock>

        </Grid>

    </DataTemplate>

    <DataTemplate x:Key="DataTemplate3">

        <Grid>

            <Grid.ColumnDefinitions>

                <ColumnDefinition Width="150"></ColumnDefinition>

                <ColumnDefinition Width="150"></ColumnDefinition>

            </Grid.ColumnDefinitions>

            <TextBlock Grid.Column="0" Text="{Binding SUBJECT}"></TextBlock>

            <Rectangle Grid.Column="1" HorizontalAlignment="Left" Height="30" Width="{Binding SCORE}" StrokeThickness="1" Fill="Red"></Rectangle>

            <TextBlock Grid.Column="1" Text="{Binding SCORE}"></TextBlock>   

        </Grid>

    </DataTemplate>

    <DataTemplate x:Key="DataTemplate4">

        <Grid>

            <Grid.ColumnDefinitions>

                <ColumnDefinition Width="150"></ColumnDefinition>

                <ColumnDefinition Width="150"></ColumnDefinition>

            </Grid.ColumnDefinitions>

            <TextBlock Grid.Column="1" Text="{Binding SUBJECT}"></TextBlock>

            <Rectangle Grid.Column="0" HorizontalAlignment="Left" Height="30" Width="{Binding SCORE}" StrokeThickness="1" Fill="Red"></Rectangle>

            <TextBlock Grid.Column="0" Text="{Binding SCORE}"></TextBlock>

        </Grid>

    </DataTemplate>

 

</ResourceDictionary>



소스는 여기 올려뒀습니다. https://github.com/erith/WPF_SAMPLES/tree/master/WpfApp1

WPF에서 MVVM으로 데이터의 출력형태 템플릿을 미리 확인할 수 있습니다,



직장 동료분에게 잠깐 블렌드 사용법을 배웠는데, 기능이 막강합니다. WPF 프로그램 디자인시에는 필수 프로그램이네요. DataContext 설정시, 디자인 타임에, 설정된 템플릿의 형태를 미리 확인할 수 있어 참 편리합니다.



BLEND 실행화면


주요 소스입니다.


MainWindow.xaml

<Window x:Class="WPF_MVVM_SAMPLE01.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:WPF_MVVM_SAMPLE01"

        mc:Ignorable="d"       

        Title="MainWindow" Height="250" Width="350"       

        >

    <Window.DataContext>

        <local:ItemViewModel></local:ItemViewModel>

    </Window.DataContext>

   

    <DockPanel>

        <ListView Width="350" ItemsSource="{Binding Items}" ItemTemplate="{DynamicResource DataTemplate1}" DockPanel.Dock="Top">

            <ListView.View>

                <GridView>

                    <GridViewColumn Header="SUBJECT" Width="150" CellTemplate="{StaticResource DataTemplate1}" ></GridViewColumn>

                    <GridViewColumn Header="SCORE" Width="180"  CellTemplate="{StaticResource DataTemplate2}"></GridViewColumn>

                </GridView>

            </ListView.View>

        </ListView>

    </DockPanel>

</Window>


Dicionary1.xaml


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

                    xmlns:local="clr-namespace:WPF_MVVM_SAMPLE01">

    <DataTemplate x:Key="DataTemplate1">

        <TextBlock Text="{Binding SUBJECT}"></TextBlock>

    </DataTemplate>

    <DataTemplate x:Key="DataTemplate2">

        <Grid >

            <Rectangle Height="30" Width="{Binding SCORE}" StrokeThickness="1" Fill="Red"></Rectangle>

            <TextBlock Text="{Binding SCORE}"></TextBlock>

        </Grid>

    </DataTemplate>

 

</ResourceDictionary>



ItemViewModel.cs


public class ItemViewModel

    {

        private readonly ScoreCollection items;

 

        public ItemViewModel()

        {

            this.items = new ScoreCollection();

        }

 

        public ScoreCollection Items

        {

            get { return this.items; }

        }

    }


ScoreCollection.cs

using System.Collections.ObjectModel;

 

namespace WPF_MVVM_SAMPLE01

{

    public class ScoreCollection : ObservableCollection<Score>

    {

        public ScoreCollection()

        {

            Add(new Score() { SUBJECT = "Englsh", SCORE = 95 });

            Add(new Score() { SUBJECT = "Mathmatics", SCORE = 55 });

            Add(new Score() { SUBJECT = "History", SCORE = 65 });

        }

    }

 

    public class Score

    {

        public string SUBJECT { get; set; }

        public int SCORE { get; set; }

    }

}



소스: https://github.com/erith/WPF_SAMPLES/tree/master/WpfApp1



처음 대하는 환경이라 스칼라 설치에, 스파크, maven설치에 winutils까지 이것 저것 삽질을 많이 했었는데, 


쉘에서 실행해본다던가 다양한 방법이 있지만..

단지 스파크의 API를  스칼라 언어로 테스트해볼 것이라면 아래 설치만으로도 충분합니다.

뭐한건지...;;;




물론, 실제 운영 하려면 하둡설치에 다른 여러가지들이 필요 하겠지요.


간단하게 라인 수를 재는 프로그램을 돌려보기 위한 환경입니다.

스파크의 경우 파이썬, 자바, 스칼라 언어로 작동이 가능합니다.(공식문서에도 세가지 언어로 딱 가이드하더군요.) 

스칼라 기준으로합니다.. (윈도우7/10 환경입니다.)


1. 자바를 설치합니다. 자바 설치후 환경변수로 JAVA_HOME 을 자바 설치 경로로 셋팅해줍니다. 설치되어있다면 패스~


설치 : http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html



171버전을 설치했네요.


* 참고로 관리자 권한으로 CMD 입력창을 실행하고

"C:\Windows\system32\rundll32.exe" sysdm.cpl,EditEnvironmentVariables 를 입력하면 바로 환경변수 수정이 가능합니다.








2. IntelliJ를 설치합니다. 어차피 메모장에서 개발할 것은 아니기 때문에, 바로 IDE를 설치합니다. 설치시 scala 플러그인을 선택하면 필요한 것을 같이 받을 수 있습니다.

IntelliJ 설치 경로 : https://www.jetbrains.com/idea/download/#section=windows

위 링크에서 커뮤니티 버전을 선택하시면 무료로 테스트 사용이 가능합니다. (상용개발시에는 구매를 해야겠지요.)







64비트 런처 숏컷은 하나 만들었습니다 .x86은 JRE는 필요없어서 체크안했구요.




설치시 아래 화면은 기본으로 넘어가셔도 됩니다. 보시고 필요한 것 있으면 더 다운로드 받으시면 됩니다.







아래 화면에서는 플러그인에  Scala를 꼭 Install해주세요.~






런처화면이 나오고












Create New Porject 를 해서






Scala에 SBT를 선택합니다. SBT Simple Build Tool 이라해서, 스칼라 빌드 환경입니다.





기존에 JDK를 설치했기 때문에 설치한 경로로  JDK환경을 설정합니다.





위 화면이 중요한데요. 스파크 2.3.0 버전은 Scala 2.11.12 버전으로 해야 됩니다. 2.12.x로 하니 잘 안되더군요.

이것 때문에 또 삽질.

http://spark.apache.org/docs/latest/quick-start.html <- 여기는 2.11.8로 설명이..








프로젝트 뷰 창이 나오지 않으면 ALT+1 을 누르시거나 View 메뉴에 Tool Windows -> Project를 차례로 선택합니다.


그리고 build.sbt 파일을 위와 같이 수정합니다.


name := "lineCount" version := "0.1" scalaVersion := "2.11.12" libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.0"










스칼라 파일을 소스에 하나 추가합니다. (sbt파일이 한번 Sync가 되어야 Scala class파일을 추가할 수 있는걸로 보여집니다?)


Object를 추가할것으므로 Kind에서 Object를 선택하세요. 이름은 LineCount로 합니다.




소스파일 내용은 아래와 같습니다.



import org.apache.spark.{SparkConf, SparkContext}

object LineCount {

  def main(args: Array[String]): Unit = {

    val logFile = "c:\\download\\test.txt"  //경로는 바꿀 수 있습니다.


    val conf = new SparkConf().setAppName("Simple Application").setMaster("local")


    val sc = new SparkContext(conf)


    val logData = sc.textFile(logFile, 2).cache()


    val lineCount = logData.count()


    println("라인수==>"+lineCount)


    sc.stop()


  }

}


텍스파일은 하나 아무거나 준비합니다. 만들기 번거로우시면 아래링크를 받으세요.
Run 할때 실행 환경이 없다면 아래와 같이 하나 추가해주세요.
MainClass는 LineCount, Use classpath of module은 프로젝트내에 linecount 입니다.






위와 같이 라인 수가 잘 나오는 것을 확인 할 수 있습니다




추가 링크:

스팍 개발 환경 설정(영어) : http://www.itversity.com/2018/04/19/setup-development-environment-big-data-hadoop-and-spark/

스팍 공식 문서(영어) http://spark.apache.org/docs/latest/index.html

스칼라 언어 배우기(한글) : https://twitter.github.io/scala_school/ko/index.html



+ Recent posts