편집 방침과 정정 이력
최종 수정일: 2026년 10월 31일
글을 쓰는 방식
명령어와 코드가 들어간 글은 가능한 한 직접 실행해서 본문과 대조합니다. 실행한 글에는 실행 환경(운영체제, 컴파일러·도구 버전)을 본문이나 이미지 캡션에 적습니다. 실행해 보지 못한 환경의 동작은 확인했다고 쓰지 않습니다. 초안 작성과 문장 다듬기에는 AI 도구를 보조로 쓰며, 게시 전 확인과 책임은 운영자에게 있습니다.
오류를 고치는 방식
틀린 내용을 발견하면 본문을 고치고 글의 수정일을 갱신합니다. 오탈자·오류 제보는 연락처로 받습니다. 사소한 표현 수정은 이력에 올리지 않고, 독자가 잘못 이해할 수 있었던 사실 오류만 아래에 기록합니다.
최근 정정 사례
2026년 10월에 공개 글을 실행해 보며 고친 것 중 일부입니다.
- cpp-invoke-apply — 멤버 데이터 포인터를 std::sort·transform에 바로 넘길 수 있다고 쓴 부분을 정정했습니다. 컴파일되지 않고 ranges 투영에서만 됩니다.
- cpp-series-11-1-file-io-basics — 열리지 않은 스트림에서 정수를 읽으면 0이 된다고 쓴 부분을 정정했습니다. 값은 그대로이고, 0이 되는 것은 형식 오류일 때입니다.
- cpp-cmake — "제너레이터 표현식 안의 공백은 에러"라는 서술이 CMake 3.30.3에서 재현되지 않아 고치고, 낮은 버전은 확인하지 못했다고 적었습니다.
- cpp-heap-corruption — glibc 2.34 이후에는 MALLOC_CHECK_ 변수만으로 동작하지 않고 LD_PRELOAD로 libc_malloc_debug.so.0을 불러야 한다는 점을 반영했습니다.
- tcp-connection-states-complete-guide — ss가 상태를 CLOSE-WAIT처럼 하이픈으로 출력하므로, grep 예시를 그에 맞게 고쳤습니다.
- git-push-rejected-non-fast-forward-fix — --allow-unrelated-histories만으로는 해결되지 않고 Git 2.54에서 divergent 안내와 함께 멈춘다는 점을 정정했습니다.
- git-interactive-rebase-practical-guide — rebase todo 형식, 빈 todo의 오류 메시지, zdiff3 충돌 마커 설명 세 곳을 실행 결과에 맞게 고쳤습니다.
- cpp-crtp-pattern — private 생성자 관용구의 오류는 클래스를 정의할 때가 아니라 객체를 만드는 시점에 난다는 점을 본문·예제·FAQ에서 바로잡았습니다.
- cpp-structured-binding — 구조적 바인딩 이름을 람다로 캡처하는 코드는 C++17 표준상 불가능하지만 Apple clang은 경고만 내고 통과한다는 점을 구분해 적었습니다.
- rust-case-study-01-ownership-debugging — RefCell 이중 빌림 panic 메시지가 컴파일러 버전에 따라 달라서 현재 출력으로 고쳤습니다.
- go-context-timeout-cancellation — Shutdown에 이미 취소된 컨텍스트를 넘기면 진행 중인 요청이 있을 때만 context canceled가 돌아오고, 요청이 없으면 nil이라는 점을 실행으로 확인해 덧붙였습니다.
- ros2-fast-dds-guide — fastdds discovery 명령의 포트 옵션을 --port에서 실제 옵션인 --udp-port로 고쳤고, tcpdump 포트 대역(7400번대)이 Domain ID 0일 때의 값임을 명시했습니다.
- ubuntu-apt-could-not-get-lock-fix — 우분투 24.04.5(apt 2.8.3)에서는 잠금 오류에 N: 안내 줄이 나오지 않는다는 점을 실행으로 확인해 반영했습니다.
- gstreamer-library-practical-guide — gst-launch-1.0에 파이프라인 전체를 따옴표 하나로 넘겨도 똑같이 동작한다는 설명을 정정했습니다. GStreamer 1.24.2에서는 syntax error가 나고, 파일이 없을 때는 set_state가 바로 실패를 돌려주기도 합니다.
- cpp-constexpr-function — constexpr 함수 안의 static 지역 변수가 C++14부터 허용된다는 설명을 정정했습니다. g++ 13.3에서 C++11·14·20은 오류이고 C++23부터 정의가 허용됩니다. 직접 겪었다고 쓴 경험담 두 건은 컴파일러 실험 결과로 바꿨습니다.
- ros2-gazebo-docker-simulation-setup-guide — desktop-full 이미지에 Gazebo Classic이 들어 있다는 설명을 정정했습니다. desktop-full은 새 Gazebo(Fortress)이고 Classic은 turtlebot3-simulations 설치 때 함께 들어옵니다. 또 arm64에서는 해당 패키지가 저장소에 없어 Dockerfile이 실패한다는 점을 추가했습니다.
- network-protocol-ftp-practical-guide — PASV 응답에 내부 IP가 있으면 연결이 실패한다는 설명을 정정했습니다. 컨테이너에서 curl 8.5.0과 lftp 4.9.2는 응답의 IP를 무시하고 제어 연결 주소를 써서 성공했고, 해당 동작을 끄면 실패했습니다. vsftpd 설정의 줄 끝 주석 오류도 직접 재현해 확인한 범위(데몬 종료)만 남겼습니다.
- cpp-noexcept-specifier — 한 클래스에 이동 생성자를 두 개 선언한 예제는 컴파일되지 않아 SlowWidget·FastWidget으로 나눴습니다. 또 복사 생성자를 지우면 noexcept가 없어도 vector가 이동을 쓰므로, 복사 생성자를 둔 상태에서 비교하도록 고쳤습니다. g++ 13.3에서 컴파일로 확인했습니다.
- cpp-span-guide — span<int>를 반환하는 함수에서 return v;(vector 지역 변수)는 g++ 13.3에서 컴파일 오류이므로, 댕글링을 보여 주려는 의도에 맞게 std::span<int>(v)로 명시했습니다.
- tcp-connection-states-complete-guide — tcp_tw_reuse의 기본값이 최근 커널에서는 2(루프백 연결에만 재사용)라는 점을 "기본 동작" 설명에도 반영했습니다. 컨테이너 커널의 syn_retries·keepalive 기본값 등은 글대로임을 확인했습니다.
- cpp-network-guide-04-post-dispatch-defer — defer와 post는 순서도 같다는 설명을 정정했습니다. Boost 1.83의 기본 io_context에서 한 핸들러가 defer, post, defer, post 순으로 부르면 post 두 개가 먼저 실행됐고, 동시성 힌트 1에서만 호출 순서와 같았습니다.
- ros2-gazebo-docker-simulation-setup-guide — network_mode: host를 빼면 노드끼리 못 찾는다는 설명에 환경 조건을 달았습니다. OrbStack의 arm64 컨테이너에서는 bridge, 사용자 정의 bridge, host, host+ipc 네 방식 모두 토픽을 찾고 데이터를 받았습니다.
- cpp-linker-error-guide — 일반 ar로 만든 LTO 아카이브는 심볼 인덱스가 비어 링크가 실패한다는 설명에 조건을 달았습니다. Ubuntu 24.04(binutils 2.42, GCC 13.3)에서는 일반 ar도 인덱스를 만들어 링크가 성공했고, 플러그인을 자동으로 불러오지 못하는 환경에서만 gcc-ar가 필요합니다.
- cpp-series-30-3-protocol-serialization — 패킹한 구조체 멤버의 주소를 꺼내면 GCC가 항상 경고한다는 설명을 정정했습니다. GCC 13.3에서 __attribute__((packed))에는 경고가 나오지만 #pragma pack(push, 1)로 만든 구조체에는 경고가 나오지 않았습니다.
- docker-networking-guide — 사용자 정의 bridge는 격리된 서브넷을 제공한다는 설명에 환경 조건을 달았습니다. 맥의 OrbStack(Docker Engine 29.8.2)에서는 서로 다른 사용자 정의 네트워크의 컨테이너끼리 IP로 ping이 통해 격리가 확인되지 않았고, 기본 bridge 서브넷도 172.17.0.0/16이 아니었습니다.
- network-protocol-ssh-secure-remote — ControlMaster가 살아 있는 동안 두 번째 ssh의 -L 포워딩이 조용히 무시되는 경우가 있다는 설명을 정정했습니다. OpenSSH 9.6에서는 -L, -R, -D와 설정 파일의 LocalForward 모두 기존 마스터를 통해 적용됐습니다. 소켓 경로 길이 제한은 108바이트 이상일 때 오류가 나는 것을 확인해 구체적으로 적었습니다.
- cpp-expression-templates — 표현식 템플릿이 일반 구현보다 몇 배 빠른 경우가 흔하다는 설명에 비교 대상을 명시했습니다. g++ 13.3 -O2에서 임시 객체를 둘 만드는 구현과는 약 3.6배였지만, 이동 오버로드로 버퍼를 재사용하면 약 1.4~1.6배로 좁혀졌고 -O0에서는 오히려 느렸습니다.
- ubuntu-kitty-terminal-tips — 설치 방법 세 가지 중 세 번째로 소개한 ppa:example/kitty는 실제로 없는 PPA였습니다(ppa example/kitty not found). 해당 항목을 삭제하고, apt 패키지(0.32.2)와 공식 설치 스크립트(0.49.2)의 버전 차이를 직접 확인한 값으로 바꿨습니다.
- libvda5050pp-adapter-guide — 블로킹 액션이 FAILED로 끝나면 다음 구간으로 못 간다는 식의 점검 순서를 정정했습니다. libVDA5050++ 2.11.3에서 FAILED로 끝난 노드 액션은 order를 멈추지 않았고, 차량이 다음 노드로 가서 그 노드의 액션을 실행했습니다. 멈춘 것처럼 보이는 원인은 핸들러가 완료를 알리지 않아 액션이 RUNNING에 남는 경우입니다.
- vda5050-protocol-cpp-guide — 토픽 표의 QoS·Retain 열을 모두 표준 값처럼 적은 부분을 정정했습니다. VDA5050 2.0.0 6.2절이 QoS를 정한 토픽은 order·state·visualization(0)과 connection(1)이고, Retain은 connection에만 명시되어 있습니다. instantActions·factsheet의 값과 order·instantActions의 비Retain은 표준에 없는 실무 설정이라고 구분해 적었습니다.
- vda5050-order-action-pick-handling — blockingType SOFT를 "이동을 먼저 시작해도 되는" 제약으로, NONE·SOFT 액션이 HARD 액션과 동시에 시작할 수 있다고 쓴 부분을 정정했습니다. 표준 6.12절은 SOFT를 다른 액션과 병렬이지만 주행은 불가로, HARD를 다른 액션과 병렬 불가로 정의합니다. libVDA5050++ 2.11.3 시뮬레이터에서도 SOFT 엣지 액션이 끝난 뒤에야 출발했고 HARD는 앞뒤 액션과 직렬로 실행됐습니다.
- vda5050-custom-data-information-guide — blockingType을 SOFT로 지정하면 차량을 멈추지 않고 주행 중에 진단 액션을 실행할 수 있다고 쓴 부분을 정정했습니다. SOFT는 다른 액션과 병렬이지만 그동안 차량이 주행하지 않으며, 주행과 병행하려면 NONE이어야 합니다.
광고와 수익
이 사이트는 Google AdSense 광고 수익으로 운영비를 충당합니다. 광고는 글 본문과 구분되며, 광고 여부가 글의 내용에 영향을 주지 않도록 씁니다. 자세한 내용은 개인정보처리방침과 면책 조항을 참고하세요.