Profile img

Ahn Kiwook

@aioo@hackers.pub · 18 following · 28 followers

안녕하세요!

GitHub
@AiOO
Mastodon
@AiOO@aioo.ooo
X
@AiOOO

드디어 Chazzy에서 유튜브 라이브 채팅도 볼 수 있게 만들었다.

사실 로그인 없이 유튜브 라이브 방송의 채팅을 가져오는 건 불가능하다고 생각하고 있었는데... 별 기대 없이 Claude Code한테 요청했더니, 비공식 API 라이브러리 Youtube.js로 몇 시간의 티키타가 끝에 동작하는 상태로 우당탕탕 구현해줌... 너무 우당탕탕 구현해줘서 뒤처리가 조금 오래 걸렸는데 아무튼 돌아가는 거 보니까 그것마저 재밌긴 하더라.

p.s. 근데 이번에 eslint 제대로 돌려 보니까 나부터 우당탕탕 짜고 있었어서 남말 할 처지가 아니었다

2

비슷한 문장도 비슷한 증상이 생기는 경우가 있다.

번역 요청한 다른 문장:

I know no fewer than seven people who simply ceased to exist.

응답 일부:

🔹 자연스러운 의역

> 나는 아무 이유도 없이 사라져 버린 사람이 일곱 명이나 있다.
또는
나는 sp그냥 흔적도 없이 사라져 버린 사람을 일곱 명이나 안다.
1
2
3

Zed의 윈도 버전이 드디어 공식 출시되었다. https://zed.dev/blog/zed-for-windows-is-here

공식 버전 출시 전까지는 deevus/zed-windows-builds 저장소 것을 쓰고 있었는데, 2주 전부터 베타 신청한 사람들에게 클로즈 베타를 쓸 수 있도록 링크를 보내주더니 드디어 정식 출시가 되었다. Private alpha 때부터 가벼운 반응 빠른 텍스트 에디터로, 또 개인 프로젝트용으로 잘 사용하고 있던 터라 감개가 무량하다.

Rust로 만들어져 윈도에서도 가볍고 빠릿빠릿하며, LLM 에이전트나 WSL 지원도 물론 완벽히 잘 된다!

이제 arm64 윈도용 빌드도 내 줬으면 🥺

Zed의 윈도 버전이 드디어 공식 출시되었다. https://zed.dev/blog/zed-for-windows-is-here

공식 버전 출시 전까지는 deevus/zed-windows-builds 저장소 것을 쓰고 있었는데, 2주 전부터 베타 신청한 사람들에게 클로즈 베타를 쓸 수 있도록 링크를 보내주더니 드디어 정식 출시가 되었다. Private alpha 때부터 가벼운 반응 빠른 텍스트 에디터로, 또 개인 프로젝트용으로 잘 사용하고 있던 터라 감개가 무량하다.

Rust로 만들어져 윈도에서도 가볍고 빠릿빠릿하며, LLM 에이전트나 WSL 지원도 물론 완벽히 잘 된다!

이제 arm64 윈도용 빌드도 내 줬으면 🥺

3

Fedify 1.9.0: Security enhancements, improved DX, and expanded framework support

We are excited to announce Fedify 1.9.0, a mega release that brings major security enhancements, improved developer experience, and expanded framework support. Released on October 14, 2025, this version represents months of collaborative effort, particularly from the participants of Korea's OSSCA (Open Source Contribution Academy).

This release would not have been possible without the dedicated contributions from OSSCA participants: Jiwon Kwon (@z9mb1wwj), Hyeonseo Kim (@gaebalgom개발곰), Chanhaeng Lee (@2chanhaeng초무), Hyunchae Kim (@r4bb1t톡기), and An Subin (@nyeongAn Nyeong (安寧)). Their collective efforts have significantly enhanced Fedify's capabilities and made it more robust for the fediverse community.

Origin-based security model

Fedify 1.9.0 implements FEP-fe34, an origin-based security model that protects against content spoofing attacks and ensures secure federation practices. This critical security enhancement enforces same-origin policy for ActivityPub objects and their properties, preventing malicious actors from impersonating content from other servers.

The security model introduces a crossOrigin option in Activity Vocabulary property accessors (get*() methods) with three security levels:

// Default behavior: logs warning and returns null for cross-origin content
const actor = await activity.getActor({ crossOrigin: "ignore" });

// Strict mode: throws error for cross-origin content
const object = await activity.getObject({ crossOrigin: "throw" });

// Trust mode: bypasses security checks (use with caution)
const attachment = await note.getAttachment({ crossOrigin: "trust" });

Embedded objects are automatically validated against their parent object's origin. When an embedded object has a different origin, Fedify performs automatic remote fetches to ensure content integrity. This transparent security layer protects your application without requiring significant code changes.

For more details about the security model and its implications, see the origin-based security model documentation.

Enhanced activity idempotency

Activity idempotency handling has been significantly improved with the new withIdempotency() method. This addresses a critical issue where activities with the same ID sent to different inboxes were incorrectly deduplicated globally instead of per-inbox.

federation
  .setInboxListeners("/inbox/{identifier}", "/inbox")
  .withIdempotency("per-inbox")  // New idempotency strategy
  .on(Follow, async (ctx, follow) => {
    // Each inbox processes activities independently
  });

The available strategies are:

  • "per-origin": Current default for backward compatibility
  • "per-inbox": Recommended strategy (will become default in Fedify 2.0)
  • Custom strategy function for advanced use cases

This enhancement ensures that shared inbox implementations work correctly while preventing duplicate processing within individual inboxes. For more information, see the activity idempotency documentation.

Relative URL resolution

Fedify now intelligently handles ActivityPub objects containing relative URLs, automatically resolving them by inferring the base URL from the object's @id or document URL. This improvement significantly enhances interoperability with ActivityPub servers that use relative URLs in properties like icon.url and image.url.

// Previously required manual baseUrl specification
const actor = await Actor.fromJsonLd(jsonLd, { baseUrl: new URL("https://example.com") });

// Now automatically infers base URL from object's @id
const actor = await Actor.fromJsonLd(jsonLd);

This change, contributed by Jiwon Kwon (@z9mb1wwj), eliminates a common source of federation failures when encountering relative URLs from other servers.

Full RFC 6570 URI template support

TypeScript support now covers all RFC 6570 URI Template expression types in dispatcher path parameters. While the runtime already supported these expressions, TypeScript types previously only recognized simple string expansion.

// Now fully supported in TypeScript
federation.setActorDispatcher("/{+identifier}", async (ctx, identifier) => {
  // Reserved string expansion — recommended for URI identifiers
});

The complete set of supported expression types includes:

  • {identifier}: Simple string expansion
  • {+identifier}: Reserved string expansion (recommended for URIs)
  • {#identifier}: Fragment expansion
  • {.identifier}: Label expansion
  • {/identifier}: Path segments
  • {;identifier}: Path-style parameters
  • {?identifier}: Query component
  • {&identifier}: Query continuation

This was contributed by Jiwon Kwon (@z9mb1wwj). For comprehensive information about URI templates, see the URI template documentation.

WebFinger customization

Fedify now supports customizing WebFinger responses through the new setWebFingerLinksDispatcher() method, addressing a long-standing community request:

federation.setWebFingerLinksDispatcher(async (ctx, actor) => {
  return [
    {
      rel: "http://webfinger.net/rel/profile-page",
      type: "text/html",
      href: actor.url?.href,
    },
    {
      rel: "http://ostatus.org/schema/1.0/subscribe",
      template: "https://example.com/follow?uri={uri}",
    },
  ];
});

This feature was contributed by Hyeonseo Kim (@gaebalgom개발곰), and enables applications to add custom links to WebFinger responses, improving compatibility with various fediverse implementations. Learn more in the WebFinger customization documentation.

New integration packages

Fastify support

Fedify now officially supports Fastify through the new @fedify/fastify package:

import Fastify from "fastify";
import { fedifyPlugin } from "@fedify/fastify";

const fastify = Fastify({ logger: true });
await fastify.register(fedifyPlugin, {
  federation,
  contextDataFactory: () => ({ /* your context data */ }),
});

This integration was contributed by An Subin (@nyeongAn Nyeong (安寧)). It supports both ESM and CommonJS, making it accessible to all Node.js projects. See the Fastify integration guide for details.

Koa support

Koa applications can now integrate Fedify through the @fedify/koa package:

import Koa from "koa";
import { createMiddleware } from "@fedify/koa";

const app = new Koa();
app.use(createMiddleware(federation, (ctx) => ({
  user: ctx.state.user,
  // Pass Koa context data to Fedify
})));

The integration supports both Koa v2.x and v3.x. Learn more in the Koa integration documentation.

Next.js integration

The new @fedify/next package brings first-class Next.js support to Fedify:

// app/api/ap/[...path]/route.ts
import { federation } from "@/federation";
import { fedifyHandler } from "@fedify/next";

export const { GET, POST } = fedifyHandler(federation);

This integration was contributed by Chanhaeng Lee (@2chanhaeng초무). It works seamlessly with Next.js App Router. Check out the Next.js integration guide for complete setup instructions.

CommonJS support

All npm packages now support both ESM and CommonJS module formats, resolving compatibility issues with various Node.js applications and eliminating the need for the experimental --experimental-require-module flag. This particularly benefits NestJS users and other CommonJS-based applications.

FEP-5711 collection inverse properties

Fedify now implements FEP-5711, adding inverse properties to collections that provide essential context about collection ownership:

const collection = new Collection({
  likesOf: note,  // This collection contains likes of this note
  followersOf: actor,  // This collection contains followers of this actor
  // … and more inverse properties
});

This feature was contributed by Jiwon Kwon (@z9mb1wwj). The complete set of inverse properties includes likesOf, sharesOf, repliesOf, inboxOf, outboxOf, followersOf, followingOf, and likedOf. These properties improve data consistency and enable better interoperability across the fediverse.

CLI enhancements

NodeInfo visualization

The new fedify nodeinfo command provides a visual way to explore NodeInfo data from fediverse instances. This replaces the deprecated fedify node command and offers improved parsing of non-semantic version strings. Try it with:

fedify nodeinfo https://comam.es/snac/

This was contributed by Hyeonseo Kim (@gaebalgom개발곰). The command now correctly handles various version formats and provides a cleaner visualization of instance capabilities. See the CLI documentation for more options.

Enhanced lookup with timeout

The fedify lookup command now supports a timeout option to prevent hanging on slow or unresponsive servers:

fedify lookup --timeout 10 https://example.com/users/alice

This enhancement, contributed by Hyunchae Kim (@r4bb1t톡기), ensures reliable operation even when dealing with problematic remote servers.

Package modularization

Several modules have been separated into dedicated packages to improve modularity and reduce bundle sizes. While the old import paths remain for backward compatibility, we recommend migrating to the new packages:

  • @fedify/cfworkers replaces @fedify/fedify/x/cfworkers
  • @fedify/denokv replaces @fedify/fedify/x/denokv
  • @fedify/hono replaces @fedify/fedify/x/hono
  • @fedify/sveltekit replaces @fedify/fedify/x/sveltekit

This modularization was contributed by Chanhaeng Lee (@2chanhaeng초무). The old import paths are deprecated and will be removed in version 2.0.0.

Acknowledgments

This release represents an extraordinary collaborative effort, particularly from the OSSCA participants who contributed numerous features and improvements. Their dedication and hard work have made Fedify 1.9.0 the most significant release to date.

Special thanks to all contributors who helped shape this release, including those who provided feedback, reported issues, and tested pre-release versions. The fediverse community's support continues to drive Fedify's evolution.

For the complete list of changes, bug fixes, and improvements, please refer to the CHANGES.md file in the repository.

7
0
1
3

오늘에야 안 건데 닌텐도 스위치는 5GHz 대역 와이파이를 쓰려면 공유기 설정에서 채널을 100 아래로 설정해야 한다더라. 그래서 34 채널로 설정해봤더니 정말로 되긴 했다. 근데 방에서 신호가 끊기는 증상이 생기기 시작해서 포기하고 다시 149 채널로 도망옴. 다른 설정은 다 같고 34 채널은 주파수도 낮고 겹치는 신호도 오히려 적은데 왜 끊기는 걸까...

2
0
1

요즘 개발 스터디나 모각코가 예전만큼 열리지 않는 것 같다는 이야기를 나눴다. 바로 떠오른 게 페이스북이었는데, 페이스북을 사람들이 덜 쓰게 되면서 페이스북 그룹 같은 (접근성이 좋고 열려 있는) 모임 공간을 만들고 접하기 어려워진 게 크지 않을까 하는 생각이 들어 그렇게 말씀드렸다. 내가 그런 게 열리는 사회에서 멀어진 게 원인일 수도 있겠지만..

1
5
1
5
0

Finally, embrace provisional trust. The wizard model means working with “good enough” more often, not because we're lowering standards, but because perfect verification is becoming impossible. The question isn't “Is this completely correct?” but “Is this useful enough for this purpose?”

https://www.oneusefulthing.org/p/on-working-with-wizards

마지막으로, 잠정적 신뢰를 받아들이세요. 마법사 모델은 ‘충분히 좋은’ 상태로 더 자주 작업하는 것을 의미합니다. 기준을 낮추기 때문이 아니라 완벽한 검증이 불가능해지고 있기 때문입니다. 핵심 질문은 “이것이 완전히 정확한가?”가 아니라 “이것이 이 목적에 충분히 유용한가?”입니다.

— 위 인용을 DeepL로 번역

전적으로 동의하고 애자일 관점에서도 좋은 방향이라고 생각하지만, 완벽주의적인 성향이 있는 사람으로서 무시하기 어려운 심리적 저항이 꽤 자주 발생하곤 한다. 에이전트를 위한 지침을 자세히 적는 것으로 최대한 타협할 수 있을 것 같은데 아직 맘에 쏙 드는 방법을 발견하지는 못함.

1

아파트 전기가 정전되면 집으로 들어오는 광케이블 신호도 나가서 UPS가 버텨 줘도 인터넷 안 되는 채로 서버만 켜져 있는 꼴이 되는데 좀 많이 애매한 것 같음

1
2
5

Ahn Kiwook shared the below article:

Optique: 타입 안전한 CLI 파서 컴비네이터

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub

이 글에서는 Haskell의 `optparse-applicative`와 TypeScript의 Zod에서 영감을 받아 제작된 새로운 CLI 파서 라이브러리인 Optique를 소개합니다. Optique는 파서 컴비네이터를 활용하여 CLI의 구조를 레고 블록처럼 조립할 수 있게 해줍니다. `option()`, `optional()`, `multiple()`, `or()`, `object()`, `constant()`, `command()`, `argument()` 등의 다양한 파서와 컴비네이터를 통해 복잡한 CLI 구조를 유연하게 정의할 수 있습니다. 특히, `or()`와 `object()` 컴비네이터를 사용하여 상호 배타적인 옵션이나 서브커맨드를 쉽게 구현하는 방법을 예제를 통해 설명합니다. Optique는 단순한 CLI 파서 역할에 집중하고 있어 모든 기능을 제공하지는 않지만, 복잡한 CLI 구조를 표현하는 데 유용하며, 소개 문서와 튜토리얼을 통해 더 자세한 내용을 확인할 수 있습니다.

Read more →
13
2
2
1
2
0
6
0
1
0
0
0

사실 Hackers' Pub은 저희 집 홈 서버인 Mac mini M4 깡통 모델에서 돌아가고 있을 뿐만 아니라, 배포도 compose.yaml 파일의 image: 필드를 매번 손으로 고친 뒤 docker compose up -d를 치는 전근대적인 방식으로 이뤄지고 있습니다… 뭔가 자동화를 하고 싶긴 한데 귀찮은 마음이 커서 아직까지 이대로 살고 있네요.

0

Spring AI 문서를 보고 있는데 업그레이드 노트 중에 Claude Code를 이용해서 자동으로 업그레이드를 진행하는 방법을 안내하는 섹션이 있어서 흥미로웠다. 요약하면 Claude Code CLI 도구를 다운로드하고 제공된 프롬프트를 그대로 실행하라는 내용. 대 AI 시대에 발맞춰 앞으로 이런 방식도 많이 사용되려나 싶음.

Automating upgrading using AI

You can automate the upgrade process to 1.0.0-SNAPSHOT using the Claude Code CLI tool with a provided prompt. The prompt will guide the AI to perform the following tasks:

  1. Update the Spring AI BOM version to 1.0.0-SNAPSHOT
  2. Ensure all required repositories exist in your build configuration
  3. Update Spring AI artifact IDs according to the new naming patterns

To use this automation:

  1. Download the Claude Code CLI tool
  2. Copy the prompt from the update-to-snapshot.txt file
  3. Paste the prompt into the Claude Code CLI
  4. The AI will analyze your project and make the necessary changes

This approach can save time and reduce the chance of errors when upgrading multiple projects or complex codebases.

0

어젯밤 데비안 패드 벽돌 될 것 감수하고 데비안 12로 업그레이드했는데 생각보다 문제 없이 잘 돼서 신남! ^ㅁ^ 전부터 느끼지만 그놈 데스크톱 환경은 예상 외로 터치 친화적인데... 터치로 쓰는 사용자가 생각보다 많은 걸까?

이 이미지는 어두운 표면 위에 세워진 태블릿 기기를 보여주고 있으며, 은색의 데스크탑 앞에 기대어져 놓여 있습니다. 이 기기는 하단에 Windows 로고가 있고 여러 화면을 표시하고 있습니다.
화면 상단에는 "hackers.pub" URL과 탐색 요소가 표시되어 있습니다. 메인 화면에는 "Hackers' Pub"이라는 웹페이지가 표시되어 있으며, 한국어 텍스트와 영어 요소가 포함되어 있습니다. 대화 영역에는 "I can't type Korean. T.T"라는 메시지가 보입니다. 
화면 하단에는 "Winbook TW802", "2.0 GiB" 메모리, "Intel Atom Z3735F", "Mesa Intel HD Graphics", "30.6 GB" 디스크 용량과 같은 기기에 대한 시스템 정보가 표시되어 있습니다. 운영 체제는 "Debian GNU/Linux 12 (bookworm)"인 것으로 보입니다.
기기의 상태 표시줄에는 날짜와 시간(3월 11일 14:25:15), 배터리 수준(88%) 및 연결 아이콘이 표시되어 있습니다. 또한 기기 상단에 작은 너구리 라면 스티커가 보입니다.
0
0