목록전체 글 (157)
Coding Memo
리눅스 파일 구분 리눅스에서 파일은 크게 4가지로 구분한다. 하드웨어 장치들도 모두 파일들로 관리되는 것에 주목하자. 1. 일반 파일 (Regular Files) 일반적인 파일들을 저장하는데 사용된다. 텍스트, 이미지, 바이너리 파일 등이 이에 포함된다. 2. 디렉터리 (Directories) Windows의 폴더와 같은 개념이라고 보면 된다. 파일들과 디렉터리를 그룹화하고 구조화한다. 또한 파일의 계층 구조를 나타낸다. 3. 심볼릭 링크 (Symbolic Links) Windows의 바로가기와 같은 개념이다. 특정 파일이나 디렉터리를 간접적으로 가리키는 파일이다. 즉, 가리키는 원본 파일과 가리키는 파일 (Symbolic links)가 따로 존재한다. 4. 장치 파일 (Device Files) 시스템의..
Summary Web 상에서의 Http, Https를 이용한 req/res의 body의 text를 직렬화/역직렬화할 때, 타입에 유의하자. nullable 타입과 그렇지 않은 타입은 다르게 직렬화/역직렬화 된다. (예를 들어 int? 타입은 "null"값으로 파싱하지만, 단순 int 타입은 0(default) 값이 될 것이다.) nullable 타입은 아예 text로 `null`이라는 값으로 들어온다. 반드시 서버와 클라이언트에서 같은 데이터에 대한 클래스의 멤버 타입들은 특별한 이유가 없다면 동일하게 해주자.C# 8.0 부터 nullable 기능이 도입되었다. 이 Nullable Reference Types를 사용하면 null이 될 수 있는 참조형 변수와 될 수 없는 참조형 변수를 구분할 수 있다. 즉..
Summary 1. 소켓이 listening 상태에서 Accept를 하지 않고 backlog도 여유가 있을 경우에 클라이언트에서 이 소켓에 Connect를 하게 된다면 실제로 연결이 되지 않았지만(Accept 되지 않았지만) 클라이언트에서는 Connect에 성공한 것으로 간주될 수 있다. 따라서 이 때, connect에 관련한 IO callback이 호출될 수 있고, SocketError 값 또한, Success로 받아들인다. 위 상황에서 서버는 실제로 Accept를 한 상태가 아니기 때문에 서버에서는 Connected로 간주되지 않는다. (다시 말하자면, accept를 하지 않고 있기 때문에 backlog(대기열)에만 연결 시도한 소켓이 추가되었을뿐 서버는 이 상태를 연결상태로 받아들이질 않는다.) 2..
Visual Studio에는 실행을 하기위한 Application이 아닌 Class Library로 프로젝트를 빌드를 했을 때 유용한 기능이 있다. (C# 뿐만 아니라 다른 언어에 대해서도 지원한다.) 라이브러리 프로젝트에 담긴 형식에 맞는 주석(xml 형식)을 빌드한 라이브러리 파일을 가져다 사용하는 프로젝트에서도 동일하게 확인할 수 있다. 위 이미지는 라이브러리 프로젝트에서의 코드이다. summary를 작성하고 마우스를 클래스에 올려다 두면 해당 설명이 표시가 된다! (흔히 코드를 작성할 때, 미리 컴파일되어 있는 파일에 있는 프로퍼티나 함수에 대한 설명이 나오는 것이 바로 이런 것이다.) 위와 같은 기능을 컴파일된 라이브러리를 사용하는 다른 프로젝트에서도 동일하게 사용할 수 있다! 먼저 간단하게 주..
- Unity에서의 비동기 작업은 주로 Unity의 메인스레드에 처리 Addressable에서 여러개의 비동기 작업을 실행 후, 완료를 확인하고 싶을 때 Interlocked등의 atomic하게 연산을 할 필요가 없다. Thread-safe 이다. - 외부 라이브러리의 스레드에서는 UnityObject를 컨트롤 할 수 없을 뿐더러, Coroutine도 실행 시킬 수 없음 예를 들어 Socket에서 데이터를 받고 이를 바로 해당 스레드에서 처리하려고 하여, UnityObject를 건드린다면 어떠한 동작도 실행하지 않거나 오류가 날 것이다. 또한 Coroutine도 마찬가지이다. - Addressables.LoadResourceLocationsAsync() 의 첫번째 인자로, Addressable에 등록되어..
Entity Framework에서 데이터 모델 클래스를 작성할 때, Navigation Property (네비게이션 속성)에 virtual 키워드를 붙일 수 있다. virtual 키워드는 Entity Framework가 이 속성(property)를 Lazy Loading 하도록 한다. Lazy Loading은 해당 클래스나 객체를 로드시에 같이 바로 로드되는 것이 아니라, 관련된 데이터가 실제로 필요한 시점에만 데이터베이스로부터 로드하도록 한다. 아래와 같은 모델이 있다고 사정하자. [Table("User")] public class UserDb { [Key] public ulong UserId { get; set; } public string UserName { get; set; } } [Table("..
Summary Coroutine은 반드시 Unity 메인 스레드에서만 실행되어야 한다. (다른 스레드에서 StartCoroutine을 호출해도 소용없다!) 외부 스레드에서 Unity 오브젝트 접근을 막아 놓은 것과 동일한 맥락으로 생각하면 될 것 같다. 내가 겪었던 문제는 다음과 같다. Situation Client가 Server에 연결이 되고 연결이 되었을 때의 callback으로 서버에 ping 패킷을 보내는 Coroutine을 호출하고 있었다. tcp 연결은 내가 간단하게 만든 라이브러리에서 실행이 된다. 코드를 간단하게 나타내면 다음과 같다. StartCoroutineEx는 static이고 MonoBehaviour를 상속하고 있는 CoroutineManager에 있는 static함수로, IEnum..
서버와 클라이언트 사이에 패킷을 암호화 하여 전송을 하려고 계획했다. 생각한 2가지 방법은 일단 모두 대칭키 방식이다. 첫 번째는 단순히 바이트 배열에 대한 비트연산을 활용하는 방법, 두 번째는 AES 암호화를 사용하는 방법. 간단한 비트 연산 xor 연산을 이용하여 암호화 및 복호화하는 방법이다. public byte[] Encrypt(byte[] data, byte[] key) { byte[] encrypted = new byte[data.Length]; for (int i = 0; i < data.Length; i++) { encrypted[i] = (byte)(data[i] ^ key[i % key.Length]); } return encrypted; } public byte[] Decrypt(b..