diff --git a/src/app/article/layout.tsx b/src/app/article/layout.tsx
index 26ae43d..b046cd8 100644
--- a/src/app/article/layout.tsx
+++ b/src/app/article/layout.tsx
@@ -9,12 +9,13 @@ export const metadata: Metadata = {
},
};
+// TODO: src/app/[locale]/article/[...slug] 쪽으로 모두 이관
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<>
{children}
-
+
>
);
}
diff --git a/src/app/en/article/layout.tsx b/src/app/en/article/layout.tsx
index c2ccfee..5e2f3d4 100644
--- a/src/app/en/article/layout.tsx
+++ b/src/app/en/article/layout.tsx
@@ -9,12 +9,13 @@ export const metadata: Metadata = {
},
};
+// TODO: src/app/[locale]/article/[...slug] 쪽으로 모두 이관
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<>
{children}
-
+
>
);
}
diff --git a/src/app/ko/article/layout.tsx b/src/app/ko/article/layout.tsx
index c2ccfee..5e2f3d4 100644
--- a/src/app/ko/article/layout.tsx
+++ b/src/app/ko/article/layout.tsx
@@ -9,12 +9,13 @@ export const metadata: Metadata = {
},
};
+// TODO: src/app/[locale]/article/[...slug] 쪽으로 모두 이관
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<>
{children}
-
+
>
);
}
diff --git a/src/app/ko/til/2026-01-01-1.png b/src/app/ko/til/2026-01-01-1.png
new file mode 100644
index 0000000..a6817b0
Binary files /dev/null and b/src/app/ko/til/2026-01-01-1.png differ
diff --git a/src/app/ko/til/layout.tsx b/src/app/ko/til/layout.tsx
new file mode 100644
index 0000000..0841f2c
--- /dev/null
+++ b/src/app/ko/til/layout.tsx
@@ -0,0 +1,21 @@
+import Giscus from "@modules/giscus";
+import type { Metadata } from "next";
+import Header from "@modules/layout/Header";
+
+export const metadata: Metadata = {
+ other: {
+ "page-type": "til",
+ },
+};
+
+export default function Layout({ children }: { children: React.ReactNode }) {
+ return (
+ <>
+
+
+ {children}
+
+
+ >
+ );
+}
diff --git a/src/app/ko/til/page.mdx b/src/app/ko/til/page.mdx
new file mode 100644
index 0000000..ce38c03
--- /dev/null
+++ b/src/app/ko/til/page.mdx
@@ -0,0 +1,45 @@
+import ArticleImage from "@modules/article/ArticleImage";
+
+# TIL
+
+## 목차
+
+## 2026-01-01
+
+- 새해가 밝았다. 오...
+- 내 .zshrc를 분석해서 뭔가 프로그램이 설치되어 있는지 아닌지 확인하는 스크립트를 만들었다. https://github.com/echoja/settings 사족을 왕창 달았다면, 쉘 스크립트로 하는 게 아니라 파이썬으로, uv로, typer로 이용해서 했다는 것. 막 로직적으로 특이한 건 없다. 리스트도 스크립트에 하드코딩 되어 있다. `uv`라는 이름이 뭔가 간지나는 것 같다.
+- *앨저넌에게 꽃을*이라는 책을 읽고 있다. 멍청이 주인공이 무슨 수술을 받아서 시한부 똑똑이가 되는 이야기다. 뭔가 아쉽다. 레파토리는 평범한 듯 하고 주인공은 별로 매력이 없다.
+- 이 블로그에서 Giscus로 옮겼다.
+- 3가지 키워드를 정했다. **글쓰기**, **방심하지마**, **우직**.
+- 영어 공부를 어떻게 하지? 고민
+- 내일 20:00에 렛커 면접이 있다. 약간 부담이 된다. 나는 작업에 거의 참여하지 않는데 사람을 뽑아야 한다니
+- 하루 동안 한 것만 해도 이렇게 정리할 게 많은데 정리라는 건 정말로 할 수 있는 걸까?
+- 2025년 12월 자산정리 완료
+- GitHub 레포지토리 등을 정리했다. 안쓰는 거는 Public Archive 하고, 남겨놓을 의미가 없는 건 삭제했다. 가능하면 renovate는 1달에 한번으로 주기를 늘렸다. 이제 메일이나 읽어야지...
+
+### BuildTalk
+
+[BuildTalk](https://buildtalk.info/) 에 문제가 생겼었다. 너네 Droplet에서 비정상적인 네트워크 트래픽이 발생했고 아마 해킹 당한거 같다. Droplet 싹 지우고 키 같은거 바꿔라. 라더라.
+
+```text
+Following up on ticket 500QP00001BZLtyYAH, we are writing to let you know that your Droplet worker-pool-6hu4o at 165.22.62.121 has continued to contribute to a Distributed Denial of Service attack. To reduce further harm, we have taken action to block the outbound flooding activity from your Droplet.
+
+Details of the Attack:-
+Source IP:- 165.22.62.121
+Total traffic used in attack:- 2,412,164 pps
+worker-pool-6hu4o contribution in attack:- 33,518 pps
+Target of attack:- 185.121.226.110
+Total Number of Droplets involved:- 32
+```
+
+진짜 확인해보니 문제가 있긴 하더만. 네트워크 요청과 별개로 최근 2주간 CPU 100% 찍혀있는 게 엄청 많았다.
+
+이제는 아래 이미지처럼 정상이다.
+
+import i260101_1 from "./2026-01-01-1.png";
+
+
+
+원인은 [React2Shell](https://vercel.com/kb/bulletin/react2shell) 취약점 때문인 것 같다. 유출될 만한 키가 없는데 (DOKS로 배포하고 있고 거기에서 쓰는 키는 생성한 적도 없고 써본 적도 없다) Droplet이 개떡처럼 동작한다니. 누가 원격 코드를 어떻게 잘 우회해서 실행한 걸로밖에 보이지 않는다. Sentry에서 뭔가 [의심스러운 POST](https://build-talk-co-ltd.sentry.io/issues/7157194655/) 요청이 오긴 했는데 그게 이건지는 확인하지 않았다.
+
+
diff --git a/src/modules/giscus.tsx b/src/modules/giscus.tsx
index f6bd49a..b609693 100644
--- a/src/modules/giscus.tsx
+++ b/src/modules/giscus.tsx
@@ -1,10 +1,11 @@
"use client";
-import { useEffect, useRef } from "react";
+import type { ComponentProps } from "react";
+import React, { useEffect, useRef } from "react";
import { useColorMode } from "./color-mode/color-mode";
import { useLocale } from "./i18n/useLocale";
-const Giscus = () => {
+const Giscus: React.FC> = (props) => {
const { resolved } = useColorMode();
const loaded = useRef(false);
const containerRef = useRef(null);
@@ -60,7 +61,7 @@ const Giscus = () => {
}
}, [resolved, locale]);
- return ;
+ return ;
};
export default Giscus;
diff --git a/src/modules/layout/Footer.tsx b/src/modules/layout/Footer.tsx
index b263cc5..5d26cc6 100644
--- a/src/modules/layout/Footer.tsx
+++ b/src/modules/layout/Footer.tsx
@@ -88,7 +88,11 @@ const Footer = () => {
{text[labelKey]}
))}
+
+ TIL
+
+