Ask Your Question

Seunghyun's profile - activity

2019-05-22 12:30:10 +0900 answered a question DB에서 오브젝트 검색관련해서 문의드립니다.

안녕하세요. 아이펀팩토리입니다.

해당 문서에 오타가 있는 것을 확인 하였습니다. 아래와 같이 수정하여 사용 부탁드립니다.

const Ptr<std::set<Object::Id> => const Ptr<std::set<Object::Id>>

감사합니다.

2019-04-04 14:29:10 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

Zookeeper 연결이 끊긴 것이고, 아직은 복구 가능한 상태라는 의미의 로그입니다. 이 상태에서는 일부 서비스의 응답이 멈출 것이고, 연결이 복구된 후 응답하게 됩니다. (ORM, AccountManager 등)

만약 이 상태가 40 초를 초과할 경우 복구할 수 없어 서버가 종료됩니다.

이 경우 주키퍼 서버의 상태를 확인해보시는 게 파악에 도움이 되실 수 있습니다.

2019-04-04 14:14:53 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

Json 데이터 로드 및 Register*Handler() 류는 Install() 함수를, Timer.ExpireAfter(), Event.Invoke() 등 처리를 발생시키는 것은 Start() 에서 하시면 됩니다.

Install() 및 Start() 함수에 대한 문서 설명이 없어 곧 보완하도록 하겠습니다.

감사합니다.

2019-04-04 13:57:51 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

/usr/share/zookeeper/bin/zkCli.sh 를 실행하셨을 때 (로컬의 주키퍼서버에 접속합니다.) CONNECTING 과 CONNECTED 둘 중 어느 상태로 나오는지 확인 부탁드립니다.

2019-04-04 13:49:16 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

네 옮겨서 확인 부탁드립니다. install 함수는 핸들러 등록 등 초기화 처리를 위한 것이며 초기화가 완료된 상태가 아닙니다. start 함수는 초기화가 끝난 뒤 불리며 서비스를 시작하는 단계입니다.

2019-04-04 13:44:32 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

만약, Install() 함수에서 Event 등을 만드신다면 Start() 함수로 옮겨서 확인 부탁드립니다. 그래도 해결되지 않으면, 서버 구동 후 출력된 모든 로그를 부탁드립니다.

2019-04-04 13:40:29 +0900 commented answer Assert failed: index < the_object_id_to_zk_client_ids.size():

감사합니다. 로그 파일도 부탁드립니다.

2019-04-04 13:29:33 +0900 answered a question Assert failed: index < the_object_id_to_zk_client_ids.size():

안녕하세요.

아이펀팩토리입니다.

로그와 MANIFEST 의 Zookeeper 설정을 올려주시면 확인이 수월할 듯 합니다.

가사합니다.

2019-03-25 17:37:09 +0900 answered a question ORM Map 사용시 문의 드립니다.

안녕하세요. 아이펀팩토리입니다.

Keys() 를 이용하여 순회 하시면 됩니다. Map 의 Value 가 Object 이고 Foreign 이라면, 미리 모두 Fetch 하신 후 순회하셔야 성능에 문제가 생기지 않습니다. (루프를 돌며 하나씩 Fetch 하는 경우 성능에 매우 안 좋습니다.)

Foreign 일 경우 부모 오브젝트의 Fetch{Map Attribute 이름}() 함수를 이용하여 한번에 불러올 수 있습니다.

감사합니다.

2019-03-12 15:12:11 +0900 commented answer orm 관련해서 문의드립니다.

네 맞습니다.

Character 에 다른 Attribute 들이 많이 늘어날 게 예상되시면 별도의 NickName 모델을 만드시는 게 좋습니다.

2019-03-12 14:53:33 +0900 commented answer orm 관련해서 문의드립니다.

안녕하세요. https://answers.ifunfactory.com/quest... 참고 부탁드립니다.

감사합니다.

2019-03-12 14:52:10 +0900 edited answer orm 관련해서 문의드립니다.

ORM 관련해서 추가 질분 드립니다. 현재 모델 구조가 아래와 같다면,

"Account" : { "id" : "String(64) KEY", "Character": "Character Foreign" }, 
"Character": { "NickName": "String(64) KEY",  "Level": "Integer32" , "Exp": "Integer64" }

사용중인 DB 정보에서 NickName만 새로 변경해야 할 경우 로직적으로 어떤 작업이 필요한지 문의 드립니다.

2019-02-18 14:07:53 +0900 answered a question 매치메이킹 관련 문의 드립니다.

안녕하세요. 아이펀팩토리입니다.

MatchmakingClient 를 통해 전달된 사용자 정의 Context 는 MatchmakingServer 의 context["user_data"] 로 위치가 변경되었습니다.

CheckJoinable 함수에서

 int64_t player_level = player.context["user_data"]["player_level"].GetInteger();

로 수정 부탁드립니다.

해당 수정이 업데이트 Changelog 및 레퍼런스 문서, Poing Game 예제에 반영이 누락된 것을 확인 하였습니다. 번거롭게 해드려 죄송합니다. 곧 업데이트 하도록 하겠습니다.

감사합니다.

2018-12-13 11:49:43 +0900 commented answer 타이머 관련해서 문의드립니다.

Tag 를 무작위 값을 주시면됩니다. 이벤트 스레드 수 만큼 병렬로 실행됩니다.

EventTag tag = RandomGenerator::GenerateUuid();

Timer::ExpireAfter(..., tag);

2018-12-13 11:20:39 +0900 commented answer 타이머 관련해서 문의드립니다.

네 맞습니다. (Tag 인자를 생략하면 기본 값 Tag 를 사용하게 됩니다.)

2018-12-13 10:29:39 +0900 answered a question 타이머 관련해서 문의드립니다.

안녕하세요. 아이펀팩토리입니다.

타이머 핸들러는 이벤트 스레드에서 실행됩니다.

타이머 핸들러들은 타이머를 등록하는 Timer::Expire*(...) 함수의 Tag 인자별로 직렬화 되어 실행됩니다. 같은 Tag 값을 사용하는 타이머 핸들러는 순차적으로 실행됩니다. 만약 앞서 실행된 핸들러 함수가 오랫동안 끝나지 않으면 뒤에 실행될 타이머 핸들러들의 실행이 그 만큼 지연되게 됩니다.

별도로 Tag 인자 값을 지정하지 않으셨다면 모두 동일한 기본 값을 사용하게 되어 순차적으로 실행되게 됩니다.

감사합니다.

2018-12-10 17:44:29 +0900 commented answer ORM 오브젝트 관련 문의 드립니다.

네 맞습니다. 조회 목적의 Query 를 실행하신다면 적절한 Index 를 직접 추가하시면 됩니다.

2018-11-20 10:49:25 +0900 commented answer 패키징 시 MANIFEST 설정 문의

MANIFEST 의 인자가 Json Object 또는 Array 가 아닌 Primitvie 타입(bool, int, double 등) 인 경우 아래와 같이 읽을 수 있습니다.

DECLARE_uint64(api_service_port);

void Example() {
  LOG(INFO) << "ApiService Port=" << FLAGS_api_service_port;
}
2018-11-19 18:20:43 +0900 answered a question 패키징 시 MANIFEST 설정 문의

안녕하세요. 아이펀팩토리입니다.

서비스가 아니라 생성되는 런처 스크립트를 이용하여 실행하신다면 "{ProjectName}-local -api_service_port=1234" 와 같이 실행 인자로도 지정하실 수 있습니다.

감사합니다.

2018-10-16 11:50:20 +0900 answered a question Flavor 구성시 서버 이동 관련 문의 드립니다.

안녕하세요. 아이펀팩토리입니다.

서버 이동은 AccountManager::RedirectClient() 이용을 권장드립니다.

Redirect 된 후 flavor 를 알아내는 방법은 아래 링크 참고 부탁드립니다. https://www.ifunfactory.com/engine/do...

감사합니다.

2018-10-08 15:10:22 +0900 answered a question col__Object_id 질문입니다.

안녕하세요. 아이펀팩토리입니다.

col__Object_id 는 Uuid 값으로 무작위로 생성됩니다. 무작위로 생성하더라도 중복이 발생할 확률이 매우 낮아 중복이 없다고 가정하고 쓰셔도 됩니다.

감사합니다.

2018-07-24 11:26:46 +0900 commented answer 서버가 가끔 crash나는 현상이 발생합니다.

추후 다시 올려주시면 확인해보도록 하겠습니다. 감사합니다.

2018-07-23 09:24:30 +0900 answered a question 서버가 가끔 crash나는 현상이 발생합니다.

안녕하세요.

아이펀팩토리입니다.

확인을 위해 올려주신 로그 위쪽으로 50여줄도 올려주실 수 있으실지요?

감사합니다.

2018-05-24 12:30:15 +0900 edited answer 변경 가능한 닉네임 구현 문의

아래와 같은 방법으로 구현할 수 있습니다.

모델 정의

{
  "Nickname": {
    "Nickname": "String(12) Key",
    "User": "User Foreign"
  },
  "User": {
    "Id": "String(12) Key",
    "Nickname": "String(12)",
    ...
  },
  ...
}

닉네임 설정

string id = ...;
string new_nickname = ...;

Ptr<User> user = User::FetchById(id);

// 새 닉네임 생성
Ptr<Nickname> nickname = Nickname::Create(new_nickname);
if (not nickname) {
  // 이미 사용 중
  return;
}

// 기존 닉네임 제거
Ptr<Nickname> old_nickname = Nickname::FetchByNickname(user->GetNickname());
if (old_nickname) {
  old_nickname->Delete();
}

// 새 닉네임 할당
user->SetNickname(new_nickname);
nickname->SetUser(user->Id());
2017-12-28 15:58:22 +0900 answered a question pong server 실행오류 문의

NIC 은 정상적으로 인식 되어 있습니다. pong-source/src/MANIFEST.lobby.json 에서 RpcService 의 rpc_nic_name 값을 빈 문자열 값 "" 로 해주시거나, NIC 이름으로 변경하면 해결될 것으로 보입니다.

2017-12-28 15:12:28 +0900 commented answer pong server 실행오류 문의

리눅스 터미널에서 ifconfig 명령으로 확인할 수 있습니다. 이 명령 수행 후 출력되는 내용을 보여주실 수 있을까요?

2017-12-28 08:51:43 +0900 answered a question pong server 실행오류 문의

안녕하세요. 아이펀팩토리입니다.

Pong Server 를 실행하는 기계에 NIC(Network Interface Controller) 이 하나 이상인지 확인 부탁드립니다. Pong Server 는 아이펀엔진의 RpcService 를 이용하고 있는데, 이 기능은 NIC 이 없으면 작동하지 않습니다.

감사합니다.

2017-12-22 17:54:14 +0900 answered a question pong server 빌드 오류 문의

안녕하세요. 아이펀팩토리입니다.

  1. pong soruce 를 복사한 경로
  2. 빌드하실 때 입력하신 명령어 및 빌드 명령어를 실행한 경로

를 알려주실 수 있을까요?

2017-12-20 23:15:13 +0900 received badge  Famous Question (source)
2017-12-19 08:52:24 +0900 commented answer 튜토리얼 진행 중 DB 기능 활성화하기에 대한 질문이 있습니다.

재설치는 MySQL 이나 MariaDB 를 재설치를 말씀드린 것이며, root 계정 비밀번호를 다시 설정하기 위함입니다. DB root 계정의 비밀번호는 OS 의 것이 아니라 DB 계정입니다.

2017-12-18 18:23:44 +0900 commented answer 튜토리얼 진행 중 DB 기능 활성화하기에 대한 질문이 있습니다.

입력된 DB root 계정의 비밀번호가 틀린 것으로 예상되는데요, 비밀번호가 맞는지 확인 부탁드립니다. 비밀번호를 잊어버리셨거나, 해결되지 않으면 재설치하여 비밀번호를 다시 설정 부탁드립니다.

2017-12-18 18:12:17 +0900 answered a question 튜토리얼 진행 중 DB 기능 활성화하기에 대한 질문이 있습니다.

안녕하세요. 아이펀팩토리입니다.

MariaDB, MySQL 상관 없이 둘 중 하나를 설치하시면 됩니다.

감사합니다.

2017-10-27 14:55:06 +0900 commented answer aws s3 사용 문의

만약 src/CMakeLists.txt 에 추가했는데도 그렇다면 CMakeLists.txt 와 src/CMakeLists.txt 를 seunghyun@ifunfactory.com 으로 보내주실 수 있을까요?

2017-10-27 14:53:30 +0900 commented answer aws s3 사용 문의

src/CMakeLists.txt 에 추가하신 게 맞는지요?

2017-10-27 11:47:50 +0900 commented answer aws s3 사용 문의
  1. "g++ --version" 명령의 결과를 공유해 주시면 감사하겠습니다.
  2. CMakeLists.txt 의 가장 아래에 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-pedantic") 를 추가하여 해결되는지 확인 부탁드립니다.

감사합니다.

2017-10-26 17:25:35 +0900 answered a question aws s3 사용 문의

안녕하세요. 아이펀팩토리입니다.

빌드 에러 발생 시 출력된는 내용을 올려 주실 수 있으신지요?

2017-09-26 10:29:47 +0900 received badge  Famous Question (source)
2017-09-26 10:29:47 +0900 received badge  Popular Question (source)
2017-09-26 10:29:47 +0900 received badge  Notable Question (source)
2017-09-22 09:38:41 +0900 answered a question 복합키와 계정 ID 변경(계정 플랫폼 연동)은 어떻게 해야하나요?
  1. ID 와 ID 를 소유한 플랫폼을 표현하기 위해 두 가지 키가 필요한데 이 것을 복합키로 만들 수 없나요? => 아이펀엔진의 ORM 은 하나의 오브젝트가 둘 이상의 다른 종류의 키를 만들 수 있지만 복합키와 같이 작동하지는 않습니다. 각각 개별적으로의 유일성만 보장됩니다. 하지만 아래 설명된 방법으로 복합키 없이 구현할 수 있습니다.

  2. 게스트 계정을 나중에 Facebook 같은 플랫폼 계정으로 연동하려는데 어떻게 해야하나요? ID 는 Key 라서 변경이 안돼서요 => 아래와 같이 구현할 수 있습니다.

오브젝트 모델 예제

// Platform 계정을 표현
"GuestAccount": {
  "Id": "String(50) Key",
  "Account": "Account"
},
"FacebookAccount": {
  "Id": "String(50) Key",
  "Account": "Account"
},
"TwitterAccount": {
  "Id": "String(50) Key",
  "Account": "Account"
},


// 실제 계정을 표현
"Account": {
  "Cash": "Integer",
  "RegisterDate": "Integer",
  ... // 기타 계정 데이터
}

서버 코드 예제

// Guest 계정을 생성
void OnCreateGuestAccount(const Ptr<session> &session, ...) {
  const string guest_id = ...;  // client 에서 받은 message 에서 읽는다.

  // GuestAccount 생성
  Ptr<guestaccount> guest_account = GuestAccount::Create(guest_id);

  // Account 생성
  Ptr<account> account = Account::Create();

  // GuestAccount -> Account 연결
  guest_account->SetAccount(account);

  // Account 의 기본 값 설정 등 나머지 처리
  account->SetCash(100);
  account->SetRegisterDate(WallClock::GetTimestampInSec());
  ...
}


// Guest 계정을 Facebook 계정으로 연동
void OnCreateFacebookAccountFromGuestAccount(const Ptr<session> &session, ...) {
  const string guest_id = ...;     // client 에서 받은 message 에서 읽는다.
  const string facebook_id = ...;  // client 에서 받은 message 에서 읽는다.

  // Facebook Id 에 대한 인증은 AuthenticationService 로 수행하며,
  // 이 예제에선 생략

  // Guest 계정 불러오기
  Ptr<guestaccount> guest_account = GuestAccount::FetchById(guest_id);
  if (not guest_account) {
    // 존재하지 않는 Guest 계정에 대한 예외처리
    return;
  }

  // Facebook 계정 만들기
  Ptr<facebookaccount> facebook_account = FacebookAccount::Create(facebook_id);
  if (not facebook_account) {
    // 이미 존재하는 Facebook 계정에 대한 예외처리
    return;
  }

  // GuestAccount 로 실제 Account 를 가져온다
  Ptr<account> account = guest_account->GetAccount();

  // GeustAccount 와 Account 의 연결을 끊고, GuestAccount 를 삭제한다.
  guest_account->SetAccount(Account::kNullPtr);
  guest_account->Delete();

  // FacebookAccount 에 Account 를 연결한다.
  facebook_account->SetAccount(account);

  // 기타 나머지 처리
  ...
}

감사합니다.

2017-09-22 09:34:07 +0900 asked a question 복합키와 계정 ID 변경(계정 플랫폼 연동)은 어떻게 해야하나요?
  1. ID 와 ID 를 소유한 플랫폼을 표현하기 위해 두 가지 키가 필요한데 이 것을 복합키로 만들 수 없나요?
  2. 게스트 계정을 나중에 Facebook 같은 플랫폼 계정으로 연동하려는데 어떻게 해야하나요? ID 는 Key 라서 변경이 안돼서요
2017-09-05 10:35:41 +0900 answered a question Protobuf 메시지 파일 추가

안녕하세요. 아이펀팩토리입니다.

src/CMakeLists.txt 파일에 다음 내용이 있습니다.

set(                                                                            
  ADDITIONAL_PROTO_SOURCES                                                      
  ${PROJECT_NAME}_rpc_messages.proto                                            
  ${PROJECT_NAME}_messages.proto                                                
)                                                                               

여기에 추가하시면 됩니다. 예를 들어 my_messages_inven.proto 를 추가하신다면 이렇습니다.

set(                                                                            
  ADDITIONAL_PROTO_SOURCES                                                      
  ${PROJECT_NAME}_rpc_messages.proto                                            
  ${PROJECT_NAME}_messages.proto
  my_messages_inven.proto                                                 
)                                                                               

감사합니다.

2017-08-29 15:20:52 +0900 received badge  Commentator
2017-08-29 15:20:52 +0900 commented answer dump as json

안녕하세요. 아이펀팩토리입니다.

아직 C# 버전에서는 ORM 오브젝트를 JSON 으로 Dump 하는 기능은 지원하고 있지 않습니다. 빠른 시일내에 업데이트 하도록 하겠습니다.

답변이 늦어 죄송합니다.

감사합니다.

2017-08-16 14:42:48 +0900 answered a question guid를 이용한 create

안녕하세요. 아이펀팩토리입니다.

Create() 함수로 전달되는 Key 값은, 해당 이벤트에서 생성하는 난수 값을 쓰시면 안됩니다. (롤백 후 다시 실행될 때 값이 매번 바뀌어 계속 롤백하게 됩니다.)

  1. Guid.NewGuid() 대신 funapi.RandomGenerator.GenerateUuid() 함수를 쓰시면 롤백 후 다시 실행될 때 같은 값을 반환하기 때문에 위 문제가 해결됩니다.

  2. 하지만 그 것 보다 "OnAddUserPlayer()" 함수에서 Guid 를 만들고 새로운 Event 함수에서 UserPlayer.Create() 함수를 호출하는 것을 더 권장합니다.(Guid 를 만든 후 Event.Invoke() 로 새 이벤트를 실행해 UserPlayer 를 만드는 것입니다.)

답변이 늦어 죄송합니다.

감사합니다.

2017-07-12 12:28:12 +0900 answered a question unique id 생성 관련

안녕하세요. 아이펀팩토리입니다.

꼭 Integer 값이어야 하고, Increment 되어야 한다면 말씀하신 방법도 좋습니다.

그렇지 않고 UUID 값도 괜찮다면

RandomGenerator::GenerateUuid()
함수로 생성하거나, 또는 계정이나 캐릭터 Object 등의 ID 값(UUID) 를 쓰시는 것도 방법이 될 수 있습니다.

감사합니다.