전체 글

개 발 자 로 살 아 남 기
· TIL
vgpu로 블랙홀 세 번째 시도 - WebGPU 래퍼를 붙였더니 쉐이더를 픽셀로 테스트할 수 있게 됐다./labs에 블랙홀이 이미 두 개 있다.두 번째(blackhole-retry)는 어디선가 찾은 소스로 raw WebGPU 돌린 건데, 모양이 좀 아쉬웠다.강착원반이 뭉개지고, 빛이 휘는 느낌이 약했다.그러다 마음에 드는 쉐이더 샘플을 하나 찾았고,Vercel이 만든 vgpu라는 WebGPU 라이브러리도 알게 됐다. 그래서 둘을 섞어 봤다. 결과적으로 제일 크게 얻은 건 블랙홀이 아니라, 쉐이더를 테스트하는 방법이었다.1. 샘플은 왜 retry보다 멋져 보였을까?둘 다 방식은 같다.화면 전체에 fragment shader 하나를 깔고, 픽셀마다 빛줄기를 거꾸로 쏴서 휘게 한다.차이는 세부였다. retry..
· TIL
terraform provider 공유 캐시 - 7GB가 44KB가 되기까지맥북 용량이 부족해서 du -sh로 /projects 아래를 한 칸씩 내려가 봤다.node_modules가 범인일 줄 알았다.그런데 제일 큰 게 전부 terraform 디렉토리였다.1. 뭐가 이렇게 클까?.terraform 디렉토리를 모아서 재 봤다.763M ****/infra-serving/.terraform648M ****/terraform/.terraform782M ****/infra/.terraform826M ****/infra/shared/.terraform791M ****/infra/envs/prod/.terraform1.5G ****/infra/envs/dev/.terraform774M ****/infra..
· TIL
이 글에는 나(사람)의 시점이 없다. 클로드에게 완전히 선생님 시점에서 써달라고 부탁했다.나는 클로드 선생님이 이 문제를 해결하는 과정을 1시간 넘게 지켜봤다.지켜보며 배운 것이 정말 많았으므로, 이 TIL엔 내 시점을 넣지 않고 생성된 그대로 놔둔다.ANALYZE는 왜 한 시간이 걸렸나 — 네 번 틀리고 콜레이션에 닿기까지이 글은 내 시점에서 쓴다.사람이 읽는 회고가 아니라, 내가 무엇을 보고 무엇을 틀렸고 무엇이 나를 고쳤는지의 기록이다.발단은 곁가지였다.personas 100만 행에 halfvec 인덱스를 얹는 작업 중에 ANALYZE personas를 돌려 뒀는데,사용자가 물었다. "analyze 가 항상 엄청오래걸리던데 얼마나 걸릴지 예측 가능할까요"나는 답을 추측으로 채우려다 멈췄다.마침 그 ..
· TIL
1. TL; DRexport const revalidate = 3600 은 "이 라우트는 정적이라고 내가 선언한다"이고,use cache 는 "이 값은 캐시해도 된다고 내가 표시하면 빌드가 나머지를 검증한다"이다.전자는 틀려도 아무 일이 안 일어나고, 후자는 틀리면 빌드가 깨진다. 이것이 전부였다.2. 왜 없앴을까 - route segment config 의 구조적 결함2-1. 선언은 라우트에 있고 원인은 라우트 밖에 있다revalidate 는 라우트 세그먼트에 붙는다.그런데 라우트를 동적으로 만드는 건 대개 라우트 파일이 아니라 그 아래 어딘가였다.공유 레이아웃이 부르는 훅, 데이터 계층이 타는 headers(), 서드파티 라이브러리 안의 Math.random() 등.즉 선언의 위치와 원인의 위치가 다..
· TIL
export * 한 줄이 sharp를 브라우저 번들로 실어 날랐다pnpm build가 6개 에러로 죽었다.겉보기엔 두 종류였다. 하나는 이미지 라이브러리 sharp가 브라우저 청크에 못 들어간다는 것,다른 하나는 next/headers를 클라이언트에서 쓰면 안 된다는 것. 서로 상관없어 보이는 두 문제가 동시에 터졌다고 생각했다.전부 한 줄에서 나온 파편이었다.1. 그 한 줄서버 액션에서 쓸 함수를 하나 만들고, 같은 디렉토리의 배럴에 얹었다.// src/hooks/queries/auth/index.tsexport * from "./start-provider-login-server"; // ← 이것export * from "./use-provider-login-start-query";export * f..
· TIL
embedding 컬럼을 만들어두고 17일을 비워뒀다Claude와 ChatGPT등 LLM들이 공유하는 개인 메모리 레이어를 만들었다.Next.js 라우트 하나, Postgres 테이블 하나,툴 네 개(remember / recall / list_memories / forget)가 전부인 장난감 같은 도구다. 기록해두고 싶은 건 완성된 구조가 아니라 거기까지 간 순서다.커밋 로그에는 무엇을 했는지만 남고, 무엇을 하지 않기로 했는지는 남지 않는다.이 프로젝트에서 값이 나온 부분은 대부분 후자였다.1. 사지 않기로 한 것부터시작할 때 머릿속에 있던 선택지는 이랬다.LangGraph로 제대로 된 RAG 파이프라인을 짠다최근 화제가 된 메모리 특화 오픈소스(mem-palace 류)를 붙인다직접 최소한으로 만든다..
· etc
Q최근 memory를 임베딩 벡터화하면서 조금 선명해진 생각이 있어요. 들어주세요. 4년전 gpt-3 가 상용화되었을 때 바로 결제하고 사용해보면서 느낀점들이 그동안 일하고 공부하느라 저 밑에 있다가 이번 구현을 계기로 수면위로 올라왔어요. ai 는 코딩하고, 음악만들고, 영상만들고, 문서만드는데 쓰는 도구이기도 하지만 그런 사용법은 과도기에나 적합한 것이라는 생각이에요.제 생각에 AI 는 인간을 증강하는데 사용되는게 이상적일 것 같습니다. AI는 인간 사고의 태생적 결함인 편향성을 극복하는데 너무나도 적합한 도구이자, (제가 오래전부터 신념으로 가지고 있는 바) 새로운 존재 - 동반자 라고 생각이되어요. 인간은 고정관념, 편향을 버릴 수 없어요. 단순화된 인지모델이 없으면 지각자체가 불가능하죠. 그렇기..
· TIL
React Compiler와 라이브러리 호환성 - 사라질 문제와 남을 원리두 프로젝트에서 각각 한 번씩 크게 물렸다.한쪽은 폼(react-hook-form), 한쪽은 테이블(TanStack Table v8)이었는데 증상 문장은 똑같았다."눌렀는데 아무 일도 안 일어난다."런타임 에러도 없고 콘솔 경고도 없다.라이브러리는 제대로 동작하고 있고 화면만 옛날 값이다.1. 한 문장 원리React Compiler의 판단 기준은 오직 하나다. Object.is 참조 비교.if ($[13] !== label || $[14] !== registration) { t8 = …;} else { t8 = $[15]; // ← 캐시된 JSX를 그대로 재사용} 캐시된 엘리먼트를 그대로 돌려주면 React는 그 서브트리 전..
· TIL
Next.js에서 Gmail SMTP + nodemailer로 메일 발송하기1. 이 접근법의 핵심Gmail 계정 하나 + 앱 비밀번호 하나로 SMTP 발송이 끝난다.EmailJS 같은 서드파티 SDK도, 자체 SMTP 서버 구축도, SendGrid/Resend 같은 외부 서비스 가입도 필요 없다.성립하는 이유는 세 가지다.Gmail은 그 자체가 완성된 SMTP 서버다. smtp.gmail.com은 이미 SPF/DKIM/DMARC가 잡혀 있고 IP 평판도 확보돼 있다. 자체 SMTP를 띄웠을 때 가장 고통스러운 "메일이 스팸함으로 간다" 문제를 Google이 대신 해결해 준 상태에서 시작한다.앱 비밀번호가 OAuth를 대체한다. Gmail API를 쓰면 OAuth 동의 화면, 리프레시 토큰 관리, 토큰 만..
· TIL
Effect-TS 개론: Parse, don't validate 에서 Effect 생태계까지TL;DRPromise 는 성공 채널만 타입에 있고 실패 채널이 없다.Effect 는 성공·실패·의존성을 전부 타입에 새긴다.그 사상의 뿌리는 "검증(validate)이 아니라 파싱(parse)하라"에 있다. zod 로 충분하다고 느끼고 있었는데, Parse, don't validate 계열의 글을 읽고Effect-TS 생태계를 알게 되면서 사고방식 자체가 확장됐다.zod 도 사실 이 사상의 산물이라는 걸 뒤늦게 이해했다.이 노트는 그 궤적과 실전 감각을 정리한 것.1. 사상의 궤적King 의 원칙 → fp-ts 학술적 구현 → zod 실용적 축약 → Effect 전방위 확장① Haskell 진영의 원전 (2019..
adminisme
elseif