Windows 95 플러그 앤 플레이 뒤에 숨겨진 저작권 전쟁

2025-06-29
Windows 95 플러그 앤 플레이 뒤에 숨겨진 저작권 전쟁

Windows 95에서 플러그 앤 플레이를 구현하는 것은 쉬운 일이 아니었습니다. 오래된 하드웨어를 새로운 기능과 호환되도록 하기 위해 엔지니어들은 정교한 해결책을 사용했습니다. 흥미로운 예로, 제조업체들이 BIOS에 "Not Copyright Fabrikam Computer" 문자열을 추가하여 LitWare Word Processor의 라이선스 확인을 속이고, 라이선스가 없는 Fabrikam PC에서도 정식 버전을 사용하도록 한 사례가 있습니다. 이는 초기 PC 호환성의 어려움과 제조업체들이 소프트웨어 라이선스를 얻기 위해 기울인 노력을 보여줍니다.

더 보기

Contoso의 "영구" 삭제: 사실 영구적이지 않았다

2025-06-25
Contoso의

10개월 전, Contoso 계정을 삭제하고 데이터가 영구적이고 되돌릴 수 없게 삭제되었다는 확인을 받았습니다. 어제 Contoso로부터 개인정보 보호정책 업데이트에 대한 이메일을 받았습니다. 영구 삭제 주장은 분명 성급했으며, 여전히 제 이메일 주소를 보유하고 있습니다. 이는 데이터 프라이버시와 기업 약속의 신뢰성에 대한 심각한 의문을 제기합니다.

더 보기
기타

C++ 템플릿 상속과 복사 생성자: 혼란스러운 static_assert

2025-06-10
C++ 템플릿 상속과 복사 생성자: 혼란스러운 static_assert

이 글에서는 C++ 템플릿 상속에서 복사 생성자와 관련된 혼란스러운 문제를 설명합니다. `Derived` 클래스는 `Base` 클래스를 상속받는데, `Base` 클래스의 복사 생성자는 삭제되었습니다. 그러나 `Derived` 클래스는 자체 복사 생성자를 정의합니다. 이 생성자는 복사할 수 없는 `Base` 객체를 복사하려고 시도하지만, `std::is_copy_constructible`은 여전히 true를 반환합니다. 이는 컴파일러가 삭제되지 않은 복사 생성자의 존재만 확인하고 인스턴스화 가능성은 확인하지 않기 때문입니다. 또한 명시적으로 정의된 복사 생성자와 암시적으로 정의된 복사 생성자의 차이점과 복사 생성자 정의를 인라인하지 않는 것의 영향에 대해서도 설명합니다.

더 보기

프로젝트 파일 없이 C# 코드 실행: .NET 10 Preview 4

2025-05-29
프로젝트 파일 없이 C# 코드 실행: .NET 10 Preview 4

.NET 10 Preview 4는 획기적인 기능을 제공합니다. `dotnet run app.cs`를 사용하여 C# 파일을 직접 실행할 수 있습니다. 프로젝트 파일이나 스캐폴딩을 만들 필요가 없습니다! 이를 통해 C# 진입 장벽이 크게 낮아져 학습, 프로토타이핑, 간단한 스크립트에 이상적입니다. `#:package`, `#:sdk`, `#:property`와 같은 강력한 파일 수준 지시문을 사용하여 NuGet 패키지, SDK, MSBuild 속성을 .cs 파일 내에서 직접 관리할 수 있으며, 기존 MSBuild 개념과의 호환성을 유지합니다. 스크립트가 완벽한 애플리케이션으로 성장하더라도 프로젝트 기반 애플리케이션으로의 원활한 변환이 지원됩니다. 이 간소화된 워크플로우를 통해 C# 개발 환경이 간소화되어 CLI 유틸리티, 자동화 스크립트 등에 매우 편리합니다.

더 보기

Windows 11에 새로운 명령줄 텍스트 에디터 Edit 추가

2025-05-19
Windows 11에 새로운 명령줄 텍스트 에디터 Edit 추가

마이크로소프트는 64비트 Windows용 새로운 경량 명령줄 텍스트 에디터인 Edit을 출시했습니다. 250KB 미만의 이 오픈소스 에디터는 마우스 지원, 여러 파일 열기, 찾기 및 바꾸기, 워드 랩 기능을 제공하며, Vim과 같은 모달 에디터의 가파른 학습 곡선을 피하기 위해 모드리스 디자인을 채택했습니다. 향후 몇 달 동안 Windows Insider Program을 통해 미리 보기가 제공되며, 최종적으로 Windows 11에 기본적으로 포함될 예정입니다.

더 보기

추억의 MS-DOS 아이콘: 프로그램 관리자보다 유용한가?

2025-05-16
추억의 MS-DOS 아이콘: 프로그램 관리자보다 유용한가?

한 사용자가 MS-DOS 아이콘 세트가 프로그램 관리자의 기본 세트보다 더 실용적이라고 주장하는 자신만의 관점을 공유했습니다. Microsoft Basic Compiler, Microsoft Project, Close-Up 4.0 등의 아이콘이 예시로 제시되었으며, 이들의 역사적 사용법이 강조되었습니다. 작성자는 시대에 뒤떨어진 MS-DOS 로고나 부적절한 오버레이와 같은 디자인 결함을 지적합니다. 이는 오래된 소프트웨어의 UI 디자인과 향수에 대한 논의를 불러일으킵니다.

더 보기
기타

Windows 7 로그인 지연의 미스터리: 단색 배경이 범인일까?

2025-04-29
Windows 7 로그인 지연의 미스터리: 단색 배경이 범인일까?

Windows 95부터 단색 배경을 사용해 온 저자는 Windows 7에서 단색 배경 화면을 사용할 때 시작 화면에 30초 지연이 발생하는 것을 발견했습니다. 이는 로그인 시간이 길어진 것이 아니라, 시스템이 배경 화면 로딩 완료 신호를 기다리는 동안 발생하는 시간 초과입니다. 비트맵 정보가 없는 단색 배경 화면은 이 신호를 보낼 수 없습니다. "바탕 화면 아이콘 숨기기" 그룹 정책에도 유사한 문제가 있으며, 코딩 오류로 인해 준비 완료 신호가 전송되지 않습니다. Microsoft는 Windows 7 출시 후 몇 달 만에 이 문제를 해결했습니다. 또한 저자는 버그 보고 및 수정을 용이하게 하기 위해 기본 설정을 선호하는 이유도 설명합니다.

더 보기

자신의 프로세스에서 스레드를 일시 중지하지 마세요!

2025-04-15
자신의 프로세스에서 스레드를 일시 중지하지 마세요!

한 고객이 오랫동안 지속되는 저빈도 멈춤 문제를 겪었습니다. UI 스레드가 커널을 호출한 후 아무런 이유 없이 멈췄습니다. 안타깝게도 커널 덤프에서는 스택이 페이지 아웃되었기 때문에 사용자 모드의 스택을 표시할 수 없었습니다. (멈춘 스레드는 스택을 사용하지 않으므로, 시스템이 메모리 부족 상태가 되면 스택이 페이지 아웃됩니다.) 조사 결과, 워치독 스레드가 UI 스레드를 주기적으로 일시 중지하여 스택 추적을 가져오고 있었지만, 이번에는 5시간 이상 멈췄습니다. 원인은 데드락이었습니다. 워치독 스레드는 UI 스레드의 스택 추적을 가져오려고 했지만, 함수 테이블 잠금이 필요했습니다. 그러나 UI 스레드는 일시 중지되어 있었고, 해당 잠금을 보유하고 있었습니다. 이 문서에서는 자체 프로세스에서 스레드를 일시 중지하지 않도록 강조합니다. 리소스 충돌로 인해 데드락이 발생할 위험이 있기 때문입니다. 스레드를 일시 중지하고 스택 추적을 가져와야 하는 경우, 데드락을 방지하기 위해 다른 프로세스에서 실행해야 합니다.

더 보기

수수께끼의 수동형 USB-PS/2 마우스 어댑터

2025-03-28
수수께끼의 수동형 USB-PS/2 마우스 어댑터

초기 USB 마우스에는 USB Type-A 플러그를 PS/2로 변환하는 녹색 어댑터가 함께 제공되는 경우가 많았습니다. 이것은 스마트 어댑터가 아니었고, 순수하게 기계적인 것으로 회로가 포함되어 있지 않았습니다. 마우스 자체가 변환을 수행하여 신호 유형(USB 또는 PS/2)을 감지하고 그에 따라 조정했습니다. 이것은 간단한 전원 어댑터와 유사하며, 지능은 장치 자체에 있고 어댑터에는 없습니다. 따라서 이러한 것을 발견하면 단순히 물리적 커넥터일 뿐이라는 것을 기억하십시오. 실제 변환은 듀얼 버스 마우스 내부에서 이루어집니다.

더 보기
하드웨어 마우스 어댑터

경쟁 조건 디버깅: RtlRunOnceExecuteOnce 함정

2025-03-23
경쟁 조건 디버깅: RtlRunOnceExecuteOnce 함정

동료가 주간 디버깅 세션에서 다루기 어려운 동시성 문제를 만났습니다. 크리티컬 섹션이 두 개의 스레드가 동일한 코드 블록에 진입하는 것을 막지 못하여 `TraceLoggingRegister`의 이중 등록 오류가 발생했습니다. 심층 디버깅을 통해 근본 원인이 밝혀졌습니다. `RtlRunOnceExecuteOnce`의 초기화 함수 `InitializeCriticalSectionOnce`가 `STATUS_SUCCESS`(0)를 잘못 반환했습니다. 이로 인해 `RtlRunOnceExecuteOnce`는 초기화에 실패했다고 판단하고 매번 크리티컬 섹션을 다시 초기화하여 경쟁 조건을 발생시켰습니다. 해결책은 반환값을 `TRUE`로 변경하거나, 더욱 효율적으로 `CRITICAL_SECTION`을 `SRWLOCK`으로 대체하는 것입니다. 이 사례는 반환값의 미세한 오류가 심각한 결과로 이어질 수 있음을 보여주며, 적절한 동기화 프리미티브를 선택하는 것이 중요함을 강조합니다.

더 보기
개발

TypeScript 네이티브 컴파일러: 성능 10배 향상

2025-03-11
TypeScript 네이티브 컴파일러: 성능 10배 향상

TypeScript 팀은 TypeScript 컴파일러와 도구의 네이티브 포팅을 발표하여 성능을 획기적으로 개선했습니다. 이 네이티브 구현은 에디터 시작 시간을 대폭 단축하고, 대부분의 빌드 시간을 10배 줄이며, 메모리 사용량을 상당히 줄일 것으로 예상됩니다. 초기 테스트 결과 여러 대규모 프로젝트(예: VS Code, Playwright)의 컴파일 속도가 10배 이상 향상되었습니다. 미래의 네이티브 TypeScript(TypeScript 7로 계획)는 더욱 고급 리팩토링, 더욱 심도 있는 코드 분석을 지원하고 차세대 AI 개발 도구의 기반이 될 것입니다. TypeScript 6(JS 기반)는 원활한 전환을 위해 계속 유지 관리될 것입니다.

더 보기

C++/WinRT의 미묘한 invoke 문제와 해결책

2025-03-09
C++/WinRT의 미묘한 invoke 문제와 해결책

C++/WinRT의 pull request를 통해 `winrt::impl::promise_base::set_completed`에서 `invoke` 호출의 모호성이 수정되었습니다. 이는 인수 종속 조회(ADL)로 인해 발생했습니다. C++20 코루틴으로 업그레이드하면서 ADL 검색 범위가 확장되어 의도한 `winrt::impl::invoke` 대신 `std::invoke`가 잘못 감지되었습니다. 이 기사에서는 ADL 메커니즘을 자세히 설명하고 이전 버전의 C++/WinRT에 대한 패치를 제공합니다. `winrt::Windows::Foundation` 네임스페이스에 더 적합하게 일치하는 `invoke` 함수를 선언하여 컴파일러를 올바른 함수로 유도합니다. 이 패치에는 C++/WinRT 업그레이드 후 자동으로 무효화되는 정적 어설션도 포함되어 있습니다.

더 보기
개발

열거형의 "기타" 함정: 버전 호환성과 열린 열거형

2025-03-02
열거형의

이 글에서는 C++ 열거형에서 "기타" 값(예: WidgetFlavor::Other)을 사용하는 것의 잠재적 문제점을 논의합니다. 새로운 열거형 값을 추가할 때 이 값들을 어떻게 처리하고 이전 버전 코드와의 호환성을 유지할지가 과제입니다. 저자는 "기타" 값을 피하고 열거형을 열린 형태로 선언할 것을 권장합니다. 이렇게 하면 프로그램이 알 수 없는 값을 독자적으로 처리할 수 있게 되어 버전 호환성 문제를 우아하게 해결할 수 있습니다. 새로운 열거형 값을 추가할 때 혼란을 방지하고 기존 코드와 새 코드 간의 원활한 전환을 보장합니다.

더 보기

MSVC Address Sanitizer (ASan)의 주요 개선 사항

2025-02-25
MSVC Address Sanitizer (ASan)의 주요 개선 사항

마이크로소프트는 MSVC Address Sanitizer (ASan)의 품질을 크게 향상시켰습니다. ASan의 주요 부분을 LLVM으로 업스트림하여 LLVM 커뮤니티의 개선 사항을 더 빠르게 통합할 수 있게 되었습니다. 또한, 컴파일러, 링커, 도구를 포함한 MSVC 코드베이스에 ASan을 통합하여 지속적인 통합에서 메모리 안전성 문제를 감지할 수 있도록 했습니다. Visual Studio 2022 버전 17.13에는 오탐 감소, 오류 보고 개선, 다중 프로세스 시나리오 처리 등 많은 문제가 수정되었습니다.

더 보기
개발

Windows 95 설치 프로그램: 놀랍도록 복잡한 미니 OS의 이야기

2025-02-17
Windows 95 설치 프로그램: 놀랍도록 복잡한 미니 OS의 이야기

이 글은 Windows 95 설치 프로그램의 숨겨진 복잡성을 드러냅니다. 단순해 보이는 설치 프로그램을 만들기 위해, 팀은 MS-DOS 환경에서 그래픽 라이브러리, 윈도우 매니저, 다국어 지원, 심지어 Windows 3.1과의 호환성을 포함한 미니 운영체제를 처음부터 만들어야 했습니다. 결국 막대한 개발 노력을 피하기 위해 기존 Windows 3.1 런타임을 사용하는 것이 훨씬 효율적이라는 것을 깨달았습니다. 이 이야기는 소프트웨어 엔지니어링에서 코드 재사용의 중요성을 강조하고 Windows 95 설치 프로그램의 놀라울 정도로 복잡한 특성을 보여줍니다.

더 보기
개발

'이제 컴퓨터를 꺼도 안전합니다' 화면: Windows 95 향수 여행

2025-02-16
'이제 컴퓨터를 꺼도 안전합니다' 화면: Windows 95 향수 여행

Windows 95의 '이제 컴퓨터를 꺼도 안전합니다' 메시지를 기억하시나요? 이 글에서는 비행기에서 옆자리에 앉았던 사람이 'Windows가 종료되었습니다' 화면을 보고 컴퓨터를 여러 번 재시작했던 재밌는 이야기를 소개합니다. 이는 오래된 컴퓨터에 전원 관리 기능이 없었음을 보여주며, Windows 95가 이 메시지를 포함시켰던 이유를 설명합니다. 전원 버튼을 눌러도 안전하다는 것을 친절하게 알려주는 메시지였던 것입니다.

더 보기
기술

USB 규격 회의 일화: 반투명 파란색의 프리미엄

2025-02-10
USB 규격 회의 일화: 반투명 파란색의 프리미엄

USB 규격 회의에서 한 회사가 USB 플로피 드라이브를 선보였는데, 놀랍게도 PC와 Mac용 별도 버전을 제공했습니다. 위원회 구성원들은 당황했습니다. 규격에서 동일한 드라이브가 두 시스템 모두에서 작동하는 것이 보장되었기 때문입니다. 담당자는 드라이브는 전자적으로 동일하며, 유일한 차이점은 Mac 버전이 반투명 파란색 플라스틱으로 되어 있고 가격이 더 높다는 것을 설명했습니다. 이는 당시 iMac의 반투명 플라스틱 유행을 반영하며, 일부 제조업체가 디자인 차이를 가격 프리미엄으로 활용했음을 보여줍니다.

더 보기
하드웨어 플로피 드라이브

미사일 소프트웨어의 '널 가비지 컬렉터': 메모리 누수? 문제 없어요!

2025-02-07
미사일 소프트웨어의 '널 가비지 컬렉터': 메모리 누수? 문제 없어요!

개발자가 미사일 소프트웨어에서 '널 가비지 컬렉터'를 기발하게 적용한 사례를 설명합니다. 비행 시간이 제한적이고 하드웨어 메모리가 충분하기 때문에 프로그램의 메모리 누수는 문제가 되지 않았습니다. 엔지니어들은 비행 중 발생할 수 있는 잠재적 메모리 누수량을 계산하고, 그 두 배의 메모리를 추가하여 미션 완료 전에 프로그램이 충돌하지 않도록 했습니다. 이러한 접근 방식은 프로그램의 실행 시간 제약을 영리하게 활용하여 메모리 누수 문제를 효과적으로 해결했습니다. 일종의 '궁극적인 가비지 컬렉션'이라고 할 수 있습니다.

더 보기

Go 1.24 암호화 개선: FIPS 140-3 준수 달성

2025-02-06

Go 1.24는 암호화 패키지를 대대적으로 리팩토링하여 FIPS 140-3 준수를 달성했습니다. 순수 Go(및 Go 어셈블리)로 구현된 FIPS 140-3 검증 암호화 모듈을 통해 cgo나 시스템 호출에 대한 의존성을 제거한 것이 주요 특징입니다. Microsoft Go 1.24도 업데이트되어 macOS 미리 보기 지원과 향상된 Azure Linux 지원이 추가되었지만, 암호화에는 시스템 라이브러리를 계속 사용하며 공식 Go 방식과는 다릅니다. GODEBUG=fips140=on이나 GOFIPS140=latest와 같은 새로운 환경 변수는 FIPS 모드를 제어합니다. FIPS 준수 시스템(Azure Linux, Windows)에서는 런타임이 자동으로 활성화됩니다.

더 보기
개발

Windows 3D Pipes 화면 보호기의 숨겨진 디자인 결함과 찻주전자

2024-12-28
Windows 3D Pipes 화면 보호기의 숨겨진 디자인 결함과 찻주전자

매혹적인 파이프 애니메이션으로 유명한 Windows 3D Pipes 화면 보호기에는 잘 알려지지 않은 비밀이 숨겨져 있습니다. 바로 거의 나타나지 않는 찻주전자입니다. 이 찻주전자는 컴퓨터 그래픽스에서 표준 참조 객체인 유타 찻주전자에 대한 경의이지만, 출현 빈도가 낮아 생산성 저하에 대한 사용자 불만이 제기되었습니다. 이 기사에서는 이전 버전의 Windows에서는 소프트웨어 렌더링으로 인해 서버의 CPU 사용률이 높아지는 것도 밝히고 있으며, 서버에는 검은색 화면 보호기를 사용할 것을 권장하고 있습니다.

더 보기

C++ 컴파일러 오류: 함수 선언으로 인한 무의미한 오류

2024-12-12
C++ 컴파일러 오류: 함수 선언으로 인한 무의미한 오류

C++ 애플리케이션에 XAML 지원을 추가하려던 개발자는 winrt/Windows.UI.Xaml.h 헤더 파일을 포함하기만 해도 일련의 컴파일러 오류를 만났습니다. 오류는 다음과 같이 보이는 일반적인 함수 선언에서 발생했습니다. `template struct consume_Windows_UI_Xaml_IExceptionRoutedEventArgs { [[nodiscard]] auto ErrorMessage() const; };` 근본 원인은 개발자 프로젝트에 이미 존재하는 ErrorMessage라는 매크로였는데, 함수 이름과 충돌했습니다. 이 매크로는 ErrorMessageString 객체를 만들고 에러 메시지 문자열에 대한 포인터를 반환했습니다. 매크로의 경계가 없기 때문에 컴파일러는 함수 선언을 매크로 호출로 잘못 해석하여 "인수가 부족합니다"와 같은 오류가 발생했습니다. 해결책은 헤더 파일을 포함하기 전에 #pragma undef를 사용하여 매크로를 비활성화하거나 매크로를 완전히 제거하고 인라인 함수로 바꾸는 것입니다.

더 보기