From 00624b76ef1e5ab8b8dc40cdcc6b494be16c8daf Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 07:51:13 +0000 Subject: [PATCH 01/22] =?UTF-8?q?memo:=20OKF=20=EB=8F=84=EC=9E=85=20?= =?UTF-8?q?=EA=B2=80=ED=86=A0=20(577)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit type을 프론트매터 필수 필드로 두는 OKF 방식과 대조해서 현재 메모 스펙의 두 지점을 정리: - bookmarks가 태그로 들어가 유사도 계산에 예외를 만든 것 - mtime이 일괄 수정으로 오염되어 신선도 신호가 아닌 것 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/content/memo/577.md | 42 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/content/memo/577.md diff --git a/src/content/memo/577.md b/src/content/memo/577.md new file mode 100644 index 0000000..834ac8c --- /dev/null +++ b/src/content/memo/577.md @@ -0,0 +1,42 @@ +--- +tags: ['okf', 'frontmatter', 'metadata'] +status: draft +ctime: 2026-07-27 +mtime: 2026-07-27 +title: OKF 도입 검토 — type과 stale_after +description: OKF(Open Knowledge Format)와 대조해서 메모 스펙에서 가져올 것과 안 가져올 것 정리. +--- + +OKF는 마크다운 + YAML 프론트매터로 지식을 표현하는 포맷. 필수 필드가 `type` 하나뿐이라는 게 인상적이었다. 나머지는 전부 옵션이고, 없는 것도 의미를 갖는다(`status` 없으면 `stable`). + +내 메모에도 유형(A~F)이 있지만 CLAUDE.md 안에만 있고 데이터에는 없다. 유일하게 새어나온 게 `bookmarks`인데, 태그로 들어가서 유사도 계산에 예외가 생겼다. + +```ts +// src/collection/memo.ts +const STRUCTURAL_TAGS = new Set(['bookmarks']) +``` + +타입을 태그에 밀어넣으면 태그가 두 일을 하게 되고, 예외 목록이 자란다. `type`으로 빼면 예외가 사라진다. + +그리고 `mtime`은 신선도가 아니다. 542개 중 288개가 `mtime: 2024-03-22` — 일괄 수정 자국이다. OKF는 이걸 둘로 쪼갠다. + +| 필드 | 의미 | +|---|---| +| `generated.at` | 내용이 마지막으로 의미있게 바뀐 시점 | +| `stale_after` | 이 날짜 이후로는 거짓일 수 있음 | + +`stale_after`가 상대 TTL이 아니라 절대 날짜인 게 포인트. 읽는 시점을 참조하지 않으니 판정이 날짜 비교로 끝난다. + +안 가져올 것: + +- `verified` / 신뢰 등급 / attested computation — 에이전트가 대량 생성하는 코퍼스를 위한 장치. 단일 저자라 전부 `human:cbcruk`이 된다. +- 관계 레이어 추가 — `parent`는 542개 중 0개가 쓴다. 스키마가 부족한 게 아니라 안 쓰고 있는 것. + +다만 `generated.by`로 사람/AI를 구분하는 건 여기서도 의미가 있다. CLAUDE.md가 이미 "AI로 정리하면 일반적으로 인상적인 디테일로 흐른다"고 경고하는 지점이 결국 provenance 문제다. + +씨앗: `type`을 스키마에 넣으면 `STRUCTURAL_TAGS` 삭제 + 유형별 목록이 딸려 나온다. + +--- + +- [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) From d93e1ed2d093f069b0bb04f3c9f7cae2becd7cbe Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 08:12:39 +0000 Subject: [PATCH 02/22] =?UTF-8?q?memo:=20type=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EB=8F=84=EC=9E=85=20+=20542=EA=B0=9C=20=EB=B0=B1=ED=95=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit type은 형태만 담는다 — bookmarks / snippet / note. debug·comparison 같은 목적/주제는 tags에 남긴다. - content.config.ts: type을 필수 필드로 추가 - 542개 메모 백필 (bookmarks 274 / snippet 188 / note 80) - bookmarks 태그를 type으로 이동, 유사도 계산의 STRUCTURAL_TAGS 예외 제거 - CLAUDE.md: Type 기준 + 템플릿 6종 frontmatter 갱신 분류 규칙은 예전에 손으로 붙여둔 bookmarks 태그 33개를 정답지로 검증했다 (33/33 일치). Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- CLAUDE.md | 31 ++++++++++++++++++++++++++----- src/collection/memo.ts | 6 +----- src/content.config.ts | 1 + src/content/memo/1.md | 3 ++- src/content/memo/10.md | 1 + src/content/memo/100.md | 3 ++- src/content/memo/101.md | 1 + src/content/memo/105.md | 1 + src/content/memo/106.md | 3 ++- src/content/memo/107.md | 1 + src/content/memo/108.md | 1 + src/content/memo/109.md | 1 + src/content/memo/11.md | 1 + src/content/memo/110.md | 1 + src/content/memo/111.md | 1 + src/content/memo/112.md | 1 + src/content/memo/113.md | 1 + src/content/memo/114.md | 1 + src/content/memo/115.md | 1 + src/content/memo/116.md | 1 + src/content/memo/117.md | 1 + src/content/memo/118.md | 1 + src/content/memo/119.md | 1 + src/content/memo/12.md | 1 + src/content/memo/120.md | 1 + src/content/memo/121.md | 1 + src/content/memo/122.md | 1 + src/content/memo/123.md | 1 + src/content/memo/124.md | 1 + src/content/memo/125.md | 1 + src/content/memo/126.md | 1 + src/content/memo/127.md | 1 + src/content/memo/128.md | 1 + src/content/memo/129.md | 1 + src/content/memo/13.md | 3 ++- src/content/memo/130.md | 1 + src/content/memo/131.md | 1 + src/content/memo/132.md | 1 + src/content/memo/133.md | 1 + src/content/memo/134.md | 1 + src/content/memo/135.md | 1 + src/content/memo/136.md | 1 + src/content/memo/137.md | 1 + src/content/memo/138.md | 1 + src/content/memo/139.md | 1 + src/content/memo/14.md | 1 + src/content/memo/140.md | 1 + src/content/memo/141.md | 1 + src/content/memo/142.md | 1 + src/content/memo/143.md | 3 ++- src/content/memo/144.md | 1 + src/content/memo/145.md | 3 ++- src/content/memo/146.md | 1 + src/content/memo/147.md | 1 + src/content/memo/148.md | 1 + src/content/memo/149.md | 1 + src/content/memo/15.md | 1 + src/content/memo/150.md | 1 + src/content/memo/151.md | 1 + src/content/memo/152.md | 1 + src/content/memo/153.md | 1 + src/content/memo/154.md | 1 + src/content/memo/155.md | 1 + src/content/memo/156.md | 1 + src/content/memo/157.md | 1 + src/content/memo/158.md | 1 + src/content/memo/159.md | 1 + src/content/memo/16.md | 1 + src/content/memo/160.md | 1 + src/content/memo/161.md | 1 + src/content/memo/162.md | 1 + src/content/memo/163.md | 1 + src/content/memo/164.md | 1 + src/content/memo/165.md | 1 + src/content/memo/166.md | 1 + src/content/memo/167.md | 1 + src/content/memo/168.md | 1 + src/content/memo/169.md | 1 + src/content/memo/17.md | 1 + src/content/memo/170.md | 1 + src/content/memo/171.md | 1 + src/content/memo/172.md | 1 + src/content/memo/173.md | 1 + src/content/memo/174.md | 1 + src/content/memo/175.md | 1 + src/content/memo/176.md | 1 + src/content/memo/177.md | 1 + src/content/memo/178.md | 1 + src/content/memo/179.md | 1 + src/content/memo/18.md | 1 + src/content/memo/180.md | 1 + src/content/memo/181.md | 1 + src/content/memo/182.md | 1 + src/content/memo/183.md | 1 + src/content/memo/184.md | 1 + src/content/memo/185.md | 1 + src/content/memo/186.md | 1 + src/content/memo/187.md | 1 + src/content/memo/188.md | 1 + src/content/memo/189.md | 1 + src/content/memo/19.md | 1 + src/content/memo/190.md | 1 + src/content/memo/191.md | 1 + src/content/memo/192.md | 1 + src/content/memo/193.md | 1 + src/content/memo/194.md | 1 + src/content/memo/195.md | 1 + src/content/memo/196.md | 1 + src/content/memo/197.md | 1 + src/content/memo/198.md | 1 + src/content/memo/199.md | 1 + src/content/memo/2.md | 1 + src/content/memo/20.md | 1 + src/content/memo/200.md | 1 + src/content/memo/201.md | 1 + src/content/memo/202.md | 1 + src/content/memo/203.md | 1 + src/content/memo/204.md | 1 + src/content/memo/205.md | 1 + src/content/memo/206.md | 1 + src/content/memo/207.md | 1 + src/content/memo/208.md | 1 + src/content/memo/209.md | 1 + src/content/memo/21.md | 1 + src/content/memo/210.md | 1 + src/content/memo/211.md | 1 + src/content/memo/212.md | 1 + src/content/memo/213.md | 1 + src/content/memo/214.md | 1 + src/content/memo/215.md | 3 ++- src/content/memo/216.md | 1 + src/content/memo/217.md | 3 ++- src/content/memo/218.mdx | 1 + src/content/memo/219.md | 1 + src/content/memo/22.md | 1 + src/content/memo/220.md | 3 ++- src/content/memo/221.md | 3 ++- src/content/memo/222.md | 3 ++- src/content/memo/223.md | 1 + src/content/memo/224.md | 3 ++- src/content/memo/225.md | 1 + src/content/memo/226.md | 1 + src/content/memo/227.md | 1 + src/content/memo/228.md | 1 + src/content/memo/229.md | 1 + src/content/memo/23.md | 1 + src/content/memo/230.md | 1 + src/content/memo/231.md | 1 + src/content/memo/232.md | 1 + src/content/memo/233.md | 1 + src/content/memo/234.md | 1 + src/content/memo/235.md | 1 + src/content/memo/236.md | 3 ++- src/content/memo/237.md | 1 + src/content/memo/238.md | 1 + src/content/memo/239.md | 1 + src/content/memo/24.md | 1 + src/content/memo/240.md | 1 + src/content/memo/241.md | 1 + src/content/memo/242.md | 1 + src/content/memo/243.md | 1 + src/content/memo/244.md | 1 + src/content/memo/245.md | 1 + src/content/memo/246.md | 1 + src/content/memo/247.md | 1 + src/content/memo/248.md | 1 + src/content/memo/249.md | 1 + src/content/memo/25.md | 1 + src/content/memo/251.md | 3 ++- src/content/memo/252.md | 1 + src/content/memo/253.md | 1 + src/content/memo/255.md | 1 + src/content/memo/256.md | 1 + src/content/memo/257.md | 1 + src/content/memo/258.md | 1 + src/content/memo/259.md | 3 ++- src/content/memo/26.md | 1 + src/content/memo/260.mdx | 1 + src/content/memo/261.md | 1 + src/content/memo/262.md | 1 + src/content/memo/263.md | 1 + src/content/memo/264.md | 1 + src/content/memo/265.md | 1 + src/content/memo/266.md | 1 + src/content/memo/267.md | 1 + src/content/memo/268.md | 1 + src/content/memo/269.md | 1 + src/content/memo/27.md | 1 + src/content/memo/270.md | 1 + src/content/memo/271.md | 1 + src/content/memo/272.md | 1 + src/content/memo/273.md | 3 ++- src/content/memo/274.md | 1 + src/content/memo/275.md | 1 + src/content/memo/276.md | 1 + src/content/memo/277.md | 1 + src/content/memo/278.md | 1 + src/content/memo/279.md | 1 + src/content/memo/28.md | 1 + src/content/memo/280.md | 1 + src/content/memo/281.md | 1 + src/content/memo/282.md | 1 + src/content/memo/283.md | 3 ++- src/content/memo/284.mdx | 1 + src/content/memo/285.md | 3 ++- src/content/memo/286.md | 1 + src/content/memo/287.md | 1 + src/content/memo/288.md | 1 + src/content/memo/289.md | 1 + src/content/memo/29.md | 1 + src/content/memo/290.md | 1 + src/content/memo/291.mdx | 1 + src/content/memo/292.md | 1 + src/content/memo/293.md | 1 + src/content/memo/294.md | 1 + src/content/memo/296.md | 1 + src/content/memo/297.md | 1 + src/content/memo/298.md | 1 + src/content/memo/299.md | 1 + src/content/memo/3.md | 1 + src/content/memo/30.md | 1 + src/content/memo/300.md | 1 + src/content/memo/301.md | 1 + src/content/memo/302.md | 1 + src/content/memo/303.md | 1 + src/content/memo/304.md | 1 + src/content/memo/305.md | 1 + src/content/memo/306.md | 1 + src/content/memo/307.md | 1 + src/content/memo/309.md | 1 + src/content/memo/31.md | 1 + src/content/memo/310.md | 1 + src/content/memo/311.mdx | 1 + src/content/memo/312.md | 1 + src/content/memo/313.md | 1 + src/content/memo/314.mdx | 1 + src/content/memo/315.mdx | 1 + src/content/memo/317.md | 1 + src/content/memo/318.mdx | 1 + src/content/memo/319.mdx | 1 + src/content/memo/32.md | 1 + src/content/memo/320.md | 1 + src/content/memo/321.md | 1 + src/content/memo/322.md | 1 + src/content/memo/323.md | 1 + src/content/memo/324.md | 1 + src/content/memo/325.md | 1 + src/content/memo/326.md | 1 + src/content/memo/327.md | 1 + src/content/memo/328.md | 1 + src/content/memo/329.md | 1 + src/content/memo/33.md | 3 ++- src/content/memo/330.md | 1 + src/content/memo/331.md | 1 + src/content/memo/332.md | 1 + src/content/memo/333.md | 1 + src/content/memo/334.md | 1 + src/content/memo/335.md | 1 + src/content/memo/336.md | 1 + src/content/memo/337.md | 1 + src/content/memo/34.md | 1 + src/content/memo/340.md | 1 + src/content/memo/341.md | 1 + src/content/memo/342.md | 1 + src/content/memo/343.md | 1 + src/content/memo/344.md | 1 + src/content/memo/345.md | 1 + src/content/memo/347.md | 1 + src/content/memo/349.md | 1 + src/content/memo/35.md | 1 + src/content/memo/350.md | 1 + src/content/memo/351.md | 1 + src/content/memo/352.md | 1 + src/content/memo/353.md | 1 + src/content/memo/354.mdx | 1 + src/content/memo/355.md | 1 + src/content/memo/357.md | 1 + src/content/memo/358.mdx | 1 + src/content/memo/359.md | 1 + src/content/memo/36.md | 1 + src/content/memo/360.md | 1 + src/content/memo/361.md | 1 + src/content/memo/362.md | 1 + src/content/memo/363.md | 1 + src/content/memo/364.md | 1 + src/content/memo/365.md | 1 + src/content/memo/366.md | 1 + src/content/memo/367.mdx | 1 + src/content/memo/368.mdx | 1 + src/content/memo/369.md | 1 + src/content/memo/37.md | 1 + src/content/memo/370.md | 1 + src/content/memo/371.mdx | 1 + src/content/memo/372.md | 1 + src/content/memo/373.mdx | 1 + src/content/memo/374.md | 1 + src/content/memo/375.md | 1 + src/content/memo/376.mdx | 1 + src/content/memo/377.md | 1 + src/content/memo/38.md | 1 + src/content/memo/380.mdx | 1 + src/content/memo/381.md | 1 + src/content/memo/382.mdx | 1 + src/content/memo/383.mdx | 1 + src/content/memo/384.md | 1 + src/content/memo/385.mdx | 1 + src/content/memo/386.md | 1 + src/content/memo/387.md | 1 + src/content/memo/388.md | 1 + src/content/memo/389.md | 1 + src/content/memo/39.md | 1 + src/content/memo/390.md | 1 + src/content/memo/391.md | 1 + src/content/memo/392.md | 1 + src/content/memo/393.md | 1 + src/content/memo/394.md | 3 ++- src/content/memo/395.md | 1 + src/content/memo/396.md | 1 + src/content/memo/397.md | 1 + src/content/memo/399.md | 1 + src/content/memo/4.md | 1 + src/content/memo/40.md | 1 + src/content/memo/400.md | 3 ++- src/content/memo/401.md | 1 + src/content/memo/402.md | 1 + src/content/memo/403.md | 3 ++- src/content/memo/404.md | 1 + src/content/memo/405.md | 3 ++- src/content/memo/407.md | 1 + src/content/memo/408.md | 3 ++- src/content/memo/409.md | 3 ++- src/content/memo/41.md | 1 + src/content/memo/410.md | 1 + src/content/memo/411.md | 1 + src/content/memo/412.md | 3 ++- src/content/memo/413.md | 3 ++- src/content/memo/415.md | 3 ++- src/content/memo/416.md | 1 + src/content/memo/417.md | 1 + src/content/memo/418.md | 1 + src/content/memo/419.md | 1 + src/content/memo/42.md | 1 + src/content/memo/420.md | 1 + src/content/memo/421.md | 3 ++- src/content/memo/423.md | 3 ++- src/content/memo/424.md | 1 + src/content/memo/425.md | 1 + src/content/memo/426.md | 1 + src/content/memo/428.md | 1 + src/content/memo/429.md | 1 + src/content/memo/43.md | 1 + src/content/memo/430.mdx | 1 + src/content/memo/431.mdx | 1 + src/content/memo/432.mdx | 1 + src/content/memo/433.mdx | 1 + src/content/memo/435.md | 1 + src/content/memo/436.mdx | 1 + src/content/memo/437.md | 1 + src/content/memo/438.mdx | 1 + src/content/memo/439.mdx | 1 + src/content/memo/44.md | 1 + src/content/memo/440.mdx | 1 + src/content/memo/441.mdx | 1 + src/content/memo/442.mdx | 1 + src/content/memo/443.md | 1 + src/content/memo/444.md | 1 + src/content/memo/445.md | 1 + src/content/memo/446.md | 1 + src/content/memo/447.md | 3 ++- src/content/memo/448.md | 1 + src/content/memo/449.mdx | 1 + src/content/memo/45.md | 1 + src/content/memo/450.mdx | 1 + src/content/memo/451.mdx | 1 + src/content/memo/452.mdx | 1 + src/content/memo/453.md | 1 + src/content/memo/454.mdx | 1 + src/content/memo/455.mdx | 1 + src/content/memo/457.mdx | 1 + src/content/memo/458.mdx | 1 + src/content/memo/459.mdx | 1 + src/content/memo/46.md | 1 + src/content/memo/460.md | 1 + src/content/memo/461.mdx | 1 + src/content/memo/462.md | 1 + src/content/memo/464.md | 1 + src/content/memo/465.md | 1 + src/content/memo/466.mdx | 1 + src/content/memo/467.mdx | 1 + src/content/memo/468.mdx | 1 + src/content/memo/469.md | 3 ++- src/content/memo/47.md | 1 + src/content/memo/470.mdx | 1 + src/content/memo/471.mdx | 1 + src/content/memo/472.mdx | 1 + src/content/memo/473.mdx | 1 + src/content/memo/474.mdx | 1 + src/content/memo/475.md | 1 + src/content/memo/476.mdx | 1 + src/content/memo/477.mdx | 1 + src/content/memo/478.mdx | 1 + src/content/memo/479.mdx | 1 + src/content/memo/48.md | 1 + src/content/memo/480.md | 1 + src/content/memo/481.md | 1 + src/content/memo/482.md | 1 + src/content/memo/483.md | 1 + src/content/memo/484.md | 1 + src/content/memo/485.mdx | 1 + src/content/memo/487.mdx | 1 + src/content/memo/488.mdx | 1 + src/content/memo/49.md | 1 + src/content/memo/490.mdx | 1 + src/content/memo/491.mdx | 1 + src/content/memo/492.md | 1 + src/content/memo/493.md | 1 + src/content/memo/494.md | 1 + src/content/memo/495.md | 1 + src/content/memo/496.md | 1 + src/content/memo/497.md | 1 + src/content/memo/498.md | 1 + src/content/memo/499.md | 1 + src/content/memo/5.md | 1 + src/content/memo/50.md | 1 + src/content/memo/500.md | 1 + src/content/memo/501.md | 1 + src/content/memo/503.md | 1 + src/content/memo/505.md | 1 + src/content/memo/506.md | 1 + src/content/memo/507.md | 1 + src/content/memo/508.md | 1 + src/content/memo/509.md | 1 + src/content/memo/51.md | 1 + src/content/memo/510.md | 1 + src/content/memo/511.md | 1 + src/content/memo/512.md | 1 + src/content/memo/513.md | 1 + src/content/memo/514.md | 1 + src/content/memo/515.md | 1 + src/content/memo/516.md | 1 + src/content/memo/518.md | 1 + src/content/memo/519.md | 1 + src/content/memo/52.md | 1 + src/content/memo/520.md | 1 + src/content/memo/521.md | 1 + src/content/memo/522.md | 1 + src/content/memo/523.md | 1 + src/content/memo/524.md | 1 + src/content/memo/525.md | 1 + src/content/memo/526.md | 1 + src/content/memo/528.md | 1 + src/content/memo/529.md | 1 + src/content/memo/53.md | 1 + src/content/memo/530.md | 1 + src/content/memo/531.md | 1 + src/content/memo/532.md | 1 + src/content/memo/533.md | 1 + src/content/memo/534.md | 1 + src/content/memo/535.md | 1 + src/content/memo/536.md | 1 + src/content/memo/537.md | 1 + src/content/memo/538.md | 1 + src/content/memo/539.md | 1 + src/content/memo/54.md | 1 + src/content/memo/540.md | 1 + src/content/memo/541.md | 1 + src/content/memo/544.md | 1 + src/content/memo/545.md | 1 + src/content/memo/546.md | 1 + src/content/memo/547.md | 1 + src/content/memo/548.md | 1 + src/content/memo/549.md | 1 + src/content/memo/55.md | 1 + src/content/memo/550.md | 1 + src/content/memo/551.mdx | 1 + src/content/memo/552.mdx | 1 + src/content/memo/553.mdx | 1 + src/content/memo/555.mdx | 1 + src/content/memo/558.mdx | 1 + src/content/memo/559.mdx | 1 + src/content/memo/56.md | 1 + src/content/memo/560.mdx | 1 + src/content/memo/561.mdx | 1 + src/content/memo/562.mdx | 1 + src/content/memo/563.mdx | 1 + src/content/memo/564.mdx | 1 + src/content/memo/565.mdx | 1 + src/content/memo/566.mdx | 1 + src/content/memo/567.mdx | 1 + src/content/memo/568.mdx | 1 + src/content/memo/569.mdx | 1 + src/content/memo/57.mdx | 3 ++- src/content/memo/570.mdx | 1 + src/content/memo/572.mdx | 1 + src/content/memo/573.mdx | 1 + src/content/memo/574.mdx | 1 + src/content/memo/575.mdx | 1 + src/content/memo/576.mdx | 1 + src/content/memo/577.md | 5 ++++- src/content/memo/58.md | 1 + src/content/memo/59.md | 1 + src/content/memo/6.md | 1 + src/content/memo/60.md | 1 + src/content/memo/61.md | 1 + src/content/memo/62.md | 1 + src/content/memo/63.md | 1 + src/content/memo/64.md | 1 + src/content/memo/65.md | 1 + src/content/memo/66.md | 1 + src/content/memo/67.md | 1 + src/content/memo/68.md | 1 + src/content/memo/69.md | 1 + src/content/memo/7.md | 1 + src/content/memo/70.md | 1 + src/content/memo/71.md | 1 + src/content/memo/72.md | 1 + src/content/memo/73.md | 1 + src/content/memo/74.md | 1 + src/content/memo/75.md | 1 + src/content/memo/76.md | 1 + src/content/memo/77.md | 1 + src/content/memo/78.md | 1 + src/content/memo/79.md | 1 + src/content/memo/8.md | 1 + src/content/memo/80.md | 1 + src/content/memo/81.md | 1 + src/content/memo/82.md | 1 + src/content/memo/83.md | 1 + src/content/memo/84.md | 1 + src/content/memo/85.md | 1 + src/content/memo/86.md | 1 + src/content/memo/87.md | 1 + src/content/memo/88.md | 1 + src/content/memo/89.md | 1 + src/content/memo/9.md | 1 + src/content/memo/90.md | 1 + src/content/memo/91.md | 1 + src/content/memo/92.md | 1 + src/content/memo/93.md | 1 + src/content/memo/94.md | 1 + src/content/memo/95.md | 1 + src/content/memo/96.md | 1 + src/content/memo/97.md | 1 + src/content/memo/98.md | 1 + src/content/memo/99.md | 1 + 545 files changed, 606 insertions(+), 44 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 121968a..6641020 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -55,6 +55,7 @@ ```yaml --- +type: note # 필수, 'bookmarks' | 'snippet' | 'note' tags: ['tag1', 'tag2'] # 필수, 빈 배열 [] 허용 status: draft # 필수, 'draft' 또는 'release' ctime: YYYY-MM-DD # 필수, 생성일 @@ -81,6 +82,19 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' - **supersedes**: `relation: supersedes`면 부모 페이지에 "대체됨" 경고 표시 - `parent`는 `release` 메모만 해석됨 (draft는 공개되지 않음) +### Type 기준 + +`type`은 **형태**만 담는다. **주제는 `tags`가 담당** — 둘을 섞지 않는다. + +| 값 | 의미 | 판별 | +|---|---|---| +| `bookmarks` | 링크 모음이 주인공 | 코드 없음 + 불릿이 대부분 링크 | +| `snippet` | 코드가 주인공 | 코드 블록 있음 + 산문은 그걸 설명하는 정도 | +| `note` | 산문이 주인공 | 나머지 (기술 문서·비교·아이디어·디버그 전부) | + +- `debug`, `comparison` 같은 **목적/주제는 `type`이 아니라 `tags`에 넣는다.** 형태를 태그에 넣으면 태그가 두 일을 하게 되고 유사도 계산에 예외가 생긴다 (이전 `bookmarks` 태그가 그랬다 → 577.md). +- 아래 유형 템플릿(A~F)은 **본문을 어떻게 쓸지에 대한 가이드**이고, `type`과 1:1이 아니다. C·D·E·F는 모두 `type: note`다. + ### Status 기준 | 값 | 의미 | @@ -94,8 +108,7 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' - O: `design-system`, `react-query`, `google-apps-script` - X: `design_system`, `reactQuery` - **빈 태그**: `[]` 허용 (분류가 애매한 경우) -- **특수 태그**: - - `bookmarks` - 링크 모음 형태의 메모 +- **형태는 태그가 아니다**: 링크 모음/코드 스니펫 같은 형태는 `type`으로 표기한다 (과거 `bookmarks` 태그는 `type: bookmarks`로 이동) ### 각주 규칙 @@ -141,7 +154,8 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' ```markdown --- -tags: ['keyword', 'bookmarks'] +type: bookmarks +tags: ['keyword'] status: draft ctime: YYYY-MM-DD mtime: YYYY-MM-DD @@ -160,6 +174,7 @@ mtime: YYYY-MM-DD ```markdown --- +type: snippet tags: ['typescript', 'pattern'] status: release ctime: YYYY-MM-DD @@ -181,6 +196,7 @@ mtime: YYYY-MM-DD ```markdown --- +type: note tags: ['react', 'architecture'] status: draft ctime: YYYY-MM-DD @@ -212,6 +228,7 @@ description: 선택사항 ```markdown --- +type: note tags: ['library', 'comparison'] status: release ctime: YYYY-MM-DD @@ -235,6 +252,7 @@ mtime: YYYY-MM-DD ```markdown --- +type: note tags: ['idea', 'keyword'] status: draft ctime: YYYY-MM-DD @@ -260,6 +278,7 @@ mtime: YYYY-MM-DD ```markdown --- +type: note tags: ['debug', 'keyword'] status: release ctime: YYYY-MM-DD @@ -304,8 +323,9 @@ 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`, 완성되면 `release` ### 메모 수정 @@ -319,3 +339,4 @@ mtime: YYYY-MM-DD - 태그 정규화: snake_case → kebab-case 변환 (23개 파일) - 빈 태그 메모: 28개 파일에 태그 적용 - 삭제: 427.md (내용 없음) +- `type` 필드 도입 + 542개 파일 백필 (bookmarks 274 / snippet 188 / note 80). `bookmarks` 태그는 `type`으로 이동, 유사도 계산의 `STRUCTURAL_TAGS` 예외 제거 → 577.md diff --git a/src/collection/memo.ts b/src/collection/memo.ts index dfcdc57..dde8245 100644 --- a/src/collection/memo.ts +++ b/src/collection/memo.ts @@ -13,8 +13,6 @@ export const getRandomMemoCollection = async () => { return memos } -const STRUCTURAL_TAGS = new Set(['bookmarks']) - const buildDocumentFrequency = ( memos: CollectionEntry<'memo'>[] ): Map => { @@ -36,9 +34,7 @@ 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) if (currentTags.size === 0) { return [] diff --git a/src/content.config.ts b/src/content.config.ts index 494ee05..c9c5e61 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -4,6 +4,7 @@ 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()), 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..df7c256 100644 --- a/src/content/memo/10.md +++ b/src/content/memo/10.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['javascript', 'rx', 'reactive', 'pipe', 'streams'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/100.md b/src/content/memo/100.md index 9b5c8d8..365d8c9 100644 --- a/src/content/memo/100.md +++ b/src/content/memo/100.md @@ -1,5 +1,6 @@ --- -tags: ['git', 'bookmarks'] +type: bookmarks +tags: ['git'] status: draft 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..7330618 100644 --- a/src/content/memo/106.md +++ b/src/content/memo/106.md @@ -1,5 +1,6 @@ --- -tags: ['css', 'bookmarks'] +type: bookmarks +tags: ['css'] status: release ctime: 2022-04-09 mtime: 2024-03-22 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..7a8e1ec 100644 --- a/src/content/memo/109.md +++ b/src/content/memo/109.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', 'clamp'] status: draft ctime: 2022-04-09 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..100cd9b 100644 --- a/src/content/memo/110.md +++ b/src/content/memo/110.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', 'contain'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/111.md b/src/content/memo/111.md index 1b7b461..4c49f52 100644 --- a/src/content/memo/111.md +++ b/src/content/memo/111.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', 'z-index'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/112.md b/src/content/memo/112.md index f7e7065..fd24c32 100644 --- a/src/content/memo/112.md +++ b/src/content/memo/112.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', 'svg', 'keyframes', 'offset-path'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/113.md b/src/content/memo/113.md index c85d395..f0f3fc1 100644 --- a/src/content/memo/113.md +++ b/src/content/memo/113.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', 'reset'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/114.md b/src/content/memo/114.md index 1a455dd..40c2229 100644 --- a/src/content/memo/114.md +++ b/src/content/memo/114.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', '3d'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/115.md b/src/content/memo/115.md index 05a84ff..334597c 100644 --- a/src/content/memo/115.md +++ b/src/content/memo/115.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', '@container'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/116.md b/src/content/memo/116.md index 379fb31..f681266 100644 --- a/src/content/memo/116.md +++ b/src/content/memo/116.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', 'clip-path'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/117.md b/src/content/memo/117.md index 488bfdc..84d9f2f 100644 --- a/src/content/memo/117.md +++ b/src/content/memo/117.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', 'content-visibility', 'performance'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/118.md b/src/content/memo/118.md index 2e4bfce..37d7c7e 100644 --- a/src/content/memo/118.md +++ b/src/content/memo/118.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', 'css-custom-properties'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/119.md b/src/content/memo/119.md index a30d9f4..90e499b 100644 --- a/src/content/memo/119.md +++ b/src/content/memo/119.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', 'button'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/12.md b/src/content/memo/12.md index e058eba..ec8259f 100644 --- a/src/content/memo/12.md +++ b/src/content/memo/12.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['pattern-matching', 'javascript'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/120.md b/src/content/memo/120.md index 7e7e9cf..2ebd8bc 100644 --- a/src/content/memo/120.md +++ b/src/content/memo/120.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['css', '@media'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/121.md b/src/content/memo/121.md index 04e2eba..0c66dfa 100644 --- a/src/content/memo/121.md +++ b/src/content/memo/121.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['image'] status: draft ctime: 2022-04-09 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..81dddcb 100644 --- a/src/content/memo/123.md +++ b/src/content/memo/123.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['json', 'search'] status: draft ctime: 2022-04-09 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..bb7b0ea 100644 --- a/src/content/memo/125.md +++ b/src/content/memo/125.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['json', 'grpc', 'protobuf'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/126.md b/src/content/memo/126.md index 107262d..ad905bc 100644 --- a/src/content/memo/126.md +++ b/src/content/memo/126.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['json', 'schema'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/127.md b/src/content/memo/127.md index 77b5263..2eb4b65 100644 --- a/src/content/memo/127.md +++ b/src/content/memo/127.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['extensions'] status: draft ctime: 2022-04-09 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..9fec19c 100644 --- a/src/content/memo/129.md +++ b/src/content/memo/129.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['cookies', 'extensions'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/13.md b/src/content/memo/13.md index 644d73e..2a159fd 100644 --- a/src/content/memo/13.md +++ b/src/content/memo/13.md @@ -1,5 +1,6 @@ --- -tags: ['typescript', 'bookmarks'] +type: bookmarks +tags: ['typescript'] status: draft ctime: 2022-04-09 mtime: 2026-01-27 diff --git a/src/content/memo/130.md b/src/content/memo/130.md index 1179b42..e4c188b 100644 --- a/src/content/memo/130.md +++ b/src/content/memo/130.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['extensions'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/131.md b/src/content/memo/131.md index 411b4a6..9aea7d1 100644 --- a/src/content/memo/131.md +++ b/src/content/memo/131.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['extensions', 'i18n'] status: draft ctime: 2022-04-09 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..cc2e2d4 100644 --- a/src/content/memo/135.md +++ b/src/content/memo/135.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['browser'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/136.md b/src/content/memo/136.md index 0de5a68..cae4376 100644 --- a/src/content/memo/136.md +++ b/src/content/memo/136.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['web-api'] status: draft embed: https://stackblitz.com/~/github.com/cbcruk/web_apis diff --git a/src/content/memo/137.md b/src/content/memo/137.md index 9630e2c..92d59f5 100644 --- a/src/content/memo/137.md +++ b/src/content/memo/137.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['webmention'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/138.md b/src/content/memo/138.md index d3a3b9e..be6a6e6 100644 --- a/src/content/memo/138.md +++ b/src/content/memo/138.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['browser'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/139.md b/src/content/memo/139.md index c93fc55..d0fad93 100644 --- a/src/content/memo/139.md +++ b/src/content/memo/139.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['web-worker', 'service-worker'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/14.md b/src/content/memo/14.md index bd784c9..76125f0 100644 --- a/src/content/memo/14.md +++ b/src/content/memo/14.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['typescript', 'migrating'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/140.md b/src/content/memo/140.md index a807f3c..ef1fee2 100644 --- a/src/content/memo/140.md +++ b/src/content/memo/140.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['http'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/141.md b/src/content/memo/141.md index 89b9938..b3e758f 100644 --- a/src/content/memo/141.md +++ b/src/content/memo/141.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['aws', 'download'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/142.md b/src/content/memo/142.md index cff045f..49fe57f 100644 --- a/src/content/memo/142.md +++ b/src/content/memo/142.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['cache', 'bfcache'] status: draft ctime: 2022-04-09 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..a701d4d 100644 --- a/src/content/memo/144.md +++ b/src/content/memo/144.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['uri', '딥링크'] status: draft ctime: 2022-04-09 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..ff36c80 100644 --- a/src/content/memo/149.md +++ b/src/content/memo/149.md @@ -1,4 +1,5 @@ --- +type: note tags: ['test', 'bdd'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/15.md b/src/content/memo/15.md index fa7641c..abeca0b 100644 --- a/src/content/memo/15.md +++ b/src/content/memo/15.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'function'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/150.md b/src/content/memo/150.md index 22534ab..acf22b1 100644 --- a/src/content/memo/150.md +++ b/src/content/memo/150.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['cucumber', 'test', 'bdd'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/151.md b/src/content/memo/151.md index d764faa..eca7812 100644 --- a/src/content/memo/151.md +++ b/src/content/memo/151.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['gsap'] status: draft ctime: 2022-04-09 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..99a6d75 100644 --- a/src/content/memo/153.md +++ b/src/content/memo/153.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['motion'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/154.md b/src/content/memo/154.md index aa96fce..87d0817 100644 --- a/src/content/memo/154.md +++ b/src/content/memo/154.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['waapi', 'animation'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/155.md b/src/content/memo/155.md index 470c53f..d365f54 100644 --- a/src/content/memo/155.md +++ b/src/content/memo/155.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['motion-blur', 'svg', 'gsap', 'fe-gaussian-blur'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/156.md b/src/content/memo/156.md index 025349e..77fb6ca 100644 --- a/src/content/memo/156.md +++ b/src/content/memo/156.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['physics'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/157.md b/src/content/memo/157.md index 0c9c649..2be10f2 100644 --- a/src/content/memo/157.md +++ b/src/content/memo/157.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['bug'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/158.md b/src/content/memo/158.md index 7c3a961..d2d0651 100644 --- a/src/content/memo/158.md +++ b/src/content/memo/158.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['html', 'autocomplete'] status: draft ctime: 2022-04-09 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..734dc82 100644 --- a/src/content/memo/16.md +++ b/src/content/memo/16.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['typescript', 'type', 'interface'] status: draft ctime: 2022-04-09 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..204c6bd 100644 --- a/src/content/memo/165.md +++ b/src/content/memo/165.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['input'] status: draft ctime: 2022-04-09 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..f7e7b12 100644 --- a/src/content/memo/169.md +++ b/src/content/memo/169.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['javascript', 'proxy'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/17.md b/src/content/memo/17.md index 3bb2078..28d5ac0 100644 --- a/src/content/memo/17.md +++ b/src/content/memo/17.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['javascript', 'typescript', 'jsdoc', 'vscode'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/170.md b/src/content/memo/170.md index 6b0cae2..7faceca 100644 --- a/src/content/memo/170.md +++ b/src/content/memo/170.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['reflect'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/171.md b/src/content/memo/171.md index 7774925..f54f08a 100644 --- a/src/content/memo/171.md +++ b/src/content/memo/171.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['font', 'text'] status: draft ctime: 2022-04-09 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..e6f32ae 100644 --- a/src/content/memo/173.md +++ b/src/content/memo/173.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['font'] status: release embed: https://codepen.io/eunsoolee/pen/vYZqoGz diff --git a/src/content/memo/174.md b/src/content/memo/174.md index 972ba38..4a2a00c 100644 --- a/src/content/memo/174.md +++ b/src/content/memo/174.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['font'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/175.md b/src/content/memo/175.md index 9311d6a..723bf25 100644 --- a/src/content/memo/175.md +++ b/src/content/memo/175.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['font', 'css'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/176.md b/src/content/memo/176.md index 7e07199..ff2f72f 100644 --- a/src/content/memo/176.md +++ b/src/content/memo/176.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['desktop'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/177.md b/src/content/memo/177.md index b88963b..ed630a7 100644 --- a/src/content/memo/177.md +++ b/src/content/memo/177.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['svg'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/178.md b/src/content/memo/178.md index 2688ea3..1f83ba0 100644 --- a/src/content/memo/178.md +++ b/src/content/memo/178.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['svg', 'fe-turbulence', 'fe-displacement-map'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/179.md b/src/content/memo/179.md index 33b56cc..ee2bbf4 100644 --- a/src/content/memo/179.md +++ b/src/content/memo/179.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['svg', 'mask'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/18.md b/src/content/memo/18.md index c555125..6b4badc 100644 --- a/src/content/memo/18.md +++ b/src/content/memo/18.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['ui'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/180.md b/src/content/memo/180.md index 15ff263..332f021 100644 --- a/src/content/memo/180.md +++ b/src/content/memo/180.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['email'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/181.md b/src/content/memo/181.md index 1de8a72..717a7ef 100644 --- a/src/content/memo/181.md +++ b/src/content/memo/181.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['editor', 'wysiwyg'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/182.md b/src/content/memo/182.md index 54e2355..3b44dd5 100644 --- a/src/content/memo/182.md +++ b/src/content/memo/182.md @@ -1,4 +1,5 @@ --- +type: note tags: ['photoshop'] status: draft ctime: 2022-04-09 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..3d9b0c6 100644 --- a/src/content/memo/184.md +++ b/src/content/memo/184.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['photoshop'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/185.md b/src/content/memo/185.md index 70e8c0b..fbe8405 100644 --- a/src/content/memo/185.md +++ b/src/content/memo/185.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['photoshop'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/186.md b/src/content/memo/186.md index a7f1dd5..094a01e 100644 --- a/src/content/memo/186.md +++ b/src/content/memo/186.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['photoshop'] status: draft ctime: 2022-04-09 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..203c85a 100644 --- a/src/content/memo/188.md +++ b/src/content/memo/188.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['seo'] status: draft ctime: 2022-06-01 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..ca18419 100644 --- a/src/content/memo/19.md +++ b/src/content/memo/19.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['ui', 'calculator', 'math'] status: release ctime: 2022-04-09 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..81a3aec 100644 --- a/src/content/memo/192.md +++ b/src/content/memo/192.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['flags'] status: draft ctime: 2022-09-18 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..593000e 100644 --- a/src/content/memo/194.md +++ b/src/content/memo/194.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['algorithm', 'cs', 'equations'] status: draft ctime: 2022-09-19 diff --git a/src/content/memo/195.md b/src/content/memo/195.md index 05f54e7..f91f249 100644 --- a/src/content/memo/195.md +++ b/src/content/memo/195.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['whac-a-mole'] status: draft ctime: 2022-09-19 diff --git a/src/content/memo/196.md b/src/content/memo/196.md index 3f37525..f50a3fb 100644 --- a/src/content/memo/196.md +++ b/src/content/memo/196.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['seo'] status: draft ctime: 2022-09-19 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..e10154d 100644 --- a/src/content/memo/198.md +++ b/src/content/memo/198.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['calendar', 'google-apps-script'] status: draft ctime: 2022-09-23 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..c8cca13 100644 --- a/src/content/memo/2.md +++ b/src/content/memo/2.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['promise', 'javascript', 'async-await'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/20.md b/src/content/memo/20.md index 18cc080..fc75496 100644 --- a/src/content/memo/20.md +++ b/src/content/memo/20.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['maps', 'ui'] status: draft ctime: 2022-04-09 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..f5d5ac2 100644 --- a/src/content/memo/204.md +++ b/src/content/memo/204.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['terms'] status: draft ctime: 2022-09-23 diff --git a/src/content/memo/205.md b/src/content/memo/205.md index 4a00614..7c55fd1 100644 --- a/src/content/memo/205.md +++ b/src/content/memo/205.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['axios'] status: draft ctime: 2022-09-23 diff --git a/src/content/memo/206.md b/src/content/memo/206.md index c30d3a2..bf0f52c 100644 --- a/src/content/memo/206.md +++ b/src/content/memo/206.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['next'] status: draft ctime: 2022-09-23 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..4d0e7e1 100644 --- a/src/content/memo/21.md +++ b/src/content/memo/21.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['ui', 'builder', 'dnd'] status: release ctime: 2022-04-09 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..f7059aa 100644 --- a/src/content/memo/211.md +++ b/src/content/memo/211.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['webpack'] status: draft ctime: 2022-09-29 diff --git a/src/content/memo/212.md b/src/content/memo/212.md index b56766e..4184327 100644 --- a/src/content/memo/212.md +++ b/src/content/memo/212.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['slack'] status: draft ctime: 2022-10-10 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..d1f6b06 100644 --- a/src/content/memo/215.md +++ b/src/content/memo/215.md @@ -1,5 +1,6 @@ --- -tags: ['fp', 'bookmarks'] +type: bookmarks +tags: ['fp'] status: draft ctime: 2022-10-16 mtime: 2024-03-22 diff --git a/src/content/memo/216.md b/src/content/memo/216.md index 6757dcb..420bed1 100644 --- a/src/content/memo/216.md +++ b/src/content/memo/216.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['ramda'] status: draft ctime: 2022-10-16 diff --git a/src/content/memo/217.md b/src/content/memo/217.md index bac0894..babd146 100644 --- a/src/content/memo/217.md +++ b/src/content/memo/217.md @@ -1,5 +1,6 @@ --- -tags: ['cms', 'bookmarks'] +type: bookmarks +tags: ['cms'] status: draft 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..c29bdae 100644 --- a/src/content/memo/219.md +++ b/src/content/memo/219.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['state'] status: draft ctime: 2022-10-16 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..04ec686 100644 --- a/src/content/memo/220.md +++ b/src/content/memo/220.md @@ -1,5 +1,6 @@ --- -tags: ['interview', 'bookmarks'] +type: bookmarks +tags: ['interview'] status: draft ctime: 2022-10-16 mtime: 2024-03-22 diff --git a/src/content/memo/221.md b/src/content/memo/221.md index c227b17..4e082b9 100644 --- a/src/content/memo/221.md +++ b/src/content/memo/221.md @@ -1,5 +1,6 @@ --- -tags: ['code-review', 'bookmarks'] +type: bookmarks +tags: ['code-review'] status: release ctime: 2022-10-16 mtime: 2024-03-22 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..b07849d 100644 --- a/src/content/memo/224.md +++ b/src/content/memo/224.md @@ -1,5 +1,6 @@ --- -tags: ['performance', 'bookmarks'] +type: bookmarks +tags: ['performance'] status: draft ctime: 2022-10-16 mtime: 2024-03-22 diff --git a/src/content/memo/225.md b/src/content/memo/225.md index 052b825..dc33d93 100644 --- a/src/content/memo/225.md +++ b/src/content/memo/225.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['webgl', 'three.js'] status: draft ctime: 2022-10-16 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..eb8d329 100644 --- a/src/content/memo/23.md +++ b/src/content/memo/23.md @@ -1,4 +1,5 @@ --- +type: note tags: ['raspberry-pi'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/230.md b/src/content/memo/230.md index a49d52c..9418de3 100644 --- a/src/content/memo/230.md +++ b/src/content/memo/230.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['migrating'] status: draft ctime: 2022-11-28 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..73b4564 100644 --- a/src/content/memo/233.md +++ b/src/content/memo/233.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['ui', 'design-system', 'headless'] status: release ctime: 2022-12-05 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..0d46ac6 100644 --- a/src/content/memo/235.md +++ b/src/content/memo/235.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['shell', 'node', 'env'] status: release ctime: 2022-12-11 diff --git a/src/content/memo/236.md b/src/content/memo/236.md index ebc9bcc..23d183d 100644 --- a/src/content/memo/236.md +++ b/src/content/memo/236.md @@ -1,5 +1,6 @@ --- -tags: ['ffmpeg', 'bookmarks'] +type: bookmarks +tags: ['ffmpeg'] status: draft 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..06420f9 100644 --- a/src/content/memo/239.md +++ b/src/content/memo/239.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['airtable'] status: draft ctime: 2022-12-11 diff --git a/src/content/memo/24.md b/src/content/memo/24.md index 04018f4..0b64264 100644 --- a/src/content/memo/24.md +++ b/src/content/memo/24.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['globe', 'webgl'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/240.md b/src/content/memo/240.md index a1ce78d..039efac 100644 --- a/src/content/memo/240.md +++ b/src/content/memo/240.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['cloudflare'] status: draft ctime: 2022-12-11 diff --git a/src/content/memo/241.md b/src/content/memo/241.md index 34d3b16..a71f602 100644 --- a/src/content/memo/241.md +++ b/src/content/memo/241.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['design-system', 'css', 'css-in-js'] status: draft ctime: 2022-12-11 diff --git a/src/content/memo/242.md b/src/content/memo/242.md index 82a9186..721ed97 100644 --- a/src/content/memo/242.md +++ b/src/content/memo/242.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['google-apps-script'] status: draft ctime: 2022-12-15 diff --git a/src/content/memo/243.md b/src/content/memo/243.md index de19ea1..3287e9a 100644 --- a/src/content/memo/243.md +++ b/src/content/memo/243.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['font'] status: release ctime: 2022-12-29 diff --git a/src/content/memo/244.md b/src/content/memo/244.md index 1312be1..a537414 100644 --- a/src/content/memo/244.md +++ b/src/content/memo/244.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['jsdoc'] status: draft ctime: 2023-01-12 diff --git a/src/content/memo/245.md b/src/content/memo/245.md index 31faeae..fe42038 100644 --- a/src/content/memo/245.md +++ b/src/content/memo/245.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['api', 'mock'] status: draft ctime: 2023-02-18 diff --git a/src/content/memo/246.md b/src/content/memo/246.md index 7b937f7..f362649 100644 --- a/src/content/memo/246.md +++ b/src/content/memo/246.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['webcontainers', 'sandbox'] status: draft ctime: 2023-02-20 diff --git a/src/content/memo/247.md b/src/content/memo/247.md index 332120f..ae7e4f3 100644 --- a/src/content/memo/247.md +++ b/src/content/memo/247.md @@ -1,4 +1,5 @@ --- +type: note tags: ['wcag', 'ux'] status: release ctime: 2023-02-20 diff --git a/src/content/memo/248.md b/src/content/memo/248.md index 69e24f9..bd5f02a 100644 --- a/src/content/memo/248.md +++ b/src/content/memo/248.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['tailwindcss'] status: draft ctime: 2023-02-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..b061f7e 100644 --- a/src/content/memo/25.md +++ b/src/content/memo/25.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['search', 'highlight', 'ui'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/251.md b/src/content/memo/251.md index 70a9abf..b6094de 100644 --- a/src/content/memo/251.md +++ b/src/content/memo/251.md @@ -1,5 +1,6 @@ --- -tags: ['bookmarks'] +type: bookmarks +tags: [] status: draft 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..45f61e1 100644 --- a/src/content/memo/253.md +++ b/src/content/memo/253.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['graph'] status: draft ctime: 2023-03-13 diff --git a/src/content/memo/255.md b/src/content/memo/255.md index 940d108..282cab1 100644 --- a/src/content/memo/255.md +++ b/src/content/memo/255.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['typescript', 'jsx', 'parser'] status: release ctime: 2023-03-19 diff --git a/src/content/memo/256.md b/src/content/memo/256.md index 724c625..35493b2 100644 --- a/src/content/memo/256.md +++ b/src/content/memo/256.md @@ -1,4 +1,5 @@ --- +type: note tags: ['micro-frontend', 'webpack'] status: draft ctime: 2023-03-19 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..69a7ca0 100644 --- a/src/content/memo/258.md +++ b/src/content/memo/258.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['db'] status: draft ctime: 2023-03-28 diff --git a/src/content/memo/259.md b/src/content/memo/259.md index e2088d5..e83f83b 100644 --- a/src/content/memo/259.md +++ b/src/content/memo/259.md @@ -1,5 +1,6 @@ --- -tags: ['architecture', 'bookmarks'] +type: bookmarks +tags: ['architecture'] status: draft ctime: 2023-04-01 mtime: 2024-03-22 diff --git a/src/content/memo/26.md b/src/content/memo/26.md index 13d4913..2009899 100644 --- a/src/content/memo/26.md +++ b/src/content/memo/26.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['pdf', 'webassembly'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/260.mdx b/src/content/memo/260.mdx index 21e8b52..3cc82e9 100644 --- a/src/content/memo/260.mdx +++ b/src/content/memo/260.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['jscodeshift'] status: draft ctime: 2023-04-12 diff --git a/src/content/memo/261.md b/src/content/memo/261.md index 3b88fcf..41dbdaa 100644 --- a/src/content/memo/261.md +++ b/src/content/memo/261.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['git'] status: draft ctime: 2023-04-12 diff --git a/src/content/memo/262.md b/src/content/memo/262.md index c8c3c6c..937dcc1 100644 --- a/src/content/memo/262.md +++ b/src/content/memo/262.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['url', 'router'] status: draft ctime: 2023-04-12 diff --git a/src/content/memo/263.md b/src/content/memo/263.md index 9494bdc..4257ba5 100644 --- a/src/content/memo/263.md +++ b/src/content/memo/263.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['code-splitting', 'react'] status: draft ctime: 2023-05-01 diff --git a/src/content/memo/264.md b/src/content/memo/264.md index 6ee6504..f436131 100644 --- a/src/content/memo/264.md +++ b/src/content/memo/264.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['tree'] status: draft ctime: 2023-05-01 diff --git a/src/content/memo/265.md b/src/content/memo/265.md index 61fb9de..8836274 100644 --- a/src/content/memo/265.md +++ b/src/content/memo/265.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['font', 'next'] status: draft ctime: 2023-05-01 diff --git a/src/content/memo/266.md b/src/content/memo/266.md index 063a8fb..b40438e 100644 --- a/src/content/memo/266.md +++ b/src/content/memo/266.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['architecture', 'ddd'] status: draft ctime: 2023-05-01 diff --git a/src/content/memo/267.md b/src/content/memo/267.md index e5881e0..5440452 100644 --- a/src/content/memo/267.md +++ b/src/content/memo/267.md @@ -1,4 +1,5 @@ --- +type: note tags: ['prompt', 'llm'] status: draft ctime: 2023-05-01 diff --git a/src/content/memo/268.md b/src/content/memo/268.md index 4e4f793..2a7bef9 100644 --- a/src/content/memo/268.md +++ b/src/content/memo/268.md @@ -1,4 +1,5 @@ --- +type: note tags: ['performance', 'tachyon', 'prefetch', 'prerender'] status: release ctime: 2023-05-01 diff --git a/src/content/memo/269.md b/src/content/memo/269.md index 669e7d0..686eeac 100644 --- a/src/content/memo/269.md +++ b/src/content/memo/269.md @@ -1,4 +1,5 @@ --- +type: note tags: ['ui', 'react', 'zoom'] status: release ctime: 2023-05-14 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..b31ba12 100644 --- a/src/content/memo/271.md +++ b/src/content/memo/271.md @@ -1,4 +1,5 @@ --- +type: note tags: ['json', 'diff', 'deep-object-diff', 'json-diff', 'microdiff'] status: release ctime: 2023-05-18 diff --git a/src/content/memo/272.md b/src/content/memo/272.md index 3784178..421b252 100644 --- a/src/content/memo/272.md +++ b/src/content/memo/272.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['git', 'stacking', 'sapling'] status: release ctime: 2023-05-20 diff --git a/src/content/memo/273.md b/src/content/memo/273.md index bc4b24a..d34b72f 100644 --- a/src/content/memo/273.md +++ b/src/content/memo/273.md @@ -1,5 +1,6 @@ --- -tags: ['llm', 'bookmarks'] +type: bookmarks +tags: ['llm'] status: draft ctime: 2023-05-28 mtime: 2024-03-22 diff --git a/src/content/memo/274.md b/src/content/memo/274.md index 83af6d4..de13341 100644 --- a/src/content/memo/274.md +++ b/src/content/memo/274.md @@ -1,4 +1,5 @@ --- +type: note tags: ['terms', '버스-팩터'] status: release ctime: 2023-05-28 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..8775c6e 100644 --- a/src/content/memo/282.md +++ b/src/content/memo/282.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['spa', 'pwa', 'cache'] status: draft ctime: 2023-06-18 diff --git a/src/content/memo/283.md b/src/content/memo/283.md index 1aed787..81867ca 100644 --- a/src/content/memo/283.md +++ b/src/content/memo/283.md @@ -1,5 +1,6 @@ --- -tags: ['api', 'bookmarks'] +type: bookmarks +tags: ['api'] status: draft ctime: 2023-06-27 mtime: 2024-03-22 diff --git a/src/content/memo/284.mdx b/src/content/memo/284.mdx index 27068eb..a84406d 100644 --- a/src/content/memo/284.mdx +++ b/src/content/memo/284.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['prosemirror'] status: draft ctime: 2023-07-02 diff --git a/src/content/memo/285.md b/src/content/memo/285.md index 3e19b3a..04a5d8a 100644 --- a/src/content/memo/285.md +++ b/src/content/memo/285.md @@ -1,5 +1,6 @@ --- -tags: ['utility', 'bookmarks'] +type: bookmarks +tags: ['utility'] status: draft ctime: 2023-07-02 mtime: 2024-03-22 diff --git a/src/content/memo/286.md b/src/content/memo/286.md index 2b52b5a..686dac6 100644 --- a/src/content/memo/286.md +++ b/src/content/memo/286.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['select', 'ui'] status: draft ctime: 2023-07-02 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..c1ea795 100644 --- a/src/content/memo/288.md +++ b/src/content/memo/288.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['ast'] status: draft ctime: 2023-08-06 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..ab1becd 100644 --- a/src/content/memo/290.md +++ b/src/content/memo/290.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['form', 'ui'] status: draft ctime: 2023-08-07 diff --git a/src/content/memo/291.mdx b/src/content/memo/291.mdx index 8ee0897..0999f96 100644 --- a/src/content/memo/291.mdx +++ b/src/content/memo/291.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['effect'] status: draft ctime: 2023-08-13 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..1c98fc4 100644 --- a/src/content/memo/293.md +++ b/src/content/memo/293.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['autocomplete', 'ui'] status: draft ctime: 2023-08-28 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..82fa8b9 100644 --- a/src/content/memo/296.md +++ b/src/content/memo/296.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['signal'] status: draft ctime: 2023-09-20 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..3041da2 100644 --- a/src/content/memo/298.md +++ b/src/content/memo/298.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['pnpm'] status: draft ctime: 2023-12-16 diff --git a/src/content/memo/299.md b/src/content/memo/299.md index 67dfcc4..0315118 100644 --- a/src/content/memo/299.md +++ b/src/content/memo/299.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['ui', 'combobox'] status: draft ctime: 2023-12-17 diff --git a/src/content/memo/3.md b/src/content/memo/3.md index 8ade93f..e383433 100644 --- a/src/content/memo/3.md +++ b/src/content/memo/3.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['javascript', 'regex'] status: draft ctime: 2022-04-09 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..032630a 100644 --- a/src/content/memo/307.md +++ b/src/content/memo/307.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['react', 'suspense'] status: release ctime: 2024-06-24 diff --git a/src/content/memo/309.md b/src/content/memo/309.md index 1166939..f5a06b2 100644 --- a/src/content/memo/309.md +++ b/src/content/memo/309.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['enzyme', 'test', 'react-testing-library'] status: release ctime: 2024-07-11 diff --git a/src/content/memo/31.md b/src/content/memo/31.md index d81b343..13f948c 100644 --- a/src/content/memo/31.md +++ b/src/content/memo/31.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['drawing', 'ui'] status: draft ctime: 2022-04-09 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..cda057f 100644 --- a/src/content/memo/312.md +++ b/src/content/memo/312.md @@ -1,4 +1,5 @@ --- +type: note tags: ['excel', 'active-x-object', 'node'] status: release ctime: 2024-08-19 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..e779f52 100644 --- a/src/content/memo/32.md +++ b/src/content/memo/32.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['curtains', 'scrolltrigger', 'gsap', 'ui'] status: draft ctime: 2022-04-09 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..6891a41 100644 --- a/src/content/memo/327.md +++ b/src/content/memo/327.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['test', 'mocking', 'timers'] status: release ctime: 2024-12-31 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..1771321 100644 --- a/src/content/memo/329.md +++ b/src/content/memo/329.md @@ -1,4 +1,5 @@ --- +type: snippet tags: ['apps-script'] status: release ctime: 2024-12-31 diff --git a/src/content/memo/33.md b/src/content/memo/33.md index b2dda83..8ec18a1 100644 --- a/src/content/memo/33.md +++ b/src/content/memo/33.md @@ -1,5 +1,6 @@ --- -tags: ['react', 'bookmarks'] +type: bookmarks +tags: ['react'] status: draft 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..a738d52 100644 --- a/src/content/memo/34.md +++ b/src/content/memo/34.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['use-effect', 'use-layout-effect', 'react'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/340.md b/src/content/memo/340.md index 43acfd2..f4cdaeb 100644 --- a/src/content/memo/340.md +++ b/src/content/memo/340.md @@ -1,4 +1,5 @@ --- +type: note tags: ['sheets'] status: release ctime: 2025-01-01 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..3731034 100644 --- a/src/content/memo/35.md +++ b/src/content/memo/35.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['react', 'ref', 'use-ref'] status: draft ctime: 2022-04-09 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..f3a4721 100644 --- a/src/content/memo/353.md +++ b/src/content/memo/353.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['json'] status: draft ctime: 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..e5ed8cb 100644 --- a/src/content/memo/355.md +++ b/src/content/memo/355.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['event', 'bubbling', 'capturing'] status: draft ctime: 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..644ed36 100644 --- a/src/content/memo/359.md +++ b/src/content/memo/359.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['speculation'] status: draft ctime: 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..85e3f18 100644 --- a/src/content/memo/361.md +++ b/src/content/memo/361.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['spa'] status: draft ctime: 2025-01-12 diff --git a/src/content/memo/362.md b/src/content/memo/362.md index 002c05b..9069887 100644 --- a/src/content/memo/362.md +++ b/src/content/memo/362.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['keyboard'] status: draft ctime: 2025-01-12 diff --git a/src/content/memo/363.md b/src/content/memo/363.md index fdb0362..8527b40 100644 --- a/src/content/memo/363.md +++ b/src/content/memo/363.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['react-compiler'] status: draft ctime: 2025-01-13 diff --git a/src/content/memo/364.md b/src/content/memo/364.md index 943b5d1..fb31568 100644 --- a/src/content/memo/364.md +++ b/src/content/memo/364.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['scroll'] status: draft ctime: 2025-01-14 diff --git a/src/content/memo/365.md b/src/content/memo/365.md index 7254572..c291e70 100644 --- a/src/content/memo/365.md +++ b/src/content/memo/365.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['modal'] status: draft ctime: 2025-01-14 diff --git a/src/content/memo/366.md b/src/content/memo/366.md index fe92b39..f66f169 100644 --- a/src/content/memo/366.md +++ b/src/content/memo/366.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['sticky'] status: draft ctime: 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..482ec57 100644 --- a/src/content/memo/369.md +++ b/src/content/memo/369.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['monaco'] status: draft ctime: 2025-01-17 diff --git a/src/content/memo/37.md b/src/content/memo/37.md index 53ea507..0400551 100644 --- a/src/content/memo/37.md +++ b/src/content/memo/37.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['use-memo', 'react', 'memoization', 'use-callback'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/370.md b/src/content/memo/370.md index 88e6479..6565651 100644 --- a/src/content/memo/370.md +++ b/src/content/memo/370.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['font'] status: draft ctime: 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..2c632c5 100644 --- a/src/content/memo/384.md +++ b/src/content/memo/384.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['remote', 'react'] status: draft embed: https://stackblitz.com/edit/vitejs-vite-ag8h7uwy?file=src%2FApp.tsx 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..26ae5f6 100644 --- a/src/content/memo/387.md +++ b/src/content/memo/387.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['zig'] status: draft ctime: 2025-02-07 diff --git a/src/content/memo/388.md b/src/content/memo/388.md index fb34372..7557e9d 100644 --- a/src/content/memo/388.md +++ b/src/content/memo/388.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['i18n'] status: draft ctime: 2025-02-07 diff --git a/src/content/memo/389.md b/src/content/memo/389.md index b387b6f..ddc6adf 100644 --- a/src/content/memo/389.md +++ b/src/content/memo/389.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['terminal'] status: draft ctime: 2025-02-07 diff --git a/src/content/memo/39.md b/src/content/memo/39.md index f9156fb..e9cb87e 100644 --- a/src/content/memo/39.md +++ b/src/content/memo/39.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['react', 'redux', 'context'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/390.md b/src/content/memo/390.md index 4c3c456..94e50c3 100644 --- a/src/content/memo/390.md +++ b/src/content/memo/390.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['vite'] status: draft ctime: 2025-02-07 diff --git a/src/content/memo/391.md b/src/content/memo/391.md index 7d70e99..b416c68 100644 --- a/src/content/memo/391.md +++ b/src/content/memo/391.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['motion'] status: draft ctime: 2025-02-07 diff --git a/src/content/memo/392.md b/src/content/memo/392.md index 0cc9dd7..93b4cca 100644 --- a/src/content/memo/392.md +++ b/src/content/memo/392.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['icon'] status: draft ctime: 2025-02-08 diff --git a/src/content/memo/393.md b/src/content/memo/393.md index c1ee749..f1cad2d 100644 --- a/src/content/memo/393.md +++ b/src/content/memo/393.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['broadcast-channel'] status: draft ctime: 2025-02-08 diff --git a/src/content/memo/394.md b/src/content/memo/394.md index c4a4fd8..5aaa1f1 100644 --- a/src/content/memo/394.md +++ b/src/content/memo/394.md @@ -1,5 +1,6 @@ --- -tags: ['ffmpeg', 'bookmarks'] +type: bookmarks +tags: ['ffmpeg'] status: draft ctime: 2025-02-08 mtime: 2025-02-08 diff --git a/src/content/memo/395.md b/src/content/memo/395.md index 8767dcc..9a5fb06 100644 --- a/src/content/memo/395.md +++ b/src/content/memo/395.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['gui'] status: draft ctime: 2025-02-08 diff --git a/src/content/memo/396.md b/src/content/memo/396.md index 6bb0861..c1b82d8 100644 --- a/src/content/memo/396.md +++ b/src/content/memo/396.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['lexo-rank'] status: draft ctime: 2025-02-09 diff --git a/src/content/memo/397.md b/src/content/memo/397.md index a673d4e..cb61c5d 100644 --- a/src/content/memo/397.md +++ b/src/content/memo/397.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['cli'] status: draft ctime: 2025-02-09 diff --git a/src/content/memo/399.md b/src/content/memo/399.md index 7a5ea22..2453195 100644 --- a/src/content/memo/399.md +++ b/src/content/memo/399.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['aria'] status: draft ctime: 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..8e29d66 100644 --- a/src/content/memo/40.md +++ b/src/content/memo/40.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['react', 'suspense'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/400.md b/src/content/memo/400.md index bfddc0c..d6c6d37 100644 --- a/src/content/memo/400.md +++ b/src/content/memo/400.md @@ -1,5 +1,6 @@ --- -tags: ['aws', 'bookmarks'] +type: bookmarks +tags: ['aws'] status: draft ctime: 2025-02-09 mtime: 2025-02-09 diff --git a/src/content/memo/401.md b/src/content/memo/401.md index d198cb9..43e7137 100644 --- a/src/content/memo/401.md +++ b/src/content/memo/401.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['scroll'] status: draft ctime: 2025-02-11 diff --git a/src/content/memo/402.md b/src/content/memo/402.md index e8f23aa..d46df34 100644 --- a/src/content/memo/402.md +++ b/src/content/memo/402.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['clipboard'] status: draft ctime: 2025-02-11 diff --git a/src/content/memo/403.md b/src/content/memo/403.md index 6af62fb..1aeb3ed 100644 --- a/src/content/memo/403.md +++ b/src/content/memo/403.md @@ -1,5 +1,6 @@ --- -tags: ['webgl', 'bookmarks'] +type: bookmarks +tags: ['webgl'] status: draft ctime: 2025-02-14 mtime: 2025-02-14 diff --git a/src/content/memo/404.md b/src/content/memo/404.md index 3e16e52..a28b2b2 100644 --- a/src/content/memo/404.md +++ b/src/content/memo/404.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['typescript', 'branded-types'] status: draft ctime: 2025-02-14 diff --git a/src/content/memo/405.md b/src/content/memo/405.md index 6c0dc36..f0e58b7 100644 --- a/src/content/memo/405.md +++ b/src/content/memo/405.md @@ -1,5 +1,6 @@ --- -tags: ['astro', 'bookmarks'] +type: bookmarks +tags: ['astro'] status: draft ctime: 2025-02-14 mtime: 2025-02-14 diff --git a/src/content/memo/407.md b/src/content/memo/407.md index 63b4e24..8747d1b 100644 --- a/src/content/memo/407.md +++ b/src/content/memo/407.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['devtools'] status: draft ctime: 2025-02-14 diff --git a/src/content/memo/408.md b/src/content/memo/408.md index 0f8d6cf..61e2c53 100644 --- a/src/content/memo/408.md +++ b/src/content/memo/408.md @@ -1,5 +1,6 @@ --- -tags: ['electron', 'bookmarks'] +type: bookmarks +tags: ['electron'] status: draft ctime: 2025-02-14 mtime: 2025-02-14 diff --git a/src/content/memo/409.md b/src/content/memo/409.md index d93366b..cc86b82 100644 --- a/src/content/memo/409.md +++ b/src/content/memo/409.md @@ -1,5 +1,6 @@ --- -tags: ['dnd', 'bookmarks'] +type: bookmarks +tags: ['dnd'] status: draft ctime: 2025-02-14 mtime: 2025-02-14 diff --git a/src/content/memo/41.md b/src/content/memo/41.md index 29b85d2..43bedd8 100644 --- a/src/content/memo/41.md +++ b/src/content/memo/41.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['clone-element', 'react'] status: draft ctime: 2022-04-09 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..edc6b3b 100644 --- a/src/content/memo/411.md +++ b/src/content/memo/411.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['orama'] status: draft ctime: 2025-02-14 diff --git a/src/content/memo/412.md b/src/content/memo/412.md index 59acdda..1f83bda 100644 --- a/src/content/memo/412.md +++ b/src/content/memo/412.md @@ -1,5 +1,6 @@ --- -tags: ['cli', 'bookmarks'] +type: bookmarks +tags: ['cli'] status: draft ctime: 2025-02-14 mtime: 2025-02-14 diff --git a/src/content/memo/413.md b/src/content/memo/413.md index f188beb..6c5e99c 100644 --- a/src/content/memo/413.md +++ b/src/content/memo/413.md @@ -1,5 +1,6 @@ --- -tags: ['figma', 'bookmarks'] +type: bookmarks +tags: ['figma'] status: draft ctime: 2025-02-15 mtime: 2025-02-15 diff --git a/src/content/memo/415.md b/src/content/memo/415.md index 0dc55eb..9930086 100644 --- a/src/content/memo/415.md +++ b/src/content/memo/415.md @@ -1,5 +1,6 @@ --- -tags: ['extension', 'bookmarks'] +type: bookmarks +tags: ['extension'] status: draft ctime: 2025-02-15 mtime: 2025-02-15 diff --git a/src/content/memo/416.md b/src/content/memo/416.md index c44851c..48a8141 100644 --- a/src/content/memo/416.md +++ b/src/content/memo/416.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['msfs'] status: draft ctime: 2025-02-15 diff --git a/src/content/memo/417.md b/src/content/memo/417.md index 7e57352..273807b 100644 --- a/src/content/memo/417.md +++ b/src/content/memo/417.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['render'] status: draft ctime: 2025-02-15 diff --git a/src/content/memo/418.md b/src/content/memo/418.md index 0ead7f3..c8587bb 100644 --- a/src/content/memo/418.md +++ b/src/content/memo/418.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['db'] status: draft ctime: 2025-02-17 diff --git a/src/content/memo/419.md b/src/content/memo/419.md index e928440..80fec4c 100644 --- a/src/content/memo/419.md +++ b/src/content/memo/419.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['crdt'] status: draft ctime: 2025-02-17 diff --git a/src/content/memo/42.md b/src/content/memo/42.md index f2b34ff..3cb5938 100644 --- a/src/content/memo/42.md +++ b/src/content/memo/42.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['react', 'icon', 'svg'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/420.md b/src/content/memo/420.md index dd7de7c..9948d2d 100644 --- a/src/content/memo/420.md +++ b/src/content/memo/420.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['analytics'] status: draft ctime: 2025-02-17 diff --git a/src/content/memo/421.md b/src/content/memo/421.md index b3f7aff..57ed611 100644 --- a/src/content/memo/421.md +++ b/src/content/memo/421.md @@ -1,5 +1,6 @@ --- -tags: ['wasm', 'bookmarks'] +type: bookmarks +tags: ['wasm'] status: draft ctime: 2025-02-17 mtime: 2025-02-17 diff --git a/src/content/memo/423.md b/src/content/memo/423.md index 7c7eb8d..bc8897b 100644 --- a/src/content/memo/423.md +++ b/src/content/memo/423.md @@ -1,5 +1,6 @@ --- -tags: ['auth', 'bookmarks'] +type: bookmarks +tags: ['auth'] status: draft ctime: 2025-02-17 mtime: 2025-02-17 diff --git a/src/content/memo/424.md b/src/content/memo/424.md index e4a113c..e6d02fd 100644 --- a/src/content/memo/424.md +++ b/src/content/memo/424.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['epub'] status: draft ctime: 2025-02-17 diff --git a/src/content/memo/425.md b/src/content/memo/425.md index 55670c3..1c76ded 100644 --- a/src/content/memo/425.md +++ b/src/content/memo/425.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['form'] status: draft ctime: 2025-02-17 diff --git a/src/content/memo/426.md b/src/content/memo/426.md index 402ba7c..8bd7e51 100644 --- a/src/content/memo/426.md +++ b/src/content/memo/426.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['mock'] status: draft ctime: 2025-02-17 diff --git a/src/content/memo/428.md b/src/content/memo/428.md index d2ad49a..e40ccee 100644 --- a/src/content/memo/428.md +++ b/src/content/memo/428.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['astro'] status: draft ctime: 2025-03-02 diff --git a/src/content/memo/429.md b/src/content/memo/429.md index 3d89b05..93dc666 100644 --- a/src/content/memo/429.md +++ b/src/content/memo/429.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['error', 'messages'] status: draft ctime: 2025-03-02 diff --git a/src/content/memo/43.md b/src/content/memo/43.md index d3d61bf..81b4637 100644 --- a/src/content/memo/43.md +++ b/src/content/memo/43.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['react', 'styled-components', 'responsive'] status: draft ctime: 2022-04-09 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..881031f 100644 --- a/src/content/memo/432.mdx +++ b/src/content/memo/432.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['gleam'] status: draft ctime: 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..f0e43e1 100644 --- a/src/content/memo/436.mdx +++ b/src/content/memo/436.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['Haskell'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/437.md b/src/content/memo/437.md index 847e021..2796a74 100644 --- a/src/content/memo/437.md +++ b/src/content/memo/437.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['open-api'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/438.mdx b/src/content/memo/438.mdx index 02fe33e..edecde6 100644 --- a/src/content/memo/438.mdx +++ b/src/content/memo/438.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['rust'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/439.mdx b/src/content/memo/439.mdx index f6a97e3..5ea8d29 100644 --- a/src/content/memo/439.mdx +++ b/src/content/memo/439.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['PEG', 'Peggy', 'Ohm'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/44.md b/src/content/memo/44.md index c7b7b31..a62e0fc 100644 --- a/src/content/memo/44.md +++ b/src/content/memo/44.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['react', 'server-components'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/440.mdx b/src/content/memo/440.mdx index c7cb35f..e010145 100644 --- a/src/content/memo/440.mdx +++ b/src/content/memo/440.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['convex'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/441.mdx b/src/content/memo/441.mdx index 99f4aaf..40b1a11 100644 --- a/src/content/memo/441.mdx +++ b/src/content/memo/441.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['generator', 'javascript'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/442.mdx b/src/content/memo/442.mdx index 2ce37fa..8e64031 100644 --- a/src/content/memo/442.mdx +++ b/src/content/memo/442.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['zod'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/443.md b/src/content/memo/443.md index f8842dd..773fef0 100644 --- a/src/content/memo/443.md +++ b/src/content/memo/443.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['HMR'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/444.md b/src/content/memo/444.md index 610f2db..1e13559 100644 --- a/src/content/memo/444.md +++ b/src/content/memo/444.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['debug'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/445.md b/src/content/memo/445.md index 8bfb18d..55e66b3 100644 --- a/src/content/memo/445.md +++ b/src/content/memo/445.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['tooltip'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/446.md b/src/content/memo/446.md index c6e9a2a..63e4874 100644 --- a/src/content/memo/446.md +++ b/src/content/memo/446.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['a11y'] status: draft ctime: 2025-03-03 diff --git a/src/content/memo/447.md b/src/content/memo/447.md index a0c7103..36e4ba6 100644 --- a/src/content/memo/447.md +++ b/src/content/memo/447.md @@ -1,5 +1,6 @@ --- -tags: ['learn', 'bookmarks'] +type: bookmarks +tags: ['learn'] status: draft ctime: 2025-03-03 mtime: 2025-03-03 diff --git a/src/content/memo/448.md b/src/content/memo/448.md index fbfd30f..27c87e4 100644 --- a/src/content/memo/448.md +++ b/src/content/memo/448.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['img'] status: draft ctime: 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..3198832 100644 --- a/src/content/memo/45.md +++ b/src/content/memo/45.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['react', 'state', 'state-machine'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/450.mdx b/src/content/memo/450.mdx index c4cf975..443d1ea 100644 --- a/src/content/memo/450.mdx +++ b/src/content/memo/450.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['val'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/451.mdx b/src/content/memo/451.mdx index 92fe357..9b3c142 100644 --- a/src/content/memo/451.mdx +++ b/src/content/memo/451.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['service-worker'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/452.mdx b/src/content/memo/452.mdx index 0e59e20..6209776 100644 --- a/src/content/memo/452.mdx +++ b/src/content/memo/452.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['devtools'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/453.md b/src/content/memo/453.md index e890592..544c4d9 100644 --- a/src/content/memo/453.md +++ b/src/content/memo/453.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['llm'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/454.mdx b/src/content/memo/454.mdx index 2d09799..fd4ff70 100644 --- a/src/content/memo/454.mdx +++ b/src/content/memo/454.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['thread'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/455.mdx b/src/content/memo/455.mdx index e09ed1c..bce7fbc 100644 --- a/src/content/memo/455.mdx +++ b/src/content/memo/455.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['audio'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/457.mdx b/src/content/memo/457.mdx index a98da0e..d18a5ae 100644 --- a/src/content/memo/457.mdx +++ b/src/content/memo/457.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['web-authn'] status: draft ctime: 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..5f64e77 100644 --- a/src/content/memo/459.mdx +++ b/src/content/memo/459.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['slot'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/46.md b/src/content/memo/46.md index a3e0e69..958b291 100644 --- a/src/content/memo/46.md +++ b/src/content/memo/46.md @@ -1,4 +1,5 @@ --- +type: note tags: ['composition', 'react'] status: release ctime: 2022-04-09 diff --git a/src/content/memo/460.md b/src/content/memo/460.md index 14233d8..8f741ef 100644 --- a/src/content/memo/460.md +++ b/src/content/memo/460.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['video', 'transparency'] status: draft ctime: 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..559c526 100644 --- a/src/content/memo/464.md +++ b/src/content/memo/464.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['react-query'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/465.md b/src/content/memo/465.md index 90c2e51..113ac98 100644 --- a/src/content/memo/465.md +++ b/src/content/memo/465.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['modal', 'ios'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/466.mdx b/src/content/memo/466.mdx index 1c2019e..d80f709 100644 --- a/src/content/memo/466.mdx +++ b/src/content/memo/466.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['promise'] status: draft ctime: 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..87e2b5b 100644 --- a/src/content/memo/468.mdx +++ b/src/content/memo/468.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['figma'] status: draft ctime: 2025-03-04 diff --git a/src/content/memo/469.md b/src/content/memo/469.md index 774793f..0aadf7f 100644 --- a/src/content/memo/469.md +++ b/src/content/memo/469.md @@ -1,5 +1,6 @@ --- -tags: ['design-system', 'bookmarks'] +type: bookmarks +tags: ['design-system'] status: draft 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..52edfde 100644 --- a/src/content/memo/470.mdx +++ b/src/content/memo/470.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['react', 'rsc'] status: draft ctime: 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..e721ad6 100644 --- a/src/content/memo/473.mdx +++ b/src/content/memo/473.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['playwright'] status: draft ctime: 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..868b562 100644 --- a/src/content/memo/475.md +++ b/src/content/memo/475.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['viewport'] status: draft ctime: 2025-03-05 diff --git a/src/content/memo/476.mdx b/src/content/memo/476.mdx index 5b0798d..ab7eab8 100644 --- a/src/content/memo/476.mdx +++ b/src/content/memo/476.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['resize-observer'] status: draft ctime: 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..e31fed8 100644 --- a/src/content/memo/478.mdx +++ b/src/content/memo/478.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['OCaml'] status: draft ctime: 2025-03-05 diff --git a/src/content/memo/479.mdx b/src/content/memo/479.mdx index 792cfae..45efaa0 100644 --- a/src/content/memo/479.mdx +++ b/src/content/memo/479.mdx @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['next', 'css'] status: draft ctime: 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..69509d3 100644 --- a/src/content/memo/494.md +++ b/src/content/memo/494.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['config'] status: draft ctime: 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..8467941 100644 --- a/src/content/memo/50.md +++ b/src/content/memo/50.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['create-react-app', 'react', 'craco', 'react-app-rewired'] status: draft ctime: 2022-04-09 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..e067c63 100644 --- a/src/content/memo/54.md +++ b/src/content/memo/54.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['token'] status: draft ctime: 2022-04-09 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..674312d 100644 --- a/src/content/memo/56.md +++ b/src/content/memo/56.md @@ -1,4 +1,5 @@ --- +type: note tags: ['promise', 'javascript'] status: release ctime: 2022-04-09 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..52cb467 100644 --- a/src/content/memo/57.mdx +++ b/src/content/memo/57.mdx @@ -1,5 +1,6 @@ --- -tags: ['node', 'bookmarks'] +type: bookmarks +tags: ['node'] status: release ctime: 2022-04-09 mtime: 2024-03-22 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 index 834ac8c..46c1e59 100644 --- a/src/content/memo/577.md +++ b/src/content/memo/577.md @@ -1,4 +1,5 @@ --- +type: note tags: ['okf', 'frontmatter', 'metadata'] status: draft ctime: 2026-07-27 @@ -34,7 +35,9 @@ const STRUCTURAL_TAGS = new Set(['bookmarks']) 다만 `generated.by`로 사람/AI를 구분하는 건 여기서도 의미가 있다. CLAUDE.md가 이미 "AI로 정리하면 일반적으로 인상적인 디테일로 흐른다"고 경고하는 지점이 결국 provenance 문제다. -씨앗: `type`을 스키마에 넣으면 `STRUCTURAL_TAGS` 삭제 + 유형별 목록이 딸려 나온다. +적용: `type`은 **형태만** 담기로 했다 — `bookmarks` / `snippet` / `note`. `debug` 같은 목적은 주제니까 태그에 남긴다. 542개 백필하면서 `STRUCTURAL_TAGS`도 삭제. + +백필 규칙을 태그로 검증할 수 있었던 게 뜻밖의 수확. 예전에 손으로 `bookmarks` 태그를 붙여둔 33개가 정답지 역할을 했고, 처음 규칙은 그중 10개를 놓쳤다 — 링크 1개짜리 메모. 내 기준에선 **링크 하나만 저장해둔 것도 링크 모음**이었다는 걸 규칙을 고치면서 알았다. --- 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..6d17767 100644 --- a/src/content/memo/61.md +++ b/src/content/memo/61.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['node', 'id3'] status: draft ctime: 2022-04-09 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..13561ce 100644 --- a/src/content/memo/67.md +++ b/src/content/memo/67.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['debug'] status: draft ctime: 2022-04-09 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..9f96b61 100644 --- a/src/content/memo/73.md +++ b/src/content/memo/73.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['command', 'shell'] status: draft ctime: 2022-04-09 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..ed07e5d 100644 --- a/src/content/memo/76.md +++ b/src/content/memo/76.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['api'] status: draft ctime: 2022-04-09 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..c2d5b14 100644 --- a/src/content/memo/80.md +++ b/src/content/memo/80.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['api'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/81.md b/src/content/memo/81.md index 5cb888c..1ceed1f 100644 --- a/src/content/memo/81.md +++ b/src/content/memo/81.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['rest', 'api'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/82.md b/src/content/memo/82.md index cb600e3..07501c5 100644 --- a/src/content/memo/82.md +++ b/src/content/memo/82.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['geolocation', 'docs'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/83.md b/src/content/memo/83.md index bce5659..2e4f063 100644 --- a/src/content/memo/83.md +++ b/src/content/memo/83.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['api', 'github'] status: release ctime: 2022-04-09 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..6cd3f42 100644 --- a/src/content/memo/86.md +++ b/src/content/memo/86.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['scroll'] status: draft ctime: 2022-04-09 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..a0627ea 100644 --- a/src/content/memo/88.md +++ b/src/content/memo/88.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['scroll'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/89.md b/src/content/memo/89.md index 80d03c8..3c125c6 100644 --- a/src/content/memo/89.md +++ b/src/content/memo/89.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['scroll', 'scrollspy'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/9.md b/src/content/memo/9.md index 4196f98..8a00f47 100644 --- a/src/content/memo/9.md +++ b/src/content/memo/9.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['javascript', 'record', 'tuple'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/90.md b/src/content/memo/90.md index ed74c65..fe33ba8 100644 --- a/src/content/memo/90.md +++ b/src/content/memo/90.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['puppeteer'] status: draft ctime: 2022-04-09 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..67b0a9f 100644 --- a/src/content/memo/94.md +++ b/src/content/memo/94.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['tools'] status: draft ctime: 2022-04-09 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..349c93a 100644 --- a/src/content/memo/98.md +++ b/src/content/memo/98.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['sketch'] status: draft ctime: 2022-04-09 diff --git a/src/content/memo/99.md b/src/content/memo/99.md index 200ad07..8bb8388 100644 --- a/src/content/memo/99.md +++ b/src/content/memo/99.md @@ -1,4 +1,5 @@ --- +type: bookmarks tags: ['analytics', 'search-console'] status: draft ctime: 2022-04-09 From a8da78ad8e9d6ece0d4e41d019832858d72d01ed Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 08:35:06 +0000 Subject: [PATCH 03/22] =?UTF-8?q?memo:=20archive=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EB=8F=84=EC=9E=85=20=E2=80=94=20draft=EC=9D=98=20=EC=9D=B4?= =?UTF-8?q?=EC=A4=91=20=EC=9D=98=EB=AF=B8=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit draft가 "작성 중"과 "공개 안 함" 두 뜻으로 쓰이고 있었다. bookmarks 274개 중 231개(84%)가 draft였는데, 링크 모음에는 "작성 중"이라는 상태가 없다 — 붙여넣은 순간이 최종형이다. 그 결과 작성 중 큐 268개가 완성될 일 없는 링크로 막혀 있었다. - status에 archive 추가 (draft: 작성 중 / archive: 보관) - bookmarks의 draft 231개 → archive 작성 중 큐 268 → 37, 공개(release) 274개는 변화 없음 - /memos/archive 추가 (draft.astro와 동일한 dev 전용 뷰) - CLAUDE.md: Status 기준 + Type A 템플릿 + 워크플로우 갱신 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- CLAUDE.md | 18 ++++++++++++------ src/content.config.ts | 2 +- src/content/memo/10.md | 2 +- src/content/memo/100.md | 2 +- src/content/memo/109.md | 2 +- src/content/memo/110.md | 2 +- src/content/memo/111.md | 2 +- src/content/memo/112.md | 2 +- src/content/memo/113.md | 2 +- src/content/memo/114.md | 2 +- src/content/memo/115.md | 2 +- src/content/memo/116.md | 2 +- src/content/memo/117.md | 2 +- src/content/memo/118.md | 2 +- src/content/memo/119.md | 2 +- src/content/memo/12.md | 2 +- src/content/memo/120.md | 2 +- src/content/memo/121.md | 2 +- src/content/memo/123.md | 2 +- src/content/memo/125.md | 2 +- src/content/memo/126.md | 2 +- src/content/memo/127.md | 2 +- src/content/memo/129.md | 2 +- src/content/memo/13.md | 2 +- src/content/memo/130.md | 2 +- src/content/memo/131.md | 2 +- src/content/memo/135.md | 2 +- src/content/memo/136.md | 2 +- src/content/memo/137.md | 2 +- src/content/memo/138.md | 2 +- src/content/memo/139.md | 2 +- src/content/memo/14.md | 2 +- src/content/memo/140.md | 2 +- src/content/memo/141.md | 2 +- src/content/memo/142.md | 2 +- src/content/memo/144.md | 2 +- src/content/memo/150.md | 2 +- src/content/memo/151.md | 2 +- src/content/memo/153.md | 2 +- src/content/memo/154.md | 2 +- src/content/memo/155.md | 2 +- src/content/memo/156.md | 2 +- src/content/memo/157.md | 2 +- src/content/memo/158.md | 2 +- src/content/memo/16.md | 2 +- src/content/memo/165.md | 2 +- src/content/memo/169.md | 2 +- src/content/memo/17.md | 2 +- src/content/memo/170.md | 2 +- src/content/memo/171.md | 2 +- src/content/memo/174.md | 2 +- src/content/memo/175.md | 2 +- src/content/memo/176.md | 2 +- src/content/memo/177.md | 2 +- src/content/memo/178.md | 2 +- src/content/memo/179.md | 2 +- src/content/memo/18.md | 2 +- src/content/memo/180.md | 2 +- src/content/memo/181.md | 2 +- src/content/memo/184.md | 2 +- src/content/memo/185.md | 2 +- src/content/memo/186.md | 2 +- src/content/memo/188.md | 2 +- src/content/memo/192.md | 2 +- src/content/memo/194.md | 2 +- src/content/memo/195.md | 2 +- src/content/memo/196.md | 2 +- src/content/memo/198.md | 2 +- src/content/memo/2.md | 2 +- src/content/memo/20.md | 2 +- src/content/memo/204.md | 2 +- src/content/memo/205.md | 2 +- src/content/memo/206.md | 2 +- src/content/memo/211.md | 2 +- src/content/memo/212.md | 2 +- src/content/memo/215.md | 2 +- src/content/memo/216.md | 2 +- src/content/memo/217.md | 2 +- src/content/memo/219.md | 2 +- src/content/memo/220.md | 2 +- src/content/memo/224.md | 2 +- src/content/memo/225.md | 2 +- src/content/memo/230.md | 2 +- src/content/memo/236.md | 2 +- src/content/memo/239.md | 2 +- src/content/memo/240.md | 2 +- src/content/memo/241.md | 2 +- src/content/memo/242.md | 2 +- src/content/memo/244.md | 2 +- src/content/memo/245.md | 2 +- src/content/memo/246.md | 2 +- src/content/memo/248.md | 2 +- src/content/memo/25.md | 2 +- src/content/memo/251.md | 2 +- src/content/memo/253.md | 2 +- src/content/memo/258.md | 2 +- src/content/memo/259.md | 2 +- src/content/memo/26.md | 2 +- src/content/memo/260.mdx | 2 +- src/content/memo/261.md | 2 +- src/content/memo/262.md | 2 +- src/content/memo/263.md | 2 +- src/content/memo/264.md | 2 +- src/content/memo/265.md | 2 +- src/content/memo/266.md | 2 +- src/content/memo/273.md | 2 +- src/content/memo/282.md | 2 +- src/content/memo/283.md | 2 +- src/content/memo/284.mdx | 2 +- src/content/memo/285.md | 2 +- src/content/memo/286.md | 2 +- src/content/memo/288.md | 2 +- src/content/memo/290.md | 2 +- src/content/memo/291.mdx | 2 +- src/content/memo/293.md | 2 +- src/content/memo/296.md | 2 +- src/content/memo/298.md | 2 +- src/content/memo/299.md | 2 +- src/content/memo/3.md | 2 +- src/content/memo/31.md | 2 +- src/content/memo/32.md | 2 +- src/content/memo/33.md | 2 +- src/content/memo/34.md | 2 +- src/content/memo/35.md | 2 +- src/content/memo/353.md | 2 +- src/content/memo/355.md | 2 +- src/content/memo/359.md | 2 +- src/content/memo/361.md | 2 +- src/content/memo/362.md | 2 +- src/content/memo/363.md | 2 +- src/content/memo/364.md | 2 +- src/content/memo/365.md | 2 +- src/content/memo/366.md | 2 +- src/content/memo/369.md | 2 +- src/content/memo/37.md | 2 +- src/content/memo/370.md | 2 +- src/content/memo/384.md | 2 +- src/content/memo/387.md | 2 +- src/content/memo/388.md | 2 +- src/content/memo/389.md | 2 +- src/content/memo/39.md | 2 +- src/content/memo/390.md | 2 +- src/content/memo/391.md | 2 +- src/content/memo/392.md | 2 +- src/content/memo/393.md | 2 +- src/content/memo/394.md | 2 +- src/content/memo/395.md | 2 +- src/content/memo/396.md | 2 +- src/content/memo/397.md | 2 +- src/content/memo/399.md | 2 +- src/content/memo/40.md | 2 +- src/content/memo/400.md | 2 +- src/content/memo/401.md | 2 +- src/content/memo/402.md | 2 +- src/content/memo/403.md | 2 +- src/content/memo/404.md | 2 +- src/content/memo/405.md | 2 +- src/content/memo/407.md | 2 +- src/content/memo/408.md | 2 +- src/content/memo/409.md | 2 +- src/content/memo/41.md | 2 +- src/content/memo/411.md | 2 +- src/content/memo/412.md | 2 +- src/content/memo/413.md | 2 +- src/content/memo/415.md | 2 +- src/content/memo/416.md | 2 +- src/content/memo/417.md | 2 +- src/content/memo/418.md | 2 +- src/content/memo/419.md | 2 +- src/content/memo/42.md | 2 +- src/content/memo/420.md | 2 +- src/content/memo/421.md | 2 +- src/content/memo/423.md | 2 +- src/content/memo/424.md | 2 +- src/content/memo/425.md | 2 +- src/content/memo/426.md | 2 +- src/content/memo/428.md | 2 +- src/content/memo/429.md | 2 +- src/content/memo/43.md | 2 +- src/content/memo/432.mdx | 2 +- src/content/memo/436.mdx | 2 +- src/content/memo/437.md | 2 +- src/content/memo/438.mdx | 2 +- src/content/memo/439.mdx | 2 +- src/content/memo/44.md | 2 +- src/content/memo/440.mdx | 2 +- src/content/memo/441.mdx | 2 +- src/content/memo/442.mdx | 2 +- src/content/memo/443.md | 2 +- src/content/memo/444.md | 2 +- src/content/memo/445.md | 2 +- src/content/memo/446.md | 2 +- src/content/memo/447.md | 2 +- src/content/memo/448.md | 2 +- src/content/memo/45.md | 2 +- src/content/memo/450.mdx | 2 +- src/content/memo/451.mdx | 2 +- src/content/memo/452.mdx | 2 +- src/content/memo/453.md | 2 +- src/content/memo/454.mdx | 2 +- src/content/memo/455.mdx | 2 +- src/content/memo/457.mdx | 2 +- src/content/memo/459.mdx | 2 +- src/content/memo/460.md | 2 +- src/content/memo/464.md | 2 +- src/content/memo/465.md | 2 +- src/content/memo/466.mdx | 2 +- src/content/memo/468.mdx | 2 +- src/content/memo/469.md | 2 +- src/content/memo/470.mdx | 2 +- src/content/memo/473.mdx | 2 +- src/content/memo/475.md | 2 +- src/content/memo/476.mdx | 2 +- src/content/memo/478.mdx | 2 +- src/content/memo/479.mdx | 2 +- src/content/memo/494.md | 2 +- src/content/memo/50.md | 2 +- src/content/memo/54.md | 2 +- src/content/memo/61.md | 2 +- src/content/memo/67.md | 2 +- src/content/memo/73.md | 2 +- src/content/memo/76.md | 2 +- src/content/memo/80.md | 2 +- src/content/memo/81.md | 2 +- src/content/memo/82.md | 2 +- src/content/memo/86.md | 2 +- src/content/memo/88.md | 2 +- src/content/memo/89.md | 2 +- src/content/memo/9.md | 2 +- src/content/memo/90.md | 2 +- src/content/memo/94.md | 2 +- src/content/memo/98.md | 2 +- src/content/memo/99.md | 2 +- src/pages/memos/archive.astro | 34 ++++++++++++++++++++++++++++++++++ 234 files changed, 278 insertions(+), 238 deletions(-) create mode 100644 src/pages/memos/archive.astro diff --git a/CLAUDE.md b/CLAUDE.md index 6641020..acd8f95 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -57,7 +57,7 @@ --- 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: 제목 # 선택 @@ -80,7 +80,7 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' - **thread**: `parent` 체인을 따라가면 도출됨 - **branch**: 같은 `parent`를 가진 메모가 2개 이상 = 자동 분기 (별도 표기 불필요) - **supersedes**: `relation: supersedes`면 부모 페이지에 "대체됨" 경고 표시 -- `parent`는 `release` 메모만 해석됨 (draft는 공개되지 않음) +- `parent`는 `release` 메모만 해석됨 (draft·archive는 공개되지 않음) ### Type 기준 @@ -99,9 +99,14 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' | 값 | 의미 | |---|---| -| `draft` | 작성 중, 비공개 | +| `draft` | 작성 중, 비공개 (완성 예정) | +| `archive` | 저장/보관, 비공개 (완성 예정 없음) | | `release` | 완성됨, 공개 가능 | +- **`bookmarks`는 `draft`를 쓰지 않는다.** 링크는 붙여넣은 순간이 최종형이라 "작성 중"이 없다 → `archive`(보관) 아니면 `release`(공개). +- `draft`를 "공개 안 함"으로 쓰면 안 된다. 그러면 작성 중 큐가 방치된 메모로 막힌다 (231개가 그랬다 → 577.md). +- 비공개 목록은 로컬에서만 보인다: `/memos/draft`, `/memos/archive` (프로덕션에서는 비어 있음) + ### 태그 규칙 - **네이밍**: kebab-case @@ -156,7 +161,7 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' --- type: bookmarks tags: ['keyword'] -status: draft +status: archive ctime: YYYY-MM-DD mtime: YYYY-MM-DD --- @@ -325,12 +330,12 @@ mtime: YYYY-MM-DD 3. **유형 선택**: 위 템플릿 중 적절한 것 선택 4. **type 지정**: `bookmarks` / `snippet` / `note` (형태) 5. **태그 지정**: kebab-case로 관련 태그 추가 (주제) -6. **status**: 작성 중이면 `draft`, 완성되면 `release` +6. **status**: 작성 중이면 `draft`, 저장만 해두면 `archive`, 완성되면 `release` ### 메모 수정 1. `mtime` 업데이트 -2. 필요시 `status` 변경 (draft → release) +2. 필요시 `status` 변경 (draft → release, archive → release) --- @@ -339,4 +344,5 @@ mtime: YYYY-MM-DD - 태그 정규화: 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/src/content.config.ts b/src/content.config.ts index c9c5e61..8ae0fb8 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -8,7 +8,7 @@ const memo = defineCollection({ 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(), diff --git a/src/content/memo/10.md b/src/content/memo/10.md index df7c256..3c1f0cf 100644 --- a/src/content/memo/10.md +++ b/src/content/memo/10.md @@ -1,7 +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 365d8c9..7c0c8cf 100644 --- a/src/content/memo/100.md +++ b/src/content/memo/100.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['git'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/109.md b/src/content/memo/109.md index 7a8e1ec..eb89f91 100644 --- a/src/content/memo/109.md +++ b/src/content/memo/109.md @@ -1,7 +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/110.md b/src/content/memo/110.md index 100cd9b..b196a9b 100644 --- a/src/content/memo/110.md +++ b/src/content/memo/110.md @@ -1,7 +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 4c49f52..d0f8576 100644 --- a/src/content/memo/111.md +++ b/src/content/memo/111.md @@ -1,7 +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 fd24c32..a9bf7b8 100644 --- a/src/content/memo/112.md +++ b/src/content/memo/112.md @@ -1,7 +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 f0f3fc1..0ae20c2 100644 --- a/src/content/memo/113.md +++ b/src/content/memo/113.md @@ -1,7 +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 40c2229..8941c33 100644 --- a/src/content/memo/114.md +++ b/src/content/memo/114.md @@ -1,7 +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 334597c..50970be 100644 --- a/src/content/memo/115.md +++ b/src/content/memo/115.md @@ -1,7 +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 f681266..22b75e2 100644 --- a/src/content/memo/116.md +++ b/src/content/memo/116.md @@ -1,7 +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 84d9f2f..0bc9442 100644 --- a/src/content/memo/117.md +++ b/src/content/memo/117.md @@ -1,7 +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 37d7c7e..d564364 100644 --- a/src/content/memo/118.md +++ b/src/content/memo/118.md @@ -1,7 +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 90e499b..898b680 100644 --- a/src/content/memo/119.md +++ b/src/content/memo/119.md @@ -1,7 +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 ec8259f..92f8a18 100644 --- a/src/content/memo/12.md +++ b/src/content/memo/12.md @@ -1,7 +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 2ebd8bc..feea3f1 100644 --- a/src/content/memo/120.md +++ b/src/content/memo/120.md @@ -1,7 +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 0c66dfa..fd5e84f 100644 --- a/src/content/memo/121.md +++ b/src/content/memo/121.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['image'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/123.md b/src/content/memo/123.md index 81dddcb..8e9490d 100644 --- a/src/content/memo/123.md +++ b/src/content/memo/123.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['json', 'search'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/125.md b/src/content/memo/125.md index bb7b0ea..a54a803 100644 --- a/src/content/memo/125.md +++ b/src/content/memo/125.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['json', 'grpc', 'protobuf'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/126.md b/src/content/memo/126.md index ad905bc..da20026 100644 --- a/src/content/memo/126.md +++ b/src/content/memo/126.md @@ -1,7 +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 2eb4b65..7c7dd70 100644 --- a/src/content/memo/127.md +++ b/src/content/memo/127.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['extensions'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/129.md b/src/content/memo/129.md index 9fec19c..b7b801f 100644 --- a/src/content/memo/129.md +++ b/src/content/memo/129.md @@ -1,7 +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 2a159fd..c26202f 100644 --- a/src/content/memo/13.md +++ b/src/content/memo/13.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['typescript'] -status: draft +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 e4c188b..f643f42 100644 --- a/src/content/memo/130.md +++ b/src/content/memo/130.md @@ -1,7 +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 9aea7d1..250dcb7 100644 --- a/src/content/memo/131.md +++ b/src/content/memo/131.md @@ -1,7 +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/135.md b/src/content/memo/135.md index cc2e2d4..a978ef8 100644 --- a/src/content/memo/135.md +++ b/src/content/memo/135.md @@ -1,7 +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 cae4376..e9e7375 100644 --- a/src/content/memo/136.md +++ b/src/content/memo/136.md @@ -1,7 +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 92d59f5..5ffc606 100644 --- a/src/content/memo/137.md +++ b/src/content/memo/137.md @@ -1,7 +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 be6a6e6..cef92a5 100644 --- a/src/content/memo/138.md +++ b/src/content/memo/138.md @@ -1,7 +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 d0fad93..5e27e8c 100644 --- a/src/content/memo/139.md +++ b/src/content/memo/139.md @@ -1,7 +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 76125f0..0465a73 100644 --- a/src/content/memo/14.md +++ b/src/content/memo/14.md @@ -1,7 +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 ef1fee2..50e5139 100644 --- a/src/content/memo/140.md +++ b/src/content/memo/140.md @@ -1,7 +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 b3e758f..ac6dc96 100644 --- a/src/content/memo/141.md +++ b/src/content/memo/141.md @@ -1,7 +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 49fe57f..ef1787b 100644 --- a/src/content/memo/142.md +++ b/src/content/memo/142.md @@ -1,7 +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/144.md b/src/content/memo/144.md index a701d4d..212f351 100644 --- a/src/content/memo/144.md +++ b/src/content/memo/144.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['uri', '딥링크'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/150.md b/src/content/memo/150.md index acf22b1..343f729 100644 --- a/src/content/memo/150.md +++ b/src/content/memo/150.md @@ -1,7 +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 eca7812..2f99f9f 100644 --- a/src/content/memo/151.md +++ b/src/content/memo/151.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['gsap'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/153.md b/src/content/memo/153.md index 99a6d75..3439e4d 100644 --- a/src/content/memo/153.md +++ b/src/content/memo/153.md @@ -1,7 +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 87d0817..dc8a7e1 100644 --- a/src/content/memo/154.md +++ b/src/content/memo/154.md @@ -1,7 +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 d365f54..242058c 100644 --- a/src/content/memo/155.md +++ b/src/content/memo/155.md @@ -1,7 +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 77fb6ca..aa0d61a 100644 --- a/src/content/memo/156.md +++ b/src/content/memo/156.md @@ -1,7 +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 2be10f2..3922668 100644 --- a/src/content/memo/157.md +++ b/src/content/memo/157.md @@ -1,7 +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 d2d0651..f923c96 100644 --- a/src/content/memo/158.md +++ b/src/content/memo/158.md @@ -1,7 +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/16.md b/src/content/memo/16.md index 734dc82..0ab14cb 100644 --- a/src/content/memo/16.md +++ b/src/content/memo/16.md @@ -1,7 +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/165.md b/src/content/memo/165.md index 204c6bd..2c2deed 100644 --- a/src/content/memo/165.md +++ b/src/content/memo/165.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['input'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/169.md b/src/content/memo/169.md index f7e7b12..1e6c2c1 100644 --- a/src/content/memo/169.md +++ b/src/content/memo/169.md @@ -1,7 +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 28d5ac0..3a15bed 100644 --- a/src/content/memo/17.md +++ b/src/content/memo/17.md @@ -1,7 +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 7faceca..2ea9aaa 100644 --- a/src/content/memo/170.md +++ b/src/content/memo/170.md @@ -1,7 +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 f54f08a..16e0032 100644 --- a/src/content/memo/171.md +++ b/src/content/memo/171.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['font', 'text'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/174.md b/src/content/memo/174.md index 4a2a00c..410ed73 100644 --- a/src/content/memo/174.md +++ b/src/content/memo/174.md @@ -1,7 +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 723bf25..864f313 100644 --- a/src/content/memo/175.md +++ b/src/content/memo/175.md @@ -1,7 +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 ff2f72f..971264c 100644 --- a/src/content/memo/176.md +++ b/src/content/memo/176.md @@ -1,7 +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 ed630a7..c911725 100644 --- a/src/content/memo/177.md +++ b/src/content/memo/177.md @@ -1,7 +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 1f83ba0..a0f17c6 100644 --- a/src/content/memo/178.md +++ b/src/content/memo/178.md @@ -1,7 +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 ee2bbf4..88eba8d 100644 --- a/src/content/memo/179.md +++ b/src/content/memo/179.md @@ -1,7 +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 6b4badc..017cdaa 100644 --- a/src/content/memo/18.md +++ b/src/content/memo/18.md @@ -1,7 +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 332f021..de4e93e 100644 --- a/src/content/memo/180.md +++ b/src/content/memo/180.md @@ -1,7 +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 717a7ef..df56892 100644 --- a/src/content/memo/181.md +++ b/src/content/memo/181.md @@ -1,7 +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/184.md b/src/content/memo/184.md index 3d9b0c6..9f16ae4 100644 --- a/src/content/memo/184.md +++ b/src/content/memo/184.md @@ -1,7 +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 fbe8405..f99bdb6 100644 --- a/src/content/memo/185.md +++ b/src/content/memo/185.md @@ -1,7 +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 094a01e..939d1f6 100644 --- a/src/content/memo/186.md +++ b/src/content/memo/186.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['photoshop'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/188.md b/src/content/memo/188.md index 203c85a..2d06253 100644 --- a/src/content/memo/188.md +++ b/src/content/memo/188.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['seo'] -status: draft +status: archive ctime: 2022-06-01 mtime: 2024-03-22 --- diff --git a/src/content/memo/192.md b/src/content/memo/192.md index 81a3aec..16a4749 100644 --- a/src/content/memo/192.md +++ b/src/content/memo/192.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['flags'] -status: draft +status: archive ctime: 2022-09-18 mtime: 2024-03-22 --- diff --git a/src/content/memo/194.md b/src/content/memo/194.md index 593000e..432dba0 100644 --- a/src/content/memo/194.md +++ b/src/content/memo/194.md @@ -1,7 +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 f91f249..308d73f 100644 --- a/src/content/memo/195.md +++ b/src/content/memo/195.md @@ -1,7 +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 f50a3fb..01f9a96 100644 --- a/src/content/memo/196.md +++ b/src/content/memo/196.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['seo'] -status: draft +status: archive ctime: 2022-09-19 mtime: 2024-03-22 --- diff --git a/src/content/memo/198.md b/src/content/memo/198.md index e10154d..59c3926 100644 --- a/src/content/memo/198.md +++ b/src/content/memo/198.md @@ -1,7 +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/2.md b/src/content/memo/2.md index c8cca13..7ac99c1 100644 --- a/src/content/memo/2.md +++ b/src/content/memo/2.md @@ -1,7 +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 fc75496..2465670 100644 --- a/src/content/memo/20.md +++ b/src/content/memo/20.md @@ -1,7 +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/204.md b/src/content/memo/204.md index f5d5ac2..a6f5dc4 100644 --- a/src/content/memo/204.md +++ b/src/content/memo/204.md @@ -1,7 +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 7c55fd1..2a22bfc 100644 --- a/src/content/memo/205.md +++ b/src/content/memo/205.md @@ -1,7 +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 bf0f52c..b20567d 100644 --- a/src/content/memo/206.md +++ b/src/content/memo/206.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['next'] -status: draft +status: archive ctime: 2022-09-23 mtime: 2024-03-22 --- diff --git a/src/content/memo/211.md b/src/content/memo/211.md index f7059aa..34a16cd 100644 --- a/src/content/memo/211.md +++ b/src/content/memo/211.md @@ -1,7 +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 4184327..ca12eba 100644 --- a/src/content/memo/212.md +++ b/src/content/memo/212.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['slack'] -status: draft +status: archive ctime: 2022-10-10 mtime: 2024-03-22 --- diff --git a/src/content/memo/215.md b/src/content/memo/215.md index d1f6b06..2fe1c12 100644 --- a/src/content/memo/215.md +++ b/src/content/memo/215.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['fp'] -status: draft +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 420bed1..ef41cb9 100644 --- a/src/content/memo/216.md +++ b/src/content/memo/216.md @@ -1,7 +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 babd146..7101ae6 100644 --- a/src/content/memo/217.md +++ b/src/content/memo/217.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['cms'] -status: draft +status: archive ctime: 2022-10-16 mtime: 2024-03-22 --- diff --git a/src/content/memo/219.md b/src/content/memo/219.md index c29bdae..0f595ed 100644 --- a/src/content/memo/219.md +++ b/src/content/memo/219.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['state'] -status: draft +status: archive ctime: 2022-10-16 mtime: 2024-03-22 --- diff --git a/src/content/memo/220.md b/src/content/memo/220.md index 04ec686..c361f93 100644 --- a/src/content/memo/220.md +++ b/src/content/memo/220.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['interview'] -status: draft +status: archive ctime: 2022-10-16 mtime: 2024-03-22 --- diff --git a/src/content/memo/224.md b/src/content/memo/224.md index b07849d..f189934 100644 --- a/src/content/memo/224.md +++ b/src/content/memo/224.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['performance'] -status: draft +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 dc33d93..c45a6fb 100644 --- a/src/content/memo/225.md +++ b/src/content/memo/225.md @@ -1,7 +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/230.md b/src/content/memo/230.md index 9418de3..3f18d5f 100644 --- a/src/content/memo/230.md +++ b/src/content/memo/230.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['migrating'] -status: draft +status: archive ctime: 2022-11-28 mtime: 2024-03-22 --- diff --git a/src/content/memo/236.md b/src/content/memo/236.md index 23d183d..6af629d 100644 --- a/src/content/memo/236.md +++ b/src/content/memo/236.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['ffmpeg'] -status: draft +status: archive ctime: 2022-12-11 mtime: 2024-03-22 --- diff --git a/src/content/memo/239.md b/src/content/memo/239.md index 06420f9..853dbcf 100644 --- a/src/content/memo/239.md +++ b/src/content/memo/239.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['airtable'] -status: draft +status: archive ctime: 2022-12-11 mtime: 2024-03-22 --- diff --git a/src/content/memo/240.md b/src/content/memo/240.md index 039efac..dde7ad2 100644 --- a/src/content/memo/240.md +++ b/src/content/memo/240.md @@ -1,7 +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 a71f602..fa6dce9 100644 --- a/src/content/memo/241.md +++ b/src/content/memo/241.md @@ -1,7 +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 721ed97..6f735ab 100644 --- a/src/content/memo/242.md +++ b/src/content/memo/242.md @@ -1,7 +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/244.md b/src/content/memo/244.md index a537414..29e74af 100644 --- a/src/content/memo/244.md +++ b/src/content/memo/244.md @@ -1,7 +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 fe42038..22e6514 100644 --- a/src/content/memo/245.md +++ b/src/content/memo/245.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['api', 'mock'] -status: draft +status: archive ctime: 2023-02-18 mtime: 2024-03-22 --- diff --git a/src/content/memo/246.md b/src/content/memo/246.md index f362649..9f9c858 100644 --- a/src/content/memo/246.md +++ b/src/content/memo/246.md @@ -1,7 +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/248.md b/src/content/memo/248.md index bd5f02a..62d8ffd 100644 --- a/src/content/memo/248.md +++ b/src/content/memo/248.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['tailwindcss'] -status: draft +status: archive ctime: 2023-02-22 mtime: 2024-03-22 --- diff --git a/src/content/memo/25.md b/src/content/memo/25.md index b061f7e..ac11ee6 100644 --- a/src/content/memo/25.md +++ b/src/content/memo/25.md @@ -1,7 +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 b6094de..27d0ca1 100644 --- a/src/content/memo/251.md +++ b/src/content/memo/251.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: [] -status: draft +status: archive ctime: 2023-03-05 mtime: 2024-03-22 --- diff --git a/src/content/memo/253.md b/src/content/memo/253.md index 45f61e1..ad7ae19 100644 --- a/src/content/memo/253.md +++ b/src/content/memo/253.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['graph'] -status: draft +status: archive ctime: 2023-03-13 mtime: 2024-03-22 --- diff --git a/src/content/memo/258.md b/src/content/memo/258.md index 69a7ca0..fc0911d 100644 --- a/src/content/memo/258.md +++ b/src/content/memo/258.md @@ -1,7 +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 e83f83b..931028c 100644 --- a/src/content/memo/259.md +++ b/src/content/memo/259.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['architecture'] -status: draft +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 2009899..c47a1c9 100644 --- a/src/content/memo/26.md +++ b/src/content/memo/26.md @@ -1,7 +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 3cc82e9..de7481f 100644 --- a/src/content/memo/260.mdx +++ b/src/content/memo/260.mdx @@ -1,7 +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 41dbdaa..0156a4c 100644 --- a/src/content/memo/261.md +++ b/src/content/memo/261.md @@ -1,7 +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 937dcc1..fc39859 100644 --- a/src/content/memo/262.md +++ b/src/content/memo/262.md @@ -1,7 +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 4257ba5..bf61153 100644 --- a/src/content/memo/263.md +++ b/src/content/memo/263.md @@ -1,7 +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 f436131..7cd819b 100644 --- a/src/content/memo/264.md +++ b/src/content/memo/264.md @@ -1,7 +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 8836274..13d9a40 100644 --- a/src/content/memo/265.md +++ b/src/content/memo/265.md @@ -1,7 +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 b40438e..220d119 100644 --- a/src/content/memo/266.md +++ b/src/content/memo/266.md @@ -1,7 +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/273.md b/src/content/memo/273.md index d34b72f..0b7b9c0 100644 --- a/src/content/memo/273.md +++ b/src/content/memo/273.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['llm'] -status: draft +status: archive ctime: 2023-05-28 mtime: 2024-03-22 --- diff --git a/src/content/memo/282.md b/src/content/memo/282.md index 8775c6e..0ee8b78 100644 --- a/src/content/memo/282.md +++ b/src/content/memo/282.md @@ -1,7 +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 81867ca..34b0b71 100644 --- a/src/content/memo/283.md +++ b/src/content/memo/283.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['api'] -status: draft +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 a84406d..7bf7e24 100644 --- a/src/content/memo/284.mdx +++ b/src/content/memo/284.mdx @@ -1,7 +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 04a5d8a..0c6820d 100644 --- a/src/content/memo/285.md +++ b/src/content/memo/285.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['utility'] -status: draft +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 686dac6..242b1e1 100644 --- a/src/content/memo/286.md +++ b/src/content/memo/286.md @@ -1,7 +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/288.md b/src/content/memo/288.md index c1ea795..8842962 100644 --- a/src/content/memo/288.md +++ b/src/content/memo/288.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['ast'] -status: draft +status: archive ctime: 2023-08-06 mtime: 2024-03-22 --- diff --git a/src/content/memo/290.md b/src/content/memo/290.md index ab1becd..f652372 100644 --- a/src/content/memo/290.md +++ b/src/content/memo/290.md @@ -1,7 +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 0999f96..87a9043 100644 --- a/src/content/memo/291.mdx +++ b/src/content/memo/291.mdx @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['effect'] -status: draft +status: archive ctime: 2023-08-13 mtime: 2024-03-22 --- diff --git a/src/content/memo/293.md b/src/content/memo/293.md index 1c98fc4..2b6d061 100644 --- a/src/content/memo/293.md +++ b/src/content/memo/293.md @@ -1,7 +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/296.md b/src/content/memo/296.md index 82fa8b9..19b6fef 100644 --- a/src/content/memo/296.md +++ b/src/content/memo/296.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['signal'] -status: draft +status: archive ctime: 2023-09-20 mtime: 2024-03-22 --- diff --git a/src/content/memo/298.md b/src/content/memo/298.md index 3041da2..eb2f684 100644 --- a/src/content/memo/298.md +++ b/src/content/memo/298.md @@ -1,7 +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 0315118..55048c7 100644 --- a/src/content/memo/299.md +++ b/src/content/memo/299.md @@ -1,7 +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 e383433..549cede 100644 --- a/src/content/memo/3.md +++ b/src/content/memo/3.md @@ -1,7 +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/31.md b/src/content/memo/31.md index 13f948c..e1c2698 100644 --- a/src/content/memo/31.md +++ b/src/content/memo/31.md @@ -1,7 +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/32.md b/src/content/memo/32.md index e779f52..40708b4 100644 --- a/src/content/memo/32.md +++ b/src/content/memo/32.md @@ -1,7 +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/33.md b/src/content/memo/33.md index 8ec18a1..baecc67 100644 --- a/src/content/memo/33.md +++ b/src/content/memo/33.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['react'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/34.md b/src/content/memo/34.md index a738d52..6b3370f 100644 --- a/src/content/memo/34.md +++ b/src/content/memo/34.md @@ -1,7 +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/35.md b/src/content/memo/35.md index 3731034..02febcc 100644 --- a/src/content/memo/35.md +++ b/src/content/memo/35.md @@ -1,7 +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/353.md b/src/content/memo/353.md index f3a4721..bece6f9 100644 --- a/src/content/memo/353.md +++ b/src/content/memo/353.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['json'] -status: draft +status: archive ctime: 2025-01-06 mtime: 2025-01-06 --- diff --git a/src/content/memo/355.md b/src/content/memo/355.md index e5ed8cb..e71b0be 100644 --- a/src/content/memo/355.md +++ b/src/content/memo/355.md @@ -1,7 +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/359.md b/src/content/memo/359.md index 644ed36..1183d74 100644 --- a/src/content/memo/359.md +++ b/src/content/memo/359.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['speculation'] -status: draft +status: archive ctime: 2025-01-12 mtime: 2025-01-12 --- diff --git a/src/content/memo/361.md b/src/content/memo/361.md index 85e3f18..37856f0 100644 --- a/src/content/memo/361.md +++ b/src/content/memo/361.md @@ -1,7 +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 9069887..dfa0e66 100644 --- a/src/content/memo/362.md +++ b/src/content/memo/362.md @@ -1,7 +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 8527b40..d6d70a6 100644 --- a/src/content/memo/363.md +++ b/src/content/memo/363.md @@ -1,7 +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 fb31568..498ab7a 100644 --- a/src/content/memo/364.md +++ b/src/content/memo/364.md @@ -1,7 +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 c291e70..1224732 100644 --- a/src/content/memo/365.md +++ b/src/content/memo/365.md @@ -1,7 +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 f66f169..bb2fe32 100644 --- a/src/content/memo/366.md +++ b/src/content/memo/366.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['sticky'] -status: draft +status: archive ctime: 2025-01-14 mtime: 2025-01-14 --- diff --git a/src/content/memo/369.md b/src/content/memo/369.md index 482ec57..aae2a86 100644 --- a/src/content/memo/369.md +++ b/src/content/memo/369.md @@ -1,7 +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 0400551..1f3dbdb 100644 --- a/src/content/memo/37.md +++ b/src/content/memo/37.md @@ -1,7 +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 6565651..6bce0ae 100644 --- a/src/content/memo/370.md +++ b/src/content/memo/370.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['font'] -status: draft +status: archive ctime: 2025-01-17 mtime: 2025-01-17 --- diff --git a/src/content/memo/384.md b/src/content/memo/384.md index 2c632c5..5e9eca7 100644 --- a/src/content/memo/384.md +++ b/src/content/memo/384.md @@ -1,7 +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/387.md b/src/content/memo/387.md index 26ae5f6..b1514d4 100644 --- a/src/content/memo/387.md +++ b/src/content/memo/387.md @@ -1,7 +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 7557e9d..d4e8a8f 100644 --- a/src/content/memo/388.md +++ b/src/content/memo/388.md @@ -1,7 +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 ddc6adf..1e401db 100644 --- a/src/content/memo/389.md +++ b/src/content/memo/389.md @@ -1,7 +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 e9cb87e..ba81aa2 100644 --- a/src/content/memo/39.md +++ b/src/content/memo/39.md @@ -1,7 +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 94e50c3..8e71a6a 100644 --- a/src/content/memo/390.md +++ b/src/content/memo/390.md @@ -1,7 +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 b416c68..6969c14 100644 --- a/src/content/memo/391.md +++ b/src/content/memo/391.md @@ -1,7 +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 93b4cca..f93255b 100644 --- a/src/content/memo/392.md +++ b/src/content/memo/392.md @@ -1,7 +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 f1cad2d..c76776f 100644 --- a/src/content/memo/393.md +++ b/src/content/memo/393.md @@ -1,7 +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 5aaa1f1..0c665d0 100644 --- a/src/content/memo/394.md +++ b/src/content/memo/394.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['ffmpeg'] -status: draft +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 9a5fb06..a5cea03 100644 --- a/src/content/memo/395.md +++ b/src/content/memo/395.md @@ -1,7 +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 c1b82d8..cc53d0d 100644 --- a/src/content/memo/396.md +++ b/src/content/memo/396.md @@ -1,7 +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 cb61c5d..732236a 100644 --- a/src/content/memo/397.md +++ b/src/content/memo/397.md @@ -1,7 +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 2453195..fd57c1d 100644 --- a/src/content/memo/399.md +++ b/src/content/memo/399.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['aria'] -status: draft +status: archive ctime: 2025-02-09 mtime: 2025-02-09 --- diff --git a/src/content/memo/40.md b/src/content/memo/40.md index 8e29d66..d495f89 100644 --- a/src/content/memo/40.md +++ b/src/content/memo/40.md @@ -1,7 +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 d6c6d37..9bffe41 100644 --- a/src/content/memo/400.md +++ b/src/content/memo/400.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['aws'] -status: draft +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 43e7137..cf602d1 100644 --- a/src/content/memo/401.md +++ b/src/content/memo/401.md @@ -1,7 +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 d46df34..ad83b34 100644 --- a/src/content/memo/402.md +++ b/src/content/memo/402.md @@ -1,7 +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 1aeb3ed..4487599 100644 --- a/src/content/memo/403.md +++ b/src/content/memo/403.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['webgl'] -status: draft +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 a28b2b2..990be17 100644 --- a/src/content/memo/404.md +++ b/src/content/memo/404.md @@ -1,7 +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 f0e58b7..63edffa 100644 --- a/src/content/memo/405.md +++ b/src/content/memo/405.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['astro'] -status: draft +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 8747d1b..856d31d 100644 --- a/src/content/memo/407.md +++ b/src/content/memo/407.md @@ -1,7 +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 61e2c53..018ad04 100644 --- a/src/content/memo/408.md +++ b/src/content/memo/408.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['electron'] -status: draft +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 cc86b82..00e491d 100644 --- a/src/content/memo/409.md +++ b/src/content/memo/409.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['dnd'] -status: draft +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 43bedd8..5b5534b 100644 --- a/src/content/memo/41.md +++ b/src/content/memo/41.md @@ -1,7 +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/411.md b/src/content/memo/411.md index edc6b3b..c3bef18 100644 --- a/src/content/memo/411.md +++ b/src/content/memo/411.md @@ -1,7 +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 1f83bda..a046fb0 100644 --- a/src/content/memo/412.md +++ b/src/content/memo/412.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['cli'] -status: draft +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 6c5e99c..f5997dc 100644 --- a/src/content/memo/413.md +++ b/src/content/memo/413.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['figma'] -status: draft +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 9930086..397ae2d 100644 --- a/src/content/memo/415.md +++ b/src/content/memo/415.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['extension'] -status: draft +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 48a8141..c5663a1 100644 --- a/src/content/memo/416.md +++ b/src/content/memo/416.md @@ -1,7 +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 273807b..f877d36 100644 --- a/src/content/memo/417.md +++ b/src/content/memo/417.md @@ -1,7 +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 c8587bb..c7159e7 100644 --- a/src/content/memo/418.md +++ b/src/content/memo/418.md @@ -1,7 +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 80fec4c..86a8245 100644 --- a/src/content/memo/419.md +++ b/src/content/memo/419.md @@ -1,7 +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 3cb5938..9421557 100644 --- a/src/content/memo/42.md +++ b/src/content/memo/42.md @@ -1,7 +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 9948d2d..27ac8c7 100644 --- a/src/content/memo/420.md +++ b/src/content/memo/420.md @@ -1,7 +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 57ed611..7d9ed8f 100644 --- a/src/content/memo/421.md +++ b/src/content/memo/421.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['wasm'] -status: draft +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 bc8897b..b5a9564 100644 --- a/src/content/memo/423.md +++ b/src/content/memo/423.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['auth'] -status: draft +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 e6d02fd..1a7d7e6 100644 --- a/src/content/memo/424.md +++ b/src/content/memo/424.md @@ -1,7 +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 1c76ded..5d0b6bb 100644 --- a/src/content/memo/425.md +++ b/src/content/memo/425.md @@ -1,7 +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 8bd7e51..0b2edce 100644 --- a/src/content/memo/426.md +++ b/src/content/memo/426.md @@ -1,7 +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 e40ccee..76e0b3b 100644 --- a/src/content/memo/428.md +++ b/src/content/memo/428.md @@ -1,7 +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 93dc666..54a3fb1 100644 --- a/src/content/memo/429.md +++ b/src/content/memo/429.md @@ -1,7 +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 81b4637..b3703ae 100644 --- a/src/content/memo/43.md +++ b/src/content/memo/43.md @@ -1,7 +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/432.mdx b/src/content/memo/432.mdx index 881031f..69da762 100644 --- a/src/content/memo/432.mdx +++ b/src/content/memo/432.mdx @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['gleam'] -status: draft +status: archive ctime: 2025-03-03 mtime: 2025-03-03 --- diff --git a/src/content/memo/436.mdx b/src/content/memo/436.mdx index f0e43e1..d06f2d5 100644 --- a/src/content/memo/436.mdx +++ b/src/content/memo/436.mdx @@ -1,7 +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 2796a74..69ead58 100644 --- a/src/content/memo/437.md +++ b/src/content/memo/437.md @@ -1,7 +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 edecde6..211a43b 100644 --- a/src/content/memo/438.mdx +++ b/src/content/memo/438.mdx @@ -1,7 +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 5ea8d29..6a9ca64 100644 --- a/src/content/memo/439.mdx +++ b/src/content/memo/439.mdx @@ -1,7 +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 a62e0fc..5e4cdb1 100644 --- a/src/content/memo/44.md +++ b/src/content/memo/44.md @@ -1,7 +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 e010145..4fe2d09 100644 --- a/src/content/memo/440.mdx +++ b/src/content/memo/440.mdx @@ -1,7 +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 40b1a11..4b0d4d8 100644 --- a/src/content/memo/441.mdx +++ b/src/content/memo/441.mdx @@ -1,7 +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 8e64031..33fb203 100644 --- a/src/content/memo/442.mdx +++ b/src/content/memo/442.mdx @@ -1,7 +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 773fef0..fad7ce7 100644 --- a/src/content/memo/443.md +++ b/src/content/memo/443.md @@ -1,7 +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 1e13559..1a93b7e 100644 --- a/src/content/memo/444.md +++ b/src/content/memo/444.md @@ -1,7 +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 55e66b3..643cbdf 100644 --- a/src/content/memo/445.md +++ b/src/content/memo/445.md @@ -1,7 +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 63e4874..9dc1f1a 100644 --- a/src/content/memo/446.md +++ b/src/content/memo/446.md @@ -1,7 +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 36e4ba6..d6bef34 100644 --- a/src/content/memo/447.md +++ b/src/content/memo/447.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['learn'] -status: draft +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 27c87e4..3a50166 100644 --- a/src/content/memo/448.md +++ b/src/content/memo/448.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['img'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/45.md b/src/content/memo/45.md index 3198832..93fa438 100644 --- a/src/content/memo/45.md +++ b/src/content/memo/45.md @@ -1,7 +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 443d1ea..35afa72 100644 --- a/src/content/memo/450.mdx +++ b/src/content/memo/450.mdx @@ -1,7 +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 9b3c142..005f8f6 100644 --- a/src/content/memo/451.mdx +++ b/src/content/memo/451.mdx @@ -1,7 +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 6209776..50e0552 100644 --- a/src/content/memo/452.mdx +++ b/src/content/memo/452.mdx @@ -1,7 +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 544c4d9..4ee363c 100644 --- a/src/content/memo/453.md +++ b/src/content/memo/453.md @@ -1,7 +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 fd4ff70..58afd29 100644 --- a/src/content/memo/454.mdx +++ b/src/content/memo/454.mdx @@ -1,7 +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 bce7fbc..5d12ae7 100644 --- a/src/content/memo/455.mdx +++ b/src/content/memo/455.mdx @@ -1,7 +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 d18a5ae..921b603 100644 --- a/src/content/memo/457.mdx +++ b/src/content/memo/457.mdx @@ -1,7 +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/459.mdx b/src/content/memo/459.mdx index 5f64e77..b85e86e 100644 --- a/src/content/memo/459.mdx +++ b/src/content/memo/459.mdx @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['slot'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/460.md b/src/content/memo/460.md index 8f741ef..ffb0457 100644 --- a/src/content/memo/460.md +++ b/src/content/memo/460.md @@ -1,7 +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/464.md b/src/content/memo/464.md index 559c526..0f911fa 100644 --- a/src/content/memo/464.md +++ b/src/content/memo/464.md @@ -1,7 +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 113ac98..6f5f945 100644 --- a/src/content/memo/465.md +++ b/src/content/memo/465.md @@ -1,7 +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 d80f709..8ec3484 100644 --- a/src/content/memo/466.mdx +++ b/src/content/memo/466.mdx @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['promise'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/468.mdx b/src/content/memo/468.mdx index 87e2b5b..89d7e6f 100644 --- a/src/content/memo/468.mdx +++ b/src/content/memo/468.mdx @@ -1,7 +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 0aadf7f..9eb0ded 100644 --- a/src/content/memo/469.md +++ b/src/content/memo/469.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['design-system'] -status: draft +status: archive ctime: 2025-03-04 mtime: 2025-03-04 --- diff --git a/src/content/memo/470.mdx b/src/content/memo/470.mdx index 52edfde..d059708 100644 --- a/src/content/memo/470.mdx +++ b/src/content/memo/470.mdx @@ -1,7 +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/473.mdx b/src/content/memo/473.mdx index e721ad6..8749d02 100644 --- a/src/content/memo/473.mdx +++ b/src/content/memo/473.mdx @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['playwright'] -status: draft +status: archive ctime: 2025-03-05 mtime: 2025-03-05 --- diff --git a/src/content/memo/475.md b/src/content/memo/475.md index 868b562..8816f54 100644 --- a/src/content/memo/475.md +++ b/src/content/memo/475.md @@ -1,7 +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 ab7eab8..53abe2d 100644 --- a/src/content/memo/476.mdx +++ b/src/content/memo/476.mdx @@ -1,7 +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/478.mdx b/src/content/memo/478.mdx index e31fed8..41dcc4e 100644 --- a/src/content/memo/478.mdx +++ b/src/content/memo/478.mdx @@ -1,7 +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 45efaa0..2c82d47 100644 --- a/src/content/memo/479.mdx +++ b/src/content/memo/479.mdx @@ -1,7 +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/494.md b/src/content/memo/494.md index 69509d3..d9732cf 100644 --- a/src/content/memo/494.md +++ b/src/content/memo/494.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['config'] -status: draft +status: archive ctime: 2025-06-30 mtime: 2025-06-30 --- diff --git a/src/content/memo/50.md b/src/content/memo/50.md index 8467941..0d6528e 100644 --- a/src/content/memo/50.md +++ b/src/content/memo/50.md @@ -1,7 +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/54.md b/src/content/memo/54.md index e067c63..0b36038 100644 --- a/src/content/memo/54.md +++ b/src/content/memo/54.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['token'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/61.md b/src/content/memo/61.md index 6d17767..e171720 100644 --- a/src/content/memo/61.md +++ b/src/content/memo/61.md @@ -1,7 +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/67.md b/src/content/memo/67.md index 13561ce..65d4868 100644 --- a/src/content/memo/67.md +++ b/src/content/memo/67.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['debug'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/73.md b/src/content/memo/73.md index 9f96b61..089d24f 100644 --- a/src/content/memo/73.md +++ b/src/content/memo/73.md @@ -1,7 +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/76.md b/src/content/memo/76.md index ed07e5d..01de83b 100644 --- a/src/content/memo/76.md +++ b/src/content/memo/76.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['api'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/80.md b/src/content/memo/80.md index c2d5b14..776397d 100644 --- a/src/content/memo/80.md +++ b/src/content/memo/80.md @@ -1,7 +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 1ceed1f..0a2a6ef 100644 --- a/src/content/memo/81.md +++ b/src/content/memo/81.md @@ -1,7 +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 07501c5..d8515be 100644 --- a/src/content/memo/82.md +++ b/src/content/memo/82.md @@ -1,7 +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/86.md b/src/content/memo/86.md index 6cd3f42..6be101d 100644 --- a/src/content/memo/86.md +++ b/src/content/memo/86.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['scroll'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/88.md b/src/content/memo/88.md index a0627ea..a90d899 100644 --- a/src/content/memo/88.md +++ b/src/content/memo/88.md @@ -1,7 +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 3c125c6..6adc3da 100644 --- a/src/content/memo/89.md +++ b/src/content/memo/89.md @@ -1,7 +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 8a00f47..8ba9c11 100644 --- a/src/content/memo/9.md +++ b/src/content/memo/9.md @@ -1,7 +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 fe33ba8..7ac3261 100644 --- a/src/content/memo/90.md +++ b/src/content/memo/90.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['puppeteer'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/94.md b/src/content/memo/94.md index 67b0a9f..fbbd72d 100644 --- a/src/content/memo/94.md +++ b/src/content/memo/94.md @@ -1,7 +1,7 @@ --- type: bookmarks tags: ['tools'] -status: draft +status: archive ctime: 2022-04-09 mtime: 2024-03-22 --- diff --git a/src/content/memo/98.md b/src/content/memo/98.md index 349c93a..d5455c1 100644 --- a/src/content/memo/98.md +++ b/src/content/memo/98.md @@ -1,7 +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 8bb8388..88a759b 100644 --- a/src/content/memo/99.md +++ b/src/content/memo/99.md @@ -1,7 +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/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 ( + + + + ) + }) + } + + From 8b09ee31cdfe2a41b50a4cbad593369ee4ce1acd Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 08:39:09 +0000 Subject: [PATCH 04/22] =?UTF-8?q?fix:=20/memos/all=20=EC=9D=B4=20status=20?= =?UTF-8?q?=EB=AC=B4=EA=B4=80=ED=95=98=EA=B2=8C=20=EC=A0=84=EC=B2=B4?= =?UTF-8?q?=EB=A5=BC=20=EB=A0=8C=EB=8D=94=ED=95=98=EB=8D=98=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getCollection('memo')을 필터 없이 써서 draft·archive 268개가 본문까지 공개되고 있었다. 게다가 링크 대상인 /memo/[id] 는 release만 생성되므로 268개가 404로 연결됐다. getReleaseMemoCollection()으로 교체 — 다른 공개 경로(상세·태그· RSS)와 동일한 필터를 쓴다. - /memos/all: 542 → 274개 - 깨진 링크 268 → 0 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/pages/memos/all.astro | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 = '' From f676ee9d070b08ef93ebab7225ab932d084ebf63 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 08:47:16 +0000 Subject: [PATCH 05/22] =?UTF-8?q?lint:=20type=20=E2=86=94=20=EB=B3=B8?= =?UTF-8?q?=EB=AC=B8=20=ED=98=95=ED=83=9C=20=EC=9D=BC=EA=B4=80=EC=84=B1=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 분류기를 검증기로 뒤집어 새 메모의 drift를 빌드에서 잡는다. - scripts/lint-memo.mjs: 오류(논리적 모순) / 경고(휴리스틱 불일치) 2단계. draft 는 아직 형태가 안 잡혔을 수 있어 경고까지만. 본문이 빈 메모는 판정 불가라 건너뜀. - build 에 연결 + lint:memo 스크립트. 현재 542개 오류 0, 경고 0 - create-memo.mjs 가 type 없이 프론트매터를 만들어 새 메모마다 스키마 검증에 걸리던 문제 수정. 첫 인자로 type 을 받는다 (bookmarks 는 status 를 archive 로) Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- .claude/skills/create-memo/SKILL.md | 13 +- CLAUDE.md | 1 + package.json | 5 +- scripts/create-memo.mjs | 16 ++- scripts/lint-memo.mjs | 199 ++++++++++++++++++++++++++++ 5 files changed, 227 insertions(+), 7 deletions(-) create mode 100644 scripts/lint-memo.mjs diff --git a/.claude/skills/create-memo/SKILL.md b/.claude/skills/create-memo/SKILL.md index ac11a19..4f28bf2 100644 --- a/.claude/skills/create-memo/SKILL.md +++ b/.claude/skills/create-memo/SKILL.md @@ -9,16 +9,21 @@ 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`). ## 작업 순서 @@ -26,7 +31,7 @@ node scripts/create-memo.mjs 2. **스크립트 실행**: `node scripts/create-memo.mjs` 실행 → 생성된 파일명 확인 3. **내용 작성** (사용자가 주제/내용을 제공한 경우): - 적절한 태그 추가 (kebab-case) - - CLAUDE.md의 메모 유형(A~E) 중 적합한 템플릿 선택 + - CLAUDE.md의 메모 유형(A~F) 중 적합한 템플릿 선택 - 본문 작성 4. **중복 확인**: 유사 태그/주제 기존 메모가 있으면 사용자에게 알리고 통합 여부 확인 5. **관계 탐지 (계보 연결)**: 아래 "관계 자동화" 절차 수행 diff --git a/CLAUDE.md b/CLAUDE.md index acd8f95..d76bb4e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -92,6 +92,7 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' | `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`다. diff --git a/package.json b/package.json index db8492e..40a0a9c 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,12 @@ "scripts": { "dev": "astro dev", "start": "astro dev", - "build": "astro build", + "build": "node scripts/lint-memo.mjs && astro build", "preview": "astro preview", "astro": "astro", "test": "vitest", - "lint:fix": "eslint --fix ." + "lint:fix": "eslint --fix .", + "lint:memo": "node scripts/lint-memo.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/lint-memo.mjs b/scripts/lint-memo.mjs new file mode 100644 index 0000000..8e45800 --- /dev/null +++ b/scripts/lint-memo.mjs @@ -0,0 +1,199 @@ +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) + ) + + return { + frontmatter, + codeLines, + bullets: bullets.length, + linkBullets: linkBullets.length, + proseChars: prose.join(' ').length, + isEmpty: meaningful.length === 0 && codeLines === 0, + } +} + +/** + * 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') + + // 본문이 비어 있으면 형태를 판정할 수 없다 (갓 만든 메모) + 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 인데 링크가 없다') + } + + // 작성 중(draft)은 아직 형태가 안 잡혔을 수 있으므로 경고로만 본다 + const level = status === 'draft' ? 'warn' : 'error' + + 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) +} From 6d9992376b2bc175d70d2a6eb6e6ab793200b098 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 09:08:53 +0000 Subject: [PATCH 06/22] =?UTF-8?q?memo:=20268=C2=B7274=20=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EB=B9=8C=EB=A0=A4=EC=98=A8=20=EB=AA=A9=EC=86=8C=EB=A6=AC=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 문체(존댓말)로 검출한 provenance 문제. 둘 다 공개 중이었다. 274: 본문 전체가 '에릭'이라는 개발자가 등장하는 창작 우화였다. 출처는 구글 검색 URL 하나. 저자의 내용이 없으므로 용어 정의 + 실제 출처만 남기고 draft 로 내렸다. 268: 벤더 홍보문 번역이었다 — "이것이 바로 제가 Tachyon을 만든 이유이며" 처럼 1인칭이 저자가 아니었다. 사실만 남겼다 (prefetch=내려받기만 / prerender=렌더링까지, Tachyon 동작 방식). 링크 모음 형태가 됐으므로 type 도 bookmarks 로. rel=prerender 의 폐기 여부는 출처를 확인할 수 없어 쓰지 않았다. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/content/memo/268.md | 26 ++++---------------------- src/content/memo/274.md | 16 ++++------------ 2 files changed, 8 insertions(+), 34 deletions(-) diff --git a/src/content/memo/268.md b/src/content/memo/268.md index 2a7bef9..3394106 100644 --- a/src/content/memo/268.md +++ b/src/content/memo/268.md @@ -1,32 +1,14 @@ --- -type: note +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/274.md b/src/content/memo/274.md index de13341..7f2137d 100644 --- a/src/content/memo/274.md +++ b/src/content/memo/274.md @@ -1,19 +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) From ae6ba3501bf3088247993c529f7d87bf1ab0afcf Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 09:14:03 +0000 Subject: [PATCH 07/22] =?UTF-8?q?memo:=20272=20=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B9=8C=EB=A0=A4=EC=98=A8=20=EB=AA=A9=EC=86=8C=EB=A6=AC=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Graphite 문서의 목차를 절 단위로 번역한 요약이었다 ("Why stack", "What is stacking", "Splitting" ...). 게다가 두 단락이 거의 같은 내용을 반복했다. 스택을 기능 브랜치와 구분하는 사실과 병합 순서만 남겼다. 링크 5개는 저자가 고른 것이라 그대로 둔다. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/content/memo/272.md | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/content/memo/272.md b/src/content/memo/272.md index 421b252..8906412 100644 --- a/src/content/memo/272.md +++ b/src/content/memo/272.md @@ -3,28 +3,12 @@ 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) From d31619e86386c3be2f364ca5761285feb9aa8b6f Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 09:45:59 +0000 Subject: [PATCH 08/22] =?UTF-8?q?memo:=20577=20=EC=9E=AC=EC=9E=91=EC=84=B1?= =?UTF-8?q?=20+=20CLAUDE.md=20=EC=97=90=20=EC=95=95=EC=B6=95=20=EC=9B=90?= =?UTF-8?q?=EC=B9=99=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 577 은 "OKF 도입 검토"라는 틀이었는데, 그러면 나중에 읽어도 "그래서 OKF가 뭐였지"가 된다. 실제 주인공은 압축이었다. - 577: 첫 줄을 압축으로. OKF 는 규칙집이 아니라 압축 대상을 찾는 방법(문체)을 열어준 것으로 정리. tags 도 okf → memo-spec/compression/provenance. status: release (CLAUDE.md 가 세 곳에서 577 을 근거로 인용하고 있어서 비공개면 인용이 끊긴다) - CLAUDE.md: "압축 (필수)" 절 추가 — 존댓말 = 남의 문장 신호, 인용은 표시, 1인칭 확인, 걷어내면 형태가 드러남 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- CLAUDE.md | 11 ++++++++++ src/content/memo/577.md | 45 ++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index d76bb4e..278f129 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -25,6 +25,16 @@ - 공개용이면 **개인 종속(내 라이브러리·작업 맥락)도 제거**. - ⚠ AI로 정리하면 *일반적으로 인상적인 디테일*로 흐른다 (구체 숫자·보안 사례 등). 신선함은 사람이 직접 짚어야 한다. +### 압축 (필수) + +**남의 문장을 그대로 옮긴 것은 메모가 아니다.** 한 줄로 줄여지지 않으면 아직 이해하지 못한 것. + +- **존댓말은 신호다.** 번역문·AI 요약·문서 발췌는 "~합니다"로 들어온다. 내 메모는 평서체("~다")로 쓴다. 인용 표시 없이 존댓말이 지배하는 산문 = 아직 내 언어로 줄이지 않은 남의 문장 (→ 577.md) +- **인용할 거면 인용 표시를 한다** — `>` 또는 `QuoteLink`. 출처를 밝힌 인용은 정직하고, 표시 없는 번역문이 문제다. +- **1인칭을 확인한다.** 원문을 옮기면 "제가 만든 이유"처럼 남의 1인칭이 따라 들어온다 (268.md가 그랬다). +- **걷어내면 형태가 드러난다.** 부풀린 산문을 지우면 남는 게 링크뿐일 수 있다 → `type`이 바뀐다 (268.md: `note` → `bookmarks`). +- 같은 내용이 두 단락에 반복되면 기계 요약의 흔적이다 (272.md). + ### 하지 말 것 - 서론 → 본론 → 결론 구조 @@ -342,6 +352,7 @@ mtime: YYYY-MM-DD ## 변경 이력 +- 압축 원칙 추가: 존댓말을 "남의 문장" 신호로 사용. 검출된 29개(공개 23개) 중 268·272·274 정리 → 577.md - 태그 정규화: snake_case → kebab-case 변환 (23개 파일) - 빈 태그 메모: 28개 파일에 태그 적용 - 삭제: 427.md (내용 없음) diff --git a/src/content/memo/577.md b/src/content/memo/577.md index 46c1e59..cd9e3c5 100644 --- a/src/content/memo/577.md +++ b/src/content/memo/577.md @@ -1,43 +1,42 @@ --- type: note -tags: ['okf', 'frontmatter', 'metadata'] -status: draft +tags: ['memo-spec', 'compression', 'provenance'] +status: release ctime: 2026-07-27 mtime: 2026-07-27 -title: OKF 도입 검토 — type과 stale_after -description: OKF(Open Knowledge Format)와 대조해서 메모 스펙에서 가져올 것과 안 가져올 것 정리. +title: 메모 압축 — 존댓말이 신호였다 +description: 메모가 늘면서 압축이 고민이었는데, OKF를 대보다가 압축할 대상을 찾는 방법이 나왔다. --- -OKF는 마크다운 + YAML 프론트매터로 지식을 표현하는 포맷. 필수 필드가 `type` 하나뿐이라는 게 인상적이었다. 나머지는 전부 옵션이고, 없는 것도 의미를 갖는다(`status` 없으면 `stable`). +메모가 늘면서 어떻게 줄일지가 고민이었다. OKF를 대조해보다가 의도치 않게 그 방향이 열렸다 — **압축할 대상을 문체로 찾을 수 있다.** -내 메모에도 유형(A~F)이 있지만 CLAUDE.md 안에만 있고 데이터에는 없다. 유일하게 새어나온 게 `bookmarks`인데, 태그로 들어가서 유사도 계산에 예외가 생겼다. +번역문·AI 요약·문서 발췌는 존댓말("~합니다")로 들어온다. 내 메모는 평서체("~다")로 쓴다. 그래서 **인용 표시 없이 존댓말이 지배하는 산문 = 아직 내 언어로 줄이지 않은 남의 문장**이다. 542개 중 29개, 그중 23개가 공개 중이었다. -```ts -// src/collection/memo.ts -const STRUCTURAL_TAGS = new Set(['bookmarks']) -``` +가장 선명한 건 268. *"이것이 바로 제가 Tachyon을 만든 이유이며"* — 메모 안의 1인칭이 내가 아니었다. 벤더 홍보문을 번역해 넣은 것. -타입을 태그에 밀어넣으면 태그가 두 일을 하게 되고, 예외 목록이 자란다. `type`으로 빼면 예외가 사라진다. +압축해보니: -그리고 `mtime`은 신선도가 아니다. 542개 중 288개가 `mtime: 2024-03-22` — 일괄 수정 자국이다. OKF는 이걸 둘로 쪼갠다. +| | 전 | 후 | +|---|---|---| +| 272 (Graphite 문서 요약) | 17줄 | 2줄 | +| 268 (벤더 홍보문) | 5단락 | 2줄 | +| 274 (AI가 지어낸 우화) | 4단락 | 1줄 | -| 필드 | 의미 | -|---|---| -| `generated.at` | 내용이 마지막으로 의미있게 바뀐 시점 | -| `stale_after` | 이 날짜 이후로는 거짓일 수 있음 | +줄이니 **형태가 드러났다.** 268은 `note`였는데 군더더기를 걷어내자 남은 게 링크 4개라서 `bookmarks`가 됐다. 부풀린 산문이 형태를 가리고 있었던 것. -`stale_after`가 상대 TTL이 아니라 절대 날짜인 게 포인트. 읽는 시점을 참조하지 않으니 판정이 날짜 비교로 끝난다. +## OKF는 규칙집이 아니다 -안 가져올 것: +필수 필드가 `type` 하나뿐이고 그마저 개방 어휘다 — "Type values are **not** registered centrally." 규칙을 주지 않으니 참조할 대상이 못 된다. 실제로 가져온 건 필드 이름 하나와 "없는 것도 의미를 갖는다"는 패턴 하나. -- `verified` / 신뢰 등급 / attested computation — 에이전트가 대량 생성하는 코퍼스를 위한 장치. 단일 저자라 전부 `human:cbcruk`이 된다. -- 관계 레이어 추가 — `parent`는 542개 중 0개가 쓴다. 스키마가 부족한 게 아니라 안 쓰고 있는 것. +규칙은 내 데이터가 정했다. 예전에 손으로 `bookmarks` 태그를 붙여둔 33개가 정답지 역할을 했고, 처음 만든 분류 규칙은 그중 10개를 놓쳤다 — 링크 1개짜리 메모. **내 기준에선 링크 하나만 저장해둔 것도 링크 모음**이었다는 걸 규칙을 고치면서 알았다. -다만 `generated.by`로 사람/AI를 구분하는 건 여기서도 의미가 있다. CLAUDE.md가 이미 "AI로 정리하면 일반적으로 인상적인 디테일로 흐른다"고 경고하는 지점이 결국 provenance 문제다. +`type`을 데이터로 넣자 분포가 보였다. `bookmarks` 274개 중 231개(84%)가 `draft`. 그런데 링크 모음에 "작성 중"은 없다 — 붙여넣은 순간이 최종형이다. `draft`가 "작성 중"과 "공개 안 함" 두 뜻으로 쓰이고 있었고, 작성 중 큐 268개가 완성될 일 없는 링크로 막혀 있었다. `archive`로 분리해서 큐가 37개가 됐다. -적용: `type`은 **형태만** 담기로 했다 — `bookmarks` / `snippet` / `note`. `debug` 같은 목적은 주제니까 태그에 남긴다. 542개 백필하면서 `STRUCTURAL_TAGS`도 삭제. +안 가져온 것: `stale_after`(버전을 고정한 메모가 10개뿐 — 만료를 선언할 표면이 없다), `verified`(단일 저자), `resource`(URL이 2개 이상인 메모가 359개라 대상을 하나로 특정 못 한다). -백필 규칙을 태그로 검증할 수 있었던 게 뜻밖의 수확. 예전에 손으로 `bookmarks` 태그를 붙여둔 33개가 정답지 역할을 했고, 처음 규칙은 그중 10개를 놓쳤다 — 링크 1개짜리 메모. 내 기준에선 **링크 하나만 저장해둔 것도 링크 모음**이었다는 걸 규칙을 고치면서 알았다. +## 씨앗 + +같은 URL을 가리키는 메모쌍이 29개, 그중 14쌍은 공유 태그가 0개다. 태그 IDF 유사도로는 영원히 못 만난다. `parent`가 542개 중 0개인 이유가 스키마 부족이 아니라 **후보를 본 적이 없어서**일 수 있다. --- From db5f660393f8898fce18fea8704b39271661bf8f Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 09:51:26 +0000 Subject: [PATCH 09/22] =?UTF-8?q?memo:=20=EB=AC=B6=EC=9D=8C=20A=205?= =?UTF-8?q?=EA=B0=9C=EC=97=90=EC=84=9C=20AI=EA=B0=80=20=EB=B6=99=EC=9D=B8?= =?UTF-8?q?=20=EC=84=A4=EB=AA=85=20=EC=A0=9C=EA=B1=B0=20(=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=EB=A7=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 46·269·173·21·83. 링크는 저자가 고른 것이라 그대로 두고 기계가 붙인 설명만 지웠다. 새로 쓴 문장은 없다. - 46: "유연성/재사용 가능성/테스트 가능성..." 일반적 장점 7줄 - 269: 라이브러리 소개 + "주요 기능 및 특징" (저자가 쓴 선택 이유 한 줄은 남김) - 173·21: 번역체 도입 단락 - 83: 산문이 아니라 각주가 부풀려져 있었다 (각주 하나가 5문장). 참조와 정의를 함께 지워 짝이 깨지지 않게 했고, 같이 달려 있던 grep.app 링크는 살렸다 걷어내니 형태가 드러나 46·269 는 note → bookmarks 로 바뀌었다 (린터가 잡아줬다). 문체 검출 26 → 21개. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/content/memo/173.md | 6 +----- src/content/memo/21.md | 4 +--- src/content/memo/269.md | 11 ++--------- src/content/memo/46.md | 14 ++------------ src/content/memo/83.md | 10 ++++------ 5 files changed, 10 insertions(+), 35 deletions(-) diff --git a/src/content/memo/173.md b/src/content/memo/173.md index e6f32ae..9425d28 100644 --- a/src/content/memo/173.md +++ b/src/content/memo/173.md @@ -4,13 +4,9 @@ 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/21.md b/src/content/memo/21.md index 4d0e7e1..dd2073e 100644 --- a/src/content/memo/21.md +++ b/src/content/memo/21.md @@ -3,11 +3,9 @@ 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/269.md b/src/content/memo/269.md index 686eeac..e501cb5 100644 --- a/src/content/memo/269.md +++ b/src/content/memo/269.md @@ -1,20 +1,13 @@ --- -type: note +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/46.md b/src/content/memo/46.md index 958b291..8526183 100644 --- a/src/content/memo/46.md +++ b/src/content/memo/46.md @@ -1,9 +1,9 @@ --- -type: note +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] @@ -12,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/83.md b/src/content/memo/83.md index 2e4f063..9369b5c 100644 --- a/src/content/memo/83.md +++ b/src/content/memo/83.md @@ -3,16 +3,16 @@ 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) @@ -21,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/ From 1aadb5e6cdec49b3f42ffce9bcb67684418f73d1 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 10:01:57 +0000 Subject: [PATCH 10/22] =?UTF-8?q?lint:=20=EB=AC=B8=EC=B2=B4=EB=A1=9C=20?= =?UTF-8?q?=EC=95=95=EC=B6=95=20=EB=8C=80=EC=83=81=20=EC=B0=BE=EB=8A=94=20?= =?UTF-8?q?=EA=B2=80=EC=B6=9C=EA=B8=B0=20+=20=EC=8A=A4=ED=82=AC=EC=97=90?= =?UTF-8?q?=20=EC=95=95=EC=B6=95=20=ED=99=95=EC=9D=B8=20=EB=8B=A8=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 빌드에는 연결하지 않는다. 문체는 논리적 모순이 아니라 판단이라 경고밖에 못 되고, 지금 게이트로 걸면 20개가 상주해서 린터를 무시하게 된다. 필요할 때 돌리는 도구로 둔다. scripts/lint-voice.mjs (pnpm lint:voice, --release, --strict) - 코드 블록과 인용(>)은 제외 — 출처를 밝힌 인용은 정직하다 - 산문과 각주를 나눠서 보고 (83.md 는 산문이 아니라 각주가 부풀려져 있었다) - "니까?"는 저자 본인의 질문 문장에도 나와서 제외 (218.mdx 오검출) - "니다"로 일반화하면 평서체인 "아니다"가 걸려서 어미를 명시. 덕분에 "보여줍니다" 같은 형태를 놓치던 23.md 가 잡힌다 - 픽스처 5종으로 제외 규칙 검증 create-memo 스킬: "압축 확인 (필수)" 단계 추가 (문체·1인칭·반복·각주). status 안내가 archive 도입 전 내용이라 함께 갱신. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- .claude/skills/create-memo/SKILL.md | 31 ++++++- package.json | 3 +- scripts/lint-voice.mjs | 127 ++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 scripts/lint-voice.mjs diff --git a/.claude/skills/create-memo/SKILL.md b/.claude/skills/create-memo/SKILL.md index 4f28bf2..399396e 100644 --- a/.claude/skills/create-memo/SKILL.md +++ b/.claude/skills/create-memo/SKILL.md @@ -28,13 +28,35 @@ node scripts/create-memo.mjs note # 산문이 주인공 (기본값) ## 작업 순서 1. **사용자 의도 파악**: 메모 주제/내용/태그를 사용자가 함께 제공했는지 확인 -2. **스크립트 실행**: `node scripts/create-memo.mjs` 실행 → 생성된 파일명 확인 +2. **스크립트 실행**: `node scripts/create-memo.mjs ` 실행 → 생성된 파일명 확인 3. **내용 작성** (사용자가 주제/내용을 제공한 경우): - 적절한 태그 추가 (kebab-case) - CLAUDE.md의 메모 유형(A~F) 중 적합한 템플릿 선택 - 본문 작성 -4. **중복 확인**: 유사 태그/주제 기존 메모가 있으면 사용자에게 알리고 통합 여부 확인 -5. **관계 탐지 (계보 연결)**: 아래 "관계 자동화" 절차 수행 +4. **압축 확인 (필수)**: 아래 "압축 확인" 절차 수행 +5. **중복 확인**: 유사 태그/주제 기존 메모가 있으면 사용자에게 알리고 통합 여부 확인 +6. **관계 탐지 (계보 연결)**: 아래 "관계 자동화" 절차 수행 + +## 압축 확인 (필수) + +**외부 문서를 요약해 넣으면 존댓말이 따라 들어온다.** 그게 곧 "아직 저자의 언어로 줄이지 않은 남의 문장"이다. 압축 원칙은 CLAUDE.md "압축" 참고. + +작성 직후 스스로 점검한다: + +1. **문체** — 본문이 평서체(`~다`)인가? 존댓말(`~합니다`)이 있으면 원문을 옮긴 것이다. 줄이거나, 인용이면 `>`·`QuoteLink`로 표시한다. +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) @@ -72,9 +94,10 @@ node scripts/create-memo.mjs note # 산문이 주인공 (기본값) - 코드가 핵심이면 코드만 - 헤딩은 정말 필요할 때만 - 서론/결론 구조 지양 +- 남의 문장을 그대로 옮긴 것은 메모가 아니다 (→ "압축 확인") ## 주의사항 - 주제가 명확하지 않으면 빈 파일만 생성하고 사용자에게 작성을 위임 -- `status`는 기본 `draft`, 완성도 확인 후 `release`로 변경 +- `status`: 작성 중이면 `draft`, 저장만 해두면 `archive`, 완성되면 `release`. **`bookmarks`는 `draft`를 쓰지 않는다** (링크는 붙여넣은 순간이 최종형) — 기준은 CLAUDE.md "Status 기준" 참고 - 태그가 애매하면 `[]`로 두는 것도 허용 diff --git a/package.json b/package.json index 40a0a9c..dd1c8d7 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "astro": "astro", "test": "vitest", "lint:fix": "eslint --fix .", - "lint:memo": "node scripts/lint-memo.mjs" + "lint:memo": "node scripts/lint-memo.mjs", + "lint:voice": "node scripts/lint-voice.mjs" }, "dependencies": { "@astrojs/markdown-satteri": "0.3.2", diff --git a/scripts/lint-voice.mjs b/scripts/lint-voice.mjs new file mode 100644 index 0000000..3c7f097 --- /dev/null +++ b/scripts/lint-voice.mjs @@ -0,0 +1,127 @@ +/** + * 압축 대상 찾기 — 문체로 "남의 문장"을 검출한다. + * + * 번역문·AI 요약·문서 발췌는 존댓말("~합니다")로 들어오고, 내 메모는 + * 평서체("~다")로 쓴다. 그래서 인용 표시 없이 존댓말이 지배하는 부분은 + * 아직 내 언어로 줄이지 않은 남의 문장이다. (→ 577.md) + * + * 빌드에 연결하지 않는다 — 문체는 논리적 모순이 아니라 판단이라서 + * 경고가 상주하면 린터를 무시하게 된다. 필요할 때 돌리는 도구. + * + * pnpm lint:voice 전체 + * pnpm lint:voice --release 공개 중인 것만 + * pnpm lint:voice --strict 검출되면 exit 1 + */ +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'), + 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 + + 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({ + file: path.join(DIR, file), + type: analyzed.type, + status: analyzed.status, + where, + }) + } +} + +for (const { file, type, status, where } of findings) { + console.log(`! ${file} [${type} / ${status}]`) + console.log(` ${where.join(', ')}`) +} + +console.log( + `\n메모 ${files.length}개 중 ${findings.length}개에 남의 문장이 남아 있다` + + `${releaseOnly ? ' (공개 중인 것만)' : ''}` +) + +if (strict && findings.length > 0) { + process.exit(1) +} From d734981da6eb3695b79554a39dda68b2328c6259 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 12:32:46 +0000 Subject: [PATCH 11/22] =?UTF-8?q?memo:=20=EA=B0=81=EC=A3=BC=20=EC=A7=9D=20?= =?UTF-8?q?=EC=96=B4=EA=B8=8B=EB=82=9C=207=EA=B0=9C=20=EC=A0=95=EB=A6=AC?= =?UTF-8?q?=20+=20lint:memo=20=EC=97=90=20=EA=B7=9C=EC=B9=99=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 정의 없는 참조 3개 / 참조 없는 정의 4개. - 106·245·57: 정의가 아예 없어 살릴 게 없다 → 마커 삭제 - 15·121·127: 정의는 남아 있고 번호 순서가 위치를 알려줬다 (121 은 마커가 1,2,3,4,_,6 으로 비어 있었다) → 마커 복원. 삭제가 아니라 저자 의도 복원이다 - 233: [^233-2] 는 붙을 링크가 없고 내용도 번역문이라 삭제 lint-memo.mjs: 각주 참조/정의 짝 검사 (draft 는 경고). 인라인 코드를 지워 정규식 문자클래스를 각주로 오인하지 않게 했다 (197·3 이 그 오검출이었다). 픽스처 4종으로 검증. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- CLAUDE.md | 4 ++++ scripts/lint-memo.mjs | 29 ++++++++++++++++++++++++++--- src/content/memo/106.md | 6 +++--- src/content/memo/121.md | 4 ++-- src/content/memo/127.md | 4 ++-- src/content/memo/15.md | 4 ++-- src/content/memo/233.md | 3 +-- src/content/memo/245.md | 4 ++-- src/content/memo/57.mdx | 4 ++-- 9 files changed, 44 insertions(+), 18 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 278f129..a67e4bf 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -134,6 +134,9 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' [^496-2]: 두 번째 각주 ``` +- **참조와 정의는 짝이 맞아야 한다** — `pnpm lint:memo`가 잡는다. 참조만 있으면 마커가 깨진 채 렌더되고, 정의만 있으면 렌더되지 않는다 (7개 파일이 그랬다). +- **각주도 압축 대상이다.** 링크 제목에 이미 있는 내용을 늘려 쓰지 않는다 (83.md는 각주 하나가 5문장이었다). + ### 본문 구조 자유 형식. 유형에 따라 적절히 선택. @@ -352,6 +355,7 @@ mtime: YYYY-MM-DD ## 변경 이력 +- 각주 짝 정리: 7개 파일 (정의 없는 참조 3 / 참조 없는 정의 4). 정의가 남아 있던 3개는 번호 순서가 위치를 알려줘서 마커를 복원했고, 붙을 곳이 없던 1개는 삭제. `lint:memo`에 규칙 추가 - 압축 원칙 추가: 존댓말을 "남의 문장" 신호로 사용. 검출된 29개(공개 23개) 중 268·272·274 정리 → 577.md - 태그 정규화: snake_case → kebab-case 변환 (23개 파일) - 빈 태그 메모: 28개 파일에 태그 적용 diff --git a/scripts/lint-memo.mjs b/scripts/lint-memo.mjs index 8e45800..8371268 100644 --- a/scripts/lint-memo.mjs +++ b/scripts/lint-memo.mjs @@ -83,6 +83,15 @@ const analyze = (raw) => { !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, @@ -90,6 +99,8 @@ const analyze = (raw) => { linkBullets: linkBullets.length, proseChars: prose.join(' ').length, isEmpty: meaningful.length === 0 && codeLines === 0, + footnoteDefs, + footnoteRefs, } } @@ -139,6 +150,21 @@ for (const file of files) { 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 @@ -159,9 +185,6 @@ for (const file of files) { contradictions.push('type: bookmarks 인데 링크가 없다') } - // 작성 중(draft)은 아직 형태가 안 잡혔을 수 있으므로 경고로만 본다 - const level = status === 'draft' ? 'warn' : 'error' - for (const message of contradictions) { add(level, target, message) } diff --git a/src/content/memo/106.md b/src/content/memo/106.md index 7330618..06d71f8 100644 --- a/src/content/memo/106.md +++ b/src/content/memo/106.md @@ -3,12 +3,12 @@ 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/) @@ -24,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/121.md b/src/content/memo/121.md index fd5e84f..35aeed5 100644 --- a/src/content/memo/121.md +++ b/src/content/memo/121.md @@ -3,7 +3,7 @@ type: bookmarks tags: ['image'] 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] @@ -11,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/127.md b/src/content/memo/127.md index 7c7dd70..a999d06 100644 --- a/src/content/memo/127.md +++ b/src/content/memo/127.md @@ -3,14 +3,14 @@ type: bookmarks tags: ['extensions'] 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/15.md b/src/content/memo/15.md index abeca0b..0a088e9 100644 --- a/src/content/memo/15.md +++ b/src/content/memo/15.md @@ -3,7 +3,7 @@ type: snippet tags: ['typescript', 'function'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- ```ts @@ -14,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/233.md b/src/content/memo/233.md index 73b4564..b0a5860 100644 --- a/src/content/memo/233.md +++ b/src/content/memo/233.md @@ -3,7 +3,7 @@ type: bookmarks tags: ['ui', 'design-system', 'headless'] status: release ctime: 2022-12-05 -mtime: 2024-03-22 +mtime: 2026-07-27 --- - 공통 컴포넌트 @@ -29,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/245.md b/src/content/memo/245.md index 22e6514..23735a5 100644 --- a/src/content/memo/245.md +++ b/src/content/memo/245.md @@ -3,11 +3,11 @@ type: bookmarks tags: ['api', 'mock'] 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/57.mdx b/src/content/memo/57.mdx index 52cb467..7d50fee 100644 --- a/src/content/memo/57.mdx +++ b/src/content/memo/57.mdx @@ -3,7 +3,7 @@ type: bookmarks tags: ['node'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- import QuoteLink from '@components/QuoteLink.astro' @@ -25,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) --- From f534e873cd169cb4d047578c12bcfe4bb6da0c94 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 12:54:23 +0000 Subject: [PATCH 12/22] =?UTF-8?q?memo:=20C=20=EB=AC=B6=EC=9D=8C=20?= =?UTF-8?q?=EC=A4=91=204=EA=B0=9C=20=EC=A0=95=EB=A6=AC=20(56=C2=B7243?= =?UTF-8?q?=C2=B7307=C2=B7149)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 코드는 저자 것이라 그대로 두고 번역·AI 산문만 손봤다. - 56: 번역문 2곳 → "스택 트레이스가 남지 않는다" 한 줄. code 가 주인공이라 type note → snippet - 243: CSS Font Loading API 소개 3단락 삭제 (코드가 이미 보여주는 내용). 문장에 박혀 있던 MDN 링크는 참고로 남김 - 307: Suspense 동작 4단락 → 한 줄 (2·3 단락이 같은 말 반복) - 149: 번역된 Given/When/Then 설명 4불릿 → 한 줄. Gherkin 예시 블록 2개는 유지 309·329 는 남겨둔다 — 저자 본인이 쓴 글이라 성격이 다르다. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/content/memo/149.md | 7 ++----- src/content/memo/243.md | 8 ++++---- src/content/memo/307.md | 7 ++----- src/content/memo/56.md | 8 +++----- 4 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/content/memo/149.md b/src/content/memo/149.md index ff36c80..0883352 100644 --- a/src/content/memo/149.md +++ b/src/content/memo/149.md @@ -3,7 +3,7 @@ type: note tags: ['test', 'bdd'] status: release ctime: 2022-04-09 -mtime: 2024-03-22 +mtime: 2026-07-27 --- ```md @@ -22,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/243.md b/src/content/memo/243.md index 3287e9a..3a01f6f 100644 --- a/src/content/memo/243.md +++ b/src/content/memo/243.md @@ -3,7 +3,7 @@ type: snippet tags: ['font'] status: release ctime: 2022-12-29 -mtime: 2024-03-22 +mtime: 2026-07-27 --- ```js @@ -17,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/307.md b/src/content/memo/307.md index 032630a..3b9b960 100644 --- a/src/content/memo/307.md +++ b/src/content/memo/307.md @@ -3,7 +3,7 @@ type: snippet tags: ['react', 'suspense'] status: release ctime: 2024-06-24 -mtime: 2024-06-24 +mtime: 2026-07-27 --- ```ts @@ -12,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/56.md b/src/content/memo/56.md index 674312d..e99c6e4 100644 --- a/src/content/memo/56.md +++ b/src/content/memo/56.md @@ -1,12 +1,12 @@ --- -type: note +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 // ❌ @@ -16,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 From 4667b77b0bdb62eff29c49a9ea7f65be0d18be97 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 12:58:39 +0000 Subject: [PATCH 13/22] =?UTF-8?q?memo:=20329=20=EC=95=95=EC=B6=95=20(50?= =?UTF-8?q?=EC=A4=84=20=E2=86=92=203=EC=A4=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mermaid 다이어그램 2개 + 번호 설명 10단계였다. AI 코드 워크스루로 보이는데(다이어그램 노드에도 "이벤트가 존재합니까?" 같은 존댓말), 재사용되는 건 API 두 개였다. - Calendar.Freebusy.query 로 바쁜 일정 → 빈 슬롯 계산 - CalendarApp.getCalendarById 로 이벤트 생성 + 초대 메일 - Freebusy 를 두 번 조회하는 이유 (조회와 예약 사이의 간격) 다이어그램이 사라져 코드 블록이 없어졌으므로 type snippet → note. 309 는 저자 본인이 쓴 글이라 그대로 둔다. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/content/memo/329.md | 55 ++++------------------------------------- 1 file changed, 5 insertions(+), 50 deletions(-) diff --git a/src/content/memo/329.md b/src/content/memo/329.md index 1771321..3e9b978 100644 --- a/src/content/memo/329.md +++ b/src/content/memo/329.md @@ -1,61 +1,16 @@ --- -type: snippet +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는 슬롯을 계산할 때와 실제로 예약할 때 두 번 조회한다 — 그 사이에 일정이 생길 수 있으니. --- From 99ce2a3744f96c279f98af012786ffff4c751763 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Jul 2026 13:27:43 +0000 Subject: [PATCH 14/22] =?UTF-8?q?docs:=20lint:voice=20=EB=8A=94=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=20=EB=8C=80=EC=83=81=EB=A7=8C=20=EC=A0=9C?= =?UTF-8?q?=EC=8B=9C=ED=95=9C=EB=8B=A4=EB=8A=94=20=ED=95=9C=EA=B3=84=20?= =?UTF-8?q?=EB=AA=85=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 309 를 그대로 두기로 하면서 도구의 성격이 확정됐다. 저자가 존댓말로 쓴 자기 글(309)과 번역문(268)이 같은 신호로 잡히므로, 판정은 사람이 한다. 예외로 남긴 것(309·218)을 기록해서 나중에 "왜 이건 안 고쳤지"로 되돌아가지 않게 한다. - scripts/lint-voice.mjs: 헤더 주석에 한계와 두 사례 대비 - CLAUDE.md 압축 절: 검출 명령 + 예외 목록 - 변경 이력을 실제 수치로 갱신 (29 → 15, 공개 23 → 9) Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- CLAUDE.md | 3 ++- scripts/lint-voice.mjs | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index a67e4bf..9dc9e16 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -34,6 +34,7 @@ - **1인칭을 확인한다.** 원문을 옮기면 "제가 만든 이유"처럼 남의 1인칭이 따라 들어온다 (268.md가 그랬다). - **걷어내면 형태가 드러난다.** 부풀린 산문을 지우면 남는 게 링크뿐일 수 있다 → `type`이 바뀐다 (268.md: `note` → `bookmarks`). - 같은 내용이 두 단락에 반복되면 기계 요약의 흔적이다 (272.md). +- **검출은 `pnpm lint:voice`** (빌드 미연결). 단 이 도구는 **확인 대상만 제시하고 판단은 사람이 한다** — 저자가 존댓말로 쓴 자기 글과 번역문을 구분하지 못한다. 예외로 남긴 것: `309.md`(본인 작업 기록인데 존댓말), `218.mdx`(인용 표시가 정상). ### 하지 말 것 @@ -356,7 +357,7 @@ mtime: YYYY-MM-DD ## 변경 이력 - 각주 짝 정리: 7개 파일 (정의 없는 참조 3 / 참조 없는 정의 4). 정의가 남아 있던 3개는 번호 순서가 위치를 알려줘서 마커를 복원했고, 붙을 곳이 없던 1개는 삭제. `lint:memo`에 규칙 추가 -- 압축 원칙 추가: 존댓말을 "남의 문장" 신호로 사용. 검출된 29개(공개 23개) 중 268·272·274 정리 → 577.md +- 압축 원칙 추가: 존댓말을 "남의 문장" 신호로 사용 (`lint:voice`). 검출 29개 → 15개, 공개 23개 → 9개로 정리 (268·272·274·46·173·21·83·56·243·307·149·329). `309.md`는 저자 본인 글이라 예외로 남김 → 577.md - 태그 정규화: snake_case → kebab-case 변환 (23개 파일) - 빈 태그 메모: 28개 파일에 태그 적용 - 삭제: 427.md (내용 없음) diff --git a/scripts/lint-voice.mjs b/scripts/lint-voice.mjs index 3c7f097..b13d79d 100644 --- a/scripts/lint-voice.mjs +++ b/scripts/lint-voice.mjs @@ -8,6 +8,11 @@ * 빌드에 연결하지 않는다 — 문체는 논리적 모순이 아니라 판단이라서 * 경고가 상주하면 린터를 무시하게 된다. 필요할 때 돌리는 도구. * + * ⚠ 이 검출기는 "남의 문장"을 판정하지 못한다. **확인 대상만 제시**하고 + * 판단은 사람이 한다. 저자가 존댓말로 쓴 자기 글과 번역문을 구분할 수 + * 없기 때문이다 — 309.md는 본인의 작업 기록인데 존댓말이라 검출되고 + * (그대로 두기로 했다), 268.md는 번역문이라 정리했다. 둘이 같은 신호다. + * * pnpm lint:voice 전체 * pnpm lint:voice --release 공개 중인 것만 * pnpm lint:voice --strict 검출되면 exit 1 From 8a944e9cb434184e30b23c71d0c491be3f063ec7 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 02:08:05 +0000 Subject: [PATCH 15/22] =?UTF-8?q?memo:=20B=20=EB=AC=B6=EC=9D=8C=208?= =?UTF-8?q?=EA=B0=9C=20=EC=A0=95=EB=A6=AC=20=E2=80=94=20=EA=B3=B5=EA=B0=9C?= =?UTF-8?q?=20=EC=A4=91=20=EA=B2=80=EC=B6=9C=209=20=E2=86=92=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 검출이 산문/각주로 나뉘면서 절반이 각주 문제였던 게 드러났다. 각주만 문제였던 4개 (83 과 같은 유형): - 19: AI 도입문 + 부풀린 각주 4개 삭제. math.js 링크는 살림 - 24: 각주를 본문에 박혀 있던 기술 링크만 남김 (Three.js/Mapbox, d3-geo, satellite.js) - 221: 번역 요약은 삭제하되 피드백 사다리(산/볼더/자갈/모래/먼지)는 이 메모의 실체라 유지. [^221-3]은 저자 본인 문장만 남김 - 312: 본문은 저자 평서체 기록이라 그대로. 번역문인 각주만 줄임 산문이 본문이었던 4개: - 247: 링크 제목이 이미 말하는 설명 2개 삭제 → 링크만 - 271: deep diff 알고리즘 설명이 전부 AI 산문(코드도 없다). 라이브러리 3개가 실체 - 340: UI 클릭 7단계 삭제, COUNTIF 수식이 주인공 - 23: AI 도입문 삭제. 도입문에 달려 있던 데모 URL은 링크로 옮김 19·24 는 마커를 먼저 지워 정의가 고아가 됐는데 lint:memo 가 잡았다. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- CLAUDE.md | 5 ++++- src/content/memo/19.md | 16 ++++++---------- src/content/memo/221.md | 7 +++---- src/content/memo/23.md | 12 +++++------- src/content/memo/24.md | 13 +++++-------- src/content/memo/247.md | 13 ++++--------- src/content/memo/271.md | 21 ++------------------- src/content/memo/312.md | 4 ++-- src/content/memo/340.md | 27 +++------------------------ 9 files changed, 34 insertions(+), 84 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 9dc9e16..4d4a0e7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -357,7 +357,10 @@ mtime: YYYY-MM-DD ## 변경 이력 - 각주 짝 정리: 7개 파일 (정의 없는 참조 3 / 참조 없는 정의 4). 정의가 남아 있던 3개는 번호 순서가 위치를 알려줘서 마커를 복원했고, 붙을 곳이 없던 1개는 삭제. `lint:memo`에 규칙 추가 -- 압축 원칙 추가: 존댓말을 "남의 문장" 신호로 사용 (`lint:voice`). 검출 29개 → 15개, 공개 23개 → 9개로 정리 (268·272·274·46·173·21·83·56·243·307·149·329). `309.md`는 저자 본인 글이라 예외로 남김 → 577.md +- 압축 원칙 추가: 존댓말을 "남의 문장" 신호로 사용 (`lint:voice`). 공개 중 검출 23개 → 1개로 정리. 남은 `309.md`는 저자 본인 글이라 예외 → 577.md + - 산문 삭제/압축: 268·272·274·46·173·21·56·243·307·149·329·247·271·340·23 + - 각주만 문제였던 것: 83·19·24·221·312 (링크 제목에 이미 있는 내용을 늘려 쓴 경우. 각주에 박혀 있던 기술 링크는 살렸다) + - 걷어내니 형태가 드러나 `type`이 바뀐 것: 46·269·23·247·271(→`bookmarks`), 56·340(→`snippet`), 329(→`note`) - 태그 정규화: snake_case → kebab-case 변환 (23개 파일) - 빈 태그 메모: 28개 파일에 태그 적용 - 삭제: 427.md (내용 없음) diff --git a/src/content/memo/19.md b/src/content/memo/19.md index ca18419..8fe447e 100644 --- a/src/content/memo/19.md +++ b/src/content/memo/19.md @@ -3,21 +3,17 @@ 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/221.md b/src/content/memo/221.md index 4e082b9..7bf5cbf 100644 --- a/src/content/memo/221.md +++ b/src/content/memo/221.md @@ -3,15 +3,14 @@ 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/23.md b/src/content/memo/23.md index eb8d329..f73a6d2 100644 --- a/src/content/memo/23.md +++ b/src/content/memo/23.md @@ -1,18 +1,16 @@ --- -type: note +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/24.md b/src/content/memo/24.md index 0b64264..27ab31f 100644 --- a/src/content/memo/24.md +++ b/src/content/memo/24.md @@ -3,19 +3,16 @@ 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/247.md b/src/content/memo/247.md index ae7e4f3..c1b769b 100644 --- a/src/content/memo/247.md +++ b/src/content/memo/247.md @@ -1,16 +1,11 @@ --- -type: note +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/271.md b/src/content/memo/271.md index b31ba12..511cd9c 100644 --- a/src/content/memo/271.md +++ b/src/content/memo/271.md @@ -1,26 +1,9 @@ --- -type: note +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/312.md b/src/content/memo/312.md index cda057f..5c3fb0f 100644 --- a/src/content/memo/312.md +++ b/src/content/memo/312.md @@ -3,7 +3,7 @@ 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과의 통신 방식을 찾아봄. @@ -16,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/340.md b/src/content/memo/340.md index f4cdaeb..9c2a40e 100644 --- a/src/content/memo/340.md +++ b/src/content/memo/340.md @@ -1,34 +1,13 @@ --- -type: note +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. **완료**: - 설정이 완료되면 **완료**를 클릭하여 적용합니다. From a0feaf6cd28c90ec9cfdf9ae37ef41cd2d827c84 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 02:12:37 +0000 Subject: [PATCH 16/22] =?UTF-8?q?memo:=20=EB=B9=84=EA=B3=B5=EA=B0=9C=206?= =?UTF-8?q?=EA=B0=9C=20=EC=A0=95=EB=A6=AC=20=E2=80=94=20=EB=AC=B8=EC=B2=B4?= =?UTF-8?q?=20=EA=B2=80=EC=B6=9C=2029=20=E2=86=92=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit archive 3개는 각주, draft 3개는 산문이 문제였다. - 123: 번역된 라이브러리 소개 각주 5개를 "무엇인지"만 남김 - 125: Protobuf 소개 축약 + 중복 링크 제거 (oreilly ch04 이 두 목록에 각각 들어 있었다) - 171: 각주 1~4 는 이미 짧은데 5~7 만 번역체라 형태를 맞춤 - 182: README 번역 단락만 삭제. 저자 코멘트("그닥 부정적이다")와 인용 표시된 블록은 그대로 — 출처를 밝힌 인용은 정직하다 - 256: 4단락 AI 비교문 → 실제 차이 한 줄 (모듈 페더레이션은 빌드 레벨, single-spa 는 런타임 레벨) - 267: 강의 목차 번역에서 "~하는 방법에 대해 다룹니다" 를 걷어내고 항목만 남김 (구분자 목록 같은 구체적인 건 보존) 남은 1개는 309 — 저자 본인이 존댓말로 쓴 글이라 예외로 둔 것. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- CLAUDE.md | 5 +++-- src/content/memo/123.md | 12 ++++++------ src/content/memo/125.md | 5 ++--- src/content/memo/171.md | 8 ++++---- src/content/memo/182.md | 6 ++---- src/content/memo/256.md | 16 +++++----------- src/content/memo/267.md | 13 ++++--------- 7 files changed, 26 insertions(+), 39 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 4d4a0e7..b69bb11 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -357,10 +357,11 @@ mtime: YYYY-MM-DD ## 변경 이력 - 각주 짝 정리: 7개 파일 (정의 없는 참조 3 / 참조 없는 정의 4). 정의가 남아 있던 3개는 번호 순서가 위치를 알려줘서 마커를 복원했고, 붙을 곳이 없던 1개는 삭제. `lint:memo`에 규칙 추가 -- 압축 원칙 추가: 존댓말을 "남의 문장" 신호로 사용 (`lint:voice`). 공개 중 검출 23개 → 1개로 정리. 남은 `309.md`는 저자 본인 글이라 예외 → 577.md +- 압축 원칙 추가: 존댓말을 "남의 문장" 신호로 사용 (`lint:voice`). 검출 29개 → 1개로 정리 (공개 23개 → 0개). 남은 `309.md`는 저자 본인 글이라 예외 → 577.md - 산문 삭제/압축: 268·272·274·46·173·21·56·243·307·149·329·247·271·340·23 - 각주만 문제였던 것: 83·19·24·221·312 (링크 제목에 이미 있는 내용을 늘려 쓴 경우. 각주에 박혀 있던 기술 링크는 살렸다) - - 걷어내니 형태가 드러나 `type`이 바뀐 것: 46·269·23·247·271(→`bookmarks`), 56·340(→`snippet`), 329(→`note`) + - 비공개도 정리: 123·125·171(각주), 182·256·267(산문). 125에서 중복 링크 1개 제거 + - 걷어내니 형태가 드러나 `type`이 바뀐 것: 46·269·23·247·271·182·256(→`bookmarks`), 56·340(→`snippet`), 329(→`note`) - 태그 정규화: snake_case → kebab-case 변환 (23개 파일) - 빈 태그 메모: 28개 파일에 태그 적용 - 삭제: 427.md (내용 없음) diff --git a/src/content/memo/123.md b/src/content/memo/123.md index 8e9490d..3a315fb 100644 --- a/src/content/memo/123.md +++ b/src/content/memo/123.md @@ -3,7 +3,7 @@ type: bookmarks tags: ['json', 'search'] 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] @@ -16,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/125.md b/src/content/memo/125.md index a54a803..a19f12a 100644 --- a/src/content/memo/125.md +++ b/src/content/memo/125.md @@ -3,7 +3,7 @@ type: bookmarks tags: ['json', 'grpc', 'protobuf'] 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] @@ -13,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/171.md b/src/content/memo/171.md index 16e0032..6d03a40 100644 --- a/src/content/memo/171.md +++ b/src/content/memo/171.md @@ -3,7 +3,7 @@ type: bookmarks tags: ['font', 'text'] 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] @@ -20,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/182.md b/src/content/memo/182.md index 3b44dd5..222e15f 100644 --- a/src/content/memo/182.md +++ b/src/content/memo/182.md @@ -1,17 +1,15 @@ --- -type: note +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/256.md b/src/content/memo/256.md index 35493b2..d051f0f 100644 --- a/src/content/memo/256.md +++ b/src/content/memo/256.md @@ -1,18 +1,12 @@ --- -type: note +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/267.md b/src/content/memo/267.md index 5440452..61ac25f 100644 --- a/src/content/memo/267.md +++ b/src/content/memo/267.md @@ -3,17 +3,12 @@ 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 으로 스타일 고정. --- From d40f1ac1942b8bdf2f7fa8bda24070bfd2d5ccb2 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 02:36:44 +0000 Subject: [PATCH 17/22] =?UTF-8?q?lint:=20voice:=20author=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=ED=94=8C=EB=9E=98=EA=B7=B8=20+=20lint:voice=20?= =?UTF-8?q?=EB=A5=BC=20=EB=B9=8C=EB=93=9C=EC=97=90=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 예외를 "린트 무시"가 아니라 사실로 적는다 — voice: author 는 "이 메모의 존댓말은 저자 본인의 것"이라는 선언이다. OKF 의 generated.by 와 같은 성격이고, 577 에서 유일하게 값이 있다고 본 provenance 축이다. - content.config.ts: voice: z.enum(['author']).optional() - 309.md: voice: author (본인의 Enzyme → RTL 작업 기록) - lint-voice.mjs: 플래그가 붙은 메모는 검사에서 제외. release 는 오류, draft·archive 는 경고 — 작성 중에는 원문을 붙여놓고 줄이는 단계가 있고 archive 는 공개되지 않는다. 실패 시 무엇을 하라는지(줄이기/인용 표시/voice) 안내한다 - build: lint-memo && lint-voice --strict && astro build 픽스처로 게이트 동작 확인 — release 검출 exit 1, draft·archive·voice:author 는 exit 0. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- .claude/skills/create-memo/SKILL.md | 4 ++-- CLAUDE.md | 7 ++++-- package.json | 2 +- scripts/lint-voice.mjs | 37 ++++++++++++++++++++--------- src/content.config.ts | 2 ++ src/content/memo/309.md | 3 ++- 6 files changed, 38 insertions(+), 17 deletions(-) diff --git a/.claude/skills/create-memo/SKILL.md b/.claude/skills/create-memo/SKILL.md index 399396e..d461288 100644 --- a/.claude/skills/create-memo/SKILL.md +++ b/.claude/skills/create-memo/SKILL.md @@ -43,7 +43,7 @@ node scripts/create-memo.mjs note # 산문이 주인공 (기본값) 작성 직후 스스로 점검한다: -1. **문체** — 본문이 평서체(`~다`)인가? 존댓말(`~합니다`)이 있으면 원문을 옮긴 것이다. 줄이거나, 인용이면 `>`·`QuoteLink`로 표시한다. +1. **문체** — 본문이 평서체(`~다`)인가? 존댓말(`~합니다`)이 있으면 원문을 옮긴 것이다. 줄이거나, 인용이면 `>`·`QuoteLink`로 표시한다. (저자 본인이 존댓말로 쓴 경우에만 frontmatter에 `voice: author`) 2. **1인칭** — "제가 만든", "저희 팀은" 같은 표현은 원문 저자의 1인칭이 따라 들어온 것이다 (268.md가 그랬다). 3. **반복** — 같은 내용이 두 단락에 있으면 기계 요약의 흔적이다 (272.md). 4. **각주** — 각주도 압축 대상이다. 링크 제목에 이미 있는 내용을 늘려 쓰지 않는다 (83.md는 각주 하나가 5문장이었다). @@ -51,7 +51,7 @@ node scripts/create-memo.mjs note # 산문이 주인공 (기본값) 검사 명령: ```bash -pnpm lint:voice # 남의 문장이 남은 메모 찾기 +pnpm lint:voice # 남의 문장이 남은 메모 찾기 (빌드에도 연결됨) pnpm lint:memo # type 과 본문 형태가 맞는지 (빌드에도 연결됨) ``` diff --git a/CLAUDE.md b/CLAUDE.md index b69bb11..714bec8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -34,7 +34,8 @@ - **1인칭을 확인한다.** 원문을 옮기면 "제가 만든 이유"처럼 남의 1인칭이 따라 들어온다 (268.md가 그랬다). - **걷어내면 형태가 드러난다.** 부풀린 산문을 지우면 남는 게 링크뿐일 수 있다 → `type`이 바뀐다 (268.md: `note` → `bookmarks`). - 같은 내용이 두 단락에 반복되면 기계 요약의 흔적이다 (272.md). -- **검출은 `pnpm lint:voice`** (빌드 미연결). 단 이 도구는 **확인 대상만 제시하고 판단은 사람이 한다** — 저자가 존댓말로 쓴 자기 글과 번역문을 구분하지 못한다. 예외로 남긴 것: `309.md`(본인 작업 기록인데 존댓말), `218.mdx`(인용 표시가 정상). +- **검출은 `pnpm lint:voice`** — 빌드에 연결됨. `release` 메모에서 검출되면 빌드가 실패하고, `draft`·`archive`는 경고까지만이다(작성 중에는 원문을 붙여놓고 줄이는 단계가 있으므로). +- 단 이 도구는 **확인 대상을 제시하고 판단은 사람이 한다** — 저자가 존댓말로 쓴 자기 글과 번역문이 같은 신호로 잡힌다. 본인 문체라고 판단했으면 frontmatter에 **`voice: author`**를 달아 제외한다. "린트를 무시한다"가 아니라 "이 문체는 내 것이다"라는 사실을 적는 것 (`309.md`가 그 경우). ### 하지 말 것 @@ -73,6 +74,7 @@ ctime: YYYY-MM-DD # 필수, 생성일 mtime: YYYY-MM-DD # 필수, 수정일 title: 제목 # 선택 description: 설명 # 선택 +voice: author # 선택, 이 메모의 존댓말이 저자 본인의 것일 때 (lint:voice 제외) parent: '307' # 선택, 이 메모가 이어지는/대체하는 부모 메모 ID relation: continues # 선택, 'continues'(기본) 또는 'supersedes' --- @@ -357,10 +359,11 @@ mtime: YYYY-MM-DD ## 변경 이력 - 각주 짝 정리: 7개 파일 (정의 없는 참조 3 / 참조 없는 정의 4). 정의가 남아 있던 3개는 번호 순서가 위치를 알려줘서 마커를 복원했고, 붙을 곳이 없던 1개는 삭제. `lint:memo`에 규칙 추가 -- 압축 원칙 추가: 존댓말을 "남의 문장" 신호로 사용 (`lint:voice`). 검출 29개 → 1개로 정리 (공개 23개 → 0개). 남은 `309.md`는 저자 본인 글이라 예외 → 577.md +- 압축 원칙 추가: 존댓말을 "남의 문장" 신호로 사용. 검출 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개 파일에 태그 적용 diff --git a/package.json b/package.json index dd1c8d7..ac1e72c 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "scripts": { "dev": "astro dev", "start": "astro dev", - "build": "node scripts/lint-memo.mjs && astro build", + "build": "node scripts/lint-memo.mjs && node scripts/lint-voice.mjs --strict && astro build", "preview": "astro preview", "astro": "astro", "test": "vitest", diff --git a/scripts/lint-voice.mjs b/scripts/lint-voice.mjs index b13d79d..236d4a5 100644 --- a/scripts/lint-voice.mjs +++ b/scripts/lint-voice.mjs @@ -5,17 +5,22 @@ * 평서체("~다")로 쓴다. 그래서 인용 표시 없이 존댓말이 지배하는 부분은 * 아직 내 언어로 줄이지 않은 남의 문장이다. (→ 577.md) * - * 빌드에 연결하지 않는다 — 문체는 논리적 모순이 아니라 판단이라서 - * 경고가 상주하면 린터를 무시하게 된다. 필요할 때 돌리는 도구. + * ⚠ 이 검출기는 "남의 문장"을 판정하지 못한다. **확인 대상을 제시**하고 + * 판단은 사람이 한다. 저자가 존댓말로 쓴 자기 글과 번역문이 같은 신호로 + * 잡히기 때문이다 — 309.md는 본인의 작업 기록인데 존댓말이고, 268.md는 + * 번역문이었다. * - * ⚠ 이 검출기는 "남의 문장"을 판정하지 못한다. **확인 대상만 제시**하고 - * 판단은 사람이 한다. 저자가 존댓말로 쓴 자기 글과 번역문을 구분할 수 - * 없기 때문이다 — 309.md는 본인의 작업 기록인데 존댓말이라 검출되고 - * (그대로 두기로 했다), 268.md는 번역문이라 정리했다. 둘이 같은 신호다. + * 그래서 저자 본인의 문체라고 판단했으면 frontmatter 에 `voice: author` + * 를 달아 검사에서 제외한다. "린트를 무시한다"가 아니라 "이 문체는 내 + * 것이다"라는 사실을 적는 것이다 (309.md). * * pnpm lint:voice 전체 * pnpm lint:voice --release 공개 중인 것만 - * pnpm lint:voice --strict 검출되면 exit 1 + * pnpm lint:voice --strict 공개(release) 메모에서 검출되면 exit 1 + * + * --strict 가 release 만 막는 이유: draft 는 작성 중이라 원문을 붙여놓고 + * 줄이는 단계가 있을 수 있고, archive 는 공개되지 않는다. 막아야 하는 건 + * "남의 문장이 공개되는 것"이다. */ import fs from 'node:fs' import path from 'node:path' @@ -67,6 +72,7 @@ const analyze = (raw) => { return { type: field('type'), status: field('status'), + voice: field('voice'), prose: prose.join('\n'), footnotes: footnotes.join('\n'), } @@ -84,6 +90,8 @@ for (const file of files) { 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) @@ -109,6 +117,7 @@ for (const file of files) { if (where.length > 0) { findings.push({ + level: analyzed.status === 'release' ? 'error' : 'warn', file: path.join(DIR, file), type: analyzed.type, status: analyzed.status, @@ -117,16 +126,22 @@ for (const file of files) { } } -for (const { file, type, status, where } of findings) { - console.log(`! ${file} [${type} / ${status}]`) +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 ? ' (공개 중인 것만)' : ''}` + `${releaseOnly ? ' (공개 중인 것만)' : ` (그중 공개 ${published.length}개)`}` ) -if (strict && findings.length > 0) { +if (strict && published.length > 0) { + console.log( + '\n공개 메모에 남의 문장이 남아 있다. 줄이거나, 인용이면 표시하거나,' + + '\n저자 본인의 문체라면 frontmatter 에 voice: author 를 단다.' + ) process.exit(1) } diff --git a/src/content.config.ts b/src/content.config.ts index 8ae0fb8..9452365 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -12,6 +12,8 @@ const memo = defineCollection({ 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/309.md b/src/content/memo/309.md index f5a06b2..02a9294 100644 --- a/src/content/memo/309.md +++ b/src/content/memo/309.md @@ -2,8 +2,9 @@ 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를 다루는 구현 부분에서 약간의 애매함이 있었습니다. 개인적으로는 기존 접근 방식이 나쁘지 않았다고 생각했기 때문에, 새로운 접근 방식으로 전환하는 데 주저하게 되었습니다. From 57b97f06ee02efb137c96f2ec8b4fbe2cda20555 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 02:44:24 +0000 Subject: [PATCH 18/22] =?UTF-8?q?find-related:=20parent=20=ED=9B=84?= =?UTF-8?q?=EB=B3=B4=EC=97=90=20URL=20=EA=B2=B9=EC=B9=A8=20=EC=8B=A0?= =?UTF-8?q?=ED=98=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 태그만 보면 놓치는 관계가 있다. 같은 글을 가리키는 메모쌍 29개 중 14쌍은 공유 태그가 0개여서 태그 IDF 로는 영원히 만나지 못한다. 같은 URL을 가리킨다는 건 태그보다 직접적인 증거다. - 메모 ID 로 호출하면 태그 + URL 둘 다 본다 (태그로 호출하면 파일이 아직 없을 수 있으므로 태그만) - 어떤 URL이 겹치는지 함께 출력한다 - URL 정규화는 쿼리를 유지한다 (youtube.com/watch?v=... 가 전부 같은 URL로 뭉치는 문제) - --all: 비공개까지. 29쌍 중 16쌍은 양쪽 다 비공개라 기본으로는 안 보이는데, 그건 계보가 아니라 통합 후보다 - IDF 는 공개 코퍼스로 고정해 --all 여부로 점수가 흔들리지 않게 - 남아 있던 STRUCTURAL_TAGS 잔해 제거 (태그는 이미 type 으로 옮겼다) 검증: 229 → 235 가 공유 URL 2개로 1위 (dotenv-expand, SO 질문). 106 → 365 는 --all 에서만 나온다 (365 가 archive). Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- .claude/skills/create-memo/SKILL.md | 14 ++-- CLAUDE.md | 3 +- scripts/find-related.mjs | 103 +++++++++++++++++++++++----- 3 files changed, 98 insertions(+), 22 deletions(-) diff --git a/.claude/skills/create-memo/SKILL.md b/.claude/skills/create-memo/SKILL.md index d461288..5894d19 100644 --- a/.claude/skills/create-memo/SKILL.md +++ b/.claude/skills/create-memo/SKILL.md @@ -64,13 +64,18 @@ pnpm lint:memo # type 과 본문 형태가 맞는지 (빌드에도 ### 절차 -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. **관계 판단**: 상위 후보의 내용을 읽고 새 메모와의 관계를 판단한다. @@ -86,7 +91,8 @@ pnpm lint:memo # type 과 본문 형태가 맞는지 (빌드에도 - `parent`는 **하나만** 건다 (가장 직접적인 부모). 곁가지(branch)는 같은 부모를 공유하면 자동 도출되므로 명시 불필요. - 애매하면 **연결하지 않는다.** 약한 연결은 노이즈. 자동 관련 메모로 충분. -- `parent`는 `release` 메모만 해석됨 — draft를 부모로 걸지 않는다. +- `parent`는 `release` 메모만 해석됨 — draft·archive를 부모로 걸지 않는다. +- **URL이 겹치는데 계보가 아닌 경우도 있다.** 넓은 링크 모음이 특정 주제 메모와 한 링크를 공유하는 정도면 연결하지 않는다 (106↔365가 그런 경우). 같은 흐름의 작업 기록이어야 `parent`다 (229↔235). ## 메모 작성 원칙 (CLAUDE.md 준수) diff --git a/CLAUDE.md b/CLAUDE.md index 714bec8..09a9d2f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -86,7 +86,7 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' | 레이어 | 필드 | 의미 | |---|---|---| -| 자동 유사도 | (없음) | 공유 태그 IDF 가중 → "관련 메모" 자동 노출 | +| 자동 유사도 | (없음) | 공유 태그 IDF 가중 → "관련 메모" 자동 노출 (사이트) | | 방향 계보 | `parent` | 이 메모가 어떤 메모에서 이어졌는지 (시간/계보) | | 관계 종류 | `relation` | `continues`(이어짐) / `supersedes`(부모를 대체) | @@ -94,6 +94,7 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' - **branch**: 같은 `parent`를 가진 메모가 2개 이상 = 자동 분기 (별도 표기 불필요) - **supersedes**: `relation: supersedes`면 부모 페이지에 "대체됨" 경고 표시 - `parent`는 `release` 메모만 해석됨 (draft·archive는 공개되지 않음) +- **후보 탐색은 `node scripts/find-related.mjs <메모ID>`** — 공유 태그와 **공유 URL** 두 신호를 본다. 같은 글을 가리키는 메모쌍 29개 중 14쌍은 공유 태그가 0개라 태그만으로는 만나지 못한다. `--all`은 비공개까지 보여주는데 그건 계보가 아니라 통합 후보다 → 577.md ### Type 기준 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}`) + } } } From f748ea9217ba023dd3e215a5ea8c3e5f8912cc36 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 02:51:09 +0000 Subject: [PATCH 19/22] =?UTF-8?q?related:=20=EC=82=AC=EC=9D=B4=ED=8A=B8=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=A9=94=EB=AA=A8=EC=97=90=EB=8F=84=20URL?= =?UTF-8?q?=20=EA=B2=B9=EC=B9=A8=20=EC=8B=A0=ED=98=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 태그 IDF 만 보면 놓치는 관계가 있다. getRelatedMemos 에 공유 URL 개수를 더한다 (find-related.mjs 와 같은 가중치). 공개 274개에 대한 영향: - 관련 메모가 아예 없다가 생긴 메모 2개 (#197, #485 — 태그로는 어디에도 걸리지 않는데 URL 로 연결된다) - 1위가 바뀐 메모 11개 - URL 때문에 새로 목록에 든 항목 7개 = 4쌍 새로 연결된 4쌍 전부 확인했다: - 51 ↔ 485 concurrently (CRA+tailwind 동시 실행 / 병렬·순차 실행) — 태그가 하나도 겹치지 않는다 - 315 ↔ 327 vitest 가짜 타이머 - 197 ↔ 255 vite JSX 파싱 discussion - URL 정규화는 쿼리 유지 (youtube.com/watch?v=... 뭉침 방지) - 본문 파싱은 memo.id 로 캐시 — 페이지마다 274개를 다시 훑지 않게 - 태그가 비어도 URL 이 있으면 후보를 찾는다 (이전엔 즉시 [] 반환) Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/collection/memo.ts | 49 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/collection/memo.ts b/src/collection/memo.ts index dde8245..cd75fd2 100644 --- a/src/collection/memo.ts +++ b/src/collection/memo.ts @@ -13,6 +13,41 @@ export const getRandomMemoCollection = async () => { return memos } +// 쿼리를 버리면 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'>[] ): Map => { @@ -35,8 +70,9 @@ export const getRelatedMemos = async ( const df = buildDocumentFrequency(memos) const currentTags = new Set(current.data.tags) + const currentUrls = getUrls(current) - if (currentTags.size === 0) { + if (currentTags.size === 0 && currentUrls.size === 0) { return [] } @@ -45,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) From 5beb7d52779ab115e93445e4dc6c870a23b68718 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 03:02:32 +0000 Subject: [PATCH 20/22] =?UTF-8?q?lint:=20=EC=A3=BD=EC=9D=80=20=EB=A7=81?= =?UTF-8?q?=ED=81=AC=20=EA=B2=80=EC=82=AC=20=EC=8A=A4=ED=81=AC=EB=A6=BD?= =?UTF-8?q?=ED=8A=B8=20(pnpm=20lint:links)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mtime 이 신선도가 아니라서(288개가 일괄값) 신선도는 링크로 판정한다. 코퍼스 절반이 bookmarks 이고 본문이 링크뿐이라, 죽은 링크는 곧 메모 전체가 무효라는 뜻이다. 빌드에는 연결하지 않는다 — 네트워크에 의존하고 느리고, 남의 서버 상태로 내 빌드가 깨지면 안 된다. 거짓 양성을 만들지 않는 데 신경 썼다: - 죽음으로 단정하는 건 404·410·ENOTFOUND 뿐. 403·405·429·타임아웃은 "확인 불가"로 따로 센다 (봇 차단이 흔하다) - HEAD 를 막는 서버가 많아 405·501·403 이면 GET 으로 재시도 - 연결 실패가 절반을 넘으면 판정하지 않고 exit 2 (오프라인·프록시) - 확인 불가가 절반을 넘으면 판정을 신뢰하지 말라고 알린다 — 이 저장소의 원격 실행 환경이 CONNECT 를 막고 403 을 돌려준다 - 코드 블록 안의 URL 은 예시일 수 있어 제외 - 같은 URL 을 여러 메모가 가리키면 한 번만 확인하고 소유 메모를 함께 표시 로컬 서버로 상태 코드별 동작 검증: 404·410 → 죽음, 403 → 확인 불가, 405(HEAD) → GET 재시도 후 살아 있음, 302 → 따라간 뒤 살아 있음, 코드 블록 URL 제외, 중복 URL 1회 확인, --strict exit 1. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- CLAUDE.md | 13 +++ package.json | 3 +- scripts/lint-links.mjs | 219 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 scripts/lint-links.mjs diff --git a/CLAUDE.md b/CLAUDE.md index 09a9d2f..a3ee32e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -141,6 +141,19 @@ relation: continues # 선택, 'continues'(기본) 또는 'supersedes' - **참조와 정의는 짝이 맞아야 한다** — `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·타임아웃은 봇 차단이 흔하므로 "확인 불가"로 따로 센다. + ### 본문 구조 자유 형식. 유형에 따라 적절히 선택. diff --git a/package.json b/package.json index ac1e72c..f0163d3 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "test": "vitest", "lint:fix": "eslint --fix .", "lint:memo": "node scripts/lint-memo.mjs", - "lint:voice": "node scripts/lint-voice.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/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() From 71f268921c5ed7521075adee15994a6e74932e68 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 03:24:10 +0000 Subject: [PATCH 21/22] =?UTF-8?q?feat:=20/type/[type]=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=ED=8E=98=EC=9D=B4=EC=A7=80=20(bookmarks=2049=20/=20snippet?= =?UTF-8?q?=20173=20/=20note=2052)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bookmarks 를 태그에서 type 으로 옮기면서 /tagged/bookmarks 가 사라졌는데 대체 경로가 없었다. tagged/[tag].astro 와 같은 구조로 형태별 목록을 만든다. 입구는 /tagged 인덱스에 뒀다 — 형태는 태그가 아니지만 훑어보는 자리는 같아서, 태그 구름 위에 개수와 함께 링크한다. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/pages/tagged/index.astro | 20 +++++++++++++++ src/pages/type/[type].astro | 48 ++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/pages/type/[type].astro 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 ( + + + + ) + }) + } + + From 4a0f5dc578b34905c40b038c3709be172ff7a319 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 28 Jul 2026 03:27:47 +0000 Subject: [PATCH 22/22] =?UTF-8?q?memo:=20=EC=B2=AB=20=EA=B3=84=EB=B3=B4=20?= =?UTF-8?q?3=EC=8C=8D=20=EC=97=B0=EA=B2=B0=20(parent=200=20=E2=86=92=203)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit find-related 가 제시한 URL 겹침 후보 6쌍(release↔release)을 읽고 판단했다. 3쌍은 계보고 3쌍은 주제만 겹친다. 연결: - 235 → 229 같은 문제(.env 버전 문자열)를 3주 뒤 이어감. 235 는 timestamp 대안을 보고 결국 같은 결론 - 327 → 315 가짜 타이머. 315 는 vitest/jest 개요, 327 은 Countdown 에 적용한 구체 사례 - 255 → 197 197 은 정규식으로 JSX 파일을 찾아 git mv 했고, 255 는 같은 판별을 acorn-jsx 파서로 제대로 한다 연결 안 함 (주제만 겹침 — 자동 관련 메모로 충분): - 145~148 일반 테스트 가이드 vs mocking. ctime 이 둘 다 마이그레이션 일괄값이라 순서도 알 수 없다 - 28~510 캘린더 라이브러리 모음 vs 겹침 처리 알고리즘 - 51~485 같은 도구(concurrently)를 다른 목적으로 쓴 것 부수 수정: 발췌에 각주 참조 마커가 그대로 남아 있었다 ([^235-1] 등). 계보 라벨에서 드러나 clean() 에서 제거 — 관련 메모 목록에도 같이 적용된다. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Qv2pQrCq9z1GaxxDu2vohK --- src/components/Memo/RelatedMemos.utils.ts | 2 ++ src/content/memo/235.md | 3 ++- src/content/memo/255.md | 3 ++- src/content/memo/327.md | 3 ++- 4 files changed, 8 insertions(+), 3 deletions(-) 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/memo/235.md b/src/content/memo/235.md index 0d46ac6..48f29b3 100644 --- a/src/content/memo/235.md +++ b/src/content/memo/235.md @@ -3,7 +3,8 @@ 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/255.md b/src/content/memo/255.md index 282cab1..5f1333a 100644 --- a/src/content/memo/255.md +++ b/src/content/memo/255.md @@ -3,7 +3,8 @@ 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/327.md b/src/content/memo/327.md index 6891a41..cfbb69c 100644 --- a/src/content/memo/327.md +++ b/src/content/memo/327.md @@ -3,7 +3,8 @@ 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`을 사용하기.