AOC2025 DAY 5 무식하게 하려다가 맥북 뻗어서 머리 써서 풀었다... 진작 머리 쓸걸..
洪 民憙 (Hong Minhee)
@hongminhee@hackers.pub · 1016 following · 721 followers
Hi, I'm who's behind Fedify, Hollo, BotKit, and this website, Hackers' Pub! My main account is at
@hongminhee洪 民憙 (Hong Minhee)
.
Fedify, Hollo, BotKit, 그리고 보고 계신 이 사이트 Hackers' Pub을 만들고 있습니다. 제 메인 계정은:
@hongminhee洪 民憙 (Hong Minhee)
.
Fedify、Hollo、BotKit、そしてこのサイト、Hackers' Pubを作っています。私のメインアカウントは「
@hongminhee洪 民憙 (Hong Minhee)
」に。
Website
- hongminhee.org
GitHub
- @dahlia
Hollo
- @hongminhee@hollo.social
DEV
- @hongminhee
velog
- @hongminhee
Qiita
- @hongminhee
Zenn
- @hongminhee
Matrix
- @hongminhee:matrix.org
X
- @hongminhee
Karpathy의 프로그래밍 관련 발언: "이렇게까지 뒤처진 느낌은 처음이다"
------------------------------
- Andrej Karpathy가 현재의 프로그래밍 환경에서 *자신이 크게 뒤처지고 있다고* 강하게 느낀다고 밝힘
- 프로그래머가 직접 작성하는 코드 비중은 줄어들고, 이미 존재하는 도구와 시스템을 *어떻게 연결하고 조합하느냐* 가 핵심 역량으로 이동 중
- 지난 1년간 등장한 도구들을 제대로 엮기만 해도 *생산성이…
------------------------------
https://news.hada.io/topic?id=25434&utm_source=googlechat&utm_medium=bot&utm_campaign=1834
Unity의 Mono 문제: 왜 당신의 C# 코드는 기대보다 느리게 실행되는가
------------------------------
- Unity가 사용하는 *Mono 런타임* 은 최신 .NET 대비 현저히 느린 실행 속도를 보이며, 동일한 C# 코드가 *최대 15배까지* 차이 나는 사례가 있음
- 실제 게임 코드에서 *Mono 기반 Unity 실행은 100초* , 동일 코드의 .NET 실행은 *38초* 로 측정되어, 디버깅과 테스트 효율에도 큰 영향을 줌
- *Release 모드…
------------------------------
https://news.hada.io/topic?id=25421&utm_source=googlechat&utm_medium=bot&utm_campaign=1834
洪 民憙 (Hong Minhee) shared the below article:
ActivityPub 서버에서 YouTube 추적 링크 방지하기
고남현 @gnh1201@hackers.pub
ActivityPub 서버에서 공유되는 YouTube 링크는 추적 파라미터와 내장된 기술로 인해 사용자의 개인정보를 위협할 수 있습니다. ActivityPub 프로토콜 차원의 해결을 기다리기보다, 서버 관리자가 DNT-YT, Piped, Invidious와 같은 개인정보 보호 중심의 대체 프론트엔드(front-end)를 활용해 직접적인 해결책을 마련하는 것이 실질적입니다. 특히 Nginx의 sub_filter 기능을 적용하면 기존 YouTube URL을 대체 주소로 투명하게 재작성하여 사용자가 의도치 않게 추적 시스템에 노출되는 것을 차단합니다. 이러한 서버 측 조치는 연합 네트워크(fediverse) 환경에서 사용자 데이터 보호를 강화하고 프라이버시를 중시하는 커뮤니티 가치를 실현하는 데 중요한 통찰을 제공합니다.
Read more →BGE-M3, MarkItDown, 그리고 마크다운 구조 파서를 이용해 시맨틱 청킹을 수행하고, 그 결과를 Parquet 파일에 저장하는 aipack 프레임워크의 첫 버전을 릴리스합니다. 모델과 데이터베이스에 종속되지 않는 중립적 상태를 유지하여 언제든 재사용할 수 있는 파일 포맷을 기반으로 RAG를 구현하고, MCP 서버까지 구동할 수 있도록 설계했습니다.
aipack의 지향점은 NPU나 GPU에 의존하지 않는 RAG를 구현함과 동시에, 향후 다양한 RAG 구조로 확장하기 용이한 환경을 만드는 데 방점이 찍혀 있습니다. "고품질의 Parquet 파일을 만들어낼 수 있다면 무엇이든 할 수 있다"는 전제 아래, 업계에서 흔히 쓰이는 RAG 파이프라인을 디커플링(Decoupling)해본 실험적 프로젝트입니다.
프로젝트에 대한 피드백과 후기, 평가를 공유해 주시면 감사하겠습니다. 또한, 지속 가능한 오픈소스 활동을 위해 후원을 더해 주신다면 큰 힘이 됩니다.
GitHub: https://github.com/rkttu/aipack
Fedify에 기여하다보면 진짜 민희님이 괜히 STF 받으신게 아니구나... 싶어지는 코드들이 종종 있음
걍 눈 앞이 캄캄해지고 아찔해져서 눈 질끈 감게 됨
#코스모슬라이드 업로드 기능을 뜯어고치고 있다. 일단 GPT한테 바이브 시켰더니 적당히 잘 작동...하네. 겉모습은.
@mitsuhikoArmin Ronacher by keeping my skills sharp? I don't think so
@aburkaaburka 🫣 You're judging before you've tried, and that's the disservice. You're assuming your skills will dull if you use an agent, and you're treating that assumption as a conclusion. That's the mistake. Try it first. See what actually happens. Then adjust your thinking based on experience, not fear.
I'm using them for months now, and in no way is it dulling my skills. I haven't learned as much as a programmer in years personally.
If you are a programmer and an AI hold-out, and you have some time off during Christmas: gift yourself a 100 USD subscription to Claude Code and … try it. But really try it. Take a week if you can afford it and dive in. It will change your opinion on these tools.
And I'm saying this also because I saw multiple people now who I knew learned throughout the year what AI agents are and it didn't click, until they took the time over Christmas to really dive in.
If you are a programmer and an AI hold-out, and you have some time off during Christmas: gift yourself a 100 USD subscription to Claude Code and … try it. But really try it. Take a week if you can afford it and dive in. It will change your opinion on these tools.
洪 民憙 (Hong Minhee) shared the below article:
Terraform & Kubernetes 도입 후기 (그리고 AI의 도움)
Juntai Park @arkjun@hackers.pub
Terraform & Kubernetes 도입 후기
최근 인프라 구성과 서비스 운영 전반에서 (늦었지만…) Terraform과 Kubernetes를 본격적으로 사용해 보았고, 생각보다 경험이 꽤 좋아서 기록 겸 공유해 둔다.
TL;DR
이걸 왜 이제 썼지. 진작 써볼 걸. (feat. 관리할 서버가 많아질수록 체감이 큼)
기존에 사용하던 방식
- 웹 브라우저 → AWS 콘솔에서 마우스 클릭으로 인프라 구성 (EC2 생성, 네트워크 설정 등)
- 로컬 서버에 Docker / Docker Compose 기반 운영
이번에 사용한 방식
Terraform (IaC)
- VPC, Subnet, NAT, Kubernetes Cluster 까지 인프라를 코드로 선언
- 변경 이력이 Git에 남아 변경 추적과 리뷰가 가능
- 코드로 명확히 남기니 재사용성과 일관성이 크게 좋아짐
- 콘솔 수작업이 줄어들어 휴먼 에러 감소
- '이 인프라가 왜 이렇게 생겼는지'가 코드로 설명됨
내 경우는 NCP(Naver Cloud Platform) 를 사용했는데, 지원하는 리소스 범위가 제한적이라 일부는 여전히 웹 콘솔에서 수작업이 필요했다.
그럼에도 불구하고, Terraform을 도입한 만족도는 꽤 높았다.
Kubernetes
- 배포, 롤링 업데이트(무중단), 오토스케일링이 정책 기반으로 자동 동작
- 모든 설정을
yaml파일로 관리할 수 있는 점이 매우 편리 - 서비스 디스커버리, 헬스 체크, 셀프 힐링 덕분에 운영 부담이 체감될 정도로 감소
- Pod / Node / Resource 단위로 문제를 분리해서 볼 수 있어 장애 원인 추적이 수월
- 서비스 규모가 커질수록 정리된 상태를 유지하기 쉬운 구조
- GitLab CI + Container Registry + ArgoCD 조합의 배포 자동화 경험이 매우 만족스러웠음
그리고, AI의 도움
이번에 느낀 또 하나의 큰 포인트는 AI의 존재감이었다.
- Terraform module 구조 설계, variable 정리
- Kubernetes manifest 작성 및 리팩토링 (Deployment, HPA, Ingress 등)
- 에러 메시지 / 이벤트 로그 해석
- 필요한 CLI 명령어를 바로 바로 알려줌
- “이 구성, 더 나은 패턴이 있는가?” 같은 설계 피드백
- 문서를 처음부터 끝까지 파는 방식보다, AI와 대화하면서 검증하고 다듬는 흐름이 훨씬 효율적이었다.
결과적으로,
- 러닝 커브는 여전히 존재하지만 AI를 보조 도구로 사용하면서 학습 속도와 시행착오 비용이 크게 줄어든 느낌
요약하자면,
- 수많은(?) 장애와 벽에 부딪히는 순간에도 언제든 도움을 받을 수 있다는 점에서 덜 두려웠다.
부록) K8S, 다음에도 바로 쓸 것인가?
- 서비스 초기부터 바로 도입할 것 같지는 않다 (K8S Cluster만 해도 NCP 기준 월 약 7만 원)
- 초기에는 인스턴스 1~2대 + 오토스케일링 정도로 충분할 듯 (아예 오토스케일링이 필요 없는 경우도 많다)
- 사용하는 인스턴스 수가 늘고, 서비스 규모가 커지면 그때 도입을 고민
- 사용 경험은 긍정적이지만 작은 서비스에는 확실히 오버스펙
- 서버에 바로 SSH 접근해서 띄우고 로그보고 재기동 시키고 하는 게 더 편안한 1인이라, 그런 거 못할 때 가끔 불편하게 느껴지기는 했음 (물론 셸 접근은 가능하나, 그러기에는 Pod이 너무 많..)
정리하면
- Terraform: 서비스 초기부터 도입하고 싶다
- Kubernetes: 상황에 따라 선택, 작은 서비스라면 초반 도입은 X
식탁보 1.15.0 버전을 출시했습니다. 1년여만의 대규모 업데이트로, .NET 10 적용과 함께 커뮤니티에서 불편 사항으로 여겨졌던 Windows Sandbox의 vGPU 기본 사용 문제, 언어 표시 문제, 그리고 인스톨러 간소화 등 성능과 기능 간소화는 물론, 코드의 분량을 대폭 간소화했습니다.
추후 TableCloth3 프로젝트에서 개발 중인 Avalonia 기반 프론트엔드로 쉽게 전환할 수 있도록 땅 다지기 작업도 같이 진행해두었고 계속 업데이트해나갈 예정입니다. 그리고 이번 업데이트부터 ARM64 빌드도 정식으로 제공됩니다.
꾸준한 관심과 성원에 늘 감사드립니다.
I finally managed to complete a working RFC9421 implementation... I didn't realize that Fedify's RFC9421 public key retrieval didn't include assertionMethod...
❯ witr ghostty
Target : ghostty
Process : ghostty (pid 36529)
User : mck
Service : launch job demand
Command : /Applications/Ghostty.app/Contents/MacOS/ghostty
Started : just now (Mon 2025-12-29 10:08:55 +00:00)
Why It Exists :
launchd (pid 1) → ghostty (pid 36529)
Source : application.com.mitchellh.ghostty.34914134.34914139 (launchd)
Type : Launch Agent
Working Dir : /
Open Files : 100 of 256 (39%)
Locks : /Users/mck/Library/Caches/com.mitchellh.ghostty/sentry/8c48f586-5c27-49c8-71a1-7727494394fc.run.lock
Warnings :
• Process is running from a suspicious working directory: /
• Service name and process name do not match
최근 보안의 화두는 제로트러스트지만, 정작 가장 민감한 공동인증서 파일은 여전히 NPKI라는 고전적인 디렉터리 구조 속에 노출되어 있습니다.
OS 수준의 암호화 기술인 BitLocker나 VBS의 이점을 전혀 활용하지 못하는 현 상황을 개선해보고자, Windows 인증서 저장소를 백엔드로 활용하는 방식을 고민 중입니다. macOS의 Keychain 시스템처럼 인증서를 시스템 보안 영역 내부로 끌어들임으로써, 파일 탈취 위험을 획기적으로 낮추는 것이 목표입니다.
인프라 자체를 바꿀 순 없어도, 엔드포인트 단에서 '방어의 밀도'를 높이는 유의미한 시도가 될 것 같습니다. :-D
Claude Code Subagent를 가만 살펴봤는데, 내가 일하는 방식 그리고 다른 사람에게 위임할 수 있는 방식을 잘 정의하면 그럭저럭 쓸만한 것 같음. 생각을 글로 잘 정리하는 버릇을 들여야겠다.
(오프라인에서 했던 얘기를 온라인에서도 하기)
@hongminhee洪 民憙 (Hong Minhee) 님 블로그는 국한문혼용으로 보면 세로쓰기 가로스크롤로 바뀌는 게 꽤나 운치가 있다고 생각해요..... 한자를 못 읽는 건 아쉽지만
FOSDEM 2026 Social Web Speakers
I have been trying to create a list for #fosdem26 and realized that (ironically) most of the people in the socialweb track ... does not have a fediverse account listed there.
I am also at fault, btw, so shame to me.
If you know someone who is presenting at #fosdem26 please send them my way. I will update this thread with the list of confirmed speakers.
The Fosdem 26 social web track List:
@pfefferleMatthias Pfefferle
@evanEvan Prodromou @evanprodromou
@haubleshannah aubry
@mapacheMaho 🦝🍻
@dariusDarius Kazemi
@bjoernstaBjörn Staschen
@django
@resieguenRebecca Sieber
@openforfutureOpen For Future | Italia
@iusondemandValentino Spataro
@cwebberChristine Lemmer-Webber
@tsyesikaJessica Tallon
@zzepposs
@melaniebartos
@Pepijn
@FloppyJames Smith 💾
@tobias
@mayel
@ivan
@hongminhee@hackers.pub洪 民憙 (Hong Minhee)
@samviesamvie ⁂
@benpateBen Pate 🤘🏻
@neiman
@hongminhee@hollo.social洪 民憙 (Hong Minhee) 
@filippodb
filippodb ⁂
@magostinelliMichele Agostinelli
@publicspaces
@cubicgardenIan Forrester | @cubicgarden
@samviesamvie ⁂
@bonfire
@FediVariety
@vishnee
@cypherhippiePaul Fuxjaeger
@nextgraph
Non Social Web Track presenters:
@bogoBogomil Shopov - Бого
@localfirstOpen Local First
Social Web Track schedule:
https://fosdem.org/2026/schedule/track/social-web/
Boosts are also appreciated!
P.S. Special thanks to
@liaizonwakest ⁂,
@andypiper,
@michaelMichael Foster,
@toon
asdf + direnv 조합을 mise로 바꾸고 나서, 초반에는 환경 변수 제어가 쉽고 다양한 점이 좋았다면 시간이 갈수록 tasks 기능이 기존 프로젝트까지 mise로 전환하게 만든다.
[tasks."dev:db"]
dir = "./data"
run = "./docker-run-postgres.sh --no-tty"
[tasks."dev:cms"]
dir = "./cms"
run = """
until nc -z localhost 5432; do
echo "Waiting for database to be ready..."
sleep 1
done
corepack yarn dev || [ $? -eq 129 ] || [ $? -eq 130 ]
"""
[tasks.dev]
depends = ["dev:db", "dev:cms"]
pyodide를 사용해서 python으로 된 앱을 정적 웹사이트로 서빙 https://khris.github.io/woodcut/
I'm working on a new JavaScript/TypeScript library for natural language translation powered by LLMs. I want a name that feels elegant, memorable, and reflects the essence of translation.
I've narrowed it down to four candidates from different linguistic roots. Which one do you think fits bets?
-
Xindaya (信達雅): Derived from Yan Fu (嚴復)'s Three Pillars of Translation—faithfulness (信), expressiveness (達), and elegance (雅).
-
Vertana (वर्तन): Means transformation, turning, or process. It evokes the fluid and sacred process of transforming meaning from one language to another.
-
Glosso (γλῶσσα): The root for tongue or language. It's the origin of terms like glosssary and polyglot.
-
Fanyi (飜譯): The direct and minimal term for translation. It's punchy and honors the long-standing tradition of translation in East Asia.
웹의 좀 더 단순한 대안으로 만들어진 제미니 프로토콜에 한 때 관심이 조금 있었는데, 얼마 지나지 않아 금방 흥미가 식었더랬다. 다른 것보다 텍스트를 중요시 한다는 철학에 비해 텍스트가 무엇인지에 대한 관점이 너무 나이브하다고 느꼈다. 제미니는 아랍어나 히브리어 같은 RTL 언어들의 텍스트를 담아낼 수 있는가? 몽골어나 한문 같은 세로쓰기 언어의 텍스트는? 난독 한자에 후리가나나 한글을 달 수 있는가? 이런 질문들에 대답을 해주지 못한다고 느꼈다.
@hongminhee洪 民憙 (Hong Minhee) 저도 전에 제미니 프로토콜 관심 있었는데 이런 점은 생각조차 못해봤네요. 심지어 해커뉴스에 가끔 올라오는 제미니 프로토콜 소개 글에 달리는 비판 댓글들조차도 이 문제를 언급한 적이 없었던 것 같아요. 분명 생각해봐야 할 문제인데 말이죠...
세상의 발전이란건 참 빠르구나... 라는 생각이 새삼 들었어요 한 30년쯤 전에는 프로그램이 메모리와 장치에 직접 접근할 수 있었고 협조 안 해주면 혼자서 CPU를 다 먹을 수 있는 시대가 있었다는게 믿기지 않지 않아요??
예전에 LLM이 얼마나 복잡한 코드를 이해할 수 있는지 파악하기 위해 Gemini 2.5 모델들로 내 IOCCC 2012 수상작을 던지고 무슨 일을 하는지 실행 없이 알아 맞춰 보라고 했더니 하나도 제대로 파악하지 못했던 적이 있다. 문득 생각이 나서 Gemini 3 Pro는 개선되었을려나 생각했는데, 힌트 하나만 받고 10분동안 생각하더니 완벽하게 응답에 성공했다! 심지어 설명도 실행 없이 분석했다는 걸 감안할 때 매우 정확했다. IOCCC 수상작을 모두 기억하고 있을 가능성을 감안해 이전에 본 적이 있냐고 물어 보니 환각(...)을 내뱉는 것도 그렇고(그보다 외웠다면 처음에 바로 정답을 얘기했겠지), 실제로 생각 과정을 보면 사람이 할 법한 분석을 전부 하고 있는 걸 보니 진짜로 LLM들의 reasoning 능력이 이 정도 수준에 도달했음을 알 수 있다. 세상 참 많이 발전했네.
I've opened a proposal for #LogTape to support configuration from plain objects, making it possible to load #logging configs from JSON/YAML/TOML files.
The idea is similar to Python's logging.config.dictConfig()—you'd be able to configure sinks, formatters, and loggers declaratively, making it easier to manage different configs for dev/staging/prod without touching code.
Would love to hear your thoughts, especially if you've worked with similar patterns in other ecosystems.
LLM(과 그것을 사용한 앱)을 사용한다는 것은 확률을 내가 어느정도는 조작할 수 있는 가챠인것 같다.
오늘도 오라클의 기묘한 버그? 스펙??을 밟아서 기록하려 왔는데요 nginx-ingress-controller를 기본 설정으로 설치하면 Service의 externalTrafficPolicy가 Local이라서 controller pod이 떠 있는 node에서만 접속이 되는데요 이랬더니 왠지 NLB 자체가 연결이 안 되고(포트가 닫힘) externalTrafficPolicy를 Cluster로 바꾸서 모든 node에서 접속할 수 있게 만드니까 NLB가 열리는데 보통 NLB의 백엔드 Healthcheck는 문제있는 백엔드를 제외하기 위해 존재한다고 생각했는데 오라클 NLB는 일부 백엔드에 문제가 생기면 전체가 안되는 기묘한 구조인가봐요??? 대체왜??????
확실히 오라클에 1%쯤 배신감 든 게 전에 발표에서 오라클은 설정한 유저데이터 스크립트 조회도 못하게 한다라고 욕하고 왔는데 알고보니 API로는 제공하는데 콘솔엔 없었다는게 참 테라폼 사용자들만 고객이구나... 같은 느낌 (물론 저도 이젠 테라폼을 쓰지만요...)
정말 IaC 사용자만 고객인 정도가 아니라 테라폼 사용자만 고객인게 쿠버네티스 클러스터 구축할때 콘솔에서 빠른시작으로 구축해도 안돼고 Pulumi로 구축해도 안됐는데 테라폼 쓰니까 빠르게 성공해서 좀 허무했어요
확실히 오라클에 1%쯤 배신감 든 게 전에 발표에서 오라클은 설정한 유저데이터 스크립트 조회도 못하게 한다라고 욕하고 왔는데 알고보니 API로는 제공하는데 콘솔엔 없었다는게 참 테라폼 사용자들만 고객이구나... 같은 느낌 (물론 저도 이젠 테라폼을 쓰지만요...)
#오라클클라우드 인스턴스 생성해서 퍼블릭 아이피 붙인 건 잘 되는데... 번역하고 이런게 다 개판이야.... AWS가 그립다
@akastoot악하 (개인적인 억까 평가지만) 오라클은 자기네 모든 고객이 테라폼을 사용한다는 상정이라도 하고 있는 거 같으니 이번 기회에 테라폼을 사용해보시는걸 추천드려요... https://registry.terraform.io/providers/oracle/oci/latest/docs 문서 AI에 던져주면 그래도 그럭저럭 짜더라구요
Lite-XL 일주일 사용기
최근 에디터 시장이 치열합니다. Zed와 Visual Studio Code, Helix와 Neovim, 그리고 Fleet도 있습니다.
이 중 가장 주목받는건 역시 Zed와 Visual Studio Code입니다. Visual Studio Code와 가장 비슷한 UI를 보유하면서도 강력한 확장성과 정통성을 보유한 에디터로써 Zed의 입지는 공고합니다.
특히, Zed는 Rust와 GPU 렌더링을 활용한 빠른 에디터로써 Visual Studio Code의 느린 Electron 기반이라는 점을 정확히 타격하며 높은 인기를 얻고 있습니다.
이런 GPU 가속 에디터가 높은 인기를 얻고 있는 시장에서, 제 눈에 띄인 것은 바로 Lite-XL입니다. Lite-XL은 Lite라는 GPU 가속 에디터의 포크로, 많은 기능을 추가한 Vi와 Vim의 관계와 비슷합니다.
가장 특징을 가지는 부분은 코어는 Rust나 Zig가 아닌 Pure C로만 작성되어 있으며, 런타임은 Lua를 통해 작성되어 있어 모든 부분이 Lua 스크립트로 커스텀이 가능하다는 점입니다. 매우 Emacs스러운 부분이라고 할 수 있습니다.
하지만, 어느정도 Battery Included인 Emacs와는 달리 Lite-XL은 다운로드 시 오직 코드 하이라이팅과 편집 정도만 지원합니다. 모든 기능은 전부 플러그인으로 다운로드 해야 합니다. 내장 터미널조차 없고, LSP조차 없으며, Git 기능조차 없습니다.
이를 해결하기 위하여 lpm이라는 가벼운 패키지 매니저를 지원합니다. lpm은 마치 일반 리눅스의 패키지 매니저와 같아 간단한 입력만으로 플러그인을 설치할수 있습니다.
lpm install lsp_go
이렇게 플러그인을 설치한 후의 Lite-XL은 Visual Studio Code와 비견해 매우 빠르고 강력한 에디터로 발돋움합니다. Lite-XL의 실행파일 크기는 고작 10MB밖에 되지 않으며, 반응 속도 또한 매우 빨라 실행하자마자 바로 창이 렌더링 될 정도로 빠른 점도 Pure C로 매우 가볍고 빠르게 작성된 특징에서 기인합니다.
Vibe Coding을 위한 플러그인은 없지만 Claude CLI, Gemini CLI, OpenAI Codex 등을 터미널에서 실행 가능하기 때문에 로컬 환경 개발에서는 매우 빠른 속도와 바이브 코딩의 편안함도 챙길 수 있습니다.
거의 모든 기능에 단축키를 부여할수 있으며, (저는 Ctrl-S, Ctrl-Shift-O, Ctrl-Shift-P만 사용합니다.) 컬러 스킴도 Visual Studio Code에 비교해 더욱 많은 컬러 스킴을 기본 제공합니다.
다만, 가장 아쉬운 부분으로는 Remote Working이 제대로 되지 않는다는 점에서 있는데, Visual Studio Code가 code-server에 바탕한 Code Tunnel 기능을 지원하지만, Lite-XL은 이를 지원하지 못하고, 오직 네이티브 환경과 로컬 환경에서만 작업이 가능하다는 단점이 존재합니다.
또한, 많은 LSP 서버들이 존재하지 않으며, 플러그인의 자유도와 패키지 매니저는 강력하지만 절대적으로 Zed와 Visual Studio Code와 비교해서 수가 적은 것은 단점으로 꼽을 수 있습니다.
가장 대표적인 예로, 제가 PS를 할 때 애용하는 플러그인인 CPH Problem Solver와 같은 니치한 보조 도구가 부족하며, Visual Studio Code에 내장된 Stack Trace Debugger나 Docker 통합 등 많은 기능이 부재합니다.
그럼에도 가볍게 프로그래밍 한다는 점에선 Notepad++나 Sublime Editor와 비슷한 가벼움을 가지면서도, Zed나 Visual Studio Code에 꿇리지 않는 기능과 플러그인 매니지먼트 시스템을 가진다는 점에서 저는 Lite-XL을 매우 만족스럽게 사용하고 있습니다.
클로드 코드 쓰면서 처리가 가장 오래걸리는 프롬프트: /compact
데이터베이스 공부 중 하나로 B+트리 C로 구현하고 있는데, 포인터 사용, 정렬, 재귀 호출, DFS, 이진 탐색까지 한 번에 연습하기 좋은, 학습에 아주 훌륭한 자료구조구만.
洪 民憙 (Hong Minhee) shared the below article:
Agent Skill도 Tool Use로 시작합니다.
자손킴 @jasonkim@hackers.pub
Anthropic(앤스로픽)이 공개한 Agent Skill은 에이전트가 특정 업무를 수행할 때 필요한 절차적 지식과 맥락을 효율적으로 전달하기 위한 오픈 스탠다드입니다. 이 기능은 작업 지시문과 스크립트, 리소스를 재사용 가능한 단위로 패키징하여 대규모 언어 모델이 겪는 컨텍스트 낭비와 일관성 저하 문제를 해결합니다. 핵심 원리인 점진적 공개(progressive disclosure)를 통해 초기에는 메타데이터만 로드하고, 필요할 때만 상세한 SKILL.md 파일과 리소스를 동적으로 호출하여 효율적인 컨텍스트 관리를 구현합니다. 실제 dev-browser Skill의 동작 과정을 보면, 에이전트가 지시문을 해석하여 실시간으로 코드를 생성하고 도구를 체이닝하는 구체적인 메커니즘을 확인할 수 있습니다. 또한 컨텍스트 분리를 목적으로 하는 서브에이전트(subagent)나 외부 시스템 연동을 위한 모델 컨텍스트 프로토콜(Model Context Protocol, MCP)과의 비교를 통해 각 기술의 고유한 역할을 명확히 구분합니다. 단순히 도구를 제공하는 수준을 넘어 도구의 올바른 사용법을 가르치는 Agent Skill은 에이전트의 실행 능력을 최적화하고 지능적인 업무 자동화를 완성하는 핵심적인 메타 도구입니다.
Read more →It's Christmas, but I don't really have anything to do, so I'm just coding. (I'm not Christian.)
Upyo 0.4.0 released. Upyo is an email sending library for Node.js, Deno, Bun, and edge functions. New in this version:
- JMAP transport for modern email servers
- DKIM signing support in SMTP transport
- Message-level idempotency keys for reliable retries
TIL: <form>에 .submit()을 하면 이벤트를 거치지 않고 검증도 안하고 냅다 제출이 된다. 이벤트를 거치게 만들려면 .requestSubmit()을 해야 된다
deno install 명령어를 실행할 때 패치 패키지가 암묵적으로 npm 패키지로 덮어쓰여지는 버그를 수정하였습니다! 😊
루비, 레일즈에서 페디버스를 구현하려면 https://gitlab.com/experimentslabs/federails 이 프로젝트가 구현 정도가 잘 되어 있으나 2명이서 틈틈히 개발하고 있어서 진행 상황이 느린 상태. 컨트리뷰터가 되어야 하나 포크를 해야 하나...
크리스마스는 새 프로그래밍 언어를 공개하기에 좋은 날이죠. 아직 미완성이지만 요즘 작업하고 있던 프로젝트를 소개합니다. https://github.com/Kroisse/tribute
순수 함수형이고, 모나드는 없고, 소유권도 없고, 타입클래스나 트레잇도 없습니다. 물론 객체 시스템도 없고요. 대신 제네릭과 대수적 효과를 넣을 예정입니다. ad-hoc polymorphism을 배제하고 어디까지 갈 수 있는지 시험해보려는 게 목적 중 하나인데 생각보다 할만할 것 같아요.
그리고 매우 vibe-coded되어 있습니다. Claude Code와 Codex가 없었으면 엄두도 못 냈을 듯.
문법적으로는 Rust와 Gleam에, 의미론적으로는 Gleam과 Unison에 영감을 많이 받았습니다. 사실 Gleam과 Unison 둘 다 네이티브 바이너리로 컴파일을 아직 못 하고 있어서 시작한 프로젝트이기도 합니다. 하지만 정작 Tribute도 첫 타겟은 네이티브가 아니라 WebAssembly 3.0입니다. GC 구현을 만들기 귀찮았거든요.
크리스마스를 맞아 크리스마스 트리... 가 아닌 Hackers' Pub 초대 트리를 꾸몄습니다.
기존 초대 트리는 작은 규모에서는 충분히 제 역할을 했으나 회원이 점차 늘어나면서 구조를 파악하기 어렵고, 페이지가 너무 길어져 변화가 필요하다고 생각했습니다. 다음 개편되는 Hackers' Pub의 초대 트리 페이지에서는 초대 관계를 잘 드러내면서, 많은 회원이 한 눈에 들어올 수 있도록 만들었습니다. Hackers' Pub의 회원은 앞으로도 많이 늘어날 예정이니까요. 그렇겠죠? 내년에도 Hackers' Pub에서 많은 분들을 만날 수 있기를, 더 풍성한 초대 트리를 볼 수 있기를 기대해봅니다.
Now trying to implement a JMAP transport for Upyo…
Complete! It will be included in the next release of Upyo.
洪 民憙 (Hong Minhee) shared the below article:
MCP도 Tool Use를 사용합니다.
자손킴 @jasonkim@hackers.pub
지난 글에서는 Subagent가 Tool Use 위에서 어떻게 동작하는지 알아보았다. 이번 글에서는 MCP(Model Context Protocol)가 Tool Use와 어떻게 연결되는지 내장 도구인 Subagent를 예시로 비교하며 설명할 것이다. 또한 내장 도구가 있음에도 불구하고 MCP가 필요한 이유에 대해서도 알아본다.
내장 도구 vs MCP 도구
Subagent 글에서 살펴본 Task 도구는 에이전트에 내장된 도구였다. MCP 도구는 어떻게 다를까? 결론부터 말하면 LLM 입장에서는 둘 다 그냥 도구다. 차이는 실행이 어디서 일어나는가뿐이다.
내장 도구든 MCP 도구든 API 요청의 tools 배열에 동일한 형태로 들어간다:
{
"tools": [
{
"name": "Read",
"description": "Reads a file from the local filesystem...",
"input_schema": { ... }
},
{
"name": "Task",
"description": "Launch a new agent to handle complex tasks...",
"input_schema": { ... }
},
{
"name": "mcp__claude-in-chrome__navigate",
"description": "Navigate to a URL in the browser...",
"input_schema": { ... }
}
]
}
LLM은 도구 이름과 description, input_schema만 보고 어떤 도구를 호출할지 결정한다. 이 도구가 내장인지 MCP인지는 알 수 없고 알 필요도 없다.
핵심 차이는 도구가 어디서 실행되는가다.
| 내장 도구 (예: Task) | MCP 도구 | |
|---|---|---|
| 실행 위치 | Host 내부 | Host 외부 (별도 프로세스) |
| 통신 방식 | 함수 호출 | 프로토콜 (STDIO/HTTP) |
| 실행 주체 | Host (또는 LLM) | 외부 시스템 |
| 결과 | Host가 생성한 데이터 | 외부 시스템이 반환한 데이터 |
다이어그램으로 보면 더 명확하다:
Host 프로세스
─────────────────────────────────────────────────
Agent
│
┌────────────┴────────────┐
▼ ▼
Task mcp__xxx 도구
(내장 도구) │
│ │
▼ │ STDIO / HTTP
새 메시지 루프 │
(LLM) │
│
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─
│
외부 프로세스 ▼
MCP Server
(Chrome, DB...)
- 내장 도구 흐름: Agent → Task → 새 메시지 루프 (모두 Host 프로세스 내부)
- MCP 도구 흐름: Agent → mcp__xxx 도구 → [프로세스 경계] → MCP Server (Host 외부)
실제 예시로 보는 차이
지난 글에서 본 Explorer subagent 호출과 MCP 도구 호출을 비교해보자.
내장 도구 (Task) 호출:
{
"type": "tool_use",
"id": "toolu_01ABC123",
"name": "Task",
"input": {
"subagent_type": "Explore",
"prompt": "entity 구조를 탐색해주세요",
"description": "Entity 구조 탐색"
}
}
Task 도구가 호출되면 Host 내부에서 새로운 메시지 루프가 생성되고, Haiku 모델이 Glob, Read 등 다른 내장 도구로 탐색을 수행한다. 결과는 LLM이 생성한 분석 텍스트다.
MCP 도구 호출:
{
"type": "tool_use",
"id": "toolu_01DEF456",
"name": "mcp__claude-in-chrome__navigate",
"input": {
"tabId": 12345,
"url": "http://localhost:3000"
}
}
MCP 도구가 호출되면 Host는 외부의 MCP Server(Chrome 브라우저 프로세스)에 명령을 전달한다. 결과는 브라우저가 반환한 데이터(스크린샷, 콘솔 로그 등)다.
Agent 입장에서는 둘 다 tool_use 요청을 받아 실행하고 tool_result를 반환하는 동일한 패턴이다.
MCP 도구가 tools 배열에 포함되는 방식
MCP 서버가 제공하는 도구들은 어떻게 tools 배열에 들어갈까? MCP 도구는 mcp__server-name__tool-name 형태의 이름을 가진다.
{
"name": "mcp__claude-in-chrome__navigate",
"description": "Navigate to a URL, or go forward/back in browser history...",
"input_schema": {
"type": "object",
"properties": {
"tabId": {
"description": "Tab ID to navigate",
"type": "number"
},
"url": {
"description": "The URL to navigate to",
"type": "string"
}
},
"required": ["tabId", "url"]
}
}
이 네이밍 규칙이 필요한 이유는 여러 MCP 서버가 동시에 연결될 수 있기 때문이다. 예를 들어 filesystem 서버와 github 서버가 둘 다 read라는 도구를 제공한다면 충돌이 발생한다. mcp__filesystem__read와 mcp__github__read로 구분하면 이 문제가 해결된다.
Claude Code에서 /mcp를 입력하면 연결된 MCP 서버 목록을 볼 수 있다. Claude in Chrome이 제공하는 도구들을 살펴보자:
| 도구 이름 | 설명 |
|---|---|
mcp__claude-in-chrome__navigate |
URL로 이동하거나 브라우저 히스토리 앞/뒤로 이동 |
mcp__claude-in-chrome__computer |
마우스/키보드로 브라우저와 상호작용, 스크린샷 촬영 |
mcp__claude-in-chrome__read_page |
페이지의 접근성 트리 표현을 가져옴 |
mcp__claude-in-chrome__find |
자연어로 페이지 요소 찾기 |
mcp__claude-in-chrome__form_input |
폼 요소에 값 입력 |
mcp__claude-in-chrome__javascript_tool |
페이지 컨텍스트에서 JavaScript 실행 |
이 도구들은 에이전트가 MCP 서버에 연결할 때 서버로부터 목록을 받아와 tools 배열에 추가된다. 에이전트가 시작될 때 대략 다음과 같은 과정이 일어난다:
- 에이전트가 설정된 MCP 서버들에 연결
- 각 서버에
tools/list요청을 보내 제공하는 도구 목록 수신 - 받은 도구들에
mcp__server-name__prefix를 붙여tools배열에 추가 - API 요청 시 내장 도구와 함께 전송
MCP 도구 호출 흐름
Claude가 MCP 도구를 호출하면 에이전트는 다음 단계를 수행한다:
Claude Agent MCP Server
│ │ │
│ tool_use │ │
│ (mcp__claude-in- │ │
│ chrome__navigate) │ │
│ ─────────────────────► │ │
│ │ │
│ prefix 파싱 │
│ server: claude-in-chrome │
│ tool: navigate │
│ │ │
│ │ tools/call │
│ │ ───────────────────────► │
│ │ │
│ │ 실행 결과 │
│ │ ◄─────────────────────── │
│ │ │
│ tool_result │ │
│ ◄───────────────────── │ │
│ │ │
결국 MCP 도구 호출도 일반 Tool Use와 동일한 패턴을 따른다. 차이점은 에이전트가 도구를 직접 실행하는 대신 외부 MCP 서버에 위임한다는 것뿐이다.
MCP는 왜 도구를 외부로 분리하는가
지금까지 MCP 도구가 어떻게 동작하는지 살펴보았다. 그런데 왜 이런 구조가 필요할까?
모든 도구를 내장할 수 없다
에이전트에 도구를 추가하는 가장 단순한 방법은 에이전트 내부에 직접 구현하는 것이다. 하지만 이 방식에는 한계가 있다:
- 모든 도구를 미리 구현할 수 없다: 파일 시스템, 데이터베이스, 브라우저, Slack, GitHub, Jira... 세상에는 수많은 시스템이 있고 에이전트 개발자가 이 모든 연동을 직접 구현하기는 불가능하다.
- 사용자마다 필요한 도구가 다르다: 어떤 사용자는 PostgreSQL을, 다른 사용자는 MongoDB를 사용한다. 모든 조합을 에이전트에 내장할 수 없다.
- 도구 업데이트가 어렵다: 외부 API가 변경되면 에이전트 전체를 다시 배포해야 한다.
MCP는 이 문제를 도구 제공자와 도구 사용자의 분리로 해결한다.
MCP의 핵심 구조
MCP는 클라이언트-서버 아키텍처를 따른다.
참여자 (Participants):
- MCP Host: MCP 클라이언트를 관리하는 AI 애플리케이션 (예: Claude Desktop, VS Code, Claude Code)
- MCP Client: MCP 서버와 연결을 유지하고 컨텍스트를 얻어오는 컴포넌트
- MCP Server: MCP 클라이언트에게 컨텍스트를 제공하는 프로그램 (도구 제공자)
Host와 Client의 관계:
- Host는 MCP 서버 연결마다 별도의 MCP Client를 생성한다
- 예를 들어 Claude Code(Host)가 Chrome 서버와 filesystem 서버에 연결하면 두 개의 MCP Client 객체가 생성된다
- 각 MCP Client는 하나의 MCP Server와 전용 연결을 유지한다
이 분리 덕분에:
- 도구 제공자는 MCP 서버만 만들면 됨 (에이전트 코드 수정 불필요)
- 에이전트 개발자는 MCP 클라이언트만 구현하면 모든 MCP 서버의 도구 사용 가능
- 사용자는 필요한 MCP 서버만 설치하여 에이전트 기능 확장 가능
MCP와 인증
원격 MCP 서버를 사용할 때는 인증이 필요한 상황이 발생한다. MCP 서버가 사용자의 GitHub 저장소에 접근하거나 Slack 워크스페이스에 메시지를 보내야 할 때, "이 요청이 정말 이 사용자로부터 온 것인가?"를 확인해야 한다.
MCP는 프로토콜 수준에서 OAuth 2.1 인증 체계를 표준화했다. 덕분에 어떤 MCP 클라이언트든 동일한 방식으로 MCP 서버에 인증할 수 있고, MCP 서버 개발자는 인증 로직을 한 번만 구현하면 모든 클라이언트와 호환된다.
Tool Use를 넘어서
지금까지 MCP를 Tool Use의 확장으로 설명했다. 실제로 MCP 도구는 가장 많이 사용되는 기능이고, LLM이 외부 시스템과 상호작용하는 핵심 방식이다.
하지만 MCP가 제공하는 것이 도구만은 아니다. MCP 명세를 보면 Tool Use와 무관하게 동작하는 기능들이 있다. 이 기능들은 tool_use -> tool_result 사이클을 거치지 않고 다른 방식으로 LLM에게 컨텍스트를 제공하거나 LLM의 능력을 활용한다.
MCP의 확장 기능
MCP는 도구(Tools) 외에도 몇가지 핵심 기능들이 있다. Resources, Prompts, 그리고 Sampling이다.
Resources
Resources는 Tool Use를 거치지 않는 데이터 제공 기능이다. 도구는 LLM이 "행동"을 요청할 때 호출되지만 Resource는 LLM이 응답을 생성하기 전에 컨텍스트로 미리 주입된다.
예를 들어 PostgreSQL MCP 서버가 데이터베이스 스키마를 Resource로 노출한다고 하자. 사용자가 "users 테이블에 email 컬럼 추가해줘"라고 요청하면 LLM은 별도의 도구 호출 없이도 현재 스키마 구조를 이미 알고 있다. SELECT * FROM information_schema.columns를 먼저 실행할 필요가 없는 것이다. Resource가 컨텍스트에 미리 주입되어 있기 때문이다.
Prompts
Prompts도 Tool Use와 무관하다. MCP 서버가 미리 정의한 재사용 가능한 프롬프트 템플릿으로 클라이언트가 직접 요청해서 가져온다.
예를 들어 코드 리뷰 MCP 서버가 "보안 취약점 분석" 프롬프트 템플릿을 제공하면 클라이언트는 이 템플릿을 불러와 LLM에게 전달할 수 있다. LLM이 도구를 호출하는 것이 아니라 클라이언트가 MCP 서버로부터 프롬프트를 받아오는 것이다.
Sampling (역방향 LLM 호출)
Sampling은 가장 독특한 기능이다. 일반적인 MCP 흐름은 LLM → Agent → MCP Server지만 Sampling은 이 방향을 뒤집는다:
일반 흐름: LLM → Agent → MCP Server
Sampling: MCP Server → Agent → LLM
MCP 서버가 복잡한 판단이 필요할 때 역으로 LLM에게 질문할 수 있다. 예를 들어 코드 분석 MCP 서버가 특정 패턴을 발견했을 때 "이 코드가 보안 취약점인지 판단해달라"고 LLM에게 요청하는 식이다. MCP 서버는 LLM의 답변을 기반으로 최종 결과를 만들거나 다른 도구나 함수를 사용하는 등의 판단을 할 수 있게 된다.
Sampling은 Tool Use의 tool_use -> tool_result 패턴이 아니라 MCP 프로토콜 자체의 sampling/createMessage 요청을 통해 동작한다.
마무리
지금까지 MCP가 Tool Use 위에서 어떻게 동작하고 또 Tool Use를 넘어 어떤 기능들을 제공하는지 살펴보았다.
MCP 도구는 Tool Use다. 내장 도구와 동일하게 tools 배열에 포함되고 tool_use로 호출되며 tool_result로 결과가 반환된다. LLM 입장에서는 구분이 없다. 차이점은 실행 위치뿐이다. 내장 도구는 Host 프로세스 내부에서, MCP 도구는 외부 MCP Server에서 실행된다.
하지만 MCP는 도구만 제공하지 않는다. Resources와 Prompts는 Tool Use 없이 컨텍스트를 제공하고 Sampling은 MCP 서버가 역으로 LLM을 활용할 수 있게 한다. MCP는 Tool Use를 확장하면서도 Tool Use만으로는 해결할 수 없는 영역까지 커버하는 프로토콜이다.
모든 도구를 에이전트에 내장할 수 없기 때문에 에이전트와 도구를 분리할 필요가 생겼고 MCP는 도구 제공자와 사용자를 분리하여 생태계 확장을 가능하게 한다.
이 글에서는 Tool Use의 기본 구조를, 이어지는 글에서는 Subagent가 Tool Use 위에서 동작함을 살펴보았고 이번 글에서 MCP가 Tool Use를 확장하면서도 그 이상의 기능을 제공함을 살펴보았다. Claude Code의 핵심 확장 기능들은 Tool Use라는 메커니즘 위에서 동작하지만 MCP 생태계는 그보다 더 넓은 가능성을 열어두고 있다.
Fedify 1.10.0: Observability foundations for the future debug dashboard
Fedify is a #TypeScript framework for building #ActivityPub servers that participate in the #fediverse. It reduces the complexity and boilerplate typically required for ActivityPub implementation while providing comprehensive federation capabilities.
We're excited to announce #Fedify 1.10.0, a focused release that lays critical groundwork for future debugging and observability features. Released on December 24, 2025, this version introduces infrastructure improvements that will enable the upcoming debug dashboard while maintaining full backward compatibility with existing Fedify applications.
This release represents a transitional step toward Fedify 2.0.0, introducing optional capabilities that will become standard in the next major version. The changes focus on enabling richer observability through OpenTelemetry enhancements and adding prefix scanning capabilities to the key–value store interface.
Enhanced OpenTelemetry instrumentation
Fedify 1.10.0 significantly expands OpenTelemetry instrumentation with span events that capture detailed ActivityPub data. These enhancements enable richer observability and debugging capabilities without relying solely on span attributes, which are limited to primitive values.
The new span events provide complete activity payloads and verification status, making it possible to build comprehensive debugging tools that show the full context of federation operations:
activitypub.activity.receivedevent onactivitypub.inboxspan — records the full activity JSON, verification status (activity verified, HTTP signatures verified, Linked Data signatures verified), and actor informationactivitypub.activity.sentevent onactivitypub.send_activityspan — records the full activity JSON and target inbox URLactivitypub.object.fetchedevent onactivitypub.lookup_objectspan — records the fetched object's type and complete JSON-LD representation
Additionally, Fedify now instruments previously uncovered operations:
activitypub.fetch_documentspan for document loader operations, tracking URL fetching, HTTP redirects, and final document URLsactivitypub.verify_key_ownershipspan for cryptographic key ownership verification, recording actor ID, key ID, verification result, and the verification method used
These instrumentation improvements emerged from work on issue #234 (Real-time ActivityPub debug dashboard). Rather than introducing a custom observer interface as originally proposed in #323, we leveraged Fedify's existing OpenTelemetry infrastructure to capture rich federation data through span events. This approach provides a standards-based foundation that's composable with existing observability tools like Jaeger, Zipkin, and Grafana Tempo.
Distributed trace storage with FedifySpanExporter
Building on the enhanced instrumentation, Fedify 1.10.0 introduces FedifySpanExporter, a new OpenTelemetry SpanExporter that persists ActivityPub activity traces to a KvStore. This enables distributed tracing support across multiple nodes in a Fedify deployment, which is essential for building debug dashboards that can show complete request flows across web servers and background workers.
The new @fedify/fedify/otel module provides the following types and interfaces:
import { MemoryKvStore } from "@fedify/fedify";
import { FedifySpanExporter } from "@fedify/fedify/otel";
import {
BasicTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
const kv = new MemoryKvStore();
const exporter = new FedifySpanExporter(kv, {
ttl: Temporal.Duration.from({ hours: 1 }),
});
const provider = new BasicTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));The stored traces can be queried for display in debugging interfaces:
// Get all activities for a specific trace
const activities = await exporter.getActivitiesByTraceId(traceId);
// Get recent traces with summary information
const recentTraces = await exporter.getRecentTraces({ limit: 100 });The exporter supports two storage strategies depending on the KvStore capabilities. When the list() method is available (preferred), it stores individual records with keys like [prefix, traceId, spanId]. When only cas() is available, it uses compare-and-swap operations to append records to arrays stored per trace.
This infrastructure provides the foundation for implementing a comprehensive debug dashboard as a custom SpanExporter, as outlined in the updated implementation plan for issue #234.
Optional list() method for KvStore interface
Fedify 1.10.0 adds an optional list() method to the KvStore interface for enumerating entries by key prefix. This method enables efficient prefix scanning, which is useful for implementing features like distributed trace storage, cache invalidation by prefix, and listing related entries.
interface KvStore {
// ... existing methods
list?(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
}When the prefix parameter is omitted or empty, list() returns all entries in the store. This is useful for debugging and administrative purposes. All official KvStore implementations have been updated to support this method:
MemoryKvStore— filters in-memory keys by prefixSqliteKvStore— usesLIKEquery with JSON key patternPostgresKvStore— uses array slice comparisonRedisKvStore— usesSCANwith pattern matching and key deserializationDenoKvStore— delegates to Deno KV's built-inlist()APIWorkersKvStore— uses Cloudflare Workers KVlist()with JSON key prefix pattern
While list() is currently optional to give existing custom KvStore implementations time to add support, it will become a required method in Fedify 2.0.0 (tracked in issue #499). This migration path allows implementers to gradually adopt the new capability throughout the 1.x release cycle.
The addition of list() support was implemented in pull request #500, which also included the setup of proper testing infrastructure for WorkersKvStore using Vitest with @cloudflare/vitest-pool-workers.
NestJS 11 and Express 5 support
Thanks to a contribution from Cho Hasang (
@crohasang크롸상), the @fedify/nestjs package now supports NestJS 11 environments that use Express 5. The peer dependency range for Express has been widened to ^4.0.0 || ^5.0.0, eliminating peer dependency conflicts in modern NestJS projects while maintaining backward compatibility with Express 4.
This change, implemented in pull request #493, keeps the workspace catalog pinned to Express 4 for internal development and test stability while allowing Express 5 in consuming applications.
What's next
Fedify 1.10.0 serves as a stepping stone toward the upcoming 2.0.0 release. The optional list() method introduced in this version will become required in 2.0.0, simplifying the interface contract and allowing Fedify internals to rely on prefix scanning being universally available.
The enhanced #OpenTelemetry instrumentation and FedifySpanExporter provide the foundation for implementing the debug dashboard proposed in issue #234. The next steps include building the web dashboard UI with real-time activity lists, filtering, and JSON inspection capabilities—all as a separate package that leverages the standards-based observability infrastructure introduced in this release.
Depending on the development timeline and feature priorities, there may be additional 1.x releases before the 2.0.0 migration. For developers building custom KvStore implementations, now is the time to add list() support to prepare for the eventual 2.0.0 upgrade. The implementation patterns used in the official backends provide clear guidance for various storage strategies.
Acknowledgments
Special thanks to Cho Hasang (
@crohasang크롸상) for the NestJS 11 compatibility improvements, and to all community members who provided feedback and testing for the new observability features.
For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.
크리스마스에는 모두 #오라클클라우드 에 입문해보아요
(아무도 관심없겠지만) 요거의 예시로는 tree-sitter의 파싱 테이블 + AST node 메타데이터 export가 있다. 지금은 파싱 테이블 대신 parser.c만 뱉고 중요한 메타데이터를 몇개 빼먹는다. 하는 김에 rewrite in haskell도 하면 더 좋고..






![> 다음 C 프로그램이 하는 일을 알려 줘. [코드 생략]
이 C 프로그램은 **난독화(obfuscated)**된 코드로, 입력받은 **시간 또는 단위가 포함된 문자열**을 해석하여 총합을 계산한 뒤, 그 결과를 **16진수(Hexadecimal)**로 출력하는 프로그램입니다.
구체적인 작동 방식은 다음과 같습니다:
1. **입력 처리**:
* `getchar()`를 통해 표준 입력(stdin)에서 문자를 하나씩 읽어들입니다.
* `|32`를 통해 대문자를 소문자로 변환하여 처리합니다.
2. **문자 매핑 (해싱)**:
* `"ynwtsflrabg"`라는 문자열은 입력받은 문자가 특정 단위(예: year, week, second 등)인지 확인하기 위한 인덱스 문자열입니다.
* 입력된 문자가 이 문자열에 포함되면 변수 `b`에 특정 해시 값을 누적합니다.
3. **단위 변환 및 계산**:
* `"1+DIY/.K430x9G(kC["`라는 복잡한 문자열은 **룩업 테이블(Lookup Table)** 역할을 합니다.
* 내부 루프에서 이 테이블과 비트 연산(`&255^b`)을 통해 현재 입력된 단위가 무엇인지(예: 'y'가 연도인지, 's'가 초인지) 판별합니다.
* `u=1ll<<6177%n--*4` 부분은 각 단위에 맞는 **가중치(Multiplier)**를 계산합니다. `<<` 비트 시프트 연산을 사용하는 것으로 보아, 특정 단위마다 2의 제곱수 형태의 배수를 적용하거나, 혹은 시간을 초 단위(또는 나노초 단위)로 변환하는 계수를 생성합니다.
4. **결과 누적**:
* 변수 `m`에 파싱된 수치와 단위 가중치를 곱하여 누적합니다.
5. **출력**:
* 최종적으로 계산된 값 `m`을 `printf("%llx\n", m)`을 통해 **16진수(long long hex)** 형태로 출력합니다.
**요약하자면:**
이 코드는 "1y(1년)", "2w(2주)", "30s(30초)"와 같은 형식의 텍스트를 입력받아, 이를 초(second)나 특정 기본 단위로 환산한 총합을 16진수로 보여주는 **단위 변환 계산기**입니다.](https://media.hackers.pub/note-media/53eb3036-9463-495d-bb5c-a04de12a7f21.webp)



