본문 바로가기

분류 전체보기

[C++] ToString() 사용하기 C++에는 없지만 다른 언어에는 존재하는 ToString 기능이 부러워서 만들어 보았습니다. 소스 코드와 사용법 : https://github.com/pjc0247/to.cpp 대략적인 사용법은 아래와 같습니다. std::vector v({1,2,3,4}); std::cout 더보기
[C#] async void / Task async void AsyncVoid() { /* .... */ throw new Exception(); } async Task AsyncTask() { /* .... */ throw new Exception(); } 공통점* 둘다 메소드 본문이 다 실행되기도 전에 리턴한다. 정확히는 첫번째 await 를 만나기 전까지는 계속 실행되고, 첫번째 await를 만나면 리턴한다. void 의 경우* 익셉션이 발생하면 UnhandledException으로 간주되고 프로그램이 종료된다. (.NET 런타임이 이 메소드가 익셉션을 내는지 안내는지를 감시한다) Task 의 경우* .NET 런타임이 감시하지 않는다. 유저가 예외처리를 해야 함* 발생한 익셉션은 리턴값 Task의 Exception에 채워진다 * 또는 aw.. 더보기
[VSCode] 확장 프로그램 작성하기 단축키 작업 만들기vscode 확장에서는 코드로 직접 키 입력을 감지해서 단축키 작업을 실행하는것이 아니라, 특정한 이름으로 커맨드를 만들고 유저가 직접 커맨드와 단축키를 바인딩하는 과정을 거칩니다. 확장 프로그램의 activate 함수 아래에 아래와 같은 코드를 작성합니다. 커맨드 이름은 extension.확장프로그램이름.기능이름 과 같이 작성합니다. let disposable = vscode.commands.registerCommand('extension.foo.helloWorld', () => { // 이곳에 커맨드가 눌리면 실행될 코드를 작성합니다. }); context.subscriptions.push(disposable); 커맨드를 등록하는 코드를 작성했으면, 실제로 단축키와 연결하기 위해 v.. 더보기
[HTTP2.0] DATA 프레임 6.1. DATADATA 프레임(type=0x0)은 가변 길이의 유저 데이터를 전송하는 역할을 담당합니다. (Http의 리퀘스트나 리스폰스의 페이로드 등). 한번의 요청이나 응답에 대해서 DATA프레임은 여러번 전송될 수 있습니다. 또한 DATA프레임에는 패딩이 붙을 수 있습니다. 패딩은 DATA 프레임 끝에 추가되어 전체 데이터의 크기가 얼마나 되는지 예측하기 어렵게 합니다. 더 자세한 내용은 아래 섹션을 참조해 주세요. https://tools.ietf.org/html/rfc7540#section-10.7 +---------------+ |Pad Length? (8)| +---------------+-----------------------------------------------+ | Data (.. 더보기
웹소켓 프레임 구조 WebSocket Data Frame Format FIN : 현재 패킷이 마지막 조각임을 나타냅니다. RSV1 ~ 3 : 특별히 지정되지 않은 경우 기본적으로 항상 0이어야 합니다. 0이 아닌 값을 지정할 경우 에러를 발생합니다. (발생시켜야 합니다.)OPCODE : 패킷의 타입입니다.MASK : PayloadData가 마스킹되었는지 여부를 나타냅니다. 클라이언트가 서버로 보내는 패킷은 항상 1이어야 합니다. 서버가 클라이언트로 보내는 패킷은 항상 0이어야 합니다.PAYLOAD_LEN : PayloadData의 길이입니다. 이 값이 125이하일경우 이 필드 자체가 PayloadData의 실제 길이를 나타내며 126/127일 경우 뒤따라올 EXTENDED_PAYLOAD_LEN의 길이를 나타내는 플래그 역할.. 더보기
[HTTP] 웹소켓 핸드쉐이킹 먼저 클라이언트에서 웹소켓 오픈 시, 서버로 아래와 같은 요청이 온다.(일반적인 HTTP 요청의 형태에 몇몇 추가적인 헤더를 담아서 보내는 방식이다.) HTTP/1.1 / GET Connection:Upgrade Sec-WebSocket-Key:alyAT1R7MR+KBq8VjSX0ug== Sec-WebSocket-Version:13 Upgrade:websocket 여기서 살펴보야아 할 값은 Sec-WebSocket-Key인데, 이 값은 서버가 웹소켓 프로토콜을 제대로 이해하고 있는지를 구별하는 역할을 한다. 이제 서버에서는 프로토콜 업그레이드에 대한 응답을 보내주어야 한다.상태 코드는 101번이고, 반드시 Sec-WebSocket-Accept 헤더에 알맞은 값을 채워서 보내야한다. 클라이언트로부터 받은 .. 더보기
[Unity] 왜 만들었는지 모를 IL2CPP IL2CPP는 유니티에서 발표한 AOT 컴파일러이다. 특이한점이 있다면, 인풋은 이미 빌드된 IL 코드 (DLL)이며, 아웃풋은 C++ 코드이다.그러니까 이미 빌드된 바이너리를 다시 뜯어서 컴파일 가능한 C++ 소스코드로 만들어낸다는건데, 어떻게보면 AOT가이나리 디컴파일로 생각할수도 있겠다. 유니티가 주장하는 IL2CPP의 장점- 퍼포먼스 : c++로 변환되서 네이티브 어셈블리로 실행되기 때문에 퍼포먼스 향상이 있다고 한다. 근데 처음부터 c++로 짜여진 코드도 아니고, IL을 c++ 코드로 변환한것이기때문에 최종 결과물인 c++ 코드에 .Net VM 호환성을 위한 코드들이 상당히 많이 들어간다. 어차피 Mono도 JIT이니, AOT니 전부 지원하는데 큰 효과가 있느지는 잘 모르겠다. 유니티측 벤치는 .. 더보기
[C#] Mono 환경인지 구분하기 bool isMonoEnv = Type.GetType("Mono.Runtime") != null; 가끔 모노에서만 오작동하는 코드를 분기처리하기 위해 더보기
[NUnit] Callback 방식의 API 테스트하기 [Test] public async void Login() { var t = new TaskCompletionSource(); Auth.Login( (result) => { t.TrySetResult(result); }); var loginResult = await t.Task; Assert.Equals(loginResult, true); } Setup 등의 메소드에서는 async 키워드를 사용할 수 없다. t.Task.Wait() 메소드를 호출해서 강제로 대기해야 한다. 더보기
[Unity] Unhandled Exception 처리하기 public void AddExceptionHandler() { // 유니티 메인 스레드가 아닌 다른 스레드에서 발생한 익셉션은 여기로 핸들링됩니다. AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; #pragma warning disable 0618 // 유니티 스레드에서 발생된 익셉션은 여기로 핸들링됩니다. UnityEngine.Application.RegisterLogCallback((condition, stackTrace, type) => { if (type != LogType.Exception) return; SendLog(condition, stackTrace); }); #pragma warning r.. 더보기