SlideShare ist ein Scribd-Unternehmen logo
1 von 21
GPG Gems 1

             1.3, 1.5, 1.11
1.3 자동적인 단일체 유틸리티
싱글턴을 돕는 싱글볼
Good idea!
슬라이드 쇼가 끝났습니다. 끝내려면 마우스를 클릭하십시오.
Singleton (mathematics)
              In mathematics, a singleton, also known as a unit set,[1] is a
              set with exactly one element. For example, the set {0} is a
              singleton.
              The term is also used for a 1-tuple (a sequence with one
              element).



싱글턴 패턴(Singleton pattern)
주어진 임의의 시점에서 시스템 내에 단 하나의 인스턴스만 존재하는 객체를 가리킨다.
예, XxxManager 클래스
Global object vs Singleton object
-   전역객체의 진화
-   객체의 생성/소멸 시점 제어



Singleton 고려사항
-   Singleton 객체의 생성, 소멸시점
-   Thread safe 고려


Singleton 다양한 구현
-   Scott Meyers style
     -    함수에 static 지역 변수를 넣고 싱글턴을 구현한 방식
-   Phoenix, Loki, Mordern C++ design
-   etc
구현
Template <typename T> class Singleton
{
    static T*    ms_Singleton;
public:
    Singleton()
    {
        int   offset = (int)(T*)1 – (int)(Singleton<T>*)(T*)1;
        ms_Singleton = (T*)((int)this + offset);
    }
    ~Singleton() { ms_Singleton = 0; }
    static T&    GetSingleton()    { return (*ms_Singleton); }
    static T*    GetSingletonPtr() { return ms_Singleton; }
};

Template <typename T> T* Singleton<T>::ms_Singleton = 0;
사용
Class EntityMgr : public Singleton<EntityMgr>
{
    Entity*    GetEntity(eEntityType type);
    //….
};

#define g_EntityMgr   EntityMgr::GetSingleton()



void doSomething()
{
    Entity* pMob = g_EntityMgr.GetEntity(E_ENTITY_MONSTER);
    //…
}
소감
- 그 동안 싱글턴을 사용할 때 한 측면만 봤는데 다양한 방식과 고려해
  야 할 것이 많았다는 것을 느낌
1.5 일반화된 함수-바인딩 인터페이스
비행기 조정실 내부를 보자
얼마나 복잡하고 이상한 버튼들로 가득하다.
Interface Design (잠깐 생각해보기)

비행기 조종석의 인터페이스는 어느 쪽인가?

단순함 vs 복잡함 vs 혼란스러움
-   의미 구별
-   단순함은 복잡함의 반대가 아니다
    복잡함은 세상의 모습이고, 단순함은 마음의 상태다.



User는 Simple과 Complex 둘 중 무엇을 원하는가?

Clear 명확한 이해



                          우리에겐 보이는 심플함보다 제품을 이해
                          하고 쉽게 사용할 수 있는 적절한 복잡함이
                          필요하다.

                          - 도널드 노먼
Purpose
-   실행 시점에서 함수를 외부로 노출시키고, (실행속도, 편의성을 유지하며)
    동적으로 바인딩하는 한 가지 방법에 대해 설명



Scripting Engine의 요구사항
- 스크립트에서 코드의 함수(인자포함)를 호출할 수 있도록 한다

RPC의 요구사항
- 원격으로 함수를 호출할 수 있도록 한다
- ID와 function pointer의 맵핑

Function call의 요구사항
- Function name
- Memory 상의 function 위치
- Function arguments
시도#1
-    게임의 함수를 스크립트에서 호출할 수 있도록 하는 RPC로 네트웍을 통해 전달하
     는 범용적 방법을 시도한다

void Foo();
void Bar();                       Function g_Functions[] =
                                  {
enum eFunction                        { ”Foo”, Foo, FUNCTION_FOO },
{                                     { ”Bar”, Bar, FUNCTION_BAR },
    FUNCTION_FOO,                     //…
    FUNCTION_BAR,                 };
    //….
};

struct Function                   사용
{                                 -   ID로 전송 및 함수 호출
    typedef void (*Proc)();

     const char*    m_Name;       문제점
     Proc           m_Proc;       - 함수 인자 처리
     eFunction      m_Function;
};
시도#2
 -   시도#1의 부분적 해결책 : 함수 파라미터를 처리한다

struct Parameters                          void Foo(Parameters& params)
{                                          {
    std::vector<unsigned char> m_Data;       int   p1 = params.ExtractInt();
                                             float p2 = params.ExtractFloat();
     bool        ExtractBool();                // p1,p2를 사용
     int         ExtractInt();             }
     float       ExtractFloat();
     const char* ExtractString();
     void        AddBool(bool);
     void        AddInt(int);
     void        AddFloat(float);
                                            사용
     void        AddString(const char*);
                                            -   ID로 전송 및 함수 호출
};
struct Function
{
                                            문제점
    typedef void (*Proc)(Parameters&);
                                            - 함수 인자 타입 불일치 문제
                                            - 함수 호출 처리의 불편함
     std::string   m_Name;
     Proc          m_Proc;
     eFunction     m_Function;
};
절반의 해결
 -   일반화된 방식으로 함수를 호출하기 위한 함수 사양 테이블을 이용한다.

struct Function
{
    enum eVarType // 간단한 변수 사양
    { VAR_VOID, VAR_BOOL, VAR_INT, VAR_FLOAT, VAR_STRING, };

     enum eCallType // 가능한 함수 호출 규약들
     { CALL_CDECL, CALL_FASTCALL, CALL_STDCALL, CALL_THISCALL, };

     typedef std::vector<eVarType>   ParamVec;

     std::string    m_Name;
     void*          m_Proc;
     unsigned int   m_SerialID;
     eVarType       m_ReturnType;
     ParamVec       m_ParamTypes;
     eCallType      m_Calltype;
};
typedef std::vector<Function>   FunctionVec;
FunctionVec    g_Functions; // 노출할 함수들의 사양들을 담을 벡터
해결책의 완성
-   EXE의 익스포트 테이블로부터 함수정보를 얻는 방식을 적용하여 함수를 일반화된
    방식으로 호출하는 시스템을 갖추어 사용한다.




결론
-   함수를 일반화된 방식으로 호출하는 시스템을 갖추어 사용한다.


소감
- 초반에는 기대를 했지만 후반부로 갈 수록 그다지 와 닿지는 않음.
- 그러나 다른 곳에 이러한 방법을 적용해 볼 수 있었다.
   - Python object Extract 시에 사용해봄.
1.11 온라인 게임을 위한 프로토콜
Purpose
-   온라인 게임을 위한 응용 수준 통신 프로토콜의 구축에 대한 몇 가지 기법 소개.



네트워크 패킷의 구성
- 헤더, 바디(페이로드)

Packet 변조 공격
- 페이로드의 값 변경 : checksum 적용으로 해결 (MD5 해싱알고리즘)
    - 취약점
        - 클라이언트 프로그램에 체크섬 코드가 존재 : 리버스엔지니어링 위험
        - 패킷 리플레이

Packet Replay 공격
- 클라에서 보내는 패킷을 스니핑해서 짧은 시간에 여러 번 재전송이 가능
    - wpepro같은 툴로 가능
- 방어
    - 서버 측 : 일정 시간 내 정해진 개수만큼 수신 제한
    - Sequence number
    - Prime number
결론
-   초기 버전부터 암호화 기법을 적용하자.
-   치팅을 불가능하게 만드는 것을 목표로 삼는 것은 너무 소모적이며 불가능할 수 있
    다.
-   치팅에 드는 노력을 최대한 크게 하는 것을 목표로 삼는 것이 현실적이다.


소감
- 적용
Gpg gems1 1.3

Weitere ähnliche Inhalte

Was ist angesagt?

Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기지수 윤
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초진수 정
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기 Yong Joon Moon
 
[Swift] Functions
[Swift] Functions[Swift] Functions
[Swift] FunctionsBill Kim
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리ETRIBE_STG
 
C++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsC++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsSeok-joon Yun
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Young-Beom Rhee
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Insuk (Chris) Cho
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍Young-Beom Rhee
 
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)Yongha Yoo
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Park Jonggun
 
모두의 JIT 컴파일러
모두의 JIT 컴파일러모두의 JIT 컴파일러
모두의 JIT 컴파일러우경 성
 

Was ist angesagt? (20)

Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기Javascript개발자의 눈으로 python 들여다보기
Javascript개발자의 눈으로 python 들여다보기
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
 
Enum
EnumEnum
Enum
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기
 
[Swift] Functions
[Swift] Functions[Swift] Functions
[Swift] Functions
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
C++11
C++11C++11
C++11
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
C++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsC++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threads
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
 
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
 
모두의 JIT 컴파일러
모두의 JIT 컴파일러모두의 JIT 컴파일러
모두의 JIT 컴파일러
 

Andere mochten auch

[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)
[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)
[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)SeungMin Yang
 
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)SeungMin Yang
 
Gpg 1.13 ~ 1.14
Gpg 1.13 ~ 1.14Gpg 1.13 ~ 1.14
Gpg 1.13 ~ 1.14sj k
 
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티Sehyeon Nam
 
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 [GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 Sehyeon Nam
 
[11 0730] gpg 2.1.11 게임에 내장되는 프로파일링 모듈(공개)
[11 0730] gpg 2.1.11 게임에 내장되는 프로파일링 모듈(공개)[11 0730] gpg 2.1.11 게임에 내장되는 프로파일링 모듈(공개)
[11 0730] gpg 2.1.11 게임에 내장되는 프로파일링 모듈(공개)SeungMin Yang
 
[12 0210] gpg 2.3.7 전략적 판단 기법
[12 0210] gpg 2.3.7 전략적 판단 기법[12 0210] gpg 2.3.7 전략적 판단 기법
[12 0210] gpg 2.3.7 전략적 판단 기법SeungMin Yang
 
[0604 석재호]광택성사전필터링
[0604 석재호]광택성사전필터링[0604 석재호]광택성사전필터링
[0604 석재호]광택성사전필터링Jaeho Seok
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규ChangKyu Song
 
[NDC2014] 반응적 라이브 개발
[NDC2014] 반응적 라이브 개발[NDC2014] 반응적 라이브 개발
[NDC2014] 반응적 라이브 개발ChangKyu Song
 
GPG Study 4.3 카메라 제어기법
GPG Study 4.3 카메라 제어기법GPG Study 4.3 카메라 제어기법
GPG Study 4.3 카메라 제어기법연우 김
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기ChangKyu Song
 
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산Taeung Ra
 

Andere mochten auch (20)

Gpg study 01
Gpg study 01Gpg study 01
Gpg study 01
 
[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)
[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)
[11 0723] gpg 2.1.9 c++를 위한 폐기 매커니즘 구현(공개)
 
Gpg study3.7
Gpg study3.7Gpg study3.7
Gpg study3.7
 
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)
[11 0916] gpg 2.1.22 비디오 게임에서의 웹 카메라 활용(공개)
 
op
opop
op
 
Gpg 1.13 ~ 1.14
Gpg 1.13 ~ 1.14Gpg 1.13 ~ 1.14
Gpg 1.13 ~ 1.14
 
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
 
Gpg study1.8
Gpg study1.8Gpg study1.8
Gpg study1.8
 
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 [GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
 
[11 0730] gpg 2.1.11 게임에 내장되는 프로파일링 모듈(공개)
[11 0730] gpg 2.1.11 게임에 내장되는 프로파일링 모듈(공개)[11 0730] gpg 2.1.11 게임에 내장되는 프로파일링 모듈(공개)
[11 0730] gpg 2.1.11 게임에 내장되는 프로파일링 모듈(공개)
 
[12 0210] gpg 2.3.7 전략적 판단 기법
[12 0210] gpg 2.3.7 전략적 판단 기법[12 0210] gpg 2.3.7 전략적 판단 기법
[12 0210] gpg 2.3.7 전략적 판단 기법
 
[0604 석재호]광택성사전필터링
[0604 석재호]광택성사전필터링[0604 석재호]광택성사전필터링
[0604 석재호]광택성사전필터링
 
GPG 1권 4.12 VIPM
GPG 1권 4.12 VIPMGPG 1권 4.12 VIPM
GPG 1권 4.12 VIPM
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
 
[NDC2014] 반응적 라이브 개발
[NDC2014] 반응적 라이브 개발[NDC2014] 반응적 라이브 개발
[NDC2014] 반응적 라이브 개발
 
GPG Study 4.3 카메라 제어기법
GPG Study 4.3 카메라 제어기법GPG Study 4.3 카메라 제어기법
GPG Study 4.3 카메라 제어기법
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
 
Gpg study5.5
Gpg study5.5Gpg study5.5
Gpg study5.5
 
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
GPG 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
 
Fitbit
FitbitFitbit
Fitbit
 

Ähnlich wie Gpg gems1 1.3

헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?NAVER D2
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서tcaesvk
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계Chiwon Song
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개Dong Jun Kwon
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계Sungkyun Kim
 
Clean code
Clean codeClean code
Clean codebbongcsu
 
Swift3 generic
Swift3 genericSwift3 generic
Swift3 genericEunjoo Im
 
C언어 세미나 - 함수
C언어 세미나 - 함수C언어 세미나 - 함수
C언어 세미나 - 함수SeungHyun Lee
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장SeongHyun Ahn
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 
Android audio system(오디오 플링거 서비스 초기화)
Android audio system(오디오 플링거 서비스 초기화)Android audio system(오디오 플링거 서비스 초기화)
Android audio system(오디오 플링거 서비스 초기화)fefe7270
 

Ähnlich wie Gpg gems1 1.3 (20)

강의자료 2
강의자료 2강의자료 2
강의자료 2
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
6 function
6 function6 function
6 function
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
06장 함수
06장 함수06장 함수
06장 함수
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
 
Clean code
Clean codeClean code
Clean code
 
Swift3 generic
Swift3 genericSwift3 generic
Swift3 generic
 
C언어 세미나 - 함수
C언어 세미나 - 함수C언어 세미나 - 함수
C언어 세미나 - 함수
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
Android audio system(오디오 플링거 서비스 초기화)
Android audio system(오디오 플링거 서비스 초기화)Android audio system(오디오 플링거 서비스 초기화)
Android audio system(오디오 플링거 서비스 초기화)
 

Gpg gems1 1.3

  • 1. GPG Gems 1 1.3, 1.5, 1.11
  • 4. 슬라이드 쇼가 끝났습니다. 끝내려면 마우스를 클릭하십시오.
  • 5. Singleton (mathematics) In mathematics, a singleton, also known as a unit set,[1] is a set with exactly one element. For example, the set {0} is a singleton. The term is also used for a 1-tuple (a sequence with one element). 싱글턴 패턴(Singleton pattern) 주어진 임의의 시점에서 시스템 내에 단 하나의 인스턴스만 존재하는 객체를 가리킨다. 예, XxxManager 클래스
  • 6. Global object vs Singleton object - 전역객체의 진화 - 객체의 생성/소멸 시점 제어 Singleton 고려사항 - Singleton 객체의 생성, 소멸시점 - Thread safe 고려 Singleton 다양한 구현 - Scott Meyers style - 함수에 static 지역 변수를 넣고 싱글턴을 구현한 방식 - Phoenix, Loki, Mordern C++ design - etc
  • 7. 구현 Template <typename T> class Singleton { static T* ms_Singleton; public: Singleton() { int offset = (int)(T*)1 – (int)(Singleton<T>*)(T*)1; ms_Singleton = (T*)((int)this + offset); } ~Singleton() { ms_Singleton = 0; } static T& GetSingleton() { return (*ms_Singleton); } static T* GetSingletonPtr() { return ms_Singleton; } }; Template <typename T> T* Singleton<T>::ms_Singleton = 0;
  • 8. 사용 Class EntityMgr : public Singleton<EntityMgr> { Entity* GetEntity(eEntityType type); //…. }; #define g_EntityMgr EntityMgr::GetSingleton() void doSomething() { Entity* pMob = g_EntityMgr.GetEntity(E_ENTITY_MONSTER); //… }
  • 9. 소감 - 그 동안 싱글턴을 사용할 때 한 측면만 봤는데 다양한 방식과 고려해 야 할 것이 많았다는 것을 느낌
  • 11. 비행기 조정실 내부를 보자 얼마나 복잡하고 이상한 버튼들로 가득하다.
  • 12. Interface Design (잠깐 생각해보기) 비행기 조종석의 인터페이스는 어느 쪽인가? 단순함 vs 복잡함 vs 혼란스러움 - 의미 구별 - 단순함은 복잡함의 반대가 아니다 복잡함은 세상의 모습이고, 단순함은 마음의 상태다. User는 Simple과 Complex 둘 중 무엇을 원하는가? Clear 명확한 이해 우리에겐 보이는 심플함보다 제품을 이해 하고 쉽게 사용할 수 있는 적절한 복잡함이 필요하다. - 도널드 노먼
  • 13. Purpose - 실행 시점에서 함수를 외부로 노출시키고, (실행속도, 편의성을 유지하며) 동적으로 바인딩하는 한 가지 방법에 대해 설명 Scripting Engine의 요구사항 - 스크립트에서 코드의 함수(인자포함)를 호출할 수 있도록 한다 RPC의 요구사항 - 원격으로 함수를 호출할 수 있도록 한다 - ID와 function pointer의 맵핑 Function call의 요구사항 - Function name - Memory 상의 function 위치 - Function arguments
  • 14. 시도#1 - 게임의 함수를 스크립트에서 호출할 수 있도록 하는 RPC로 네트웍을 통해 전달하 는 범용적 방법을 시도한다 void Foo(); void Bar(); Function g_Functions[] = { enum eFunction { ”Foo”, Foo, FUNCTION_FOO }, { { ”Bar”, Bar, FUNCTION_BAR }, FUNCTION_FOO, //… FUNCTION_BAR, }; //…. }; struct Function 사용 { - ID로 전송 및 함수 호출 typedef void (*Proc)(); const char* m_Name; 문제점 Proc m_Proc; - 함수 인자 처리 eFunction m_Function; };
  • 15. 시도#2 - 시도#1의 부분적 해결책 : 함수 파라미터를 처리한다 struct Parameters void Foo(Parameters& params) { { std::vector<unsigned char> m_Data; int p1 = params.ExtractInt(); float p2 = params.ExtractFloat(); bool ExtractBool(); // p1,p2를 사용 int ExtractInt(); } float ExtractFloat(); const char* ExtractString(); void AddBool(bool); void AddInt(int); void AddFloat(float); 사용 void AddString(const char*); - ID로 전송 및 함수 호출 }; struct Function { 문제점 typedef void (*Proc)(Parameters&); - 함수 인자 타입 불일치 문제 - 함수 호출 처리의 불편함 std::string m_Name; Proc m_Proc; eFunction m_Function; };
  • 16. 절반의 해결 - 일반화된 방식으로 함수를 호출하기 위한 함수 사양 테이블을 이용한다. struct Function { enum eVarType // 간단한 변수 사양 { VAR_VOID, VAR_BOOL, VAR_INT, VAR_FLOAT, VAR_STRING, }; enum eCallType // 가능한 함수 호출 규약들 { CALL_CDECL, CALL_FASTCALL, CALL_STDCALL, CALL_THISCALL, }; typedef std::vector<eVarType> ParamVec; std::string m_Name; void* m_Proc; unsigned int m_SerialID; eVarType m_ReturnType; ParamVec m_ParamTypes; eCallType m_Calltype; }; typedef std::vector<Function> FunctionVec; FunctionVec g_Functions; // 노출할 함수들의 사양들을 담을 벡터
  • 17. 해결책의 완성 - EXE의 익스포트 테이블로부터 함수정보를 얻는 방식을 적용하여 함수를 일반화된 방식으로 호출하는 시스템을 갖추어 사용한다. 결론 - 함수를 일반화된 방식으로 호출하는 시스템을 갖추어 사용한다. 소감 - 초반에는 기대를 했지만 후반부로 갈 수록 그다지 와 닿지는 않음. - 그러나 다른 곳에 이러한 방법을 적용해 볼 수 있었다. - Python object Extract 시에 사용해봄.
  • 18. 1.11 온라인 게임을 위한 프로토콜
  • 19. Purpose - 온라인 게임을 위한 응용 수준 통신 프로토콜의 구축에 대한 몇 가지 기법 소개. 네트워크 패킷의 구성 - 헤더, 바디(페이로드) Packet 변조 공격 - 페이로드의 값 변경 : checksum 적용으로 해결 (MD5 해싱알고리즘) - 취약점 - 클라이언트 프로그램에 체크섬 코드가 존재 : 리버스엔지니어링 위험 - 패킷 리플레이 Packet Replay 공격 - 클라에서 보내는 패킷을 스니핑해서 짧은 시간에 여러 번 재전송이 가능 - wpepro같은 툴로 가능 - 방어 - 서버 측 : 일정 시간 내 정해진 개수만큼 수신 제한 - Sequence number - Prime number
  • 20. 결론 - 초기 버전부터 암호화 기법을 적용하자. - 치팅을 불가능하게 만드는 것을 목표로 삼는 것은 너무 소모적이며 불가능할 수 있 다. - 치팅에 드는 노력을 최대한 크게 하는 것을 목표로 삼는 것이 현실적이다. 소감 - 적용