References
โ๊ทธ๋๋ค์ ์ด๋ป๊ฒ ์ด ๊ฒ์ธ๊ฐ #์ ๋๋ฉ์ด์ .โ 2024. In ์ํค๋ฐฑ๊ณผ, ์ฐ๋ฆฌ ๋ชจ๋์ ๋ฐฑ๊ณผ์ฌ์ . https://ko.wikipedia.org/w/index.php?title=๊ทธ๋๋ค์_์ด๋ป๊ฒ_์ด_๊ฒ์ธ๊ฐ&oldid=37829417.
Han, Jung. (2025) 2025. โJunghan0611/Dotemacs.โ https://github.com/junghan0611/dotemacs.
Jason Walsh. 2025. โJwalsh/Hy-Algorithms: Algorithms and Data Structures Implemented in Hy, a Lisp Dialect for Python.โ https://github.com/jwalsh/hy-algorithms/tree/main.
โLearn Anything.โ n.d. Accessed September 12, 2024. https://learn-anything.xyz/.
โLearn-Anything/Books: Awesome Books.โ n.d. Accessed March 27, 2025. https://github.com/learn-anything/books.
โLearn-Anything/Learn-Anything.โ (2016) 2024. Learn Anything. https://github.com/learn-anything/learn-anything.
MatthewZMD. 2025. โMatthewZMD/Aidermacs: Emacs AI Pair Programming Solution.โ https://github.com/MatthewZMD/aidermacs.
neo. 2025. โHacker News ์ ๋ช ๋ ๊ธฐ์ค ์ต๊ณ ์ ๊ฐ์ธ ๋ธ๋ก๊ทธ๋ค.โ GeekNews. March 26, 2025. https://news.hada.io/topic?id=19972.
susam. 2025. โIndieweb์ ๋์คํ๋ ํ์๊ฐ ์๋ค.โ GeekNews. March 22, 2025. https://news.hada.io/topic?id=19889.
Zeng, Matthew. (2025) 2025. โMatthewZMD/Emigo Spiritual Successor of Aidermacs.โ https://github.com/MatthewZMD/emigo.
2025-03-24 Mon
- @๋๋ฅดํฌ๊ทธ๋ก์ #์ถ๊ณผ์ฌ๋์๋น ์ง์์ด์ฒ๋ผ #์ผ์ #์ ๋น์ฃผ์์
- @๋์ค๋ฏธ๋ฐฐ๋ฐ ์ฝ๊ธฐ ์ฐ๊ธฐ์ ๋ฏธ๋ - ์ธ์ดํ์
- @๋งฅ์ค๋ฒ ๋ท ์ง๋ฅ์ ๊ธฐ์ - ์ฐ๋ฆฌ์ ๋ ๊ทธ๋ฆฌ๊ณ AI๋ฅผ ๋ง๋ ๋ค์ฏ ๋ฒ์ ํ์
- (susam 2025)
03:16 ๊นจ๋ค. ๊ณต์ด์ ์ฐํ์ฌ
06:51 ๊ธฐ์
09:16 ๋ฐ๋ก ์ด ๋ฑ์
10:51 ์ฐ์ฒด๊ตญ ๋น ๋ฅธ๋ฑ๊ธฐ - ํ๋ฐฐ ์๋ฅ ์ฒ๋ฆฌ : ์๋ด
๋ฐ๊ฐํ๋ฐฐ ๋ถ๊ฐ. 5kg ์ด์์ด๋ผ.
13:01 ๋ฐ๋ก ํฝ์
14:00 ์์ฃผ๋ ์ฒญ์๋ ์ํ๊ณผ ์๋ ๋ฅด๊ธฐ -> ๋กฏ๋ฐ๋ชฐ ์ํ๊ด -> ๋ถ๋ชจ๋ ๋ ์ด๋
18:14 ์น ๋ณด ์์ฌ ์ค
19:54 ์ง๋์ฐฉ ์์
21:02 ์์ ํผ๊ณค ์๋ค
23:37 ์ ์ ๊นผ๋ค ์์ง?
2025-03-25 Tue
01:38 ๋ ๊นผ๋ค
05:20 ์ผ์ด๋๋ผ ๋ฐ๋ง๋ ์ ๋ํ๋ฏผ๊ตญ!
07:01 ๋ฐฑ์น์ฌ!
07:33 ์๋ด ์ถ๊ทผ ์ง์ ๋ง๋ด
08:57 ๋ฐ๋ก ๊ธฐ์
10:00 ์ค์๋์๊ด ์ฒดํฌ์ธ
12:01 ์์ฃผ ๊ท์ฐฎ์ ๋ฌธ์ ํด๊ฒฐ - ๋ ์ด๋งฅ์ค
#LLM: Warning (emacs): Org version mismatch. ์ค๋ง๋ฆฌ๋ฅผ ์ก์๋๋ฐ, ๊ฑด๋ค์ง ๋ง๋ผ๋ ๊ฒ. ๊ธฐ๋ณธ์์ ๊ฑด๋๋๊น ๋ฐ์ํ๋ ๋ฌธ์ ๋ผ๋ ๊ฒ
13:34 ์ข์. ์ฑ ์ ๋ง๋๋ ๊ฒ ๋ง์ด์ผ.
14:24 ํ๋ก๊ทธ๋๋จธ ์ฐฝ์์ฑ ๊ด๋ จ ์ฑ ๋ค์ด ๋ง๋ค
14:28 ๋ฐฐ๊ณ ํ์ง๋ง ์ญ ๋ฌ๋ฆฌ๊ธฐ๋ก
16:01 ๊ธด๊ธ ๋ธ๋ ์ธ์์
16:33 ์ข์ - ๋ญ๊ฐ?
18:49 ๋๋์ด ์์ฌ
2025-03-26 Wed
02:48 ๊นจ์ด๋ ๋ ์ - ๊ฟ
06:18 ๊ธฐ์
08:52 ๋ฐ๋ก - ๋ฑ์ ๋ฃจํด - ์ ๋ฐ์ดํธ
10:30 ์ค์๋์๊ด ์ฒดํฌ์ธ
12:10 ๋ฐฐ๊ณ ํ๋ค ์์ ๋ณด๊ธ
13:33 Lex Friedman ํ์ผ์คํธ(ThePrimeagen ์ธํฐ๋ทฐ) - Emacs vs. NeoVIM (feat. ADHD)
14:12 POSSE ๋ธ๋ก๊น ์ ๋ต - ๋์งํธ๊ฐ๋ - ์ธ๋์น - ๊ณต์
์ด๊ฒ์ ์์ง๋ง๋ผ
15:25 ๋ธ๋ ์ธ์์ ๊ธด๊ธ -> ์๋ฃ
15:48 ์ ๊ธฐํ ๊นํ
17:02 jira ํ๋ก์ ํธ ๊ด๋ฆฌ ํ์ - ์ด๋งฅ์ค ์ด๊ฒ์ด ๋์ ๋ค์ด์๋ค
18:00 ์ฒดํฌ์์ - ๋ฑ์ด๋ค๋ทํ 5500์ ๋ ๊ทธ๋ฆ -> ๋ฐ๋ก ์์ ๊ฑฐ ๋๊ณ ์ง์ผ๋ก
19:00 ์ง์ ์์ ๋ ์ค ์ธํฐ๋ทฐ ๋ค์ผ๋ฉฐ ์์
19:43 ๋ฐ๋ก ํ ์๋ฒ์ง ์ฐจ ํ๊ณ ์ค๋ ์ค
20:46 ๋ฐ๋ก ์ด์ ์ด ๋ฆ๊ณ ์์ - ์ค๋์ค๋ถ ๋ฃ๋ค๊ฐ ์ ์์
22:33 ์๋ด ์๊ตฌ๋ ๊ฑฐ์ค๋ก ์ด๋ ์์
2025-03-27 Thu
01:09 ํจ๋ ์ ์๋
05:50 ๊ธฐ์
07:06 ๋น๊ฐ ์ค๋ ๊ตฌ๋
08:15 ๋ฐ๋ก ์ด๋ ์คํ์ง๋ฐฅ ๋ณด๋ ์ค
09:29 ์ค์๋์๊ด ์ฒดํฌ์ธ
10:40 ์ ๋งํฌ ํญํ์ด๋ค
- ๊ธฐ์ ๋ธ๋ก๊ทธ ๋ชจ์
- ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ ์ฑ
10:53 ํด์ปค์ค๋ด์ค ์ ๋ช ํ ๋ธ๋ก๊ทธ ๊ทธ๋ฆฌ๊ณ
์ด๋ค์ ๊ตฌ๋ ์์คํ ๊ณผ ๊ธ ๋ถ๋ฅ
Hacker News ์ ๋ช ๋ ๊ธฐ์ค ์ต๊ณ ์ ๊ฐ์ธ ๋ธ๋ก๊ทธ๋ค
(neo 2025)
- neo
- Hacker News์์ ์ธ๊ธฐ ์๋ ๊ฐ์ธ ๋ธ๋ก๊ทธ๋ฅผ ์์๋ณ๋ก ๋์ดํ ๋ชฉ๋ก์ผ๋ก, ๊ฐ ๋ธ๋ก๊ทธ์ ์ ์, ์ฃผ์ ๋ฐ ์ด ์ ์๋ฅผ ํ์๋ค์ํ ๊ธฐ์ ๋ฐ ๋น์ฆ๋์ค ์ฃผ์ ๋ฅผ ๋ค๋ฃจ๋ฉฐ, ๋ ๋ฆฝ ์ ๋๋ฆฌ์คํธ๋ถํฐ ๊ธฐ์ ๋ถ์๊ฐ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ๋ฐฐ๊ฒฝ์ ์ ์๋ค์ด ํฌํจHacker News ์ธ๊ธฐ ๊ฐ์ธ ๋ธ๋ก๊ทธ ์์paulgraham.com์ด ์ ์: 96,443์ ์: Paul Graham์๊ฐ: Y
- 2025
12:00 ํด๋ก์ ์ฝํ๋ฆฐ - ์๋ฐ๊ฐ์๋จธ์ - ๊ทธ๋ฆฌ๊ณ ํ์คํ
#LLM: JVM ์๋ฐ๊ฐ์๋จธ์ - ์ฝํ๋ฆฐ ํด๋ก์ #์ฝํ๋ฆฐ๊ณผ ํด๋ก์ ์๋ฐ ๊ฐ์๋จธ์ ์ ๋ฏธ๋์ ๋ํ ์๊ฐ
11:18 ๋ฒ๊ทธํฝ์ค ํ์ - vertico childframe
#LLM: marginalia vertico-multiform - sort-modified - emacs
13:04 defrecord - ํด๋ก์ ํ์ด๋ญ ์กฐ์ง๋ชจ๋ ์ด๋งฅ์ค LLM
๋๋ผ์ด ์กฐ์ง์ด๋ผ.
13:29 ๋งํฌ ์ค์ค์ด์ ํ๋ฃจ - ์ด๊ฑธ ๋ ธํธ๋ก ๋ง๋ค๋ ค๋ค๊ฐ?!
๋ค๋ค ์ด๋ป๊ฒ ํ๋๊ฐ? ๊ถ๊ธํ๋ค
14:53 ๋ฐฐ๊ณ ํ๋ค - ์ดํ ์ผ์ ์ ์ก์๋ณด์
15:19 ๋๊ฐ์
16:18 ๋ฑ์ด๋ค๋ทํ 5500์ ์์ฌ -> ์ ์น์ ์ปดํจํฐ ๋ด์ค
17:00 ํผ์คํธ์ถ๊ตฌํด๋ฝ
18:29 ์ง ๋์ฐฉ
19:24 ๋ฐ๋ก ์ด์ ์ ๋ ๋จน๋ ์ค
19:53 ์ป์ ๋ฐ๋ก ์
21:16 ๋ฐ๋ก ์ด์ ์ค๋์ค๋ถ ์ฌ์ฐ์
22:24 ์งฆ์ ๋ง๋จ์์๋ ๊น์ ๋๋
์ค๋ ์ด ์ฌ๋์ ์ธ์์ ์งง์ ๋ง๋จ์์ ๋๋ด์๋ค.
- @์ด๋ถ์ #์นผ์ต #๋ถ์์ฌ๋ฆฌํ #์์ #์๊ธฐ์คํ #๋ฌด์์
- @๋น์๋ํฐ์ฝ #๋ด๊ฐํ๋ฆด์๋์์ต๋๋ค #์ฒ์ #ํ์ #์ธ์์์ #๋ฃจ๊ฒ๋ฆญ๋ณ
2025-03-28 Fri
02:13 ๊ฐ์๊ธฐ ๊นจ์ ์์ ์ค
05:56 ์ผ์ด๋ ๊น? ๊ทธ๋กํนํ๋ผ
07:25 ์๋ฐฑ์ค๋ ์ฑ ๋ค์ ๋ค์ผ๋ฉฐ ๋ง์ธ๋์
08:20 ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ฐฐ์ฐ๋ฉฐ ์์ ํ๋ ๋ฐฉ๋ฒ - grok API
ํ์ด์ฌ?!
09:03 khoj RAG - ํ์ด์ฌ ๋ฒ ์ด์ค์ฝ๋ ๋ถ์
khoj-ai: personal AI second brain
11:12 ์ ๊ฒฝ๋์๊ด ์ฒดํฌ์ธ
๊ทธ๋๋ค์ ์ด๋ป๊ฒ ์ด ๊ฒ์ธ๊ฐ #์ ๋๋ฉ์ด์
(โ๊ทธ๋๋ค์ ์ด๋ป๊ฒ ์ด ๊ฒ์ธ๊ฐ #์ ๋๋ฉ์ด์ โ 2024)
-
ใ๊ทธ๋๋ค์ ์ด๋ป๊ฒ ์ด ๊ฒ์ธ๊ฐใ(์ผ๋ณธ์ด: ๅใใกใฏใฉใ็ใใใ ๊ธฐ๋ฏธํ์น์ ๋ ์ดํค๋ฃจ์นด[*])๋ 2023๋ ์ผ๋ณธ์ ์ ๋๋ฉ์ด์ ์ํ์ด๋ค. ๋ฏธ์ผ์ํค ํ์ผ์ค๊ฐ ๊ฐ๋ ์ ๋งก๊ณ ์คํ๋์ค ์ง๋ธ๋ฆฌ์์ ์ ์ํ์๋ค. 2013๋ ์ํ ใ๋ฐ๋์ด ๋ถ๋คใ ์ดํ ๋ฏธ์ผ์ํค ํ์ผ์ค ๊ฐ๋ ์ 10๋ ๋ง์ ๋ณต๊ท์์ด๋ค. ์์๋ ธ ๊ฒ์๋ถ๋ก์ ์์ค ใ๊ทธ๋๋ค, ์ด๋ป๊ฒ ์ด ๊ฒ์ธ๊ฐใ๋ก๋ถํฐ ์ํ์ ์ ๋ชฉ์ ๋ฐ ์์ง๋ง, ์์์ ์ง์ ์ ์ผ๋ก ๊ฐ์ํ ๊ฒ์ ์๋๋ฉฐ, ์ด ์์ค์ด ์ฃผ์ธ๊ณต์๊ฒ ํฐ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค๋ ํ์์ผ๋ก ์ฐ๊ด์ง๊ณ ์๋ค. ์ฅ๋ฅด ์์ฒด๋ ๋ชจํ ํํ์ง๋ก ์๊ฐ๋๊ณ ์๋ค. ์ 96ํ ์์นด๋ฐ๋ฏธ์ ์ฅํธ ์ ๋๋ฉ์ด์ ์ ์์์์ด๋ค.
-
2024
Learn Anything - ๋ฌด์์ด๋ ๋ฐฐ์ธ ์ ์๋ ๋ญ๊ฐ๋ค
(โLearn Anythingโ n.d.)
2024-09-12 ์ด๋ ์ฐพ์๊ฒ์ธ๋ฐ ๋ ๋ง๋๋ค
learn-anything/books: Awesome Books
(โLearn-Anything/Books: Awesome Booksโ n.d.)
learn-anything/learn-anything
(โLearn-Anything/Learn-Anythingโ [2016] 2024)
-
Organize worldโs knowledge, explore connections and curate learning paths
-
2024
11:45 ์ผ๋จ ๋ฌด์ํ๊ฒ ํ ๊ถ์ ์ข ๋ณด์ ์ง๋ฃจํด๋
13:10 ๋ฆฌ์คํ๋ก ํต์ผํ๋ ๊ฒ - ์ ์ฒด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
ํด๋ก์ ํ์ด๋ญ ํ๋๋ก ํ์ ์ธํ๋ผ๋ ๋์ผํ๊ฒ ๊ฐ๋ฅํ๋ค. ํ์ด๋ญ ํ๋๋ง ํ ์คํธ ์ ๋ ๊ฒ์ด๋ค.
13:31 ์์ฐ๋ฆฌ๋ค ๋ถ๊ธ๋ถ๊ธ @๋์ค๋ฏธ๋ฐฐ๋ฐ (1946-) ์ฝ๊ธฐ ์ฐ๊ธฐ์ ๋ฏธ๋ - ์ธ์ดํ์ ๋ฆฌ๋ฉ
15:15 ๋ฑ์ด๋ค 5500์ ์์ฌ - ์ง ์๋ค. ์ปจ๋์ .
16:31 #aider ํ์ดํ๋ก๊ทธ๋๋ฐ ์ด๋งฅ์ค ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ
(MatthewZMD 2025) ์ด๋ ์ ํ์ฌ
17:47 Cursor - The AI Code Editor ์์์ผ ๋๋๋ค.
17:54 ํ ๋ฐ๋ก ์ด ํฝ์ ๋๊ฐ์
19:06 ๋ค์ด์ ๊ฐ๋ค๊ฐ ์ง ๋์ฐฉ. ์ ๋ ์ค๋น. ๊ฐ๋จํ ๋จน๊ณ ์ฌ์ฐ์.
20:32 ์ด์ ์ป๊ธฐ์
21:25 ์ปค์ ์ด๊ธฐํ ๋ฐฉ๋ฒ
vscode ๊ฐ์ ธ์ค์ง ๋ง๊ณ ๊ทธ๋ฅ ์คํฌ๋์น์์ ํด
rm -Rf ~/.cursor
rm -Rf ~/.config/Cursor
>
21:38 ์ฝ๋์์์ ๋ง๋ ๋ ์์ด ์๋์ํ๊ตฌ๋
21:52 ์๋ด ๋ฐ๋ก ์๋ ๋ฏ - ์๊ณ ์ผ์ด๋๋ ๊ฒ ์ด๋ ๋
2025-03-29 Sat
01:21 ํ ๊นจ์ ์ปดํจํฐ ์ค
@ํผํฐ์ค์ฝง-๋ชจ๊ฑด ๋๋ ์ฌ์ด๋ณด๊ทธ๊ฐ ๋๊ธฐ๋ก ํ๋ค - ๋ฃจ๊ฒ๋ฆญ - ๋ก๋ด๊ณตํ
02:02 ๋๋ ธํธ
Emacs: Denote query links (links that trigger a search)
02:08 ๋ฐ๋ผ๊ฐ๋ผ ์์ด๋๋งฅ์ค
06:31 ๊ธฐ์ ๋๋ผ์ด ์๋ฉด
07:42 ๋๋ผ์ด ์ฑ ์ค์ค
07:55 ๊ทธ๊ฐ ์ฑ ์๊ฒ ์ฑ ์ด๋? ์ฑ ์ ์ฝ๋ ๋ฐฉ์ - ๋ฆฌ๋ฉ๋ฆฌ์คํธ
๋ฌด์์ ์๋ฃ ์์ ๋๋ฆฌ๋ ๋๋ก
08:02 ๋๋ ธํธ(Denote) ๊ทธ๋ฆฌ๊ณ Prot
์ค. ํ๋กฏ! ๋๋ ธํธ์ ๋ฌด์จ ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๋ณด์ด๋ ๊ฒ์ธ๊ฐ?
๋๋ ธํธ(Denote)๋ ์ด๋งฅ์ค์ ๋ ธํธ๊ด๋ฆฌํจํค์ง ์ด๋ฆ์ด๋ค. ์์์ ๋์ค๋ ํ๋กฏ์ด ์์ํ๋ค. ์ ํ ์นด์คํ ๊ณผ ์ ์ฌํ ๋ ธํธ ๊ด๋ฆฌ ์ฒด๊ณ์ด๋ค. ์ด๋ฌํ ๋ ธํธ ๊ด๋ฆฌ์ ํต์ฌ์ ์ฐ๊ฒฐ์ด๋ค. ๋ง์น ๋์ ์ ๊ฒฝ๋ง์ ๊ตฌํํ๋ ๊ฒ ๊ฐ๋ค. ์ฐ๊ฒฐ์๋ ์ต์ํ ์ํคํ์ ์ ๋ฐ๋ก๊ฐ๊ธฐ(๋งํฌ) ๋ฟ๋ง ์๋๋ผ ํ์ (ํ๊ทธ, ์ฉ์ด, ์ธ์ฉ ๋ฑ)์ ๋จ๊ธฐ๋ ๊ฒ๋ ์๋ค. โ๋ฌด์์โ์ ๋ฌธ์ ๋๋๋ฆฌ๊ธฐ ์ํด์๋ ํ์ ์ ๋จ๊ธฐ๋ ๊ฒ ๋ ์ค์ํ ๊ฒ ๊ฐ๋ค.
์๋ฌดํผ, ์ด๋ฐ. ์๋ด์ ์์ด๊ฐ ์ผ์ด๋ฌ๋ค. ๊ธ์ ์ธ ์๊ฐ์ด ์๋ค. 5๋ถ ์์ ํต์ฌ์ ๋จ๊ธฐ๊ฒ ๋ค.
์ด๋งฅ์ค ์ธ๊ณ์๋ ์ธ์์ ๋ชจ๋ ๋ ธํธํ ์ดํน ๊ธฐ๋ฒ์ ๊ตฌํ์ฒด๊ฐ ์๋๋ฏํ๋ค. ๊ทธ ์ค์์ ๋๋ ธํธ๋ ํ์ผ์ด๋ฆ์ฒด๊ณ๋ง์ผ๋ก ๋ชจ๋ ์ฐ๊ฒฐ์ ์ด๋ฃจ์ด ๋ธ๋ค. ๊ณ ๋ก ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ์๊ฐ ์๋ค. ๋๋๋๋ก ๋จ์ํ๋ค. ํฃ์ ์ด๋งฅ์ค์์ ์ด๋ฐ ์ ๋ฐ ๋ ธํธ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ๊ฑฐ์ณ์ ์ฌ๊ธฐ์ ์ ์ฐฉํ๋ค.
ํ๋ ๋. ์ธ๊ณต์ง๋ฅ์ ํ๋๋ก ์์ฒญ๋ ์ง์ ์์คํ ์ ๋ณํ ์์์ ๋๋ฌด ๋ง์ ์ ๋ณด๊ฐ ํผ์ฌํ๋ค. ํ๋ค๋ฆด ํ์๊ฐ ์๋ค. ๊ทธ ๋๊ตฌ์ ์ปค๋ฎค๋ํฐ๋ฅผ ์ ๋ขฐํ๋ฉด ๊ทธ ์์์ ํ๋์ ์์คํ ์ ๋ง๋ค ์ ์๋ค.
ํ๋กฏ์ ๋ชจ๋ ๊ฒ์ ๊ณต๊ฐํ๋ค. ์๋ช ์ด์ ์ด๋ช ์ธ ๊ฒ์ฒ๋ผ ๊ทธ๋ฅ ๋ค ๊ณต๊ฐํ๋ค. ๊ทธ๋ ์ค์ ๋ก ์ฒ ํ์์ด๊ธฐ๋ ํ๋ค. ์. ์๋ด๊ฐ ์๋ค. ์ด ์ ๋๋ก ์ ๋ฆฌ๊ฐ ๋๋?
์. ํ๋ ๋ง ๋. ์คํฌ๋ฆฐ์ท ์ค๋ช ํด์ผ์ง.
์คํฌ๋ฆฐ์ท1 : ๋ฌด์ ์ฒ ์ธ๋๋ณดํธ๊ฐ ๋ ์ค๋ฅธ๋ค. ํฃ์ด ์ฌ๋ํ๋ ํ์ผ์ฐฝ๊ด๋ฆฌ๋ ํ์ฅ์ค ํ์ผ์กฐ๊ฐ์ฒ๋ผ ์ฐฝ์ ๊ด๋ฆฌํ๋ค. ๋ง์ฐ์ค๊ฐ ํ์๊ฐ ์๋ค. ๊ฐ์ด์ ํฌ๋ช ํ๊ฒ ์ค๋ฌํ ํ ์คํธ ์ฐฝ์ ๋ฌด์์ธ๊ฐ? ํฃ์ ๋๊ตฌ๋ค. ์์นจ์๋ ํํฌ์ด์ฝ ์๋๊ฒ ๋๊ฐ? ์ ๊ฐ์ด๋ฐ ํ๋ก ๋ (ํ๋กํ )๋์ด ์๋๊ฐ? ์ด๊ฑด ๊บผ๋ด ์ฐ๋ ๋งฅ๊ฐ์ด๋ฒ ์นผ์ด ์๋๊ฐ?
์คํฌ๋ฆฐ์ท2 : ํ๋กฏ์ ๋ค๋ฅธ ์์ ์๊ฐ. ์๊ฐ์ด ์๋ค. ์์ด๋ ๋์๋ค. ํ๋กฏ์ ์ด์ ์์์ ์ค์ท์ ๋ด๋๋ค. ์ฐพ์ ๊ฒ๋ ์๋ค. ํ๋กฏ์ ์ง์คํด. ๊ทธ๋ฆฌ์ค. ์์์ฌ. ์ฐ๊ณจ์ ์ํ๋ผ์ค๋ผ๋ ๋ฉ๋ฉ์ด๋ ์ฐ๋ค. ๊ทธ๋ ์ถ์ด ๊ณง ์ฒ ํ์ด๋ฉฐ (์ค์ ๋ก ์ฒ ํ์ ๊ณต์ด๋ค) ์คํ์์ค, ์ด๋งฅ์ค๋ ๊ทธ๊ฐ ์ถ์ ๋ณด๋ด๋ ์กด๊ฒฝ๊ณผ ๊ฐ์ฌ์ ํํ์ด๋ค.
๊ฐ๋ฌด๋ฆฌ๋ ๋ค์์. ๊ทธ๋์ ํฃ์ ๋ฌด์จ ๋ง์ ํ๊ณ ์ถ์๊ฐ?
์ถ์์ฒ ํ. ์ง์ ์ฒ ํ์ด๋ค. ์๋ ค์ค ๊ฒ์ ์๋ค. ๋งํ ๊ฒ๋ ์๋ค. ๊ทธ๊ฒ์ ๊ฐ์ ๋ชซ์ด๋ค. ๋จ โ๋๊ตฌโ๋ฅผ ์๊ฐํด์ฃผ๊ณ ์ถ์ ๋ฟ์ด๋ค. ์๊ณผ ๋ฐ์ด ์ถค์ถ๋๋ก. ์กด์ฌ๊ฐ ๋๋ฌ๋๋๋ก. ์จ์ ํ ๋ง์์์ ์ฐ๋ฏผ์ด ๋์ค๋ฉฐ ์ด์ฉ๋ค ์ฐฝ์กฐ๋ ๋์ค๋ ์ถ์ ์ธ์ ๋ ์ฌ์ฌํ๋ค๋ ๊ฒ.
์ด๋ง ์๋ . ์์ด์ ์คํ์ง๋ฐฅ์ ๋ณด๋ฉฐ ์์นจ ์ค๋น.
https://www.youtube.com/watch?v=zqzAFj50MhE
Emacs: Denote query links (links that trigger a search)
์คํฌ๋ฆฐ์ท
>
08:43 ์๋ด ๊ธฐ์ ๋ฐ๋ก ์์นจ
09:49 cursor quartz ์์ ์ค
Hugo tags and category
https://www.perplexity.ai/search/hugo-eseo-tag-categoryga-dareu-bGEnxhEzQl2t8P_EvPmhOA
์ฃผ์ ์ฐจ์ด์
- ๋ฒ์์ ํน์ฑ
- ์นดํ ๊ณ ๋ฆฌ: ๋ณด๋ค ๋์ ์ฃผ์ ๋ ๋ถ์ผ๋ฅผ ๋ํ๋ ๋๋ค. ์น์ฌ์ดํธ์ ์ฃผ์ ์น์ ์ด๋ โ์ฑ ์ ์ฅโ๊ณผ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค[6].
- ํ๊ทธ: ๋ ๊ตฌ์ฒด์ ์ด๊ณ ์ธ๋ถ์ ์ธ ์ฃผ์ ๋ ํค์๋๋ฅผ ๋ํ๋ ๋๋ค. ์ฝํ ์ธ ์ ํน์ ์ธก๋ฉด์ ์ค๋ช ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค[6].
- ๊ตฌ์กฐ
- ์นดํ ๊ณ ๋ฆฌ: ์ผ๋ฐ์ ์ผ๋ก ๊ณ์ธต์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- ํ๊ทธ: ์ฃผ๋ก ๋น๊ณ์ธต์ ์ด๋ฉฐ, ๋ ์์ ๋กญ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฌ์ฉ ๋ฐฉ์
- ์นดํ ๊ณ ๋ฆฌ: ํฌ์คํธ๋น ํ๋ ๋๋ ์์์ ์นดํ ๊ณ ๋ฆฌ๋ง ํ ๋นํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
- ํ๊ทธ: ํ๋์ ํฌ์คํธ์ ์ฌ๋ฌ ๊ฐ์ ํ๊ทธ๋ฅผ ์์ ๋กญ๊ฒ ํ ๋นํ ์ ์์ต๋๋ค[1].
๊ตฌํ ์ธก๋ฉด
Hugo์์๋ ํ๊ทธ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๊ธฐ์ ์ ์ผ๋ก ๋์ผํ๊ฒ ์ทจ๊ธํฉ๋๋ค[4]. ๋ ๋ค taxonomy๋ก ๊ตฌํ๋๋ฉฐ, ์ฝํ ์ธ ํ์ผ์ front matter์์ ์ ์๋ฉ๋๋ค[2][5]. ์๋ฅผ ๋ค์ด:
---
title: "๋ธ๋ก๊ทธ ํฌ์คํธ"
categories: ["์น ๊ฐ๋ฐ"]
tags: ["Hugo", "์ ์ ์ฌ์ดํธ", "๋ธ๋ก๊ทธ"]
---
์ปค์คํฐ๋ง์ด์ง
ํ๊ทธ์ ์นดํ ๊ณ ๋ฆฌ์ ๋ํด ์๋ก ๋ค๋ฅธ ๋ ์ด์์์ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ๋ณ๋์ ํ ํ๋ฆฟ ํ์ผ์ ๋ง๋ค ์ ์์ต๋๋ค[8]:
/layouts/categories/terms.html
/layouts/tags/terms.html
์ด๋ ๊ฒ ํ๋ฉด ํ๊ทธ์ ์นดํ ๊ณ ๋ฆฌ ํ์ด์ง์ ๋ํด ์๋ก ๋ค๋ฅธ ๋์์ธ๊ณผ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, Hugo์์ ํ๊ทธ์ ์นดํ ๊ณ ๋ฆฌ์ ์ฃผ์ ์ฐจ์ด์ ์ ๊ทธ๋ค์ ์ฌ์ฉ ๋ชฉ์ ๊ณผ ๋ฐฉ์์ ์์ผ๋ฉฐ, ๊ธฐ์ ์ ์ธ ๊ตฌํ์ ๊ฑฐ์ ๋์ผํฉ๋๋ค. ์น์ฌ์ดํธ์ ๊ตฌ์กฐ์ ์ฝํ ์ธ ์กฐ์ง์ ๋ง๊ฒ ์ ์ ํ ํ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
Citations: [1] https://hugo-in-action.foofun.cn/docs/part1/chapter4/4/ [2] https://staticmania.com/blog/hugo-taxonomy [3] https://www.jessicahuynh.info/blog/2020/06/hugo-taxonomies/ [4] https://smhk.net/note/2018/03/hugo-tag-and-category-pages/ [5] https://www.jakewiesler.com/blog/hugo-taxonomies [6] https://stackoverflow.com/questions/70149736/hugo-difference-between-tags-and-categories [7] https://discourse.gohugo.io/t/adding-tags-and-categories-to-blog-post/27020 [8] https://discourse.gohugo.io/t/different-layout-for-tag-and-category-pages/34699 [9] https://discourse.gohugo.io/t/i-dont-want-tags-and-categories/12091 [10] https://discourse.gohugo.io/t/listing-tags-in-posts-of-specific-category/22391 [11] https://www.youtube.com/watch?v=pCPCQgqC8RA [12] https://discourse.gohugo.io/t/whats-the-concept-of-the-categories-taxonomy/6486 [13] https://discourse.gohugo.io/t/how-to-add-tag-and-category/3202 [14] https://ox-hugo.scripter.co/doc/tags-and-categories/ [15] https://discourse.gohugo.io/t/using-content-type-to-categorise-list-of-posts/7950 [16] https://gohugo.io/content-management/taxonomies/ [17] https://discourse.gohugo.io/t/hugo-isnt-making-different-pages-for-categories-and-tags/23786 [18] https://aioseo.com/the-difference-between-tags-and-categories/
Perplexity๋ก๋ถํฐ์ ๋ต๋ณ: pplx.ai/share
09:58 ** quartz ์ฝ๋๋ฒ ์ด์ค์ taxonomy ๋ถ๋ฅ๋ก category๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํด.
์์ฒญ์์ด๋: 8432adc5-15f0-4e6e-8895-69021c1baa1f
Ran tool Quartz ํ๋ก์ ํธ์์ taxonomy ๊ด๋ จ ํ์ผ์ ์ฐพ์๋ด ์๋ค. ๋จผ์ quartz ๋๋ ํ ๋ฆฌ ๋ด๋ถ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Ran tool Quartz ํ๋ก์ ํธ์์ taxonomy๋ ์นดํ ๊ณ ๋ฆฌ ๊ด๋ จ ๊ธฐ๋ฅ์ ์ฐพ๊ธฐ ์ํด ๋ ๊น์ด ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ๋ฌ๊ทธ์ธ ๋๋ ํ ๋ฆฌ๋ฅผ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
Ran tool transformers ๋๋ ํ ๋ฆฌ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ taxonomy๋ ์นดํ ๊ณ ๋ฆฌ ๊ด๋ จ ๊ธฐ๋ฅ์ด ์์ ์ ์์ต๋๋ค.
Ran tool frontmatter.ts
ํ์ผ์ด taxonomy ๊ด๋ จ ๊ธฐ๋ฅ์ ๋ค๋ฃฐ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
Read file: quartz/plugins/transformers/frontmatter.ts ์ด์ ํ๋ก์ ํธ ๊ตฌ์ฑ ํ์ผ์ธ quartz.config.ts ํ์ผ์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
Read file: quartz.config.ts ์ด์ ํ๊ทธ ๊ด๋ จ ์ปดํฌ๋ํธ๋ฅผ ์ดํด๋ด ์๋ค. ํ๊ทธ์ ์นดํ ๊ณ ๋ฆฌ๋ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ํํ๋ฏ๋ก ์ด ๋ถ๋ถ์ ํ์ธํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
Ran tool ํ๊ทธ ํ์ด์ง ๊ตฌํ์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
Read file: /home/junghan/git/notes/quartz/plugins/emitters/tagPage.tsx ์ด์ TagContent ์ปดํฌ๋ํธ๋ฅผ ์ดํด๋ด ์๋ค.
Ran tool TagContent ์ปดํฌ๋ํธ ๋ด์ฉ์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
Read file: /home/junghan/git/notes/quartz/components/pages/TagContent.tsx Quartz ํ๋ก์ ํธ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ์ด๋ค ๋ถ๋ถ์ ์์ ํด์ผ ํ๋์ง ํ์ ํ์ต๋๋ค. ํ๊ทธ์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์นดํ ๊ณ ๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค. ์๋์ ๊ฐ์ ๋จ๊ณ๋ก ์งํํ๊ฒ ์ต๋๋ค:
- frontmatter.ts์ ์นดํ ๊ณ ๋ฆฌ ๊ด๋ จ ์ฝ๋ ์ถ๊ฐ
- ์นดํ ๊ณ ๋ฆฌ ํ์ด์ง ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ (TagPage์ ์ ์ฌํ๊ฒ)
- quartz.config.ts์ ์นดํ ๊ณ ๋ฆฌ ํ์ด์ง ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ
๋จผ์ frontmatter.ts๋ฅผ ์์ ํ์ฌ ์นดํ ๊ณ ๋ฆฌ ํ๋๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค:
// ... existing code ...
const tags = coerceToArray(coalesceAliases(data, ["tags", "tag"]))
if (tags) data.tags = [...new Set(tags.map((tag: string) => slugTag(tag)))]
const categories = coerceToArray(coalesceAliases(data, ["categories", "category"]))
if (categories) data.categories = [...new Set(categories.map((category: string) => slugTag(category)))]
const aliases = coerceToArray(coalesceAliases(data, ["aliases", "alias"]))
// ... existing code ...
// ... existing code ...
declare module "vfile" {
interface DataMap {
aliases: FullSlug[]
frontmatter: { [key: string]: unknown } & {
title: string
} & Partial<{
tags: string[]
categories: string[]
aliases: string[]
modified: string
created: string
published: string
description: string
socialDescription: string
publish: boolean | string
draft: boolean | string
lang: string
enableToc: string
cssclasses: string[]
socialImage: string
comments: boolean | string
}>
}
}
// ... existing code ...
์ด์ CategoryPage.tsx ํ์ผ์ ๋ง๋ค๊ฒ ์ต๋๋ค. TagPage.tsx๋ฅผ ๋ณต์ฌํ๊ณ ์์ ํ์ฌ ์นดํ ๊ณ ๋ฆฌ ํ์ด์ง๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค.
Read file: /home/junghan/git/notes/quartz/plugins/emitters/tagPage.tsx ์ด์ CategoryContent.tsx ํ์ผ์ ๋ง๋ค๊ฒ ์ต๋๋ค:
Read file: /home/junghan/git/notes/quartz/components/pages/TagContent.tsx ์ด์ CategoryContent.tsx ํ์ผ์ ์์ฑํ๊ฒ ์ต๋๋ค:
```typescript jsx:/home/junghan/git/notes/quartz/components/pages/CategoryContent.tsx import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from โ../typesโ import style from โ../styles/listPage.scssโ import { PageList, SortFn } from โ../PageListโ import { FullSlug, getAllSegmentPrefixes, resolveRelative, simplifySlug } from โ../../util/pathโ import { QuartzPluginData } from โ../../plugins/vfileโ import { Root } from โhastโ import { htmlToJsx } from โ../../util/jsxโ import { i18n } from โ../../i18nโ import { ComponentChildren } from โpreactโ import { concatenateResources } from โ../../util/resourcesโ
interface CategoryContentOptions { sort?: SortFn numPages: number }
const defaultOptions: CategoryContentOptions = { numPages: 10, }
export default ((opts?: Partial) => { const options: CategoryContentOptions = { โฆdefaultOptions, โฆopts }
const CategoryContent: QuartzComponent = (props: QuartzComponentProps) => { const { tree, fileData, allFiles, cfg } = props const slug = fileData.slug
if (!(slug?.startsWith("categories/") || slug === "categories")) {
throw new Error(`Component "CategoryContent" tried to render a non-category page: ${slug}`)
}
const category = simplifySlug(slug.slice("categories/".length) as FullSlug)
const allPagesWithCategory = (category: string) =>
allFiles.filter((file) =>
(file.frontmatter?.categories ?? []).flatMap(getAllSegmentPrefixes).includes(category),
)
const content = (
(tree as Root).children.length === 0
? fileData.description
: htmlToJsx(fileData.filePath!, tree)
) as ComponentChildren
const cssClasses: string[] = fileData.frontmatter?.cssclasses ?? []
const classes = cssClasses.join(" ")
if (category === "/") {
const categories = [
...new Set(
allFiles.flatMap((data) => data.frontmatter?.categories ?? []).flatMap(getAllSegmentPrefixes),
),
].sort((a, b) => a.localeCompare(b))
const categoryItemMap: Map<string, QuartzPluginData[]> = new Map()
for (const category of categories) {
categoryItemMap.set(category, allPagesWithCategory(category))
}
return (
<div class="popover-hint">
<article class={classes}>
<p>{content}</p>
</article>
<p>{i18n(cfg.locale).pages.tagContent.totalTags({ count: categories.length })}</p>
<div>
{categories.map((category) => {
const pages = categoryItemMap.get(category)!
const listProps = {
...props,
allFiles: pages,
}
const contentPage = allFiles.filter((file) => file.slug === `categories/${category}`).at(0)
const root = contentPage?.htmlAst
const content =
!root || root?.children.length === 0
? contentPage?.description
: htmlToJsx(contentPage.filePath!, root)
const categoryListingPage = `/categories/${category}` as FullSlug
const href = resolveRelative(fileData.slug!, categoryListingPage)
return (
<div>
<h2>
<a class="internal category-link" href={href}>
{category}
</a>
</h2>
{content && <p>{content}</p>}
<div class="page-listing">
<p>
{i18n(cfg.locale).pages.tagContent.itemsUnderTag({ count: pages.length })}
{pages.length > options.numPages && (
<>
{" "}
<span>
{i18n(cfg.locale).pages.tagContent.showingFirst({
count: options.numPages,
})}
</span>
</>
)}
</p>
<PageList limit={options.numPages} {...listProps} sort={options?.sort} />
</div>
</div>
)
})}
</div>
</div>
)
} else {
const pages = allPagesWithCategory(category)
const listProps = {
...props,
allFiles: pages,
}
return (
<div class={classes}>
<article class="popover-hint">{content}</article>
<div class="page-listing">
<p>{i18n(cfg.locale).pages.tagContent.itemsUnderTag({ count: pages.length })}</p>
<div>
<PageList {...listProps} sort={options?.sort} />
</div>
</div>
</div>
)
}
}
CategoryContent.css = concatenateResources(style, PageList.css) return CategoryContent }) satisfies QuartzComponentConstructor
์ด์ categoryPage.tsx ํ์ผ์ ์์ฑํ๊ฒ ์ต๋๋ค:
```typescript jsx:/home/junghan/git/notes/quartz/plugins/emitters/categoryPage.tsx
import { QuartzEmitterPlugin } from "../types"
import { QuartzComponentProps } from "../../components/types"
import HeaderConstructor from "../../components/Header"
import BodyConstructor from "../../components/Body"
import { pageResources, renderPage } from "../../components/renderPage"
import { ProcessedContent, QuartzPluginData, defaultProcessedContent } from "../vfile"
import { FullPageLayout } from "../../cfg"
import { FullSlug, getAllSegmentPrefixes, joinSegments, pathToRoot } from "../../util/path"
import { defaultListPageLayout, sharedPageComponents } from "../../../quartz.layout"
import { CategoryContent } from "../../components"
import { write } from "./helpers"
import { i18n, TRANSLATIONS } from "../../i18n"
import { BuildCtx } from "../../util/ctx"
import { StaticResources } from "../../util/resources"
interface CategoryPageOptions extends FullPageLayout {
sort?: (f1: QuartzPluginData, f2: QuartzPluginData) => number
}
function computeCategoryInfo(
allFiles: QuartzPluginData[],
content: ProcessedContent[],
locale: keyof typeof TRANSLATIONS,
): [Set<string>, Record<string, ProcessedContent>] {
const categories: Set<string> = new Set(
allFiles.flatMap((data) => data.frontmatter?.categories ?? []).flatMap(getAllSegmentPrefixes),
)
// add base category
categories.add("index")
const categoryDescriptions: Record<string, ProcessedContent> = Object.fromEntries(
[...categories].map((category) => {
const title =
category === "index"
? i18n(locale).pages.tagContent.tagIndex.replace("Tags", "Categories")
: `${i18n(locale).pages.tagContent.tag.replace("Tag", "Category")}: ${category}`
return [
category,
defaultProcessedContent({
slug: joinSegments("categories", category) as FullSlug,
frontmatter: { title, categories: [] },
}),
]
}),
)
// Update with actual content if available
for (const [tree, file] of content) {
const slug = file.data.slug!
if (slug.startsWith("categories/")) {
const category = slug.slice("categories/".length)
if (categories.has(category)) {
categoryDescriptions[category] = [tree, file]
if (file.data.frontmatter?.title === category) {
file.data.frontmatter.title = `${i18n(locale).pages.tagContent.tag.replace("Tag", "Category")}: ${category}`
}
}
}
}
return [categories, categoryDescriptions]
}
async function processCategoryPage(
ctx: BuildCtx,
category: string,
categoryContent: ProcessedContent,
allFiles: QuartzPluginData[],
opts: FullPageLayout,
resources: StaticResources,
) {
const slug = joinSegments("categories", category) as FullSlug
const [tree, file] = categoryContent
const cfg = ctx.cfg.configuration
const externalResources = pageResources(pathToRoot(slug), resources)
const componentData: QuartzComponentProps = {
ctx,
fileData: file.data,
externalResources,
cfg,
children: [],
tree,
allFiles,
}
const content = renderPage(cfg, slug, componentData, opts, externalResources)
return write({
ctx,
content,
slug: file.data.slug!,
ext: ".html",
})
}
export const CategoryPage: QuartzEmitterPlugin<Partial<CategoryPageOptions>> = (userOpts) => {
const opts: FullPageLayout = {
...sharedPageComponents,
...defaultListPageLayout,
pageBody: CategoryContent({ sort: userOpts?.sort }),
...userOpts,
}
const { head: Head, header, beforeBody, pageBody, afterBody, left, right, footer: Footer } = opts
const Header = HeaderConstructor()
const Body = BodyConstructor()
return {
name: "CategoryPage",
getQuartzComponents() {
return [
Head,
Header,
Body,
...header,
...beforeBody,
pageBody,
...afterBody,
...left,
...right,
Footer,
]
},
async *emit(ctx, content, resources) {
const allFiles = content.map((c) => c[1].data)
const cfg = ctx.cfg.configuration
const [categories, categoryDescriptions] = computeCategoryInfo(allFiles, content, cfg.locale)
for (const category of categories) {
yield processCategoryPage(ctx, category, categoryDescriptions[category], allFiles, opts, resources)
}
},
async *partialEmit(ctx, content, resources, changeEvents) {
const allFiles = content.map((c) => c[1].data)
const cfg = ctx.cfg.configuration
// Find all categories that need to be updated based on changed files
const affectedCategories: Set<string> = new Set()
for (const changeEvent of changeEvents) {
if (!changeEvent.file) continue
const slug = changeEvent.file.data.slug!
// If it's a category page itself that changed
if (slug.startsWith("categories/")) {
const category = slug.slice("categories/".length)
affectedCategories.add(category)
}
// If a file with categories changed, we need to update those category pages
const fileCategories = changeEvent.file.data.frontmatter?.categories ?? []
fileCategories.flatMap(getAllSegmentPrefixes).forEach((category) => affectedCategories.add(category))
// Always update the index category page if any file changes
affectedCategories.add("index")
}
// If there are affected categories, rebuild their pages
if (affectedCategories.size > 0) {
// We still need to compute all categories because category pages show all categories
const [_categories, categoryDescriptions] = computeCategoryInfo(allFiles, content, cfg.locale)
for (const category of affectedCategories) {
if (categoryDescriptions[category]) {
yield processCategoryPage(ctx, category, categoryDescriptions[category], allFiles, opts, resources)
}
}
}
},
}
}
components/index.ts ํ์ผ์ ์์ ํ์ฌ CategoryContent๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค:
Ran tool
Read file: /home/junghan/git/notes/quartz/components/index.ts ์ด์ CategoryContent๋ฅผ components/index.ts์ ์ถ๊ฐํฉ์๋ค:
import Content from "./pages/Content"
import TagContent from "./pages/TagContent"
import CategoryContent from "./pages/CategoryContent"
import FolderContent from "./pages/FolderContent"
// ... existing code ...
export {
ArticleTitle,
Content,
TagContent,
CategoryContent,
FolderContent,
// ... existing code ...
}
๋ง์ง๋ง์ผ๋ก quartz.config.ts ํ์ผ์ CategoryPage ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค:
// ... existing code ...
emitters: [
Plugin.AliasRedirects(),
Plugin.ComponentResources(),
Plugin.ContentPage(),
Plugin.FolderPage(),
Plugin.TagPage(),
Plugin.CategoryPage(),
Plugin.ContentIndex({
enableSiteMap: true,
enableRSS: true,
}),
// ... existing code ...
plugins/index.ts ํ์ผ์ CategoryPage๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค:
Read file: /home/junghan/git/notes/quartz/plugins/index.ts ์ด์ plugins/emitters/index.ts ํ์ผ์ ํ์ธํ๊ณ CategoryPage๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค:
Read file: /home/junghan/git/notes/quartz/plugins/emitters/index.ts CategoryPage๋ฅผ plugins/emitters/index.ts์ ์ถ๊ฐํฉ๋๋ค:
export { ContentPage } from "./contentPage"
export { TagPage } from "./tagPage"
export { CategoryPage } from "./categoryPage"
export { FolderPage } from "./folderPage"
// ... existing code ...
quartz.config.ts์ generateSocialImages ์๋ฌ๋ฅผ ํด๊ฒฐํฉ๋๋ค:
Ran tool
Read file: /home/junghan/git/notes/quartz/cfg.ts GlobalConfiguration์ generateSocialImages ํ๋๊ฐ ์์ต๋๋ค. ํด๋น ๋ถ๋ถ์ ์์ ํด์ผ ํฉ๋๋ค:
// ... existing code ...
ignorePatterns: ["private", "temp", "templates", ".obsidian"],
defaultDateType: "created",
// ์ฃผ์ ์ฒ๋ฆฌํ์ฌ ์ญ์ ํ์ง ์๊ณ ์๋ฌ๋ฅผ ํด๊ฒฐํฉ๋๋ค
// generateSocialImages: false,
theme: {
// ... existing code ...
ํ๋ฅญํฉ๋๋ค! ์ด์ ๋ชจ๋ ํ์ํ ํ์ผ์ ์์ฑํ๊ณ ์์ ํ์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค:
- frontmatter.ts์ categories ํ๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
- CategoryContent.tsx ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ต๋๋ค.
- CategoryPage.tsx emitter๋ฅผ ์์ฑํ์ต๋๋ค.
- components/index.ts ํ์ผ์ CategoryContent๋ฅผ ๋ฑ๋กํ์ต๋๋ค.
- plugins/emitters/index.ts ํ์ผ์ CategoryPage๋ฅผ ๋ฑ๋กํ์ต๋๋ค.
- quartz.config.ts ํ์ผ์ CategoryPage ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ์ต๋๋ค.
์ด์ ๋งํฌ๋ค์ด ํ์ผ์ frontmatter์ ๋ค์๊ณผ ๊ฐ์ด ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค:
---
title: ๋ฌธ์ ์ ๋ชฉ
categories: [์นดํ
๊ณ ๋ฆฌ1, ์นดํ
๊ณ ๋ฆฌ2]
---
๋ฌธ์ ๋ด์ฉ...
๋ํ categories ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ๊ฐ๋ณ ์นดํ ๊ณ ๋ฆฌ์ ๋ํ ์ค๋ช ํ์ด์ง๋ฅผ ์ถ๊ฐํ ์๋ ์์ต๋๋ค:
mkdir -p content/categories
10:20 ์๋ด ๋ฑ์ฅ
11:10 ๋๋ค ๋นฝ๋ค๋ฐฉ ์ฒดํฌ์ธ 3์๊ฐ ๋ฅ์ํฌ
์์ด๋๋งฅ์ค๋ก ๊ฐ์.
13:51 ์ง์๊ฐ์ - RAG ์คํจ - hy ์ด์ํด
15:00 ๋ฐ๋ก ํ์ด๊ฑฐ ์์ด๊นํ - ์์ ๊ฑฐ ํ๊ณ ๋ฐ๋ฆฌ๊ณ ์ด 3์๊ฐ ๋ฅ์ํฌ
17:23 conda ์ธ๊ฑฐ์ผ.
#ํ์ด์ฌ: #ํ์ฉ๋ฒ: ๋ฏธ๋์ฝ๋ค::์ฝ๋ค์์ ํ์ํ ํจํค์ง ์ค์น ์ค์นํด์ค
17:31 pip install hy ํธํ๊ฒ
โ pip3 install --user hy
Collecting hy
Using cached hy-1.0.0-py3-none-any.whl
Collecting funcparserlib~=1.0 (from hy)
Using cached funcparserlib-1.0.1-py2.py3-none-any.whl.metadata (7.1 kB)
Using cached funcparserlib-1.0.1-py2.py3-none-any.whl (17 kB)
Installing collected packages: funcparserlib, hy
Successfully installed funcparserlib-1.0.1 hy-1.0.0
(base) ~ via ๎ v20.14.0 via ๐ v3.12.9 on โ๏ธ gtgkjh@gmail.com
โ whereis pip3
pip3: /usr/bin/pip3 /home/junghan/miniconda3/bin/pip3 /home/junghan/.local/bin/pip3 /usr/share/man/man1/pip3.1.gz
(base) ~ via ๎ v20.14.0 via ๐ v3.12.9 on โ๏ธ gtgkjh@gmail.com
conda install hy ์๋๋ค.
โ conda install hy
Retrieving notices: done
Channels:
- conda-forge
- defaults
Platform: linux-64
Collecting package metadata (repodata.json): done
Solving environment: failed
LibMambaUnsatisfiableError: Encountered problems while solving:
- package hy-0.19.0-py38h32f6830_0 requires python >=3.8,<3.9.0a0, but none of the providers can be installed
Could not solve for environment specs
The following packages are incompatible
โโ hy =* * is installable with the potential options
โ โโ hy 0.12.1 would require
โ โ โโ python =2.7 *, which can be installed;
โ โโ hy 0.12.1 would require
โ โ โโ python =3.5 *, which can be installed;
โ โโ hy 0.12.1 would require
โ โ โโ python =3.6 *, which can be installed;
โ โโ hy [0.18.0|0.19.0|0.20.0] would require
โ โ โโ python >=3.6,<3.7.0a0 *, which can be installed;
โ โโ hy [0.18.0|0.19.0|0.20.0] would require
โ โ โโ python >=3.7,<3.8.0a0 *, which can be installed;
โ โโ hy [0.19.0|0.20.0] would require
โ โ โโ python >=3.8,<3.9.0a0 *, which can be installed;
โ โโ hy [0.19.0|0.20.0] would require
โ โโ python >=3.9,<3.10.0a0 *, which can be installed;
โโ pin on python 3.12.* =* * is not installable because it requires
โโ python =3.12 *, which conflicts with any installable versions previously reported.
Pins seem to be involved in the conflict. Currently pinned specs:
- python=3.12
#LLM: hyrule ์ค์น ํ์ด๋ญ ํ๋ฌ๊ทธ์ธ ์๋ฌดํผ ์ค์นํด์ ํ๋ค.
17:39 ๋ฐ๋ก ์ด ํฝ์ -> ์์ ๊ฑฐ ํ์์ ํจ๊ป ๊ฑธ์ด ์ง์ผ๋ก
19:12 ์ง์์ ์๋ด ๋ฐ๋ก ์ด์ ์ ๋ ์์ฌ
21:16 ํํ๋ก์ด ์ ๋ ๋ง๋ฌด๋ฆฌ -> ์์ด๊ธ๋ ์ฌ๋ฆฌ์. ๋ฒ๊ฑฐ๋กญ์ง ์์ ์์ค์์
21:31 py2hy - ์ด๊ฑฐ ํ์ธํด๋ผ
#LLM: ํ์ด์ฌ ๋ชจ๋ ์ค์น ์ ์ญ ํ์ฉ๋ฒ ์ด๊ฑธ ์ค๋นํ๋ค.
print("Hello, World!")
์ด๋ ๊ฒ ๋๋ค.
~/git/clone/py2hy master ?1 via ๐ v3.12.9 on โ๏ธ gtgkjh@gmail.com
โ python -m py2hy hello.py
(print "Hello, World!")
~/git/clone/py2hy master ?1 via ๐ v3.12.9 on โ๏ธ gtgkjh@gmail.com
21:43 ์๋ค. ์ ๋ง. ์ซ์ซํ๊ฒ ํ๋ฃจ ๋ณด๋๋ค.
2025-03-30 Sun
03:15 ๊ตณ๋ชจ๋? ์ดํ. ์ด๋ฅธ๊ฐ - ์นธ๋ฏธ๊ณ ? ์ด๋ฏธ๊ณ ?
03:26 ์คํ ์ดํ ์ด๊ฑฐ ๊ธ๊ฐ์ด๋ค ์ด๋ฏธ๊ณ
(Zeng [2025] 2025) ์ญ์ ๋๋จํ๊ตฌ๋ง
jwalsh/hy-algorithms: Algorithms and data structures implemented in Hy, a Lisp dialect for Python
(Jason Walsh 2025)
์ด๊ฒ ๋ญ์ผ!!
04:56 ์ด์ด ์ฌ๋ผ์จ๋ค
05:19 ์ ์ ์ฌ์
junghan0611/dotemacs - README
(Han [2025] 2025)
-
Han, Jung
-
dotemacs - doomemacs / spacemacs
-
2025
>