분류 전체보기

Programming/C# & Unity

C# 가비지 컬렉션 루트 오브젝트 (GC root object)

기본적으로 C++ 스마트 포인터는 그냥 ref count를 통해서 간단한 원리로 관리가 된다. 그리고 C#의 GC(Garbage Collection)은 루트 오브젝트에서 끊긴 포인터들을 해제시키고 살아있는 친구들은 세대를 넘겨 자주 체크 하지 않도록 한다고 알려져있다. 여기서 루트 오브젝트가 대체 뭐고 언제 연결되고 끊기는 지 궁금해져서 확인해보았다. (https://www.red-gate.com/simple-talk/development/dotnet-development/understanding-garbage-collection-in-net/) 루트 (rooted reference 라고 부르는 듯) 1. 현재 실행 중인 스레드의 지역 변수는 루트 오브젝트로 간주된다. 2. 정적 변수는 루트 오브젝트로 ..

Day Life

게임 서버프로그래머 경력 이직 면접 정리 (주니어)

최근에 이직 준비를 하면서 코테를 여럿 보았는데 성적이 되게 나쁘지 않았다. 그래서 그런지 면접도 회사에서 쓰던 지식으로 보면 되겠지?라는 안일한 마음으로 갔다가 처참하게 머리가 터졌다. 신입 면접 때 다 대답했던 내용인데, 거의 절반 이상의 내용을 제대로 말하지 못하였고, 서버 프로그래머로써 나의 단점을 말할 때 서버 경험이 부족하다고 말하는 대참사가 벌어졌다. 그래서 어느 정도 정리를 하고 이직을 성공할 때까지 이 포스트를 최신화하도록 할 것이다. 이직 완료해서 더 이상 최신화는 없음. 대충 느낀건 경력 면접에 두 가지 타입이 있는 것 같다. 1. 스피드 퀴즈 쇼 타입 : 실제 재직 중에 전혀 사용하지 않고, 직전에 외우지 않으면 절대 기억 날 수 없는 그런 면접용 지식들까지도 왕창 물어보고 모르면 ..

Programming/C# & Unity

C# Tuple, ValueTuple

1. Tuple private Tuple CompleteQuest(Int32 iID_) { return Tuple.Create(EErrorCode.INVALID_ID, null, null); } public void Main() { var tuResult = CompleteQuest(5); if(tuResult.Item1 != EErrorCode.OK) { Logging($"Error : {tuResult.Item1}."); return; } UpdateQuest(tuResult.Item2); ReceiveReward(tuResult.Item3); } Tuple은 C++의 그것과 동일하다. 여러 가지를 한 번에 전달해야 하는데 구조체 같은 것으로 감쌀 만큼 재사용성이나 스펙이 크지 않을 때 사용한다. 2..

Programming/C++ & Unreal

C++ RTTI 구현

개요 RTTI는 Run Time Type Information의 약자로 프로그램이 실행된 시점에 Type을 알 수 있는 기능이다. 기본 #include using namespace std; class A { }; class B { }; int main() { A a; B b; cout

Programming

Redis 랭킹 동점 처리

알고 있는 레디스 랭킹 동점 처리 관련 기법(?)을 몇 개 정리해보았다. (JS) 1. 기본 redisClient.ZREVRANGE("ranking:myRank", 0, -1, 'WITHSCORES', PrintRedisRank); 0) E : 100 1) D : 100 2) A : 100 3) B : 95 4) C : 70 기본적으로 Redis Rank(ZSet)은 score를 기준으로 정렬한 다음에 동점자가 있으면 key를 기준으로 다시 정렬해서 준다. 이외의 동점자 기준은 Redis에서 지원해주지 않아서 서버 애플리케이션 단에서 처리해줘야 한다. 2. 동점자는 같은 등수로 async function PrintRank( name ){ // 먼저 랭킹을 가져올 유저의 score를 가져온다. var sc..

Programming/C# & Unity

C# 게임 서버 (.net core) 장단점

C# 콘솔 서버를 실무에서 사용해보면서 느껴진 신입의 입장에서 주관적인 장점과 단점을 정리해보았다. 장점 1. 메모리 관리 수월 : C++은 잘못된 메모리를 접근하고 쓰는 순간 망한다. 심지어 스마트 포인터를 사용하거나 new-delete 관리를 잘해줘도 파편화 때문에 터져버린다. 하지만 C#의 GC는 단순 소멸 생성 외에도 파편화, 순환 참조 까지 다 해결해줘서 코드를 쉽게 깔끔하고 문제없이 동작하도록 짤 수 있다. 2. 유니티 프로젝트와 찰떡 : 클라이언트에서 사용하는 기획 데이터 코드나 패킷 구조체등을 그냥 그대로 가져다 쓸 수가 있다. 똑같은 일을 두 번 하는 뻘짓을 줄여주는 것 외에도, 클라-서버 간에 공통 작업이 누락되어 생기는 문제 같은 것들을 원천 차단할 수 있어서 편리하다. 3. 치명적 ..

Programming/Network

레디스 랭킹 (zrank, sorted set) 최대값 최소값

Key(Member) : String 이므로 제한 딱히 없음. Value(Score) : Double, -9007199254740992 ~ 9007199254740992 ( -2^52 ~ 2^53 ) 갯수 : 2^32 -1 실제로 저 영역이 벗어나면 값이 이상해지더라... (Test5, Test11과 Test 9, Test10은 서로 다른 값으로 설정함) 문서 출처 : redis.io/topics/data-types Data types – Redis *Data types *Strings Strings are the most basic kind of Redis value. Redis Strings are binary safe, this means that a Redis string can contain a..

Programming

시간복잡도 Big-O 정리

시간 복잡도? Big-O? 시간 복잡도는 알고리즘의 실행 속도를 "변수 N을 기준으로 대충 얼마 걸린다."라는 걸 표현하는 가장 쉽고 빠른 방법이다. Big-O는 특히 "최악의 상황에서 대충 얼마 정도 걸려요~"라는 걸 수식으로 요약해놓은 것이다. 경험상 프로그램에서 평균적이나 최선의 케이스 같은 건 크게 의미가 없고, 최악의 경우에 얼마가 걸리는지 파악하는 게 제일 중요하고 심지어 계산하기도 제일 편하다. 그래서 대부분 시간 복잡도를 물어보면 Big-O를 기준으로 이야기하곤 한다. (이하 내용에서도 시간 복잡도 = Big-O로 이야기하고 있으니 참고 바람.) 시간 복잡도 기초 O(N) : N의 시간이 걸림. - 오더(Order) N이라고 읽음 O(N²) : N제곱의 시간이 걸림. - 오더 엔 제곱 O(..

Programming/Linux and Web

docker 오류

Centos7로 도커를 가지고 놀면서 발생했던 오류 몇개를 정리 해보았다. 1. Cannot connect to the Docker daemon Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 도커 데몬 꺼져있어서 오류발생. systemctl start docker - 도커 데몬 켜고 systemctl enable docker - 도커 데몬 등록 2. Permission denied Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post ..

Programming/C++ & Unreal

Xcode tbb 설치

1. 터미널 실행 2. 터미널로 tbb 설치 brew install tbb 3. Xcode 프로젝트 파일 클릭 4. Build Settings에 Include, Lib Path 지정 5. Build Phases에 라이브러리 파일 링크 추가 끝 boost 설치도 거의 비슷한데, brew 말고 macPort 라는 것을 통해서 받았음.

장형이
'분류 전체보기' 카테고리의 글 목록 (3 Page)