diff --git a/.claude/skills/create-memo/SKILL.md b/.claude/skills/create-memo/SKILL.md index ac11a19..5894d19 100644 --- a/.claude/skills/create-memo/SKILL.md +++ b/.claude/skills/create-memo/SKILL.md @@ -9,27 +9,54 @@ description: 새 메모 파일을 src/content/memo/에 생성합니다. Use when ## 실행 방법 -`scripts/create-memo.mjs`를 실행하여 빈 메모를 생성: +`scripts/create-memo.mjs`를 실행하여 빈 메모를 생성. 첫 인자로 `type`(형태)을 넘긴다: ```bash -node scripts/create-memo.mjs +node scripts/create-memo.mjs bookmarks # 링크 모음 +node scripts/create-memo.mjs snippet # 코드가 주인공 +node scripts/create-memo.mjs note # 산문이 주인공 (기본값) ``` 스크립트는 다음을 자동으로 처리: - `src/content/memo/` 내 가장 큰 숫자 ID + 1 - `ctime`, `mtime`을 오늘 날짜로 설정 -- 빈 `tags: []`, `status: draft` frontmatter +- 빈 `tags: []` +- `status`: `bookmarks`는 `archive`, 나머지는 `draft` (Status 기준은 CLAUDE.md 참고) + +`type`과 본문 형태가 어긋나면 빌드가 잡는다 (`pnpm lint:memo`). ## 작업 순서 1. **사용자 의도 파악**: 메모 주제/내용/태그를 사용자가 함께 제공했는지 확인 -2. **스크립트 실행**: `node scripts/create-memo.mjs` 실행 → 생성된 파일명 확인 +2. **스크립트 실행**: `node scripts/create-memo.mjs ` 실행 → 생성된 파일명 확인 3. **내용 작성** (사용자가 주제/내용을 제공한 경우): - 적절한 태그 추가 (kebab-case) - - CLAUDE.md의 메모 유형(A~E) 중 적합한 템플릿 선택 + - CLAUDE.md의 메모 유형(A~F) 중 적합한 템플릿 선택 - 본문 작성 -4. **중복 확인**: 유사 태그/주제 기존 메모가 있으면 사용자에게 알리고 통합 여부 확인 -5. **관계 탐지 (계보 연결)**: 아래 "관계 자동화" 절차 수행 +4. **압축 확인 (필수)**: 아래 "압축 확인" 절차 수행 +5. **중복 확인**: 유사 태그/주제 기존 메모가 있으면 사용자에게 알리고 통합 여부 확인 +6. **관계 탐지 (계보 연결)**: 아래 "관계 자동화" 절차 수행 + +## 압축 확인 (필수) + +**외부 문서를 요약해 넣으면 존댓말이 따라 들어온다.** 그게 곧 "아직 저자의 언어로 줄이지 않은 남의 문장"이다. 압축 원칙은 CLAUDE.md "압축" 참고. + +작성 직후 스스로 점검한다: + +1. **문체** — 본문이 평서체(`~다`)인가? 존댓말(`~합니다`)이 있으면 원문을 옮긴 것이다. 줄이거나, 인용이면 `>`·`QuoteLink`로 표시한다. (저자 본인이 존댓말로 쓴 경우에만 frontmatter에 `voice: author`) +2. **1인칭** — "제가 만든", "저희 팀은" 같은 표현은 원문 저자의 1인칭이 따라 들어온 것이다 (268.md가 그랬다). +3. **반복** — 같은 내용이 두 단락에 있으면 기계 요약의 흔적이다 (272.md). +4. **각주** — 각주도 압축 대상이다. 링크 제목에 이미 있는 내용을 늘려 쓰지 않는다 (83.md는 각주 하나가 5문장이었다). + +검사 명령: + +```bash +pnpm lint:voice # 남의 문장이 남은 메모 찾기 (빌드에도 연결됨) +pnpm lint:memo # type 과 본문 형태가 맞는지 (빌드에도 연결됨) +``` + +> [!IMPORTANT] +> 압축하면 형태가 바뀔 수 있다. 부풀린 산문을 걷어내면 남는 게 링크뿐일 수 있고, 그러면 `type`도 함께 고친다 (`pnpm lint:memo`가 잡아준다). ## 관계 자동화 (parent / relation) @@ -37,13 +64,18 @@ node scripts/create-memo.mjs ### 절차 -1. **후보 탐색**: 새 메모의 태그로 관련 기존 메모를 찾는다. +1. **후보 탐색**: 두 신호로 찾는다 — 공유 태그(IDF 가중)와 **공유 URL**. ```bash - node scripts/find-related.mjs tag1,tag2 + node scripts/find-related.mjs 578 # 파일 생성 후: 태그 + URL 둘 다 + node scripts/find-related.mjs tag1,tag2 # 파일 전이면: 태그만 ``` - (IDF 가중 점수 순으로 release 메모 후보 + 첫 줄 출력) + 본문에 링크를 이미 붙여놨다면 **메모 ID로 호출한다.** 같은 URL을 가리키는 메모가 `공유 URL n`으로 표시되고, 어떤 URL이 겹치는지 `↳`로 나온다. + + **URL 겹침이 태그보다 강한 증거다.** 같은 글을 가리키는 메모쌍 29개 중 14쌍은 공유 태그가 0개라 태그만으로는 영원히 만나지 못한다 (→ 577.md). + + 후보는 기본적으로 `release`만 나온다. `--all`을 붙이면 비공개까지 보이는데, 그건 계보가 아니라 **통합 후보**다 (`consolidate-memos` 스킬). 2. **관계 판단**: 상위 후보의 내용을 읽고 새 메모와의 관계를 판단한다. @@ -59,7 +91,8 @@ node scripts/create-memo.mjs - `parent`는 **하나만** 건다 (가장 직접적인 부모). 곁가지(branch)는 같은 부모를 공유하면 자동 도출되므로 명시 불필요. - 애매하면 **연결하지 않는다.** 약한 연결은 노이즈. 자동 관련 메모로 충분. -- `parent`는 `release` 메모만 해석됨 — draft를 부모로 걸지 않는다. +- `parent`는 `release` 메모만 해석됨 — draft·archive를 부모로 걸지 않는다. +- **URL이 겹치는데 계보가 아닌 경우도 있다.** 넓은 링크 모음이 특정 주제 메모와 한 링크를 공유하는 정도면 연결하지 않는다 (106↔365가 그런 경우). 같은 흐름의 작업 기록이어야 `parent`다 (229↔235). ## 메모 작성 원칙 (CLAUDE.md 준수) @@ -67,9 +100,10 @@ node scripts/create-memo.mjs - 코드가 핵심이면 코드만 - 헤딩은 정말 필요할 때만 - 서론/결론 구조 지양 +- 남의 문장을 그대로 옮긴 것은 메모가 아니다 (→ "압축 확인") ## 주의사항 - 주제가 명확하지 않으면 빈 파일만 생성하고 사용자에게 작성을 위임 -- `status`는 기본 `draft`, 완성도 확인 후 `release`로 변경 +- `status`: 작성 중이면 `draft`, 저장만 해두면 `archive`, 완성되면 `release`. **`bookmarks`는 `draft`를 쓰지 않는다** (링크는 붙여넣은 순간이 최종형) — 기준은 CLAUDE.md "Status 기준" 참고 - 태그가 애매하면 `[]`로 두는 것도 허용 diff --git a/CLAUDE.md b/CLAUDE.md index 121968a..a3ee32e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -25,6 +25,18 @@ - 공개용이면 **개인 종속(내 라이브러리·작업 맥락)도 제거**. - ⚠ AI로 정리하면 *일반적으로 인상적인 디테일*로 흐른다 (구체 숫자·보안 사례 등). 신선함은 사람이 직접 짚어야 한다. +### 압축 (필수) + +**남의 문장을 그대로 옮긴 것은 메모가 아니다.** 한 줄로 줄여지지 않으면 아직 이해하지 못한 것. + +- **존댓말은 신호다.** 번역문·AI 요약·문서 발췌는 "~합니다"로 들어온다. 내 메모는 평서체("~다")로 쓴다. 인용 표시 없이 존댓말이 지배하는 산문 = 아직 내 언어로 줄이지 않은 남의 문장 (→ 577.md) +- **인용할 거면 인용 표시를 한다** — `>` 또는 `QuoteLink`. 출처를 밝힌 인용은 정직하고, 표시 없는 번역문이 문제다. +- **1인칭을 확인한다.** 원문을 옮기면 "제가 만든 이유"처럼 남의 1인칭이 따라 들어온다 (268.md가 그랬다). +- **걷어내면 형태가 드러난다.** 부풀린 산문을 지우면 남는 게 링크뿐일 수 있다 → `type`이 바뀐다 (268.md: `note` → `bookmarks`). +- 같은 내용이 두 단락에 반복되면 기계 요약의 흔적이다 (272.md). +- **검출은 `pnpm lint:voice`** — 빌드에 연결됨. `release` 메모에서 검출되면 빌드가 실패하고, `draft`·`archive`는 경고까지만이다(작성 중에는 원문을 붙여놓고 줄이는 단계가 있으므로). +- 단 이 도구는 **확인 대상을 제시하고 판단은 사람이 한다** — 저자가 존댓말로 쓴 자기 글과 번역문이 같은 신호로 잡힌다. 본인 문체라고 판단했으면 frontmatter에 **`voice: author`**를 달아 제외한다. "린트를 무시한다"가 아니라 "이 문체는 내 것이다"라는 사실을 적는 것 (`309.md`가 그 경우). + ### 하지 말 것 - 서론 → 본론 → 결론 구조 @@ -55,12 +67,14 @@ ```yaml --- +type: note # 필수, 'bookmarks' | 'snippet' | 'note' tags: ['tag1', 'tag2'] # 필수, 빈 배열 [] 허용 -status: draft # 필수, 'draft' 또는 'release' +status: draft # 필수, 'draft' | 'archive' | 'release' ctime: YYYY-MM-DD # 필수, 생성일 mtime: YYYY-MM-DD # 필수, 수정일 title: 제목 # 선택 description: 설명 # 선택 +voice: author # 선택, 이 메모의 존댓말이 저자 본인의 것일 때 (lint:voice 제외) parent: '307' # 선택, 이 메모가 이어지는/대체하는 부모 메모 ID relation: continues # 선택, 'continues'(기본) 또는 'supersedes' --- @@ -72,30 +86,49 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' | 레이어 | 필드 | 의미 | |---|---|---| -| 자동 유사도 | (없음) | 공유 태그 IDF 가중 → "관련 메모" 자동 노출 | +| 자동 유사도 | (없음) | 공유 태그 IDF 가중 → "관련 메모" 자동 노출 (사이트) | | 방향 계보 | `parent` | 이 메모가 어떤 메모에서 이어졌는지 (시간/계보) | | 관계 종류 | `relation` | `continues`(이어짐) / `supersedes`(부모를 대체) | - **thread**: `parent` 체인을 따라가면 도출됨 - **branch**: 같은 `parent`를 가진 메모가 2개 이상 = 자동 분기 (별도 표기 불필요) - **supersedes**: `relation: supersedes`면 부모 페이지에 "대체됨" 경고 표시 -- `parent`는 `release` 메모만 해석됨 (draft는 공개되지 않음) +- `parent`는 `release` 메모만 해석됨 (draft·archive는 공개되지 않음) +- **후보 탐색은 `node scripts/find-related.mjs <메모ID>`** — 공유 태그와 **공유 URL** 두 신호를 본다. 같은 글을 가리키는 메모쌍 29개 중 14쌍은 공유 태그가 0개라 태그만으로는 만나지 못한다. `--all`은 비공개까지 보여주는데 그건 계보가 아니라 통합 후보다 → 577.md + +### Type 기준 + +`type`은 **형태**만 담는다. **주제는 `tags`가 담당** — 둘을 섞지 않는다. + +| 값 | 의미 | 판별 | +|---|---|---| +| `bookmarks` | 링크 모음이 주인공 | 코드 없음 + 불릿이 대부분 링크 | +| `snippet` | 코드가 주인공 | 코드 블록 있음 + 산문은 그걸 설명하는 정도 | +| `note` | 산문이 주인공 | 나머지 (기술 문서·비교·아이디어·디버그 전부) | + +- **`type`과 본문이 어긋나면 빌드가 잡는다** — `pnpm lint:memo` (빌드에 연결됨). 논리적 모순(`snippet`인데 코드 없음 등)은 오류, 휴리스틱 불일치는 경고. `draft`는 경고까지만. +- `debug`, `comparison` 같은 **목적/주제는 `type`이 아니라 `tags`에 넣는다.** 형태를 태그에 넣으면 태그가 두 일을 하게 되고 유사도 계산에 예외가 생긴다 (이전 `bookmarks` 태그가 그랬다 → 577.md). +- 아래 유형 템플릿(A~F)은 **본문을 어떻게 쓸지에 대한 가이드**이고, `type`과 1:1이 아니다. C·D·E·F는 모두 `type: note`다. ### Status 기준 | 값 | 의미 | |---|---| -| `draft` | 작성 중, 비공개 | +| `draft` | 작성 중, 비공개 (완성 예정) | +| `archive` | 저장/보관, 비공개 (완성 예정 없음) | | `release` | 완성됨, 공개 가능 | +- **`bookmarks`는 `draft`를 쓰지 않는다.** 링크는 붙여넣은 순간이 최종형이라 "작성 중"이 없다 → `archive`(보관) 아니면 `release`(공개). +- `draft`를 "공개 안 함"으로 쓰면 안 된다. 그러면 작성 중 큐가 방치된 메모로 막힌다 (231개가 그랬다 → 577.md). +- 비공개 목록은 로컬에서만 보인다: `/memos/draft`, `/memos/archive` (프로덕션에서는 비어 있음) + ### 태그 규칙 - **네이밍**: kebab-case - O: `design-system`, `react-query`, `google-apps-script` - X: `design_system`, `reactQuery` - **빈 태그**: `[]` 허용 (분류가 애매한 경우) -- **특수 태그**: - - `bookmarks` - 링크 모음 형태의 메모 +- **형태는 태그가 아니다**: 링크 모음/코드 스니펫 같은 형태는 `type`으로 표기한다 (과거 `bookmarks` 태그는 `type: bookmarks`로 이동) ### 각주 규칙 @@ -105,6 +138,22 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' [^496-2]: 두 번째 각주 ``` +- **참조와 정의는 짝이 맞아야 한다** — `pnpm lint:memo`가 잡는다. 참조만 있으면 마커가 깨진 채 렌더되고, 정의만 있으면 렌더되지 않는다 (7개 파일이 그랬다). +- **각주도 압축 대상이다.** 링크 제목에 이미 있는 내용을 늘려 쓰지 않는다 (83.md는 각주 하나가 5문장이었다). + +### 링크 부식 + +메모의 진짜 부식은 링크다. `mtime`은 신선도가 아니다 — 542개 중 288개가 일괄 수정 자국이고 `ctime`도 182개가 마이그레이션 시점이다. 그래서 신선도를 날짜로 선언하지 않고 링크로 판정한다 (→ 577.md). + +```bash +pnpm lint:links # 전체 (URL 1776개, 호스트 793개) +pnpm lint:links --release # 공개 메모만 +pnpm lint:links 229 # 특정 메모만 +``` + +- **빌드에 연결하지 않는다** — 네트워크에 의존하고 느리며, 남의 서버 상태로 내 빌드가 깨지면 안 된다. +- 죽었다고 단정하는 건 **404·410·DNS 실패**뿐이다. 403·405·429·타임아웃은 봇 차단이 흔하므로 "확인 불가"로 따로 센다. + ### 본문 구조 자유 형식. 유형에 따라 적절히 선택. @@ -141,8 +190,9 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' ```markdown --- -tags: ['keyword', 'bookmarks'] -status: draft +type: bookmarks +tags: ['keyword'] +status: archive ctime: YYYY-MM-DD mtime: YYYY-MM-DD --- @@ -160,6 +210,7 @@ mtime: YYYY-MM-DD ```markdown --- +type: snippet tags: ['typescript', 'pattern'] status: release ctime: YYYY-MM-DD @@ -181,6 +232,7 @@ mtime: YYYY-MM-DD ```markdown --- +type: note tags: ['react', 'architecture'] status: draft ctime: YYYY-MM-DD @@ -212,6 +264,7 @@ description: 선택사항 ```markdown --- +type: note tags: ['library', 'comparison'] status: release ctime: YYYY-MM-DD @@ -235,6 +288,7 @@ mtime: YYYY-MM-DD ```markdown --- +type: note tags: ['idea', 'keyword'] status: draft ctime: YYYY-MM-DD @@ -260,6 +314,7 @@ mtime: YYYY-MM-DD ```markdown --- +type: note tags: ['debug', 'keyword'] status: release ctime: YYYY-MM-DD @@ -304,18 +359,28 @@ mtime: YYYY-MM-DD 1. **중복 확인**: 관련 태그/키워드로 기존 메모 검색 2. **파일 생성**: 다음 숫자 ID로 `.md` 생성 3. **유형 선택**: 위 템플릿 중 적절한 것 선택 -4. **태그 지정**: kebab-case로 관련 태그 추가 -5. **status**: 작성 중이면 `draft`, 완성되면 `release` +4. **type 지정**: `bookmarks` / `snippet` / `note` (형태) +5. **태그 지정**: kebab-case로 관련 태그 추가 (주제) +6. **status**: 작성 중이면 `draft`, 저장만 해두면 `archive`, 완성되면 `release` ### 메모 수정 1. `mtime` 업데이트 -2. 필요시 `status` 변경 (draft → release) +2. 필요시 `status` 변경 (draft → release, archive → release) --- ## 변경 이력 +- 각주 짝 정리: 7개 파일 (정의 없는 참조 3 / 참조 없는 정의 4). 정의가 남아 있던 3개는 번호 순서가 위치를 알려줘서 마커를 복원했고, 붙을 곳이 없던 1개는 삭제. `lint:memo`에 규칙 추가 +- 압축 원칙 추가: 존댓말을 "남의 문장" 신호로 사용. 검출 29개 → 0개 (공개 23개 → 0개). `lint:voice`를 빌드에 연결(`release`만 실패)하고, 저자 본인 문체는 `voice: author`로 표시 → 577.md + - 산문 삭제/압축: 268·272·274·46·173·21·56·243·307·149·329·247·271·340·23 + - 각주만 문제였던 것: 83·19·24·221·312 (링크 제목에 이미 있는 내용을 늘려 쓴 경우. 각주에 박혀 있던 기술 링크는 살렸다) + - 비공개도 정리: 123·125·171(각주), 182·256·267(산문). 125에서 중복 링크 1개 제거 + - `309.md`는 본인 작업 기록인데 존댓말이라 `voice: author`를 달아 예외로 표시 + - 걷어내니 형태가 드러나 `type`이 바뀐 것: 46·269·23·247·271·182·256(→`bookmarks`), 56·340(→`snippet`), 329(→`note`) - 태그 정규화: snake_case → kebab-case 변환 (23개 파일) - 빈 태그 메모: 28개 파일에 태그 적용 - 삭제: 427.md (내용 없음) +- `archive` 상태 도입: `bookmarks`의 `draft` 231개를 이동. `draft`가 "작성 중"과 "공개 안 함" 두 뜻으로 쓰이던 것을 분리 (작성 중 큐 268 → 37) → 577.md +- `type` 필드 도입 + 542개 파일 백필 (bookmarks 274 / snippet 188 / note 80). `bookmarks` 태그는 `type`으로 이동, 유사도 계산의 `STRUCTURAL_TAGS` 예외 제거 → 577.md diff --git a/package.json b/package.json index db8492e..f0163d3 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,14 @@ "scripts": { "dev": "astro dev", "start": "astro dev", - "build": "astro build", + "build": "node scripts/lint-memo.mjs && node scripts/lint-voice.mjs --strict && astro build", "preview": "astro preview", "astro": "astro", "test": "vitest", - "lint:fix": "eslint --fix ." + "lint:fix": "eslint --fix .", + "lint:memo": "node scripts/lint-memo.mjs", + "lint:voice": "node scripts/lint-voice.mjs", + "lint:links": "node scripts/lint-links.mjs" }, "dependencies": { "@astrojs/markdown-satteri": "0.3.2", diff --git a/scripts/create-memo.mjs b/scripts/create-memo.mjs index af7a6dd..a38ed99 100644 --- a/scripts/create-memo.mjs +++ b/scripts/create-memo.mjs @@ -22,16 +22,30 @@ function getFormattedTime() { return time } +const TYPES = ['bookmarks', 'snippet', 'note'] + +function getType() { + const [type = 'note'] = process.argv.slice(2) + + if (!TYPES.includes(type)) { + throw new Error(`type 은 ${TYPES.join(' | ')} 중 하나여야 한다: ${type}`) + } + + return type +} + async function main() { try { const nextIndex = await getNextIndex() const formattedTime = getFormattedTime() + const type = getType() await fs.writeFile( `src/content/memo/${nextIndex}.md`, `--- +type: ${type} tags: [] -status: draft +status: ${type === 'bookmarks' ? 'archive' : 'draft'} ctime: ${formattedTime} mtime: ${formattedTime} --- diff --git a/scripts/find-related.mjs b/scripts/find-related.mjs index 87ca709..31db73f 100644 --- a/scripts/find-related.mjs +++ b/scripts/find-related.mjs @@ -1,13 +1,26 @@ +/** + * parent 후보 찾기 — 공유 태그(IDF)와 공유 URL 두 신호를 함께 본다. + * + * 태그만 보면 놓치는 관계가 있다. 같은 글을 가리키는 메모쌍 29개 중 + * 14쌍은 공유 태그가 0개여서 태그 유사도로는 영원히 만나지 못한다. + * 같은 URL을 가리킨다는 건 태그보다 직접적인 증거다. (→ 577.md) + * + * node scripts/find-related.mjs 229 메모 ID (태그 + URL 둘 다) + * node scripts/find-related.mjs react,rsc 태그만 + * node scripts/find-related.mjs 229 --all 비공개까지 (통합 후보) + * + * 기본은 `release` 후보만 — `parent`는 공개된 메모에서만 해석된다. + * URL이 겹치는 29쌍 중 16쌍은 양쪽 다 비공개(주로 archive 링크 덤프)라 + * `--all` 로만 보인다. 그건 계보가 아니라 통합 후보다. + */ import fs from 'node:fs/promises' import fg from 'fast-glob' -const STRUCTURAL_TAGS = new Set(['bookmarks']) - function parseFrontmatter(raw) { const match = raw.match(/^---\n([\s\S]*?)\n---/) const fm = match ? match[1] : '' - const tagsLine = fm.match(/^tags:\s*\[(.*)\]/m) + const tagsLine = fm.match(/^tags:\s*\[([\s\S]*?)\]/m) const tags = tagsLine ? tagsLine[1] .split(',') @@ -20,6 +33,30 @@ function parseFrontmatter(raw) { return { tags, status } } +// 쿼리를 버리면 youtube.com/watch?v=... 가 전부 같은 URL로 뭉친다 +function normalizeUrl(url) { + try { + const parsed = new URL(url) + + return ( + parsed.host.replace(/^www\./, '') + + parsed.pathname.replace(/\/$/, '') + + (parsed.search || '') + ) + } catch { + return url + } +} + +function extractUrls(raw) { + const body = raw.replace(/^---\n[\s\S]*?\n---\n/, '') + const found = [...body.matchAll(/https?:\/\/[^\s)\]<>"']+/g)].map(([url]) => + normalizeUrl(url.replace(/[.,]+$/, '')) + ) + + return new Set(found) +} + function firstLine(raw) { const body = raw.replace(/^---\n[\s\S]*?\n---\n/, '') let insideFence = false @@ -48,16 +85,22 @@ async function main() { process.exit(1) } + const includeUnpublished = process.argv.includes('--all') const entries = await fg.glob('./src/content/memo/*.{md,mdx}') const memos = await Promise.all( entries.map(async (path) => { const raw = await fs.readFile(path, 'utf-8') const id = path.match(/\/(\d+)\.(md|mdx)$/)[1] - return { id, raw, ...parseFrontmatter(raw) } + return { id, raw, urls: extractUrls(raw), ...parseFrontmatter(raw) } }) ) + const candidates = includeUnpublished + ? memos + : memos.filter((memo) => memo.status === 'release') + + // IDF 는 공개된 코퍼스 기준으로 고정한다 (--all 여부로 점수가 흔들리지 않게) const release = memos.filter((memo) => memo.status === 'release') const df = new Map() @@ -70,32 +113,58 @@ async function main() { const isId = /^\d+$/.test(arg) const source = isId ? memos.find((memo) => memo.id === arg) : null + + if (isId && !source) { + console.error(`memo ${arg} not found`) + process.exit(1) + } + const sourceTags = new Set( - (isId ? (source?.tags ?? []) : arg.split(',').map((value) => value.trim())) - .filter((tag) => !STRUCTURAL_TAGS.has(tag)) + isId ? source.tags : arg.split(',').map((value) => value.trim()) ) + // 태그로 호출하면 아직 파일이 없을 수 있으므로 URL 신호는 ID 호출에서만 + const sourceUrls = isId ? source.urls : new Set() - if (sourceTags.size === 0) { - console.error('no usable tags') + if (sourceTags.size === 0 && sourceUrls.size === 0) { + console.error('no usable tags or urls') process.exit(1) } - const ranked = release + const ranked = candidates .filter((memo) => memo.id !== arg) - .map((memo) => ({ - memo, - score: memo.tags - .filter((tag) => sourceTags.has(tag)) - .reduce((sum, tag) => sum + idf(tag), 0), - })) + .map((memo) => { + const sharedTags = memo.tags.filter((tag) => sourceTags.has(tag)) + const sharedUrls = [...memo.urls].filter((url) => sourceUrls.has(url)) + const tagScore = sharedTags.reduce((sum, tag) => sum + idf(tag), 0) + + // 같은 URL을 가리키는 건 공유 태그 하나보다 강한 증거다 + return { memo, sharedUrls, tagScore, score: tagScore + sharedUrls.length } + }) .filter(({ score }) => score > 0) .sort((a, b) => b.score - a.score) .slice(0, 8) - for (const { memo, score } of ranked) { + if (ranked.length === 0) { + console.log('후보 없음') + return + } + + for (const { memo, sharedUrls, tagScore } of ranked) { + const signals = [`태그 ${tagScore.toFixed(2)}`] + + if (sharedUrls.length > 0) { + signals.push(`공유 URL ${sharedUrls.length}`) + } + + const status = memo.status === 'release' ? '' : ` (${memo.status})` + console.log( - `#${memo.id} ${score.toFixed(2)} [${memo.tags.join(', ')}] ${firstLine(memo.raw)}` + `#${memo.id}${status} ${signals.join(' / ')} [${memo.tags.join(', ')}] ${firstLine(memo.raw)}` ) + + for (const url of sharedUrls.slice(0, 3)) { + console.log(` ↳ ${url}`) + } } } diff --git a/scripts/lint-links.mjs b/scripts/lint-links.mjs new file mode 100644 index 0000000..0fe3270 --- /dev/null +++ b/scripts/lint-links.mjs @@ -0,0 +1,219 @@ +/** + * 죽은 링크 찾기 — 메모의 진짜 부식은 링크다. + * + * 코퍼스의 절반이 `bookmarks`이고 본문이 링크뿐이라, 죽은 링크는 곧 + * 메모 전체가 무효라는 뜻이다. `mtime`은 신선도가 아니다 — 542개 중 + * 288개가 일괄 수정 자국(2024-03-22)이고 `ctime`도 182개가 마이그레이션 + * 시점(2022-04-09)이다. 그래서 신선도는 선언하지 않고 링크로 판정한다. + * (→ 577.md) + * + * 빌드에 연결하지 않는다 — 네트워크에 의존하고 느리고, 남의 서버 상태로 + * 내 빌드가 깨지면 안 된다. 가끔 돌리는 도구. + * + * node scripts/lint-links.mjs 전체 + * node scripts/lint-links.mjs --release 공개 메모만 + * node scripts/lint-links.mjs 229 특정 메모만 + * node scripts/lint-links.mjs --strict 죽은 링크가 있으면 exit 1 + * + * 403·405·429·타임아웃은 "죽음"으로 세지 않는다 — 봇 차단이 흔하다. + * 죽었다고 단정하는 건 404·410·DNS 실패뿐이다. + */ +import fs from 'node:fs/promises' +import fg from 'fast-glob' + +const CONCURRENCY = 8 +const TIMEOUT_MS = 10000 + +const args = process.argv.slice(2) +const releaseOnly = args.includes('--release') +const strict = args.includes('--strict') +const onlyId = args.find((arg) => /^\d+$/.test(arg)) + +const collectUrls = (raw) => { + const body = raw.replace(/^---\n[\s\S]*?\n---\n/, '') + let insideFence = false + const lines = [] + + for (const line of body.split('\n')) { + if (/^\s*```/.test(line)) { + insideFence = !insideFence + continue + } + // 코드 안의 URL은 예시일 수 있다 (실제로 열어보는 링크가 아니다) + if (!insideFence) lines.push(line) + } + + return new Set( + [...lines.join('\n').matchAll(/https?:\/\/[^\s)\]<>"'`]+/g)].map(([url]) => + url.replace(/[.,]+$/, '') + ) + ) +} + +const check = async (url) => { + const attempt = async (method) => { + const controller = new AbortController() + const timer = setTimeout(() => controller.abort(), TIMEOUT_MS) + + try { + const response = await fetch(url, { + method, + redirect: 'follow', + signal: controller.signal, + headers: { + // 봇 차단을 조금이라도 줄인다 + 'user-agent': + 'Mozilla/5.0 (compatible; memo-link-check/1.0; +https://cbcruk.github.io)', + }, + }) + + return { status: response.status } + } finally { + clearTimeout(timer) + } + } + + try { + // HEAD 를 막는 서버가 많아서 실패하면 GET 으로 한 번 더 + let { status } = await attempt('HEAD') + + if (status === 405 || status === 501 || status === 403) { + status = (await attempt('GET')).status + } + + if (status === 404 || status === 410) { + return { verdict: 'dead', detail: String(status) } + } + if (status >= 200 && status < 400) { + return { verdict: 'alive', detail: String(status) } + } + + return { verdict: 'unknown', detail: String(status) } + } catch (error) { + const code = error?.cause?.code ?? error?.code ?? error?.name ?? 'error' + + // 도메인이 사라진 것은 죽음으로 본다 + if (code === 'ENOTFOUND') { + return { verdict: 'dead', detail: 'ENOTFOUND' } + } + + return { verdict: 'unknown', detail: String(code), network: true } + } +} + +const mapWithLimit = async (items, limit, worker) => { + const results = [] + let cursor = 0 + let done = 0 + + const run = async () => { + while (cursor < items.length) { + const index = cursor++ + + results[index] = await worker(items[index]) + done++ + + if (done % 25 === 0) { + process.stderr.write(`\r ${done}/${items.length} 확인`) + } + } + } + + await Promise.all(Array.from({ length: limit }, run)) + + if (items.length >= 25) process.stderr.write('\r'.padEnd(30) + '\r') + + return results +} + +const main = async () => { + const dir = process.env.MEMO_DIR ?? './src/content/memo' + const entries = await fg.glob(`${dir}/*.{md,mdx}`) + const memos = [] + + for (const path of entries) { + const raw = await fs.readFile(path, 'utf-8') + const id = path.match(/\/(\d+)\.(md|mdx)$/)[1] + const status = + (raw.match(/^status:\s*(\w+)/m) ?? [])[1] ?? 'draft' + + if (onlyId && id !== onlyId) continue + if (releaseOnly && status !== 'release') continue + + memos.push({ id, status, urls: collectUrls(raw) }) + } + + // URL 하나를 여러 메모가 가리킬 수 있으니 한 번만 확인한다 + const owners = new Map() + + for (const memo of memos) { + for (const url of memo.urls) { + owners.set(url, [...(owners.get(url) ?? []), memo]) + } + } + + const urls = [...owners.keys()] + + if (urls.length === 0) { + console.log('확인할 링크가 없다') + return + } + + console.log(`메모 ${memos.length}개 / 링크 ${urls.length}개 확인 중...`) + + const results = await mapWithLimit(urls, CONCURRENCY, async (url) => ({ + url, + ...(await check(url)), + })) + + const networkFailures = results.filter(({ network }) => network).length + + // 프록시·오프라인이면 전부 실패한다 — 그걸 "죽은 링크"라고 보고하면 거짓이다 + if (networkFailures > urls.length / 2) { + console.error( + `\n네트워크로 나갈 수 없다 (${networkFailures}/${urls.length} 연결 실패).\n` + + '링크 상태를 판정하지 않고 종료한다. 직접 네트워크가 되는 곳에서 실행할 것.' + ) + process.exit(2) + } + + const dead = results.filter(({ verdict }) => verdict === 'dead') + const unknown = results.filter(({ verdict }) => verdict === 'unknown') + + const label = (url) => + owners + .get(url) + .map(({ id, status }) => `#${id}${status === 'release' ? '' : `(${status})`}`) + .join(' ') + + for (const { url, detail } of dead) { + console.log(`✗ ${detail} ${url}\n ${label(url)}`) + } + for (const { url, detail } of unknown) { + console.log(`? ${detail} ${url}\n ${label(url)}`) + } + + console.log( + `\n죽은 링크 ${dead.length}개, 확인 불가 ${unknown.length}개 ` + + `(살아 있음 ${results.length - dead.length - unknown.length}개)` + ) + + if (unknown.length > urls.length / 2) { + // 프록시가 CONNECT 를 막으면 연결 오류가 아니라 403 이 온다 (이 저장소의 + // 원격 실행 환경이 그렇다) — 그때도 죽었다고 단정하지 않는다 + console.log( + '확인 불가가 절반을 넘는다. 네트워크 경로가 걸러지고 있을 수 있으니\n' + + '판정을 신뢰하지 말고 직접 네트워크가 되는 곳에서 다시 실행할 것.' + ) + } else if (unknown.length > 0) { + console.log( + '확인 불가는 봇 차단·타임아웃일 수 있다. 브라우저로 직접 확인할 것.' + ) + } + + if (strict && dead.length > 0) { + process.exit(1) + } +} + +main() diff --git a/scripts/lint-memo.mjs b/scripts/lint-memo.mjs new file mode 100644 index 0000000..8371268 --- /dev/null +++ b/scripts/lint-memo.mjs @@ -0,0 +1,222 @@ +import fs from 'node:fs' +import path from 'node:path' + +const DIR = process.env.MEMO_DIR ?? 'src/content/memo' +const strict = process.argv.includes('--strict') + +const NON_CODE_FENCE = /^(md|markdown|text|plaintext)$/i + +/** + * 본문에서 형태 신호를 추출한다. + * - 코드 펜스: ```md 처럼 산문을 인용한 펜스는 코드로 세지 않는다 + * - 링크: 불릿 링크 + 맨 URL 줄 + * - 산문: 불릿/헤딩/각주정의/JSX/import 를 제외한 줄 + */ +const analyze = (raw) => { + const parsed = raw.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/) + + if (!parsed) { + return null + } + + const [, frontmatter, body] = parsed + + let inFence = false + let fenceIsCode = true + let codeLines = 0 + const kept = [] + + for (const line of body.split('\n')) { + const fence = line.match(/^\s*```([a-zA-Z]*)/) + + if (fence) { + if (inFence) { + inFence = false + } else { + inFence = true + fenceIsCode = !NON_CODE_FENCE.test(fence[1]) + } + + continue + } + + if (inFence) { + if (line.trim() && fenceIsCode) { + codeLines++ + } + + continue + } + + kept.push(line) + } + + const isBareUrl = (line) => /^\s*?\s*$/.test(line) + + const meaningful = kept.filter((line) => { + const text = line.trim() + + if (!text || text === '---') return false + if (/^import\s/.test(text)) return false // mdx import + if (/^<\/?[A-Z]/.test(text) || /^\/>$/.test(text) || /^>$/.test(text)) { + return false // JSX + } + if (/^\[\^[^\]]+\]:/.test(text)) return false // 각주 정의 + + return true + }) + + const bullets = meaningful.filter( + (line) => /^\s*[-*]\s/.test(line) || isBareUrl(line) + ) + const linkBullets = bullets.filter( + (line) => + /\[[^\]]*\]\((https?:|\/)/.test(line) || + /^\s*[-*]\s+ + !/^\s*[-*]\s/.test(line) && + !/^#{1,4}\s/.test(line) && + !/^\s*\d+\.\s/.test(line) && + !isBareUrl(line) + ) + + // 각주 참조/정의 — 인라인 코드를 지운다 (정규식 문자클래스 `[^"\\]` 가 각주로 잡힌다) + const text = kept.join('\n').replace(/`[^`\n]*`/g, '') + const footnoteDefs = new Set( + [...text.matchAll(/^\[\^([^\]]+)\]:/gm)].map(([, id]) => id) + ) + const footnoteRefs = new Set( + [...text.matchAll(/\[\^([^\]]+)\](?!:)/g)].map(([, id]) => id) + ) + + return { + frontmatter, + codeLines, + bullets: bullets.length, + linkBullets: linkBullets.length, + proseChars: prose.join(' ').length, + isEmpty: meaningful.length === 0 && codeLines === 0, + footnoteDefs, + footnoteRefs, + } +} + +/** + * type 은 형태(shape)만 담는다. 주제는 tags 가 담당한다. + * - snippet: 코드가 주인공 + * - bookmarks: 링크 목록이 주인공, 코드 없음 + * - note: 나머지 (산문 중심) + */ +const classify = (a) => { + if (a.codeLines >= 5) return 'snippet' + if (a.codeLines >= 1 && a.proseChars <= 200) return 'snippet' + + if (a.codeLines === 0 && a.linkBullets >= 1) { + const ratio = a.linkBullets / a.bullets + + if (a.proseChars === 0 && ratio === 1) return 'bookmarks' + if (a.linkBullets >= 2 && a.proseChars <= 220 && ratio >= 0.6) { + return 'bookmarks' + } + if (a.linkBullets >= 5 && ratio >= 0.85) return 'bookmarks' + } + + return 'note' +} + +const field = (frontmatter, key) => + (frontmatter.match(new RegExp(`^${key}: (.*)$`, 'm')) ?? [])[1]?.trim() + +const findings = [] +const add = (level, file, message) => findings.push({ level, file, message }) + +const files = fs + .readdirSync(DIR) + .filter((file) => /\.mdx?$/.test(file)) + .toSorted((a, b) => parseInt(a, 10) - parseInt(b, 10)) + +for (const file of files) { + const target = path.join(DIR, file) + const analyzed = analyze(fs.readFileSync(target, 'utf8')) + + if (!analyzed) { + add('error', target, '프론트매터를 읽을 수 없음') + continue + } + + const declared = field(analyzed.frontmatter, 'type') + const status = field(analyzed.frontmatter, 'status') + + // 작성 중(draft)은 아직 형태가 안 잡혔을 수 있으므로 경고로만 본다 + const level = status === 'draft' ? 'warn' : 'error' + + // 각주 짝 — 참조만 있으면 마커가 깨진 채 렌더되고, 정의만 있으면 렌더되지 않는다 + for (const id of analyzed.footnoteRefs) { + if (!analyzed.footnoteDefs.has(id)) { + add(level, target, `각주 [^${id}] 를 참조하는데 정의가 없다`) + } + } + for (const id of analyzed.footnoteDefs) { + if (!analyzed.footnoteRefs.has(id)) { + add(level, target, `각주 [^${id}] 정의가 본문에서 참조되지 않는다`) + } + } + + // 본문이 비어 있으면 형태를 판정할 수 없다 (갓 만든 메모) + if (analyzed.isEmpty) { + continue + } + + // 논리적으로 모순인 조합 — 판단 여지가 없다 + const contradictions = [] + + if (declared === 'snippet' && analyzed.codeLines === 0) { + contradictions.push('type: snippet 인데 코드 블록이 없다') + } + if (declared === 'bookmarks' && analyzed.codeLines > 0) { + contradictions.push( + `type: bookmarks 인데 코드 블록이 있다 (${analyzed.codeLines}줄) — snippet 아닌지 확인` + ) + } + if (declared === 'bookmarks' && analyzed.linkBullets === 0) { + contradictions.push('type: bookmarks 인데 링크가 없다') + } + + for (const message of contradictions) { + add(level, target, message) + } + + if (contradictions.length > 0) { + continue + } + + // 휴리스틱 불일치는 판단 여지가 있으므로 항상 경고 + const inferred = classify(analyzed) + + if (declared !== inferred) { + add( + 'warn', + target, + `type: ${declared} 로 선언됐지만 본문은 ${inferred} 로 보인다 ` + + `(링크 ${analyzed.linkBullets}/${analyzed.bullets}, 코드 ${analyzed.codeLines}줄, 산문 ${analyzed.proseChars}자)` + ) + } +} + +const errors = findings.filter(({ level }) => level === 'error') +const warnings = findings.filter(({ level }) => level === 'warn') + +for (const { level, file, message } of findings) { + console.log(`${level === 'error' ? '✗' : '!'} ${file}\n ${message}`) +} + +console.log( + `\n메모 ${files.length}개 검사 — 오류 ${errors.length}, 경고 ${warnings.length}` +) + +if (errors.length > 0 || (strict && warnings.length > 0)) { + process.exit(1) +} diff --git a/scripts/lint-voice.mjs b/scripts/lint-voice.mjs new file mode 100644 index 0000000..236d4a5 --- /dev/null +++ b/scripts/lint-voice.mjs @@ -0,0 +1,147 @@ +/** + * 압축 대상 찾기 — 문체로 "남의 문장"을 검출한다. + * + * 번역문·AI 요약·문서 발췌는 존댓말("~합니다")로 들어오고, 내 메모는 + * 평서체("~다")로 쓴다. 그래서 인용 표시 없이 존댓말이 지배하는 부분은 + * 아직 내 언어로 줄이지 않은 남의 문장이다. (→ 577.md) + * + * ⚠ 이 검출기는 "남의 문장"을 판정하지 못한다. **확인 대상을 제시**하고 + * 판단은 사람이 한다. 저자가 존댓말로 쓴 자기 글과 번역문이 같은 신호로 + * 잡히기 때문이다 — 309.md는 본인의 작업 기록인데 존댓말이고, 268.md는 + * 번역문이었다. + * + * 그래서 저자 본인의 문체라고 판단했으면 frontmatter 에 `voice: author` + * 를 달아 검사에서 제외한다. "린트를 무시한다"가 아니라 "이 문체는 내 + * 것이다"라는 사실을 적는 것이다 (309.md). + * + * pnpm lint:voice 전체 + * pnpm lint:voice --release 공개 중인 것만 + * pnpm lint:voice --strict 공개(release) 메모에서 검출되면 exit 1 + * + * --strict 가 release 만 막는 이유: draft 는 작성 중이라 원문을 붙여놓고 + * 줄이는 단계가 있을 수 있고, archive 는 공개되지 않는다. 막아야 하는 건 + * "남의 문장이 공개되는 것"이다. + */ +import fs from 'node:fs' +import path from 'node:path' + +const DIR = process.env.MEMO_DIR ?? 'src/content/memo' +const releaseOnly = process.argv.includes('--release') +const strict = process.argv.includes('--strict') + +// "니까?"는 저자 본인의 질문 문장에도 나온다 (218.mdx) — 넣으면 오검출. +// "니다"로 일반화하면 평서체인 "아니다"가 걸린다 — 어미를 명시한다. +const FORMAL = + /(습니다|입니다|됩니다|합니다|줍니다|봅니다|옵니다|갑니다|십니다|세요)/g +const CASUAL = + /(했다|한다|이다|였다|보인다|같다|된다|아니다|하자|말자|였음|없다|있다\.)/g + +const count = (text, re) => (text.match(re) ?? []).length + +const analyze = (raw) => { + const parsed = raw.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/) + + if (!parsed) { + return null + } + + const [, frontmatter, body] = parsed + + let inFence = false + const prose = [] + const footnotes = [] + + for (const line of body.split('\n')) { + if (/^\s*```/.test(line)) { + inFence = !inFence + continue + } + // 코드는 대상이 아니다 + if (inFence) continue + // 인용 표시가 된 외부 텍스트는 정직하다 — 대상이 아니다 + if (/^\s*>/.test(line)) continue + + // 각주도 압축 대상이다 (83.md 는 산문이 아니라 각주가 부풀려져 있었다) + if (/^\[\^[^\]]+\]:/.test(line)) footnotes.push(line) + else prose.push(line) + } + + const field = (key) => + (frontmatter.match(new RegExp(`^${key}: (.*)$`, 'm')) ?? [])[1]?.trim() + + return { + type: field('type'), + status: field('status'), + voice: field('voice'), + prose: prose.join('\n'), + footnotes: footnotes.join('\n'), + } +} + +const findings = [] + +const files = fs + .readdirSync(DIR) + .filter((file) => /\.mdx?$/.test(file)) + .toSorted((a, b) => parseInt(a, 10) - parseInt(b, 10)) + +for (const file of files) { + const analyzed = analyze(fs.readFileSync(path.join(DIR, file), 'utf8')) + + if (!analyzed) continue + if (releaseOnly && analyzed.status !== 'release') continue + // 저자 본인의 문체라고 선언한 메모 + if (analyzed.voice === 'author') continue + + const formal = count(analyzed.prose, FORMAL) + const casual = count(analyzed.prose, CASUAL) + const formalFootnotes = count(analyzed.footnotes, FORMAL) + + const where = [] + + // 존댓말이 지배적일 때만 (평서체가 섞여 있으면 저자가 손댄 것) + if (formal >= 3 && formal > casual * 2) { + where.push(`산문 ${formal}곳 (평서체 ${casual}곳)`) + } + if (formalFootnotes >= 3) { + where.push(`각주 ${formalFootnotes}곳`) + } + // 산문과 각주에 조금씩 나뉘어 있으면 각각은 문턱을 넘지 못한다 (23.md) + if ( + where.length === 0 && + formal + formalFootnotes >= 3 && + formal + formalFootnotes > casual * 2 + ) { + where.push(`산문 ${formal}곳 + 각주 ${formalFootnotes}곳`) + } + + if (where.length > 0) { + findings.push({ + level: analyzed.status === 'release' ? 'error' : 'warn', + file: path.join(DIR, file), + type: analyzed.type, + status: analyzed.status, + where, + }) + } +} + +for (const { level, file, type, status, where } of findings) { + console.log(`${level === 'error' ? '✗' : '!'} ${file} [${type} / ${status}]`) + console.log(` ${where.join(', ')}`) +} + +const published = findings.filter(({ level }) => level === 'error') + +console.log( + `\n메모 ${files.length}개 중 ${findings.length}개에 남의 문장이 남아 있다` + + `${releaseOnly ? ' (공개 중인 것만)' : ` (그중 공개 ${published.length}개)`}` +) + +if (strict && published.length > 0) { + console.log( + '\n공개 메모에 남의 문장이 남아 있다. 줄이거나, 인용이면 표시하거나,' + + '\n저자 본인의 문체라면 frontmatter 에 voice: author 를 단다.' + ) + process.exit(1) +} diff --git a/src/collection/memo.ts b/src/collection/memo.ts index dfcdc57..cd75fd2 100644 --- a/src/collection/memo.ts +++ b/src/collection/memo.ts @@ -13,7 +13,40 @@ export const getRandomMemoCollection = async () => { return memos } -const STRUCTURAL_TAGS = new Set(['bookmarks']) +// 쿼리를 버리면 youtube.com/watch?v=... 가 전부 같은 URL로 뭉친다 +const normalizeUrl = (url: string): string => { + try { + const parsed = new URL(url) + + return ( + parsed.host.replace(/^www\./, '') + + parsed.pathname.replace(/\/$/, '') + + (parsed.search || '') + ) + } catch { + return url + } +} + +const urlCache = new Map>() + +const getUrls = (memo: CollectionEntry<'memo'>): Set => { + const cached = urlCache.get(memo.id) + + if (cached) { + return cached + } + + const urls = new Set( + [...(memo.body ?? '').matchAll(/https?:\/\/[^\s)\]<>"']+/g)].map(([url]) => + normalizeUrl(url.replace(/[.,]+$/, '')) + ) + ) + + urlCache.set(memo.id, urls) + + return urls +} const buildDocumentFrequency = ( memos: CollectionEntry<'memo'>[] @@ -36,11 +69,10 @@ export const getRelatedMemos = async ( const memos = await getReleaseMemoCollection() const df = buildDocumentFrequency(memos) - const currentTags = new Set( - current.data.tags.filter((tag) => !STRUCTURAL_TAGS.has(tag)) - ) + const currentTags = new Set(current.data.tags) + const currentUrls = getUrls(current) - if (currentTags.size === 0) { + if (currentTags.size === 0 && currentUrls.size === 0) { return [] } @@ -49,11 +81,18 @@ export const getRelatedMemos = async ( return memos .filter((memo) => memo.id !== current.id) .map((memo) => { - const score = memo.data.tags + const tagScore = memo.data.tags .filter((tag) => currentTags.has(tag)) .reduce((sum, tag) => sum + idf(tag), 0) - return { memo, score } + // 같은 URL을 가리키는 건 공유 태그 하나보다 강한 증거다. + // 태그만 보면 놓치는 관계가 있다 — 같은 글을 가리키는 메모쌍 29개 중 + // 14쌍은 공유 태그가 0개다 (→ 577.md) + const sharedUrls = [...getUrls(memo)].filter((url) => + currentUrls.has(url) + ).length + + return { memo, score: tagScore + sharedUrls } }) .filter(({ score }) => score > 0) .sort((a, b) => b.score - a.score) diff --git a/src/components/Memo/RelatedMemos.utils.ts b/src/components/Memo/RelatedMemos.utils.ts index 18efa90..3156bca 100644 --- a/src/components/Memo/RelatedMemos.utils.ts +++ b/src/components/Memo/RelatedMemos.utils.ts @@ -6,6 +6,8 @@ const clean = (line: string): string => .replace(/^>\s*/, '') .replace(/^[-*]\s+/, '') .replace(/!?\[([^\]]*)\]\([^)]*\)/g, '$1') + // 각주 참조는 발췌에서 의미가 없다 ([^235-1] 같은 마커가 그대로 남았다) + .replace(/\[\^[^\]]+\]/g, '') .replace(/[`*_~]/g, '') .trim() diff --git a/src/content.config.ts b/src/content.config.ts index 494ee05..9452365 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -4,13 +4,16 @@ import { defineCollection, z } from 'astro:content' const memo = defineCollection({ loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/memo' }), schema: z.object({ + type: z.enum(['bookmarks', 'snippet', 'note']), title: z.string().optional(), description: z.string().optional(), tags: z.array(z.string()), - status: z.enum(['release', 'draft']), + status: z.enum(['release', 'draft', 'archive']), ctime: z.coerce.date(), mtime: z.coerce.date(), embed: z.string().optional(), + // 이 메모의 존댓말은 저자 본인의 것 — lint:voice 검사에서 제외 + voice: z.enum(['author']).optional(), parent: z.coerce.string().optional(), relation: z.enum(['continues', 'supersedes']).default('continues'), }), diff --git a/src/content/memo/1.md b/src/content/memo/1.md index 922f19e..f24a577 100644 --- a/src/content/memo/1.md +++ b/src/content/memo/1.md @@ -1,5 +1,6 @@ --- -tags: ['javascript', 'bookmarks'] +type: bookmarks +tags: ['javascript'] status: release ctime: 2022-04-09 mtime: 2024-03-22 diff --git a/src/content/memo/10.md b/src/content/memo/10.md index bf0402a..3c1f0cf 100644 --- a/src/content/memo/10.md +++ b/src/content/memo/10.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['javascript', 'rx', 'reactive', 'pipe', 'streams'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/100.md b/src/content/memo/100.md index 9b5c8d8..7c0c8cf 100644 --- a/src/content/memo/100.md +++ b/src/content/memo/100.md @@ -1,6 +1,7 @@ --- -tags: ['git', 'bookmarks'] -status: draft +type: bookmarks +tags: ['git'] +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/101.md b/src/content/memo/101.md index 159be33..90effca 100644 --- a/src/content/memo/101.md +++ b/src/content/memo/101.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['git'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/105.md b/src/content/memo/105.md index 1d6e329..1e1c1a7 100644 --- a/src/content/memo/105.md +++ b/src/content/memo/105.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['git'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/106.md b/src/content/memo/106.md index 96f7223..06d71f8 100644 --- a/src/content/memo/106.md +++ b/src/content/memo/106.md @@ -1,13 +1,14 @@ --- -tags: ['css', 'bookmarks'] +type: bookmarks +tags: ['css'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- 최신 CSS 기능 및 트렌드 -- [Things You Can Do With CSS Today — Smashing Magazine](https://www.smashingmagazine.com/2021/02/things-you-can-do-with-css-today/)[^106-1] +- [Things You Can Do With CSS Today — Smashing Magazine](https://www.smashingmagazine.com/2021/02/things-you-can-do-with-css-today/) - [The Future of CSS: Cascade Layers (CSS @layer)](https://www.bram.us/2021/09/15/the-future-of-css-cascade-layers-css-at-layer/) - [The Undeniable Utility Of CSS :has • Josh W. Comeau](https://www.joshwcomeau.com/css/has/) - [An Interactive Guide to CSS Container Queries](https://ishadeed.com/article/css-container-query-guide/) @@ -23,7 +24,7 @@ mtime: 2024-03-22 CSS 애니메이션 및 효과 -- [A CSS-only, animated, wrapping underline.](https://nickymeuleman.netlify.app/blog/css-animated-wrapping-underline/)[^106-2] +- [A CSS-only, animated, wrapping underline.](https://nickymeuleman.netlify.app/blog/css-animated-wrapping-underline/) - [Cubic Bézier: from math to motion](https://blog.maximeheckel.com/posts/cubic-bezier-from-math-to-motion/) - [Zero Trickery Custom Radios and Checkboxes - CSS-Tricks](https://css-tricks.com/zero-trickery-custom-radios-and-checkboxes/) - [CSS One-Liners to Improve (Almost) Every Project](https://alvaromontoro.com/blog/68055/ten-css-one-liners-for-almost-every-project) diff --git a/src/content/memo/107.md b/src/content/memo/107.md index 8825359..2322b1d 100644 --- a/src/content/memo/107.md +++ b/src/content/memo/107.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', 'layout shift', 'bold'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/108.md b/src/content/memo/108.md index b932ee7..e37005a 100644 --- a/src/content/memo/108.md +++ b/src/content/memo/108.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['css', 'ellipsis', 'table', 'text-overflow', 'layout'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/109.md b/src/content/memo/109.md index 29da19e..eb89f91 100644 --- a/src/content/memo/109.md +++ b/src/content/memo/109.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', 'clamp'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/11.md b/src/content/memo/11.md index cdbf497..415f8f5 100644 --- a/src/content/memo/11.md +++ b/src/content/memo/11.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['javascript', 'date', 'temporal', 'timezone'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/110.md b/src/content/memo/110.md index 2874f12..b196a9b 100644 --- a/src/content/memo/110.md +++ b/src/content/memo/110.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', 'contain'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/111.md b/src/content/memo/111.md index 1b7b461..d0f8576 100644 --- a/src/content/memo/111.md +++ b/src/content/memo/111.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', 'z-index'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/112.md b/src/content/memo/112.md index f7e7065..a9bf7b8 100644 --- a/src/content/memo/112.md +++ b/src/content/memo/112.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', 'svg', 'keyframes', 'offset-path'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/113.md b/src/content/memo/113.md index c85d395..0ae20c2 100644 --- a/src/content/memo/113.md +++ b/src/content/memo/113.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', 'reset'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/114.md b/src/content/memo/114.md index 1a455dd..8941c33 100644 --- a/src/content/memo/114.md +++ b/src/content/memo/114.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', '3d'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/115.md b/src/content/memo/115.md index 05a84ff..50970be 100644 --- a/src/content/memo/115.md +++ b/src/content/memo/115.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', '@container'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/116.md b/src/content/memo/116.md index 379fb31..22b75e2 100644 --- a/src/content/memo/116.md +++ b/src/content/memo/116.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', 'clip-path'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/117.md b/src/content/memo/117.md index 488bfdc..0bc9442 100644 --- a/src/content/memo/117.md +++ b/src/content/memo/117.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', 'content-visibility', 'performance'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/118.md b/src/content/memo/118.md index 2e4bfce..d564364 100644 --- a/src/content/memo/118.md +++ b/src/content/memo/118.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', 'css-custom-properties'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/119.md b/src/content/memo/119.md index a30d9f4..898b680 100644 --- a/src/content/memo/119.md +++ b/src/content/memo/119.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', 'button'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/12.md b/src/content/memo/12.md index e058eba..92f8a18 100644 --- a/src/content/memo/12.md +++ b/src/content/memo/12.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['pattern-matching', 'javascript'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/120.md b/src/content/memo/120.md index 7e7e9cf..feea3f1 100644 --- a/src/content/memo/120.md +++ b/src/content/memo/120.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['css', '@media'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/121.md b/src/content/memo/121.md index 04e2eba..35aeed5 100644 --- a/src/content/memo/121.md +++ b/src/content/memo/121.md @@ -1,8 +1,9 @@ --- +type: bookmarks tags: ['image'] -status: draft +status: archive ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - [Your Image Is Probably Not Decorative — Smashing Magazine](https://www.smashingmagazine.com/2021/06/img-alt-attribute-alternate-description-decorative/)[^121-1] @@ -10,7 +11,7 @@ mtime: 2024-03-22 - [Using Modern Image Formats: AVIF And WebP — Smashing Magazine](https://www.smashingmagazine.com/2021/09/modern-image-formats-avif-webp/)[^121-2] - [Building an effective Image Component](https://web.dev/image-component/)[^121-3] - [Using Performant Next-Gen Images in CSS with image-set | CSS-Tricks](https://css-tricks.com/using-performant-next-gen-images-in-css-with-image-set/)[^121-4] -- [A Guide to the Responsive Images Syntax in HTML | CSS-Tricks](https://css-tricks.com/a-guide-to-the-responsive-images-syntax-in-html/) +- [A Guide to the Responsive Images Syntax in HTML | CSS-Tricks](https://css-tricks.com/a-guide-to-the-responsive-images-syntax-in-html/)[^121-5] - [Frequently Asked Questions  |  WebP  |  Google Developers](https://developers.google.com/speed/webp/faq#how_can_i_detect_browser_support_for_webp)[^121-6] --- diff --git a/src/content/memo/122.md b/src/content/memo/122.md index 3c8a98e..c9e47e3 100644 --- a/src/content/memo/122.md +++ b/src/content/memo/122.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['angle', 'math'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/123.md b/src/content/memo/123.md index 6551b49..3a315fb 100644 --- a/src/content/memo/123.md +++ b/src/content/memo/123.md @@ -1,8 +1,9 @@ --- +type: bookmarks tags: ['json', 'search'] -status: draft +status: archive ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - [hbi99/defiant.js](https://github.com/hbi99/defiant.js)[^123-1] @@ -15,9 +16,9 @@ mtime: 2024-03-22 --- -[^123-1]: Defiant는 XPath 표현식을 사용하여 빠른 검색을 가능하게 하는 방법으로 전역 JSON 개체를 확장합니다. -[^123-2]: JSONata는 JSON 데이터를 위한 경량 쿼리 및 변환 언어입니다. XPath 3.1의 '위치 경로' 의미에서 영감을 받아 정교한 쿼리를 간결하고 직관적인 표기법으로 표현할 수 있습니다. -[^123-3]: JS Search는 JavaScript 및 JSON 객체를 위한 효율적인 클라이언트 측 검색 라이브러리입니다. -[^123-4]: GROQ는 Sanity의 오픈소스 쿼리 언어입니다. 배우기 쉬운 강력하고 직관적인 언어입니다. GROQ를 사용하면 애플리케이션에 필요한 정보를 정확히 설명하고, 여러 문서 세트의 정보를 결합하고, 필요한 필드만으로 매우 구체적인 응답을 결합할 수 있습니다. +[^123-1]: XPath 표현식으로 JSON 검색 +[^123-2]: JSON 쿼리·변환 언어. XPath 3.1의 위치 경로에서 영감 +[^123-3]: 클라이언트 측 검색 +[^123-4]: Sanity의 쿼리 언어. 여러 문서를 묶어 필요한 필드만 뽑는다 [^123-5]: [Query JSON documents in the Terminal with GROQ | CSS-Tricks](https://css-tricks.com/query-json-documents-in-the-terminal-with-groq/) -[^123-6]: JSON과 유사한 구조에서 계산을 수행하기 위한 소형 내장형 언어 \ No newline at end of file +[^123-6]: JSON 유사 구조에서 계산하는 소형 내장 언어 \ No newline at end of file diff --git a/src/content/memo/124.md b/src/content/memo/124.md index 33d7096..12579cf 100644 --- a/src/content/memo/124.md +++ b/src/content/memo/124.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['json'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/125.md b/src/content/memo/125.md index 72d3e9e..a19f12a 100644 --- a/src/content/memo/125.md +++ b/src/content/memo/125.md @@ -1,8 +1,9 @@ --- +type: bookmarks tags: ['json', 'grpc', 'protobuf'] -status: draft +status: archive ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - [Beating JSON performance with Protobuf](https://auth0.com/blog/beating-json-performance-with-protobuf/)[^125-1] @@ -12,11 +13,10 @@ mtime: 2024-03-22 --- -- [4. gRPC: Under the Hood - gRPC: Up and Running [Book]](https://www.oreilly.com/library/view/grpc-up-and/9781492058328/ch04.html) - [pbtk - A toolset for reverse engineering and fuzzing Protobuf-based apps](https://hakin9.org/pbtk-a-toolset-for-reverse-engineering-and-fuzzing-protobuf-based-apps/) - [Working with Protobufs in Node.js | www.thecodebarbarian.com](https://thecodebarbarian.com/working-with-protobufs-in-node-js.html) - [What is “Content-Type: application/x-protobuf”: Protobuf Explained For Hackers – TechKranti](https://techkranti.com/what-is-protobuf-explained-for-hackers/) --- -[^125-1]: 구조화된 데이터의 직렬화 및 역직렬화를 허용하기 위해 Google에서 개발한 프로토콜입니다. Google은 시스템이 통신할 수 있도록 XML에 비해 더 나은 방법을 제공하는 것을 목표로 개발했습니다. 그래서 그들은 XML보다 더 간단하고, 더 작고, 더 빠르고, 유지 관리하기 쉽게 만드는 데 초점을 맞췄습니다. \ No newline at end of file +[^125-1]: 구조화된 데이터 직렬화. XML보다 작고 빠르게 만드는 게 목표였다 \ No newline at end of file diff --git a/src/content/memo/126.md b/src/content/memo/126.md index 107262d..da20026 100644 --- a/src/content/memo/126.md +++ b/src/content/memo/126.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['json', 'schema'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/127.md b/src/content/memo/127.md index 77b5263..a999d06 100644 --- a/src/content/memo/127.md +++ b/src/content/memo/127.md @@ -1,15 +1,16 @@ --- +type: bookmarks tags: ['extensions'] -status: draft +status: archive ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - [Extensions - Chrome Developers](https://developer.chrome.com/docs/extensions/)[^127-1] - [Migrating to Manifest V3 - Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/intro/mv3-migration/)[^127-2] - [Migrating from background pages to service workers - Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/migrating_to_service_workers/)[^127-3] - [WebExtensions - Mozilla | MDN](https://developer.mozilla.org/ko/docs/Mozilla/Add-ons/WebExtensions)[^127-4] -- [Helpful Tips for Starting a Next.js Chrome Extension | CSS-Tricks - CSS-Tricks](https://css-tricks.com/nextjs-chrome-extension-starter/) +- [Helpful Tips for Starting a Next.js Chrome Extension | CSS-Tricks - CSS-Tricks](https://css-tricks.com/nextjs-chrome-extension-starter/)[^127-5] - [chrome.runtime](https://developer.chrome.com/docs/extensions/reference/runtime/#method-connect) --- diff --git a/src/content/memo/128.md b/src/content/memo/128.md index f193195..4721296 100644 --- a/src/content/memo/128.md +++ b/src/content/memo/128.md @@ -1,4 +1,5 @@ --- +type: note tags: ['extensions'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/129.md b/src/content/memo/129.md index ee97d16..b7b801f 100644 --- a/src/content/memo/129.md +++ b/src/content/memo/129.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['cookies', 'extensions'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/13.md b/src/content/memo/13.md index 644d73e..c26202f 100644 --- a/src/content/memo/13.md +++ b/src/content/memo/13.md @@ -1,6 +1,7 @@ --- -tags: ['typescript', 'bookmarks'] -status: draft +type: bookmarks +tags: ['typescript'] +status: archive ctime: 2022-04-09 mtime: 2026-01-27 --- diff --git a/src/content/memo/130.md b/src/content/memo/130.md index 1179b42..f643f42 100644 --- a/src/content/memo/130.md +++ b/src/content/memo/130.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['extensions'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/131.md b/src/content/memo/131.md index 411b4a6..250dcb7 100644 --- a/src/content/memo/131.md +++ b/src/content/memo/131.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['extensions', 'i18n'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/132.md b/src/content/memo/132.md index 30347ef..f6f41fd 100644 --- a/src/content/memo/132.md +++ b/src/content/memo/132.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['html', 'select'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/133.md b/src/content/memo/133.md index e2509f8..4b67498 100644 --- a/src/content/memo/133.md +++ b/src/content/memo/133.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['select', 'css', 'ui'] status: release embed: https://stackblitz.com/edit/react-ts-fyggsu?file=index.tsx diff --git a/src/content/memo/134.md b/src/content/memo/134.md index 1e970dd..cb6b160 100644 --- a/src/content/memo/134.md +++ b/src/content/memo/134.md @@ -1,4 +1,5 @@ --- +type: note tags: ['select', 'css'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/135.md b/src/content/memo/135.md index bc5663a..a978ef8 100644 --- a/src/content/memo/135.md +++ b/src/content/memo/135.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['browser'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/136.md b/src/content/memo/136.md index 0de5a68..e9e7375 100644 --- a/src/content/memo/136.md +++ b/src/content/memo/136.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['web-api'] -status: draft +status: archive embed: https://stackblitz.com/~/github.com/cbcruk/web_apis ctime: 2022-04-09 mtime: 2024-03-22 diff --git a/src/content/memo/137.md b/src/content/memo/137.md index 9630e2c..5ffc606 100644 --- a/src/content/memo/137.md +++ b/src/content/memo/137.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['webmention'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/138.md b/src/content/memo/138.md index d3a3b9e..cef92a5 100644 --- a/src/content/memo/138.md +++ b/src/content/memo/138.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['browser'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/139.md b/src/content/memo/139.md index c93fc55..5e27e8c 100644 --- a/src/content/memo/139.md +++ b/src/content/memo/139.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['web-worker', 'service-worker'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/14.md b/src/content/memo/14.md index bd784c9..0465a73 100644 --- a/src/content/memo/14.md +++ b/src/content/memo/14.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['typescript', 'migrating'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/140.md b/src/content/memo/140.md index a807f3c..50e5139 100644 --- a/src/content/memo/140.md +++ b/src/content/memo/140.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['http'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/141.md b/src/content/memo/141.md index 89b9938..ac6dc96 100644 --- a/src/content/memo/141.md +++ b/src/content/memo/141.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['aws', 'download'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/142.md b/src/content/memo/142.md index cff045f..ef1787b 100644 --- a/src/content/memo/142.md +++ b/src/content/memo/142.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['cache', 'bfcache'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/143.md b/src/content/memo/143.md index 7b6df11..9e52e1f 100644 --- a/src/content/memo/143.md +++ b/src/content/memo/143.md @@ -1,5 +1,6 @@ --- -tags: ['html', 'bookmarks'] +type: bookmarks +tags: ['html'] status: release ctime: 2022-04-09 mtime: 2024-03-22 diff --git a/src/content/memo/144.md b/src/content/memo/144.md index 6b0a115..212f351 100644 --- a/src/content/memo/144.md +++ b/src/content/memo/144.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['uri', '딥링크'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/145.md b/src/content/memo/145.md index 54098b3..449cceb 100644 --- a/src/content/memo/145.md +++ b/src/content/memo/145.md @@ -1,5 +1,6 @@ --- -tags: ['test', 'bookmarks'] +type: bookmarks +tags: ['test'] status: release ctime: 2022-04-09 mtime: 2024-03-22 diff --git a/src/content/memo/146.md b/src/content/memo/146.md index 3268204..06e3ee9 100644 --- a/src/content/memo/146.md +++ b/src/content/memo/146.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['test', 'cypress'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/147.md b/src/content/memo/147.md index 91c7ff1..6c3d4cd 100644 --- a/src/content/memo/147.md +++ b/src/content/memo/147.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['test'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/148.md b/src/content/memo/148.md index 8034e6c..c7ddae7 100644 --- a/src/content/memo/148.md +++ b/src/content/memo/148.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['mock', 'test'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/149.md b/src/content/memo/149.md index e6ae19d..0883352 100644 --- a/src/content/memo/149.md +++ b/src/content/memo/149.md @@ -1,8 +1,9 @@ --- +type: note tags: ['test', 'bdd'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- ```md @@ -21,10 +22,7 @@ mtime: 2024-03-22 Feature > [...Scenario] > [...Step] -- `Given`: Given단계는 시스템의 초기 컨텍스트( 시나리오 장면) 를 설명하는 데 사용됩니다 . 그것은 일반적으로 과거에 일어난 일입니다. -- `When`: When단계는 이벤트 또는 작업 을 설명하는 데 사용됩니다 . 이것은 시스템과 상호 작용하는 사람이거나 다른 시스템에 의해 트리거되는 이벤트일 수 있습니다. -- `Then`: Then단계는 예상되는 결과 또는 결과 를 설명하는 데 사용됩니다 . -- `And`, `But` +`Given` 초기 상태 — 보통 과거에 일어난 일. `When` 이벤트나 동작. `Then` 예상 결과. 단계를 이을 때 `And`·`But`. ```md Scenario: 항목 검색 후 결제 페이지로 이동 diff --git a/src/content/memo/15.md b/src/content/memo/15.md index fa7641c..0a088e9 100644 --- a/src/content/memo/15.md +++ b/src/content/memo/15.md @@ -1,8 +1,9 @@ --- +type: snippet tags: ['typescript', 'function'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- ```ts @@ -13,7 +14,7 @@ const sum: MathFn = (a, b) => a + b ``` - [TypeScript Function Syntaxes](https://kentcdodds.com/blog/typescript-function-syntaxes) [(번역)](https://ui.toast.com/weekly-pick/ko_20210521)[^15-1] -- [Typing functions in TypeScript](https://2ality.com/2020/04/typing-functions-typescript.html) +- [Typing functions in TypeScript](https://2ality.com/2020/04/typing-functions-typescript.html)[^15-2] --- diff --git a/src/content/memo/150.md b/src/content/memo/150.md index 22534ab..343f729 100644 --- a/src/content/memo/150.md +++ b/src/content/memo/150.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['cucumber', 'test', 'bdd'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/151.md b/src/content/memo/151.md index d764faa..2f99f9f 100644 --- a/src/content/memo/151.md +++ b/src/content/memo/151.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['gsap'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/152.md b/src/content/memo/152.md index ae30388..1612db4 100644 --- a/src/content/memo/152.md +++ b/src/content/memo/152.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['live2d'] status: release embed: https://codesandbox.io/s/3n1jh diff --git a/src/content/memo/153.md b/src/content/memo/153.md index c90bd99..3439e4d 100644 --- a/src/content/memo/153.md +++ b/src/content/memo/153.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['motion'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/154.md b/src/content/memo/154.md index aa96fce..dc8a7e1 100644 --- a/src/content/memo/154.md +++ b/src/content/memo/154.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['waapi', 'animation'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/155.md b/src/content/memo/155.md index 470c53f..242058c 100644 --- a/src/content/memo/155.md +++ b/src/content/memo/155.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['motion-blur', 'svg', 'gsap', 'fe-gaussian-blur'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/156.md b/src/content/memo/156.md index 025349e..aa0d61a 100644 --- a/src/content/memo/156.md +++ b/src/content/memo/156.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['physics'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/157.md b/src/content/memo/157.md index 0c9c649..3922668 100644 --- a/src/content/memo/157.md +++ b/src/content/memo/157.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['bug'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/158.md b/src/content/memo/158.md index 7c3a961..f923c96 100644 --- a/src/content/memo/158.md +++ b/src/content/memo/158.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['html', 'autocomplete'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/159.md b/src/content/memo/159.md index 4a50a06..f3b21bc 100644 --- a/src/content/memo/159.md +++ b/src/content/memo/159.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'date'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/16.md b/src/content/memo/16.md index 3b8b205..0ab14cb 100644 --- a/src/content/memo/16.md +++ b/src/content/memo/16.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['typescript', 'type', 'interface'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/160.md b/src/content/memo/160.md index c2418a3..b1c357a 100644 --- a/src/content/memo/160.md +++ b/src/content/memo/160.md @@ -1,4 +1,5 @@ --- +type: note tags: ['optimize', 'charles'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/161.md b/src/content/memo/161.md index 74121b9..445b489 100644 --- a/src/content/memo/161.md +++ b/src/content/memo/161.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['test'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/162.md b/src/content/memo/162.md index f05f5ab..74bfef1 100644 --- a/src/content/memo/162.md +++ b/src/content/memo/162.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['youtube-dl', 'ffmpeg', 'brew'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/163.md b/src/content/memo/163.md index 008f7c7..c8075ee 100644 --- a/src/content/memo/163.md +++ b/src/content/memo/163.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['youtube-dl'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/164.md b/src/content/memo/164.md index 8ccca2b..3e840c2 100644 --- a/src/content/memo/164.md +++ b/src/content/memo/164.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['youtube-dl', 'zsh'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/165.md b/src/content/memo/165.md index 1a35e0a..2c2deed 100644 --- a/src/content/memo/165.md +++ b/src/content/memo/165.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['input'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/166.md b/src/content/memo/166.md index 7e7c6c3..c5feb52 100644 --- a/src/content/memo/166.md +++ b/src/content/memo/166.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['input', 'css'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/167.md b/src/content/memo/167.md index 9ff0478..3189473 100644 --- a/src/content/memo/167.md +++ b/src/content/memo/167.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['input', 'otp'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/168.md b/src/content/memo/168.md index ffb27f4..e5c0e07 100644 --- a/src/content/memo/168.md +++ b/src/content/memo/168.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['autofill', 'html'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/169.md b/src/content/memo/169.md index eb98353..1e6c2c1 100644 --- a/src/content/memo/169.md +++ b/src/content/memo/169.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['javascript', 'proxy'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/17.md b/src/content/memo/17.md index 3bb2078..3a15bed 100644 --- a/src/content/memo/17.md +++ b/src/content/memo/17.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['javascript', 'typescript', 'jsdoc', 'vscode'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/170.md b/src/content/memo/170.md index 6b0cae2..2ea9aaa 100644 --- a/src/content/memo/170.md +++ b/src/content/memo/170.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['reflect'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/171.md b/src/content/memo/171.md index 7774925..6d03a40 100644 --- a/src/content/memo/171.md +++ b/src/content/memo/171.md @@ -1,8 +1,9 @@ --- +type: bookmarks tags: ['font', 'text'] -status: draft +status: archive ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - [Creating websites with prefers-reduced-data | Polypane, The browser for ambitious developers](https://polypane.app/blog/creating-websites-with-prefers-reduced-data/)[^171-1] @@ -19,6 +20,6 @@ mtime: 2024-03-22 [^171-2]: 특정 문자 변경하기 [^171-3]: 텍스트 스타일 [^171-4]: 로컬 폰트 감지를 위한 -[^171-5]: `leading-trim`은 텍스트 스타일을 보다 예측 가능하게 할 수 있도록 모든 글꼴에서 추가 공백을 제거할 수 있는 새롭게 제안된 CSS 속성입니다. -[^171-6]: Google 글꼴 지식을 사용하면 모든 기술 세트의 디자이너와 개발자가 목적에 따라 유형을 선택하고 사용할 수 있습니다. -[^171-7]: `font-variant-numeric` 속성을 사용하면 숫자, 분수 및 서수 표시에 대한 대체 글리프를 제어할 수 있습니다. +[^171-5]: `leading-trim` — 글꼴이 갖고 있는 여분 공백 제거 (제안 단계) +[^171-6]: 목적에 따라 글꼴 고르는 법 +[^171-7]: `font-variant-numeric` — 숫자·분수·서수의 대체 글리프 제어 diff --git a/src/content/memo/172.md b/src/content/memo/172.md index 332a61b..762990c 100644 --- a/src/content/memo/172.md +++ b/src/content/memo/172.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['font'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/173.md b/src/content/memo/173.md index 86c2c79..9425d28 100644 --- a/src/content/memo/173.md +++ b/src/content/memo/173.md @@ -1,15 +1,12 @@ --- +type: bookmarks tags: ['font'] status: release embed: https://codepen.io/eunsoolee/pen/vYZqoGz ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -가변 글꼴은 진보된 OpenType 사양입니다. CSS를 사용할때 가짜 굵기 또는 기울임꼴과 같은 브라우저 왜곡 에 대해 걱정하지 않고 단일 글꼴 파일에 포함된 모든 스타일에 액세스할 수 있습니다. - -이전에는 여러 스타일을 사용한다는 것은 모든 너비, 두께 또는 기울임꼴에 대해 하나씩 여러 파일을 로드하는 것을 의미했습니다. 이로 인해 디자인 표현력(사용된 글꼴 수)과 웹사이트 성능(다운로드할 데이터의 양) 사이에 긴장감이 생겼습니다. 가변 글꼴을 사용하면 전체 방정식이 변경됩니다. - - [A Variable Fonts Primer](https://variablefonts.io/) - [Google Fonts](https://fonts.google.com/specimen/Hahmlet?vfonly=true&subset=korean#standard-styles) - [Getting the Most Out of Variable Fonts on Google Fonts | CSS-Tricks](https://css-tricks.com/getting-the-most-out-of-variable-fonts-on-google-fonts/) diff --git a/src/content/memo/174.md b/src/content/memo/174.md index 972ba38..410ed73 100644 --- a/src/content/memo/174.md +++ b/src/content/memo/174.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['font'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/175.md b/src/content/memo/175.md index 9311d6a..864f313 100644 --- a/src/content/memo/175.md +++ b/src/content/memo/175.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['font', 'css'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/176.md b/src/content/memo/176.md index 7e07199..971264c 100644 --- a/src/content/memo/176.md +++ b/src/content/memo/176.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['desktop'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/177.md b/src/content/memo/177.md index b88963b..c911725 100644 --- a/src/content/memo/177.md +++ b/src/content/memo/177.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['svg'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/178.md b/src/content/memo/178.md index 2688ea3..a0f17c6 100644 --- a/src/content/memo/178.md +++ b/src/content/memo/178.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['svg', 'fe-turbulence', 'fe-displacement-map'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/179.md b/src/content/memo/179.md index 33b56cc..88eba8d 100644 --- a/src/content/memo/179.md +++ b/src/content/memo/179.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['svg', 'mask'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/18.md b/src/content/memo/18.md index c555125..017cdaa 100644 --- a/src/content/memo/18.md +++ b/src/content/memo/18.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['ui'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/180.md b/src/content/memo/180.md index 15ff263..de4e93e 100644 --- a/src/content/memo/180.md +++ b/src/content/memo/180.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['email'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/181.md b/src/content/memo/181.md index 1de8a72..df56892 100644 --- a/src/content/memo/181.md +++ b/src/content/memo/181.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['editor', 'wysiwyg'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/182.md b/src/content/memo/182.md index 54e2355..222e15f 100644 --- a/src/content/memo/182.md +++ b/src/content/memo/182.md @@ -1,16 +1,15 @@ --- +type: bookmarks tags: ['photoshop'] status: draft ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - [Generator Plug-in for Adobe Photoshop CC that helps users export image assets](https://github.com/adobe-photoshop/generator-assets) - [Generator Architecture](https://github.com/adobe-photoshop/generator-core/wiki/Generator-Architecture) - [Generate Image Assets Functional Spec](https://github.com/adobe-photoshop/generator-assets/wiki/Generate-Image-Assets-Functional-Spec#user-content-how-can-i-get-layers-and-groups-that-bleed-off-the-canvas-to-appear-as-complete-assets) -이 리포지토리에는 Adobe Photoshop CC의 Generator 확장성 레이어용 플러그인이 포함되어 있습니다. 이 플러그인을 사용하면 Photoshop 파일에서 이미지 자산을 더 쉽게 내보낼 수 있습니다. 사용자는 파일 이름과 같은 구문을 사용하여 내보내려는 문서 및 이름 레이어(또는 레이어 그룹 또는 스마트 개체)에 대한 이미지 자산 생성을 활성화하기만 하면 됩니다. 그런 다음 Generator는 이러한 레이어를 감시하고 변경될 때마다 디스크의 해당 자산을 자동으로 업데이트합니다. - --- - [Should I use Node.js to Process My Images? | by David Fekke | JavaScript in Plain English](https://javascript.plainenglish.io/should-i-use-node-js-to-process-my-images-3f5c5f208ad5) diff --git a/src/content/memo/183.md b/src/content/memo/183.md index 8c74a64..8f843b1 100644 --- a/src/content/memo/183.md +++ b/src/content/memo/183.md @@ -1,4 +1,5 @@ --- +type: note tags: ['photoshop'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/184.md b/src/content/memo/184.md index 5c44dd7..9f16ae4 100644 --- a/src/content/memo/184.md +++ b/src/content/memo/184.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['photoshop'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/185.md b/src/content/memo/185.md index 70e8c0b..f99bdb6 100644 --- a/src/content/memo/185.md +++ b/src/content/memo/185.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['photoshop'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/186.md b/src/content/memo/186.md index a7f1dd5..939d1f6 100644 --- a/src/content/memo/186.md +++ b/src/content/memo/186.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['photoshop'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/187.md b/src/content/memo/187.md index c6d3002..981452b 100644 --- a/src/content/memo/187.md +++ b/src/content/memo/187.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['blob'] status: release ctime: 2022-05-29 diff --git a/src/content/memo/188.md b/src/content/memo/188.md index e9ac0e1..2d06253 100644 --- a/src/content/memo/188.md +++ b/src/content/memo/188.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['seo'] -status: draft +status: archive ctime: 2022-06-01 mtime: 2024-03-22 --- diff --git a/src/content/memo/189.md b/src/content/memo/189.md index 0a90f20..ad11e29 100644 --- a/src/content/memo/189.md +++ b/src/content/memo/189.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['git'] status: release ctime: 2022-06-18 diff --git a/src/content/memo/19.md b/src/content/memo/19.md index 168e0b4..8fe447e 100644 --- a/src/content/memo/19.md +++ b/src/content/memo/19.md @@ -1,22 +1,19 @@ --- +type: bookmarks tags: ['ui', 'calculator', 'math'] status: release ctime: 2022-04-09 -mtime: 2024-05-15 +mtime: 2026-07-27 --- -계산기 응용 프로그램의 다양한 측면을 설명합니다. +자연어로 계산을 쓰는 계산기들. -- [The creation of Soulver. How two teenagers made a new kind of… | by Zac Cohan | Soulver | Medium](https://medium.com/soulver/the-creation-of-soulver-454dee1e2fd1)[^19-1] -- [Designing calculator apps](https://fvsch.com/calculators)[^19-2] -- [Numi. Beautiful calculator app for Mac.](https://numi.app/)[^19-3] -- [Parsify Desktop](https://parsify.app/)[^19-4] +- [The creation of Soulver. How two teenagers made a new kind of… | by Zac Cohan | Soulver | Medium](https://medium.com/soulver/the-creation-of-soulver-454dee1e2fd1) +- [Designing calculator apps](https://fvsch.com/calculators) +- [Numi. Beautiful calculator app for Mac.](https://numi.app/) +- [Parsify Desktop](https://parsify.app/) - [Math Notepad](https://mathnotepad.com/)[^19-5] --- -[^19-1]: 사용자가 평범한 문장을 사용하여 계산을 수행할 수 있는 고유한 인터페이스가 있는 계산기 응용 프로그램인 Soulver를 만든 방법을 알려주는 내용. 제작자가 직면한 어려움과 Soulver를 돋보이게 하는 기능에 대해 설명합니다. -[^19-2]: 계산기 응용 프로그램의 설계 원칙에 대해 설명합니다. 다양한 유형의 계산기와 사용자 친화적인 계산기 앱을 만드는 핵심 디자인 요소에 대한 자신의 생각을 공유합니다. -[^19-3]: 자연어 인터페이스와 단위 환산, 통화 환산, 계산 내역과 같은 고급 기능을 제공하는 Mac용 계산기 애플리케이션인 Numi의 웹사이트. Numi의 기능 및 가격에 대한 정보가 포함. -[^19-4]: Parsify Desktop은 엔지니어, 과학자 및 학생이 사용하도록 설계되었으며 복잡한 계산 및 단위 변환을 지원합니다. (자연어 인터페이스도 제공) [^19-5]: [math.js](https://mathjs.org/) diff --git a/src/content/memo/190.md b/src/content/memo/190.md index 5726b19..6f3fd4c 100644 --- a/src/content/memo/190.md +++ b/src/content/memo/190.md @@ -1,4 +1,5 @@ --- +type: note tags: ['datadog'] status: draft ctime: 2022-06-18 diff --git a/src/content/memo/191.md b/src/content/memo/191.md index 5e6a6a6..1cdca8b 100644 --- a/src/content/memo/191.md +++ b/src/content/memo/191.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'bug'] status: release ctime: 2022-09-18 diff --git a/src/content/memo/192.md b/src/content/memo/192.md index 6235ca5..16a4749 100644 --- a/src/content/memo/192.md +++ b/src/content/memo/192.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['flags'] -status: draft +status: archive ctime: 2022-09-18 mtime: 2024-03-22 --- diff --git a/src/content/memo/193.md b/src/content/memo/193.md index ea33c90..6602350 100644 --- a/src/content/memo/193.md +++ b/src/content/memo/193.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react', 'hack', 'dangerously-set-inner-html'] status: release embed: https://stackblitz.com/edit/react-ts-dyuyny?file=App.tsx diff --git a/src/content/memo/194.md b/src/content/memo/194.md index 987c89c..432dba0 100644 --- a/src/content/memo/194.md +++ b/src/content/memo/194.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['algorithm', 'cs', 'equations'] -status: draft +status: archive ctime: 2022-09-19 mtime: 2024-03-22 --- diff --git a/src/content/memo/195.md b/src/content/memo/195.md index 05f54e7..308d73f 100644 --- a/src/content/memo/195.md +++ b/src/content/memo/195.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['whac-a-mole'] -status: draft +status: archive ctime: 2022-09-19 mtime: 2024-03-22 --- diff --git a/src/content/memo/196.md b/src/content/memo/196.md index 3f37525..01f9a96 100644 --- a/src/content/memo/196.md +++ b/src/content/memo/196.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['seo'] -status: draft +status: archive ctime: 2022-09-19 mtime: 2024-03-22 --- diff --git a/src/content/memo/197.md b/src/content/memo/197.md index 35c40e9..7b011fb 100644 --- a/src/content/memo/197.md +++ b/src/content/memo/197.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['vite'] status: release ctime: 2022-09-19 diff --git a/src/content/memo/198.md b/src/content/memo/198.md index 398fa32..59c3926 100644 --- a/src/content/memo/198.md +++ b/src/content/memo/198.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['calendar', 'google-apps-script'] -status: draft +status: archive ctime: 2022-09-23 mtime: 2024-03-22 --- diff --git a/src/content/memo/199.md b/src/content/memo/199.md index 5694013..e5751b9 100644 --- a/src/content/memo/199.md +++ b/src/content/memo/199.md @@ -1,4 +1,5 @@ --- +type: note tags: ['storybook', 'chromatic'] status: release ctime: 2022-09-23 diff --git a/src/content/memo/2.md b/src/content/memo/2.md index d47bed0..7ac99c1 100644 --- a/src/content/memo/2.md +++ b/src/content/memo/2.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['promise', 'javascript', 'async-await'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/20.md b/src/content/memo/20.md index 18cc080..2465670 100644 --- a/src/content/memo/20.md +++ b/src/content/memo/20.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['maps', 'ui'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/200.md b/src/content/memo/200.md index c124468..030a33b 100644 --- a/src/content/memo/200.md +++ b/src/content/memo/200.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react'] status: release ctime: 2022-09-23 diff --git a/src/content/memo/201.md b/src/content/memo/201.md index 4a6c536..9a1dbc9 100644 --- a/src/content/memo/201.md +++ b/src/content/memo/201.md @@ -1,4 +1,5 @@ --- +type: note tags: ['git'] status: draft ctime: 2022-09-23 diff --git a/src/content/memo/202.md b/src/content/memo/202.md index 72904fd..40992cb 100644 --- a/src/content/memo/202.md +++ b/src/content/memo/202.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['git'] status: release ctime: 2022-11-03 diff --git a/src/content/memo/203.md b/src/content/memo/203.md index 9466a77..f0937b7 100644 --- a/src/content/memo/203.md +++ b/src/content/memo/203.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['react'] status: release ctime: 2022-09-23 diff --git a/src/content/memo/204.md b/src/content/memo/204.md index 1b025e7..a6f5dc4 100644 --- a/src/content/memo/204.md +++ b/src/content/memo/204.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['terms'] -status: draft +status: archive ctime: 2022-09-23 mtime: 2024-03-22 --- diff --git a/src/content/memo/205.md b/src/content/memo/205.md index 4a00614..2a22bfc 100644 --- a/src/content/memo/205.md +++ b/src/content/memo/205.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['axios'] -status: draft +status: archive ctime: 2022-09-23 mtime: 2024-03-22 --- diff --git a/src/content/memo/206.md b/src/content/memo/206.md index c30d3a2..b20567d 100644 --- a/src/content/memo/206.md +++ b/src/content/memo/206.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['next'] -status: draft +status: archive ctime: 2022-09-23 mtime: 2024-03-22 --- diff --git a/src/content/memo/207.md b/src/content/memo/207.md index 6adc439..3ca9675 100644 --- a/src/content/memo/207.md +++ b/src/content/memo/207.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['extensions'] status: release ctime: 2022-09-24 diff --git a/src/content/memo/208.md b/src/content/memo/208.md index ea8ae59..eaf6a6c 100644 --- a/src/content/memo/208.md +++ b/src/content/memo/208.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['aws'] status: release ctime: 2022-09-25 diff --git a/src/content/memo/209.md b/src/content/memo/209.md index 2c2ca85..23d1566 100644 --- a/src/content/memo/209.md +++ b/src/content/memo/209.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['aws'] status: release ctime: 2022-09-26 diff --git a/src/content/memo/21.md b/src/content/memo/21.md index e5eee9e..dd2073e 100644 --- a/src/content/memo/21.md +++ b/src/content/memo/21.md @@ -1,12 +1,11 @@ --- +type: bookmarks tags: ['ui', 'builder', 'dnd'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -드래그 앤 드롭 기능이나 위지윅 편집기를 사용하여 사용자 인터페이스와 레이아웃을 구축하기 위한 도구와 라이브러리입니다. 이러한 도구는 수동으로 코드를 작성하지 않고도 복잡한 UI 디자인과 레이아웃을 만드는 과정을 간소화하는 것을 목표로 합니다. - - [Builder.io - Drag and drop experience builder - Builder.io](https://www.builder.io/)[^21-1] - [Blocks UI](https://blocks-ui.com/)[^21-2] - [Craft.js](https://craft.js.org/)[^21-3] diff --git a/src/content/memo/210.md b/src/content/memo/210.md index ce1536f..25f04ee 100644 --- a/src/content/memo/210.md +++ b/src/content/memo/210.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['npm', 'node'] status: release ctime: 2022-09-29 diff --git a/src/content/memo/211.md b/src/content/memo/211.md index 9179639..34a16cd 100644 --- a/src/content/memo/211.md +++ b/src/content/memo/211.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['webpack'] -status: draft +status: archive ctime: 2022-09-29 mtime: 2024-03-22 --- diff --git a/src/content/memo/212.md b/src/content/memo/212.md index b56766e..ca12eba 100644 --- a/src/content/memo/212.md +++ b/src/content/memo/212.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['slack'] -status: draft +status: archive ctime: 2022-10-10 mtime: 2024-03-22 --- diff --git a/src/content/memo/213.md b/src/content/memo/213.md index b432b63..c7bae48 100644 --- a/src/content/memo/213.md +++ b/src/content/memo/213.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['package', 'shell', 'npm', 'node'] status: release ctime: 2022-10-12 diff --git a/src/content/memo/214.md b/src/content/memo/214.md index 3b6b2dd..a186dd7 100644 --- a/src/content/memo/214.md +++ b/src/content/memo/214.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['image'] status: release ctime: 2022-10-16 diff --git a/src/content/memo/215.md b/src/content/memo/215.md index 5bb886c..2fe1c12 100644 --- a/src/content/memo/215.md +++ b/src/content/memo/215.md @@ -1,6 +1,7 @@ --- -tags: ['fp', 'bookmarks'] -status: draft +type: bookmarks +tags: ['fp'] +status: archive ctime: 2022-10-16 mtime: 2024-03-22 --- diff --git a/src/content/memo/216.md b/src/content/memo/216.md index 6757dcb..ef41cb9 100644 --- a/src/content/memo/216.md +++ b/src/content/memo/216.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['ramda'] -status: draft +status: archive ctime: 2022-10-16 mtime: 2024-03-22 --- diff --git a/src/content/memo/217.md b/src/content/memo/217.md index bac0894..7101ae6 100644 --- a/src/content/memo/217.md +++ b/src/content/memo/217.md @@ -1,6 +1,7 @@ --- -tags: ['cms', 'bookmarks'] -status: draft +type: bookmarks +tags: ['cms'] +status: archive ctime: 2022-10-16 mtime: 2024-03-22 --- diff --git a/src/content/memo/218.mdx b/src/content/memo/218.mdx index e55e987..c7ed34e 100644 --- a/src/content/memo/218.mdx +++ b/src/content/memo/218.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['bdd', 'test'] status: release ctime: 2022-10-16 diff --git a/src/content/memo/219.md b/src/content/memo/219.md index f670629..0f595ed 100644 --- a/src/content/memo/219.md +++ b/src/content/memo/219.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['state'] -status: draft +status: archive ctime: 2022-10-16 mtime: 2024-03-22 --- diff --git a/src/content/memo/22.md b/src/content/memo/22.md index cc6190e..c6b86b5 100644 --- a/src/content/memo/22.md +++ b/src/content/memo/22.md @@ -1,4 +1,5 @@ --- +type: note tags: ['throttle', 'debounce', 'lodash', 'event', 'ui'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/220.md b/src/content/memo/220.md index 6ca9a0a..c361f93 100644 --- a/src/content/memo/220.md +++ b/src/content/memo/220.md @@ -1,6 +1,7 @@ --- -tags: ['interview', 'bookmarks'] -status: draft +type: bookmarks +tags: ['interview'] +status: archive ctime: 2022-10-16 mtime: 2024-03-22 --- diff --git a/src/content/memo/221.md b/src/content/memo/221.md index c227b17..7bf5cbf 100644 --- a/src/content/memo/221.md +++ b/src/content/memo/221.md @@ -1,16 +1,16 @@ --- -tags: ['code-review', 'bookmarks'] +type: bookmarks +tags: ['code-review'] status: release ctime: 2022-10-16 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -- [피드백 사다리: Netlify에서 코드 리뷰를 인코딩하는 방법](https://www.netlify.com/blog/2020/03/05/feedback-ladders-how-we-encode-code-reviews-at-netlify/)[^221-1][^221-2] +- [피드백 사다리: Netlify에서 코드 리뷰를 인코딩하는 방법](https://www.netlify.com/blog/2020/03/05/feedback-ladders-how-we-encode-code-reviews-at-netlify/)[^221-2] - [기본적으로 코드 리뷰 없음](https://www.raycast.com/blog/no-code-reviews-by-default/)[^221-3] - [Post-Commit Reviews](https://copyconstruct.medium.com/post-commit-reviews-b4cc2163ac7a) --- -[^221-1]: 코드 리뷰는 비동기식 커뮤니케이션의 한 형태이므로 많은 컨텍스트(바디랭귀지 및 주고받을 기회 등)가 손실됩니다. 이것은 대부분의 원격회사인 우리에게 특히 중요하므로 피드백에 약간의 뉘앙스를 추가할 방법을 원했습니다. [^221-2]: Feedback Ladder: ⛰ 산(Mountain) / 차단 및 즉각적인 조치 필요, 🧗‍♀️ 볼더(Boulder) / 블로킹, ⚪️ 자갈(Pebble) / 비차단하지만 향후 조치가 필요함, ⏳ 모래(Sand) / 논블로킹이지만 향후 고려 필요, 🌫 먼지(Dust) / 비차단, "받거나 놔두세요" -[^221-3]: 코드 리뷰 없이 신뢰를 기반으로 엔지니어링 문화를 구축한 방법. 다른 사람들의 상황이 자신에게 적용되는지 자문해볼 필요가 있다. +[^221-3]: 다른 사람들의 상황이 자신에게 적용되는지 자문해볼 필요가 있다. diff --git a/src/content/memo/222.md b/src/content/memo/222.md index 8d93aca..435cb65 100644 --- a/src/content/memo/222.md +++ b/src/content/memo/222.md @@ -1,5 +1,6 @@ --- -tags: ['bookmarks'] +type: bookmarks +tags: [] status: release ctime: 2022-10-16 mtime: 2024-03-22 diff --git a/src/content/memo/223.md b/src/content/memo/223.md index 569879b..5d4be91 100644 --- a/src/content/memo/223.md +++ b/src/content/memo/223.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['mobx', 'async', 'action'] status: draft ctime: 2022-10-16 diff --git a/src/content/memo/224.md b/src/content/memo/224.md index e246b9a..f189934 100644 --- a/src/content/memo/224.md +++ b/src/content/memo/224.md @@ -1,6 +1,7 @@ --- -tags: ['performance', 'bookmarks'] -status: draft +type: bookmarks +tags: ['performance'] +status: archive ctime: 2022-10-16 mtime: 2024-03-22 --- diff --git a/src/content/memo/225.md b/src/content/memo/225.md index 052b825..c45a6fb 100644 --- a/src/content/memo/225.md +++ b/src/content/memo/225.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['webgl', 'three.js'] -status: draft +status: archive ctime: 2022-10-16 mtime: 2024-03-22 --- diff --git a/src/content/memo/226.md b/src/content/memo/226.md index 6aead6a..38295a2 100644 --- a/src/content/memo/226.md +++ b/src/content/memo/226.md @@ -1,4 +1,5 @@ --- +type: note tags: ['api', 'docs'] status: draft ctime: 2022-11-02 diff --git a/src/content/memo/227.md b/src/content/memo/227.md index 28ad269..a925ce3 100644 --- a/src/content/memo/227.md +++ b/src/content/memo/227.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['pagination'] status: release ctime: 2022-11-07 diff --git a/src/content/memo/228.md b/src/content/memo/228.md index 43d75af..17a9e54 100644 --- a/src/content/memo/228.md +++ b/src/content/memo/228.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['create-react-app', 'deprecated'] status: release ctime: 2022-11-14 diff --git a/src/content/memo/229.md b/src/content/memo/229.md index c7f3e85..7828627 100644 --- a/src/content/memo/229.md +++ b/src/content/memo/229.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['create-react-app', 'node'] status: release ctime: 2022-11-21 diff --git a/src/content/memo/23.md b/src/content/memo/23.md index 8cab005..f73a6d2 100644 --- a/src/content/memo/23.md +++ b/src/content/memo/23.md @@ -1,17 +1,16 @@ --- +type: bookmarks tags: ['raspberry-pi'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -다음은 Raspberry Pi를 사용하여 날씨 정보를 표시하는 프로젝트의 두 가지 예입니다. 이 두 프로젝트 모두 Raspberry Pi를 사용하여 날씨 표시 또는 날씨 앱을 만드는 방법을 보여줍니다. 또한 Python 스크립트 또는 웹 기반 애플리케이션을 사용하여 날씨 데이터를 가져오고 표시하는 다양한 방법을 보여줍니다. 이 프로젝트는 Raspberry Pi를 사용하여 자신만의 날씨 디스플레이 또는 앱을 구축하는 데 관심이 있는 모든 사람에게 좋은 출발점이 될 수 있습니다.[^23-3] - - [Raspberry Pi 'WeatherClock' shows you the hour's forecast - Raspberry Pi](https://www.raspberrypi.org/blog/raspberry-pi-weatherclock-shows-you-the-hours-forecast/)[^23-1] - [Show Dev: RaspberryPi Weather ⛈ fuelled by Netlify functions and Preact - DEV Community](https://dev.to/moigonzalez/show-dev-raspberrypi-weather-fuelled-by-netlify-functions-and-preact-bne)[^23-2] +- https://weather-mu.vercel.app/ --- -[^23-1]: 작은 화면에 현재 시간과 시간별 일기 예보를 표시하는 프로젝트입니다. 이 프로젝트는 Raspberry Pi Zero W와 1.3인치 OLED 디스플레이를 사용하며 [OpenWeatherMap API](https://openweathermap.org/api)에서 날씨 데이터를 가져와 화면에 표시하는 Python 스크립트로 구동됩니다. -[^23-2]: [Preact](https://preactjs.com/), [Netlify Functions](https://www.netlify.com/products/functions/)를 사용하여 OpenWeatherMap API에서 날씨 데이터를 가져옵니다. -[^23-3]: https://weather-mu.vercel.app/ \ No newline at end of file +[^23-1]: Raspberry Pi Zero W + 1.3인치 OLED, [OpenWeatherMap API](https://openweathermap.org/api) 를 Python 스크립트로 +[^23-2]: [Preact](https://preactjs.com/) + [Netlify Functions](https://www.netlify.com/products/functions/) diff --git a/src/content/memo/230.md b/src/content/memo/230.md index a49d52c..3f18d5f 100644 --- a/src/content/memo/230.md +++ b/src/content/memo/230.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['migrating'] -status: draft +status: archive ctime: 2022-11-28 mtime: 2024-03-22 --- diff --git a/src/content/memo/231.md b/src/content/memo/231.md index c2d69b2..eb9b660 100644 --- a/src/content/memo/231.md +++ b/src/content/memo/231.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['monorepo'] status: release ctime: 2022-11-28 diff --git a/src/content/memo/232.md b/src/content/memo/232.md index ef942bc..384a793 100644 --- a/src/content/memo/232.md +++ b/src/content/memo/232.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['editor', 'input'] status: release ctime: 2022-12-05 diff --git a/src/content/memo/233.md b/src/content/memo/233.md index 9225b5f..b0a5860 100644 --- a/src/content/memo/233.md +++ b/src/content/memo/233.md @@ -1,8 +1,9 @@ --- +type: bookmarks tags: ['ui', 'design-system', 'headless'] status: release ctime: 2022-12-05 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - 공통 컴포넌트 @@ -28,4 +29,3 @@ mtime: 2024-03-22 --- [^233-1]: [참고](https://reactspectrum.blob.core.windows.net/reactspectrum/cee46dbc35a111b8e4ba2da28da542783de00a44/docs/react-aria/Button.html) -[^233-2]: 컴퓨팅 및 소프트웨어에서 헤드리스는 그래픽 인터페이스가 없는 소프트웨어 또는 서버 또는 프런트 엔드 구성 요소와 백 엔드 구성 요소를 분리하는 소프트웨어 플랫폼을 가리킬 수 있습니다. diff --git a/src/content/memo/234.md b/src/content/memo/234.md index e18773b..63e3a08 100644 --- a/src/content/memo/234.md +++ b/src/content/memo/234.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['node', 'webpack'] status: release ctime: 2022-12-11 diff --git a/src/content/memo/235.md b/src/content/memo/235.md index 8b2bc4d..48f29b3 100644 --- a/src/content/memo/235.md +++ b/src/content/memo/235.md @@ -1,8 +1,10 @@ --- +type: snippet tags: ['shell', 'node', 'env'] status: release ctime: 2022-12-11 -mtime: 2024-03-22 +mtime: 2026-07-27 +parent: '229' --- ```sh diff --git a/src/content/memo/236.md b/src/content/memo/236.md index ebc9bcc..6af629d 100644 --- a/src/content/memo/236.md +++ b/src/content/memo/236.md @@ -1,6 +1,7 @@ --- -tags: ['ffmpeg', 'bookmarks'] -status: draft +type: bookmarks +tags: ['ffmpeg'] +status: archive ctime: 2022-12-11 mtime: 2024-03-22 --- diff --git a/src/content/memo/237.md b/src/content/memo/237.md index cccd868..f20ac08 100644 --- a/src/content/memo/237.md +++ b/src/content/memo/237.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['ffmpeg'] status: release ctime: 2022-12-11 diff --git a/src/content/memo/238.md b/src/content/memo/238.md index e88bbde..abdf1d3 100644 --- a/src/content/memo/238.md +++ b/src/content/memo/238.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['db'] status: release ctime: 2022-12-11 diff --git a/src/content/memo/239.md b/src/content/memo/239.md index b4e2f02..853dbcf 100644 --- a/src/content/memo/239.md +++ b/src/content/memo/239.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['airtable'] -status: draft +status: archive ctime: 2022-12-11 mtime: 2024-03-22 --- diff --git a/src/content/memo/24.md b/src/content/memo/24.md index 04018f4..27ab31f 100644 --- a/src/content/memo/24.md +++ b/src/content/memo/24.md @@ -1,20 +1,18 @@ --- +type: bookmarks tags: ['globe', 'webgl'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -데이터 시각화, 교육 목적 또는 단순한 재미를 위해 자신만의 대화형 지구본을 구축하는 데 관심이 있는 모든 사람에게 도움이 될 수 있습니다. 그들은 지구본을 만들기 위한 다양한 접근 방식과 기술을 보여주고 지구본 데이터로 작업할 때의 문제와 기회에 대한 귀중한 통찰력을 제공합니다. - - [To design and develop an interactive globe](https://stripe.com/blog/globe)[^24-1] - [How we built the GitHub globe | The GitHub Blog](https://github.blog/2020-12-21-how-we-built-the-github-globe/)[^24-2] - [Gatsby Serverless Functions And The International Space Station — Smashing Magazine](https://www.smashingmagazine.com/2021/07/gatsby-serverless-functions-international-space-station/)[^24-3] -- [GitHub - shuding/cobe: 5kB WebGL globe lib.](https://github.com/shuding/cobe)[^24-4] +- [GitHub - shuding/cobe: 5kB WebGL globe lib.](https://github.com/shuding/cobe) --- -[^24-1]: WebGL과 [Three.js](https://threejs.org/)를 사용하여 지구본을 렌더링하고 [Mapbox](https://www.mapbox.com/)를 사용하여 데이터를 표시하는 지구본을 디자인하고 개발하는 과정을 설명합니다. -[^24-2]: GitHub 팀이 전 세계 GitHub 사용자의 위치를 보여주는 대화형 지구본을 구축한 방법을 설명합니다. 이 게시물은 WebGL 및 [d3-geo](https://github.com/d3/d3-geo) 라이브러리를 사용하여 시각화를 생성하는 지구본 구축의 기술적 문제에 대해 자세히 설명합니다. -[^24-3]: Gatsby 서버리스 기능을 사용하여 국제 우주 정거장(ISS)의 위치를 추적하는 대화형 지구본을 구축하는 방법에 대해 설명합니다. 이 기사는 ISS의 위치를 표시하기 위해 Three.js 및 [satellite.js](https://github.com/shashwatak/satellite-js)를 사용하는 지구본 구축의 기술적 세부 사항을 다룹니다. -[^24-4]: 개발자가 자신만의 대화형 지구본을 만들 수 있는 경량 WebGL 지구본 라이브러리입니다. \ No newline at end of file +[^24-1]: WebGL + [Three.js](https://threejs.org/), 데이터는 [Mapbox](https://www.mapbox.com/) +[^24-2]: WebGL + [d3-geo](https://github.com/d3/d3-geo) +[^24-3]: ISS 위치 추적 — Three.js + [satellite.js](https://github.com/shashwatak/satellite-js) \ No newline at end of file diff --git a/src/content/memo/240.md b/src/content/memo/240.md index a1ce78d..dde7ad2 100644 --- a/src/content/memo/240.md +++ b/src/content/memo/240.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['cloudflare'] -status: draft +status: archive ctime: 2022-12-11 mtime: 2024-03-22 --- diff --git a/src/content/memo/241.md b/src/content/memo/241.md index 34d3b16..fa6dce9 100644 --- a/src/content/memo/241.md +++ b/src/content/memo/241.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['design-system', 'css', 'css-in-js'] -status: draft +status: archive ctime: 2022-12-11 mtime: 2024-03-22 --- diff --git a/src/content/memo/242.md b/src/content/memo/242.md index 82a9186..6f735ab 100644 --- a/src/content/memo/242.md +++ b/src/content/memo/242.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['google-apps-script'] -status: draft +status: archive ctime: 2022-12-15 mtime: 2024-03-22 --- diff --git a/src/content/memo/243.md b/src/content/memo/243.md index de19ea1..3a01f6f 100644 --- a/src/content/memo/243.md +++ b/src/content/memo/243.md @@ -1,8 +1,9 @@ --- +type: snippet tags: ['font'] status: release ctime: 2022-12-29 -mtime: 2024-03-22 +mtime: 2026-07-27 --- ```js @@ -16,6 +17,6 @@ async function loader() { } ``` -[CSS Font Loading API](https://developer.mozilla.org/en-US/docs/Web/API/CSS_Font_Loading_API) 는 비교적 새로운 웹 플랫폼 추가 기능입니다. API가 도입되기 전에 웹 개발자는 일반적으로 CSS에 의존하여 웹 글꼴을 로드해야 했으며 이로 인해 로드와 성능 문제가 발생할 수 있었습니다. -개발자는 로드 방법을 더 잘 제어할 수 있을 뿐만 아니라 오류를 처리하고 웹 사이트에서 사용되는 시기와 방법을 제어할 수 있습니다. -전반적으로 CSS Font Loading API는 웹 개발자에게 글꼴이 정확하고 효율적으로 로드 되도록 하는 강력한 도구를 제공하는 동시에 글꼴 로드 및 사용에 대한 더 많은 제어 기능을 제공합니다. +--- + +- 참고: [CSS Font Loading API](https://developer.mozilla.org/en-US/docs/Web/API/CSS_Font_Loading_API) diff --git a/src/content/memo/244.md b/src/content/memo/244.md index 1312be1..29e74af 100644 --- a/src/content/memo/244.md +++ b/src/content/memo/244.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['jsdoc'] -status: draft +status: archive ctime: 2023-01-12 mtime: 2024-03-22 --- diff --git a/src/content/memo/245.md b/src/content/memo/245.md index 31faeae..23735a5 100644 --- a/src/content/memo/245.md +++ b/src/content/memo/245.md @@ -1,12 +1,13 @@ --- +type: bookmarks tags: ['api', 'mock'] -status: draft +status: archive ctime: 2023-02-18 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - [Fake Store API](https://fakestoreapi.com/)[^245-1] -- [Mock.shop: A mock store API for easy prototyping](https://mock.shop/)[^245-2] +- [Mock.shop: A mock store API for easy prototyping](https://mock.shop/) 전자 상거래 데이터 생성 및 테스트 가능한 API diff --git a/src/content/memo/246.md b/src/content/memo/246.md index 7b937f7..9f9c858 100644 --- a/src/content/memo/246.md +++ b/src/content/memo/246.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['webcontainers', 'sandbox'] -status: draft +status: archive ctime: 2023-02-20 mtime: 2024-03-22 --- diff --git a/src/content/memo/247.md b/src/content/memo/247.md index 332120f..c1b769b 100644 --- a/src/content/memo/247.md +++ b/src/content/memo/247.md @@ -1,15 +1,11 @@ --- +type: bookmarks tags: ['wcag', 'ux'] status: release ctime: 2023-02-20 -mtime: 2024-03-22 ---- - -- [Human Interface Guidelines - Human Interface Guidelines - Design - Apple Developer](https://developer.apple.com/design/human-interface-guidelines/): - 디자인 원칙은 사용자 경험을 향상시키기 위한 기본 가이드라인입니다. Apple의 Human Interface Guidelines는 애플 제품을 위한 인터페이스 디자인에 대한 원칙과 모범 사례를 제공합니다. 예를 들어, 간결하고 일관된 디자인, 직관적인 상호 작용, 정보의 집중화, 애니메이션 및 트랜지션의 적절한 사용 등을 다룹니다. 이러한 가이드라인을 따르면 사용자들이 애플 제품과 앱을 쉽게 이해하고 사용할 수 있게 됩니다. -- [All WCAG 2.1 Techniques | WAI | W3C](https://www.w3.org/WAI/WCAG21/Techniques/): - 접근성은 모든 사용자가 웹 콘텐츠에 접근하고 상호 작용할 수 있도록 보장하는 중요한 측면입니다. 웹 접근성은 장애를 가진 사용자, 고령자, 비전 및 청각 장애가 있는 사용자, 키보드 사용자 등을 고려하여 웹 콘텐츠가 포용적이고 이용 가능한지를 확인합니다. WCAG는 웹 접근성을 높이기 위한 일련의 표준과 기술을 제공합니다. 텍스트 대체, 키보드 접근성, 명도 대비, 컨텐츠의 가독성, 사용자 인터페이스 컨트롤의 명확성 등을 다룹니다. WCAG는 웹 개발자와 디자이너들이 웹 콘텐츠를 접근 가능하게 만들기 위한 방법과 기술을 제시합니다. - +mtime: 2026-07-27 --- +- [Human Interface Guidelines - Human Interface Guidelines - Design - Apple Developer](https://developer.apple.com/design/human-interface-guidelines/) +- [All WCAG 2.1 Techniques | WAI | W3C](https://www.w3.org/WAI/WCAG21/Techniques/) - [Close, Exit, Cancel: How To End User Interactions Well | CSS-Tricks](https://css-tricks.com/close-exit-cancel-how-to-end-user-interactions-well) diff --git a/src/content/memo/248.md b/src/content/memo/248.md index 69e24f9..62d8ffd 100644 --- a/src/content/memo/248.md +++ b/src/content/memo/248.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['tailwindcss'] -status: draft +status: archive ctime: 2023-02-22 mtime: 2024-03-22 --- diff --git a/src/content/memo/249.md b/src/content/memo/249.md index 5864a03..2c0b9e0 100644 --- a/src/content/memo/249.md +++ b/src/content/memo/249.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['npm'] status: release ctime: 2023-02-27 diff --git a/src/content/memo/25.md b/src/content/memo/25.md index d08a022..ac11ee6 100644 --- a/src/content/memo/25.md +++ b/src/content/memo/25.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['search', 'highlight', 'ui'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/251.md b/src/content/memo/251.md index 70a9abf..27d0ca1 100644 --- a/src/content/memo/251.md +++ b/src/content/memo/251.md @@ -1,6 +1,7 @@ --- -tags: ['bookmarks'] -status: draft +type: bookmarks +tags: [] +status: archive ctime: 2023-03-05 mtime: 2024-03-22 --- diff --git a/src/content/memo/252.md b/src/content/memo/252.md index e836a2a..6a2676b 100644 --- a/src/content/memo/252.md +++ b/src/content/memo/252.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'immer', 'Map', 'Set'] status: release ctime: 2023-03-13 diff --git a/src/content/memo/253.md b/src/content/memo/253.md index 1eaec36..ad7ae19 100644 --- a/src/content/memo/253.md +++ b/src/content/memo/253.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['graph'] -status: draft +status: archive ctime: 2023-03-13 mtime: 2024-03-22 --- diff --git a/src/content/memo/255.md b/src/content/memo/255.md index 940d108..5f1333a 100644 --- a/src/content/memo/255.md +++ b/src/content/memo/255.md @@ -1,8 +1,10 @@ --- +type: snippet tags: ['typescript', 'jsx', 'parser'] status: release ctime: 2023-03-19 -mtime: 2024-03-22 +mtime: 2026-07-27 +parent: '197' --- ```js diff --git a/src/content/memo/256.md b/src/content/memo/256.md index 724c625..d051f0f 100644 --- a/src/content/memo/256.md +++ b/src/content/memo/256.md @@ -1,17 +1,12 @@ --- +type: bookmarks tags: ['micro-frontend', 'webpack'] status: draft ctime: 2023-03-19 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -모듈 페더레이션과 단일 SPA는 모두 개발자가 독립적으로 개발된 여러 애플리케이션을 단일 시스템에 통합하여 마이크로프론트엔드 및 분리형 애플리케이션을 구축할 수 있도록 지원하는 자바스크립트 라이브러리입니다. +모듈 페더레이션은 **빌드** 레벨 — 별도 webpack 빌드끼리 모듈을 공유한다. single-spa 는 **런타임** 레벨 — 따로 만든 앱을 실행 중에 로드해서 하나로 붙인다. -모듈 페더레이션은 개발자가 별도의 웹팩 빌드 간에 모듈을 공유할 수 있도록 하는 웹팩의 기능입니다. 이를 통해 개발자는 애플리케이션을 여러 개의 마이크로프론트엔드로 분할하여 각각 독립적으로 빌드 및 배포하면서도 각 마이크로프론트엔드 간에 기능과 상태를 공유할 수 있습니다. 이는 여러 애플리케이션에서 로드할 수 있는 공유 모듈을 생성하고 각 애플리케이션이 공유 모듈의 내보내기에 액세스할 수 있도록 설정하면 됩니다. - -단일 SPA는 독립적으로 개발된 여러 애플리케이션이 하나의 애플리케이션으로 함께 작동할 수 있도록 하는 마이크로프론트엔드 구축을 위한 JavaScript 프레임워크입니다. 개발자가 애플리케이션을 마이크로프론트엔드로 정의하고 런타임에 동적으로 로드 및 통합할 수 있는 일련의 API를 제공하는 방식으로 작동합니다. 이를 통해 개발자는 보다 쉽게 확장하고 유지 관리할 수 있는 복잡하고 분리된 애플리케이션을 구축할 수 있습니다. - -모듈 페더레이션과 단일 SPA는 모두 모듈식 분리형 애플리케이션을 구축하기 위한 강력한 도구입니다. 모듈 페더레이션은 독립적인 빌드 간에 모듈을 공유하는 데 더 중점을 두는 반면, 단일 SPA는 독립적으로 개발된 여러 애플리케이션을 단일 시스템으로 통합하는 데 더 중점을 둡니다. 하지만 이 두 가지를 함께 사용하면 더욱 강력하고 유연한 애플리케이션을 만들 수 있습니다. - -https://module-federation.github.io/ -https://single-spa.js.org/ \ No newline at end of file +- https://module-federation.github.io/ +- https://single-spa.js.org/ \ No newline at end of file diff --git a/src/content/memo/257.md b/src/content/memo/257.md index 3628466..1d15422 100644 --- a/src/content/memo/257.md +++ b/src/content/memo/257.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['web-api', 'ambient-light-sensor'] status: release ctime: 2023-03-24 diff --git a/src/content/memo/258.md b/src/content/memo/258.md index b0b75c4..fc0911d 100644 --- a/src/content/memo/258.md +++ b/src/content/memo/258.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['db'] -status: draft +status: archive ctime: 2023-03-28 mtime: 2024-03-22 --- diff --git a/src/content/memo/259.md b/src/content/memo/259.md index e2088d5..931028c 100644 --- a/src/content/memo/259.md +++ b/src/content/memo/259.md @@ -1,6 +1,7 @@ --- -tags: ['architecture', 'bookmarks'] -status: draft +type: bookmarks +tags: ['architecture'] +status: archive ctime: 2023-04-01 mtime: 2024-03-22 --- diff --git a/src/content/memo/26.md b/src/content/memo/26.md index 13d4913..c47a1c9 100644 --- a/src/content/memo/26.md +++ b/src/content/memo/26.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['pdf', 'webassembly'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/260.mdx b/src/content/memo/260.mdx index 21e8b52..de7481f 100644 --- a/src/content/memo/260.mdx +++ b/src/content/memo/260.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['jscodeshift'] -status: draft +status: archive ctime: 2023-04-12 mtime: 2024-03-22 --- diff --git a/src/content/memo/261.md b/src/content/memo/261.md index 3b88fcf..0156a4c 100644 --- a/src/content/memo/261.md +++ b/src/content/memo/261.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['git'] -status: draft +status: archive ctime: 2023-04-12 mtime: 2024-03-22 --- diff --git a/src/content/memo/262.md b/src/content/memo/262.md index c8c3c6c..fc39859 100644 --- a/src/content/memo/262.md +++ b/src/content/memo/262.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['url', 'router'] -status: draft +status: archive ctime: 2023-04-12 mtime: 2024-03-22 --- diff --git a/src/content/memo/263.md b/src/content/memo/263.md index 9494bdc..bf61153 100644 --- a/src/content/memo/263.md +++ b/src/content/memo/263.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['code-splitting', 'react'] -status: draft +status: archive ctime: 2023-05-01 mtime: 2024-03-22 --- diff --git a/src/content/memo/264.md b/src/content/memo/264.md index 6ee6504..7cd819b 100644 --- a/src/content/memo/264.md +++ b/src/content/memo/264.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['tree'] -status: draft +status: archive ctime: 2023-05-01 mtime: 2024-03-22 --- diff --git a/src/content/memo/265.md b/src/content/memo/265.md index 61fb9de..13d9a40 100644 --- a/src/content/memo/265.md +++ b/src/content/memo/265.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['font', 'next'] -status: draft +status: archive ctime: 2023-05-01 mtime: 2024-03-22 --- diff --git a/src/content/memo/266.md b/src/content/memo/266.md index 063a8fb..220d119 100644 --- a/src/content/memo/266.md +++ b/src/content/memo/266.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['architecture', 'ddd'] -status: draft +status: archive ctime: 2023-05-01 mtime: 2024-03-22 --- diff --git a/src/content/memo/267.md b/src/content/memo/267.md index e5881e0..61ac25f 100644 --- a/src/content/memo/267.md +++ b/src/content/memo/267.md @@ -1,18 +1,14 @@ --- +type: note tags: ['prompt', 'llm'] status: draft ctime: 2023-05-01 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -1. 프롬프트 작성을 위한 가이드라인: 모델에 명확하고 구체적인 지침을 작성하는 방법에 대한 원칙을 다룹니다. -* 원칙 1: 명확하고 구체적인 지시사항 작성: 모델이 원하는 출력을 도출할 수 있도록 명확하고 구체적인 지시사항을 제공해야 합니다. -* 원칙 2: 모델에게 '생각'할 시간을 주기: 모델이 적절한 출력을 생성하도록 하기 위해 모델에게 충분한 시간을 주는 방법을 소개합니다. -2. 프롬프트 전술: -* 전술 1: 입력의 구분을 명확하게 나타내기 위해 구분자 사용: 입력의 구분을 나타내기 위해 구분자를 사용하는 방법에 대해 다룹니다. (```, """, < >, ` `, `:`) -* 전술 2: 구조화된 출력 요청: 구조화된 출력을 요청하기 위해 JSON, HTML 등의 형식을 사용하는 방법을 소개합니다. -* 전술 3: 조건 충족 여부 확인을 모델에 요청: 모델에게 조건 충족 여부를 확인하는 것을 요청하는 방법에 대해 다룹니다. -* 전술 4: "피유-샷" 프롬프팅: 모델에게 일관된 스타일로 응답하도록 하는 방법에 대해 다룹니다. +원칙 — 명확하고 구체적인 지시, 그리고 모델에게 생각할 시간 주기. + +전술 — 구분자로 입력 경계 표시(```, """, < >, ` `, `:`), 구조화된 출력 요청(JSON·HTML), 조건 충족 여부를 모델에게 확인시키기, few-shot 으로 스타일 고정. --- diff --git a/src/content/memo/268.md b/src/content/memo/268.md index 4e4f793..3394106 100644 --- a/src/content/memo/268.md +++ b/src/content/memo/268.md @@ -1,31 +1,14 @@ --- +type: bookmarks tags: ['performance', 'tachyon', 'prefetch', 'prerender'] status: release ctime: 2023-05-01 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -*Tachyon 작동 방식* +prefetch는 내려받기만 하고, prerender는 내려받은 뒤 렌더링까지 시작한다. -Tachyon은 사용자의 웹 브라우저에 내장된 기능을 활용하여 사용자가 `` 태그에 커서를 50밀리초 이상 올려놓으면 콘텐츠를 미리 로드하는 `` 태그를 생성합니다(기본값). - -기본적으로 사용자가 링크를 실제로 클릭/탭하기 전에 방문하려는 페이지의 로딩을 시작하도록 브라우저에 지시합니다. 이는 웹 브라우저가 백그라운드에서 준비를 시작하도록 지시합니다. - -사용자가 실제로 링크를 클릭하고 다음 페이지로 이동할 준비가 되면 해당 페이지는 이미 준비되어 프레임으로 가져와 페이지 로드 시간이 훨씬 빨라집니다. - ---- - -*이유; 방법* - -Tachyon은 단순성을 핵심으로 설계되었으며, 이는 결코 우연이 아닙니다. 단순성에 중점을 두었기 때문에 관리자부터 최종 사용자까지 Tachyon을 사용하는 모든 사람이 성능, 확장성, 유지보수성, 보안 및 사용 편의성에서 이점을 누릴 수 있습니다. - -다른 대안에 비해 Tachyon이 개선한 주요 사항 중 하나는 일반적인 `` 대신 ``를 사용하여 페이지 로드가 훨씬 빨라졌다는 점입니다. 프리페치는 페이지를 다운로드하기만 하고 프리렌더는 페이지를 다운로드하여 렌더링을 시작한다는 점에서 두 방법의 차이는 자명합니다. - -또한 Tachyon은 클릭 가능성이 높은 페이지만 미리 로드하고 사용자의 커서가 링크에서 벗어나면 페이지 미리 로드를 중지하는 등 다른 방식보다 훨씬 효율적이고 방해가 덜 되는 방식으로 프리로딩 동작을 구현합니다. 이것이 바로 제가 Tachyon을 만든 이유이며, 지금까지도 왜 다른 대안이 이 기능을 제공하지 않는지 모르겠습니다. 그 결과, Tachyon은 다른 대안에 비해 사이트에 대역폭 부하를 극히 일부만 추가합니다. - -다른 프로젝트보다 기능이 적은 것도 아닙니다(인스턴트 페이지와 가상 기능 동등성 및 몇 가지 추가 기능이 있습니다). 단지 다른 프로젝트보다 간결한 방식으로 구현된 기능일 뿐입니다. 별도의 설정 없이 모바일을 지원하고 화이트리스트, 블랙리스트, 사용자 지정 타이밍 및 동일 출처 제한을 구현하며, 이러한 기능을 사용하기가 훨씬 쉽습니다. 매우 복잡한 기능이 필요한 경우 Tachyon이 최선의 선택이 아닐 수 있지만, 그 외의 모든 사용자에게는 처음부터 최고의 옵션이 될 수 있도록 설계된 Tachyon이 적합합니다. - ---- +Tachyon은 ``에 커서가 50ms 이상 머물면 ``를 넣어주는 라이브러리. - https://fasterthanlight.net/ - https://developer.chrome.com/blog/prerender-pages/ diff --git a/src/content/memo/269.md b/src/content/memo/269.md index 669e7d0..e501cb5 100644 --- a/src/content/memo/269.md +++ b/src/content/memo/269.md @@ -1,19 +1,13 @@ --- +type: bookmarks tags: ['ui', 'react', 'zoom'] status: release ctime: 2023-05-14 -mtime: 2024-03-22 +mtime: 2026-07-27 --- 모바일 웹뷰에서 특정 영역을 *zoom*할수 있게 해달라는 요청이 있어서 적용한 내역. 정확히 기억은 안나는데 *react-prismazoom*를 선택했다. -*react-prismazoom*은 CSS 변환을 사용하여 React에서 확대 및 이동 기능을 제공하는 팬 및 줌 컴포넌트입니다. 이 라이브러리는 prop-types, react, react-dom 모듈에만 의존하며, 데스크톱 및 모바일에서 모두 작동합니다. - -주요 기능 및 특징 - -- 확대 기능 : 마우스 휠이나 두 손가락으로 확대할 수 있습니다. 더블 클릭 또는 더블 탭을 사용하여 확대할 수도 있으며, 선택한 영역을 확대하여 중앙에 배치할 수 있습니다. -- 이동 기능 : 마우스 포인터나 줌 인 상태에서 손가락을 사용하여 이동할 수 있습니다. 확대된 상태에서는 사용 가능한 공간에 따라 직관적으로 이동합니다. 요소를 이동할 수 있는 방향을 나타내기 위해 커서 스타일을 조정합니다. - --- 그 외 비슷한 diff --git a/src/content/memo/27.md b/src/content/memo/27.md index ed4c63a..ad0bbb0 100644 --- a/src/content/memo/27.md +++ b/src/content/memo/27.md @@ -1,4 +1,5 @@ --- +type: note tags: ['video', 'ffmpeg', 'canvas'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/270.md b/src/content/memo/270.md index 52dbcb2..fe59e08 100644 --- a/src/content/memo/270.md +++ b/src/content/memo/270.md @@ -1,4 +1,5 @@ --- +type: note tags: ['react', 'ui', 'confirm', 'react-confirm', 'react-confirm-alert'] status: release ctime: 2023-05-14 diff --git a/src/content/memo/271.md b/src/content/memo/271.md index 7ef1f22..511cd9c 100644 --- a/src/content/memo/271.md +++ b/src/content/memo/271.md @@ -1,25 +1,9 @@ --- +type: bookmarks tags: ['json', 'diff', 'deep-object-diff', 'json-diff', 'microdiff'] status: release ctime: 2023-05-18 -mtime: 2024-03-22 ---- - -[deep-object-diff](https://github.com/mattphillips/deep-object-diff)와 비슷한 비교 알고리즘을 구현하는 방법은 다양할 수 있지만, 대표적인 접근 방식은 재귀적으로 객체를 탐색하면서 속성을 비교하는 것입니다. 이를 위해 일반적으로 다음과 같은 과정을 따릅니다: - -1. 입력으로 받은 두 객체를 비교합니다. -2. 첫 번째 객체의 속성을 순회하면서 두 번째 객체에 동일한 속성이 있는지 확인합니다. - - 동일한 속성이 있다면, 해당 속성의 값을 비교합니다. - - 값이 같다면, 두 객체의 해당 속성은 동일하므로 비교를 종료합니다. - - 값이 다르다면, 속성이 변경된 것으로 간주하고 변경된 값을 기록합니다. -3. 첫 번째 객체의 속성을 순회하면서 두 번째 객체에 동일한 속성이 없는 경우, 해당 속성은 첫 번째 객체에서 삭제된 것으로 간주합니다. -4. 두 번째 객체의 속성을 순회하면서 첫 번째 객체에 동일한 속성이 없는 경우, 해당 속성은 두 번째 객체에 추가된 것으로 간주합니다. -5. 만약 속성이 객체나 배열인 경우, 재귀적으로 해당 객체나 배열을 탐색하면서 내부의 속성을 비교합니다. - -이러한 과정을 재귀적으로 반복하면서 객체의 모든 속성을 비교하고 차이를 식별합니다. 재귀적으로 탐색하므로 중첩된 객체나 배열에 대해서도 동일한 비교 알고리즘을 적용할 수 있습니다. - -이러한 비교 알고리즘을 구현하기 위해 각 언어나 라이브러리는 자체적으로 다양한 방식과 최적화 기법을 사용할 수 있습니다. 그리고 deep-object-diff나 비슷한 도구들은 이러한 알고리즘을 구현하여 사용자에게 편리한 인터페이스를 제공하는 것입니다. - +mtime: 2026-07-27 --- - [deep-object-diff](https://github.com/mattphillips/deep-object-diff) diff --git a/src/content/memo/272.md b/src/content/memo/272.md index 3784178..8906412 100644 --- a/src/content/memo/272.md +++ b/src/content/memo/272.md @@ -1,29 +1,14 @@ --- +type: bookmarks tags: ['git', 'stacking', 'sapling'] status: release ctime: 2023-05-20 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -Stacking Workflow는 큰 엔지니어링 작업을 작은 단위의 코드 변경으로 나누어 독립적으로 테스트, 검토 및 병합할 수 있는 프로세스입니다. 스택은 서로 의존하는 일련의 코드 변경으로 이루어집니다. +스택 = 서로 의존하는 PR의 연쇄. 기능 브랜치는 main에서 분기하지만 스택은 부모 PR에서 분기한다 — 그래서 검토를 기다리는 동안 다음 조각을 이어서 작업할 수 있다. -Why stack: Stacking은 작성자가 검토를 기다리는 동안 블록되지 않고 작업할 수 있게 하며, 더 품질 높은 검토 의견을 유도하고 작은 변경 사항을 빠르게 병합할 수 있게 합니다. 검토어는 작은 규모의 변경 사항을 검토하고, 재검토하는 시간을 줄이며, 무언가 잘못되었을 때 이를 분석하고 롤백할 수 있는 세분성을 갖추게 됩니다. - -What is stacking: Stacking은 여러 개의 의존하는 Pull Request(PR)로 이루어진 것입니다. Stacking은 작성자가 빠른 검토를 받을 수 있도록 하고, 높은 품질의 검토 의견을 얻을 수 있게 하며, 작은 변경 사항을 빠르게 병합할 수 있습니다. 검토어는 작은 규모의 변경 사항을 검토하며, 재검토 시간이 줄어들고, 필요한 경우 분석 및 롤백할 수 있는 세분성을 갖게 됩니다. - -Stacking vs feature branches: Stacking과 기능 브랜치 모두 트렁크 기반 개발을 가능하게 합니다. 그러나 Stacking은 기능 브랜치와 다른 점이 있는데, 기능 브랜치는 주로 main 브랜치에서 직접 분기되어야 하는 반면, Stacking은 서로 의존하는 PR들 간에 분기될 수 있다는 점입니다. 기능 브랜치는 비대해지고 검토하기 어려워질 수 있지만, 스택은 항상 가볍고 모듈식으로 유지될 수 있습니다. 기능 브랜치는 한꺼번에 검토되고 CI를 통과하고 한 번에 병합되어야 하지만, 스택은 작은 조각으로 검토되고 각각의 브랜치에서 CI를 통과한 후 언제든 병합될 수 있습니다. - -Creating a change: Stacking은 이미 브랜치에서 분기하고 서로 의존하는 두 개의 PR을 열었다면 이미 사용한 것입니다. 이 워크플로우는 git에서 기본적으로 지원되며, main 대신에 부모 PR에서 개발을 시작하고 브랜치를 확인하면 됩니다. - -Splitting: 일부 개발자는 처음에 큰 변경 사항을 작성하고 나중에 이를 작은 변경 사항의 스택으로 나누는 것을 선호합니다. 이는 최종 코드 구조를 미리 예측하기 어려울 때 도움이 되며, 작은, 독립적으로 검토 가능한 일련의 변경 사항을 제출하고자 할 때 유용합니다. - -Updating a change: 스택된 브랜치를 업데이트하는 것은 전통적인 브랜치를 업데이트하는 것과 다르지 않습니다. 유일한 차이점은 스택된 브랜치를 업데이트한 후에는 의존하는 PR의 병합 베이스도 업데이트해야 한다는 것입니다. 변경 사항마다 리베이스하는 것은 불안하게 느껴질 수 있지만, 도구를 사용하면 자동화할 수 있습니다. - -Opening and updating pull requests: 검토를 위해 준비되면 스택의 각 브랜치당 하나의 PR을 생성할 수 있습니다. 두 번째 브랜치에서 스택을 만들면 첫 번째 PR을 열 수 있습니다. 자주 변경 사항을 제출하면 PR이 작고 동료들이 쉽게 검토할 수 있습니다. - -Merging PRs: 변경 사항이 승인되고 CI를 통과하면 병합할 준비가 됩니다. 스택된 변경 사항은 항상 트렁크로 병합되며, 스택의 하단부터 병합됩니다. PR이 병합되면 의존하는 PR의 베이스 브랜치를 트렁크로 업데이트해야 합니다. - ---- +병합은 스택 아래부터. 하나가 병합되면 그 위 PR의 base를 갱신해야 한다. git 기본 기능만으로도 되지만 리베이스가 계속 따라붙어서, Graphite·Sapling 같은 도구가 그 부분을 자동화한다. - [Stacking | Graphite](https://graphite.dev/stacking) - [코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes | 인프콘 2022 - YouTube](https://youtu.be/XRZPkYnWa48) diff --git a/src/content/memo/273.md b/src/content/memo/273.md index bc4b24a..0b7b9c0 100644 --- a/src/content/memo/273.md +++ b/src/content/memo/273.md @@ -1,6 +1,7 @@ --- -tags: ['llm', 'bookmarks'] -status: draft +type: bookmarks +tags: ['llm'] +status: archive ctime: 2023-05-28 mtime: 2024-03-22 --- diff --git a/src/content/memo/274.md b/src/content/memo/274.md index 83af6d4..7f2137d 100644 --- a/src/content/memo/274.md +++ b/src/content/memo/274.md @@ -1,18 +1,11 @@ --- +type: note tags: ['terms', '버스-팩터'] -status: release +status: draft ctime: 2023-05-28 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -한 마을에 개발자들이 모여 프로젝트를 진행하고 있었습니다. 그 중 한 명의 개발자인 에릭은 팀에서 핵심적인 역할을 맡고 있었고, 그의 전문적인 지식과 능력은 프로젝트의 성공에 큰 영향을 미칠 정도였습니다. 그러나 에릭은 여행을 갈 계획을 세우고 모두에게 알리지 않았습니다. +버스 팩터 — 한꺼번에 빠지면 프로젝트가 멈추는 최소 인원 수. 1이면 그 사람이 곧 단일 장애점. -어느 날, 프로젝트 팀은 예기치 않은 문제에 직면했습니다. 시스템의 일부가 오작동을 일으켜 복구해야 할 상황이었는데, 당연히 에릭이 이를 해결할 수 있었습니다. 그러나 에릭은 이미 여행을 떠나버렸고, 팀은 그를 찾을 수 없었습니다. 에릭이 없는 상태에서는 아무도 그의 전문적인 지식을 대체할 수 없었기 때문에 팀은 큰 혼란에 빠지게 되었습니다. - -프로젝트 팀은 에릭의 결석으로 인한 위기를 극복하기 위해 긴급 회의를 열었습니다. 모두가 버스 팩터에 대해 이야기하며, 이 사태로부터 배운 교훈에 대해 논의했습니다. 팀은 이제부터 지식을 공유하고 업무를 분산시키기로 결정했습니다. 각 개발자는 다른 팀원의 역할을 이해하고, 중요한 결정과 지식을 모두가 공유하도록 노력하기로 했습니다. - -이제 마을의 개발자들은 에릭 없이도 프로젝트를 진행할 수 있었습니다. 에릭은 멋진 여행을 즐겼지만, 팀은 그의 결석으로 인한 위기를 극복하고 지속 가능한 개발 환경을 조성하는 데 성공했습니다. 그들은 버스 팩터를 기억하며, 이 작은 이야기는 그들에게 프로젝트 관리의 중요성을 상기시켜주었습니다. - ---- - -https://www.google.com/search?q=%EB%B2%84%EC%8A%A4%ED%8C%A9%ED%84%B0 \ No newline at end of file +- [Bus factor - Wikipedia](https://en.wikipedia.org/wiki/Bus_factor) diff --git a/src/content/memo/275.md b/src/content/memo/275.md index c6f7b77..1b752fc 100644 --- a/src/content/memo/275.md +++ b/src/content/memo/275.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'typescript', 'ts-pattern'] status: release ctime: 2023-05-29 diff --git a/src/content/memo/276.md b/src/content/memo/276.md index 2fb5a04..11904f1 100644 --- a/src/content/memo/276.md +++ b/src/content/memo/276.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['datadog', 'sourcemaps'] status: draft ctime: 2023-06-09 diff --git a/src/content/memo/277.md b/src/content/memo/277.md index 93c94d0..ad21177 100644 --- a/src/content/memo/277.md +++ b/src/content/memo/277.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['openapi', 'zod'] status: draft ctime: 2023-06-09 diff --git a/src/content/memo/278.md b/src/content/memo/278.md index d91d591..d3c06fd 100644 --- a/src/content/memo/278.md +++ b/src/content/memo/278.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['zod', 'error'] status: draft ctime: 2023-06-13 diff --git a/src/content/memo/279.md b/src/content/memo/279.md index 338d334..4766122 100644 --- a/src/content/memo/279.md +++ b/src/content/memo/279.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['css', 'ui'] status: release ctime: 2023-06-13 diff --git a/src/content/memo/28.md b/src/content/memo/28.md index f73cccf..fefd046 100644 --- a/src/content/memo/28.md +++ b/src/content/memo/28.md @@ -1,4 +1,5 @@ --- +type: note tags: ['calendar', 'ui', 'date'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/280.md b/src/content/memo/280.md index e62f1e6..da93661 100644 --- a/src/content/memo/280.md +++ b/src/content/memo/280.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['zod'] status: release ctime: 2023-06-14 diff --git a/src/content/memo/281.md b/src/content/memo/281.md index 5c46411..2717407 100644 --- a/src/content/memo/281.md +++ b/src/content/memo/281.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['debug'] status: release ctime: 2023-06-18 diff --git a/src/content/memo/282.md b/src/content/memo/282.md index 1e88195..0ee8b78 100644 --- a/src/content/memo/282.md +++ b/src/content/memo/282.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['spa', 'pwa', 'cache'] -status: draft +status: archive ctime: 2023-06-18 mtime: 2024-03-22 --- diff --git a/src/content/memo/283.md b/src/content/memo/283.md index 1aed787..34b0b71 100644 --- a/src/content/memo/283.md +++ b/src/content/memo/283.md @@ -1,6 +1,7 @@ --- -tags: ['api', 'bookmarks'] -status: draft +type: bookmarks +tags: ['api'] +status: archive ctime: 2023-06-27 mtime: 2024-03-22 --- diff --git a/src/content/memo/284.mdx b/src/content/memo/284.mdx index 27068eb..7bf7e24 100644 --- a/src/content/memo/284.mdx +++ b/src/content/memo/284.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['prosemirror'] -status: draft +status: archive ctime: 2023-07-02 mtime: 2024-03-22 --- diff --git a/src/content/memo/285.md b/src/content/memo/285.md index 3e19b3a..0c6820d 100644 --- a/src/content/memo/285.md +++ b/src/content/memo/285.md @@ -1,6 +1,7 @@ --- -tags: ['utility', 'bookmarks'] -status: draft +type: bookmarks +tags: ['utility'] +status: archive ctime: 2023-07-02 mtime: 2024-03-22 --- diff --git a/src/content/memo/286.md b/src/content/memo/286.md index 2b52b5a..242b1e1 100644 --- a/src/content/memo/286.md +++ b/src/content/memo/286.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['select', 'ui'] -status: draft +status: archive ctime: 2023-07-02 mtime: 2024-03-22 --- diff --git a/src/content/memo/287.md b/src/content/memo/287.md index bdaaf73..ebf8ddc 100644 --- a/src/content/memo/287.md +++ b/src/content/memo/287.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['error'] status: release ctime: 2023-07-03 diff --git a/src/content/memo/288.md b/src/content/memo/288.md index 3d9f2b8..8842962 100644 --- a/src/content/memo/288.md +++ b/src/content/memo/288.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['ast'] -status: draft +status: archive ctime: 2023-08-06 mtime: 2024-03-22 --- diff --git a/src/content/memo/289.md b/src/content/memo/289.md index c001087..57e140a 100644 --- a/src/content/memo/289.md +++ b/src/content/memo/289.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['modal', 'sheet', 'bottom-sheet'] status: release ctime: 2023-08-07 diff --git a/src/content/memo/29.md b/src/content/memo/29.md index 57843e7..a26d8ec 100644 --- a/src/content/memo/29.md +++ b/src/content/memo/29.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['calendar', 'date'] status: release ctime: 2022-11-05 diff --git a/src/content/memo/290.md b/src/content/memo/290.md index 6c17952..f652372 100644 --- a/src/content/memo/290.md +++ b/src/content/memo/290.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['form', 'ui'] -status: draft +status: archive ctime: 2023-08-07 mtime: 2024-03-22 --- diff --git a/src/content/memo/291.mdx b/src/content/memo/291.mdx index 8ee0897..87a9043 100644 --- a/src/content/memo/291.mdx +++ b/src/content/memo/291.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['effect'] -status: draft +status: archive ctime: 2023-08-13 mtime: 2024-03-22 --- diff --git a/src/content/memo/292.md b/src/content/memo/292.md index 86ca655..0991cd7 100644 --- a/src/content/memo/292.md +++ b/src/content/memo/292.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['webpack', 'esm'] status: draft ctime: 2023-08-28 diff --git a/src/content/memo/293.md b/src/content/memo/293.md index 381711b..2b6d061 100644 --- a/src/content/memo/293.md +++ b/src/content/memo/293.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['autocomplete', 'ui'] -status: draft +status: archive ctime: 2023-08-28 mtime: 2024-03-22 --- diff --git a/src/content/memo/294.md b/src/content/memo/294.md index 1753eac..dfdbe5e 100644 --- a/src/content/memo/294.md +++ b/src/content/memo/294.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['proxy', 'debug'] status: draft ctime: 2023-09-04 diff --git a/src/content/memo/296.md b/src/content/memo/296.md index 587f77d..19b6fef 100644 --- a/src/content/memo/296.md +++ b/src/content/memo/296.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['signal'] -status: draft +status: archive ctime: 2023-09-20 mtime: 2024-03-22 --- diff --git a/src/content/memo/297.md b/src/content/memo/297.md index 89fc9c3..7e5c315 100644 --- a/src/content/memo/297.md +++ b/src/content/memo/297.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['ui', 'ark-ui', 'component'] status: release ctime: 2023-10-07 diff --git a/src/content/memo/298.md b/src/content/memo/298.md index aa09d56..eb2f684 100644 --- a/src/content/memo/298.md +++ b/src/content/memo/298.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['pnpm'] -status: draft +status: archive ctime: 2023-12-16 mtime: 2024-03-22 --- diff --git a/src/content/memo/299.md b/src/content/memo/299.md index 67dfcc4..55048c7 100644 --- a/src/content/memo/299.md +++ b/src/content/memo/299.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['ui', 'combobox'] -status: draft +status: archive ctime: 2023-12-17 mtime: 2024-03-22 --- diff --git a/src/content/memo/3.md b/src/content/memo/3.md index 8ade93f..549cede 100644 --- a/src/content/memo/3.md +++ b/src/content/memo/3.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['javascript', 'regex'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/30.md b/src/content/memo/30.md index f5a5cb7..7e3e125 100644 --- a/src/content/memo/30.md +++ b/src/content/memo/30.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['gsap', 'draggable', '360', 'ui'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/300.md b/src/content/memo/300.md index 6997d2f..83967e4 100644 --- a/src/content/memo/300.md +++ b/src/content/memo/300.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['pkg', 'node', 'nexe'] status: release ctime: 2024-04-07 diff --git a/src/content/memo/301.md b/src/content/memo/301.md index 40d7177..0512024 100644 --- a/src/content/memo/301.md +++ b/src/content/memo/301.md @@ -1,4 +1,5 @@ --- +type: note tags: ['astro', 'node', 'memory'] status: release ctime: 2024-04-21 diff --git a/src/content/memo/302.md b/src/content/memo/302.md index 0fd38cc..3b61028 100644 --- a/src/content/memo/302.md +++ b/src/content/memo/302.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: [ 'zooming', diff --git a/src/content/memo/303.md b/src/content/memo/303.md index 063de9b..6919a3f 100644 --- a/src/content/memo/303.md +++ b/src/content/memo/303.md @@ -1,4 +1,5 @@ --- +type: note title: Grid View description: Grid View의 개념과 주요 특징, 그리고 관련된 오픈 소스 라이브러리들을 소개 tags: diff --git a/src/content/memo/304.md b/src/content/memo/304.md index c8c5f18..87fb5ef 100644 --- a/src/content/memo/304.md +++ b/src/content/memo/304.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['dates', 'chrono', 'datepicker', 'inclusive-dates'] title: 자연어 날짜 처리와 접근성 높은 데이트피커 - chrono와 inclusive-dates description: chrono와 inclusive-dates 라이브러리를 소개. chrono는 강력한 자연어 날짜 파서이고, inclusive-dates는 이를 활용한 접근성 높은 데이트피커입니다. diff --git a/src/content/memo/305.md b/src/content/memo/305.md index 11ba854..8b361e6 100644 --- a/src/content/memo/305.md +++ b/src/content/memo/305.md @@ -1,4 +1,5 @@ --- +type: note tags: ['google-sheets', 'google-cloud'] status: release ctime: 2024-06-22 diff --git a/src/content/memo/306.md b/src/content/memo/306.md index d94516e..32bc1a5 100644 --- a/src/content/memo/306.md +++ b/src/content/memo/306.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['nextjs'] status: release ctime: 2024-06-24 diff --git a/src/content/memo/307.md b/src/content/memo/307.md index 5a54f19..3b9b960 100644 --- a/src/content/memo/307.md +++ b/src/content/memo/307.md @@ -1,8 +1,9 @@ --- +type: snippet tags: ['react', 'suspense'] status: release ctime: 2024-06-24 -mtime: 2024-06-24 +mtime: 2026-07-27 --- ```ts @@ -11,10 +12,7 @@ if (!data) { } ``` -1. 컴포넌트가 렌더링될 때, 비동기 작업(예: 데이터 패칭)이 시작됩니다. 이 작업은 일반적으로 promise를 반환합니다. -2. 비동기 작업이 완료되지 않은 경우, 컴포넌트는 promise를 던집니다. 이는 JavaScript에서 예외를 던지는 것과 유사합니다. Suspense는 promise가 던져질 때 이를 캐치하고 fallback UI를 표시하는 역할을 합니다. -3. React는 컴포넌트가 promise를 던졌을 때 이를 감지하고, Suspense 컴포넌트에서 이를 "캐치"합니다. Suspense는 이 promise가 해결될 때까지 대체 UI (fallback)를 렌더링합니다. Concurrent Mode에서는 React가 이 promise를 추적하고, 비동기 작업이 완료될 때까지 렌더링을 중단합니다. -4. Promise가 해결되면(즉, 비동기 작업이 완료되면) React는 컴포넌트를 다시 렌더링합니다. Suspense는 현재 데이터 패칭 라이브러리(예: React Query, SWR)와 함께 사용되어 비동기 작업의 상태를 쉽게 관리할 수 있도록 도와줍니다. +Suspense는 던져진 promise를 캐치해서 resolve될 때까지 fallback을 렌더하고, resolve되면 다시 렌더한다. 던지는 건 예외와 같은 메커니즘이다. --- diff --git a/src/content/memo/309.md b/src/content/memo/309.md index 1166939..02a9294 100644 --- a/src/content/memo/309.md +++ b/src/content/memo/309.md @@ -1,8 +1,10 @@ --- +type: snippet tags: ['enzyme', 'test', 'react-testing-library'] status: release +voice: author ctime: 2024-07-11 -mtime: 2025-01-12 +mtime: 2026-07-27 --- 최근에 [Enzyme](https://github.com/enzymejs/enzyme)을 제거하고 [React Testing Library](https://github.com/testing-library/react-testing-library)로 교체하는 작업을 진행했습니다. [JSX](https://facebook.github.io/jsx/) 영역은 별 문제 없이 진행되었으나, state나 props를 다루는 구현 부분에서 약간의 애매함이 있었습니다. 개인적으로는 기존 접근 방식이 나쁘지 않았다고 생각했기 때문에, 새로운 접근 방식으로 전환하는 데 주저하게 되었습니다. diff --git a/src/content/memo/31.md b/src/content/memo/31.md index d81b343..e1c2698 100644 --- a/src/content/memo/31.md +++ b/src/content/memo/31.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['drawing', 'ui'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/310.md b/src/content/memo/310.md index a3b9a6a..ce2982d 100644 --- a/src/content/memo/310.md +++ b/src/content/memo/310.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['test', 'react-router'] title: React Router의 Link 컴포넌트 테스트하기 description: 이 글에서는 React Router의 컴포넌트를 테스트하는 방법을 설명합니다. 사용자가 링크를 클릭하면 적절한 페이지로 이동하는지 확인하는 테스트 코드를 예제와 함께 제공합니다. diff --git a/src/content/memo/311.mdx b/src/content/memo/311.mdx index 396277b..cf49eae 100644 --- a/src/content/memo/311.mdx +++ b/src/content/memo/311.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['react'] status: release ctime: 2024-08-13 diff --git a/src/content/memo/312.md b/src/content/memo/312.md index c3e3c92..5c3fb0f 100644 --- a/src/content/memo/312.md +++ b/src/content/memo/312.md @@ -1,8 +1,9 @@ --- +type: note tags: ['excel', 'active-x-object', 'node'] status: release ctime: 2024-08-19 -mtime: 2024-08-19 +mtime: 2026-07-27 --- [Excel View](https://jsr.io/@timepp/ev)[^312-1] 라이브러리를 보던 중, Excel과 Node의 상호작용에 대한 궁금증이 생겼다. 아무래도 웹개발을 하다보니 어플리케이션과 통신할 수 있는 부분에 대해서 전혀 생각을 안했었다는 걸 깨닫고 이러한 부분을 보완하기 위해 Excel과의 통신 방식을 찾아봄. @@ -15,5 +16,5 @@ mtime: 2024-08-19 --- -[^312-1]: Excel에서 긴 줄을 탐색하는 데 도움이 되는 도구입니다. 활성 셀을 추적하고 전체 행 데이터를 자동으로 가져와 별도의 창에 표시합니다. 이를 통해 좌우로 스크롤하지 않고도 행의 모든 열을 쉽게 볼 수 있습니다. +[^312-1]: 활성 셀의 행 전체를 별도 창에 띄워서 좌우 스크롤 없이 보게 해주는 도구 [^312-2]: https://github.com/timepp/excelview/blob/master/excel.js#L70 diff --git a/src/content/memo/313.md b/src/content/memo/313.md index 8c994c9..070165a 100644 --- a/src/content/memo/313.md +++ b/src/content/memo/313.md @@ -1,4 +1,5 @@ --- +type: note tags: ['dialog'] status: release ctime: 2024-09-01 diff --git a/src/content/memo/314.mdx b/src/content/memo/314.mdx index 9e64aef..c164c11 100644 --- a/src/content/memo/314.mdx +++ b/src/content/memo/314.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['date', 'random', 'test', 'flaky'] status: release ctime: 2024-09-01 diff --git a/src/content/memo/315.mdx b/src/content/memo/315.mdx index 47172a1..6f4865a 100644 --- a/src/content/memo/315.mdx +++ b/src/content/memo/315.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['date', 'test'] status: release ctime: 2024-09-03 diff --git a/src/content/memo/317.md b/src/content/memo/317.md index 26eda70..0633eb2 100644 --- a/src/content/memo/317.md +++ b/src/content/memo/317.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['test', 'vitest', 'matchers', 'zod'] status: release ctime: 2024-09-15 diff --git a/src/content/memo/318.mdx b/src/content/memo/318.mdx index b8fddfd..2261afd 100644 --- a/src/content/memo/318.mdx +++ b/src/content/memo/318.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['blob', 'script'] status: release ctime: 2024-09-16 diff --git a/src/content/memo/319.mdx b/src/content/memo/319.mdx index c042a3d..8830d2b 100644 --- a/src/content/memo/319.mdx +++ b/src/content/memo/319.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['mermaid', 'state', 'react'] status: release ctime: 2024-09-17 diff --git a/src/content/memo/32.md b/src/content/memo/32.md index d9b916c..40708b4 100644 --- a/src/content/memo/32.md +++ b/src/content/memo/32.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['curtains', 'scrolltrigger', 'gsap', 'ui'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/320.md b/src/content/memo/320.md index e1c424b..d9331fb 100644 --- a/src/content/memo/320.md +++ b/src/content/memo/320.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['variable'] status: release ctime: 2024-12-31 diff --git a/src/content/memo/321.md b/src/content/memo/321.md index 81691da..926ede2 100644 --- a/src/content/memo/321.md +++ b/src/content/memo/321.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['status', 'ternary'] status: release ctime: 2024-12-31 diff --git a/src/content/memo/322.md b/src/content/memo/322.md index 18e0b8b..82245f3 100644 --- a/src/content/memo/322.md +++ b/src/content/memo/322.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'localstorage', 'map'] status: release ctime: 2024-12-31 diff --git a/src/content/memo/323.md b/src/content/memo/323.md index 8d9013e..7020074 100644 --- a/src/content/memo/323.md +++ b/src/content/memo/323.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'regex', 'formatting'] status: release ctime: 2024-12-31 diff --git a/src/content/memo/324.md b/src/content/memo/324.md index 755ef0a..0484cbc 100644 --- a/src/content/memo/324.md +++ b/src/content/memo/324.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['accessibility', 'aria'] status: release ctime: 2024-12-31 diff --git a/src/content/memo/325.md b/src/content/memo/325.md index f9b9e73..fffaf84 100644 --- a/src/content/memo/325.md +++ b/src/content/memo/325.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'formatting'] status: release ctime: 2024-12-31 diff --git a/src/content/memo/326.md b/src/content/memo/326.md index ee55400..a9f751a 100644 --- a/src/content/memo/326.md +++ b/src/content/memo/326.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react', 'testing', 'formdata'] status: release ctime: 2024-12-31 diff --git a/src/content/memo/327.md b/src/content/memo/327.md index 1a99440..cfbb69c 100644 --- a/src/content/memo/327.md +++ b/src/content/memo/327.md @@ -1,8 +1,10 @@ --- +type: snippet tags: ['test', 'mocking', 'timers'] status: release ctime: 2024-12-31 -mtime: 2024-12-31 +mtime: 2026-07-27 +parent: '315' --- 타이머를 제어하기 위해 `vi.useFakeTimers`와 `vi.advanceTimersByTime`을 사용하기. diff --git a/src/content/memo/328.md b/src/content/memo/328.md index 49a00f6..6922110 100644 --- a/src/content/memo/328.md +++ b/src/content/memo/328.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react', 'testing', 'context'] status: release ctime: 2024-12-31 diff --git a/src/content/memo/329.md b/src/content/memo/329.md index ee54378..3e9b978 100644 --- a/src/content/memo/329.md +++ b/src/content/memo/329.md @@ -1,60 +1,16 @@ --- +type: note tags: ['apps-script'] status: release ctime: 2024-12-31 -mtime: 2024-12-31 +mtime: 2026-07-27 --- -Google Apps Script 캘린더 예약 시스템 - 시간 슬롯 조회 및 예약 구현 +Apps Script로 캘린더 예약을 만들 때 쓰는 건 결국 API 두 개다. -**fetchAvailability** - 지정된 조건(근무 요일, 시간, 이벤트 충돌)에 따라 예약 가능한 시간 슬롯 조회 +`Calendar.Freebusy.query`로 바쁜 일정을 받아 근무 요일·근무 시간과 겹치는 슬롯을 빼면 예약 가능한 슬롯이 남는다. 예약은 `CalendarApp.getCalendarById`로 이벤트를 만들고 `sendInvites: true`로 초대 메일까지 보낸다. -```mermaid -flowchart LR - A[시작] --> B[가장 가까운 슬롯 계산] - B --> C[예약 기간 설정] - C --> D[바쁜 일정 조회] - D --> E[가능한 슬롯 필터링] - E --> F[예약 가능한 슬롯 반환] - F --> G[종료] -``` - -1. 현재 시간을 기준으로 가장 가까운 시간 슬롯을 계산합니다. (슬롯 길이는 `TIMESLOT_DURATION`에 따라 설정됩니다.) -2. 28일(`DAYS_IN_ADVANCE`) 동안의 일정 기간을 설정합니다. -3. `Calendar.Freebusy.query`를 사용하여 지정된 캘린더(`CALENDAR`)의 바쁜 일정(busy events)을 조회합니다. -4. 조회된 이벤트를 기반으로 조건에 맞지 않는 시간 슬롯을 제외합니다: - - 지정된 근무 시간(`WORKHOURS.start`, `WORKHOURS.end`) 외의 시간. - - 근무일(`WORKDAYS`)이 아닌 요일. - - 다른 이벤트와 시간이 겹치는 경우. -5. 예약 가능한 시간 슬롯을 ISO 8601 형식의 문자열로 저장하고 반환합니다. - -**bookTimeslot** - 선택한 시간 슬롯에 이벤트 생성. 성공 시 Calendar에 추가, 확인 메시지 반환. - -```mermaid -flowchart TD - A[시작] --> B[사용자 입력 수신] - B --> C[시간 슬롯 유효성 검증] - C --> D[이벤트 충돌 확인] - D --> E{이벤트가 존재합니까?} - E -- 예 --> F[에러 반환] - E -- 아니오 --> G[이벤트 생성] - G --> H[성공 메시지 반환] - F --> I[종료] - H --> I -``` - -1. 사용자가 선택한 시간 슬롯(`timeslot`)과 추가 정보(이름, 이메일, 전화번호, 메모)를 인수로 받습니다. -2. 시간 슬롯의 유효성을 검증하고, `TIMESLOT_DURATION`을 기준으로 종료 시간을 계산합니다. -3. `Calendar.Freebusy.query`를 통해 선택한 시간 동안 다른 이벤트가 있는지 확인합니다. - - 이벤트가 겹치면 예약이 불가능하다는 에러 메시지를 반환합니다. -4. 겹치는 이벤트가 없다면, `CalendarApp.getCalendarById`를 사용하여 Google Calendar에 새로운 이벤트를 생성합니다: - - 이벤트 제목: 사용자 이름이 포함된 약속 제목. - - 이벤트 설명: 전화번호와 메모를 포함합니다. - - 초대된 손님: 제공된 이메일로 초대합니다. - - 초대 메일 발송(`sendInvites: true`). -5. 예약 성공 여부를 메시지로 반환합니다. - -**사용 플로우:** 시간 조회 → 시간 선택 → `bookTimeslot` → 이벤트 생성 → 초대 이메일 발송 +Freebusy는 슬롯을 계산할 때와 실제로 예약할 때 두 번 조회한다 — 그 사이에 일정이 생길 수 있으니. --- diff --git a/src/content/memo/33.md b/src/content/memo/33.md index b2dda83..baecc67 100644 --- a/src/content/memo/33.md +++ b/src/content/memo/33.md @@ -1,6 +1,7 @@ --- -tags: ['react', 'bookmarks'] -status: draft +type: bookmarks +tags: ['react'] +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/330.md b/src/content/memo/330.md index 5c13ef7..3806b03 100644 --- a/src/content/memo/330.md +++ b/src/content/memo/330.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['skia-canvas', 'pdf'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/331.md b/src/content/memo/331.md index 08a9f2d..1c5da53 100644 --- a/src/content/memo/331.md +++ b/src/content/memo/331.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['sqlite', 'json'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/332.md b/src/content/memo/332.md index 421ad6f..11f73c4 100644 --- a/src/content/memo/332.md +++ b/src/content/memo/332.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['sqlite', 'database-design'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/333.md b/src/content/memo/333.md index 5916bd7..188bb4c 100644 --- a/src/content/memo/333.md +++ b/src/content/memo/333.md @@ -1,4 +1,5 @@ --- +type: note tags: ['oauth', 'jwt'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/334.md b/src/content/memo/334.md index d645e09..26faeb6 100644 --- a/src/content/memo/334.md +++ b/src/content/memo/334.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['mongodb', 'ttl'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/335.md b/src/content/memo/335.md index 0165941..eb202e9 100644 --- a/src/content/memo/335.md +++ b/src/content/memo/335.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/336.md b/src/content/memo/336.md index 334429c..99af07a 100644 --- a/src/content/memo/336.md +++ b/src/content/memo/336.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'regex'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/337.md b/src/content/memo/337.md index 7874657..abdced2 100644 --- a/src/content/memo/337.md +++ b/src/content/memo/337.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['apps-script'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/34.md b/src/content/memo/34.md index 0461b45..6b3370f 100644 --- a/src/content/memo/34.md +++ b/src/content/memo/34.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['use-effect', 'use-layout-effect', 'react'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/340.md b/src/content/memo/340.md index 43acfd2..9c2a40e 100644 --- a/src/content/memo/340.md +++ b/src/content/memo/340.md @@ -1,33 +1,13 @@ --- +type: snippet tags: ['sheets'] status: release ctime: 2025-01-01 -mtime: 2025-01-01 +mtime: 2026-07-27 --- -구글 스프레드시트에서 중복 값을 찾고 그 값에 별도의 스타일을 적용하는 방법 +구글 스프레드시트에서 중복 값에 스타일 주기 — 서식 > 조건부 서식 > 맞춤 수식에 넣는다. ```sh =COUNTIF(A:A, A:A) > 1 ``` - -1. **셀 범위 선택**: - 중복 값을 확인하고 스타일을 적용할 셀 범위를 선택합니다. 예를 들어, A 열 전체를 선택하려면 A 열을 클릭합니다. - -2. **조건부 서식 열기**: - 상단 메뉴에서 **"서식"**을 클릭한 다음 **"조건부 서식"**을 선택합니다. - -3. **서식 규칙 설정**: - 조건부 서식 규칙 창이 열리면, **"서식 규칙 추가"** 옵션을 클릭합니다. - -4. **맞춤 수식 사용**: - `서식 규칙` 드롭다운에서 **"맞춤 수식을 사용하여 서식 지정"**을 선택합니다. - -5. **중복 값 조건 수식 입력**: - 중복을 찾는 수식을 입력합니다. 이 수식은 A 열 전체에서 A1과 같은 값을 가지는 셀의 개수를 세고, 그 개수가 1보다 크면 중복으로 간주합니다. - -6. **서식 선택**: - 스타일을 지정하려면 **서식 스타일**에서 텍스트 색상, 배경 색상 등을 원하는 대로 설정합니다. - -7. **완료**: - 설정이 완료되면 **완료**를 클릭하여 적용합니다. diff --git a/src/content/memo/341.md b/src/content/memo/341.md index 004ccea..35f132b 100644 --- a/src/content/memo/341.md +++ b/src/content/memo/341.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['css', 'color', 'rgba', 'hex'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/342.md b/src/content/memo/342.md index 302a005..cff7d9a 100644 --- a/src/content/memo/342.md +++ b/src/content/memo/342.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['sheets'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/343.md b/src/content/memo/343.md index 61ae177..84a6f93 100644 --- a/src/content/memo/343.md +++ b/src/content/memo/343.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'delete'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/344.md b/src/content/memo/344.md index 1a4c4fc..2b97e9e 100644 --- a/src/content/memo/344.md +++ b/src/content/memo/344.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'algorithm', 'dfs'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/345.md b/src/content/memo/345.md index 31afe0b..1dbdf5f 100644 --- a/src/content/memo/345.md +++ b/src/content/memo/345.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/347.md b/src/content/memo/347.md index 43fa99e..93832e5 100644 --- a/src/content/memo/347.md +++ b/src/content/memo/347.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['vitest', 'jest', 'testing', 'mock'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/349.md b/src/content/memo/349.md index ac186e4..2b3c24b 100644 --- a/src/content/memo/349.md +++ b/src/content/memo/349.md @@ -1,4 +1,5 @@ --- +type: note tags: ['dialog', 'ux'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/35.md b/src/content/memo/35.md index b8ff07a..02febcc 100644 --- a/src/content/memo/35.md +++ b/src/content/memo/35.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['react', 'ref', 'use-ref'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/350.md b/src/content/memo/350.md index e1d2f13..f150b21 100644 --- a/src/content/memo/350.md +++ b/src/content/memo/350.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/351.md b/src/content/memo/351.md index b313795..97544d4 100644 --- a/src/content/memo/351.md +++ b/src/content/memo/351.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['use-sync-external-store', 'react'] status: release ctime: 2025-01-06 diff --git a/src/content/memo/352.md b/src/content/memo/352.md index 8332968..b2a06ec 100644 --- a/src/content/memo/352.md +++ b/src/content/memo/352.md @@ -1,4 +1,5 @@ --- +type: note tags: ['thisisunsafe'] status: release ctime: 2025-01-06 diff --git a/src/content/memo/353.md b/src/content/memo/353.md index 56864b4..bece6f9 100644 --- a/src/content/memo/353.md +++ b/src/content/memo/353.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['json'] -status: draft +status: archive ctime: 2025-01-06 mtime: 2025-01-06 --- diff --git a/src/content/memo/354.mdx b/src/content/memo/354.mdx index 37cf829..1109977 100644 --- a/src/content/memo/354.mdx +++ b/src/content/memo/354.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react'] status: release ctime: 2025-01-10 diff --git a/src/content/memo/355.md b/src/content/memo/355.md index 1132931..e71b0be 100644 --- a/src/content/memo/355.md +++ b/src/content/memo/355.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['event', 'bubbling', 'capturing'] -status: draft +status: archive ctime: 2025-01-12 mtime: 2025-01-12 --- diff --git a/src/content/memo/357.md b/src/content/memo/357.md index bd6f056..e168d8b 100644 --- a/src/content/memo/357.md +++ b/src/content/memo/357.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['error', 'tuple'] status: release ctime: 2025-01-12 diff --git a/src/content/memo/358.mdx b/src/content/memo/358.mdx index f7edf49..b96448e 100644 --- a/src/content/memo/358.mdx +++ b/src/content/memo/358.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['field-sizing', 'input', 'textarea', 'select'] status: release ctime: 2025-01-12 diff --git a/src/content/memo/359.md b/src/content/memo/359.md index 18db494..1183d74 100644 --- a/src/content/memo/359.md +++ b/src/content/memo/359.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['speculation'] -status: draft +status: archive ctime: 2025-01-12 mtime: 2025-01-12 --- diff --git a/src/content/memo/36.md b/src/content/memo/36.md index bb14d38..5605244 100644 --- a/src/content/memo/36.md +++ b/src/content/memo/36.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react', 'use-reducer'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/360.md b/src/content/memo/360.md index e117cb8..91d02bd 100644 --- a/src/content/memo/360.md +++ b/src/content/memo/360.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['abort-controller'] status: release ctime: 2025-01-12 diff --git a/src/content/memo/361.md b/src/content/memo/361.md index 69e35ed..37856f0 100644 --- a/src/content/memo/361.md +++ b/src/content/memo/361.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['spa'] -status: draft +status: archive ctime: 2025-01-12 mtime: 2025-01-12 --- diff --git a/src/content/memo/362.md b/src/content/memo/362.md index 002c05b..dfa0e66 100644 --- a/src/content/memo/362.md +++ b/src/content/memo/362.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['keyboard'] -status: draft +status: archive ctime: 2025-01-12 mtime: 2025-01-12 --- diff --git a/src/content/memo/363.md b/src/content/memo/363.md index fdb0362..d6d70a6 100644 --- a/src/content/memo/363.md +++ b/src/content/memo/363.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['react-compiler'] -status: draft +status: archive ctime: 2025-01-13 mtime: 2025-01-13 --- diff --git a/src/content/memo/364.md b/src/content/memo/364.md index 943b5d1..498ab7a 100644 --- a/src/content/memo/364.md +++ b/src/content/memo/364.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['scroll'] -status: draft +status: archive ctime: 2025-01-14 mtime: 2025-01-14 --- diff --git a/src/content/memo/365.md b/src/content/memo/365.md index 7254572..1224732 100644 --- a/src/content/memo/365.md +++ b/src/content/memo/365.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['modal'] -status: draft +status: archive ctime: 2025-01-14 mtime: 2025-01-14 --- diff --git a/src/content/memo/366.md b/src/content/memo/366.md index fe92b39..bb2fe32 100644 --- a/src/content/memo/366.md +++ b/src/content/memo/366.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['sticky'] -status: draft +status: archive ctime: 2025-01-14 mtime: 2025-01-14 --- diff --git a/src/content/memo/367.mdx b/src/content/memo/367.mdx index 4b371cb..4529d2d 100644 --- a/src/content/memo/367.mdx +++ b/src/content/memo/367.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['zod', 'search-params'] status: release ctime: 2025-01-16 diff --git a/src/content/memo/368.mdx b/src/content/memo/368.mdx index 1b9cd6e..a2701d3 100644 --- a/src/content/memo/368.mdx +++ b/src/content/memo/368.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['url'] status: release ctime: 2025-01-16 diff --git a/src/content/memo/369.md b/src/content/memo/369.md index ce37917..aae2a86 100644 --- a/src/content/memo/369.md +++ b/src/content/memo/369.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['monaco'] -status: draft +status: archive ctime: 2025-01-17 mtime: 2025-01-17 --- diff --git a/src/content/memo/37.md b/src/content/memo/37.md index 53ea507..1f3dbdb 100644 --- a/src/content/memo/37.md +++ b/src/content/memo/37.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['use-memo', 'react', 'memoization', 'use-callback'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/370.md b/src/content/memo/370.md index 88e6479..6bce0ae 100644 --- a/src/content/memo/370.md +++ b/src/content/memo/370.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['font'] -status: draft +status: archive ctime: 2025-01-17 mtime: 2025-01-17 --- diff --git a/src/content/memo/371.mdx b/src/content/memo/371.mdx index 1512e2e..28959d6 100644 --- a/src/content/memo/371.mdx +++ b/src/content/memo/371.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['css'] status: release ctime: 2025-01-17 diff --git a/src/content/memo/372.md b/src/content/memo/372.md index bc4e98c..3f794df 100644 --- a/src/content/memo/372.md +++ b/src/content/memo/372.md @@ -1,4 +1,5 @@ --- +type: note tags: ['aws'] status: draft ctime: 2025-01-18 diff --git a/src/content/memo/373.mdx b/src/content/memo/373.mdx index 90133aa..78c23a7 100644 --- a/src/content/memo/373.mdx +++ b/src/content/memo/373.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['router'] status: release ctime: 2025-01-18 diff --git a/src/content/memo/374.md b/src/content/memo/374.md index 952b366..ce22b60 100644 --- a/src/content/memo/374.md +++ b/src/content/memo/374.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['test', 'jest'] status: draft ctime: 2025-01-18 diff --git a/src/content/memo/375.md b/src/content/memo/375.md index eae1cd4..fa5fd4f 100644 --- a/src/content/memo/375.md +++ b/src/content/memo/375.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['active-element', 'dom', 'focus'] status: draft ctime: 2025-01-18 diff --git a/src/content/memo/376.mdx b/src/content/memo/376.mdx index f131dc5..2f65da6 100644 --- a/src/content/memo/376.mdx +++ b/src/content/memo/376.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'json'] status: release ctime: 2025-01-19 diff --git a/src/content/memo/377.md b/src/content/memo/377.md index 9f2def0..1d529b4 100644 --- a/src/content/memo/377.md +++ b/src/content/memo/377.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['github-actions', 'monorepo'] status: draft ctime: 2025-01-19 diff --git a/src/content/memo/38.md b/src/content/memo/38.md index 479242b..745e962 100644 --- a/src/content/memo/38.md +++ b/src/content/memo/38.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['optimize'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/380.mdx b/src/content/memo/380.mdx index 6491e25..2866f22 100644 --- a/src/content/memo/380.mdx +++ b/src/content/memo/380.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['type'] status: release ctime: 2025-01-28 diff --git a/src/content/memo/381.md b/src/content/memo/381.md index ab100a2..f9de627 100644 --- a/src/content/memo/381.md +++ b/src/content/memo/381.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['class', 'pattern', 'typescript'] status: release ctime: 2025-01-28 diff --git a/src/content/memo/382.mdx b/src/content/memo/382.mdx index a11d6bd..a544b12 100644 --- a/src/content/memo/382.mdx +++ b/src/content/memo/382.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['dsl', 'permissions', 'typescript'] status: release ctime: 2025-01-29 diff --git a/src/content/memo/383.mdx b/src/content/memo/383.mdx index f101e79..2ef3dee 100644 --- a/src/content/memo/383.mdx +++ b/src/content/memo/383.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['mp4', 'file-reader', 'hdlr', 'ffmpeg'] embed: https://stackblitz.com/edit/vitejs-vite-zmgejjyi?file=src%2FApp.tsx status: release diff --git a/src/content/memo/384.md b/src/content/memo/384.md index 32b7d30..5e9eca7 100644 --- a/src/content/memo/384.md +++ b/src/content/memo/384.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['remote', 'react'] -status: draft +status: archive embed: https://stackblitz.com/edit/vitejs-vite-ag8h7uwy?file=src%2FApp.tsx ctime: 2025-02-02 mtime: 2025-02-02 diff --git a/src/content/memo/385.mdx b/src/content/memo/385.mdx index 3eead80..c25aff6 100644 --- a/src/content/memo/385.mdx +++ b/src/content/memo/385.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['fp'] status: release ctime: 2025-02-02 diff --git a/src/content/memo/386.md b/src/content/memo/386.md index bda0683..80e52f7 100644 --- a/src/content/memo/386.md +++ b/src/content/memo/386.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react'] status: release ctime: 2025-02-04 diff --git a/src/content/memo/387.md b/src/content/memo/387.md index 6b6d3c7..b1514d4 100644 --- a/src/content/memo/387.md +++ b/src/content/memo/387.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['zig'] -status: draft +status: archive ctime: 2025-02-07 mtime: 2025-02-07 --- diff --git a/src/content/memo/388.md b/src/content/memo/388.md index fb34372..d4e8a8f 100644 --- a/src/content/memo/388.md +++ b/src/content/memo/388.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['i18n'] -status: draft +status: archive ctime: 2025-02-07 mtime: 2025-02-07 --- diff --git a/src/content/memo/389.md b/src/content/memo/389.md index b387b6f..1e401db 100644 --- a/src/content/memo/389.md +++ b/src/content/memo/389.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['terminal'] -status: draft +status: archive ctime: 2025-02-07 mtime: 2025-02-07 --- diff --git a/src/content/memo/39.md b/src/content/memo/39.md index f9156fb..ba81aa2 100644 --- a/src/content/memo/39.md +++ b/src/content/memo/39.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['react', 'redux', 'context'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/390.md b/src/content/memo/390.md index 4c3c456..8e71a6a 100644 --- a/src/content/memo/390.md +++ b/src/content/memo/390.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['vite'] -status: draft +status: archive ctime: 2025-02-07 mtime: 2025-02-07 --- diff --git a/src/content/memo/391.md b/src/content/memo/391.md index 7d70e99..6969c14 100644 --- a/src/content/memo/391.md +++ b/src/content/memo/391.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['motion'] -status: draft +status: archive ctime: 2025-02-07 mtime: 2025-02-07 --- diff --git a/src/content/memo/392.md b/src/content/memo/392.md index 0cc9dd7..f93255b 100644 --- a/src/content/memo/392.md +++ b/src/content/memo/392.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['icon'] -status: draft +status: archive ctime: 2025-02-08 mtime: 2025-02-08 --- diff --git a/src/content/memo/393.md b/src/content/memo/393.md index c1ee749..c76776f 100644 --- a/src/content/memo/393.md +++ b/src/content/memo/393.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['broadcast-channel'] -status: draft +status: archive ctime: 2025-02-08 mtime: 2025-02-08 --- diff --git a/src/content/memo/394.md b/src/content/memo/394.md index c4a4fd8..0c665d0 100644 --- a/src/content/memo/394.md +++ b/src/content/memo/394.md @@ -1,6 +1,7 @@ --- -tags: ['ffmpeg', 'bookmarks'] -status: draft +type: bookmarks +tags: ['ffmpeg'] +status: archive ctime: 2025-02-08 mtime: 2025-02-08 --- diff --git a/src/content/memo/395.md b/src/content/memo/395.md index 8767dcc..a5cea03 100644 --- a/src/content/memo/395.md +++ b/src/content/memo/395.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['gui'] -status: draft +status: archive ctime: 2025-02-08 mtime: 2025-02-08 --- diff --git a/src/content/memo/396.md b/src/content/memo/396.md index 6bb0861..cc53d0d 100644 --- a/src/content/memo/396.md +++ b/src/content/memo/396.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['lexo-rank'] -status: draft +status: archive ctime: 2025-02-09 mtime: 2025-02-09 --- diff --git a/src/content/memo/397.md b/src/content/memo/397.md index a673d4e..732236a 100644 --- a/src/content/memo/397.md +++ b/src/content/memo/397.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['cli'] -status: draft +status: archive ctime: 2025-02-09 mtime: 2025-02-09 --- diff --git a/src/content/memo/399.md b/src/content/memo/399.md index 7a5ea22..fd57c1d 100644 --- a/src/content/memo/399.md +++ b/src/content/memo/399.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['aria'] -status: draft +status: archive ctime: 2025-02-09 mtime: 2025-02-09 --- diff --git a/src/content/memo/4.md b/src/content/memo/4.md index 545c37e..956dc42 100644 --- a/src/content/memo/4.md +++ b/src/content/memo/4.md @@ -1,4 +1,5 @@ --- +type: note tags: ['blob', 'javascript', 'file', 'axios'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/40.md b/src/content/memo/40.md index a1dd111..d495f89 100644 --- a/src/content/memo/40.md +++ b/src/content/memo/40.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['react', 'suspense'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/400.md b/src/content/memo/400.md index bfddc0c..9bffe41 100644 --- a/src/content/memo/400.md +++ b/src/content/memo/400.md @@ -1,6 +1,7 @@ --- -tags: ['aws', 'bookmarks'] -status: draft +type: bookmarks +tags: ['aws'] +status: archive ctime: 2025-02-09 mtime: 2025-02-09 --- diff --git a/src/content/memo/401.md b/src/content/memo/401.md index d198cb9..cf602d1 100644 --- a/src/content/memo/401.md +++ b/src/content/memo/401.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['scroll'] -status: draft +status: archive ctime: 2025-02-11 mtime: 2025-02-11 --- diff --git a/src/content/memo/402.md b/src/content/memo/402.md index e8f23aa..ad83b34 100644 --- a/src/content/memo/402.md +++ b/src/content/memo/402.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['clipboard'] -status: draft +status: archive ctime: 2025-02-11 mtime: 2025-02-11 --- diff --git a/src/content/memo/403.md b/src/content/memo/403.md index 6af62fb..4487599 100644 --- a/src/content/memo/403.md +++ b/src/content/memo/403.md @@ -1,6 +1,7 @@ --- -tags: ['webgl', 'bookmarks'] -status: draft +type: bookmarks +tags: ['webgl'] +status: archive ctime: 2025-02-14 mtime: 2025-02-14 --- diff --git a/src/content/memo/404.md b/src/content/memo/404.md index 3e16e52..990be17 100644 --- a/src/content/memo/404.md +++ b/src/content/memo/404.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['typescript', 'branded-types'] -status: draft +status: archive ctime: 2025-02-14 mtime: 2025-02-14 --- diff --git a/src/content/memo/405.md b/src/content/memo/405.md index 6c0dc36..63edffa 100644 --- a/src/content/memo/405.md +++ b/src/content/memo/405.md @@ -1,6 +1,7 @@ --- -tags: ['astro', 'bookmarks'] -status: draft +type: bookmarks +tags: ['astro'] +status: archive ctime: 2025-02-14 mtime: 2025-02-14 --- diff --git a/src/content/memo/407.md b/src/content/memo/407.md index 63b4e24..856d31d 100644 --- a/src/content/memo/407.md +++ b/src/content/memo/407.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['devtools'] -status: draft +status: archive ctime: 2025-02-14 mtime: 2025-02-14 --- diff --git a/src/content/memo/408.md b/src/content/memo/408.md index 0f8d6cf..018ad04 100644 --- a/src/content/memo/408.md +++ b/src/content/memo/408.md @@ -1,6 +1,7 @@ --- -tags: ['electron', 'bookmarks'] -status: draft +type: bookmarks +tags: ['electron'] +status: archive ctime: 2025-02-14 mtime: 2025-02-14 --- diff --git a/src/content/memo/409.md b/src/content/memo/409.md index d93366b..00e491d 100644 --- a/src/content/memo/409.md +++ b/src/content/memo/409.md @@ -1,6 +1,7 @@ --- -tags: ['dnd', 'bookmarks'] -status: draft +type: bookmarks +tags: ['dnd'] +status: archive ctime: 2025-02-14 mtime: 2025-02-14 --- diff --git a/src/content/memo/41.md b/src/content/memo/41.md index 29b85d2..5b5534b 100644 --- a/src/content/memo/41.md +++ b/src/content/memo/41.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['clone-element', 'react'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/410.md b/src/content/memo/410.md index b8ff277..b5738eb 100644 --- a/src/content/memo/410.md +++ b/src/content/memo/410.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['next', 'next-sitemap'] status: draft ctime: 2025-02-14 diff --git a/src/content/memo/411.md b/src/content/memo/411.md index 7f429c1..c3bef18 100644 --- a/src/content/memo/411.md +++ b/src/content/memo/411.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['orama'] -status: draft +status: archive ctime: 2025-02-14 mtime: 2025-02-14 --- diff --git a/src/content/memo/412.md b/src/content/memo/412.md index 59acdda..a046fb0 100644 --- a/src/content/memo/412.md +++ b/src/content/memo/412.md @@ -1,6 +1,7 @@ --- -tags: ['cli', 'bookmarks'] -status: draft +type: bookmarks +tags: ['cli'] +status: archive ctime: 2025-02-14 mtime: 2025-02-14 --- diff --git a/src/content/memo/413.md b/src/content/memo/413.md index f188beb..f5997dc 100644 --- a/src/content/memo/413.md +++ b/src/content/memo/413.md @@ -1,6 +1,7 @@ --- -tags: ['figma', 'bookmarks'] -status: draft +type: bookmarks +tags: ['figma'] +status: archive ctime: 2025-02-15 mtime: 2025-02-15 --- diff --git a/src/content/memo/415.md b/src/content/memo/415.md index 0dc55eb..397ae2d 100644 --- a/src/content/memo/415.md +++ b/src/content/memo/415.md @@ -1,6 +1,7 @@ --- -tags: ['extension', 'bookmarks'] -status: draft +type: bookmarks +tags: ['extension'] +status: archive ctime: 2025-02-15 mtime: 2025-02-15 --- diff --git a/src/content/memo/416.md b/src/content/memo/416.md index c44851c..c5663a1 100644 --- a/src/content/memo/416.md +++ b/src/content/memo/416.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['msfs'] -status: draft +status: archive ctime: 2025-02-15 mtime: 2025-02-15 --- diff --git a/src/content/memo/417.md b/src/content/memo/417.md index 7e57352..f877d36 100644 --- a/src/content/memo/417.md +++ b/src/content/memo/417.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['render'] -status: draft +status: archive ctime: 2025-02-15 mtime: 2025-02-15 --- diff --git a/src/content/memo/418.md b/src/content/memo/418.md index 0ead7f3..c7159e7 100644 --- a/src/content/memo/418.md +++ b/src/content/memo/418.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['db'] -status: draft +status: archive ctime: 2025-02-17 mtime: 2025-02-17 --- diff --git a/src/content/memo/419.md b/src/content/memo/419.md index e928440..86a8245 100644 --- a/src/content/memo/419.md +++ b/src/content/memo/419.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['crdt'] -status: draft +status: archive ctime: 2025-02-17 mtime: 2025-02-17 --- diff --git a/src/content/memo/42.md b/src/content/memo/42.md index f2b34ff..9421557 100644 --- a/src/content/memo/42.md +++ b/src/content/memo/42.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['react', 'icon', 'svg'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/420.md b/src/content/memo/420.md index dd7de7c..27ac8c7 100644 --- a/src/content/memo/420.md +++ b/src/content/memo/420.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['analytics'] -status: draft +status: archive ctime: 2025-02-17 mtime: 2025-02-17 --- diff --git a/src/content/memo/421.md b/src/content/memo/421.md index b3f7aff..7d9ed8f 100644 --- a/src/content/memo/421.md +++ b/src/content/memo/421.md @@ -1,6 +1,7 @@ --- -tags: ['wasm', 'bookmarks'] -status: draft +type: bookmarks +tags: ['wasm'] +status: archive ctime: 2025-02-17 mtime: 2025-02-17 --- diff --git a/src/content/memo/423.md b/src/content/memo/423.md index 7c7eb8d..b5a9564 100644 --- a/src/content/memo/423.md +++ b/src/content/memo/423.md @@ -1,6 +1,7 @@ --- -tags: ['auth', 'bookmarks'] -status: draft +type: bookmarks +tags: ['auth'] +status: archive ctime: 2025-02-17 mtime: 2025-02-17 --- diff --git a/src/content/memo/424.md b/src/content/memo/424.md index e4a113c..1a7d7e6 100644 --- a/src/content/memo/424.md +++ b/src/content/memo/424.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['epub'] -status: draft +status: archive ctime: 2025-02-17 mtime: 2025-02-17 --- diff --git a/src/content/memo/425.md b/src/content/memo/425.md index 55670c3..5d0b6bb 100644 --- a/src/content/memo/425.md +++ b/src/content/memo/425.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['form'] -status: draft +status: archive ctime: 2025-02-17 mtime: 2025-02-17 --- diff --git a/src/content/memo/426.md b/src/content/memo/426.md index 402ba7c..0b2edce 100644 --- a/src/content/memo/426.md +++ b/src/content/memo/426.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['mock'] -status: draft +status: archive ctime: 2025-02-17 mtime: 2025-02-17 --- diff --git a/src/content/memo/428.md b/src/content/memo/428.md index d2ad49a..76e0b3b 100644 --- a/src/content/memo/428.md +++ b/src/content/memo/428.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['astro'] -status: draft +status: archive ctime: 2025-03-02 mtime: 2025-03-02 --- diff --git a/src/content/memo/429.md b/src/content/memo/429.md index 3d89b05..54a3fb1 100644 --- a/src/content/memo/429.md +++ b/src/content/memo/429.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['error', 'messages'] -status: draft +status: archive ctime: 2025-03-02 mtime: 2025-03-02 --- diff --git a/src/content/memo/43.md b/src/content/memo/43.md index d3d61bf..b3703ae 100644 --- a/src/content/memo/43.md +++ b/src/content/memo/43.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['react', 'styled-components', 'responsive'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/430.mdx b/src/content/memo/430.mdx index 8f62786..adef137 100644 --- a/src/content/memo/430.mdx +++ b/src/content/memo/430.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['fp-ts', 'fp'] status: draft ctime: 2025-03-02 diff --git a/src/content/memo/431.mdx b/src/content/memo/431.mdx index 03eb540..3e389d5 100644 --- a/src/content/memo/431.mdx +++ b/src/content/memo/431.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['ocr'] status: release ctime: 2025-03-03 diff --git a/src/content/memo/432.mdx b/src/content/memo/432.mdx index 4402de7..69da762 100644 --- a/src/content/memo/432.mdx +++ b/src/content/memo/432.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['gleam'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/433.mdx b/src/content/memo/433.mdx index 4463ec4..24a011e 100644 --- a/src/content/memo/433.mdx +++ b/src/content/memo/433.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['symbol'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/435.md b/src/content/memo/435.md index 53e0390..e72c382 100644 --- a/src/content/memo/435.md +++ b/src/content/memo/435.md @@ -1,4 +1,5 @@ --- +type: note tags: ['jd'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/436.mdx b/src/content/memo/436.mdx index 3b496a5..d06f2d5 100644 --- a/src/content/memo/436.mdx +++ b/src/content/memo/436.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['Haskell'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/437.md b/src/content/memo/437.md index 847e021..69ead58 100644 --- a/src/content/memo/437.md +++ b/src/content/memo/437.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['open-api'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/438.mdx b/src/content/memo/438.mdx index 02fe33e..211a43b 100644 --- a/src/content/memo/438.mdx +++ b/src/content/memo/438.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['rust'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/439.mdx b/src/content/memo/439.mdx index f6a97e3..6a9ca64 100644 --- a/src/content/memo/439.mdx +++ b/src/content/memo/439.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['PEG', 'Peggy', 'Ohm'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/44.md b/src/content/memo/44.md index c7b7b31..5e4cdb1 100644 --- a/src/content/memo/44.md +++ b/src/content/memo/44.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['react', 'server-components'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/440.mdx b/src/content/memo/440.mdx index c7cb35f..4fe2d09 100644 --- a/src/content/memo/440.mdx +++ b/src/content/memo/440.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['convex'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/441.mdx b/src/content/memo/441.mdx index 99f4aaf..4b0d4d8 100644 --- a/src/content/memo/441.mdx +++ b/src/content/memo/441.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['generator', 'javascript'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/442.mdx b/src/content/memo/442.mdx index 2ce37fa..33fb203 100644 --- a/src/content/memo/442.mdx +++ b/src/content/memo/442.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['zod'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/443.md b/src/content/memo/443.md index f8842dd..fad7ce7 100644 --- a/src/content/memo/443.md +++ b/src/content/memo/443.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['HMR'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/444.md b/src/content/memo/444.md index 610f2db..1a93b7e 100644 --- a/src/content/memo/444.md +++ b/src/content/memo/444.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['debug'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/445.md b/src/content/memo/445.md index 8bfb18d..643cbdf 100644 --- a/src/content/memo/445.md +++ b/src/content/memo/445.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['tooltip'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/446.md b/src/content/memo/446.md index c6e9a2a..9dc1f1a 100644 --- a/src/content/memo/446.md +++ b/src/content/memo/446.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['a11y'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/447.md b/src/content/memo/447.md index a0c7103..d6bef34 100644 --- a/src/content/memo/447.md +++ b/src/content/memo/447.md @@ -1,6 +1,7 @@ --- -tags: ['learn', 'bookmarks'] -status: draft +type: bookmarks +tags: ['learn'] +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/448.md b/src/content/memo/448.md index fbfd30f..3a50166 100644 --- a/src/content/memo/448.md +++ b/src/content/memo/448.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['img'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/449.mdx b/src/content/memo/449.mdx index 942802e..b06e777 100644 --- a/src/content/memo/449.mdx +++ b/src/content/memo/449.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['state'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/45.md b/src/content/memo/45.md index 78a81bc..93fa438 100644 --- a/src/content/memo/45.md +++ b/src/content/memo/45.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['react', 'state', 'state-machine'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/450.mdx b/src/content/memo/450.mdx index c4cf975..35afa72 100644 --- a/src/content/memo/450.mdx +++ b/src/content/memo/450.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['val'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/451.mdx b/src/content/memo/451.mdx index 92fe357..005f8f6 100644 --- a/src/content/memo/451.mdx +++ b/src/content/memo/451.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['service-worker'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/452.mdx b/src/content/memo/452.mdx index 0e59e20..50e0552 100644 --- a/src/content/memo/452.mdx +++ b/src/content/memo/452.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['devtools'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/453.md b/src/content/memo/453.md index e890592..4ee363c 100644 --- a/src/content/memo/453.md +++ b/src/content/memo/453.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['llm'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/454.mdx b/src/content/memo/454.mdx index 2d09799..58afd29 100644 --- a/src/content/memo/454.mdx +++ b/src/content/memo/454.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['thread'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/455.mdx b/src/content/memo/455.mdx index e09ed1c..5d12ae7 100644 --- a/src/content/memo/455.mdx +++ b/src/content/memo/455.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['audio'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/457.mdx b/src/content/memo/457.mdx index a98da0e..921b603 100644 --- a/src/content/memo/457.mdx +++ b/src/content/memo/457.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['web-authn'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/458.mdx b/src/content/memo/458.mdx index aa1d117..0e4e5ab 100644 --- a/src/content/memo/458.mdx +++ b/src/content/memo/458.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['concurrency'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/459.mdx b/src/content/memo/459.mdx index 40cfcd4..b85e86e 100644 --- a/src/content/memo/459.mdx +++ b/src/content/memo/459.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['slot'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/46.md b/src/content/memo/46.md index a3e0e69..8526183 100644 --- a/src/content/memo/46.md +++ b/src/content/memo/46.md @@ -1,8 +1,9 @@ --- +type: bookmarks tags: ['composition', 'react'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - [Using Composition in React to Avoid "Prop Drilling"](https://youtu.be/3XaXKiXtNjw)[^46-1] @@ -11,15 +12,5 @@ mtime: 2024-03-22 --- -- 유연성: 정책을 메커니즘에서 분리하고 인터페이스를 엔진에서 분리하면 소프트웨어 구성 요소를 설계하고 구현할 때 더 큰 유연성을 확보할 수 있습니다. 따라서 시스템의 나머지 부분에 영향을 주지 않고 구성 요소를 수정하거나 교체하기가 더 쉬워집니다. -- 재사용 가능성: 컴포넌트를 별개의 모듈로 분리하면 다양한 컨텍스트나 애플리케이션에서 사용할 수 있는 재사용 가능한 빌딩 블록을 만들 수 있습니다. 이를 통해 코드 재사용을 촉진하여 개발 시간을 단축하고 코드 품질을 개선할 수 있습니다. -- 테스트 가능성: 메커니즘을 정책에서 분리하고 인터페이스를 엔진에서 분리하면 개별 구성 요소를 개별적으로 테스트하기가 더 쉬워져 전반적인 테스트 범위가 개선되고 버그나 회귀의 위험이 줄어듭니다. -- 유지 관리 가능성: 컴포넌트를 별개의 모듈로 분리하면 시간이 지남에 따라 코드를 더 쉽게 유지 관리하고 디버그할 수 있습니다. 또한 시스템의 나머지 부분에 영향을 주지 않고 개별 컴포넌트의 문제나 버그를 더 쉽게 식별하고 수정할 수 있습니다. -- 확장성: 컴포넌트를 분리하면 특정 요구 사항에 따라 여러 컴포넌트를 독립적으로 확장할 수 있어 소프트웨어 애플리케이션을 더 쉽게 확장할 수 있습니다. -- 상호 운용성: 구성 요소를 분리하면 서로 다른 시스템 간에 통신하는 데 사용할 수 있는 잘 정의되고 표준화된 인터페이스를 생성하여 서로 다른 시스템 또는 구성 요소 간의 상호 운용성을 향상시킬 수 있습니다. -- 민첩성: 컴포넌트를 분리하면 나머지 시스템에 영향을 주지 않고 개별 컴포넌트를 더 빠르게 반복하고 변경할 수 있어 민첩성을 향상시킬 수 있습니다. - ---- - [^46-1]: React에서 컴포지션의 개념과 "Prop Drilling"을 피하기 위해 React에서 사용하는 방법을 설명. [^46-2]: Headless UI 컴포넌트의 개념을 소개. 헤드리스 UI 컴포넌트가 무엇인지, 기존 UI 컴포넌트와 어떻게 다른지 설명하고, 다양한 프로그래밍 언어와 프레임워크에서 헤드리스 UI 컴포넌트를 구현하는 방법에 대한 예제. diff --git a/src/content/memo/460.md b/src/content/memo/460.md index 14233d8..ffb0457 100644 --- a/src/content/memo/460.md +++ b/src/content/memo/460.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['video', 'transparency'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/461.mdx b/src/content/memo/461.mdx index a38c278..2c521e5 100644 --- a/src/content/memo/461.mdx +++ b/src/content/memo/461.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['form-data', 'File'] status: release ctime: 2025-03-04 diff --git a/src/content/memo/462.md b/src/content/memo/462.md index 8b1d8e5..6a7d75d 100644 --- a/src/content/memo/462.md +++ b/src/content/memo/462.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'verbatim-module-syntax'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/464.md b/src/content/memo/464.md index f2b80ba..0f911fa 100644 --- a/src/content/memo/464.md +++ b/src/content/memo/464.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['react-query'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/465.md b/src/content/memo/465.md index 90c2e51..6f5f945 100644 --- a/src/content/memo/465.md +++ b/src/content/memo/465.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['modal', 'ios'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/466.mdx b/src/content/memo/466.mdx index 1c2019e..8ec3484 100644 --- a/src/content/memo/466.mdx +++ b/src/content/memo/466.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['promise'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/467.mdx b/src/content/memo/467.mdx index b18486e..fadf426 100644 --- a/src/content/memo/467.mdx +++ b/src/content/memo/467.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['file-reader'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/468.mdx b/src/content/memo/468.mdx index 8f0a9b8..89d7e6f 100644 --- a/src/content/memo/468.mdx +++ b/src/content/memo/468.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['figma'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/469.md b/src/content/memo/469.md index 774793f..9eb0ded 100644 --- a/src/content/memo/469.md +++ b/src/content/memo/469.md @@ -1,6 +1,7 @@ --- -tags: ['design-system', 'bookmarks'] -status: draft +type: bookmarks +tags: ['design-system'] +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/47.md b/src/content/memo/47.md index 7548cd4..151e6c0 100644 --- a/src/content/memo/47.md +++ b/src/content/memo/47.md @@ -1,4 +1,5 @@ --- +type: note tags: ['state', 'ui'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/470.mdx b/src/content/memo/470.mdx index b8012ee..d059708 100644 --- a/src/content/memo/470.mdx +++ b/src/content/memo/470.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['react', 'rsc'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/471.mdx b/src/content/memo/471.mdx index 117bfb9..8337789 100644 --- a/src/content/memo/471.mdx +++ b/src/content/memo/471.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['css', 'highlight'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/472.mdx b/src/content/memo/472.mdx index 5df8bac..7efd7b7 100644 --- a/src/content/memo/472.mdx +++ b/src/content/memo/472.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['reservation'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/473.mdx b/src/content/memo/473.mdx index 03f0c3d..8749d02 100644 --- a/src/content/memo/473.mdx +++ b/src/content/memo/473.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['playwright'] -status: draft +status: archive ctime: 2025-03-05 mtime: 2025-03-05 --- diff --git a/src/content/memo/474.mdx b/src/content/memo/474.mdx index 573e742..092f961 100644 --- a/src/content/memo/474.mdx +++ b/src/content/memo/474.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['state'] status: draft ctime: 2025-03-05 diff --git a/src/content/memo/475.md b/src/content/memo/475.md index 174e27c..8816f54 100644 --- a/src/content/memo/475.md +++ b/src/content/memo/475.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['viewport'] -status: draft +status: archive ctime: 2025-03-05 mtime: 2025-03-05 --- diff --git a/src/content/memo/476.mdx b/src/content/memo/476.mdx index 5b0798d..53abe2d 100644 --- a/src/content/memo/476.mdx +++ b/src/content/memo/476.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['resize-observer'] -status: draft +status: archive ctime: 2025-03-05 mtime: 2025-03-05 --- diff --git a/src/content/memo/477.mdx b/src/content/memo/477.mdx index dcca3dc..0bfd95f 100644 --- a/src/content/memo/477.mdx +++ b/src/content/memo/477.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['emoji'] status: release ctime: 2025-03-05 diff --git a/src/content/memo/478.mdx b/src/content/memo/478.mdx index 68a13fb..41dcc4e 100644 --- a/src/content/memo/478.mdx +++ b/src/content/memo/478.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['OCaml'] -status: draft +status: archive ctime: 2025-03-05 mtime: 2025-03-05 --- diff --git a/src/content/memo/479.mdx b/src/content/memo/479.mdx index 792cfae..2c82d47 100644 --- a/src/content/memo/479.mdx +++ b/src/content/memo/479.mdx @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['next', 'css'] -status: draft +status: archive ctime: 2025-03-05 mtime: 2025-03-05 --- diff --git a/src/content/memo/48.md b/src/content/memo/48.md index 468f4be..49fef2c 100644 --- a/src/content/memo/48.md +++ b/src/content/memo/48.md @@ -1,4 +1,5 @@ --- +type: note tags: ['react', 'next', 'monorepo', 'hygen', 'husky', 'dependabot'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/480.md b/src/content/memo/480.md index 04e25ea..9024ce0 100644 --- a/src/content/memo/480.md +++ b/src/content/memo/480.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'generic', 'react'] status: release ctime: 2025-03-05 diff --git a/src/content/memo/481.md b/src/content/memo/481.md index 591ca3a..d063754 100644 --- a/src/content/memo/481.md +++ b/src/content/memo/481.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript'] status: draft ctime: 2025-03-05 diff --git a/src/content/memo/482.md b/src/content/memo/482.md index 2891233..77509d3 100644 --- a/src/content/memo/482.md +++ b/src/content/memo/482.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'union'] status: draft ctime: 2025-03-05 diff --git a/src/content/memo/483.md b/src/content/memo/483.md index 503783e..ca5a274 100644 --- a/src/content/memo/483.md +++ b/src/content/memo/483.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'Exclude'] status: draft ctime: 2025-03-05 diff --git a/src/content/memo/484.md b/src/content/memo/484.md index c27358c..e2f27b6 100644 --- a/src/content/memo/484.md +++ b/src/content/memo/484.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['store', 'redux', 'pattern'] status: draft ctime: 2025-03-05 diff --git a/src/content/memo/485.mdx b/src/content/memo/485.mdx index e5c7777..130f0c9 100644 --- a/src/content/memo/485.mdx +++ b/src/content/memo/485.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['parallel', 'serial'] status: release ctime: 2025-03-05 diff --git a/src/content/memo/487.mdx b/src/content/memo/487.mdx index e1bb5ec..c2ece02 100644 --- a/src/content/memo/487.mdx +++ b/src/content/memo/487.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['typescript', 'react'] status: draft ctime: 2025-03-05 diff --git a/src/content/memo/488.mdx b/src/content/memo/488.mdx index a095595..4deb1b0 100644 --- a/src/content/memo/488.mdx +++ b/src/content/memo/488.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['esm'] status: release ctime: 2025-03-08 diff --git a/src/content/memo/49.md b/src/content/memo/49.md index 399a0b1..8bd1a0a 100644 --- a/src/content/memo/49.md +++ b/src/content/memo/49.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['next', 'static'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/490.mdx b/src/content/memo/490.mdx index 33c27d0..f31db43 100644 --- a/src/content/memo/490.mdx +++ b/src/content/memo/490.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['visibility-state'] status: release ctime: 2025-03-25 diff --git a/src/content/memo/491.mdx b/src/content/memo/491.mdx index 9acbfd0..61bb47e 100644 --- a/src/content/memo/491.mdx +++ b/src/content/memo/491.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: [llms.txt] status: release ctime: 2025-04-01 diff --git a/src/content/memo/492.md b/src/content/memo/492.md index f61f630..54e4d37 100644 --- a/src/content/memo/492.md +++ b/src/content/memo/492.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['sqlite', 'serverless', 'turso'] status: release ctime: 2025-04-06 diff --git a/src/content/memo/493.md b/src/content/memo/493.md index 24e0de0..7493f5a 100644 --- a/src/content/memo/493.md +++ b/src/content/memo/493.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['astro', 'vercel'] status: draft ctime: 2025-06-24 diff --git a/src/content/memo/494.md b/src/content/memo/494.md index fa0b90b..d9732cf 100644 --- a/src/content/memo/494.md +++ b/src/content/memo/494.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['config'] -status: draft +status: archive ctime: 2025-06-30 mtime: 2025-06-30 --- diff --git a/src/content/memo/495.md b/src/content/memo/495.md index e5e92c7..7dbd68a 100644 --- a/src/content/memo/495.md +++ b/src/content/memo/495.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react', 'concurrent'] status: release ctime: 2025-12-21 diff --git a/src/content/memo/496.md b/src/content/memo/496.md index 73f981b..ce0b0ca 100644 --- a/src/content/memo/496.md +++ b/src/content/memo/496.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [react, children, pattern, compound-component] status: release ctime: 2025-12-21 diff --git a/src/content/memo/497.md b/src/content/memo/497.md index 8643f67..a1ba231 100644 --- a/src/content/memo/497.md +++ b/src/content/memo/497.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [styled-components, css-in-js] status: release ctime: 2025-12-26 diff --git a/src/content/memo/498.md b/src/content/memo/498.md index 8bb67d5..dd57291 100644 --- a/src/content/memo/498.md +++ b/src/content/memo/498.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [cooking, physics] status: release ctime: 2025-12-26 diff --git a/src/content/memo/499.md b/src/content/memo/499.md index e4e37a2..03b23e8 100644 --- a/src/content/memo/499.md +++ b/src/content/memo/499.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [typescript, utility-types] status: release ctime: 2025-12-26 diff --git a/src/content/memo/5.md b/src/content/memo/5.md index b76d155..58fe71e 100644 --- a/src/content/memo/5.md +++ b/src/content/memo/5.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['javascript', 'class'] status: release embed: https://stackblitz.com/edit/js-wq8lqn?file=index.js diff --git a/src/content/memo/50.md b/src/content/memo/50.md index c2e9f90..0d6528e 100644 --- a/src/content/memo/50.md +++ b/src/content/memo/50.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['create-react-app', 'react', 'craco', 'react-app-rewired'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/500.md b/src/content/memo/500.md index e6bf670..ae2f3b8 100644 --- a/src/content/memo/500.md +++ b/src/content/memo/500.md @@ -1,4 +1,5 @@ --- +type: note tags: [sqlite, bun, neovim, vscode, cli] status: release ctime: 2025-12-26 diff --git a/src/content/memo/501.md b/src/content/memo/501.md index c02759e..b9f94b0 100644 --- a/src/content/memo/501.md +++ b/src/content/memo/501.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [typescript, tsconfig] status: release ctime: 2025-12-26 diff --git a/src/content/memo/503.md b/src/content/memo/503.md index 3a5c727..3a9f8d0 100644 --- a/src/content/memo/503.md +++ b/src/content/memo/503.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [yalc, npm, local-development] status: release ctime: 2025-12-26 diff --git a/src/content/memo/505.md b/src/content/memo/505.md index 03bf5e4..99801ec 100644 --- a/src/content/memo/505.md +++ b/src/content/memo/505.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [jest, testing, setup] status: release ctime: 2025-12-26 diff --git a/src/content/memo/506.md b/src/content/memo/506.md index 8ef871f..e624c86 100644 --- a/src/content/memo/506.md +++ b/src/content/memo/506.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [react, iframe, portal] status: release ctime: 2025-12-26 diff --git a/src/content/memo/507.md b/src/content/memo/507.md index 7eb8e99..deb6563 100644 --- a/src/content/memo/507.md +++ b/src/content/memo/507.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [tumblr, web-components, npf] status: release ctime: 2025-12-28 diff --git a/src/content/memo/508.md b/src/content/memo/508.md index 5fb5ba4..a691069 100644 --- a/src/content/memo/508.md +++ b/src/content/memo/508.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [react, performance, indexing] status: release ctime: 2025-12-28 diff --git a/src/content/memo/509.md b/src/content/memo/509.md index fff5624..f696f24 100644 --- a/src/content/memo/509.md +++ b/src/content/memo/509.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [react, rsc, timezone, date] status: release ctime: 2025-12-28 diff --git a/src/content/memo/51.md b/src/content/memo/51.md index 1fd2117..1cee8d7 100644 --- a/src/content/memo/51.md +++ b/src/content/memo/51.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['tailwindcss', 'create-react-app'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/510.md b/src/content/memo/510.md index 5a5689a..14ad556 100644 --- a/src/content/memo/510.md +++ b/src/content/memo/510.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [algorithm, calendar, ui] status: release ctime: 2025-12-28 diff --git a/src/content/memo/511.md b/src/content/memo/511.md index e6b312b..1dd8bea 100644 --- a/src/content/memo/511.md +++ b/src/content/memo/511.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [drizzle, orm, sql] status: release ctime: 2025-12-28 diff --git a/src/content/memo/512.md b/src/content/memo/512.md index 913af7f..370051d 100644 --- a/src/content/memo/512.md +++ b/src/content/memo/512.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [javascript, floating-point] status: release ctime: 2025-12-28 diff --git a/src/content/memo/513.md b/src/content/memo/513.md index bf43f83..237e48b 100644 --- a/src/content/memo/513.md +++ b/src/content/memo/513.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [dayjs, date, calendar] status: release ctime: 2025-12-28 diff --git a/src/content/memo/514.md b/src/content/memo/514.md index 8f7a3ef..534ea9c 100644 --- a/src/content/memo/514.md +++ b/src/content/memo/514.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [vitest, mock, resize-observer] status: release ctime: 2025-12-28 diff --git a/src/content/memo/515.md b/src/content/memo/515.md index bdb48f0..52eb762 100644 --- a/src/content/memo/515.md +++ b/src/content/memo/515.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [vitest, mock, testing] status: release ctime: 2025-12-28 diff --git a/src/content/memo/516.md b/src/content/memo/516.md index 86e1eac..3bde737 100644 --- a/src/content/memo/516.md +++ b/src/content/memo/516.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [typescript, generics] status: release ctime: 2025-12-28 diff --git a/src/content/memo/518.md b/src/content/memo/518.md index 14e901d..a5b6eb1 100644 --- a/src/content/memo/518.md +++ b/src/content/memo/518.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [debounce, throttle, search, ux] status: release ctime: 2025-12-28 diff --git a/src/content/memo/519.md b/src/content/memo/519.md index a60a398..e8f66e5 100644 --- a/src/content/memo/519.md +++ b/src/content/memo/519.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [javascript, date] status: release ctime: 2025-12-28 diff --git a/src/content/memo/52.md b/src/content/memo/52.md index 35aefce..3080686 100644 --- a/src/content/memo/52.md +++ b/src/content/memo/52.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['fetch', 'onprogress'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/520.md b/src/content/memo/520.md index bd91af0..1426131 100644 --- a/src/content/memo/520.md +++ b/src/content/memo/520.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [nodejs, path, windows] status: release ctime: 2025-12-28 diff --git a/src/content/memo/521.md b/src/content/memo/521.md index 59f0387..8ab2cb9 100644 --- a/src/content/memo/521.md +++ b/src/content/memo/521.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [react, testing, rtl, overflow] status: release ctime: 2025-12-28 diff --git a/src/content/memo/522.md b/src/content/memo/522.md index 74d519f..5d697fd 100644 --- a/src/content/memo/522.md +++ b/src/content/memo/522.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [npm, dependencies, peer-dependencies] status: release ctime: 2025-12-29 diff --git a/src/content/memo/523.md b/src/content/memo/523.md index ea8790c..e2efd29 100644 --- a/src/content/memo/523.md +++ b/src/content/memo/523.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [react-spring, animation] status: release ctime: 2025-12-29 diff --git a/src/content/memo/524.md b/src/content/memo/524.md index ac418c5..8dd3b82 100644 --- a/src/content/memo/524.md +++ b/src/content/memo/524.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [typescript, documentation, discriminated-union] status: release ctime: 2025-12-29 diff --git a/src/content/memo/525.md b/src/content/memo/525.md index 5736b14..1c46d0c 100644 --- a/src/content/memo/525.md +++ b/src/content/memo/525.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [gulp, debugging, frontend, build-tool] status: release ctime: 2025-12-29 diff --git a/src/content/memo/526.md b/src/content/memo/526.md index 9480b56..d834f59 100644 --- a/src/content/memo/526.md +++ b/src/content/memo/526.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [less, css, variables] status: release ctime: 2025-12-29 diff --git a/src/content/memo/528.md b/src/content/memo/528.md index 9427030..177f0fe 100644 --- a/src/content/memo/528.md +++ b/src/content/memo/528.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [react, react-is, children] status: release ctime: 2025-12-29 diff --git a/src/content/memo/529.md b/src/content/memo/529.md index a1d082e..72b13aa 100644 --- a/src/content/memo/529.md +++ b/src/content/memo/529.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'state-management', 'pattern'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/53.md b/src/content/memo/53.md index 9215002..2c8546a 100644 --- a/src/content/memo/53.md +++ b/src/content/memo/53.md @@ -1,4 +1,5 @@ --- +type: note tags: ['fetch', 'preflight', 'simple-requests'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/530.md b/src/content/memo/530.md index 73273f5..d917b66 100644 --- a/src/content/memo/530.md +++ b/src/content/memo/530.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['nodejs', 'turf', 'geojson'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/531.md b/src/content/memo/531.md index 8ccc20b..c3d9dcf 100644 --- a/src/content/memo/531.md +++ b/src/content/memo/531.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'date'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/532.md b/src/content/memo/532.md index 2b0b68e..18240ec 100644 --- a/src/content/memo/532.md +++ b/src/content/memo/532.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'scroll', 'sync'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/533.md b/src/content/memo/533.md index 1b2fbf6..31d628d 100644 --- a/src/content/memo/533.md +++ b/src/content/memo/533.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'monad', 'pattern'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/534.md b/src/content/memo/534.md index 940b3b3..50f37e9 100644 --- a/src/content/memo/534.md +++ b/src/content/memo/534.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['monad', 'functional-programming'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/535.md b/src/content/memo/535.md index e1aebe4..3e03641 100644 --- a/src/content/memo/535.md +++ b/src/content/memo/535.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'monad', 'maybe'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/536.md b/src/content/memo/536.md index b58007c..2ac38b4 100644 --- a/src/content/memo/536.md +++ b/src/content/memo/536.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'monad', 'promise'] status: release ctime: 2025-01-01 diff --git a/src/content/memo/537.md b/src/content/memo/537.md index 7981ebd..e10a267 100644 --- a/src/content/memo/537.md +++ b/src/content/memo/537.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['bash', 'mv'] status: release ctime: 2026-01-07 diff --git a/src/content/memo/538.md b/src/content/memo/538.md index fc1abc4..ff46016 100644 --- a/src/content/memo/538.md +++ b/src/content/memo/538.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react', 'as', 'as-child', 'render-prop', 'polymorphic'] status: release ctime: 2026-01-26 diff --git a/src/content/memo/539.md b/src/content/memo/539.md index 63a7af8..9ae05fb 100644 --- a/src/content/memo/539.md +++ b/src/content/memo/539.md @@ -1,4 +1,5 @@ --- +type: note tags: ['url', 'encoding', 'ios', 'debug', 'security'] status: release ctime: 2026-05-25 diff --git a/src/content/memo/54.md b/src/content/memo/54.md index 2d52528..0b36038 100644 --- a/src/content/memo/54.md +++ b/src/content/memo/54.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['token'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/540.md b/src/content/memo/540.md index 0a44a73..b9d00f2 100644 --- a/src/content/memo/540.md +++ b/src/content/memo/540.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react', 'hooks', 'async-generator', 'pattern', 'typescript', 'xstate'] status: release ctime: 2026-05-25 diff --git a/src/content/memo/541.md b/src/content/memo/541.md index 1dc10bf..42cea66 100644 --- a/src/content/memo/541.md +++ b/src/content/memo/541.md @@ -1,4 +1,5 @@ --- +type: note tags: ['inspect-webkit', 'ios', 'debug', 'safari', 'webview', 'mobile', 'tooling'] status: draft diff --git a/src/content/memo/544.md b/src/content/memo/544.md index b15330f..90735bf 100644 --- a/src/content/memo/544.md +++ b/src/content/memo/544.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['sdd', 'spec-driven-development', 'pbt', 'fast-check', 'bombadil', 'antithesis', 'model-based-testing', 'test'] status: release ctime: 2026-05-31 diff --git a/src/content/memo/545.md b/src/content/memo/545.md index b54df3f..a6d1d8d 100644 --- a/src/content/memo/545.md +++ b/src/content/memo/545.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [ 'css-attribute-selector', diff --git a/src/content/memo/546.md b/src/content/memo/546.md index bfc8a79..dc06a7b 100644 --- a/src/content/memo/546.md +++ b/src/content/memo/546.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [ 'weakmap', diff --git a/src/content/memo/547.md b/src/content/memo/547.md index fe17b69..03b67dc 100644 --- a/src/content/memo/547.md +++ b/src/content/memo/547.md @@ -1,4 +1,5 @@ --- +type: note tags: [ 'preact', diff --git a/src/content/memo/548.md b/src/content/memo/548.md index ca13884..8049ada 100644 --- a/src/content/memo/548.md +++ b/src/content/memo/548.md @@ -1,4 +1,5 @@ --- +type: note tags: [ 'agile', diff --git a/src/content/memo/549.md b/src/content/memo/549.md index beb8f7f..1189c25 100644 --- a/src/content/memo/549.md +++ b/src/content/memo/549.md @@ -1,4 +1,5 @@ --- +type: snippet tags: [ 'react', diff --git a/src/content/memo/55.md b/src/content/memo/55.md index c562308..626ada9 100644 --- a/src/content/memo/55.md +++ b/src/content/memo/55.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['fetch', 'formdata'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/550.md b/src/content/memo/550.md index bfdaf28..beccd4a 100644 --- a/src/content/memo/550.md +++ b/src/content/memo/550.md @@ -1,4 +1,5 @@ --- +type: note tags: ['canvas', 'compression', 'png', 'deflate', 'browser', 'hack', 'javascript'] status: release diff --git a/src/content/memo/551.mdx b/src/content/memo/551.mdx index 849109b..ea29541 100644 --- a/src/content/memo/551.mdx +++ b/src/content/memo/551.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['dnd-kit', 'tanstack-query', 'optimistic-update', 'race-condition', 'react', 'debug'] status: release ctime: 2026-06-07 diff --git a/src/content/memo/552.mdx b/src/content/memo/552.mdx index 5b99427..4f2c2ae 100644 --- a/src/content/memo/552.mdx +++ b/src/content/memo/552.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['tunneling', 'websocket', 'vercel-sandbox', 'networking'] status: release ctime: 2026-06-07 diff --git a/src/content/memo/553.mdx b/src/content/memo/553.mdx index 38b19b5..2908f1b 100644 --- a/src/content/memo/553.mdx +++ b/src/content/memo/553.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['browser-extension', 'native-messaging', 'chrome'] status: release ctime: 2026-06-08 diff --git a/src/content/memo/555.mdx b/src/content/memo/555.mdx index 24a27e3..f32bf28 100644 --- a/src/content/memo/555.mdx +++ b/src/content/memo/555.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['navigation-api', 'router', 'lean'] status: release ctime: 2026-06-15 diff --git a/src/content/memo/558.mdx b/src/content/memo/558.mdx index b1691a0..5bc3bbf 100644 --- a/src/content/memo/558.mdx +++ b/src/content/memo/558.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['knip', 'reachability', 'dead-code', 'graph'] status: release ctime: 2026-06-16 diff --git a/src/content/memo/559.mdx b/src/content/memo/559.mdx index 0b89a4d..eaff65c 100644 --- a/src/content/memo/559.mdx +++ b/src/content/memo/559.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['javascript', 'event-loop', 'microtask'] status: release ctime: 2026-06-18 diff --git a/src/content/memo/56.md b/src/content/memo/56.md index 345cda8..e99c6e4 100644 --- a/src/content/memo/56.md +++ b/src/content/memo/56.md @@ -1,11 +1,12 @@ --- +type: snippet tags: ['promise', 'javascript'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- -Promise를 거부할 때 객체 를 사용하도록 강제 합니다.[^56-1] +reject는 `Error` 객체로 한다 — 문자열로 거부하면 스택 트레이스가 남지 않는다.[^56-1] ```js // ❌ @@ -15,8 +16,6 @@ Promise.reject('An error occurred'); Promise.reject(new Error('An error occurred')); ``` -항상 [Error객체](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)로 [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)를 거부하는 것이 가장 좋습니다. 이렇게 하면 오류 개체가 스택 추적을 저장하기 때문에 오류가 발생한 위치를 더 쉽게 추적할 수 있습니다. - --- [^56-1]: [14 Linting Rules To Help You Write Asynchronous Code in JavaScript - Maxim Orlov](https://maximorlov.com/linting-rules-for-asynchronous-code-in-javascript/) \ No newline at end of file diff --git a/src/content/memo/560.mdx b/src/content/memo/560.mdx index 67cae94..e81c7aa 100644 --- a/src/content/memo/560.mdx +++ b/src/content/memo/560.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['react', 'fiber', 'algorithm', 'dfs'] status: release ctime: 2026-06-21 diff --git a/src/content/memo/561.mdx b/src/content/memo/561.mdx index f977cd1..4da8841 100644 --- a/src/content/memo/561.mdx +++ b/src/content/memo/561.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['local-first', 'indexeddb', 'sync'] status: release ctime: 2026-06-21 diff --git a/src/content/memo/562.mdx b/src/content/memo/562.mdx index 249ed58..4450d3f 100644 --- a/src/content/memo/562.mdx +++ b/src/content/memo/562.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['signals', 'reactivity', 'build-tooling', 'architecture'] status: release ctime: 2026-06-21 diff --git a/src/content/memo/563.mdx b/src/content/memo/563.mdx index f68b296..2d4fa54 100644 --- a/src/content/memo/563.mdx +++ b/src/content/memo/563.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react', 'usesyncexternalstore', 'singleton', 'architecture'] status: release ctime: 2026-06-21 diff --git a/src/content/memo/564.mdx b/src/content/memo/564.mdx index 8c80ae1..bf3f225 100644 --- a/src/content/memo/564.mdx +++ b/src/content/memo/564.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'iterator', 'lazy-evaluation', 'generator'] status: release ctime: 2026-06-22 diff --git a/src/content/memo/565.mdx b/src/content/memo/565.mdx index 659e010..898df63 100644 --- a/src/content/memo/565.mdx +++ b/src/content/memo/565.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['chrome-devtools', 'cdp', 'websocket', 'proxy'] status: release ctime: 2026-06-23 diff --git a/src/content/memo/566.mdx b/src/content/memo/566.mdx index 2672fec..2cc06be 100644 --- a/src/content/memo/566.mdx +++ b/src/content/memo/566.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'type-system', 'generics'] status: release ctime: 2026-06-23 diff --git a/src/content/memo/567.mdx b/src/content/memo/567.mdx index 6f2d1fa..348ce49 100644 --- a/src/content/memo/567.mdx +++ b/src/content/memo/567.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['performance', 'rendering', 'fouc', 'html'] status: release ctime: 2026-06-23 diff --git a/src/content/memo/568.mdx b/src/content/memo/568.mdx index b2018f2..5dcbc60 100644 --- a/src/content/memo/568.mdx +++ b/src/content/memo/568.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['probability', 'coupon-collector', 'math'] status: release ctime: 2026-06-23 diff --git a/src/content/memo/569.mdx b/src/content/memo/569.mdx index d7a374d..50fc24b 100644 --- a/src/content/memo/569.mdx +++ b/src/content/memo/569.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['javascript', 'event-loop', 'navigation'] status: release ctime: 2026-06-23 diff --git a/src/content/memo/57.mdx b/src/content/memo/57.mdx index 170b71a..7d50fee 100644 --- a/src/content/memo/57.mdx +++ b/src/content/memo/57.mdx @@ -1,8 +1,9 @@ --- -tags: ['node', 'bookmarks'] +type: bookmarks +tags: ['node'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- import QuoteLink from '@components/QuoteLink.astro' @@ -24,7 +25,7 @@ import QuoteLink from '@components/QuoteLink.astro' patch-package -- [GitHub - ds300/patch-package: Fix broken node modules instantly 🏃🏽‍♀️💨](https://github.com/ds300/patch-package)[^57-2] +- [GitHub - ds300/patch-package: Fix broken node modules instantly 🏃🏽‍♀️💨](https://github.com/ds300/patch-package) --- diff --git a/src/content/memo/570.mdx b/src/content/memo/570.mdx index d826ef2..fcfda5d 100644 --- a/src/content/memo/570.mdx +++ b/src/content/memo/570.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['react', 'usememo', 'usedeferredvalue', 'formal-verification', 'lean'] status: release ctime: 2026-06-23 diff --git a/src/content/memo/572.mdx b/src/content/memo/572.mdx index b000cfe..1eeac76 100644 --- a/src/content/memo/572.mdx +++ b/src/content/memo/572.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['lean', 'formal-verification', 'http', 'abort', 'cancellation'] status: release ctime: 2026-06-23 diff --git a/src/content/memo/573.mdx b/src/content/memo/573.mdx index 4bc2988..69ca126 100644 --- a/src/content/memo/573.mdx +++ b/src/content/memo/573.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['react', 'css', 'loading-ux', 'formal-verification', 'lean'] status: release ctime: 2026-06-23 diff --git a/src/content/memo/574.mdx b/src/content/memo/574.mdx index 3cf4c3c..13e36e6 100644 --- a/src/content/memo/574.mdx +++ b/src/content/memo/574.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: [ 'react', diff --git a/src/content/memo/575.mdx b/src/content/memo/575.mdx index c874c90..1786531 100644 --- a/src/content/memo/575.mdx +++ b/src/content/memo/575.mdx @@ -1,4 +1,5 @@ --- +type: note tags: ['react', 'suspense', 'declarative', 'formal-verification', 'lean'] status: release ctime: 2026-06-23 diff --git a/src/content/memo/576.mdx b/src/content/memo/576.mdx index f372e3a..b2aad4d 100644 --- a/src/content/memo/576.mdx +++ b/src/content/memo/576.mdx @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'dayjs', 'date-format', 'type-safety'] status: release ctime: 2026-06-28 diff --git a/src/content/memo/577.md b/src/content/memo/577.md new file mode 100644 index 0000000..cd9e3c5 --- /dev/null +++ b/src/content/memo/577.md @@ -0,0 +1,44 @@ +--- +type: note +tags: ['memo-spec', 'compression', 'provenance'] +status: release +ctime: 2026-07-27 +mtime: 2026-07-27 +title: 메모 압축 — 존댓말이 신호였다 +description: 메모가 늘면서 압축이 고민이었는데, OKF를 대보다가 압축할 대상을 찾는 방법이 나왔다. +--- + +메모가 늘면서 어떻게 줄일지가 고민이었다. OKF를 대조해보다가 의도치 않게 그 방향이 열렸다 — **압축할 대상을 문체로 찾을 수 있다.** + +번역문·AI 요약·문서 발췌는 존댓말("~합니다")로 들어온다. 내 메모는 평서체("~다")로 쓴다. 그래서 **인용 표시 없이 존댓말이 지배하는 산문 = 아직 내 언어로 줄이지 않은 남의 문장**이다. 542개 중 29개, 그중 23개가 공개 중이었다. + +가장 선명한 건 268. *"이것이 바로 제가 Tachyon을 만든 이유이며"* — 메모 안의 1인칭이 내가 아니었다. 벤더 홍보문을 번역해 넣은 것. + +압축해보니: + +| | 전 | 후 | +|---|---|---| +| 272 (Graphite 문서 요약) | 17줄 | 2줄 | +| 268 (벤더 홍보문) | 5단락 | 2줄 | +| 274 (AI가 지어낸 우화) | 4단락 | 1줄 | + +줄이니 **형태가 드러났다.** 268은 `note`였는데 군더더기를 걷어내자 남은 게 링크 4개라서 `bookmarks`가 됐다. 부풀린 산문이 형태를 가리고 있었던 것. + +## OKF는 규칙집이 아니다 + +필수 필드가 `type` 하나뿐이고 그마저 개방 어휘다 — "Type values are **not** registered centrally." 규칙을 주지 않으니 참조할 대상이 못 된다. 실제로 가져온 건 필드 이름 하나와 "없는 것도 의미를 갖는다"는 패턴 하나. + +규칙은 내 데이터가 정했다. 예전에 손으로 `bookmarks` 태그를 붙여둔 33개가 정답지 역할을 했고, 처음 만든 분류 규칙은 그중 10개를 놓쳤다 — 링크 1개짜리 메모. **내 기준에선 링크 하나만 저장해둔 것도 링크 모음**이었다는 걸 규칙을 고치면서 알았다. + +`type`을 데이터로 넣자 분포가 보였다. `bookmarks` 274개 중 231개(84%)가 `draft`. 그런데 링크 모음에 "작성 중"은 없다 — 붙여넣은 순간이 최종형이다. `draft`가 "작성 중"과 "공개 안 함" 두 뜻으로 쓰이고 있었고, 작성 중 큐 268개가 완성될 일 없는 링크로 막혀 있었다. `archive`로 분리해서 큐가 37개가 됐다. + +안 가져온 것: `stale_after`(버전을 고정한 메모가 10개뿐 — 만료를 선언할 표면이 없다), `verified`(단일 저자), `resource`(URL이 2개 이상인 메모가 359개라 대상을 하나로 특정 못 한다). + +## 씨앗 + +같은 URL을 가리키는 메모쌍이 29개, 그중 14쌍은 공유 태그가 0개다. 태그 IDF 유사도로는 영원히 못 만난다. `parent`가 542개 중 0개인 이유가 스키마 부족이 아니라 **후보를 본 적이 없어서**일 수 있다. + +--- + +- [OKF v0.2 SPEC](https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md) +- [How the Open Knowledge Format can improve data sharing](https://cloud.google.com/blog/products/data-analytics/how-the-open-knowledge-format-can-improve-data-sharing) diff --git a/src/content/memo/58.md b/src/content/memo/58.md index 4aef04f..ef53221 100644 --- a/src/content/memo/58.md +++ b/src/content/memo/58.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['esm', 'node'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/59.md b/src/content/memo/59.md index 3efb425..604cee6 100644 --- a/src/content/memo/59.md +++ b/src/content/memo/59.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['node', 'buffer', 'fs', 'fetch'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/6.md b/src/content/memo/6.md index 3d846e2..089505a 100644 --- a/src/content/memo/6.md +++ b/src/content/memo/6.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['ast', 'parser', 'unified', 'css', 'javascript'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/60.md b/src/content/memo/60.md index 739b97f..f5f412e 100644 --- a/src/content/memo/60.md +++ b/src/content/memo/60.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['node', 'sharp', 'image'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/61.md b/src/content/memo/61.md index 1713d02..e171720 100644 --- a/src/content/memo/61.md +++ b/src/content/memo/61.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['node', 'id3'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/62.md b/src/content/memo/62.md index fd98167..2c96751 100644 --- a/src/content/memo/62.md +++ b/src/content/memo/62.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['node', 'yarn', 'package'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/63.md b/src/content/memo/63.md index d72aca1..16cabe4 100644 --- a/src/content/memo/63.md +++ b/src/content/memo/63.md @@ -1,4 +1,5 @@ --- +type: note tags: ['node', 'image', 'imagemin'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/64.md b/src/content/memo/64.md index 85c2477..c213509 100644 --- a/src/content/memo/64.md +++ b/src/content/memo/64.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['node', 'xlsx', 'excel'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/65.md b/src/content/memo/65.md index 160370c..7c03f8a 100644 --- a/src/content/memo/65.md +++ b/src/content/memo/65.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['node', 'npm', 'package'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/66.md b/src/content/memo/66.md index 89dc882..98cec7c 100644 --- a/src/content/memo/66.md +++ b/src/content/memo/66.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['node', 'monorepo', 'yarn'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/67.md b/src/content/memo/67.md index c66a934..65d4868 100644 --- a/src/content/memo/67.md +++ b/src/content/memo/67.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['debug'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/68.md b/src/content/memo/68.md index 934de25..e6f8aba 100644 --- a/src/content/memo/68.md +++ b/src/content/memo/68.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['local', 'debug', 'tunneling', 'localtunnel', 'ngrok', 'cloudflared'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/69.md b/src/content/memo/69.md index be3bf42..e4611c0 100644 --- a/src/content/memo/69.md +++ b/src/content/memo/69.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['local', 'charles', 'debug'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/7.md b/src/content/memo/7.md index 0268f23..62db93a 100644 --- a/src/content/memo/7.md +++ b/src/content/memo/7.md @@ -1,4 +1,5 @@ --- +type: note tags: ['plugin', 'javascript'] status: release embed: https://stackblitz.com/edit/js-xjtc7p?file=index.js diff --git a/src/content/memo/70.md b/src/content/memo/70.md index f35b1e9..5ffb9fe 100644 --- a/src/content/memo/70.md +++ b/src/content/memo/70.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['fetch', 'service-worker', 'mock', 'msw'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/71.md b/src/content/memo/71.md index d256139..939d95b 100644 --- a/src/content/memo/71.md +++ b/src/content/memo/71.md @@ -1,4 +1,5 @@ --- +type: note tags: ['redux', 'debug'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/72.md b/src/content/memo/72.md index 3995dfb..c49af63 100644 --- a/src/content/memo/72.md +++ b/src/content/memo/72.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['local'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/73.md b/src/content/memo/73.md index 2ccc09b..089d24f 100644 --- a/src/content/memo/73.md +++ b/src/content/memo/73.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['command', 'shell'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/74.md b/src/content/memo/74.md index 48bae29..74946bf 100644 --- a/src/content/memo/74.md +++ b/src/content/memo/74.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['ffmpeg', 'video'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/75.md b/src/content/memo/75.md index 294f859..99d5310 100644 --- a/src/content/memo/75.md +++ b/src/content/memo/75.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['zsh', 'dotfiles', 'shell'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/76.md b/src/content/memo/76.md index 41aca02..01de83b 100644 --- a/src/content/memo/76.md +++ b/src/content/memo/76.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['api'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/77.md b/src/content/memo/77.md index 15a4d2b..aef725d 100644 --- a/src/content/memo/77.md +++ b/src/content/memo/77.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['api'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/78.md b/src/content/memo/78.md index 2d5e8b1..c2fc8b0 100644 --- a/src/content/memo/78.md +++ b/src/content/memo/78.md @@ -1,4 +1,5 @@ --- +type: note tags: ['cse', 'api'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/79.md b/src/content/memo/79.md index b46c6c7..d762a5b 100644 --- a/src/content/memo/79.md +++ b/src/content/memo/79.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['api', 'notion', 'docs'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/8.md b/src/content/memo/8.md index f0a5952..da2e503 100644 --- a/src/content/memo/8.md +++ b/src/content/memo/8.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['javascript', 'array'] status: release embed: https://stackblitz.com/edit/node-zbv5x8?file=package.json&view=editor diff --git a/src/content/memo/80.md b/src/content/memo/80.md index 07b9e1e..776397d 100644 --- a/src/content/memo/80.md +++ b/src/content/memo/80.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['api'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/81.md b/src/content/memo/81.md index 5cb888c..0a2a6ef 100644 --- a/src/content/memo/81.md +++ b/src/content/memo/81.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['rest', 'api'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/82.md b/src/content/memo/82.md index cb600e3..d8515be 100644 --- a/src/content/memo/82.md +++ b/src/content/memo/82.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['geolocation', 'docs'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/83.md b/src/content/memo/83.md index bce5659..9369b5c 100644 --- a/src/content/memo/83.md +++ b/src/content/memo/83.md @@ -1,17 +1,18 @@ --- +type: bookmarks tags: ['api', 'github'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - [Objects - GitHub Docs](https://docs.github.com/en/graphql/reference/objects)[^83-1] - [repository](https://docs.github.com/en/graphql/reference/objects#repository) - [issue](https://docs.github.com/en/graphql/reference/objects#issue) -- [GitHub Next | Flat Data](https://githubnext.com/projects/flat-data#part-iii-visualizing-our-data-for-easy-sharing-optional)[^83-2] +- [GitHub Next | Flat Data](https://githubnext.com/projects/flat-data#part-iii-visualizing-our-data-for-easy-sharing-optional) - [GitHub - githubocto/flat-demo-google-sheets: A Flat Data GitHub Action demo repo](https://github.com/githubocto/flat-demo-google-sheets) - [GitHub - mathiasbynens/covid-19-vaccinations-germany: Historical data on COVID-19 vaccination doses administered in Germany, per state.](https://github.com/mathiasbynens/covid-19-vaccinations-germany) -- [GitHub Code Search (Preview)](https://cs.github.com/)[^83-3][^83-4] +- [GitHub Code Search (Preview)](https://cs.github.com/)[^83-3] - [Writing workflows - GitHub Docs](https://docs.github.com/en/actions/learn-github-actions) - [Skipping workflow runs - GitHub Docs](https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/skipping-workflow-runs) - [Create and Publish a GitHub Action in Typescript - ULTIMATE 2023 GUIDE | Leonardo Montini](https://leonardomontini.dev/typescript-github-action) @@ -20,6 +21,4 @@ mtime: 2024-03-22 --- [^83-1]: GitHub GraphQL API를 통해 쿼리할 수 있는 다양한 개체에 대한 개요. -[^83-2]: GitHub에서 플랫 데이터를 사용하는 방법에 대한 튜토리얼. 플랫 데이터는 개발자가 API 또는 CSV 파일과 같은 다양한 소스의 데이터를 GitHub 리포지토리로 쉽게 가져올 수 있는 기능입니다. 이 자습서에서는 GitHub Actions와 함께 플랫 데이터를 사용하여 다양한 소스에서 데이터 가져오기를 자동화하는 방법과 가져온 데이터를 사용하여 시각화 및 대화형 웹 애플리케이션을 만드는 방법을 다룹니다. 또한 플랫 데이터를 사용하는 방법을 보여주는 예제 프로젝트에 대한 링크를 제공합니다. 여기에는 Google 스프레드시트를 사용한 플랫 데이터 데모 저장소와 독일의 코로나19 백신 접종 기록 데이터가 포함된 저장소가 포함됩니다. -[^83-3]: 사용자가 GitHub의 공개 리포지토리 내에서 코드 조각을 검색할 수 있는 GitHub 코드 검색에 대한 링크입니다. 다른 개발자의 코드를 빠르게 찾고 탐색할 수 있는 방법을 제공하며 새로운 라이브러리, 프레임워크 및 모범 사례를 찾는 데 사용할 수 있습니다. 검색 결과는 리포지토리, 언어, 파일 유형 및 기타 기준으로 필터링할 수 있으며 관련성, 별 또는 분기별로 정렬할 수 있습니다. -[^83-4]: https://grep.app/ +[^83-3]: https://grep.app/ diff --git a/src/content/memo/84.md b/src/content/memo/84.md index 7c8cde6..6eaad98 100644 --- a/src/content/memo/84.md +++ b/src/content/memo/84.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['api'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/85.md b/src/content/memo/85.md index bbf143b..e0e1f31 100644 --- a/src/content/memo/85.md +++ b/src/content/memo/85.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['google-apps-script', 'geolocation', 'new-geocoder'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/86.md b/src/content/memo/86.md index c621088..6be101d 100644 --- a/src/content/memo/86.md +++ b/src/content/memo/86.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['scroll'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/87.md b/src/content/memo/87.md index 6ef9b56..6d220fb 100644 --- a/src/content/memo/87.md +++ b/src/content/memo/87.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['scroll', 'css'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/88.md b/src/content/memo/88.md index 986ba12..a90d899 100644 --- a/src/content/memo/88.md +++ b/src/content/memo/88.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['scroll'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/89.md b/src/content/memo/89.md index 80d03c8..6adc3da 100644 --- a/src/content/memo/89.md +++ b/src/content/memo/89.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['scroll', 'scrollspy'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/9.md b/src/content/memo/9.md index 4196f98..8ba9c11 100644 --- a/src/content/memo/9.md +++ b/src/content/memo/9.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['javascript', 'record', 'tuple'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/90.md b/src/content/memo/90.md index ed74c65..7ac3261 100644 --- a/src/content/memo/90.md +++ b/src/content/memo/90.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['puppeteer'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/91.md b/src/content/memo/91.md index 47b2e70..735dd5e 100644 --- a/src/content/memo/91.md +++ b/src/content/memo/91.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['puppeteer', 'cookies'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/92.md b/src/content/memo/92.md index b1bedb0..a18b361 100644 --- a/src/content/memo/92.md +++ b/src/content/memo/92.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['puppeteer', 'headers'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/93.md b/src/content/memo/93.md index 96e200e..103f405 100644 --- a/src/content/memo/93.md +++ b/src/content/memo/93.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['puppeteer', 'image'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/94.md b/src/content/memo/94.md index a877862..fbbd72d 100644 --- a/src/content/memo/94.md +++ b/src/content/memo/94.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['tools'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/95.md b/src/content/memo/95.md index 1dc42de..1023371 100644 --- a/src/content/memo/95.md +++ b/src/content/memo/95.md @@ -1,4 +1,5 @@ --- +type: note tags: ['tools', 'filezilla', 'ftp'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/96.md b/src/content/memo/96.md index 0a8bd74..7e160da 100644 --- a/src/content/memo/96.md +++ b/src/content/memo/96.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['brew'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/97.md b/src/content/memo/97.md index 58820f4..3453ee6 100644 --- a/src/content/memo/97.md +++ b/src/content/memo/97.md @@ -1,4 +1,5 @@ --- +type: note tags: ['google-apps-script', 'slack'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/98.md b/src/content/memo/98.md index 3d76d91..d5455c1 100644 --- a/src/content/memo/98.md +++ b/src/content/memo/98.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['sketch'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/99.md b/src/content/memo/99.md index 200ad07..88a759b 100644 --- a/src/content/memo/99.md +++ b/src/content/memo/99.md @@ -1,6 +1,7 @@ --- +type: bookmarks tags: ['analytics', 'search-console'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/pages/memos/all.astro b/src/pages/memos/all.astro index 490f527..83dba87 100644 --- a/src/pages/memos/all.astro +++ b/src/pages/memos/all.astro @@ -1,13 +1,14 @@ --- -import { getCollection, render } from 'astro:content' +import { render } from 'astro:content' import Layout from '@layouts/Layout.astro' import { MemoLayout } from '@components/MemoLayout/MemoLayout' import { Memo } from '@components/Memo/Memo' import { PaginationLatest } from '@components/Pagination/PaginationLatest' +import { getReleaseMemoCollection } from '@collection/memo' export const prerender = true -const memoCollection = await getCollection('memo') +const memoCollection = await getReleaseMemoCollection() const PAGE_TITLE = `메모 리스트 | eunsoolee` const PAGE_DESCRIPTION = '' diff --git a/src/pages/memos/archive.astro b/src/pages/memos/archive.astro new file mode 100644 index 0000000..79215ce --- /dev/null +++ b/src/pages/memos/archive.astro @@ -0,0 +1,34 @@ +--- +import { getCollection, render } from 'astro:content' +import Layout from '@layouts/Layout.astro' +import { MemoLayout } from '@components/MemoLayout/MemoLayout' +import { Memo } from '@components/Memo/Memo' + +export const prerender = true + +const memoCollection = await getCollection( + 'memo', + ({ data }) => data.status === 'archive' +) + +const PAGE_TITLE = `메모 보관함 | eunsoolee` +const PAGE_DESCRIPTION = '' +--- + + + + { + (import.meta.env.DEV ? memoCollection : []) + .toReversed() + .map(async (memo) => { + const { Content } = await render(memo) + + return ( + + + + ) + }) + } + + diff --git a/src/pages/tagged/index.astro b/src/pages/tagged/index.astro index 38ed510..bf5b8bc 100644 --- a/src/pages/tagged/index.astro +++ b/src/pages/tagged/index.astro @@ -8,10 +8,30 @@ export const prerender = true const memos = await getReleaseMemoCollection() const tags = Array.from(new Set(memos.map((memo) => memo.data.tags).flat())) +// 형태(type)는 태그가 아니지만 훑어보는 입구는 같은 자리에 둔다 +const types = Array.from(new Set(memos.map((memo) => memo.data.type))).map( + (type) => ({ + type, + count: memos.filter((memo) => memo.data.type === type).length, + }) +) + const PAGE_TITLE = `태그 모음 페이지 | eunsoolee` const PAGE_DESCRIPTION = '' --- + diff --git a/src/pages/type/[type].astro b/src/pages/type/[type].astro new file mode 100644 index 0000000..ef74a87 --- /dev/null +++ b/src/pages/type/[type].astro @@ -0,0 +1,48 @@ +--- +import Layout from '@layouts/Layout.astro' +import { MemoLayout } from '@components/MemoLayout/MemoLayout' +import { Memo } from '@components/Memo/Memo' +import { getReleaseMemoCollection } from '@collection/memo' +import { render } from 'astro:content' + +export async function getStaticPaths() { + const memoCollection = await getReleaseMemoCollection() + const types = Array.from(new Set(memoCollection.map((memo) => memo.data.type))) + const paths = Promise.all( + types.map(async (type) => { + return { + params: { type }, + props: { + memos: memoCollection.filter((memo) => memo.data.type === type), + }, + } + }) + ) + + return paths +} + +export const prerender = true + +const { memos } = Astro.props +const { type } = Astro.params + +const PAGE_TITLE = `${type} 형태의 메모 | eunsoolee` +const PAGE_DESCRIPTION = '' +--- + + + + { + memos.map(async (memo) => { + const { Content } = await render(memo) + + return ( + + + + ) + }) + } + +