The Daily WTF 한국어 노트

The Daily WTF 한국어

Daily WTF는 알렉스 파파디무리스가 소프트웨어 개발과 기술 세계에 대한 이야기를 기반으로 하는 프로그래밍 지향적 유머 블로그입니다. 주로 프로젝트 문제, 코드 예제 및 IT와 관련된 재미있는 이야기를 중심으로 합니다. 이 사이트에는 많은 개발자들이 직장에서 경험한 이상하고 재미있는 일화들을 포함하는 광범위한 컬렉션을 보유하고 있습니다. 이러한 경험은 항상 기술과 관련이 있지만 기술적이거나 개인적인 측면에서 다양한 경우를 포함합니다.

노트 스레드

저자는 잘못된 날짜 입력 및 계산과 관련된 여러 "오류"를 받았습니다. Tim R.은 시간대 변환을 위해 설계된 웹사이트를 강조했지만, 한 시간 차이로 인해 실패했습니다. 익명의 독자는 날짜 이상 현상을 보여주는 스크린샷을 공유하며, 빅테크에 대한 불신과 Microsoft 데이터를 수동으로 삭제하는 관행을 강화했습니다. Daniel D.는 6월이 30일까지밖에 없음에도 불구하고 "6월 31일"을 거부한 날짜 계산기를 만났고, 날짜 차이 계산의 신뢰성에 의문을 제기했습니다. Daniel D.는 또한 중앙 유럽의 한 전자상거래 웹사이트가 무작위로 "시간"과 "초" 사이의 배터리 수명 필터를 전환하는 기이한 현상을 지적했습니다. Marc Würth는 표준 날짜 순서를 뒤집고 슬래시 대신 대시를 사용하는 것으로 보이는 Network Solutions 도메인 기록 날짜 형식의 특이점을 발견했습니다. 이러한 사례들은 날짜 및 시간 처리와 관련된 다양하고 우스꽝스럽지만 좌절스러운 소프트웨어 버그를 집합적으로 보여줍니다. 오류는 단순한 오차부터 완전히 비논리적인 날짜 거부까지 다양했습니다. 이러한 불일치는 사용자 불신을 초래하고 효율적인 데이터 처리를 방해합니다. 이 기사는 소프트웨어 개발, 특히 명백히 간단한 데이터 유형에서 지속적인 과제를 상기시키는 역할을 합니다.
CdXz5zHNQW_vNtMRaVOyt.png
Kris W.는 Amazon Spain이 그의 개인 계정에 등록된 오래된 VAT 번호 때문에 이를 역내 EU 사업 거래로 분류하여 주방 칼을 낮은 VAT 면세 가격으로 청구하면서 예상치 못한 세금 문제를 겪었습니다. 이 VAT 번호는 더 이상 그의 계정 설정에서 보이지 않아 관리할 수 없었습니다. Amazon의 고객 지원 챗봇과 상담원은 국제 여행객이나 군인에게 일반적으로 요구되는 광범위한 서류를 요구하는 등 상반되고 도움이 되지 않는 조언을 제공했습니다.Amazon의 공식 도움말 페이지를 따라 Kris는 이미 고객 서비스에서 제거할 수 없다는 말을 들었음에도 불구하고 Amazon Business 계정을 생성하여 VAT 번호를 제거하려고 시도했습니다. Business 계정 등록 중에 Amazon은 설명할 수 없는 이유로 그가 제거하려는 바로 그 VAT 번호를 다시 입력하도록 요구했습니다. 사업체를 확인하기 위해 스페인 정부 공식 인증서를 제출한 후, 그의 Business 계정은 마침내 승인되었습니다.그러나 그의 새 Business 계정에 있는 전용 VAT 관리 페이지는 기존 VAT 번호를 편집하거나 삭제할 수 있는 옵션을 제공하지 않았습니다. 대신, "세금 ID를 변경하려면 고객 서비스에 문의하십시오"라는 링크만 제공했습니다. 이는 고객 서비스에서 이미 VAT 번호를 제거할 수 없다고 밝혔기 때문에 Kris를 원점으로 되돌렸습니다.Kris의 경험은 Amazon이 세금 정보를 관리하기 위해 만든 복잡하고 순환적인 프로세스를 강조하며, 고객을 도움이 되지 않는 지원과 작동하지 않는 셀프 서비스 옵션의 좌절스러운 루프로 몰아넣고 있습니다.
CdXz5zHNQW_Cw9oRz8am2.png
Dr. Doom은 틱톡 웹페이지의 "둠 스크롤바"라고 부르는 것에 대해 논평하며 스크린샷에 유머러스하게 "Scrollbar-ception"이라는 제목을 붙였습니다. 그는 처음에는 이를 둠 스크롤링의 소셜 미디어 예시로 제시했지만, 이미지 자체는 문제가 없었습니다. 익명의 독자는 드래그 앤 드롭으로 테이블을 재구성하는 동안 발생한 Microsoft Word 오류 메시지를 설명했습니다. B.J. H.는 Southwest Airlines의 수하물 추적 시스템에 대한 좌절스러운 경험을 공유했는데, 이 시스템은 수하물이 추적되고 있음에도 불구하고 처음에는 스캔이 표시되지 않았습니다. 이는 B.J.가 자신의 존재 자체에 의문을 갖게 만든 또 다른 페이지로 인해 더욱 악화되었습니다. Adam R.은 Stripe의 특이한 숫자 서식을 보고했는데, 거래 금액의 기호가 별도의 줄에 나타났습니다. 그는 이것이 줄 바꿈 알고리즘 문제로 인해 발생했으며, 줄 바꿈 방지 공백이 부족하다고 제안했습니다. Peter S.는 장비 판매를 위한 Peloton의 "Repowered" 사이트에서 혼란스러운 예/아니오 버튼 세트를 발견했습니다. 그는 인터페이스가 명확한 선택보다는 도박을 제안한다고 느꼈습니다. 저자는 Peter가 Peloton 장비를 판매하려는 동기에 대해 궁금해했습니다. 제공된 텍스트에는 BuildMaster 광고도 포함되어 있습니다. 전반적인 주제는 사용자 인터페이스 및 사용자 경험의 특이점에 대한 보고와 유머러스한 논평입니다.
CdXz5zHNQW_G5UYqFYRut.png
CdXz5zHNQW_W0bWKSOezh.jpeg
저자는 상속을 과도하게 강조하는 등 객체 지향 개념을 생물학적 분류 체계를 사용하여 설명하는 일반적인 관행의 한계를 비판합니다. 그런 다음 개발자들이 핵심 객체 지향 원칙을 오해하여 문제가 되는 코드를 작성한 C++ 코드베이스를 논의합니다. 한 예로 동물이 촉수를 가지고 있는지 여부를 결정하기 위해 다형성 대신 런타임 타입 검사(IS_INSTANCE_OF)를 사용하는 StealTentacle 함수가 있습니다.IS_INSTANCE_OF 매크로는 C 스타일 캐스팅과 함께 dynamic_cast를 잘못 사용하며, 이는 의도하지 않은 동작으로 이어질 수 있습니다. 이 매크로는 실제 타입을 확인하기 전에 객체 포인터를 기본 타입으로 강제하려고 시도하며, 이는 C++ 캐스팅 규칙에 대한 이해 부족을 보여줍니다. 개발자들의 주석은 dynamic_cast에 대한 혼란을 드러내는데, 이는 직접적인 상속 확인뿐만 아니라 관련 파생 타입 간의 크로스캐스팅도 수행할 수 있기 때문입니다.저자는 이러한 런타임 타입 검사가 안티 패턴이며, 해결하려는 문제는 타입 시스템 자체를 사용하여 더 우아하게 처리할 수 있다고 주장합니다. 코드는 매크로 검사 후 다운캐스팅을 시도하기 위해 더 많은 C 스타일 캐스팅을 사용하여 이를 더욱 보여줍니다. 궁극적으로 저자는 객체 지향 기능이 강력할 수 있지만, 특히 런타임 타입 정보와 함께 오용될 경우 복잡하고 비효율적인 코드로 이어져 언어의 우아함을 훼손할 수 있다는 의견에 동의합니다.
CdXz5zHNQW_3avBLnYrMA.jpeg
TruStage는 생명 보험 회사로, 2026년 7월 10일에 중대한 사이버 보안 사고를 겪었으며, 사고 발생 몇 달 후에도 주요 비즈니스 기능이 부분적으로만 사용 가능했습니다. 회사는 아직 침해의 범위를 파악하기 위해 노력 중이며, 어떤 데이터가 유출되었는지 또는 서비스가 언제 완전히 복구될지는 결정하지 못했습니다. 보험 운영은 영향을 받았지만, 은행 업무를 위해 신용 조합을 지원하는 시스템은 정상적으로 작동했습니다. 이 사건으로 인해 수많은 소송이 제기되었으며, 보험 산업 내 복잡한 중개자 역할을 부각시킵니다.보험 프로세스에는 종종 여러 파트너가 관여합니다. 예를 들어, Ethos는 AI를 사용하여 고객을 보험 상품과 연결하고, Family First Life(FFL)는 TruStage와 같은 회사와 파트너십을 맺습니다. TruStage의 사이버 보안 사고로 인한 결제 처리 불가로 인해 보험 계약이 실효되고 있습니다. 이 실효는 보험 설계사에게는 수수료 손실을, Ethos 및 FFL과 같은 파트너 회사에게는 차지백을 초래합니다.FFL의 사장인 Shawn Meaike는 업계 컨퍼런스에서 Ethos를 공개적으로 비판하며, 파트너십의 "가장 약한 고리"라고 지칭하고 사과를 요구했습니다. Meaike가 Ethos 직원 Dylan Cummings를 무대에서 굴욕감을 준 것은 특히 민망한 순간으로 여겨집니다. 이 모든 상황은 TruStage의 심각한 사이버 보안 및 재해 복구 실패를 보여주며, 고객에게 부정적인 영향을 미치고 업계에 혼란을 야기합니다. 궁극적으로 이 사건은 TruStage의 제도적 무능력과 단일 발행사에 크게 의존하는 AI 기반 보험 스타트업의 문제적인 비즈니스 모델을 드러냅니다.
Greta는 오래된 Pascal 개발 환경에서 작업하던 중, 파일이 실제로 존재함에도 불구하고 프로그램에서 파일이 존재하지 않는다고 보고하는 버그를 발견했습니다. 그녀는 이 문제를 시스템 라이브러리의 FileExists 함수로 추적했습니다. 이 함수는 파일의 마지막 수정 타임스탬프를 가져오는 FileAge에 의존합니다. FileAge는 다시 시간 형식을 변환하기 위해 FileTimeToDosDateTime을 사용합니다. 결정적인 결함은 FileAge가 FileTimeToDosDateTime의 반환 값을 처리하는 방식에 있습니다. FileTimeToDosDateTime은 성공 또는 실패를 나타내기 위해 부울 값을 반환하고, 실패 시 오류 코드를 설정합니다. 그러나 FileAge는 이 부울 반환 값을 확인하지 않습니다. FileTimeToDosDateTime이 실패하면 FileAge는 -1을 반환합니다. 결과적으로 FileExists는 이 -1을 파일이 존재하지 않는 것으로 해석합니다. Greta의 특정 버그의 근본 원인은 파일을 작성하는 프로세스가 "마지막 쓰기 시간"을 설정하지 않았다는 것입니다. 유효한 마지막 쓰기 시간이 없으면 FileTimeToDosDateTime이 실패하고, 이로 인해 FileAge가 -1을 반환하며, 따라서 FileExists는 파일을 잘못하여 존재하지 않는 것으로 보고합니다. 이는 시스템 라이브러리에서 오류 처리에 있는 미묘한 오류가 중요한 기능 버그로 이어지는 일반적인 문제를 강조합니다.
DNS의 CAA 레코드 타입은 도메인 소유자가 자신의 도메인에 대한 인증서를 발급할 수 있는 인증 기관을 지정할 수 있도록 합니다. RFC6844에 처음 정의되었고 RFC8659에 의해 나중에 업데이트되었지만, 핵심 개념은 동일하게 유지됩니다. CAA 레코드의 주요 기능 중 하나는 "Issuer Critical" 플래그로, 인증서 발급 전에 인증 기관이 레코드를 검증하도록 의도되었습니다.이 중요 플래그는 플래그 비트마스크의 비트 0으로 설계되었으며, 이를 활성화하려면 128의 값이 사용되어야 합니다. 그러나 일반적인 오해로 인해 많은 사람들이 비트 7을 중요 플래그로 해석하여 1의 값을 사용했습니다. 이 오해는 RFC를 철저히 읽지 않은 사용자들 사이에서 널리 퍼져 있습니다.Let's Encrypt와 같은 인증서 발급 기관은 딜레마에 직면했습니다. 사양을 엄격하게 준수하고 잘못 구성된 레코드를 거부하거나, 기능성을 유지하기 위해 널리 퍼진 오류를 수용해야 했습니다. 그들은 후자를 선택하여 사실상 1의 값을 중요 플래그의 별칭으로 받아들였습니다. 이 결정은 원래 사양에 대한 엄격한 준수보다 사용자 오류의 실제 현실을 인정합니다.filterCAA를 위한 제공된 Go 코드 스니펫은 이것이 실제로 어떻게 처리되는지 보여줍니다. "issue" 및 "issuewild" 태그를 필터링하고 인식되지 않는 중요 태그도 확인합니다. 특히, 이 코드는 인식되지 않는 중요 태그가 있는지 여부를 결정하기 위해 플래그가 128(올바른 값) 또는 1(일반적으로 사용되는 잘못된 값)로 설정되었는지 확인합니다. 두 값 모두를 포함하는 것은 중요 플래그에 대한 널리 퍼진 사용자 오류를 수용하는 것을 반영합니다.저자는 이러한 플래그에 비트마스크를 사용하는 것이 혼란과 오류를 야기할 때 그 지혜에 의문을 제기하며, 더 간단한 플래그 메커니즘이 더 읽기 쉽고 오류가 적을 수 있다고 제안합니다. 비트마스크의 유용성을 인정하면서도, 이 일화는 복잡성이 실제 구현에서 상당한 운영 문제를 야기할 수 있음을 강조합니다. 기술 사양, 사용자 이해 및 실제 구현 간의 상호 작용은 반복되는 주제입니다.
Vala는 C#과 유사한 기능과 C에 가까운 성능을 갖춘 Gnome을 위해 설계된 프로그래밍 언어입니다. 함수가 제어권을 양보할 수 있도록 하는 async/await 의미론을 사용하여 비동기 프로그래밍을 지원합니다. Vala의 많은 I/O 라이브러리 함수는 make_directory_async와 같이 비동기적입니다. 그러나 핵심 라이브러리에는 디렉토리 체인을 동기적으로 생성하는 create_directory_with_parents의 비동기 버전이 없습니다. 이러한 누락은 비동기적으로 경쟁 조건을 처리하는 복잡성 때문일 가능성이 높습니다. 저자인 Eri는 이 문제를 접하고 사용자 정의 비동기 솔루션을 구현했습니다. Eri의 초기 접근 방식은 리프 노드에서 위쪽으로 디렉토리를 생성하려고 시도하고 누락된 부모를 배열에 수집하는 것을 포함합니다. 그런 다음 이 배열을 역으로 반복하여 디렉토리를 생성합니다. 이 방법은 제어 흐름에 예외 처리를 사용하기 때문에 세련되지 않은 것으로 간주됩니다. Eri는 특히 비동기 경쟁 조건을 관리하는 데 있어 문제의 어려움을 인정합니다. 메인 루프의 약간 개선된 버전이 제시되지만 접근 방식은 복잡합니다. 어색함에도 불구하고 Eri의 솔루션은 누락된 라이브러리 기능을 효과적으로 해결합니다. 저자는 구현된 함수가 올바르게 작동하면 숨겨야 한다고 제안합니다.
은퇴를 앞둔 저자는 훌륭한 급여를 제시하는 전문 소프트웨어 직책으로 헤드헌팅되었습니다. 초기 온보딩 과정은 더뎠고, 처음 6개월은 접근 권한을 기다리는 데 보냈습니다. 면접관인 프레드는 매우 유능했고 저자와 좋은 관계를 형성했습니다. 프레드는 저자에게 회사의 핵심 소프트웨어를 분석하여 이해하고 잠재적으로 현대화하는 임무를 맡겼습니다.저자가 자신의 분석 결과를 발표하기 전에 프레드는 예상치 못하게 사망했습니다. 이 사건은 회사 내부에 혼란을 야기했고, 저자와 같은 계약직 직원은 대부분 잊혀졌습니다. 이후 18개월 동안 저자는 대부분 무시당했고, 이 시간을 개발 환경을 구축하는 데 사용했습니다. 이 기간 동안 그들은 끊임없이 경영진을 비판하는 동료와 함께 일했습니다.저자의 새 관리자는 적대적이고 무시하는 태도를 보였으며, 마지못해 업무를 할당했습니다. 회사는 시스템을 보호하려는 고령의 직원들과 환영받지 못하는 자동화를 도입하려는 신규 직원들로 구성된 것처럼 보였습니다. 저자는 이 정체된 기간 동안 TDWTF 웹사이트에 기고했습니다. 결국 저자는 아무런 불만 없이 해고되었습니다. 이제 그는 은퇴 전 마지막 몇 년을 우체부로 일하고 있습니다. 저자는 업무 관련 스트레스로 인한 사망 위험이 현실적인 위험이라고 강조합니다.
CdXz5zHNQW_tmcjJ0Qed6.jpeg
미니 스플릿 시스템은 비용 효율성과 에너지 효율이 뛰어나 오래된 주택을 개조할 때 널리 사용되지만, 적외선(IR) 리모컨에 의존해야 한다는 점 때문에 홈 오토메이션과의 연동이 복잡해집니다. 이러한 시스템 내부의 온도 변환 로직, 특히 섭씨와 화씨 간 변환 과정에서 흔히 문제가 발생합니다. 미니 스플릿을 홈 오토메이션에 통합하려는 한 오픈소스 프로젝트에서 결함이 있는 온도 변환 방식이 밝혀졌습니다.이 프로젝트의 코드는 섭씨에서 화씨, 화씨에서 섭씨로 변환하는 데 조회 테이블을 사용합니다. 이 테이블에는 구체적이면서도 종종 부정확한 매핑이 포함되어 있어, 표준 변환 공식과 비교했을 때 불일치가 발생합니다. 예를 들어, 18°C는 (반올림 시) 더 정확한 64°F 대신 65°F로 잘못 매핑됩니다. 이러한 조회 테이블의 설계는 정밀한 수학적 계산보다는 변환값을 대략적으로 추정하려는 시도를 시사합니다.저자는 처음에 이것이 취미 프로젝트의 미숙한 최적화라고 생각했으나, 코드 내 주석에 따르면 이는 “리모컨을 기반으로 한 직접 매핑”임이 밝혀졌습니다. 이는 부정확성이 리모컨 자체에서 비롯되었음을 시사합니다. 리모컨은 부동소수점 연산을 효율적으로 처리하지 못할 수 있는 임베디드 마이크로컨트롤러의 한계로 인해 조회 테이블을 사용하는 것으로 보입니다.결과적으로, 사용자가 리모컨에서 72F와 같은 온도를 설정하면, 리모컨은 내부적으로 이를 대략적인 섭씨 값(예: 22.5C)으로 변환한 후 장치에 명령을 전송합니다. 이러한 근사값은 대부분의 상황에서는 “충분히 괜찮은” 수준이지만, 정밀한 자동화에는 불일치를 초래합니다. 저자에 따르면, 근본적인 문제는 취미 프로젝트의 코드나 리모컨 자체가 아니라, 전 세계적으로 비표준 단위(화씨)가 계속 사용되고 있어 이러한 부정확한 변환이 불가피하게 되는 데 있습니다.
레이첼은 새로운 팀에 합류했으며, 그녀의 상사인 제인은 최저 비용으로 위젯 생산을 극대화하는 데 초점을 맞춘 메트릭 중심 접근 방식을 강조했습니다. 자동화된 생산 라인은 복잡한 소프트웨어를 포함했으며, 테스트 제한으로 인해 변경 사항은 실제 생산에서만 검증되었습니다. 레이첼의 초기 임무는 사용자들이 항상 엑셀을 선호했음에도 불구하고, 6개의 데이터베이스에서 데이터를 가져오는 구글 시트 메트릭 대시보드를 업데이트하는 것이었습니다. 팀은 시스템 동작이나 병목 현상을 설명할 상세 데이터 없이 "단위 시간당 생산된 위젯"과 같은 출력 메트릭만 추적했습니다. 예를 들어, 자동화된 품질 관리 스캐너는 위젯 거부 이유나 거부된 항목의 개수조차 직접 기록하지 않았습니다.소프트웨어 변경 사항은 전체 출력 메트릭에 대해 점수화되었으며, 이러한 메트릭은 소프트웨어 자체 외부의 외부 요인에 의해 영향을 받는 노이즈가 많았기 때문에 검증이 어려웠습니다. 거부된 위젯을 기록하는 변경 사항을 구현하려는 레이첼의 시도는 처음에는 환경 문제로 인한 메트릭 회귀로 인해 방해를 받았으며, 그녀의 코드가 원인이 아니었습니다. 제한된 테스트 실행과 메트릭 회귀를 고려해야 할 필요성 때문에 간단한 변경 사항도 검증하는 데 몇 주가 걸릴 수 있었습니다. 레이첼은 유용한 시스템 모델을 구축하기 위해 더 자세한 데이터를 수집하기 위해 코드에 계측을 추가하기 시작했습니다.그러나 제인은 즉각적인 주요 출력 메트릭 개선에 집착했습니다. 그는 그러한 진단 데이터가 "핵심 메트릭"이 아니라고 말하며, 해당 메트릭이 그렇게 작동하는 이유를 이해하기 위해 데이터를 수집하는 것의 가치를 일축했습니다. 이는 시스템 이해에 대한 레이첼의 열망과 최상위 성과 지표에 대한 제인의 초점 사이에 근본적인 충돌을 야기했습니다. 레이첼은 그녀가 최상위 메트릭을 개선하기 위해 만든 모든 변경 사항에 변경 사항의 동작을 설명하기 위한 계측을 포함하도록 하여 타협점을 찾았습니다. 이 전략을 통해 그녀는 메트릭 개선에 대한 제인의 요구를 충족시키면서 시스템의 관찰 가능성을 점진적으로 향상시킬 수 있었습니다. 궁극적으로, 포괄적인 통찰력 없이 최상위 메트릭을 추진하는 것에 비해 복잡한 시스템을 이해하는 것은 낮은 우선순위로 남았습니다.
이 블로그 게시물은 문제가 있는 PHP 코드 조각을 설명합니다. 저자는 혼자 작업하며, 카타르시스와 블랙 유머를 위해 이를 공유합니다. 기밀 유지를 위해 코드는 일반화되었으며, 이는 잠재적으로 불일치를 야기할 수 있습니다. 코드는 데이터를 가져와 반복하고, 지역화를 위해 동적 속성 접근을 사용하여 세부 정보를 검색합니다. 그런 다음 범주 변수를 기반으로 비용을 형식화하며, 임의의 인덱스를 가진 배열 $mot에 접근합니다. 수량 선택 블록 생성 등 광범위한 HTML 문자열 조작이 존재합니다. 코드는 시간 데이터를 위해 JSON을 디코딩하며, 날짜가 문자열로 저장됨을 나타냅니다. 드롭다운 목록은 $mot 배열 값을 사용하여 구성됩니다. 궁극적으로 처리된 데이터는 템플릿에 삽입됩니다. 이 과정은 자식 항목에 대해 반복되며, 거의 중복된 코드로 이어집니다. 또한, 자식 항목은 형제 항목을 가질 수도 있으며, 이는 유사한 코드 로직으로 또 다른 반복을 필요로 합니다. 저자는 원래 프로그래머가 결국 메서드와 함수를 사용하는 법을 배우기를 희망합니다. 제공된 코드 스니펫은 메인 항목 및 자식 항목에 대한 초기 데이터 가져오기 및 처리 루프를 보여줍니다. 여기에는 비용 계산 및 형식화를 위한 복잡한 조건부 로직이 포함됩니다. 지역화 및 통화를 위한 동적 속성 접근이 강조됩니다. 수량 및 시간 선택을 위한 HTML 스니펫의 도입도 언급됩니다. 메인 항목, 자식 항목 및 형제 항목에 대한 코드의 반복적인 특성은 코드베이스를 비효율적으로 만듭니다.
카키스토크라시, 즉 최악의 자질을 가진 자들의 통치가 관련 개념으로 소개된다. 교사인 Jared B는 해리라는 기계공학 교수가 설립한 에듀테크 회사에서 일했던 경험을 공유한다. 해리는 C 인터프리터를 개발하고 이를 기반으로 회사를 설립하여 C 프로그래밍을 활용한 K-12 커리큘럼을 제공했다. 그의 소프트웨어에는 웹 IDE와 원격으로 C 코드를 실행하기 위한 데몬이 포함된 로컬 설치 Windows 버전이 있었다.그러나 이 데몬에는 인증 기능이 없었고 0.0.0.0에 바인딩되어 있어 같은 네트워크상의 모든 도메인이나 컴퓨터가 임의의 C 코드를 실행할 수 있었다. 이러한 심각한 보안 취약점은 해리가 전적으로 고용한 대학원생 개발자들이 인지하지 못한 채 수년간 존재해 왔다. 이 소프트웨어는 수천 대의 학교 컴퓨터에 설치되었다.Jared는 이러한 문제들을 해리에게 보고했고, 해리는 "보안 개선"을 이유로 업데이트를 출시했지만 IT 리더들에게 업데이트의 중요성을 알리지 않았다. Jared는 또한 해리의 다른 웹사이트에서 쿠키 탈취 취약점과 코드 삽입 취약점을 발견했다. 후자의 취약점은 수천 건의 암호화되지 않은 신용카드 거래 기록을 노출시켰다. 이러한 중대한 보안 결함과 데이터 노출에도 불구하고 해리의 회사는 사업을 계속하고 찬사를 받아왔다. 논평자는 이 상황을 오래된 기술에 갇혀 있었지만 교육 시스템을 위험에 빠뜨리지 않았던 자신이 알던 사람과 대조한다.
CdXz5zHNQW_B1k6IsjyP4.png
저자는 좋지 않은 소프트웨어 문서의 좌절감과 훨씬 더 큰 어려움을 야기하는 잘못 작성된 하드웨어 데이터시트를 대조합니다. 집적 회로에 대한 정확하고 완전한 문서를 찾는 것은 개발자에게 매우 중요합니다. 데이터시트는 종종 불완전하거나, 부정확하거나, 심지어 다른 언어로 되어 있기도 합니다. 현대 칩의 복잡성은 상세한 데이터시트를 필요로 하지만, 일부 공급업체는 부적절한 정보를 제공하여 사용자가 기능을 역설계하도록 강요합니다. 데이터시트와 실제 칩 동작 간의 불일치는 전원 핀을 잘못 식별하거나 부품을 손상시키는 것과 같은 치명적인 오류로 이어질 수 있습니다. 일부 공급업체는 훌륭한 데이터시트를 생산하지만, 임베디드 분야의 비용 고려 사항은 종종 문서화가 제대로 되지 않은 하드웨어로 이어집니다. 저자는 칩의 데이터시트가 "Super User Fantastic Feature Enable Register"를 설명했던 특정 사례를 회상합니다. 이 레지스터는 개발자가 어려운 임베디드 프로젝트를 경험한 것을 반영하여 "SUFFER"로 재미있게 축약되었습니다. 이 기능을 활성화하는 것은 고급 사용자가 디버깅 동작을 변경하도록 의도되었습니다. 이 레지스터의 리셋 값은 모두 1이었으며, 이는 기본적으로 활성화되어 있음을 나타냅니다. "SUFFER" 레지스터라는 이름은 이러한 어려운 문서 작업을 처리하는 느낌을 적절하게 포착합니다.
저자는 한 Microsoft 플랫폼에서 다른 플랫폼으로의 데이터 마이그레이션에 대해 설명하며, 예상치 못한 문제가 발생했습니다. 처음에는 SSIS가 데이터 추출 및 로드를 처리했지만, 저자는 더 나은 제어를 위해 PowerShell로 전환했습니다. 목표는 SharePoint 온프레미스에서 SQL Server 데이터베이스로 고객 문서 및 메타데이터를 마이그레이션하는 것이었습니다. 핵심 필드인 고객 번호는 SharePoint에서 Number 유형으로 저장되었습니다. 내부적으로 SharePoint의 Number 필드는 Double로 표현되며, 이는 10자리 숫자를 정확하게 저장하기에 충분합니다. 그러나 SSIS에서 생성된 SQL Server 스키마는 이 필드에 'float' 데이터 유형을 사용했습니다. 저자는 PowerShell 스크립트의 '.Net' 유형 'float'가 SQL Server의 'float' 유형과 완벽하게 일치할 것이라고 잘못 가정했습니다. SQL Server의 'float'는 기본적으로 배정밀도를 사용하지만 저자는 이러한 표현의 차이를 인지하지 못했기 때문에 이 불일치가 발생했습니다. 결과적으로 숫자가 전송되고 변환될 때, 정밀도 손실로 인해 큰 고객 번호의 마지막 몇 자리가 손실되었습니다. 테스터들은 처음에는 오류를 놓쳤지만, 전체 데이터 로드 중에 발견되었습니다. 팀은 마이그레이션 후 손상된 숫자를 식별하고 수동으로 수정해야 했습니다.
CdXz5zHNQW_ElgNsoYbYY.jpeg
CdXz5zHNQW_LSUkNG7WkF.png