Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`가 그 경우).

### 하지 말 것

Expand Down Expand Up @@ -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개 파일에 태그 적용
Expand Down
165 changes: 0 additions & 165 deletions public/iframe/date-single-source.html

This file was deleted.

4 changes: 2 additions & 2 deletions src/content/memo/232.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
4 changes: 2 additions & 2 deletions src/content/memo/310.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ title: React Router의 Link 컴포넌트 테스트하기
description: 이 글에서는 React Router의 <Link /> 컴포넌트를 테스트하는 방법을 설명합니다. 사용자가 링크를 클릭하면 적절한 페이지로 이동하는지 확인하는 테스트 코드를 예제와 함께 제공합니다.
status: release
ctime: 2024-08-06
mtime: 2024-08-06
mtime: 2026-07-27
---

React 애플리케이션에서 라우팅은 중요한 부분. 특히, 사용자가 링크를 클릭할 때 적절한 페이지로 이동하는지 테스트하는 것은 중요. 다음은 [React Router](https://reactrouter.com/en/main)의 `<Link />` 컴포넌트를 테스트하는 코드.
Expand Down Expand Up @@ -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
8 changes: 1 addition & 7 deletions src/content/memo/491.mdx → src/content/memo/491.md
Original file line number Diff line number Diff line change
Expand Up @@ -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'

<QuoteLink url="https://github.com/Effect-TS/website/blob/main/content/src/pages/llms-full.txt.ts">
llms-full.txt.ts
</QuoteLink>

`llms.txt`는 웹사이트나 애플리케이션이 자신이 사용하는 LLM(대규모 언어 모델) 및 관련 설정에 대해 명시적으로 문서화할 수 있는 포맷이다.

아래 링크들은 `llms.txt` 포맷이 실제로 어떻게 사용되고 있는지 참고한 자료들. 각 사이트는 자신들의 문서를 `llms.txt`에 구조적으로 명시하고 있다.
Expand Down
4 changes: 2 additions & 2 deletions src/content/memo/552.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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 - 터널링의 핵심은 역방향 영속 연결
---

Expand Down Expand Up @@ -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)
13 changes: 3 additions & 10 deletions src/content/memo/576.mdx → src/content/memo/576.md
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -34,14 +32,9 @@ export const formatDate = (
): string => dayjs(date).format(format)
```

<AutoIframe
src="/iframe/date-single-source.html"
title="단일 출처 — DATE_FORMATS 배열에서 타입·통로·가드가 파생, dayjs(키=값, 객체X) vs i18n(키≠값, 객체O) 대비"
/>

규율: **여러 곳에서 통일이 필요한 표기만** 배열에 담는다. 일회성(`'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·컴파일 최적화가 풀 문제 자체가 없다. 닫힌 타입 + 함수 하나로 충분.
4 changes: 1 addition & 3 deletions src/content/memo/58.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]

---
Expand Down
4 changes: 2 additions & 2 deletions src/content/memo/63.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
[^63-1]: https://github.com/antonreshetov/image-optimizer/blob/master/src/main/store/module/app.ts#L33-L53
4 changes: 2 additions & 2 deletions src/content/memo/74.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ type: snippet
tags: ['ffmpeg', 'video']
status: release
ctime: 2022-04-09
mtime: 2024-03-22
mtime: 2026-07-27
---

```shell
Expand Down Expand Up @@ -36,4 +36,4 @@ encodingVideo() {
---

- [Encoding Video
](https://gist.github.com/Vestride/278e13915894821e1d6f)
](https://gist.github.com/glen-cheney/278e13915894821e1d6f)
5 changes: 2 additions & 3 deletions src/content/memo/78.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@ type: note
tags: ['cse', 'api']
status: release
ctime: 2022-04-09
mtime: 2024-03-22
mtime: 2026-07-27
---

> 검색기능을 정말 간단하게 구현하고 싶을때:
> 프로그래밍 가능한 검색 엔진을 사용하면 웹사이트, 블로그 또는 웹사이트 모음에 대한 검색 엔진을 만들 수 있습니다. 웹 페이지와 이미지를 모두 검색하도록 엔진을 구성할 수 있습니다. 순위를 미세 조정하고 자신의 프로모션을 추가하고 검색 결과의 모양과 느낌을 사용자 지정할 수 있습니다. 엔진을 Google 애드센스 계정에 연결하여 검색으로 수익을 창출할 수 있습니다.

---

- [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)
- [Method: cse.siterestrict.list](https://developers.google.com/custom-search/v1/reference/rest/v1/cse.siterestrict/list)
Loading