람다와 클로저 — 캡처·std::function·제네릭 람다
람다가 컴파일러가 만드는 '클로저 객체'(operator()를 가진 익명 타입)라는 실체에서 출발해, 캡처 방식([=]/[&]/init-capture)과 [&] 댕글링 함정, 여러 호출 가능 객체를 한 타입에 담는 std::function의 비용, C++14 제네릭 람다까지 C++ 관점으로 정리한다.
람다가 컴파일러가 만드는 '클로저 객체'(operator()를 가진 익명 타입)라는 실체에서 출발해, 캡처 방식([=]/[&]/init-capture)과 [&] 댕글링 함정, 여러 호출 가능 객체를 한 타입에 담는 std::function의 비용, C++14 제네릭 람다까지 C++ 관점으로 정리한다.
RAII의 동기로만 스치던 예외를 정면으로 다룬다. throw/try/catch 기본, 예외가 스택을 거슬러 오를 때 소멸자가 자원을 정리하는 스택 언와인딩, 예외 안전 3등급(basic·strong·nothrow), 그리고 noexcept가 왜 이동 생성자와 vector 성능에까지 얽히는지 정리한다.
org-mode가 '단일 통합 시스템'으로 독보적인 반면 Neovim은 플러그인을 조합해 PKM을 구성한다. 평문 마크다운·로컬 저장이라 Neovim과 충돌 없이 공존하는 Obsidian을 중심으로, 왜 갈아타기보다 병행이 자연스러운지 정리한다.
DAP(Debug Adapter Protocol)는 LSP와 같은 뿌리(VS Code)에서 나온 디버깅용 표준이다. nvim-dap 플러그인 스택, 언어별 어댑터(debugpy·delve·codelldb), 그리고 LSP와 결정적으로 다른 '세션 중에만 뜨는' 생명주기를 정리한다.
세 XSS의 갈림길은 '악성 스크립트가 어디서 페이지에 삽입되는가'다. 서버 응답이면 Reflected, 저장 후 전달이면 Stored, 클라이언트 JS의 DOM 조작이면 DOM-based. View Source로 구분하는 법과, DOM-based를 관통하는 Source→Sink 흐름을 정리한다.
hunk는 diff에서 @@로 구분되는 연속 변경 덩어리다. 이 단위를 알면 한 파일에 뒤섞인 여러 변경을 git add -p로 골라 커밋을 깔끔하게 나눌 수 있다. 개념과 CLI 흐름을 정리하고, 에디터(gitsigns) 쪽은 별도 글로 잇는다.
내가 단 댓글·연 PR·리뷰 요청받은 것을 한 번에 보는 검색 필터(involves:/author:/review-requested:)와 UI 탭 위치, 그리고 쓸데없는 릴리스 알림의 정체(Star가 아니라 Watch)를 정리한다.
둘 다 공개키+대칭키로 안전한 채널을 만들지만, SSH는 원격 접속까지 통합한 완결형 L7 프로토콜이고 TLS는 어떤 앱이든 감싸는 범용 보안 계층이다. 'SSH가 SSL 기반이냐'는 흔한 오해를 계층 구조로 정리한다.
gradlew bootRun에 -Xmx나 시스템 프로퍼티를 넘기려다 --args가 안 먹는 이유를 파헤친다. 핵심은 bootRun이 Gradle 데몬 JVM과 앱 JVM 두 개를 띄운다는 것. --args(앱 인자)와 -Dspring-boot.run.jvmArguments(앱 JVM 옵션)가 각각 어디로 흘러가는지, 왜 java -jar에는 그런 래핑이 필요 없는지 정리한다.
컬렉션의 내부 구조를 노출하지 않고 원소를 하나씩 훑는 공통 인터페이스가 이터레이터다. 거기에 map·filter를 지연(lazy)으로 엮으면 중간 컬렉션 없이 한 번에 훑는다. C++ STL 이터레이터·알고리즘에 넘기던 그 람다가 Rust Iterator 어댑터의 클로저이고, C++20 ranges의 지연 view가 Rust에선 언어 중심이 된 과정을 대응시킨다.