시작은 미미하나 끝은 쥬쥬하리라.

Develop

more

[Window OS] CascadeWindows()의 부모 핸들과 NULL이 바탕화면을 뜻할 때

목차증상원인해결기술 배경요약1. 증상 HMI 작화툴의 [보기] 메뉴에는 계단식 / 바둑판식 정렬 기능이 있음.-> 정렬 대상을 "편집 화면" 으로 두면 작화 화면들을, "창" 으로 두면 사용자가 띄워 둔 도구 창(속성·목록 등 모델리스 창)들을 정렬함. 정렬 대상을 "창" 으로 두고 계단식/바둑판식을 누르면 두 가지 문제가 생김.(1) 숫자 하나만 적힌 오류 메시지 상자가 뜸.(2) 작화툴 본체는 물론 브라우저·메신저 같은 다른 프로그램의 창까지 크기와 위치가 바뀜. -> (2) 는 "우리 프로그램 버그가 남의 프로그램을 건드린" 경우라 사용자 체감이 특히 나쁨. 2. 원인 정렬 기능의 내부 동작 - 사용자가 도구 창을 띄우면 창 관리자의 이벤트에 연결돼 목록에 추가됨.- 계단식/바둑판식을 누르면 그 목..

Trouble Shooting 2026.09.29 0

[C++] 왕복 변환의 진법(Radix)과 번호가 바뀐 열거형에 기본값을 채우는 변환기

목차증상원인해결기술 배경요약1. 증상 구형 작화툴의 파일을 신형 작화툴 형식으로 바꿔주는 변환기에서 두 가지 문제가 보고됨. (1) 변환된 작화의 문자셋이 엉뚱하게 설정됨 - 원본은 특정 지역 문자셋을 쓰는 해외 고객의 작화.- 변환기 구버전으로 변환하면 A 라는 문자셋, 신버전으로 변환하면 C 라는 전혀 다른 문자셋으로 설정됨.-> 둘 다 원본의 문자셋이 아님. 게다가 버전에 따라 결과가 다름. (2) 16진수 상수가 망가짐 - 연산에 쓰는 상수를 16진수 자료형으로 적어 둔 경우, 변환 후 값이 바뀜.ex) 7B00 -> 7, FFFF -> 0-> 오류 메시지는 없음. 변환은 "성공" 으로 끝남. 2. 원인 원인 A — 진법을 모르는 왕복 변환 변환기는 구형 파일의 상수를 문자열로 읽은 뒤 정수로 바..

Trouble Shooting 2026.09.29 0

[C++] 빌드 시점 투영(Build-time Projection)과 모델 통합 뒤에 남은 옛 종류 값

목차증상원인해결기술 배경요약1. 증상 HMI 작화툴의 새 세대 버전에서 주소 편집 관련 증상이 둘 보고됨.(1) 속성 패널에서 주소 입력 창을 열면, 이름 항목 주소가 입력 창에 제대로 표시되지 않음.(2) 속성 패널에서 이름 항목 주소를 고친 뒤 객체 편집 창을 열면 주소 영역이 깨져 보임. 조사 중 같은 뿌리의 증상이 하나 더 나옴.(3) 파라미터 표에서 이름 항목 주소를 복사/붙여넣기하면 붙여넣기가 동작하지 않음. -> 객체 편집 창에서 직접 고르면 정상. 속성 패널·붙여넣기처럼 "문자열로 주소를 넣는" 경로에서만 발생. 2. 원인 배경 — 두 종류를 하나로 합친 모델 변경 이전 세대에는 이름으로 부르는 주소가 두 종류였음.1. 메모리 전용 항목 : 장치와 연결되지 않고 HMI 내부 메모리에만 존재..

Trouble Shooting 2026.09.29 0

[C++] 최소 버전 검사(Minimum Version Check)와 1바이트 필드에 넣은 센티널 값

목차요구사항설계구현 중 드러난 결함기술 배경요약1. 요구사항 특정 HMI 기종 계열이 그동안 막혀 있던 내장 플래시 저장소 쓰기를 허용하게 됨.-> 작화툴(HMI 편집기) 쪽에서 따라가야 할 변경이 여러 갈래로 생김. (1) 작화 전송 시 장치의 남은 용량을 먼저 확인하고, 부족하면 전송 실패 메시지를 띄움.(2) 데이터 백업·파일 저장 기능들의 저장 위치에 "내장 저장소" 선택지 추가.(3) 해당 계열에는 없는 이동식 저장 매체(SD 카드 등) 선택지는 비활성화 또는 숨김.(4) 기종을 바꿔 이미 선택된 옵션이 무효가 되면 빌드 오류로 알림. -> 기능 자체는 선택지 추가·숨김이 대부분이라 평이함.-> 이 글의 알맹이는 그 과정에서 드러난 결함 세 가지. 2. 설계 기종 판정은 능력 질의 한 곳으로 -..

Practical Coding 2026.09.29 0

[C++] 조용한 강등(Silent Downgrade)과 원본을 비우는 편집 창의 작업 사본 문제

목차증상원인해결기술 배경요약1. 증상 HMI 작화툴의 객체 편집 창에는 "조작 전 승인 요구" 옵션이 있음.-> 켜면 실행 화면에서 그 객체를 조작하기 전에 사용자 확인과 사유 입력을 거치게 하는 옵션.-> 사유는 프로젝트 설정에서 ID 로 지정한 "사유 문구 목록" 에서 고름. 이 옵션은 객체에 붙는 반응 규칙(조건에 따라 색·동작이 바뀌는 규칙 목록)과 함께 쓸 수 없음.-> 그래서 옵션을 켜면 반응 규칙 탭을 감추고 규칙을 비우도록 되어 있었음. 나타난 증상 (1) 편집 창에서 옵션을 켰다 껐다 반복하면 릴리스 빌드에서 접근 위반(Access Violation) 메시지가 뜸.(2) 옵션을 켜는 순간 이미 만들어 둔 반응 규칙이 아무 안내 없이 사라짐.(3) 프로젝트 설정이 참조하던 사유 문구 목록이..

Trouble Shooting 2026.09.29 0

DevOps

more

[운영체제] 데이터 레이스와 원자 연산(Atomic), 그리고 메모리 오더

목차데이터 레이스와 원자 연산원자성으로 안 잡히는 것 — 메모리 오더요약1. 데이터 레이스와 원자 연산데이터 레이스(Data Race) : 두 개 이상의 스레드가 동기화 없이 같은 메모리를 동시에 접근하고, 그중 하나 이상이 쓰기일 때 생기는 상태. 결과가 실행 타이밍에 따라 달라져 정의되지 않는다. 가장 흔한 예가 counter++ 다. 한 줄처럼 보이지만 CPU 입장에서는 세 단계다. // counter++ 는 한 줄처럼 보이지만 CPU 입장에서 3단계다int tmp = counter; // 1) load : 메모리 -> 레지스터tmp = tmp + 1; // 2) add : 증가counter = tmp; // 3) store : 레지스터 -> 메모리- load : 메모..

[AI] 하이브리드 검색(Hybrid Search)과 순위 기반 결합(RRF)

목차하이브리드 검색이 필요한 이유점수가 아니라 순위로 합친다요약1. 하이브리드 검색이 필요한 이유시맨틱 검색 : 질의와 문서를 임베딩 벡터로 바꿔 코사인 유사도로 정렬. -> 의미가 가까운 것을 찾음.의미 유사어를 잘 잡음. ex) "펌프 정지" 로 "펌프 중단", "정지 시퀀스" 를 찾아냄. // 시맨틱 검색 : 질의와 문서를 벡터로 바꿔 코사인 유사도로 정렬query_vec = embed("펌프 정지 절차")for doc in corpus: score[doc] = cosine( query_vec, embed(doc) )// "펌프 중단", "정지 시퀀스" 같은 의미 유사어를 잘 잡는다// 그러나 "MX-9000", "0x80004005" 같은 정확 토큰에는 약하다- 강점은 의미. 약점은 정확성..

Knowledge - AI 2026.09.15 0

[운영체제] 크리티컬 섹션(CRITICAL_SECTION)과 커널 오브젝트, 성능과 안전망의 교환

목차크리티컬 섹션과 커널 오브젝트성능의 대가 — 소유자 사망요약1. 크리티컬 섹션과 커널 오브젝트Windows 에는 "한 번에 한 스레드만"을 보장하는 도구가 두 부류 있음. 목적이 겹쳐 보이지만 쓰임이 갈림.CRITICAL_SECTION : 유저 모드 상호배제 객체. 커널 오브젝트(Mutex / Semaphore / Event) : 커널이 관리하는 상호배제 객체. 용어 주의 : "임계 영역(critical section)"은 보호해야 할 코드 구간을 뜻하는 개념. CRITICAL_SECTION 은 그 구간을 지키는 Windows API 객체. 이 글은 후자를 말함. 기준 1 — 프로세스 경계 커널 오브젝트는 커널이 실물을 소유하고, 프로세스는 핸들(번호표)로 접근함. -> 핸들 값은 프로세스마다 다..

[CS] 차원 분석(Dimensional Analysis)과 비용 추정의 함정

목차차원 분석과 비용 추정보존량 검산 절차요약1. 차원 분석과 비용 추정 성능을 다루는 판단에서 계산을 하기 전에 방향을 먼저 추정하는 습관이 있다. 그리고 그 추정이 자주 틀린다. 가장 흔한 형태가 이것. => "쪼개거나 개수를 늘리면 비용이 곱해진다." 직관적으로 그럴듯함. 단위가 200개로 늘었으면 비용도 200배가 될 것 같음.-> 그런데 이 직관은 보존되는 양을 보지 않았기 때문에 생긴 것임. 사례 1 — 프로젝트 파일 분할 현재 project.dat 50 MB (화면 200개 + 전역 리소스가 한 파일에)제안 screens/001.dat 250 KB screens/002.dat 250 KB ... (화면별로 200개 파일로 쪼갠다..

Knowledge - CS 2026.09.08 0

[CS] 불변식(Invariant)과 타입으로 규칙을 강제하기

목차규칙의 운명을 결정하는 것불변식을 타입으로 옮기기요약1. 규칙의 운명을 결정하는 것 오래된 코드베이스를 유지보수하다 보면 설계 규칙이 지켜지지 않은 흔적을 자주 만남. 그런데 흥미로운 것은, 같은 코드베이스 안에서 어떤 규칙은 10년째 완벽하게 지켜지고 어떤 규칙은 처음부터 새고 있다는 점. 다섯 가지 사례 ① 직렬화 계약 저장·복원 함수를 순수 가상으로 선언② 멤버 배치 "선택 핸들 속성은 하위 클래스에 둔다"③ 락 순서 규칙 "락은 항상 A -> B 순서로만 잡는다"④ 파생 상태 캐시 "자식이 움직이면 부모의 경계 사각형을 갱신한다"⑤ 호출 순서 "보정 함수를 생성 함수보다 먼저 호출한다" 중요도로 보면 ③(데드락)과 ④(화면 오류)가 ①보다 덜 중요하지 않음...

Knowledge - CS 2026.09.08 0

DevKit

more

[Qt] Shadow Build

목차Shadow Build응용/심화요약1. Shadow BuildShadow Build는 Qt에서 사용되는 Out of Source 형태의 빌드 종류임.Out of Soruce : 소스 폴더 외부의 별도 디렉토리에 산출물을 분리하는 빌드 종류.-> Qt의 qmake는 빌드 산출물을 특정 디렉토리로 모을 수 있는데 shadow build는 자동적으로 이 구조를 만듬. 빌드 산출물 분리의 장점(1) 빌드 환경에 폴더로 분리.-> 특정 폴더를 그대로 보존하여 버그 재현에 용이.(2) Debug / Realese 동시 보유.-> 각 모드의 전환 비용이 감소.(3) 워크스페이스 정리 단순.-> CI 측면에서 캐시 / 아티팩트 등 관리가 용이함. 2. 응용/심화상대 경로와 생성 파일Qt 빌드는 moc / uic /..

IDE - QT 2026.02.03 0

[RAD Studio] FastMM을 통한 메모리 관리

목차FastMMFastMM 설치 및 환경 설정FastMM을 통한 메모리 관리FastMM 환경 설정 관련 오류 해결1. FastMMFastMM은 Windows용 메모리 관리자로 델파이에서 사용 가능한 메모리 관리자임.FastMM 라이브러리를 프로젝트에 포함하게 되면 기존과 new / delete 하는 코드는 동일하나 내부적으로 컴파일 단게에서 메모리 할당과 해제 코드의 앞뒤에 가드 패턴을 삽입하여 메모리를 관리. - 옵션은 .inc 파일을 사용자가 직접 수정하여 라이브러리와 동일한 경로에 위치시키면 컴파일 단계에서 해당 inc 파일을 참조. 2. FastMM 설치 및 환경 설정본문에서는 FastMM4를 사용하며, 해당 파일 패키지는 검색을 통해 쉽게 찾을 수 있음. - 다운받은 파일을 확인하면 상위의 Fa..

IDE - RAD 2026.01.28 0

[QT] Qt4 - 기본 웹 브라우저로 설정한 URL 열기

기본 웹 브라우저로 설정한 URL 열기 코드 startDetached() 코드 미리 정의한 URL을 기본 브라우저로 오픈하는 코드를 구현해보겠습니다. URL을 미리 정의하고 기본 브라우저에서의 오픈은 startDetached() 함수로 구현하였습니다. int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString Url = "https://naver.com/"; QProcess::startDetached("cmd /c start " + Url); return a.exec(); } 해당 로직은 main 함수에서 구현하였기 때문에 프로젝트를 실행하면 그 즉시 naver.com 도메인으로 연결됩니다. startDetached() start..

IDE - QT 2024.01.18 0

[QT] Qt4 - 단축키로 파일 오픈하기

단축키로 파일 오픈하기 단축키 구현 결과 단축키 구현 Qt4에서 단축키 관련 메서드를 이용하여 특정 문서를 오픈할 수 있는 방법은 많습니다. 저는 오늘 그 중에서 두 가지 방법을 보여드리려 합니다. 첫 번째 방법은 단축키를 누르면 문서 파일이 직접적으로 오픈되는 방법입니다. 두 번째 방법은 단축키 클릭 시, 파일 브라우저를 오픈하는 방법입니다. 아래는 코드입니다. #include #include #include #include #include #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setup..

IDE - QT 2024.01.18 0

[QT] Qt4 - List 데이터에서 특정 단어의 빈도수 산출하기

Qt4 데이터에서 특정 단어 빈도수 산출하기 코드 구현 결과 코드 구현 데이터를 QStringList 형식이라 가정하고 진행해보겠습니다. 저는 미리 QStringList 형식의 데이터를 선언했습니다. 저는 이 List가 가진 데이터 중 title이라는 key값의 value에 해당하는 데이터만을 1차적으로 추출하고 이들을 대상으로 빈도수를 산출하겠습니다. #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 데이터 List. QStringList qList; qList

IDE - QT 2024.01.18 0

Study

more

[열혈 C++ 프로그래밍] (16) C++ 형 변환자

C언어 기반 C++ 2 형 변환 연산1 형 변환 연산2 형 변환 연산3 형 변환 연산1 C++ 형 변환 다운 캐스팅 등 문법적으로 에러가 있더라도 컴파일 에러를 일으키지 않고 형 변환 연산 처리 C++의 형 변환 : 4가지의 종류로 분할하여 사용 -> 각 종류 별 케이스에 일치하지 않으면 컴파일 에러 발생, 문법적 오류 발견 가능 1. static_cast 2. const_cast 3. dynamic_cast 4. reinterpret_cast dynamic_cast(안전성 보장) static_cast(안전성 미 보장) 형 변환 연산2 dynamic_cast 포인터 또는 참조자를 T형으로 변환하되, 안전한 형 변환만을 허용 ex) B클래스의 기초 클래스 A클래스일 때, B클래스의 포인터를 A클래스의 포인..

[열혈 C++ 프로그래밍] (15) 예외처리

예외처리 예외 상황, 예외 처리 예외처리 메커니즘 Stack Unwinding 예외상황 표현하는 예외 클래스 설계 예외처리 예외 상황, 예외 처리 예외 상황 문법적 오류가 아닌 프로그램 논리에 맞지 않는 오류 ex) 나이 입력 : 0보다 작은 값 입력 -> 예외 상황 예외 처리 조건문을 통해 예외를 발견하고 처리가 가능하지만 이러한 방식은 예외처리부와 일반 코드를 쉽게 구분 불가 -> C++에서 별도 메커니즘 제공 : try, catch, throw 예외처리 메커니즘 try, catch, throw try 블록에서 발생한 예외는 catch 블록에서 처리 try : 예외 발생의 검사 범위를 지정, 예외가 발생할 가능성이 있는 코드 블록 catch : try블록에서 발생한 예외를 처리, 예외 핸들러가 처리할..

[열혈 C++ 프로그래밍](14) 템플릿 2

템플릿 2 내용 확장 클래스 템플릿의 특수화 템플릿 인자 템플릿과 static 내용 확장 const 변수, 객체의 상수화 키워드 클래스 템플릿의 특수화 템플릿 컴파일러가 클래스를 만드는데 사용되는 템플릿을 정의 -> 컴파일러가 템플릿을 확인하고 템플릿 기반 클래스를 생성 -> 템플릿 클래스에서 객체를 생성 BoundCheckArray iarr(50); BoundCheckArray oarr(50); -> 와 같이 객체 생성 가능 Point int형 : BoundCheckArray로 객체 생성 -> typedef Point* POINT_PTR; = BoundCheckArray oparr(50);과 동일 + 템플릿 클래스 자료형을 대상으로 일반함수 정의 가능 + 클래스 템플릿 내부에서 일반 함수를 대상으로 f..

[열혈 C++ 프로그래밍] (13) 템플릿 1

템플릿 1 템플릿과 함수 템플릿1 템플릿과 함수 템플릿2 클래스 템플릿 템플릿 일부만 결정되어 있고 나머지는 사용하는 순간에 결정되는 것 -> 함수의 기능은 결정되어 있지만 자료형이 결정되어있지 않고 의존적이지 않은 것 int add(int a, int b) { return a+b } -> double형 데이터를 대상으로 연산하지 못함 -> double형 데이터를 int형으로 캐스팅하여 연산 할 수 있지만 데이터 손실 발생 -> double형 데이터 연산을 하는 함수 작성 필요 -> 자료형 마다 함수를 추가 작성하는 것이 비효율적이라서 템플릿 사용 T add(T a, T b) { return a+b } -> 함수 템플릿 -> T가 어떤 것인지 컴파일러가 알 수 있게 명시 + template {typena..

[열혈 C++ 프로그래밍] (12) String 클래스 디자인

String 클래스 디자인 C++표준, string클래스 문자열 처리 클래스 C++ 표준, string 클래스 String 문자열 처리를 위해 제공되는 클래스, string.h 헤더 파일을 포함해야 사용 가능 string str1 = "a"; string str2 = "b"; string str3 = str1 + str2; -> str1.operator+(str2);를 호출 : operator+() 함수는 string.h 헤더 파일에 정의 -> operator+() 이외에도 문자열과 관련한 operator+=(), ==() () 등의 함수가 정의 문자열 처리 클래스 length() 문자열의 길이를 반환하는 stirng 메소드 size()메소드도 길이를 반환하고 같은 값을 반환하지만, size는 객체가 메..

반응형