전체 글 560

작은 기부 문화 만들기 15 - 6.25 참전용사 후원에 동참해 주세요.

안녕하세요. 가정의 달이 지나가고, 6월이 왔습니다. 매년 돌아오는 달이라고 하지만 잊어서는 안 되는 국경일과 기념일이 있습니다. 그중에 하나가 나라를 지켜주신 분들 위한 기념의 날입니다. 정치적인 이야기하기보다는 한 마음으로 감사하는 달이 되었으면 합니다. 작은 기부이지만, 국민들의 감사하는 마음을 전하는 데 조금이나마 보탬이 되었으면 합니다. 1. 모금함 소개 이제는 우리가 지켜드려야 할 때 우리나라의 자유와 평화를 위해 희생하신 참전용사와 국가유공자분들, 그리고 그들의 가족들이 이제는 우리의 도움이 절실히 필요합니다. 6.25 전쟁, 월남전 등 대한민국의 역사 속에서 나라를 지키기 위해 헌신하셨던 분들은 현재 대부분 80~90세 이상의 고령자가 되었고, 많은 분들이 경제적 어려움..

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 23 - 인터럽트는 비활성화할 시점 확인

안녕하세요. 인터럽트가 발생하는 보았는데, 조금 다르게 중요한 작업을 하고 있을 때는 인터럽트가 발생하면 안 되는 상황도 있습니다. 이 부분에 대해서 확인해 보겠습니다. 1. 인터럽트가 발생하면 안 되는 상황 인터럽트는 보통 백그라운드에서도 계속 발생합니다. 그렇기 때문에 디바이스 드라이버를 개발하다 보면 특정 상황에서는 발생하면 안 되는 조건이 있습니다. (1) SoC에서 정의한 하드웨어 블록에 정확한 시퀀스를 줘야 할 경우(2) 시스템이 유휴 상태에 진입하기 직전의 시스템의 상태 정보 값을 저장하는 동작(3) 각 디바이스 드라이버가 서스펜드 모드로 진입할 때 디바이스 드라이버에 데이터 시트에서 명시한 대로 정확한 특정 시퀀스를 줘야 할 경우(4) 예외가 발생해서 시스템 리셋을 시키기 전 종합..

IT/Linux Kernel 2025.05.30

[Qt] gRPC, Protocol Buffers 사용 시 라이브러리 추가 방법

안녕하세요. 두 개 이상의 프로그램 상에서 구조화된 데이터를 보낼 때 Serialized 해서 네트워크로 보냅니다. 최근에 구글에서 효율적인 데이터를 직렬화와 서비스 간 통신을 가능하게 해주는 기술(gRPC, Protocol Buffers)이 있다고 해서 확인해 보았습니다. 간단하게 내용을 확인하고 Qt에서 라이브러리 추가하는 방법 알아보겠습니다. 1. gRPC와 Protocol Buffers 간략한 개념 1) gRPC 란 gRPC는 Google이 개발한 고성능 오픈소스 원격 프로시저 호출(Remote Procedure Call, RPC) 프레임워크입니다. 서비스 간의 통신을 마치 로컬 함수 호출처럼 수행할 수 있도록 설계했고, 몇 가지 특징이 있습니다. HTTP/2 기반의 고속 전송..

Programming/Qt 2025.05.29

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 22 - 인터럽트 핸들러 등록 과정 분석

안녕하세요. 인터럽트가 발생했을 때 인터럽트 핸들러(함수)가 호출되기 위해서는, 먼저 디바이스 드라이버 코드에서 해당 인터럽트를 초기화했는지 확인하고 인터럽트 발생한 후 처리하는 것이 필요합니다. 이번 내용은 인터럽트 핸들러를 등록하는 방법과 이를 검증하는 내용입니다. 1. 인터럽트 핸들러의 등록과정 분석 인터럽트가 발생한 후 지정한 인터럽터 핸들러가 호출되려면 먼저 인터럽트 핸들러를 등록해야 합니다. 인터럽트 핸들러의 등록은 인터럽트를 초기화하는 과정이 포함되어 있습니다. 인터럽트 초기화하는 과정에서 호출하는 request_irq() 함수를 확인해 보겠습니다. linux# vim include/linux/interrupt.h 선언부는 아래와 같고 인터럽트를 제대로 등록하면 true, 오류..

IT/Linux Kernel 2025.05.28

[자작 초단편소설] 나의 AI 투자 비서, 2화 - 다시는 보지 말자, 오라클라스 (결말 1)

안녕하세요. 두 번째 내용을 공유해 봅니다. 결말 1 부분으로 표시한 것은 다른 결말로 이어져도 재미있겠다 생각했습니다. 그래서 결말 2도 가능할 것으로 생각했습니다. 아직 완성하지는 못했지만, 나중에 올려보려고 합니다. 시대가 빠르게 변화하는 만큼 소설이 현실이 되어가는 기대와 두려움을 가지게 하는 시대인 것 같습니다. 파이팅 하는 시간 되셨으면 합니다. 감사합니다. ------- 이야기 시작 ------- "카인(Cain) 씨 계십니까?" AIEA에서 나왔습니다. AIEA(Artificial Intelligence Enforcement Agency)는 AI 단속국에서 나온 경찰이었다. 나는 어리둥절하며 무슨 일이냐고 하며 문을 열어 주었다. 그들은 들어오자마자, AI 장비가..

취미/소설쓰기 2025.05.27

[C++]컨테이너(Container)와 이터레이터(Iterator) 기초 2

안녕하세요 지난 글에는 C++의 컨테이너와 이터레이터가 무엇인지, 어떻게 사용하는지에 대해 알아보았습니다. 이번에는 조금 컨테이너와 이터레이터가 내부적으로 어떻게 동작하는 알아보겠습니다. 1. 컨테이너에 [] 연산자 사용 std::vector를 사용할 때, 우리는 배열처럼 v[i] 형태로 특정 위치의 요소에 매우 편리하게 접근할 수 있습니다. 이유는 연산자 오버로딩(Operator Overloading) 때문입니다. []는 C++ 클래스에서 특별한 함수(멤버 함수)로 직접 구현할 수 있는 연산자 중 하나입니다. 원리를 확인하기 위해, std::vector를 아주 간단하게 흉내 낸 ThingVector라는 클래스를 만들어 보겠습니다. templateclass ThingVector {priv..

Programming/C, C++ 2025.05.23

[C++] 컨테이너(Container)와 이터레이터(Iterator) 기초 1

안녕하세요 이번에는 C++의 개념 중에 컨테이너(Container)와 이터레이터(Iterator)의 기본 정의와 사용법에 대해 알아보겠습니다. 1. 컨테이너(Container)란? 이전 내용에서 몇 번 언급했지만, 정의에 해대서 다시 알아보겠습니다. C++에서 컨테이너는 동일한 타입의 여러 객체(데이터)들을 담는 자료구조라고 생각하면 쉬울 것입니다. 마치 물건을 담는 상자처럼, 컨테이너는 숫자, 문자열, 또는 사용자가 만든 객체들을 보관하고 관리하는 역할을 합니다. C++ 표준 템플릿 라이브러리(Standard Template Library, STL)는 다양한 종류의 컨테이너를 제공합니다. 대표적으로는 다음과 같은 것들이 있습니다. std::vector : 동적으로 크기가 변하는 배열 st..

Programming/C, C++ 2025.05.22

[자작 초단편소설] 나의 AI 투자 비서, 1화 - AI 비서와 부자 프로젝트 시작

안녕하세요. 이전에도 SF소설 같은 것을 적어보고 싶다는 생각을 했는데, 초단편 소설 쓰기 관련 책 읽고, 참고해 이야기를 소설로 간단하게 적어보았습니다. 초단편이며 1부, 2부(결말1), 외편(결말2) 구성해 볼 예정입니다. 처음 작품이라 부족한 점이 많이 있습니다. 이 사람은 미래를 이렇게 생각하는구나 참고 삼아 재미있게 보셨으면 합니다. 간단한 스토리는 아래와 같습니다. 인공지능(AI)이 발전한 시대에 AI 비서를 구매한 주인공이 전 재산을 걸고 부자가 되기 위한 투자를 시작한다. AI는 주인의 소원을 들어주기 위해 엄청난 투자 성과를 가져온다. 그러나 수익을 위해서 뒷배경에서 일어나는 사건에 휘말리게 된다. 감사합니다. ------- 이야기 시작 ------- [1화] AI 비서와 ..

취미/소설쓰기 2025.05.21

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 21 - in_interrupt() 함수

안녕하세요. 이전 내용에서 인터럽트와 인터럽트 컨텍스트에 대해서 확인했습니다. 이번에는 인터럽트 컨텍스트 구간인지 어떻게 알 수 있는지 확인합니다. 1. in_interrupt() 함수란? 결론적으로 말하면, 인터럽트 컨텍스트 구간이면 in_interrupt() 함수는 true를 반대면 false를 반환하는 함수입니다. 이 함수를 알고 있어야 하는 이유는 커널 코드 내에서는 수많은 함수를 호출되므로 함수 호출 흐름을 파악하기가 어렵습니다. 그렇기 때문에 커널 혹은 드라이버 코드에서 인터럽트 컨텍스트에서 실행 중인지 알기가 어렵습니다. 다시 인터럽트 컨텍스트에서 실행 중인지 확인이 필요한지 의문이 생깁니다. 그것은 인터럽트 서비스 루틴은 실행 중인 프로세스를 멈추고 동작하기 때문에, 커널 혹은 드..

IT/Linux Kernel 2025.05.20

The Programmer's Brain, 프로그래머의 뇌

안녕하세요. 1. 책 선택 이유 다른 프로그래머들의 뇌의 구조는 어떻게 되어 있는지, 프로그램 개발을 잘하기 위해서 프로그래머로 어떤 정신 상태를 가지고 있어야 하는지, 조금 참고하기 위해서 읽어보았습니다. 2. 간략한 내용 소개 인지과학을 활용한 개발자의 일머리 개선법 이 책은 인지과학에 기반을 둔 각종 방법론으로 개발자가 새로운 언어나 프레임워크를 빠르게 배워 생산성을 향상하도록 돕는다. 코드를 더 잘 이해하는 것에서 나아가, 버그 방지, 명확한 작명법, 리팩터링, 대규모 코드베이스 개선에 이르기까지 과학적으로 입증된 기법을 제시한다.- yes24 소개 내용 중 3. 책 속 내용과 생각 p7 – “지식이 없다는 것은 두뇌의 장기 기억 공간(long-term memory, LTM)에 해..

Book Report/IT&Tech 2025.05.18

[FreePBX] Python으로 AMI 프로그래밍 테스트 2 (이벤트 수신 및 처리 - 비동기 방식)

안녕하세요. 지난 글 "Python으로 FreePBX AMI 프로그래밍 테스트 1 (연결, Ping, 종료흐름)"에서는 Python의 socket 모듈을 사용하여 FreePBX AMI에 접속하고, 간단한 명령(Login, Ping, Logoff)을 실행하는 동기적인 기본 흐름을 살펴보았습니다. 하지만 전화 시스템의 상태 변화(예: 전화 수신, 통화 종료, 채널 상태 변경 등)를 실시간으로 감지하고 이에 맞게 처리하려면 조금 다른 접근 방식이 필요합니다. 바로 AMI가 지속적으로 보내주는 이벤트(Event)를 수신하고 처리하는 것입니다. 이번 글에서는 Python의 asyncio라이브러리를 활용하여 FreePBX AMI로부터 이벤트를 비동기적으로 수신하고, 특정 이벤트를 감지하여 처리하는 방법을..

[Qt] C++ 컨테이너 순회, '범위 기반 for' 사용 및 최적화 방법

안녕하세요. Qt/C++로 코딩하다 보면 std::vector나 QList 같은 컨테이너 안의 데이터들을 하나씩 검색 혹은 출력할 때가 있습니다. 예전에는 foreach (또는 Qt의 Q_FOREACH) 같은 방식을 쓰기도 했지만, 요즘 C++에서는 훨씬 더 깔끔하고 효율적인 방법이 있습니다. 바로 '범위 기반 for 루프'입니다. 이것을 사용하면 조금 더 코드가 좋아지는 이유와 Qt 사용자를 팁을 하나 공유해 보고자 합니다. 1. 예전 방식의 foreach, Q_FOREACH 예전에 쓰던 foreach나 Qt의 Q_FOREACH는 특정 컨테이너들을 순회할 때 편리했지만, 몇 가지 불편한 점이 있습니다. 모든 C++ 환경에서 똑같이 돌아가지 않을 수 있었고, 내부 동작이 복잡해서 코드를 읽거나 문..

Programming/Qt 2025.05.14

디버깅을 통해 배우는 리눅스 커널의 구조와 원리 1, 도서 공부하기 20 - 인터럽트(interrupt), 인터럽트 컨텍스트란?

안녕하세요. 프로세스에 관한 내용을 지나 5장 인터럽트 내용으로 왔습니다. 인터럽터가 OS에 중요한 부분을 차지하고 있으니 5, 6장에 걸쳐 소개하고 있습니다. 천천히 책 내용을 따라가 보겠습니다. 진도가 너무 느려져서, 요약하면서 조금 빠르게 진행해 보도록 하겠습니다. 1. 인터럽트 소개 인터럽터라는 단어 자체는 생활에서도 사용하고 있는 용어입니다. 끼어들다는 말로 사용하고 있습니다. 대화를 하는 중에 다른 사람이 와서 끼어들기도 하고 공부하는 중에 전화가 온다던지 이상생활에서 인터럽트가 발생합니다. 실제적으로 컴퓨터 입장에서 인터럽터를 확인해 보겠습니다. 1) 하드웨어 관점의 인터럽트 하드웨어 관정에서 인터럽트란 하드웨어의 변화를 감지해서 외부 입력으로 전달되는 전기 신호입니다. 예를 들..

IT/Linux Kernel 2025.05.13

RS485 통신에 대해서 알아보기

안녕하세요. 산업 현장이나 자동화 시스템에서 사용하는 통신 방식 중 하나인 RS485에 대해 알아보려고 합니다. 1. RS485란? RS485(Recommended Standard 485)는 직렬 통신(Serial Communication)을 위한 표준 중 하나입니다. 직렬 통신이란 데이터를 한 번에 한 비트씩 순서대로 주고받는 방식을 말합니다. RS485는 여러 장치 간(Multi-Point)에 상대적으로 먼 거리에서도 안정적으로 데이터를 주고받을 수 있도록 설계된 점이 특징입니다. 가장 큰 핵심 하나는 차동 신호(Differential Signaling) 방식을 사용한다는 것입니다. 이는 두 개의 전선(보통 A와 B로 표시)에 서로 반대되는 전압 신호를 보내고, 수신 측에서는 이 두 신호의..

[C++] 타입 캐스팅 (static_cast, dynamic_cast) 대하여

안녕하세요, 1. C++ 타입 캐스팅 필요성 C++은 타입 시스템을 가지고 있어, 서로 다른 타입 간의 데이터 교환이나 연산을 엄격하게 제한합니다. 하지만 때로는 프로그래머의 의도에 따라 타입을 변환해야 하는 경우가 발생합니다. 예를 들어, 부모 클래스 포인터가 실제로는 자식 클래스 객체를 가리키고 있을 때, 자식 클래스 고유의 멤버에 접근하려면 타입 변환이 필요합니다. 이럴 때 사용하는 것이 바로 타입 캐스팅 연산자입니다. C++ 에는 크게 네 가지의 명시적 타입 캐스팅 연산자가 있습니다. (1) static_cast(표현식) (2) dynamic_cast(표현식) (3) const_cast(표현식) (4) reinterpret_cast(표현식) 각각의 캐스팅 연산자는 사용 목적과 특징이 다르..

Programming/C, C++ 2025.05.10