duckpipe

ChatGPT·Claude 같은 AI 도구 활용법과 노트북·주변기기 등 제품 리뷰를 근거 중심으로 정리합니다. 광고·과장 없이 재현 가능한 정보만.

최신 글 74편

개발

'7,016만 3천원'을 정규식이 못 읽는다 — 한글 수사가 섞인 금액 파싱

금액을 검사하는 정규식을 만들어 두고 통과할 줄 알았는데 치명 판정이 났다. 원인은 '7,016만 3천원'이었다. 만·억 같은 큰 단위는 처리했지만 그 뒤에 다시 붙는 천·백 수사는 패턴에 없었다. 한국어 금액 표기가 만드는 이 함정과, 정규식을 늘리는 대신 표기를 고정한 이유를 정리했다.

읽기 →
개발

정규식 \b는 한글 뒤에서 항상 실패한다 — 의도와 정반대로 동작하는 이유

'단지'로 끝나는 패턴에 \b를 붙였더니 매칭이 통째로 실패했다. 문자열 끝이든 공백이든 쉼표든 전부 false인데, 뒤에 영문이나 숫자가 붙으면 true가 된다. 단어 경계를 자르려던 의도와 정확히 반대다. \b가 ASCII \w 기준이라 한글이 non-word로 취급되기 때문이고, u 플래그를 붙여도 바뀌지 않는다. 실측 결과와 대안을 정리했다.

읽기 →
개발

검증 도구가 거짓 신호를 준 세 가지 — 테스트·표본·집계 단위

하루에 측정 실수 세 개를 연달아 겪었다. 문자열을 그대로 new RegExp에 넣어 테스트가 거짓으로 실패했고, 클릭 43건으로 상관계수를 내 결론을 낼 뻔했고, 여섯 글의 합계를 한 글과 비교해 만든 규칙을 도구에 넣었다가 지웠다. 셋 다 코드는 정상 동작했고 숫자도 정확했다. 틀린 것은 그 숫자가 무엇을 뜻하는지였다.

읽기 →
개발

Nominatim이 한국 도로명주소 번지를 못 잡을 때 — 지도 라벨로 좌표를 역산했다

지오코딩 없이 지도 이미지를 자동 생성하려다 막혔다. Nominatim에 '인천광역시 검단구 독정로 57'을 넣으면 건물이 아니라 도로 세그먼트(type tertiary)가 여러 개 돌아온다. 번지를 해석하지 않아 어느 것도 실제 위치가 아니다. 지도에 이미 표시된 단지 라벨을 기준점으로 삼아 두 번의 렌더링으로 픽셀당 도 단위를 역산하고 핀을 맞춘 과정을 실측값과 함께 정리했다.

읽기 →
개발

법제처 DRF API로 고시를 받으면 숫자표가 통째로 빠진다 — 첨부 HWPX를 직접 뜯은 기록

국토교통부 주거급여 고시의 기준임대료 표를 법제처 Open API로 가져오려다 두 번 막혔다. 행정규칙ID를 ID 파라미터에 넣으면 '일치하는 행정규칙이 없습니다'가 돌아오고, 올바른 식별자로 받아도 조문내용에는 '다음과 같다'만 있고 표의 숫자는 하나도 없다. 표는 첨부 HWPX에만 들어 있었고 HWPX가 zip이라는 점을 이용해 의존성 없이 파싱한 과정을 정리했다.

읽기 →
개발

네이버 검색광고 API hintKeywords 11001 — 원인은 키워드 안의 공백 하나였다

네이버 검색광고 키워드도구 API에 실제 검색어 형태 그대로 키워드를 넣었더니 400과 함께 'hintKeywords 파라미터가 유효하지 않습니다'(code 11001)가 돌아왔다. 키워드 개수, 중복, 특수문자를 차례로 지워 가며 격리한 결과 원인은 키워드 안의 공백 하나였다. 한국어 검색어는 대부분 공백을 포함하기 때문에 이 제약은 조회 결과 자체를 바꾼다.

읽기 →
개발

공공기관 파일 다운로드가 curl에서만 실패한다 — 307 리다이렉트 루프의 진짜 원인은 User-Agent

SH서울주택도시개발공사 공고문 PDF를 curl로 받으려다 두 가지 다른 실패를 겪었다. -L 없이 받으면 exit 0에 152바이트 HTML이 저장돼 성공처럼 보이고, -L을 붙이면 리다이렉트 50번 끝에 exit 47이 난다. 둘 다 증상일 뿐이고 원인은 서버가 curl 기본 User-Agent를 걸러 307로 에러 페이지를 던지는 것이었다. 헤더 한 줄로 0 리다이렉트 200이 된 과정을 실측으로 정리했다.

읽기 →
개발

네이버 에디터 자동화 버그 — 성공 로그를 찍고도 발행본엔 한 번도 안 들어간 원인

네이버 블로그 자동 발행 확장에서 '정렬 보정 N개' 성공 로그가 매번 찍혔는데, 실제 발행된 글은 예외 없이 가운데 정렬이었다. 라이브 HTML을 직접 떼어보고 나서야 DOM classList 치환이 애초에 저장 모델에 반영된 적이 없다는 걸 확인했고, 그다음 시도한 '진짜 버튼 클릭'도 버튼이 닫힌 드롭다운 안에는 존재하지 않아 실패했다. 두 번의 거짓 양성을 잡아낸 과정을 실제 코드와 함께 정리했다.

읽기 →
개발

네이버 지도 Static Map API 401 에러 — 결제 문제가 아니라 도메인이 레거시였다

네이버 클라우드 플랫폼 Static Map API로 실제 지도 이미지를 만들려다 401 Permission Denied를 받았다. 결제 수단 미등록을 의심했지만 이미 등록돼 있었고, 진짜 원인은 예전 'AI·NAVER API' 문서가 가리키는 레거시 도메인을 그대로 썼다는 것이었다 — Application Services > Maps 콘솔에서 새로 발급한 키는 그 도메인에 구독돼 있지 않았다. 도메인 하나만 바꾸니 즉시 해결된 과정을 정리했다.

읽기 →
개발

에이전트가 고친 버그를, 나는 사흘 동안 계속 겪고 있었다

반복되는 버그의 원인 조사를 백그라운드 에이전트에게 맡겨두고 잊고 있었다. 며칠 뒤 같은 버그가 또 나서 상태를 확인해보니, 에이전트는 이미 원인을 찾아 코드까지 고쳐둔 상태였다 — 다만 그 수정은 격리된 git worktree 안에 커밋도 안 된 채로 방치돼 있었다. '작업 완료'와 '내 코드베이스에 반영됨'은 전혀 다른 상태라는 걸 실측으로 확인한 이야기.

읽기 →
개발

다운로드는 전용 클라이언트로 막혀 있었는데, 미리보기는 그냥 이미지였다

한 공공기관 사이트의 첨부파일 다운로드가 이노릭스라는 전용 보안 전송 클라이언트를 거쳐야 해서 curl로 못 받았다. 그런데 같은 페이지의 '미리보기' 버튼이 여는 문서뷰어는 페이지마다 평범한 PNG 이미지 태그였다. 다운로드가 막힌 자리에서 미리보기 쪽으로 우회한 과정을 정리했다.

읽기 →
개발

크롬 확장에서 chrome.storage.local을 전역 마커로 쓰면 안 되는 이유

블로그 자동 발행용 크롬 확장을 직접 만들어 쓰는데, 새 글을 발행할 때마다 등록되는 URL이 매번 '바로 직전에 발행한 글'의 것으로 밀려 나왔다. 원인으로 의심되는 건 발행 완료를 감지하는 chrome.storage.local 마커가 탭 전역이라는 점. 재현 시도와 현재까지 확인한 것·못 한 것을 정리했다.

읽기 →
AI 도구

AI 검색 요약이 서로 다른 두 정부 대출 상품 숫자를 섞어놨다 — 1차 출처 대조로 잡은 사례

정부 정책 리서치에 AI 웹서치 도구를 쓰다가, 같은 질문을 살짝 다르게 던졌을 뿐인데 서로 다른 두 개의 대출 상품 숫자가 하나의 제목 아래 섞여 나오는 걸 발견했다. 실제로 받은 두 응답을 그대로 대조하고, 언론사 원문을 직접 대조해 어느 쪽이 맞는지 확인한 과정을 정리한다.

읽기 →
AI 도구

네이버 블로그 자동 발행 확장에 표를 줬더니, 표가 아니라 글자 그대로 박제됐다

크롬 확장으로 네이버 블로그를 자동 발행하는 파이프라인에 처음으로 마크다운 표(| | |)가 들어간 글을 줘봤다. 결과는 표 변환이 아니라 파이프 기호까지 그대로 찍힌 문단이었다. 파서 코드를 직접 읽어 원인을 확인하고, 이미 검증된 목록 형식으로 우회한 과정을 정리한다.

읽기 →
개발

Enter로 새 문단을 만들었는데도 캐럿이 돌아간 이유 (2차 재현)

네이버 블로그 자동 발행 확장에서 링크가 앞 문장에 붙어버리는 버그를, Enter 키 삽입으로 고쳤다고 생각했다. 그런데 실제 발행 결과 2건 연속에서 버그가 그대로 재현됐다. 원인은 Enter 직후 같은 캐럿 위치 함수를 또 호출한 것 — 방금 만든 빈 문단이 렌더링 전이라 높이 0으로 걸러져 캐럿이 원래 자리로 되돌아갔다. 코드와 재현 과정을 정리한다.

읽기 →
개발

네이버 블로그 API가 내려주는 JSON, 표준 파서가 실패하는 이유

네이버 블로그 글 목록을 공개 API(PostTitleListAsync.naver)로 curl해서 JSON.parse에 넣었더니 'Bad escaped character' 에러가 났다. 원인은 응답 안에 섞인 페이지네이션 HTML의 홑따옴표 이스케이프(\') — JSON 표준이 허용하지 않는 이스케이프 시퀀스였다. 실제 응답으로 직접 확인하고 고친 과정을 정리한다.

읽기 →
AI 도구

네이버 블로그 자동 발행에서 링크가 문장에 붙어버린 이유 — 캐럿 위치 버그를 재현한 과정

크롬 확장으로 네이버 블로그 글을 자동 발행하는데, 본문 링크가 앞 문장 끝에 줄바꿈 없이 그대로 이어붙는 버그가 실제 발행 결과에서 나타났다. 캐럿을 마지막 글자 뒤에 두고 곧바로 붙여넣는 코드가 원인이었고, Enter 입력 하나로 고친 과정을 코드와 함께 정리한다.

읽기 →
개발

쓰레드·인스타 자동 발행 두 개를 동시에 돌렸다가 기록이 사라졌다

블로그 새 글을 쓰레드와 인스타에 동시에 자동 발행했는데, 둘 다 실제로는 성공했지만 상태 파일(state.json)에는 한쪽 기록만 남았다. 원인은 두 프로세스가 같은 JSON 파일을 읽고-고치고-통째로 다시 쓰는 구조라서 늦게 끝난 쪽이 먼저 끝난 쪽의 변경을 지워버린 것이었다. 코드로 재현하고 고친 과정을 정리했다.

읽기 →
AI 도구

Genspark 제휴 프로그램 공식 URL이 404다 — 진짜 가입 경로를 찾은 과정

Genspark 제휴(어필리에이트) 프로그램에 가입하려고 공식 안내 URL(genspark.ai/affiliate)에 들어갔는데 404가 떴다. 검색으로 찾은 공식 X 계정 안내를 따라가 보니, 제휴 플랫폼 자체가 Endorsely에서 Impact.com으로 이전됐고 옛 링크는 조용히 죽어 있었다. 실제로 가입에 성공한 경로를 그대로 정리했다.

읽기 →
개발

로컬 서버가 세션이 끝나도 안 죽어서, 어제 글을 계속 내보내고 있었다 (실측)

발행 자동화용으로 띄워둔 로컬 HTTP 서버가 작업 세션이 끊긴 뒤에도 백그라운드에서 계속 살아있었다. 문제는 그 서버가 며칠 전 초안을 여전히 서빙하고 있었다는 것 — 다음 세션에서 새 초안으로 착각하고 발행 자동화를 돌렸다면 엉뚱한 글이 올라갈 뻔했다. 같은 사고가 두 세션 연속으로 재현된 걸 직접 확인하고, 원인을 코드로 추적했다.

읽기 →
AI 도구

Writesonic, AI 글쓰기 툴에서 검색 최적화 툴로 완전히 바뀌었다 (2026)

무료 AI 글쓰기 툴로 알던 Writesonic이 2026년 현재 공식 요금제 페이지에 들어가면 전혀 다른 서비스가 나온다. ChatGPT·Gemini·Google AI Overviews에 내 브랜드가 얼마나 언급되는지 추적하는 GEO(생성형 엔진 최적화) 플랫폼으로 완전히 재편됐고, 가격도 월 79~399달러로 뛰었다. 공식 요금제 페이지를 직접 확인한 내용을 정리했다.

읽기 →
개발

X 캡션 글자수가 딱 2자 초과했다 — 예산 계산에서 빠진 리터럴 문자열 실측

블로그 글을 SNS용 캡션으로 자동 변환하는 스크립트가 X(트위터) 280자 제한을 2자 초과했다는 경고를 냈다. 본문 예산은 정확히 계산했는데 왜 2자가 넘었는지, 실제 프론트매터 값을 그대로 넣고 코드를 재현해서 확인했다. 원인은 '자세히 →' 같은 고정 문구의 실제 무게를 어림값 하나로 퉁친 것이었다.

읽기 →
개발

쓰레드 캐러셀 발행 버그, 같은 URL인데 응답이 200과 404를 오간 이유 (실측)

duckpipe 블로그 카드뉴스를 Threads에 자동 발행하는 스크립트가 배포 직후 두 번 실패했다. 하루 간격으로 원인이 달랐다 — 첫 번째는 '슬라이드가 다 열렸는지' 확인 부족, 두 번째는 '슬라이드가 몇 장인지 세는' 로직 자체가 단발성 요청에 의존한 것이었다. 같은 URL에 연속 요청해도 200과 404가 오가는 걸 실측하고 두 겹의 레이스를 각각 고친 과정을 코드와 함께 정리했다.

읽기 →
개발

인스타 릴스 발행이 막혔다 — 캐러셀과 캡션이 같으면 중복으로 보는 이유 (실측)

같은 블로그 글을 인스타 캐러셀과 릴스로 각각 발행하려는데, 릴스 쪽만 '이미 게시된 캡션'이라며 막혔다. 원인은 4일 전 다른 사고를 막으려고 넣어둔 중복 발행 가드였다 — 그 가드는 media_product_type을 안 보고 캡션 텍스트만 비교한다. 캐러셀·릴스처럼 같은 콘텐츠를 다른 화면에 두 번 올리는 게 정상 흐름인 채널에서는 캡션을 반드시 다르게 써야 한다는 걸 실측으로 확인했다.

읽기 →
개발

인용 검사기가 엉뚱한 문장을 인용이라고 잡았다 — 원인은 4자 미만 짧은 따옴표였다 (실측)

법률 콘텐츠의 인용문이 원문과 일치하는지 검사하는 도구를 쓰다가, 원문에 전혀 없는 긴 문장이 '인용문'으로 잡혀 실패 처리되는 걸 봤다. 원인을 코드로 직접 추적해보니, 4자 미만의 짧은 따옴표 쌍이 여러 개 이어질 때 정규식의 여닫음 짝이 어긋나면서 뒤쪽의 전혀 무관한 문단까지 하나의 '인용문'으로 잘못 묶이는 버그였다. 최소 재현 코드로 원인을 확인한 과정을 정리했다.

읽기 →
개발

네이버 에디터 정렬 버그, 인라인 스타일도 안 먹힌 이유 (DOM덤프 실측)

네이버 블로그 자동 발행 확장에서 붙여넣은 문단이 전부 가운데 정렬로 나오는 버그를 만났다. 인라인 text-align도, CDP justifyLeft 편집 명령도 둘 다 무시됐다 — DOM 덤프로 직접 확인해보니 정렬은 se-text-paragraph-align-center 클래스 하나로만 결정되고 있었다. 두 번의 실패한 시도와 클래스 치환으로 고친 과정을 코드와 함께 정리했다.

읽기 →
AI 도구

커서(Cursor) 요금제: '무제한'이라던 약속이 두 달 만에 바뀐 이유

커서는 2025년 6월 요청 횟수 기반 과금을 API 원가 기반 사용량 과금으로 갑자기 바꿨다가 사용자 반발로 CEO가 직접 사과했다. 그런데 사과문에서 '무제한'이라 강조했던 Auto 모드조차 두 달 뒤 다시 사용량 제한으로 바뀌었다. 공식 발표문 원문을 근거로 이 타임라인과 2026년 현재 요금제를 정리했다.

읽기 →
AI 도구

젠스파크(Genspark) 무료로 어디까지 되나: 가격표가 로그인해야만 보이는 이유

젠스파크는 검색량이 크게 늘었는데 경쟁 광고가 1개뿐일 만큼 아직 국내 콘텐츠가 얕다. 그런데 공식 pricing 페이지 자체가 로그인 리다이렉트로 막혀 있어 가격을 확인하기가 생각보다 어렵다. 앱스토어 공식 인앱결제 리스팅으로 실제 가격을 확인하고, 무료 크레딧 개수가 젠스파크 자체 도메인 안에서도 제각각인 이유까지 정리했다.

읽기 →
AI 도구

그록(Grok) 무료로 어디까지 되나: 약관이 두 개로 갈리는 함정까지

그록은 무료로 쓸 수 있지만 공식 페이지에 가격도 무료 한도도 안 적혀 있다. 대신 이용약관과 AUP는 전문이 공개돼 있고, 거기에 블로그·부업에 쓸 사람이 알아야 할 게 다 있다 — X에서 쓰면 약관이 아예 다르고, 결과물에는 출처 표기 의무가 있고, 봇·스크립트 접근은 금지다. API 요금의 2배 함정까지 실측했다.

읽기 →
AI 도구

AI 할루시네이션, 프롬프트로는 못 막는다 — 검증 파이프라인 만드는 법 (2026)

할루시네이션을 '줄이는' 프롬프트 기법은 공식 문서에도 나와 있지만, 만든 곳조차 완전히 없앨 수는 없다고 못박는다. 그래서 필요한 건 기계가 대신 잡아내는 검증 단계다. 원인·실제 피해 규모·공식 완화 기법·직접 만든 인용 검증 스크립트까지 실측 결과와 함께 정리했다.

읽기 →