본문 바로가기

반응형

진리는어디에

(289)
[Unity] 헤드리스 모드(Headless mode) 헤드리스 모드? 간단히 말하면 유니티에서 그래픽적인 요소를 제외하고 실행 하겠다는 의미다. 아무것도 보이지 않는 유니티를 어디다 쓸까? 유니티로 서버를 만든다고 가정하자. 클라이언트가 사용자들에게 화려한 애니메이션과 이펙트들을 보여주는데 집중하는 대신 서버는 사용자의의 요청과 각종 로직들을 처리하는데 집중한다. 서버에겐 간단한 텍스트를 출력 할 수 있다면 이미 그래픽적인 요소는 다 갖추었다고 할 수 있다. 헤드리스 모드는 주로 클라이언트가 아닌 서버를 만드는데 많이 사용된다. 어떻게 만드나? 타겟 플랫폼을 스탠드 얼론으로 맞춰 놓고 'Server Build'에 체크한다. 'Build' 버튼을 클릭하여 빌드를 완료 한 후 커맨드 창에서 빌드 결과 파일을 실행 한다. 이때 실행 옵션에 '-batchMode'..
[C++20] Ranges 이번 장에서는 C++20에서 추가된 range 라이브러리에 대해서 알아 보겠습니다. 처음에 새로운 라이브러리가 추가 되었다고 해서 새로운 패러다임이 가미된 엄청 복잡한 뭔가일 것이라 지레 겁을 먹고 시작했지만..사실 std::list, std::vector와 같은 자료 구조에 범위기반 알고리즘을 제공하는 편리하고 간단한 라이브러리 입니다. C++11에서 auto 키워드와 ranged for를 추가하여 길고 번거로운 iterator를 이용한 순회 코드를 간단하게 만들어 준것 처럼 C++20에서는 더 간단한 범위 기반 연산 함수들을 제공합니다. Range? C++20에서 부터 추가 되는 std 라이브러리 range는 아래와 같이 정의 되고 있습니다. 아이템들의 추상적인 집합 순회 가능해야 한다. begin(..
[C++20] 코루틴(Coroutine) - 예제 Coroutine.h #ifndef _COROUTINE_H_ #define _COROUTINE_H_ #include #include template class Coroutine { private: class Impl; struct promise_base { INITIAL_SUSPEND initial_suspend() { return INITIAL_SUSPEND{}; } std::suspend_always final_suspend() noexcept { return {}; } void unhandled_exception() { throw std::exception("unhandled exception"); } }; template struct promise_type_impl : public promise_..
윈도우 배치 스크립트(Batch Script) - IF ELSE Syntax IF condition do ELSE do_else 조건(condition)이 참(true)인 경우 do를 실행, 그렇지 않은 경우 do_else를 실행 한다 Example @echo off SET /A a = 5 SET /A b = 10 SET /A c = %a% + %b% if %c% == 15 (echo "c is 15") else (echo "c is not 15.") if %c% == 10 (echo "c is 10") else (echo "c is not 10.") 각 'if else' 문은 괄호 () 안에 위치 해야 합니다. if 와 else를 구분하기 위해 괄호를 사용하지 제대로 된 코드로 인식하지 못합니다. Output "c is 15" "c is not 10." 부록 1. ..
윈도우 배치 스크립트(Batch Script) - IF Syntax if condition do 조건(condition)이 참(true)인 경우 do를 실행 한다. Integer 변수 Example @echo off SET /A a = 5 SET /A b = 10 SET /A c = %a% + %b% if %c% == 15 echo "c는 15" if %c% == 10 echo "c는 10" Output c는 15 String 변수 Example @echo off SET str1 = String1 SET str2 = String2 if %str1% = String1 echo "str1은 String1" if %str2% = String3 echo "str2는 String3" Output str1은 String1 부록 1. 같이 읽으면 좋은 글 윈도우 배치 스..
윈도우 배치 스크립트(Batch Script) - 주석(Comment) Rem 문을 사용한 주석 Syntax Rem comment Example @echo off Rem 이 줄은 주석 입니다 set message=Hello World echo %message% Output Hello World :: 문을 사용한 주석 Syntax :: comment Example @echo off :: 이 줄은 주석 입니다 set message=Hello World echo %message% Output Hello World Note 주석을 너무 많이 달면 스크립트에 성능 저하가 올 수 있음 주석은 해당 라인은 시작 부터 시작해야 한다. 앞에 공백이 있거나하면 주석으로 인식하지 않는다. 부록 1. 같이 읽으면 좋은 글 윈도우 배치 스크립트(Batch Script) - IF 윈도우 배치 스크립..
Lex & Yacc 컴파일 NOTE - 유입 키워드를 보고 컴파일러를 만들기 위해 이 페이지를 들리시는 분들이 많다는 것을 알게 되었습니다. 이 페이지는 Lex & Yacc를 컴파일 하는 방법에 대해 다루고 있습니다. Lex & Yacc를 이용해 컴파일러를 만들고 싶으신 분들은 Lex & Yacc Tutorial로 가셔야 합니다. 학교에서 배울 때는 분명히 Lex & Yacc로 배웠고, 책 제목도 그렇지만 실제 사용하는 바이너리 이름은 flex와 bison입니다. 이번 포스팅에서는 lex & yacc(flex & bison)을 컴파일 하는 방법에 대해 알아 보도록 하겠습니다. lex & yacc 를 이용해 컴파일러를 만드는 방법은 [진리는어디에] - Lex & Yacc Tutorial을 보시면 됩니다. 설명을 위해 lex 파일을 ..
윈도우 배치 스크립트(Batch Script) - 변수 배치 스크립트에는 실행 시 파라메터로 넘어 오는 변수와 'set' 명령에 의해 정의 되는 두 가지 종류의 변수 타입이 있다. 실행 인자 변수 배치 파일 실행 인자로 넘어오는 변수는 %1, %2, %3 과 같이 %와 인자 순서를 이용하여 접근 가능하다. Example @echo off echo %1 echo %2 echo %3 Output 1 2 3 SET 명령어에 의해 정의 되는 변수 문법 set 변수명=초기값 Note - 문자열을 저장한다면 '변수명=' 과 같이 붙여 써야 한다. 변수명과 '=' 사이에 공백이 있으면 문자열을 제대로 인식하지 못한다. Example @echo off SET message=Hello World echo %message% 위 예제에서 message가 set 명령어에 의해 정..
[C++20] 코루틴(Coroutine) - done() [진리는어디에] - [C++20] 코루틴(Coroutine) [진리는어디에] - [C++20] 코루틴(Coroutine) - co_await [진리는어디에] - [C++20] 코루틴(Coroutine) - co_yield 이전 강의들을 톻해 C++20에서 코루틴을 생성하는 법, 코루틴을 중단하고 호출자로 돌아 오는 방법, 코루틴에서 호출자로 값을 리턴하는 방법을 알아 보았습니다. 이번 장에서는 일정한 범위의 숫자를 생성해내는 Range라는 코루틴 클래스를 만들어 보면서 코루틴의 끝을 탐지하는 방법과, Range 클래스에 iterator를 추가하여 일반 stl 컨테이너 처럼 ranged for를 이용할수 있도록 해보겠습니다 간략한 설명을 위해 예제 코드는 최대한으로 줄이고 있으나 본 포스트의 맨 아래에 전..
[C++20] 코루틴(Coroutine) - co_yield 이번 강의는 [C++20] 코루틴(Coroutine)에 이어지는 내용 입니다. 이번 강의를 읽으시기 전에 이전 포스팅을 먼저 읽어 보시길 추천 드립니다. co_yield 코루틴을 중단(suspend)하고 호출자에게 돌아갈 때, 호출자에게 값을 넘기고 싶다면 co_await대신 co_yield를 사용 하면 됩니다. Generator foo() { //co_await std::suspend_always{}; co_yield 10; } 하지만 컴파일러는 'co_yield' 구문을 만나면 내부적으로 다음과 같은 코드를 생성합니다. Generator foo() { Generator::promise_type promise; // ...코드 생략... // co_yield 10; co_await promise.yie..

반응형