From d74ed5924e55b40ed5f784dc5943adcea5aaccc3 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 05:20:16 +0000 Subject: [PATCH 1/5] =?UTF-8?q?memo:=20576=20=EC=95=95=EC=B6=95=20?= =?UTF-8?q?=E2=80=94=20=EC=82=B0=EB=AC=B8=EC=9D=B4=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EB=8B=A4=EC=8B=9C=20=EB=A7=90=ED=95=98=EB=8D=98=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지금까지 정리한 21개와 반대 방향이었다. 남의 문장이 아니라 본인 문장인데 압축이 지나쳐 조밀했고, 같은 주장이 세 번 반복됐다. 린터 둘 다 조용했던 건 도구가 "남의 문장"만 잡기 때문이다. - 첫 단락에서 배열→union→함수 파생 삭제 — 바로 아래 코드가 이미 보여주고 코드 주석도 같은 말을 한다. "통로는 함수 하나가 맡는다" 같은 표현은 6개월 뒤 재구성해야 하는데 답이 코드에 있다 - AutoIframe 제거 — title 속성이 논지("dayjs 키=값 vs i18n 키≠값")를 세 번째로 반복하고 있었고, 시각화가 논리적 역할을 하지 않는다 - 곁가지의 "매핑 객체"는 첫 단락과 중복이라 제거 - 컴포넌트 임포트가 없어졌으므로 .mdx → .md 남긴 것: 왜 객체가 아닌가(키=값 대비), ddd 런타임 전제와 "타입은 런타임 전제를 못 잡는다", 일회성은 인라인 규율, 기각한 대안. 산문 566자 → 476자. 코드·WARNING 은 그대로. public/iframe/date-single-source.html 은 이제 참조되지 않는다 (576 이 유일한 사용처였다). Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/content/memo/{576.mdx => 576.md} | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) rename src/content/memo/{576.mdx => 576.md} (56%) diff --git a/src/content/memo/576.mdx b/src/content/memo/576.md similarity index 56% rename from src/content/memo/576.mdx rename to src/content/memo/576.md index b2aad4d..e8091e6 100644 --- a/src/content/memo/576.mdx +++ b/src/content/memo/576.md @@ -3,12 +3,10 @@ type: snippet tags: ['typescript', 'dayjs', 'date-format', 'type-safety'] status: release ctime: 2026-06-28 -mtime: 2026-06-28 +mtime: 2026-07-27 --- -import AutoIframe from '@components/AutoIframe/AutoIframe.astro' - -날짜 표기를 통일하는 데 **매핑 객체가 필요 없다** — dayjs는 포맷 문자열이 곧 키이자 값이라, 허용 표기를 `as const` 배열 하나로 두면 그게 닫힌 집합이다. 닫힘은 union 타입이, 통로는 함수 하나가 맡는다. (i18n은 키≠값이라 객체가 필수였지만, 여기선 잉여.) +날짜 표기 통일에 **매핑 객체가 필요 없다** — dayjs는 포맷 문자열이 곧 키이자 값이다. (i18n은 키≠값이라 객체가 필수였다.) ```ts import dayjs from 'dayjs' @@ -34,14 +32,9 @@ export const formatDate = ( ): string => dayjs(date).format(format) ``` - - 규율: **여러 곳에서 통일이 필요한 표기만** 배열에 담는다. 일회성(`'M.D'` 등)은 raw `dayjs().format()`으로 인라인 유지 — 안 그러면 배열이 잡동사니 enum이 된다. ESLint `no-restricted-syntax`로 카탈로그 표기를 raw로 다시 쓰면 경고(drift 가드). > [!WARNING] > `ddd`(요일)는 진입점에서 `dayjs.locale('ko')`를 호출해야 한국어로 나온다 — 안 하면 영어로 조용히 샌다. **타입은 이 런타임 전제를 못 잡는다.** -곁가지 — 매핑 객체·빌드타임 hoist·tagged-template 캐시도 검토했으나 접음: 고유 패턴이 수십 개 규모라 dedup·컴파일 최적화가 풀 문제 자체가 없다. 닫힌 타입 + 함수 하나로 충분. +곁가지 — 빌드타임 hoist·tagged-template 캐시도 검토했으나 접음: 고유 패턴이 수십 개 규모라 dedup·컴파일 최적화가 풀 문제 자체가 없다. 닫힌 타입 + 함수 하나로 충분. From 2473a1bfff1b98891fbbf30553367393454c47b7 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 05:25:37 +0000 Subject: [PATCH 2/5] =?UTF-8?q?docs:=20=EC=95=95=EC=B6=95=20=EC=9B=90?= =?UTF-8?q?=EC=B9=99=EC=97=90=20=EA=B3=BC=EC=95=95=EC=B6=95=C2=B7=EC=9E=90?= =?UTF-8?q?=EA=B8=B0=20=EB=B0=98=EB=B3=B5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 지금까지의 압축 원칙은 "남의 문장"에 초점이 있어서 자기 반복을 다루지 않았다. 576 리뷰에서 반대 방향의 실패가 나왔다. - 코드가 보여주는 것을 산문으로 다시 쓰지 않는다 — snippet 에서 산문이 코드를 번역하고 있으면 잉여다 - 짧음과 즉답 가능성은 다르다 — 기준은 글자 수가 아니라 "6개월 뒤 바로 읽히는가". 같은 주장이 산문·코드 주석·컴포넌트 속성에 흩어져 반복되는 것도 이때 생긴다 - lint:voice 한계에 한 줄 추가: 부풀린 문장은 잡지만 눌러 담은 문장은 못 잡는다 (576 은 두 린터 모두 조용했다) Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- CLAUDE.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index a3ee32e..53d67b7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -34,8 +34,10 @@ - **1인칭을 확인한다.** 원문을 옮기면 "제가 만든 이유"처럼 남의 1인칭이 따라 들어온다 (268.md가 그랬다). - **걷어내면 형태가 드러난다.** 부풀린 산문을 지우면 남는 게 링크뿐일 수 있다 → `type`이 바뀐다 (268.md: `note` → `bookmarks`). - 같은 내용이 두 단락에 반복되면 기계 요약의 흔적이다 (272.md). +- **코드가 보여주는 것을 산문으로 다시 쓰지 않는다.** `snippet`에서 산문이 코드를 번역하고 있으면 그 산문은 잉여다 (576.md는 첫 단락이 `배열 → union → 함수` 파생을 설명했는데 바로 아래 코드가 이미 그것이었다). +- **짧음과 즉답 가능성은 다르다.** 눌러 담으면 짧아지지만 나중에 재구성해야 하는 문장이 된다 — 압축의 기준은 글자 수가 아니라 "6개월 뒤 바로 읽히는가"다. 같은 주장이 산문·코드 주석·컴포넌트 속성에 흩어져 반복되는 것도 이때 생긴다 (576.md는 세 번 반복됐다). - **검출은 `pnpm lint:voice`** — 빌드에 연결됨. `release` 메모에서 검출되면 빌드가 실패하고, `draft`·`archive`는 경고까지만이다(작성 중에는 원문을 붙여놓고 줄이는 단계가 있으므로). -- 단 이 도구는 **확인 대상을 제시하고 판단은 사람이 한다** — 저자가 존댓말로 쓴 자기 글과 번역문이 같은 신호로 잡힌다. 본인 문체라고 판단했으면 frontmatter에 **`voice: author`**를 달아 제외한다. "린트를 무시한다"가 아니라 "이 문체는 내 것이다"라는 사실을 적는 것 (`309.md`가 그 경우). +- 단 이 도구는 **확인 대상을 제시하고 판단은 사람이 한다** — 저자가 존댓말로 쓴 자기 글과 번역문이 같은 신호로 잡히고, **부풀린 문장은 잡지만 눌러 담은 문장은 못 잡는다**(576.md는 두 린터 모두 조용했다). 본인 문체라고 판단했으면 frontmatter에 **`voice: author`**를 달아 제외한다. "린트를 무시한다"가 아니라 "이 문체는 내 것이다"라는 사실을 적는 것 (`309.md`가 그 경우). ### 하지 말 것 @@ -378,6 +380,7 @@ mtime: YYYY-MM-DD - 각주만 문제였던 것: 83·19·24·221·312 (링크 제목에 이미 있는 내용을 늘려 쓴 경우. 각주에 박혀 있던 기술 링크는 살렸다) - 비공개도 정리: 123·125·171(각주), 182·256·267(산문). 125에서 중복 링크 1개 제거 - `309.md`는 본인 작업 기록인데 존댓말이라 `voice: author`를 달아 예외로 표시 + - 반대 방향도 있었다: `576.md`는 본인 문장인데 과압축·자기 반복이라 산문이 코드를 다시 말하고 있었다 (566자 → 476자, iframe 제거로 `.mdx` → `.md`) - 걷어내니 형태가 드러나 `type`이 바뀐 것: 46·269·23·247·271·182·256(→`bookmarks`), 56·340(→`snippet`), 329(→`note`) - 태그 정규화: snake_case → kebab-case 변환 (23개 파일) - 빈 태그 메모: 28개 파일에 태그 적용 From 8771b099a77920798111690245741b58acc9b78d Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 05:59:40 +0000 Subject: [PATCH 3/5] =?UTF-8?q?chore:=20=EC=B0=B8=EC=A1=B0=EA=B0=80=20?= =?UTF-8?q?=EB=81=8A=EA=B8=B4=20iframe=20html=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 576 에서 AutoIframe 을 걷어내면서 date-single-source.html 이 고아가 됐다. 저장소 전체에서 참조 0건을 확인하고 삭제한다. 나머지 iframe 16개는 모두 참조되고 있다. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- public/iframe/date-single-source.html | 165 -------------------------- 1 file changed, 165 deletions(-) delete mode 100644 public/iframe/date-single-source.html diff --git a/public/iframe/date-single-source.html b/public/iframe/date-single-source.html deleted file mode 100644 index c1575a5..0000000 --- a/public/iframe/date-single-source.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - -날짜 표기 단일 출처 — 타입이 닫고 함수가 통로 (객체 불필요) - - - -
-

날짜 표기 단일 출처 — 타입이 닫고, 함수가 통로

-

허용 표기 배열 하나에서 타입·lint 가드·통로 함수가 전부 파생된다. 매핑 객체가 없는 이유는 dayjs가 키=값이기 때문 — i18n과 대비해 보세요

-

dayjs 날짜 표기를 as const 배열 단일 출처로 두면 union 타입, ESLint drift 가드, formatDate 통로 함수가 파생됨을 보여주고, 키=값이라 매핑 객체가 불필요함을 키≠값인 i18n(키→객체→값) 구조와 토글로 대비하는 다이어그램.

- -
- - -
- dayjs (키=값) - i18n (키≠값) -
-
- - -

-
- - - - From 217005243717cf8c2f9065ee726857d0809ad558 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 06:13:42 +0000 Subject: [PATCH 4/5] =?UTF-8?q?memo:=20=EC=A3=BD=EC=9D=80=20=EB=A7=81?= =?UTF-8?q?=ED=81=AC=207=EA=B1=B4=20=EC=88=98=EC=A0=95=20(9=20=E2=86=92=20?= =?UTF-8?q?2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lint:links 가 찾은 9건을 GitHub API·npm 레지스트리로 하나씩 확인했다. 추측으로 바꾼 건 없다. 이동 (검증됨): - 310 react-router v7 에서 react-router-dom 이 react-router 로 합쳐졌다 packages/react-router-dom/__tests__/link-click-test.tsx → packages/react-router/__tests__/dom/link-click-test.tsx - 552 vercel-labs/vgrok → styfle/vgrok (Vercel 직원 개인 저장소) - 63 image-optimizer 가 TS 로 전환 (app.js → app.ts). 줄 범위도 확인했는데 메모가 인용한 값이 그대로다 — mozjpeg quality 75(L38), pngquant 75(L48)/85(L52) 오검출이었던 것: - 74 gist 는 살아 있다. 소유자 사용자명이 Vestride → glen-cheney 로 바뀌어 옛 URL 만 404 였다 (gists API 로 확인) 사라진 것: - 232 signavio/react-mentions 저장소가 없어졌다. npm 패키지는 살아 있어(registry 4.4.10) npm 페이지로 교체 - 58 blog.sindresorhus.com 도메인 자체가 사라졌다(ENOTFOUND). 정본인 Pure ESM gist 가 이미 첫 링크로 있어 두 항목 삭제 - 491 Effect-TS/website 에 llms 관련 파일이 아예 없다(트리 확인). QuoteLink 를 걷어내니 임포트도 없어져 .mdx → .md 남은 2건은 판정하지 않았다: - 78 cbcruk/cse-events — 본인 저장소. 비인증 404 는 삭제와 비공개를 구분하지 못한다 - 560 facebook/react#7942 — 웹은 404 인데 API 는 403(레이트리밋)이라 확정 불가. 첫 실행에서는 "확인 불가" 로 분류됐다 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/content/memo/232.md | 4 ++-- src/content/memo/310.md | 4 ++-- src/content/memo/{491.mdx => 491.md} | 8 +------- src/content/memo/552.mdx | 4 ++-- src/content/memo/58.md | 4 +--- src/content/memo/63.md | 4 ++-- src/content/memo/74.md | 4 ++-- 7 files changed, 12 insertions(+), 20 deletions(-) rename src/content/memo/{491.mdx => 491.md} (74%) diff --git a/src/content/memo/232.md b/src/content/memo/232.md index 384a793..43bc1c2 100644 --- a/src/content/memo/232.md +++ b/src/content/memo/232.md @@ -3,10 +3,10 @@ type: bookmarks tags: ['editor', 'input'] status: release ctime: 2022-12-05 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -- [react-mentions](https://github.com/signavio/react-mentions)[^232-1] +- [react-mentions](https://www.npmjs.com/package/react-mentions)[^232-1] - [tribute](https://github.com/zurb/tribute)[^232-2] - [react-input-trigger](https://github.com/abinavseelan/react-input-trigger)[^232-3] - [react-contenteditable](https://github.com/lovasoa/react-contenteditable)[^232-4] diff --git a/src/content/memo/310.md b/src/content/memo/310.md index ce2982d..b636cb8 100644 --- a/src/content/memo/310.md +++ b/src/content/memo/310.md @@ -5,7 +5,7 @@ title: React Router의 Link 컴포넌트 테스트하기 description: 이 글에서는 React Router의 컴포넌트를 테스트하는 방법을 설명합니다. 사용자가 링크를 클릭하면 적절한 페이지로 이동하는지 확인하는 테스트 코드를 예제와 함께 제공합니다. status: release ctime: 2024-08-06 -mtime: 2024-08-06 +mtime: 2026-07-27 --- React 애플리케이션에서 라우팅은 중요한 부분. 특히, 사용자가 링크를 클릭할 때 적절한 페이지로 이동하는지 테스트하는 것은 중요. 다음은 [React Router](https://reactrouter.com/en/main)의 `` 컴포넌트를 테스트하는 코드. @@ -36,4 +36,4 @@ describe('Link', () => { --- -- https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/__tests__/link-click-test.tsx +- https://github.com/remix-run/react-router/blob/main/packages/react-router/__tests__/dom/link-click-test.tsx diff --git a/src/content/memo/491.mdx b/src/content/memo/491.md similarity index 74% rename from src/content/memo/491.mdx rename to src/content/memo/491.md index 61bb47e..72894a2 100644 --- a/src/content/memo/491.mdx +++ b/src/content/memo/491.md @@ -3,15 +3,9 @@ type: bookmarks tags: [llms.txt] status: release ctime: 2025-04-01 -mtime: 2025-04-01 +mtime: 2026-07-27 --- -import QuoteLink from '@components/QuoteLink.astro' - - - llms-full.txt.ts - - `llms.txt`는 웹사이트나 애플리케이션이 자신이 사용하는 LLM(대규모 언어 모델) 및 관련 설정에 대해 명시적으로 문서화할 수 있는 포맷이다. 아래 링크들은 `llms.txt` 포맷이 실제로 어떻게 사용되고 있는지 참고한 자료들. 각 사이트는 자신들의 문서를 `llms.txt`에 구조적으로 명시하고 있다. diff --git a/src/content/memo/552.mdx b/src/content/memo/552.mdx index 4f2c2ae..b1876c0 100644 --- a/src/content/memo/552.mdx +++ b/src/content/memo/552.mdx @@ -3,7 +3,7 @@ type: snippet tags: ['tunneling', 'websocket', 'vercel-sandbox', 'networking'] status: release ctime: 2026-06-07 -mtime: 2026-06-28 +mtime: 2026-07-27 title: vgrok - 터널링의 핵심은 역방향 영속 연결 --- @@ -67,5 +67,5 @@ await sandbox.runCommand({ cmd: 'node', args: ['server.js'], detached: true }) --- -- [vgrok](https://github.com/vercel-labs/vgrok) +- [vgrok](https://github.com/styfle/vgrok) - [Vercel Sandbox](https://vercel.com/docs/vercel-sandbox) diff --git a/src/content/memo/58.md b/src/content/memo/58.md index ef53221..b1f1d6c 100644 --- a/src/content/memo/58.md +++ b/src/content/memo/58.md @@ -3,14 +3,12 @@ type: bookmarks tags: ['esm', 'node'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- [imagemin](https://github.com/imagemin/imagemin)을 사용하려고 하는데 [module](https://nodejs.org/api/esm.html)로 라이브러리가 업데이트 되어서 찾아본 내용. 혼란스러운 부분도 있지만 성숙해지는 과정이라고 본다. - [Pure ESM package · GitHub](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c) -- [Get Ready For ESM. JavaScript Modules will soon be a… | by Sindre Sorhus | 🦄 Sindre Sorhus’ blog](https://blog.sindresorhus.com/get-ready-for-esm-aa53530b3f77) -- [Hello, Modules!. JavaScript Modules, also known as ESM… | by Sindre Sorhus | 🦄 Sindre Sorhus’ blog](https://blog.sindresorhus.com/hello-modules-d1010b4e777b) - [Publish ESM and CJS in a single package](https://antfu.me/posts/publish-esm-and-cjs)[^58-1] --- diff --git a/src/content/memo/63.md b/src/content/memo/63.md index 16cabe4..577aa06 100644 --- a/src/content/memo/63.md +++ b/src/content/memo/63.md @@ -3,11 +3,11 @@ type: note tags: ['node', 'image', 'imagemin'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - 이미지 압축 기본 설정값 참조: mozjpeg(75), pngquant([75, 85])[^63-1] --- -[^63-1]: https://github.com/antonreshetov/image-optimizer/blob/master/src/main/store/module/app.js#L32-L53 \ No newline at end of file +[^63-1]: https://github.com/antonreshetov/image-optimizer/blob/master/src/main/store/module/app.ts#L33-L53 \ No newline at end of file diff --git a/src/content/memo/74.md b/src/content/memo/74.md index 74946bf..1266807 100644 --- a/src/content/memo/74.md +++ b/src/content/memo/74.md @@ -3,7 +3,7 @@ type: snippet tags: ['ffmpeg', 'video'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- ```shell @@ -36,4 +36,4 @@ encodingVideo() { --- - [Encoding Video -](https://gist.github.com/Vestride/278e13915894821e1d6f) \ No newline at end of file +](https://gist.github.com/glen-cheney/278e13915894821e1d6f) \ No newline at end of file From c7ee53152a028c4b9b9ab24a9a29f4b9d04fdd80 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 06:25:42 +0000 Subject: [PATCH 5/5] =?UTF-8?q?memo:=2078=20=EC=97=90=EC=84=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=EB=90=9C=20=EC=A0=80=EC=9E=A5=EC=86=8C=20=EB=A7=81?= =?UTF-8?q?=ED=81=AC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cbcruk/cse-events 는 저자가 삭제한 저장소다 (비인증 404 로는 삭제와 비공개를 구분할 수 없어 확인받았다). 남은 Google CSE API 문서 링크가 이 메모의 실제 참조점이다. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/content/memo/78.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/content/memo/78.md b/src/content/memo/78.md index c2fc8b0..18317db 100644 --- a/src/content/memo/78.md +++ b/src/content/memo/78.md @@ -3,7 +3,7 @@ type: note tags: ['cse', 'api'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- > 검색기능을 정말 간단하게 구현하고 싶을때: @@ -11,5 +11,4 @@ mtime: 2024-03-22 --- -- [Method: cse.siterestrict.list](https://developers.google.com/custom-search/v1/reference/rest/v1/cse.siterestrict/list) -- [cbcruk/cse-events](https://github.com/cbcruk/cse-events) \ No newline at end of file +- [Method: cse.siterestrict.list](https://developers.google.com/custom-search/v1/reference/rest/v1/cse.siterestrict/list) \ No newline at end of file