[Qt] CMakePresets.json, CMakeUserPresets.json
Qt프로젝트 중 CMakeUserPreset.json을 QtCreator에서 적용하는데 어려움을 겪어서, 해당 과정을 남긴다. CMakePresets.json, CMakeUserPresets.jsonCMake를 사용할 때 일반적으로 프로젝트 configure에 대한 설정을 공유할 때 문제가 생긴다. 그렇기에 CMake에서 3.19 버전부터 일반적인 configure 옵션을 지정하고, 다른 사용자와 공유할 수 있는 파일인 `CMakePresets.json`과 `CMakeUserPresets.json`를 지원한다. `CMakePresets.json`과 `CMakeUserPresets.json`은 프로젝트의 root 디렉토리에 위치해야 하며, 포맷자체는 둘 다 똑같으며, 둘 다 필수가 아닌 사용자가 필요하에..
2025.08.20
QT
no image
RTSP 개념 정리
RTSPRTSP는 전송계층을 TCP를 사용하므로 먼저 이에 대한 개념을 간략히 살펴보자. TCP와 UDPOSI 7 Layer 또는 TCP/IP 4 Layer에서 Transport에 해당하는 계층에 TCP와 UDP 프로토콜이 존재한다. IP는 데이터의 배달을 처리. TCP는 패킷을 추적 및 관리. UDP보다 복잡한 절차를 통해 신뢰성을 가지므로, 연속성보다 신뢰성있는 전송이 중요할 때에 사용하는 프로토콜이다. 대충 UDP처럼 패킷을 무작위 path로 보내서, 순서대로 패킷이 도달하지 않는 신뢰성을 보장하는 전송 프로토콜이라고 생각만 하고 넘어가보자. RTSP의 기본 동작TCP를 기반으로 동작 (UDP를 통한 데이터 전송도 가능한 것처럼 보임)RTP를 통해 미디어 데이터를 전송RTCP를 통해 품질 / 통계..
2025.08.19
[Computer Graphics] FPS 계산
FPS 계산 방식FPS는 frames per second로 1초당 몇 개의 프레임이 지나갔는지를 의미한다. 그러므로 FPS는 다음과 같은 식으로 계산한다:$$ FPS = \frac{frames}{1 \space sec} $$ 또한, FPS와 역수 관계인 frameTime이 존재한다. 이는 한 프레임을 그리는데 걸린 시간을 의미한다.$$ frameTime = \frac{sec}{1 \space frame} $$ 보통 개발할 때는 ms를 반환받아 사용하기 때문에, $1000$으로 나누어 밀리초를 초로 변환하여 사용한다. $$ FPS = \frac{frames}{\frac{elapsedMs}{1000}} $$총 프레임에 흐른 시간을 나눈다. $$ FPS = \frac{frames}{elapsedMs} \ti..
2025.07.08
no image
백준 2109번 순회강연 [C/C++]
첫 번째 시도 방식 (X)day를 기준으로 오름차순을 하고, 같은 날에선 가격을 기준으로 내림차순 하여 가능한 업무를 처리. 반례는 있다고 인지했지만, 다른 방식이 떠오르지 않아 먼저 해당 방식으로 구현해보았다.#include using namespace std;int n, p, d;int dayCount = 1;int ret;vector> v;bool cmp(pair a, pair b) { if (a.second b.first; } else { return false; }}int main(){ cin >> n; for (int i = 0; i > p >> d; v.push_back({ p, d }); } sort(v.begin(), v.end(), cmp); for (int i = 0; i ..
2025.05.23
[QT] QOpenGLShaderProgram의 addShaderFromSourceCode 메서드
QOpenGLShaderProgram이 클래스는 GLSL과 GLSL/ES로 작성된 셰이더 프로그램을 지원한다. QOpenGLShader와 QOpenGLShaderProgram은 vertex shader와 fragment shader를 컴파일하고 링킹하는 세부 작업들로부터 프로그래머를 보호해준다. 다음 예제는 제공된 셰이더 소스코드를 사용하여 버텍스 셰이더 프로그램을 생성하는 것이다. 컴파일 및 링크가 완료되면 셰이더 프로그램은 QOpenGLShaderProgram::bind():를 호출하여 현재 QOpenGLContext에서 활성화된다.QOpenGLShader shader(QOpenGLShader::Vertex);shader.compileSourceCode(code);QOpenGLShaderProgram..
2025.05.18
QT
no image
[OS] 프로세스와 메모리 레이아웃
프로세스프로세스 개념운영 체제에 대해 이야기 할 때 제기되는 질문중 하나는 CPU가 수행하는 모든 활동을 무엇이라고 부를 것인가이다. 초기 컴퓨터는 job을 실행하는 일괄 처리(batch) 시스템이었지만, 이후 user program, 또는 task를 실행하는 시분할 시스템이 등장했다. 오늘날 단일 사용자 시스템에서도 사용자는 워드 프로세서, 웹 브라우저, 이메일 패키지 등 여러 프로그램을 동시에 실행할 수 있다. 멀티태스킹을 지원하지 않는 임베디드 장치처럼 컴퓨터가 한 번에 하나의 프로그램만 실행할 수 있더라도, 운영 체제는 메모리 관리와 같은 자체적인 내부 프로그래밍 활동을 지원해야 할 수 있다. 많은 측면에서 이러한 모든 활동은 유사하므로, 이 모든 활동을 프로세스(process)라고 부른다. 조금..
2025.05.09
[C++] std::array
std::arrayC++ 11에 추가된 std::array는 에 정의되어 있다. C 스타일의 배열과 다른 점은 배열의 이름이 `T*`로 자동 형변환 되지 않는다. C 스타일의 배열을 사용하게 되면 함수 매개변수에 집어넣었을 때, 포인터로 강제 변환되어 배열의 크기가 날라가는 불편한 점도 초래한다. 배열 크기가 소멸되는 이유는 `int arr[]`처럼 함수의 매개변수를 설정하더라도, 함수 내부에서 `int* arr`와 동일하게 해석한다. (sizeof() 연산하면, 그냥 포인터 크기만 계산됨.) 이 떄문에 배열의 크기를 같이 함수 매개변수에 넘겨주어야 하는 과정이 생긴다. 또한 반복자(iterator), 대입 연산자 등을 사용할 수 있다. 이 덕분에 에 정의된 함수를 std::array에 사용할 수 있는..
2025.05.03
[C++] Data Types, Type Modifier
Data Types 카테고리종류설명예시 데이터 타입Built-in간단한 값을 저장하는 데 사용되는 기본 데이터 타입. Built-in 또는 primitive 타입이라고 불린다.int, float, double, char, bool, voidDerived Data TypesBuilt-in 타입을 기반으로 더 복잡하게 만들어진 타입이다. 예를 들어, int*, int&, int[10], int()는 모두 int에서 파생된 타입Functions, Arrays, Pointers, ReferenceUser Defined Data Types프로그래머가 필요에 따라 만든 사용자 지정 데이터 타입class, struct, union, typedef, using Data Type Modifiertype modifier..
2025.05.03
no image
[QT] QWidget 기본 개념 정리
QWidget기본 개념QWidget 모든 위젯의 기반 클래스이다. QWidget은 가장 기본적인 Draw와 이벤트 처리 기능만 제공하기에 이를 상속받아 필요한 추가 기능들을 구현해놓은 클래스들이 존재한다. 보편적으로는 데스크톱 프로그램을 제작할 때 메인 프레임은 QWidget을 상속받은 QMainWindow를 기본으로 사용하고, 실제 UI 컨텐츠를 표시하기 위해서 QWidget을 central widget으로 사용한다. 그리고 QDialog는 팝업창처럼 사용되며 이는 수락, 거부 등의 버튼과 잘 작동하도록 하는 기능이 존재한다. 또한 QWidget이 직접적인 기능을 제공 하지 않은 추가적인 예는 QWidget에 글꼴 속성이 존재하지만, 직접 사용하지 않고 QLabel, QPushButton, QTabWi..
2025.05.02
[QT] QApplication
QApplicationQApplication은 signal-slot을 작동시키는 이벤트 루프를 실행한다. 실행중인 이벤트 루프가 없으면 GUI 컴포넌트에서 발생하는 이벤트는 전혀 전파되지 않으므로 UI는 아무일도 하지 않게 된다. 해당 메인 이벤트 루프는 다음과 같은 것들을 처리한다:사용자 데스크톱 설정 초기화 (예: 폰트, 팔레트, 더블 클릭 간격) 이벤트 마우스, 키보드, 새로고침기존 창 시스템에서 이벤트를 수신하여 관련 위젯으로 전송하는 이벤트 처리sendEvent(), postEvent()를 사용하여 자체 이벤트를 위젯에 전달 가능커맨드 라인 매개변수 처리스타일 관리. QStyle 객체에 캡슐화되며 런타임에 setStyle()을 사용하여 변경 가능translate()를 통해 문자열 현지화clipb..
2025.05.02
QT
no image
[QT] CMake로 환경 설정
환경 설정기존에는 QT 설치 경로를 CMAKE_PREFIX_PATH에 설정한 뒤, find_pacakge를 사용했지만 QT6_ROOT라는 변수를 지정하는 방법도 가능하다고 한다,https://cmake.org/cmake/help/latest/variable/PackageName_ROOT.html 이를 살펴보면, find_package() 커맨드는 CMAKE_PREFIX_PATH도 참고하지만, _ROOT CMake 변수에 지정된 prefix도 검색한다. CMake 3.27 버전부터 추가됐다고 한다.크로스 컴파일하거나 vanila cmake를 사용할 때는 QT6_ROOT 또는 CMAKE_PREFIX_PATH 같은 검색 경로 대신 CMAKE_TOOLCHAIN_FILE을 설정 QT 소스 importing모던 C..
2025.04.30
QT
no image
[CMake] ExternalProject_Add() 사용 연습
ExternalProject 모듈ExternalProject_Add()를 사용해서 SPDLOG를 다운받고, 그 과정에서 오류 해결을 하는 과정을 기록한다. 또한 CMake 3.11 이전 버전이라면 ExternalProject 모듈밖에 선택지가 없지만, 그 이후라면 FetchContent 모듈을 사용하는 방법도 존재한다. ExternalProject는 빌드 타임에 외부 파일들을 불러오며, FetchContent는 CMake를 실행하는 시점에 외부 파일들을 불러온다. ExternalProject_Add()공식 문서에서 ExternalProject_Add()의 옵션에 대해 확인할 수 있다. ExternalProject_Add 커맨드는 외부 프로젝트의 download, update, patch, configur..
2025.04.24